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