Salome HOME
PAL10110 - incorrect title of dialog of file selection for file preference item
[modules/gui.git] / src / ObjBrowser / OB_Browser.cxx
index cfac7369726439136ef2b0173f1906b4f130a6bb..a660a57d762860607f6a1f12c68544be83fdc7ef 100755 (executable)
@@ -44,7 +44,7 @@ void OB_Browser::ToolTip::maybeTip( const QPoint& pos )
   if ( !parentWidget() || !myBrowser || !myBrowser->isShowToolTips() )
          return;
 
-  QListView* lv = myBrowser->getListView();
+  QListView* lv = myBrowser->listView();
 
   QListViewItem* item = lv->itemAt( pos );
   SUIT_DataObject* obj = myBrowser->dataObject( item );
@@ -76,12 +76,13 @@ myAutoUpdate( false ),
 myAutoDelObjs( false ),
 myRootDecorated( true )
 {
-  myView = new OB_ListView( this );
-  myView->addColumn( "Data" );
+  myView = new OB_ListView( QtxListView::HeaderAuto, this );
+  myView->setAppropriate( myView->addColumn( "Data" ), false );
   myView->setSorting( -1 );
   myView->setRootIsDecorated( true );
   myView->setSelectionMode( QListView::Extended );
   myView->installEventFilter( this );
+  myView->viewport()->installEventFilter( this );
 
   QVBoxLayout* main = new QVBoxLayout( this );
   main->addWidget( myView );
@@ -178,6 +179,7 @@ void OB_Browser::setRootObject( SUIT_DataObject* theRoot )
   if ( theRoot )
     curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey );
 
+  removeConnections( myRoot );
   if ( myRoot != theRoot && isAutoDeleteObjects() )
     delete myRoot;
 
@@ -187,10 +189,10 @@ void OB_Browser::setRootObject( SUIT_DataObject* theRoot )
 
   if ( myRoot )
     updateView( myRoot );
-  else if ( getListView() )
+  else if ( listView() )
   {
     myItems.clear();
-    getListView()->clear();
+    listView()->clear();
   }
 
   restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
