1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_toolkit.hxx"
30 
31 #ifndef _TOOLKIT_TREE_CONTROL_HXX
32 #include <treecontrol.hxx>
33 #endif
34 
35 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36 #include <com/sun/star/view/SelectionType.hpp>
37 #include <com/sun/star/awt/tree/XTreeDataModel.hpp>
38 #include <toolkit/helper/unopropertyarrayhelper.hxx>
39 #include <toolkit/helper/property.hxx>
40 #include <com/sun/star/awt/XVclWindowPeer.hpp>
41 #include <comphelper/processfactory.hxx>
42 #include <osl/diagnose.h>
43 
44 using ::rtl::OUString;
45 using namespace ::com::sun::star;
46 using namespace ::com::sun::star::uno;
47 using namespace ::com::sun::star::awt::tree;
48 using namespace ::com::sun::star::lang;
49 using namespace ::com::sun::star::beans;
50 using namespace ::com::sun::star::container;
51 using namespace ::com::sun::star::view;
52 
53 namespace toolkit
54 {
55 //	----------------------------------------------------
56 //	class UnoTreeModel
57 //	----------------------------------------------------
58 UnoTreeModel::UnoTreeModel( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& i_factory )
59     :UnoControlModel( i_factory )
60 {
61 	ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR );
62     ImplRegisterProperty( BASEPROPERTY_BORDER );
63 	ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR );
64     ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL );
65 	ImplRegisterProperty( BASEPROPERTY_ENABLED );
66 	ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE );
67 	ImplRegisterProperty( BASEPROPERTY_FILLCOLOR );
68     ImplRegisterProperty( BASEPROPERTY_HELPTEXT );
69 	ImplRegisterProperty( BASEPROPERTY_HELPURL );
70     ImplRegisterProperty( BASEPROPERTY_PRINTABLE );
71     ImplRegisterProperty( BASEPROPERTY_TABSTOP );
72     ImplRegisterProperty( BASEPROPERTY_TREE_SELECTIONTYPE );
73     ImplRegisterProperty( BASEPROPERTY_TREE_EDITABLE );
74     ImplRegisterProperty( BASEPROPERTY_TREE_DATAMODEL );
75     ImplRegisterProperty( BASEPROPERTY_TREE_ROOTDISPLAYED );
76 	ImplRegisterProperty( BASEPROPERTY_TREE_SHOWSHANDLES );
77 	ImplRegisterProperty( BASEPROPERTY_TREE_SHOWSROOTHANDLES );
78     ImplRegisterProperty( BASEPROPERTY_ROW_HEIGHT );
79     ImplRegisterProperty( BASEPROPERTY_TREE_INVOKESSTOPNODEEDITING );
80     ImplRegisterProperty( BASEPROPERTY_HIDEINACTIVESELECTION );
81 }
82 
83 UnoTreeModel::UnoTreeModel( const UnoTreeModel& rModel )
84 : UnoControlModel( rModel )
85 {
86 }
87 
88 UnoControlModel* UnoTreeModel::Clone() const
89 {
90 	return new UnoTreeModel( *this );
91 }
92 
93 OUString UnoTreeModel::getServiceName() throw(RuntimeException)
94 {
95 	return OUString::createFromAscii( szServiceName_TreeControlModel );
96 }
97 
98 Any UnoTreeModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const
99 {
100 	switch( nPropId )
101 	{
102 	case BASEPROPERTY_TREE_SELECTIONTYPE:
103 		return Any( SelectionType_NONE );
104 	case BASEPROPERTY_ROW_HEIGHT:
105 		return Any( sal_Int32( 0 ) );
106 	case BASEPROPERTY_TREE_DATAMODEL:
107 		return Any( Reference< XTreeDataModel >( 0 ) );
108 	case BASEPROPERTY_TREE_EDITABLE:
109 	case BASEPROPERTY_TREE_INVOKESSTOPNODEEDITING:
110 		return Any( sal_False );
111 	case BASEPROPERTY_TREE_ROOTDISPLAYED:
112 	case BASEPROPERTY_TREE_SHOWSROOTHANDLES:
113 	case BASEPROPERTY_TREE_SHOWSHANDLES:
114 		return Any( sal_True );
115 	case BASEPROPERTY_DEFAULTCONTROL:
116 		return uno::makeAny( ::rtl::OUString::createFromAscii( szServiceName_TreeControl ) );
117 	default:
118 		return UnoControlModel::ImplGetDefaultValue( nPropId );
119 	}
120 }
121 
122 ::cppu::IPropertyArrayHelper& UnoTreeModel::getInfoHelper()
123 {
124 	static UnoPropertyArrayHelper* pHelper = NULL;
125 	if ( !pHelper )
126 	{
127 		Sequence<sal_Int32>	aIDs = ImplGetPropertyIds();
128 		pHelper = new UnoPropertyArrayHelper( aIDs );
129 	}
130 	return *pHelper;
131 }
132 
133 // XMultiPropertySet
134 Reference< XPropertySetInfo > UnoTreeModel::getPropertySetInfo(  ) throw(RuntimeException)
135 {
136 	static Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
137 	return xInfo;
138 }
139 
140 
141 //	----------------------------------------------------
142 //	class UnoTreeControl
143 //	----------------------------------------------------
144 UnoTreeControl::UnoTreeControl( const Reference< XMultiServiceFactory >& i_factory )
145 : UnoTreeControl_Base( i_factory )
146 , maSelectionListeners( *this )
147 , maTreeExpansionListeners( *this )
148 , maTreeEditListeners( *this )
149 {
150 }
151 
152 OUString UnoTreeControl::GetComponentServiceName()
153 {
154 	return OUString::createFromAscii( "Tree" );
155 }
156 
157 // -------------------------------------------------------------------
158 // ::com::sun::star::view::XSelectionSupplier
159 // -------------------------------------------------------------------
160 
161 sal_Bool SAL_CALL UnoTreeControl::select( const Any& rSelection ) throw (IllegalArgumentException, RuntimeException)
162 {
163 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->select( rSelection );
164 }
165 
166 // -------------------------------------------------------------------
167 
168 Any SAL_CALL UnoTreeControl::getSelection() throw (RuntimeException)
169 {
170 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->getSelection();
171 }
172 
173 // -------------------------------------------------------------------
174 
175 void SAL_CALL UnoTreeControl::addSelectionChangeListener( const Reference< XSelectionChangeListener >& xListener ) throw (RuntimeException)
176 {
177 	maSelectionListeners.addInterface( xListener );
178 	if( getPeer().is() && (maSelectionListeners.getLength() == 1) )
179 	{
180 		// maSelectionListeners acts as a proxy,
181 		// add it to the peer if this is the first listener added to that proxy
182         Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
183 		Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->addSelectionChangeListener(&maSelectionListeners);
184 	}
185 }
186 
187 // -------------------------------------------------------------------
188 
189 void SAL_CALL UnoTreeControl::removeSelectionChangeListener( const Reference< XSelectionChangeListener >& xListener ) throw (RuntimeException)
190 {
191 	if( getPeer().is() && (maSelectionListeners.getLength() == 1) )
192 	{
193 		// maSelectionListeners acts as a proxy,
194 		// remove it from the peer if this is the last listener removed from that proxy
195         Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
196 		Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->removeSelectionChangeListener(&maSelectionListeners);
197 	}
198 	maSelectionListeners.removeInterface( xListener );
199 }
200 
201 // -------------------------------------------------------------------
202 // ::com::sun::star::view::XMultiSelectionSupplier
203 // -------------------------------------------------------------------
204 
205 sal_Bool SAL_CALL UnoTreeControl::addSelection( const Any& rSelection ) throw (IllegalArgumentException, RuntimeException)
206 {
207 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->addSelection(rSelection);
208 }
209 
210 // -------------------------------------------------------------------
211 
212 void SAL_CALL UnoTreeControl::removeSelection( const Any& rSelection ) throw (IllegalArgumentException, RuntimeException)
213 {
214     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
215 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->removeSelection(rSelection);
216 }
217 
218 // -------------------------------------------------------------------
219 
220 void SAL_CALL UnoTreeControl::clearSelection() throw (RuntimeException)
221 {
222     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
223 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->clearSelection();
224 }
225 
226 // -------------------------------------------------------------------
227 
228 sal_Int32 SAL_CALL UnoTreeControl::getSelectionCount() throw (RuntimeException)
229 {
230 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->getSelectionCount();
231 }
232 
233 // -------------------------------------------------------------------
234 
235 Reference< XEnumeration > SAL_CALL UnoTreeControl::createSelectionEnumeration() throw (RuntimeException)
236 {
237 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->createSelectionEnumeration();
238 }
239 
240 // -------------------------------------------------------------------
241 
242 Reference< XEnumeration > SAL_CALL UnoTreeControl::createReverseSelectionEnumeration() throw (RuntimeException)
243 {
244 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->createReverseSelectionEnumeration();
245 }
246 
247 // --------------------------------------------------------------------
248 // XTreeControl
249 // --------------------------------------------------------------------
250 
251 OUString SAL_CALL UnoTreeControl::getDefaultExpandedGraphicURL() throw (RuntimeException)
252 {
253 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->getDefaultExpandedGraphicURL();
254 }
255 
256 // -------------------------------------------------------------------
257 
258 void SAL_CALL UnoTreeControl::setDefaultExpandedGraphicURL( const OUString& _defaultexpansiongraphicurl ) throw (RuntimeException)
259 {
260     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
261 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->setDefaultExpandedGraphicURL(_defaultexpansiongraphicurl);
262 }
263 
264 // -------------------------------------------------------------------
265 
266 OUString SAL_CALL UnoTreeControl::getDefaultCollapsedGraphicURL() throw (RuntimeException)
267 {
268 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->getDefaultCollapsedGraphicURL();
269 }
270 
271 // -------------------------------------------------------------------
272 
273 void SAL_CALL UnoTreeControl::setDefaultCollapsedGraphicURL( const OUString& _defaultcollapsedgraphicurl ) throw (RuntimeException)
274 {
275     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
276 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->setDefaultCollapsedGraphicURL(_defaultcollapsedgraphicurl);
277 }
278 
279 // -------------------------------------------------------------------
280 
281 sal_Bool SAL_CALL UnoTreeControl::isNodeExpanded( const Reference< XTreeNode >& xNode ) throw (RuntimeException, IllegalArgumentException)
282 {
283 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->isNodeExpanded(xNode);
284 }
285 
286 // -------------------------------------------------------------------
287 
288 sal_Bool SAL_CALL UnoTreeControl::isNodeCollapsed( const Reference< XTreeNode >& xNode ) throw (RuntimeException, IllegalArgumentException)
289 {
290 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->isNodeCollapsed(xNode);
291 }
292 
293 // -------------------------------------------------------------------
294 
295 void SAL_CALL UnoTreeControl::makeNodeVisible( const Reference< XTreeNode >& xNode ) throw (RuntimeException, ExpandVetoException, IllegalArgumentException)
296 {
297     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
298 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->makeNodeVisible(xNode);
299 }
300 
301 // -------------------------------------------------------------------
302 
303 sal_Bool SAL_CALL UnoTreeControl::isNodeVisible( const Reference< XTreeNode >& xNode ) throw (RuntimeException, IllegalArgumentException)
304 {
305 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->isNodeVisible(xNode);
306 }
307 
308 // -------------------------------------------------------------------
309 
310 void SAL_CALL UnoTreeControl::expandNode( const Reference< XTreeNode >& xNode ) throw (RuntimeException, ExpandVetoException, IllegalArgumentException)
311 {
312     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
313 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->expandNode(xNode);
314 }
315 
316 // -------------------------------------------------------------------
317 
318 void SAL_CALL UnoTreeControl::collapseNode( const Reference< XTreeNode >& xNode ) throw (RuntimeException, ExpandVetoException, IllegalArgumentException)
319 {
320     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
321 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->collapseNode(xNode);
322 }
323 
324 // -------------------------------------------------------------------
325 
326 void SAL_CALL UnoTreeControl::addTreeExpansionListener( const Reference< XTreeExpansionListener >& xListener ) throw (RuntimeException)
327 {
328 	maTreeExpansionListeners.addInterface( xListener );
329 	if( getPeer().is() && (maTreeExpansionListeners.getLength() == 1) )
330 	{
331 		// maSelectionListeners acts as a proxy,
332 		// add it to the peer if this is the first listener added to that proxy
333         Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
334 		Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->addTreeExpansionListener(&maTreeExpansionListeners);
335 	}
336 }
337 
338 // -------------------------------------------------------------------
339 
340 void SAL_CALL UnoTreeControl::removeTreeExpansionListener( const Reference< XTreeExpansionListener >& xListener ) throw (RuntimeException)
341 {
342 	if( getPeer().is() && (maTreeExpansionListeners.getLength() == 1) )
343 	{
344 		// maSelectionListeners acts as a proxy,
345 		// remove it from the peer if this is the last listener removed from that proxy
346         Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
347 		Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->removeTreeExpansionListener(&maTreeExpansionListeners);
348 	}
349 	maTreeExpansionListeners.removeInterface( xListener );
350 }
351 
352 // -------------------------------------------------------------------
353 
354 Reference< XTreeNode > SAL_CALL UnoTreeControl::getNodeForLocation( sal_Int32 x, sal_Int32 y ) throw (RuntimeException)
355 {
356 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->getNodeForLocation(x,y);
357 }
358 
359 // -------------------------------------------------------------------
360 
361 Reference< XTreeNode > SAL_CALL UnoTreeControl::getClosestNodeForLocation( sal_Int32 x, sal_Int32 y ) throw (RuntimeException)
362 {
363 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->getClosestNodeForLocation(x,y);
364 }
365 
366 // -------------------------------------------------------------------
367 
368 awt::Rectangle SAL_CALL UnoTreeControl::getNodeRect( const Reference< XTreeNode >& Node ) throw (IllegalArgumentException, RuntimeException)
369 {
370 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->getNodeRect( Node );
371 }
372 
373 // -------------------------------------------------------------------
374 
375 sal_Bool SAL_CALL UnoTreeControl::isEditing(  ) throw (RuntimeException)
376 {
377 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->isEditing();
378 }
379 
380 // -------------------------------------------------------------------
381 
382 sal_Bool SAL_CALL UnoTreeControl::stopEditing() throw (RuntimeException)
383 {
384 	return Reference< XTreeControl >( getPeer(), UNO_QUERY_THROW )->stopEditing();
385 }
386 
387 // -------------------------------------------------------------------
388 
389 void SAL_CALL UnoTreeControl::cancelEditing() throw (RuntimeException)
390 {
391     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
392 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->cancelEditing();
393 }
394 
395 // -------------------------------------------------------------------
396 
397 void SAL_CALL UnoTreeControl::startEditingAtNode( const Reference< XTreeNode >& xNode ) throw (IllegalArgumentException, RuntimeException)
398 {
399     Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
400 	Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->startEditingAtNode(xNode);
401 }
402 
403 // -------------------------------------------------------------------
404 
405 void SAL_CALL UnoTreeControl::addTreeEditListener( const Reference< XTreeEditListener >& xListener ) throw (RuntimeException)
406 {
407 	maTreeEditListeners.addInterface( xListener );
408 	if( getPeer().is() && (maTreeEditListeners.getLength() == 1) )
409 	{
410 		// maSelectionListeners acts as a proxy,
411 		// add it to the peer if this is the first listener added to that proxy
412         Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
413 		Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->addTreeEditListener(&maTreeEditListeners);
414 	}
415 }
416 
417 // -------------------------------------------------------------------
418 
419 void SAL_CALL UnoTreeControl::removeTreeEditListener( const Reference< XTreeEditListener >& xListener ) throw (RuntimeException)
420 {
421 	if( getPeer().is() && (maTreeEditListeners.getLength() == 1) )
422 	{
423 		// maSelectionListeners acts as a proxy,
424 		// remove it from the peer if this is the last listener removed from that proxy
425         Reference< XWindowPeer > xGcc3WorkaroundTemporary( getPeer());
426 		Reference< XTreeControl >( xGcc3WorkaroundTemporary, UNO_QUERY_THROW )->removeTreeEditListener(&maTreeEditListeners);
427 	}
428 	maTreeEditListeners.removeInterface( xListener );
429 }
430 
431 // -------------------------------------------------------------------
432 // XComponent
433 // -------------------------------------------------------------------
434 
435 void SAL_CALL UnoTreeControl::dispose(  ) throw(RuntimeException)
436 {
437 	lang::EventObject aEvt;
438 	aEvt.Source = static_cast< ::cppu::OWeakObject* >(this);
439 	maSelectionListeners.disposeAndClear( aEvt );
440 	maTreeExpansionListeners.disposeAndClear( aEvt );
441 	UnoControl::dispose();
442 }
443 
444 void UnoTreeControl::createPeer( const uno::Reference< awt::XToolkit > & rxToolkit, const uno::Reference< awt::XWindowPeer >  & rParentPeer ) throw(uno::RuntimeException)
445 {
446 	UnoControlBase::createPeer( rxToolkit, rParentPeer );
447 
448 	Reference< XTreeControl >  xTree( getPeer(), UNO_QUERY_THROW );
449 	if( maSelectionListeners.getLength() )
450 		xTree->addSelectionChangeListener( &maSelectionListeners );
451 	if( maTreeExpansionListeners.getLength() )
452 		xTree->addTreeExpansionListener( &maTreeExpansionListeners );
453 }
454 
455 }
456 
457 Reference< XInterface > SAL_CALL TreeControl_CreateInstance( const Reference< XMultiServiceFactory >& i_factory )
458 {
459 	return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::UnoTreeControl( i_factory ) );
460 }
461 
462 Reference< XInterface > SAL_CALL TreeControlModel_CreateInstance( const Reference< XMultiServiceFactory >& i_factory )
463 {
464 	return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::UnoTreeModel( i_factory ) );
465 }
466 
467 void SAL_CALL TreeEditListenerMultiplexer::nodeEditing( const Reference< XTreeNode >& Node ) throw (RuntimeException, ::com::sun::star::util::VetoException)
468 {
469 	::cppu::OInterfaceIteratorHelper aIt( *this );
470 	while( aIt.hasMoreElements() )
471     {
472         Reference< XTreeEditListener > xListener(static_cast< XTreeEditListener* >( aIt.next() ) );
473         try
474         {
475 			xListener->nodeEditing( Node );
476         }
477         catch( DisposedException& e )
478         {
479             OSL_ENSURE( e.Context.is(), "caught DisposedException with empty Context field" );
480             if ( e.Context == xListener || !e.Context.is() )
481                 aIt.remove();
482         }
483         catch( RuntimeException& e )
484         {
485 			(void)e;
486             DISPLAY_EXCEPTION( TreeEditListenerMultiplexer, nodeEditing, e )
487         }
488     }
489 }
490 
491 void SAL_CALL TreeEditListenerMultiplexer::nodeEdited( const Reference< XTreeNode >& Node, const OUString& NewText ) throw (RuntimeException)
492 {
493 	::cppu::OInterfaceIteratorHelper aIt( *this );
494 	while( aIt.hasMoreElements() )
495     {
496         Reference< XTreeEditListener > xListener( static_cast< XTreeEditListener* >( aIt.next() ) );
497         try
498         {
499 			xListener->nodeEdited( Node, NewText );
500         }
501         catch( DisposedException& e )
502         {
503             OSL_ENSURE( e.Context.is(), "caught DisposedException with empty Context field" );
504             if ( e.Context == xListener || !e.Context.is() )
505                 aIt.remove();
506         }
507         catch( RuntimeException& e )
508         {
509 			(void)e;
510             DISPLAY_EXCEPTION( TreeEditListenerMultiplexer, nodeEdited, e )
511         }
512     }
513 }
514