1 // Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/
19 #include "OB_Browser.h"
21 #include "OB_Filter.h"
22 #include "OB_ListItem.h"
23 #include "OB_ListView.h"
30 #include <qlistview.h>
31 #include <qpopupmenu.h>
34 Class: OB_Browser::ToolTip
35 Descr: Tool tip for OB_Browser.
38 class OB_Browser::ToolTip : public QToolTip
41 ToolTip( OB_Browser* b, QWidget* p = 0 );
44 void maybeTip( const QPoint& );
47 OB_Browser* myBrowser;
50 OB_Browser::ToolTip::ToolTip( OB_Browser* b, QWidget* p )
56 OB_Browser::ToolTip::~ToolTip()
60 void OB_Browser::ToolTip::maybeTip( const QPoint& pos )
62 if ( !parentWidget() || !myBrowser || !myBrowser->isShowToolTips() )
65 QListView* lv = myBrowser->listView();
67 QListViewItem* item = lv->itemAt( pos );
68 SUIT_DataObject* obj = myBrowser->dataObject( item );
72 QString aText = obj->toolTip();
74 if ( aText.isEmpty() )
77 QRect aRect = lv->itemRect( item );
84 Descr: Hierarchical tree object browser.
87 OB_Browser::OB_Browser( QWidget* parent, SUIT_DataObject* root )
93 myAutoUpdate( false ),
94 myAutoDelObjs( false ),
95 myRootDecorated( true )
97 myView = new OB_ListView( QtxListView::HeaderAuto, this );
98 myView->setAppropriate( myView->addColumn( "Data" ), false );
99 myView->setSorting( -1 );
100 myView->setRootIsDecorated( true );
101 myView->setSelectionMode( QListView::Extended );
102 myView->installEventFilter( this );
103 myView->viewport()->installEventFilter( this );
105 QVBoxLayout* main = new QVBoxLayout( this );
106 main->addWidget( myView );
108 myShowToolTips = true;
109 myTooltip = new ToolTip( this, myView->viewport() );
111 connect( myView, SIGNAL( dropped( QPtrList<QListViewItem>, QListViewItem*, int ) ),
112 this, SLOT( onDropped( QPtrList<QListViewItem>, QListViewItem*, int ) ) );
113 connect( myView, SIGNAL( selectionChanged() ), this, SIGNAL( selectionChanged() ) );
114 connect( myView, SIGNAL( doubleClicked( QListViewItem* ) ),
115 this, SLOT( onDoubleClicked( QListViewItem* ) ) );
117 setRootObject( root );
120 OB_Browser::~OB_Browser()
126 bool OB_Browser::rootIsDecorated() const
128 return myRootDecorated;
131 void OB_Browser::setRootIsDecorated( const bool decor )
133 if ( decor == rootIsDecorated() )
136 myRootDecorated = decor;
137 updateTree( 0, false );
140 int OB_Browser::autoOpenLevel() const
142 return myAutoOpenLevel;
145 void OB_Browser::setAutoOpenLevel( const int level )
147 if ( myAutoOpenLevel == level )
150 myAutoOpenLevel = level;
155 bool OB_Browser::isShowToolTips()
157 return myShowToolTips;
160 void OB_Browser::setShowToolTips( const bool theDisplay )
162 myShowToolTips = theDisplay;
165 bool OB_Browser::isAutoUpdate() const
170 void OB_Browser::setAutoUpdate( const bool on )
175 bool OB_Browser::isAutoDeleteObjects() const
177 return myAutoDelObjs;
180 void OB_Browser::setAutoDeleteObjects( const bool on )
185 SUIT_DataObject* OB_Browser::getRootObject() const
190 void OB_Browser::setRootObject( SUIT_DataObject* theRoot )
192 DataObjectKey curKey;
193 DataObjectMap selObjs, openObjs;
194 DataObjectKeyMap selKeys, openKeys;
196 int selNum = numberOfSelected();
198 SUIT_DataObject* curObj = 0;
200 curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey );
202 removeConnections( myRoot );
203 if ( myRoot != theRoot && isAutoDeleteObjects() )
208 createConnections( myRoot );
211 updateView( myRoot );
212 else if ( listView() )
218 restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
222 if ( selNum != numberOfSelected() )
223 emit selectionChanged();
226 int OB_Browser::numberOfSelected() const
231 for ( QListViewItemIterator it( listView() ); it.current(); ++it )
232 if ( it.current()->isSelected() )
238 DataObjectList OB_Browser::getSelected() const
245 void OB_Browser::getSelected( DataObjectList& theObjList ) const
252 for ( QListViewItemIterator it( listView() ); it.current(); ++it )
254 if ( it.current()->isSelected() )
256 SUIT_DataObject* obj = dataObject( it.current() );
258 theObjList.append( obj );
263 void OB_Browser::setSelected( const SUIT_DataObject* theObject, const bool append )
266 lst.append( theObject );
267 setSelected( lst, append );
270 void OB_Browser::setSelected( const DataObjectList& theObjLst, const bool append )
272 QListView* lv = listView();
277 bool changed = false;
278 bool block = lv->signalsBlocked();
279 lv->blockSignals( true );
281 QMap<QListViewItem*, int> map;
282 for ( DataObjectListIterator itr( theObjLst ); itr.current(); ++itr )
283 map.insert( listViewItem( itr.current() ), 0 );
285 for ( QListViewItemIterator it( lv ); it.current(); ++it )
287 QListViewItem* item = it.current();
288 if ( map.contains( item ) && !lv->isSelected( item ) )
291 lv->setSelected( item, true );
293 if ( !append && !map.contains( item ) && lv->isSelected( item ) )
296 lv->setSelected( item, false );
300 lv->blockSignals( block );
305 QListViewItem* sel = 0;
306 QListViewItem* cur = lv->currentItem();
307 for ( QListViewItemIterator iter( lv ); iter.current() && !sel; ++iter, count++ )
309 if ( iter.current()->isSelected() && cur == iter.current() )
310 sel = iter.current();
313 for ( QListViewItemIterator itr( lv ); itr.current() && !sel; ++itr )
315 if ( itr.current()->isSelected() )
320 lv->setCurrentItem( sel );
322 if ( sel && count == 1 )
323 lv->ensureItemVisible( sel );
325 emit selectionChanged();
329 bool OB_Browser::isOpen( SUIT_DataObject* theObject ) const
333 res = listView()->isOpen( listViewItem( theObject ) );
337 void OB_Browser::setOpen( SUIT_DataObject* theObject, const bool theOpen )
340 listView()->setOpen( listViewItem( theObject ), theOpen );
343 SUIT_DataObject* OB_Browser::dataObjectAt( const QPoint& pos ) const
345 SUIT_DataObject* obj = 0;
347 QListView* lv = listView();
349 obj = dataObject( lv->itemAt( pos ) );
354 OB_Filter* OB_Browser::filter() const
356 return myView->filter();
359 void OB_Browser::setFilter( OB_Filter* f )
361 myView->setFilter( f );
364 int OB_Browser::addColumn( const QString& label, const int id, const int width )
366 return addColumn( QIconSet(), label, id, width );
369 int OB_Browser::addColumn( const QIconSet& icon, const QString& label, const int id, const int width )
371 QListView* lv = listView();
378 while ( myColumnIds.contains( theId ) )
382 if ( myColumnIds.contains( theId ) )
383 return -1; // can not reuse id
387 sec = lv->addColumn( label, width );
389 sec = lv->addColumn( icon, label, width );
394 myColumnIds.insert( theId, sec );
400 void OB_Browser::removeColumn( const int id )
402 QListView* lv = listView();
403 if ( !lv || !myColumnIds.contains( id ) )
406 int sec = myColumnIds[id];
407 lv->removeColumn( sec );
409 // update map of column indeces
410 myColumnIds.remove( id );
411 for ( QMap<int, int>::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
419 void OB_Browser::setNameTitle( const QString& label )
421 setNameTitle( QIconSet(), label );
424 void OB_Browser::setNameTitle( const QIconSet& icon, const QString& label )
426 QListView* lv = listView();
431 lv->setColumnText( 0, label );
433 lv->setColumnText( 0, icon, label );
436 void OB_Browser::setColumnTitle( const int id, const QString& label )
438 setColumnTitle( id, QIconSet(), label );
441 void OB_Browser::setColumnTitle( const int id, const QIconSet& icon, const QString& label )
443 QListView* lv = listView();
444 if ( !lv || !myColumnIds.contains( id ) )
448 lv->setColumnText( myColumnIds[id], label );
450 lv->setColumnText( myColumnIds[id], icon, label );
453 QString OB_Browser::nameTitle() const
455 return myView->columnText( 0 );
458 QString OB_Browser::columnTitle( const int id ) const
461 if ( myColumnIds.contains( id ) )
462 txt = myView->columnText( myColumnIds[id] );
466 bool OB_Browser::isColumnVisible( const int id ) const
468 return myColumnIds.contains( id ) && myView->isShown( myColumnIds[id] );
471 void OB_Browser::setColumnShown( const int id, const bool on )
473 if ( !myColumnIds.contains( id ) )
476 myView->setShown( myColumnIds[id], on );
479 void OB_Browser::setWidthMode( QListView::WidthMode mode )
481 for ( int i = 0, n = myView->columns(); i < n; i++ )
482 myView->setColumnWidthMode( i, mode );
485 QValueList<int> OB_Browser::columns() const
488 for ( QMap<int, int>::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
489 lst.append( it.key() );
493 bool OB_Browser::appropriateColumn( const int id ) const
496 if ( myColumnIds.contains( id ) )
497 res = myView->appropriate( myColumnIds[id] );
501 void OB_Browser::setAppropriateColumn( const int id, const bool on )
503 if ( !myColumnIds.contains( id ) )
506 myView->setAppropriate( myColumnIds[id], on );
509 void OB_Browser::updateTree( SUIT_DataObject* obj, const bool autoOpen )
511 if ( !obj && !(obj = getRootObject()) )
514 DataObjectKey curKey;
515 DataObjectMap selObjs, openObjs;
516 DataObjectKeyMap selKeys, openKeys;
518 int selNum = numberOfSelected();
520 SUIT_DataObject* curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey );
524 restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
529 if ( selNum != numberOfSelected() )
530 emit selectionChanged();
533 void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg )
535 if ( !src || !trg || src == trg || src->root() != getRootObject() )
538 DataObjectKey curKey;
539 DataObjectMap selObjs, openObjs;
540 DataObjectKeyMap selKeys, openKeys;
542 int selNum = numberOfSelected();
544 SUIT_DataObject* curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey );
546 SUIT_DataObject* parent = src->parent();
547 int pos = parent ? parent->childPos( src ) : -1;
551 removeConnections( src );
552 if ( isAutoDeleteObjects() )
555 if ( parent && pos != -1 )
556 parent->insertChild( trg, pos );
558 trg->setParent( parent );
561 createConnections( trg );
563 restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
567 if ( selNum != numberOfSelected() )
568 emit selectionChanged();
571 void OB_Browser::updateView( const SUIT_DataObject* theStartObj )
573 QListView* lv = listView();
577 if ( !theStartObj || theStartObj->root() != getRootObject() )
580 QListViewItem* after = 0;
581 QListViewItem* parent = 0;
582 QListViewItem* startItem = listViewItem( theStartObj );
584 if ( theStartObj->parent() )
585 parent = listViewItem( theStartObj->parent() );
587 QListViewItem* prv = 0;
588 QListViewItem* cur = parent ? parent->firstChild() : lv->firstChild();
589 while ( !after && cur )
591 if ( cur == startItem )
595 cur = cur->nextSibling();
598 QPtrList<QListViewItem> delList;
599 if ( !startItem && theStartObj == getRootObject() )
601 for ( QListViewItem* item = lv->firstChild(); item; item = item->nextSibling() )
602 delList.append( item );
605 delList.append( startItem );
607 for ( QPtrListIterator<QListViewItem> it( delList ); it.current(); ++it )
609 removeReferences( it.current() );
613 // for myRoot object, if myShowRoot==false, then creating multiple top-level QListViewItem-s
614 // (which will correspond to myRoot's children = Modules).
615 if ( rootIsDecorated() && theStartObj == myRoot )
618 theStartObj->children( lst );
619 DataObjectListIterator it ( lst );
620 // iterating backward to preserve the order of elements in the tree
621 for ( it.toLast(); it.current(); --it )
622 createTree( it.current(), 0, 0 );
625 createTree( theStartObj, parent, after ? after : parent );
628 QListViewItem* OB_Browser::createTree( const SUIT_DataObject* obj,
629 QListViewItem* parent, QListViewItem* after )
634 QListViewItem* item = createItem( obj, parent, after );
637 obj->children( lst );
638 for ( DataObjectListIterator it ( lst ); it.current(); ++it )
639 createTree( it.current(), item );
642 item->setOpen( obj->isOpen() );
647 QListViewItem* OB_Browser::createItem( const SUIT_DataObject* o,
648 QListViewItem* parent, QListViewItem* after )
650 QListView* lv = listView();
655 QListViewItem* item = 0;
656 SUIT_DataObject* obj = (SUIT_DataObject*)o;
660 switch ( obj->checkType() )
662 case SUIT_DataObject::CheckBox:
663 type = QCheckListItem::CheckBox;
665 case SUIT_DataObject::RadioButton:
666 type = QCheckListItem::RadioButton;
672 if ( parent->childCount() && !after )
674 after = parent->firstChild();
675 while ( after->nextSibling() )
676 after = after->nextSibling();
682 item = new OB_ListItem( obj, parent, after );
684 item = new OB_CheckListItem( obj, parent, after, (QCheckListItem::Type)type );
689 item = new OB_ListItem( obj, parent );
691 item = new OB_CheckListItem( obj, parent, (QCheckListItem::Type)type );
697 item = new OB_ListItem( obj, lv );
699 item = new OB_CheckListItem( obj, lv, (QCheckListItem::Type)type );
702 myItems.insert( obj, item );
703 obj->connect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
710 void OB_Browser::adjustWidth()
715 listView()->setColumnWidth( 0, 0 );
716 if ( listView()->firstChild() )
717 adjustWidth( listView()->firstChild() );
720 void OB_Browser::adjustWidth( QListViewItem* item )
724 item->widthChanged( 0 );
725 if ( item->isOpen() )
726 adjustWidth( item->firstChild() );
727 item = item->nextSibling();
731 SUIT_DataObject* OB_Browser::dataObject( const QListViewItem* item ) const
733 SUIT_DataObject* obj = 0;
735 if ( item && item->rtti() == OB_ListItem::RTTI() )
736 obj = ((OB_ListItem*)item)->dataObject();
737 else if ( item && item->rtti() == OB_CheckListItem::RTTI() )
738 obj = ((OB_CheckListItem*)item)->dataObject();
743 QListViewItem* OB_Browser::listViewItem( const SUIT_DataObject* obj ) const
745 QListViewItem* item = 0;
747 if ( myItems.contains( (SUIT_DataObject*)obj ) )
748 item = myItems[(SUIT_DataObject*)obj];
753 QListView* OB_Browser::listView() const
758 void OB_Browser::removeReferences( QListViewItem* item )
763 SUIT_DataObject* obj = dataObject( item );
764 obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
765 myItems.remove( obj );
767 QListViewItem* i = item->firstChild();
770 removeReferences( i );
771 i = i->nextSibling();
775 void OB_Browser::createConnections( SUIT_DataObject* obj )
780 DataObjectList childList;
781 obj->children( childList, true );
783 childList.prepend( obj );
785 for ( DataObjectListIterator it( childList ); it.current(); ++it )
786 it.current()->connect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
789 void OB_Browser::removeConnections( SUIT_DataObject* obj )
794 DataObjectList childList;
795 obj->children( childList, true );
797 childList.prepend( obj );
799 for ( DataObjectListIterator it( childList ); it.current(); ++it )
800 it.current()->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
803 SUIT_DataObject* OB_Browser::storeState( DataObjectMap& selObjs, DataObjectMap& openObjs,
804 DataObjectKeyMap& selKeys, DataObjectKeyMap& openKeys,
805 DataObjectKey& curKey ) const
807 QListView* lv = listView();
811 SUIT_DataObject* curObj = dataObject( lv->currentItem() );
813 curKey = objectKey( curObj );
815 for ( QListViewItemIterator it( lv ); it.current(); ++it )
817 SUIT_DataObject* obj = dataObject( it.current() );
821 selObjs.insert( obj, lv->isSelected( it.current() ) );
822 openObjs.insert( obj, lv->isOpen( it.current() ) );
823 if ( lv->isSelected( it.current() ) )
824 selKeys.insert( objectKey( obj ), 0 );
825 if ( lv->isOpen( it.current() ) )
826 openKeys.insert( objectKey( obj ), 0 );
832 void OB_Browser::restoreState( const DataObjectMap& selObjs, const DataObjectMap& openObjs,
833 const SUIT_DataObject* curObj, const DataObjectKeyMap& selKeys,
834 const DataObjectKeyMap& openKeys, const DataObjectKey& curKey )
836 QListView* lv = listView();
840 bool block = lv->signalsBlocked();
841 lv->blockSignals( true );
843 QListViewItem* curItem = 0;
844 for ( QListViewItemIterator it( lv ); it.current(); ++it )
846 QListViewItem* item = it.current();
847 SUIT_DataObject* obj = dataObject( item );
852 DataObjectKey key = objectKey( obj );
854 if ( selObjs.contains( obj ) )
856 if ( selObjs[obj] && !lv->isSelected( item ) )
857 lv->setSelected( item, true );
859 else if ( !key.isNull() && selKeys.contains( key ) && !lv->isSelected( item ) )
860 lv->setSelected( item, true );
862 if ( openObjs.contains( obj ) )
864 bool parentOpen = true;
865 if( item && item->parent() )
866 parentOpen = item->parent()->isOpen();
868 if ( openObjs[obj] && parentOpen )
869 lv->setOpen( item, true );
871 else if ( !key.isNull() && openKeys.contains( key ) )
873 bool parentOpen = true;
874 if( item && item->parent() )
875 parentOpen = item->parent()->isOpen();
878 lv->setOpen( item, true );
881 if ( !curItem && ( curObj == obj || ( !curKey.isNull() && curKey == key )) )
886 lv->setCurrentItem( curItem );
888 lv->blockSignals( block );
891 OB_Browser::DataObjectKey OB_Browser::objectKey( QListViewItem* i ) const
893 return objectKey( dataObject( i ) );
896 OB_Browser::DataObjectKey OB_Browser::objectKey( SUIT_DataObject* obj ) const
901 return DataObjectKey( obj->key() );
904 void OB_Browser::keyPressEvent( QKeyEvent* e )
906 if ( e->key() == Qt::Key_F5 )
907 updateTree( 0, false );
909 QFrame::keyPressEvent( e );
912 void OB_Browser::onExpand()
914 DataObjectList selected;
915 getSelected( selected );
916 for ( DataObjectListIterator itr( selected ); itr.current(); ++itr )
917 expand( listViewItem( itr.current() ) );
920 void OB_Browser::onColumnVisible( int id )
922 setColumnShown( id, !isColumnVisible( id ) );
925 void OB_Browser::onDestroyed( SUIT_DataObject* obj )
930 void OB_Browser::onDropped( QPtrList<QListViewItem> items, QListViewItem* item, int action )
932 SUIT_DataObject* obj = dataObject( item );
937 for ( QPtrListIterator<QListViewItem> it( items ); it.current(); ++it )
939 SUIT_DataObject* o = dataObject( it.current() );
944 if ( !lst.isEmpty() )
945 emit dropped( lst, obj, action );
948 void OB_Browser::updateText()
950 if ( myColumnIds.isEmpty() )
953 QListView* lv = listView();
957 for ( QListViewItemIterator it( lv ); it.current(); ++it )
959 SUIT_DataObject* obj = dataObject( it.current() );
963 for( QMap<int, int>::iterator itr = myColumnIds.begin(); itr != myColumnIds.end(); ++itr )
964 it.current()->setText( itr.data(), obj->text( itr.key() ) );
968 void OB_Browser::updateText( QListViewItem* item )
970 SUIT_DataObject* obj = dataObject( item );
974 for( QMap<int, int>::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
975 item->setText( it.data(), obj->text( it.key() ) );
978 bool OB_Browser::eventFilter( QObject* o, QEvent* e )
980 if ( o == myView && e->type() == QEvent::ContextMenu )
982 QContextMenuEvent* ce = (QContextMenuEvent*)e;
983 if ( ce->reason() != QContextMenuEvent::Mouse )
984 contextMenuRequest( ce );
987 if ( o == myView->viewport() && e->type() == QEvent::MouseButtonRelease )
989 QMouseEvent* me = (QMouseEvent*)e;
990 if ( me->button() == RightButton )
992 QContextMenuEvent ce( QContextMenuEvent::Mouse, me->pos(), me->globalPos(), me->state() );
993 contextMenuRequest( &ce );
998 return QFrame::eventFilter( o, e );
1001 void OB_Browser::contextMenuPopup( QPopupMenu* menu )
1003 /* QValueList<int> cols;
1004 for ( QMap<int, int>::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
1006 if ( appropriateColumn( it.key() ) )
1007 cols.append( it.key() );
1010 uint num = menu->count();
1011 menu->setCheckable( true );
1012 for ( QValueList<int>::const_iterator iter = cols.begin(); iter != cols.end(); ++iter )
1014 QString name = columnTitle( *iter );
1015 if ( name.isEmpty() )
1018 int id = menu->insertItem( name, this, SLOT( onColumnVisible( int ) ) );
1019 menu->setItemChecked( id, isColumnVisible( *iter ) );
1020 menu->setItemParameter( id, *iter );
1022 if ( menu->count() != num )
1023 menu->insertSeparator();*/
1025 DataObjectList selected;
1026 getSelected( selected );
1028 bool closed = false;
1029 for ( DataObjectListIterator itr( selected ); itr.current() && !closed; ++itr )
1030 closed = hasClosed( listViewItem( itr.current() ) );
1034 menu->insertItem( tr( "MEN_EXPAND_ALL" ), this, SLOT( onExpand() ) );
1035 menu->insertSeparator();
1039 void OB_Browser::expand( QListViewItem* item )
1044 item->setOpen( true );
1045 for ( QListViewItem* child = item->firstChild(); child; child = child->nextSibling() )
1049 bool OB_Browser::hasClosed( QListViewItem* item ) const
1054 if ( item->childCount() && !item->isOpen() )
1058 for ( QListViewItem* child = item->firstChild(); child && !has; child = child->nextSibling() )
1059 has = hasClosed( child );
1064 void OB_Browser::removeObject( SUIT_DataObject* obj, const bool autoUpd )
1069 // Removing list view items from <myItems> recursively for all children.
1070 // Otherwise, "delete item" line will destroy all item's children,
1071 // and <myItems> will contain invalid pointers (see ~QListViewItem() description in Qt docs)
1072 DataObjectList childList;
1073 obj->children( childList, true );
1074 for ( DataObjectListIterator it( childList ); it.current(); ++it )
1076 it.current()->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
1077 myItems.remove( it.current() );
1080 QListViewItem* item = listViewItem( obj );
1082 obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
1083 myItems.remove( obj );
1085 if ( obj == myRoot )
1087 // remove all child list view items
1095 if ( isAutoUpdate() )
1097 SUIT_DataObject* pObj = item && item->parent() ? dataObject( item->parent() ) : 0;
1098 updateTree( pObj, false );
1104 void OB_Browser::autoOpenBranches()
1106 int level = autoOpenLevel();
1107 QListView* lv = listView();
1108 if ( !lv || level < 1 )
1111 QListViewItem* item = lv->firstChild();
1114 openBranch( item, level );
1115 item = item->nextSibling();
1119 void OB_Browser::openBranch( QListViewItem* item, const int level )
1126 item->setOpen( true );
1127 openBranch( item->firstChild(), level - 1 );
1128 item = item->nextSibling();
1132 void OB_Browser::onDoubleClicked( QListViewItem* item )
1135 emit doubleClicked( dataObject( item ) );