@@ -204,9 +206,9 @@ void OB_Browser::setRootObject( SUIT_DataObject* theRoot )
 int OB_Browser::numberOfSelected() const
 {
   int count = 0;
-  if ( getListView() )
+  if ( listView() )
   {
-    for ( QListViewItemIterator it( getListView() ); it.current(); ++it )
+    for ( QListViewItemIterator it( listView() ); it.current(); ++it )
       if ( it.current()->isSelected() ) 
         count++;
   }
@@ -224,16 +226,16 @@ void OB_Browser::getSelected( DataObjectList& theObjList ) const
 {
   theObjList.clear();
 
-  if ( !getListView() )
+  if ( !listView() )
     return;
 
-  for ( QListViewItemIterator it( getListView() ); it.current(); ++it )
+  for ( QListViewItemIterator it( listView() ); it.current(); ++it )
   {
     if ( it.current()->isSelected() ) 
     {
       SUIT_DataObject* obj = dataObject( it.current() );
       if ( obj )
-             theObjList.append( obj );
+       theObjList.append( obj );
     }
   }
 }
@@ -247,7 +249,7 @@ void OB_Browser::setSelected( const SUIT_DataObject* theObject, const bool appen
 
 void OB_Browser::setSelected( const DataObjectList& theObjLst, const bool append )
 {
-  QListView* lv = getListView();
+  QListView* lv = listView();
 
   if ( !lv )
     return;
@@ -307,22 +309,22 @@ void OB_Browser::setSelected( const DataObjectList& theObjLst, const bool append
 bool OB_Browser::isOpen( SUIT_DataObject* theObject ) const
 {
   bool res = false;
-  if ( getListView() )
-    res = getListView()->isOpen( listViewItem( theObject ) );
+  if ( listView() )
+    res = listView()->isOpen( listViewItem( theObject ) );
   return res;
 }
 
 void OB_Browser::setOpen( SUIT_DataObject* theObject, const bool theOpen )
 {
-  if ( getListView() )
-    getListView()->setOpen( listViewItem( theObject ), theOpen );
+  if ( listView() )
+    listView()->setOpen( listViewItem( theObject ), theOpen );
 }
 
 SUIT_DataObject* OB_Browser::dataObjectAt( const QPoint& pos ) const
 {
   SUIT_DataObject* obj = 0;
 
-  QListView* lv = getListView();
+  QListView* lv = listView();
   if ( lv )
     obj = dataObject( lv->itemAt( pos ) );
 
@@ -339,64 +341,154 @@ void OB_Browser::setFilter( OB_Filter* f )
   myView->setFilter( f );
 }
 
-int OB_Browser::addColumn( const QString & label, int width, int index )
+int OB_Browser::addColumn( const QString& label, const int id, const int width )
 {
-  int id = -1;
-  if ( !myView )
-    return id;
-  if ( index != -1 && myColumnIds.contains( index ) )
-    return id; // can not reuse index
-
-  int trueId = index;
-  id = myView->addColumn( label, width );
-  if ( trueId == -1 )
-    trueId = id;
-  myColumnIds.insert( trueId, id );
-  updateText();
-
-  return trueId;
+  return addColumn( QIconSet(), label, id, width );
 }
 
-int OB_Browser::addColumn( const QIconSet & iconset, const QString & label, int width, int index )
+int OB_Browser::addColumn( const QIconSet& icon, const QString& label, const int id, const int width )
 {
-  int id = -1;
-  if ( !myView )
-    return id;
-  if ( index != -1 && myColumnIds.contains( index ) )
-    return id; // can not reuse index
+  QListView* lv = listView();
+  if ( !lv )
+    return -1;
+
+  int theId = id;
+  if ( theId < 0 )
+  {
+    while ( myColumnIds.contains( theId ) )
+      theId++;
+  }
 
-  int trueId = index;
-  id = myView->addColumn( iconset, label, width );
-  if ( trueId == -1 )
-    trueId = id;
-  myColumnIds.insert( trueId, id );
+  if ( myColumnIds.contains( theId ) )
+    return -1; // can not reuse id
+
+  int sec = -1;
+  if ( icon.isNull() )
+    sec = lv->addColumn( label, width );
+  else
+    sec = lv->addColumn( icon, label, width );
+
+  if ( sec == -1 )
+    return -1;
+
+  myColumnIds.insert( theId, sec );
   updateText();
 
-  return trueId;
+  return theId;
 }
 
-void OB_Browser::removeColumn( int index )
+void OB_Browser::removeColumn( const int id )
 {
-  if ( !myView || !myColumnIds.contains( index ) )
+  QListView* lv = listView();
+  if ( !lv || !myColumnIds.contains( id ) )
     return;
 
-  int id = myColumnIds[ index ];
-  myView->removeColumn( id );
+  int sec = myColumnIds[id];
+  lv->removeColumn( sec );
 
   // update map of column indeces
-  myColumnIds.remove( index );
+  myColumnIds.remove( id );
   for ( QMap<int, int>::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
   {
-    if ( it.key() > index )
+    if ( it.key() > id )
       it.data()--;
   }
   updateText();
 }
 
-void OB_Browser::updateTree( SUIT_DataObject* o )
+void OB_Browser::setNameTitle( const QString& label )
 {
-  SUIT_DataObject* obj = o ? o : getRootObject();
-  if ( !obj )
+  setNameTitle( QIconSet(), label );
+}
+
+void OB_Browser::setNameTitle( const QIconSet& icon, const QString& label )
+{
+  QListView* lv = listView();
+  if ( !lv )
+    return;
+
+  if ( icon.isNull() )
+    lv->setColumnText( 0, label );
+  else
+    lv->setColumnText( 0, icon, label );
+}
+
+void OB_Browser::setColumnTitle( const int id, const QString& label )
+{
+  setColumnTitle( id, QIconSet(), label );
+}
+
+void OB_Browser::setColumnTitle( const int id, const QIconSet& icon, const QString& label )
+{
+  QListView* lv = listView();
+  if ( !lv || !myColumnIds.contains( id ) )
+    return;
+
+  if ( icon.isNull() )
+    lv->setColumnText( myColumnIds[id], label );
+  else
+    lv->setColumnText( myColumnIds[id], icon, label );
+}
+
+QString OB_Browser::nameTitle() const
+{
+  return myView->columnText( 0 );
+}
+
+QString OB_Browser::columnTitle( const int id ) const
+{
+  QString txt;
+  if ( myColumnIds.contains( id ) )
+    txt = myView->columnText( myColumnIds[id] );
+  return txt;
+}
+
+bool OB_Browser::isColumnVisible( const int id ) const
+{
+  return myColumnIds.contains( id ) && myView->isShown( myColumnIds[id] );
+}
+
+void OB_Browser::setColumnShown( const int id, const bool on )
+{
+  if ( !myColumnIds.contains( id ) )
+    return;
+
+  myView->setShown( myColumnIds[id], on );
+}
+
+void OB_Browser::setWidthMode( QListView::WidthMode mode )
+{
+  for ( int i = 0, n = myView->columns(); i < n; i++ )
+    myView->setColumnWidthMode( i, mode );
+}
+
+QValueList<int> OB_Browser::columns() const
+{
+  QValueList<int> lst;
+  for ( QMap<int, int>::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
+    lst.append( it.key() );
+  return lst;
+}
+
+bool OB_Browser::appropriateColumn( const int id ) const
+{
+  bool res = false;
+  if ( myColumnIds.contains( id ) )
+    res = myView->appropriate( myColumnIds[id] );
+  return res;
+}
+
+void OB_Browser::setAppropriateColumn( const int id, const bool on )
+{
+  if ( !myColumnIds.contains( id ) )
+    return;
+
+  myView->setAppropriate( myColumnIds[id], on );
+}
+
+void OB_Browser::updateTree( SUIT_DataObject* obj )
+{
+  if ( !obj && !(obj = getRootObject()) )
     return;
 
   DataObjectKey curKey;
@@ -420,7 +512,7 @@ void OB_Browser::updateTree( SUIT_DataObject* o )
 
 void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg )
 {
-  if ( !src || !trg || src->root() != getRootObject() )
+  if ( !src || !trg || src == trg || src->root() != getRootObject() )
     return;
 
   DataObjectKey curKey;
@@ -436,7 +528,8 @@ void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg )
 
   src->setParent( 0 );
 
-  if ( src != trg && isAutoDeleteObjects() )
+  removeConnections( src );
+  if ( isAutoDeleteObjects() )
     delete src;
 
   if ( parent && pos != -1 )
@@ -457,7 +550,7 @@ void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg )
 
 void OB_Browser::updateView( const SUIT_DataObject* theStartObj )
 {
-  QListView* lv = getListView();
+  QListView* lv = listView();
   if ( !lv )
     return;
 
@@ -509,11 +602,11 @@ void OB_Browser::updateView( const SUIT_DataObject* theStartObj )
       createTree( it.current(), 0, 0 );
   }
   else
-    createTree( theStartObj, parent, after );
+    createTree( theStartObj, parent, after ? after : parent );
 }
 
 QListViewItem* OB_Browser::createTree( const SUIT_DataObject* obj,
-                                          QListViewItem* parent, QListViewItem* after )
+                                       QListViewItem* parent, QListViewItem* after )
 {
   if ( !obj )
     return 0;
@@ -525,13 +618,16 @@ QListViewItem* OB_Browser::createTree( const SUIT_DataObject* obj,
   for ( DataObjectListIterator it ( lst ); it.current(); ++it )
     createTree( it.current(), item );
 
+  if ( item )
+    item->setOpen( obj->isOpen() );
+
   return item;
 }
 
 QListViewItem* OB_Browser::createItem( const SUIT_DataObject* o,
                                        QListViewItem* parent, QListViewItem* after )
 {
-  QListView* lv = getListView();
+  QListView* lv = listView();
 
   if ( !lv || !o )
     return 0;
@@ -585,17 +681,19 @@ QListViewItem* OB_Browser::createItem( const SUIT_DataObject* o,
 
   myItems.insert( obj, item );
 
+  updateText( item );
+
   return item;
 }
 
 void OB_Browser::adjustWidth()
 {
-  if ( !getListView() )
+  if ( !listView() )
     return;
 
-  getListView()->setColumnWidth( 0, 0 );
-  if ( getListView()->firstChild() )
-    adjustWidth( getListView()->firstChild() );
+  listView()->setColumnWidth( 0, 0 );
+  if ( listView()->firstChild() )
+    adjustWidth( listView()->firstChild() );
 }
 
 void OB_Browser::adjustWidth( QListViewItem* item )
@@ -631,7 +729,7 @@ QListViewItem* OB_Browser::listViewItem( const SUIT_DataObject* obj ) const
   return item;
 }
 
-QListView* OB_Browser::getListView() const
+QListView* OB_Browser::listView() const
 {
   return myView;
 }
@@ -642,6 +740,7 @@ void OB_Browser::removeReferences( QListViewItem* item )
     return;
 
   SUIT_DataObject* obj = dataObject( item );
+  obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
   myItems.remove( obj );
 
   QListViewItem* i = item->firstChild();
@@ -666,11 +765,25 @@ void OB_Browser::createConnections( SUIT_DataObject* obj )
     it.current()->connect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
 }
 
+void OB_Browser::removeConnections( SUIT_DataObject* obj )
+{
+  if ( !obj )
+    return;
+
+  DataObjectList childList;
+  obj->children( childList, true );
+
+  childList.prepend( obj );
+
+  for ( DataObjectListIterator it( childList ); it.current(); ++it )
+    it.current()->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
+}
+
 SUIT_DataObject* OB_Browser::storeState( DataObjectMap& selObjs, DataObjectMap& openObjs,
                                          DataObjectKeyMap& selKeys, DataObjectKeyMap& openKeys,
                                          DataObjectKey& curKey ) const
 {
-  QListView* lv = getListView();
+  QListView* lv = listView();
   if ( !lv )
     return 0;
 
@@ -699,7 +812,7 @@ void OB_Browser::restoreState( const DataObjectMap& selObjs, const DataObjectMap
                                const SUIT_DataObject* curObj, const DataObjectKeyMap& selKeys,
                                const DataObjectKeyMap& openKeys, const DataObjectKey& curKey )
 {
-  QListView* lv = getListView();
+  QListView* lv = listView();
   if ( !lv )
     return;
 
@@ -772,9 +885,9 @@ void OB_Browser::onExpand()
     expand( listViewItem( itr.current() ) );
 }
 
-void OB_Browser::onRefresh()
+void OB_Browser::onColumnVisible( int id )
 {
-  updateTree();
+  setColumnShown( id, !isColumnVisible( id ) );
 }
 
 void OB_Browser::onDestroyed( SUIT_DataObject* obj )
@@ -802,38 +915,81 @@ void OB_Browser::onDropped( QPtrList<QListViewItem> items, QListViewItem* item,
 
 void OB_Browser::updateText()
 {
-  if ( !myView )
+  if ( myColumnIds.isEmpty() )
     return;
-  
-  if ( myColumnIds.size() )
+
+  QListView* lv = listView();
+  if ( !lv )
+    return;
+
+  for ( QListViewItemIterator it( lv ); it.current(); ++it )
   {
-    QListViewItemIterator it( myView );
-    for ( ; it.current() != 0; ++it )
-    {
-      QListViewItem* item = it.current();
-      SUIT_DataObject* obj = dataObject( item );
-      if ( !item || !obj )
-        continue;
-      QMap<int, int>::iterator it = myColumnIds.begin();
-      for( ; it != myColumnIds.end(); ++it )
-        item->setText( it.data(), obj->text( it.key() ) );
-    }
+    SUIT_DataObject* obj = dataObject( it.current() );
+    if ( !obj )
+      continue;
+
+    for( QMap<int, int>::iterator itr = myColumnIds.begin(); itr != myColumnIds.end(); ++itr )
+      it.current()->setText( itr.data(), obj->text( itr.key() ) );
   }
-  updateView();
 }
 
-bool OB_Browser::eventFilter(QObject* watched, QEvent* e)
+void OB_Browser::updateText( QListViewItem* item )
+{
+  SUIT_DataObject* obj = dataObject( item );
+  if ( !obj )
+    return;
+
+  for( QMap<int, int>::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
+    item->setText( it.data(), obj->text( it.key() ) );
+}
+
+bool OB_Browser::eventFilter( QObject* o, QEvent* e )
 {
-  if ( watched == myView && e->type() == QEvent::ContextMenu )
+  if ( o == myView && e->type() == QEvent::ContextMenu )
   {
-    contextMenuRequest( (QContextMenuEvent*)e );
+    QContextMenuEvent* ce = (QContextMenuEvent*)e;
+    if ( ce->reason() != QContextMenuEvent::Mouse )
+      contextMenuRequest( ce );
     return true;
   }
-  return QFrame::eventFilter(watched, e);
+  if ( o == myView->viewport() && e->type() == QEvent::MouseButtonRelease )
+  {
+    QMouseEvent* me = (QMouseEvent*)e;
+    if ( me->button() == RightButton )
+    {
+      QContextMenuEvent ce( QContextMenuEvent::Mouse, me->pos(), me->globalPos(), me->state() );
+      contextMenuRequest( &ce );
+      return true;
+    }
+  }
+
+  return QFrame::eventFilter( o, e );
 }
 
 void OB_Browser::contextMenuPopup( QPopupMenu* menu )
 {
+/*  QValueList<int> cols;
+  for ( QMap<int, int>::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
+  {
+    if ( appropriateColumn( it.key() ) )
+      cols.append( it.key() );
+  }
+
+  uint num = menu->count();
+  menu->setCheckable( true );
+  for ( QValueList<int>::const_iterator iter = cols.begin(); iter != cols.end(); ++iter )
+  {
+    QString name = columnTitle( *iter );
+    if ( name.isEmpty() )
+      continue;
+
+    int id = menu->insertItem( name, this, SLOT( onColumnVisible( int ) ) );
+    menu->setItemChecked( id, isColumnVisible( *iter ) );
+    menu->setItemParameter( id, *iter );
+  }
+  if ( menu->count() != num )
+    menu->insertSeparator();*/
+
   DataObjectList selected;
   getSelected( selected );
 
@@ -846,7 +1002,6 @@ void OB_Browser::contextMenuPopup( QPopupMenu* menu )
     menu->insertItem( tr( "MEN_EXPAND_ALL" ), this, SLOT( onExpand() ) );
     menu->insertSeparator();
   }
-  menu->insertItem( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
 }
 
 void OB_Browser::expand( QListViewItem* item )
@@ -889,6 +1044,7 @@ void OB_Browser::removeObject( SUIT_DataObject* obj, const bool autoUpd )
 
   QListViewItem* item = listViewItem( obj );
 
+  obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
   myItems.remove( obj );
 
   if ( obj == myRoot )
@@ -909,7 +1065,7 @@ void OB_Browser::removeObject( SUIT_DataObject* obj, const bool autoUpd )
 void OB_Browser::autoOpenBranches()
 {
   int level = autoOpenLevel();
-  QListView* lv = getListView();
+  QListView* lv = listView();
   if ( !lv || level < 1 )
     return;
 
@@ -926,10 +1082,10 @@ void OB_Browser::openBranch( QListViewItem* item, const int level )
   if ( !item || level < 1 || !item->childCount() )
     return;
 
-  item->setOpen( true );
   while ( item )
   {
-    openBranch( item, level - 1 );
+    item->setOpen( true );
+    openBranch( item->firstChild(), level - 1 );
     item = item->nextSibling();
   }
 }