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"
25 #include <SUIT_DataObjectIterator.h>
26 #include <SUIT_TreeSync.h>
33 #include <qlistview.h>
34 #include <qpopupmenu.h>
35 #include <qdatetime.h>
40 Class: OB_Browser::ToolTip
41 Descr: Tool tip for OB_Browser.
44 class OB_Browser::ToolTip : public QToolTip
47 ToolTip( OB_Browser* b, QWidget* p = 0 );
50 void maybeTip( const QPoint& );
53 OB_Browser* myBrowser;
56 OB_Browser::ToolTip::ToolTip( OB_Browser* b, QWidget* p )
62 OB_Browser::ToolTip::~ToolTip()
66 void OB_Browser::ToolTip::maybeTip( const QPoint& pos )
68 if ( !parentWidget() || !myBrowser || !myBrowser->isShowToolTips() )
71 QListView* lv = myBrowser->listView();
73 QListViewItem* item = lv->itemAt( pos );
74 SUIT_DataObject* obj = myBrowser->dataObject( item );
78 QString aText = obj->toolTip();
80 if ( aText.isEmpty() )
83 QRect aRect = lv->itemRect( item );
89 typedef SUIT_DataObject* ObjPtr;
90 typedef OB_ListItem* ItemPtr;
93 Descr: Auxiliary class for synchronizing tree of SUIT_DataObjects and list view items
99 OB_BrowserSync( OB_Browser* );
100 bool isEqual( const ObjPtr&, const ItemPtr& ) const;
101 ObjPtr nullSrc() const;
102 ItemPtr nullTrg() const;
103 ItemPtr createItem( const ObjPtr&, const ItemPtr&, const ItemPtr&, const bool ) const;
104 void updateItem( const ItemPtr& ) const;
105 void deleteItemWithChildren( const ItemPtr& ) const;
106 void children( const ObjPtr&, QValueList<ObjPtr>& ) const;
107 void children( const ItemPtr&, QValueList<ItemPtr>& ) const;
108 ItemPtr parent( const ItemPtr& ) const;
110 bool needUpdate( const ItemPtr& ) const;
111 OB_Browser* myBrowser;
115 OB_BrowserSync::OB_BrowserSync( OB_Browser* ob )
120 bool OB_BrowserSync::needUpdate( const ItemPtr& item ) const
124 SUIT_DataObject* obj = item->dataObject();
127 update = ( item->text( 0 ) != obj->name() );
129 // 2. check pixmap (compare serialNumber()-s)
130 QPixmap objPix = obj->icon();
131 const QPixmap* itemPix = item->pixmap( 0 );
132 update = ( objPix.isNull() && ( itemPix && !itemPix->isNull() ) ) ||
133 ( !objPix.isNull() && ( !itemPix || itemPix->isNull() ) );
134 if ( !update && !objPix.isNull() && itemPix && !itemPix->isNull() ) {
135 int aIconW = objPix.width();
138 double aScale = 20.0 / aIconW;
139 aM.scale( aScale, aScale );
140 objPix = objPix.xForm( aM );
142 update = ( objPix.serialNumber() != itemPix->serialNumber() );
150 void OB_BrowserSync::updateItem( const ItemPtr& p ) const
152 if ( p && needUpdate( p ) ) {
153 // printf( "--- needUpdate for %s = true ---\n", p->text( 0 ).latin1() );
158 ItemPtr OB_BrowserSync::createItem( const ObjPtr& src,
159 const ItemPtr& parent, const ItemPtr& after,
160 const bool prepend ) const
162 ItemPtr i = myBrowser ? dynamic_cast<ItemPtr>( myBrowser->createItem( src, parent, after, prepend ) ) : 0;
164 i->setOpen( src->isOpen() );
168 void OB_BrowserSync::deleteItemWithChildren( const ItemPtr& i ) const
170 if( myBrowser && myBrowser->myItems.contains( i->dataObject() ) )
172 myBrowser->removeReferences( i );
177 bool OB_BrowserSync::isEqual( const ObjPtr& p, const ItemPtr& q ) const
179 return ( !p && !q ) || ( p && q && q->dataObject()==p );
182 ObjPtr OB_BrowserSync::nullSrc() const
187 ItemPtr OB_BrowserSync::nullTrg() const
192 void OB_BrowserSync::children( const ObjPtr& p, QValueList<ObjPtr>& ch ) const
199 for( SUIT_DataObject* o = l.first(); o; o = l.next() )
204 void OB_BrowserSync::children( const ItemPtr& p, QValueList<ItemPtr>& ch ) const
206 for( QListViewItem* item = p->firstChild(); item; item = item->nextSibling() )
208 ItemPtr p = dynamic_cast<ItemPtr>( item );
214 ItemPtr OB_BrowserSync::parent( const ItemPtr& p ) const
216 return p ? dynamic_cast<ItemPtr>( p->parent() ) : 0;
222 Descr: Hierarchical tree object browser.
225 OB_Browser::OB_Browser( QWidget* parent, SUIT_DataObject* root )
230 myAutoOpenLevel( 0 ),
231 myAutoUpdate( false ),
232 myAutoDelObjs( false ),
233 myRootDecorated( true )
235 myView = new OB_ListView( QtxListView::HeaderAuto, this );
236 myView->setAppropriate( myView->addColumn( "Data" ), false );
237 myView->setSorting( -1 );
238 myView->setRootIsDecorated( true );
239 myView->setSelectionMode( QListView::Extended );
240 myView->installEventFilter( this );
241 myView->viewport()->installEventFilter( this );
243 QVBoxLayout* main = new QVBoxLayout( this );
244 main->addWidget( myView );
246 myShowToolTips = true;
247 myTooltip = new ToolTip( this, myView->viewport() );
249 connect( myView, SIGNAL( dropped( QPtrList<QListViewItem>, QListViewItem*, int ) ),
250 this, SLOT( onDropped( QPtrList<QListViewItem>, QListViewItem*, int ) ) );
251 connect( myView, SIGNAL( selectionChanged() ), this, SIGNAL( selectionChanged() ) );
252 connect( myView, SIGNAL( doubleClicked( QListViewItem* ) ),
253 this, SLOT( onDoubleClicked( QListViewItem* ) ) );
255 setRootObject( root );
260 OB_Browser::~OB_Browser()
266 bool OB_Browser::rootIsDecorated() const
268 return myRootDecorated;
271 void OB_Browser::setRootIsDecorated( const bool decor )
273 if ( decor == rootIsDecorated() )
276 myRootDecorated = decor;
277 updateTree( 0, false );
280 int OB_Browser::autoOpenLevel() const
282 return myAutoOpenLevel;
285 void OB_Browser::setAutoOpenLevel( const int level )
287 if ( myAutoOpenLevel == level )
290 myAutoOpenLevel = level;
295 bool OB_Browser::isShowToolTips()
297 return myShowToolTips;
300 void OB_Browser::setShowToolTips( const bool theDisplay )
302 myShowToolTips = theDisplay;
305 bool OB_Browser::isAutoUpdate() const
310 void OB_Browser::setAutoUpdate( const bool on )
315 bool OB_Browser::isAutoDeleteObjects() const
317 return myAutoDelObjs;
320 void OB_Browser::setAutoDeleteObjects( const bool on )
325 SUIT_DataObject* OB_Browser::getRootObject() const
330 void OB_Browser::setRootObject( SUIT_DataObject* theRoot )
332 DataObjectKey curKey;
333 DataObjectMap selObjs, openObjs;
334 DataObjectKeyMap selKeys, openKeys;
336 int selNum = numberOfSelected();
338 SUIT_DataObject* curObj = 0;
340 curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey );
342 removeConnections( myRoot );
343 if ( myRoot != theRoot && isAutoDeleteObjects() )
348 createConnections( myRoot );
351 updateView( myRoot );
352 else if ( listView() )
358 restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
364 if ( selNum != numberOfSelected() )
365 emit selectionChanged();
368 int OB_Browser::numberOfSelected() const
373 for ( QListViewItemIterator it( listView() ); it.current(); ++it )
374 if ( it.current()->isSelected() )
380 DataObjectList OB_Browser::getSelected() const
387 void OB_Browser::getSelected( DataObjectList& theObjList ) const
394 for ( QListViewItemIterator it( listView() ); it.current(); ++it )
396 if ( it.current()->isSelected() )
398 SUIT_DataObject* obj = dataObject( it.current() );
400 theObjList.append( obj );
405 void OB_Browser::setSelected( const SUIT_DataObject* theObject, const bool append )
408 lst.append( theObject );
409 setSelected( lst, append );
412 void OB_Browser::setSelected( const DataObjectList& theObjLst, const bool append )
414 QListView* lv = listView();
419 bool changed = false;
420 bool block = lv->signalsBlocked();
421 lv->blockSignals( true );
423 QMap<QListViewItem*, int> map;
424 for ( DataObjectListIterator itr( theObjLst ); itr.current(); ++itr )
425 map.insert( listViewItem( itr.current() ), 0 );
427 for ( QListViewItemIterator it( lv ); it.current(); ++it )
429 QListViewItem* item = it.current();
430 if ( map.contains( item ) && !lv->isSelected( item ) )
433 lv->setSelected( item, true );
435 if ( !append && !map.contains( item ) && lv->isSelected( item ) )
438 lv->setSelected( item, false );
442 lv->blockSignals( block );
447 QListViewItem* sel = 0;
448 QListViewItem* cur = lv->currentItem();
449 for ( QListViewItemIterator iter( lv ); iter.current() && !sel; ++iter, count++ )
451 if ( iter.current()->isSelected() && cur == iter.current() )
452 sel = iter.current();
455 for ( QListViewItemIterator itr( lv ); itr.current() && !sel; ++itr )
457 if ( itr.current()->isSelected() )
462 lv->setCurrentItem( sel );
464 if ( sel && count == 1 )
465 lv->ensureItemVisible( sel );
467 emit selectionChanged();
471 bool OB_Browser::isOpen( SUIT_DataObject* theObject ) const
475 res = listView()->isOpen( listViewItem( theObject ) );
479 void OB_Browser::setOpen( SUIT_DataObject* theObject, const bool theOpen )
482 listView()->setOpen( listViewItem( theObject ), theOpen );
485 SUIT_DataObject* OB_Browser::dataObjectAt( const QPoint& pos ) const
487 SUIT_DataObject* obj = 0;
489 QListView* lv = listView();
491 obj = dataObject( lv->itemAt( pos ) );
496 OB_Filter* OB_Browser::filter() const
498 return myView->filter();
501 void OB_Browser::setFilter( OB_Filter* f )
503 myView->setFilter( f );
506 int OB_Browser::addColumn( const QString& label, const int id, const int width )
508 return addColumn( QIconSet(), label, id, width );
511 int OB_Browser::addColumn( const QIconSet& icon, const QString& label, const int id, const int width )
513 QListView* lv = listView();
520 while ( myColumnIds.contains( theId ) )
524 if ( myColumnIds.contains( theId ) )
525 return -1; // can not reuse id
529 sec = lv->addColumn( label, width );
531 sec = lv->addColumn( icon, label, width );
536 myColumnIds.insert( theId, sec );
542 void OB_Browser::removeColumn( const int id )
544 QListView* lv = listView();
545 if ( !lv || !myColumnIds.contains( id ) )
548 int sec = myColumnIds[id];
549 lv->removeColumn( sec );
551 // update map of column indeces
552 myColumnIds.remove( id );
553 for ( QMap<int, int>::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
561 void OB_Browser::setNameTitle( const QString& label )
563 setNameTitle( QIconSet(), label );
566 void OB_Browser::setNameTitle( const QIconSet& icon, const QString& label )
568 QListView* lv = listView();
573 lv->setColumnText( 0, label );
575 lv->setColumnText( 0, icon, label );
578 void OB_Browser::setColumnTitle( const int id, const QString& label )
580 setColumnTitle( id, QIconSet(), label );
583 void OB_Browser::setColumnTitle( const int id, const QIconSet& icon, const QString& label )
585 QListView* lv = listView();
586 if ( !lv || !myColumnIds.contains( id ) )
590 lv->setColumnText( myColumnIds[id], label );
592 lv->setColumnText( myColumnIds[id], icon, label );
595 QString OB_Browser::nameTitle() const
597 return myView->columnText( 0 );
600 QString OB_Browser::columnTitle( const int id ) const
603 if ( myColumnIds.contains( id ) )
604 txt = myView->columnText( myColumnIds[id] );
608 bool OB_Browser::isColumnVisible( const int id ) const
610 return myColumnIds.contains( id ) && myView->isShown( myColumnIds[id] );
613 void OB_Browser::setColumnShown( const int id, const bool on )
615 if ( !myColumnIds.contains( id ) )
618 myView->setShown( myColumnIds[id], on );
621 void OB_Browser::setWidthMode( QListView::WidthMode mode )
623 for ( int i = 0, n = myView->columns(); i < n; i++ )
624 myView->setColumnWidthMode( i, mode );
627 QValueList<int> OB_Browser::columns() const
630 for ( QMap<int, int>::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
631 lst.append( it.key() );
635 bool OB_Browser::appropriateColumn( const int id ) const
638 if ( myColumnIds.contains( id ) )
639 res = myView->appropriate( myColumnIds[id] );
643 void OB_Browser::setAppropriateColumn( const int id, const bool on )
645 if ( !myColumnIds.contains( id ) )
648 myView->setAppropriate( myColumnIds[id], on );
651 void OB_Browser::updateTree( SUIT_DataObject* obj, const bool autoOpen )
653 // QTime t1 = QTime::currentTime();
655 if ( !obj && !(obj = getRootObject()) )
658 DataObjectKey curKey;
659 DataObjectMap selObjs, openObjs;
660 DataObjectKeyMap selKeys, openKeys;
662 int selNum = numberOfSelected();
664 SUIT_DataObject* curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey );
668 restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
675 if ( selNum != numberOfSelected() )
676 emit selectionChanged();
678 // QTime t2 = QTime::currentTime();
679 // qDebug( QString( "update tree time = %1 msecs" ).arg( t1.msecsTo( t2 ) ) );
682 void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg )
684 if ( !src || !trg || src == trg || src->root() != getRootObject() )
687 DataObjectKey curKey;
688 DataObjectMap selObjs, openObjs;
689 DataObjectKeyMap selKeys, openKeys;
691 int selNum = numberOfSelected();
693 SUIT_DataObject* curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey );
695 SUIT_DataObject* parent = src->parent();
696 int pos = parent ? parent->childPos( src ) : -1;
700 removeConnections( src );
701 if ( isAutoDeleteObjects() )
704 if ( parent && pos != -1 )
705 parent->insertChild( trg, pos );
707 trg->setParent( parent );
710 createConnections( trg );
712 restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
718 if ( selNum != numberOfSelected() )
719 emit selectionChanged();
722 void OB_Browser::updateView( SUIT_DataObject* startObj )
724 QListView* lv = listView();
728 if ( !startObj || startObj->root() != getRootObject() )
731 if ( startObj == myRoot )
734 myRoot->children( ch );
737 QListViewItem* st = lv->firstChild();
738 for( ; st; st = st->nextSibling() )
740 OB_ListItem* ob_item = dynamic_cast<OB_ListItem*>( st );
741 exist.insert( ob_item->dataObject(), ob_item );
744 SUIT_DataObject* local_root = ch.first();
745 for( ; local_root; local_root = ch.next() )
747 OB_BrowserSync sync( this );
748 OB_ListItem* local_item = dynamic_cast<OB_ListItem*>( listViewItem( local_root ) );
749 synchronize<ObjPtr,ItemPtr,OB_BrowserSync>( local_root, local_item, sync );
750 exist[local_root] = 0;
753 ItemMap::const_iterator anIt = exist.begin(), aLast = exist.end();
754 for( ; anIt!=aLast; anIt++ )
756 if( anIt.data() ) // exist[local_root]==1 -> this local root was NOT in data model, should be removed
758 removeReferences( anIt.data() );
759 OB_ListItem* item = dynamic_cast<OB_ListItem*>( anIt.data() );
760 if( item && myItems.contains( item->dataObject() ) )
767 OB_BrowserSync sync( this );
768 OB_ListItem* startItem = dynamic_cast<OB_ListItem*>( listViewItem( startObj ) );
769 synchronize<ObjPtr,ItemPtr,OB_BrowserSync>( startObj, startItem, sync );
773 QListViewItem* OB_Browser::createItem( const SUIT_DataObject* o, QListViewItem* parent,
774 QListViewItem* after, const bool prepend )
776 QListView* lv = listView();
781 QListViewItem* item = 0;
782 SUIT_DataObject* obj = (SUIT_DataObject*)o;
786 switch ( obj->checkType() )
788 case SUIT_DataObject::CheckBox:
789 type = QCheckListItem::CheckBox;
791 case SUIT_DataObject::RadioButton:
792 type = QCheckListItem::RadioButton;
801 item = new OB_ListItem( obj, parent, after );
803 item = new OB_CheckListItem( obj, parent, after, (QCheckListItem::Type)type );
808 item = new OB_ListItem( obj, parent );
810 item = new OB_CheckListItem( obj, parent, (QCheckListItem::Type)type );
814 after = parent->firstChild();
815 while ( after && after->nextSibling() )
816 after = after->nextSibling();
818 item = new OB_ListItem( obj, parent, after );
820 item = new OB_CheckListItem( obj, parent, after, (QCheckListItem::Type)type );
828 item = new OB_ListItem( obj, lv, after );
830 item = new OB_CheckListItem( obj, lv, after, (QCheckListItem::Type)type );
835 item = new OB_ListItem( obj, lv );
837 item = new OB_CheckListItem( obj, lv, (QCheckListItem::Type)type );
841 after = lv->firstChild();
842 while ( after && after->nextSibling() )
843 after = after->nextSibling();
845 item = new OB_ListItem( obj, lv, after );
847 item = new OB_CheckListItem( obj, lv, after, (QCheckListItem::Type)type );
851 myItems.insert( obj, item );
852 obj->connect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
858 void OB_Browser::adjustWidth()
863 listView()->setColumnWidth( 0, 0 );
864 if ( listView()->firstChild() )
865 adjustWidth( listView()->firstChild() );
868 void OB_Browser::adjustWidth( QListViewItem* item )
872 item->widthChanged( 0 );
873 if ( item->isOpen() )
874 adjustWidth( item->firstChild() );
875 item = item->nextSibling();
879 SUIT_DataObject* OB_Browser::dataObject( const QListViewItem* item ) const
881 SUIT_DataObject* obj = 0;
883 if ( item && item->rtti() == OB_ListItem::RTTI() )
884 obj = ((OB_ListItem*)item)->dataObject();
885 else if ( item && item->rtti() == OB_CheckListItem::RTTI() )
886 obj = ((OB_CheckListItem*)item)->dataObject();
891 QListViewItem* OB_Browser::listViewItem( const SUIT_DataObject* obj ) const
893 QListViewItem* item = 0;
895 if ( myItems.contains( (SUIT_DataObject*)obj ) )
896 item = myItems[(SUIT_DataObject*)obj];
901 QListView* OB_Browser::listView() const
906 void OB_Browser::removeReferences( QListViewItem* item )
911 SUIT_DataObject* obj = dataObject( item );
912 obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
913 myItems.remove( obj );
915 QListViewItem* i = item->firstChild();
918 removeReferences( i );
919 i = i->nextSibling();
923 void OB_Browser::createConnections( SUIT_DataObject* obj )
928 DataObjectList childList;
929 obj->children( childList, true );
931 childList.prepend( obj );
933 for ( DataObjectListIterator it( childList ); it.current(); ++it )
934 it.current()->connect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
937 void OB_Browser::removeConnections( SUIT_DataObject* obj )
942 DataObjectList childList;
943 obj->children( childList, true );
945 childList.prepend( obj );
947 for ( DataObjectListIterator it( childList ); it.current(); ++it )
948 it.current()->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
951 SUIT_DataObject* OB_Browser::storeState( DataObjectMap& selObjs, DataObjectMap& openObjs,
952 DataObjectKeyMap& selKeys, DataObjectKeyMap& openKeys,
953 DataObjectKey& curKey ) const
955 QListView* lv = listView();
959 SUIT_DataObject* curObj = dataObject( lv->currentItem() );
961 curKey = objectKey( curObj );
963 for ( QListViewItemIterator it( lv ); it.current(); ++it )
965 SUIT_DataObject* obj = dataObject( it.current() );
969 selObjs.insert( obj, lv->isSelected( it.current() ) );
970 openObjs.insert( obj, lv->isOpen( it.current() ) );
971 if ( lv->isSelected( it.current() ) )
972 selKeys.insert( objectKey( obj ), 0 );
973 if ( lv->isOpen( it.current() ) )
974 openKeys.insert( objectKey( obj ), 0 );
980 void OB_Browser::restoreState( const DataObjectMap& selObjs, const DataObjectMap& openObjs,
981 const SUIT_DataObject* curObj, const DataObjectKeyMap& selKeys,
982 const DataObjectKeyMap& openKeys, const DataObjectKey& curKey )
984 QListView* lv = listView();
988 bool block = lv->signalsBlocked();
989 lv->blockSignals( true );
991 QListViewItem* curItem = 0;
992 for ( QListViewItemIterator it( lv ); it.current(); ++it )
994 QListViewItem* item = it.current();
995 SUIT_DataObject* obj = dataObject( item );
1000 DataObjectKey key = objectKey( obj );
1002 if ( selObjs.contains( obj ) )
1004 if ( selObjs[obj] && !lv->isSelected( item ) )
1005 lv->setSelected( item, true );
1007 else if ( !key.isNull() && selKeys.contains( key ) && !lv->isSelected( item ) )
1008 lv->setSelected( item, true );
1010 if ( openObjs.contains( obj ) )
1012 bool parentOpen = true;
1013 if( item && item->parent() )
1014 parentOpen = item->parent()->isOpen();
1016 if ( openObjs[obj] && parentOpen )
1017 lv->setOpen( item, true );
1019 else if ( !key.isNull() && openKeys.contains( key ) )
1021 bool parentOpen = true;
1022 if( item && item->parent() )
1023 parentOpen = item->parent()->isOpen();
1026 lv->setOpen( item, true );
1029 if ( !curItem && ( curObj == obj || ( !curKey.isNull() && curKey == key )) )
1034 lv->setCurrentItem( curItem );
1036 lv->blockSignals( block );
1039 OB_Browser::DataObjectKey OB_Browser::objectKey( QListViewItem* i ) const
1041 return objectKey( dataObject( i ) );
1044 OB_Browser::DataObjectKey OB_Browser::objectKey( SUIT_DataObject* obj ) const
1049 return DataObjectKey( obj->key() );
1052 void OB_Browser::keyPressEvent( QKeyEvent* e )
1054 if ( e->key() == Qt::Key_F5 )
1055 updateTree( 0, false );
1057 QFrame::keyPressEvent( e );
1060 void OB_Browser::onExpand()
1062 DataObjectList selected;
1063 getSelected( selected );
1064 for ( DataObjectListIterator itr( selected ); itr.current(); ++itr )
1065 expand( listViewItem( itr.current() ) );
1068 void OB_Browser::onColumnVisible( int id )
1070 setColumnShown( id, !isColumnVisible( id ) );
1073 void OB_Browser::onDestroyed( SUIT_DataObject* obj )
1075 removeObject( obj );
1078 void OB_Browser::onDropped( QPtrList<QListViewItem> items, QListViewItem* item, int action )
1080 SUIT_DataObject* obj = dataObject( item );
1085 for ( QPtrListIterator<QListViewItem> it( items ); it.current(); ++it )
1087 SUIT_DataObject* o = dataObject( it.current() );
1092 if ( !lst.isEmpty() )
1093 emit dropped( lst, obj, action );
1096 void OB_Browser::updateText()
1098 if ( myColumnIds.isEmpty() )
1101 QListView* lv = listView();
1105 for ( QListViewItemIterator it( lv ); it.current(); ++it )
1107 SUIT_DataObject* obj = dataObject( it.current() );
1111 for( QMap<int, int>::iterator itr = myColumnIds.begin(); itr != myColumnIds.end(); ++itr )
1112 it.current()->setText( itr.data(), obj->text( itr.key() ) );
1116 void OB_Browser::updateText( QListViewItem* item )
1118 SUIT_DataObject* obj = dataObject( item );
1122 for( QMap<int, int>::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
1123 item->setText( it.data(), obj->text( it.key() ) );
1126 bool OB_Browser::eventFilter( QObject* o, QEvent* e )
1128 if ( o == myView && e->type() == QEvent::ContextMenu )
1130 QContextMenuEvent* ce = (QContextMenuEvent*)e;
1131 if ( ce->reason() != QContextMenuEvent::Mouse )
1132 contextMenuRequest( ce );
1135 if ( o == myView->viewport() && e->type() == QEvent::MouseButtonRelease )
1137 QMouseEvent* me = (QMouseEvent*)e;
1138 if ( me->button() == RightButton )
1140 QContextMenuEvent ce( QContextMenuEvent::Mouse, me->pos(), me->globalPos(), me->state() );
1141 contextMenuRequest( &ce );
1146 return QFrame::eventFilter( o, e );
1149 void OB_Browser::contextMenuPopup( QPopupMenu* menu )
1151 /* QValueList<int> cols;
1152 for ( QMap<int, int>::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
1154 if ( appropriateColumn( it.key() ) )
1155 cols.append( it.key() );
1158 uint num = menu->count();
1159 menu->setCheckable( true );
1160 for ( QValueList<int>::const_iterator iter = cols.begin(); iter != cols.end(); ++iter )
1162 QString name = columnTitle( *iter );
1163 if ( name.isEmpty() )
1166 int id = menu->insertItem( name, this, SLOT( onColumnVisible( int ) ) );
1167 menu->setItemChecked( id, isColumnVisible( *iter ) );
1168 menu->setItemParameter( id, *iter );
1170 if ( menu->count() != num )
1171 menu->insertSeparator();*/
1173 DataObjectList selected;
1174 getSelected( selected );
1176 bool closed = false;
1177 for ( DataObjectListIterator itr( selected ); itr.current() && !closed; ++itr )
1178 closed = hasClosed( listViewItem( itr.current() ) );
1182 menu->insertItem( tr( "MEN_EXPAND_ALL" ), this, SLOT( onExpand() ) );
1183 menu->insertSeparator();
1187 void OB_Browser::expand( QListViewItem* item )
1192 item->setOpen( true );
1193 for ( QListViewItem* child = item->firstChild(); child; child = child->nextSibling() )
1197 bool OB_Browser::hasClosed( QListViewItem* item ) const
1202 if ( item->childCount() && !item->isOpen() )
1206 for ( QListViewItem* child = item->firstChild(); child && !has; child = child->nextSibling() )
1207 has = hasClosed( child );
1212 void OB_Browser::removeObject( SUIT_DataObject* obj, const bool autoUpd )
1217 // Removing list view items from <myItems> recursively for all children.
1218 // Otherwise, "delete item" line will destroy all item's children,
1219 // and <myItems> will contain invalid pointers (see ~QListViewItem() description in Qt docs)
1220 DataObjectList childList;
1221 obj->children( childList, true );
1222 for ( DataObjectListIterator it( childList ); it.current(); ++it )
1224 it.current()->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
1225 myItems.remove( it.current() );
1228 QListViewItem* item = listViewItem( obj );
1230 obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
1231 myItems.remove( obj );
1233 if ( obj == myRoot )
1235 // remove all child list view items
1243 if ( isAutoUpdate() )
1245 SUIT_DataObject* pObj = item && item->parent() ? dataObject( item->parent() ) : 0;
1246 updateTree( pObj, false );
1252 void OB_Browser::autoOpenBranches()
1254 int level = autoOpenLevel();
1255 QListView* lv = listView();
1256 if ( !lv || level < 1 )
1259 QListViewItem* item = lv->firstChild();
1262 openBranch( item, level );
1263 item = item->nextSibling();
1267 void OB_Browser::openBranch( QListViewItem* item, const int level )
1274 item->setOpen( true );
1275 openBranch( item->firstChild(), level - 1 );
1276 item = item->nextSibling();
1280 void OB_Browser::onDoubleClicked( QListViewItem* item )
1283 emit doubleClicked( dataObject( item ) );
1286 void OB_Browser::setModified()
1288 myModifiedTime = clock();