Salome HOME
Merge branch 'master' into rnc/t_shape_plugin
[modules/geom.git] / src / GEOMToolsGUI / GEOMToolsGUI_PublishDlg.cxx
index a8a70fc3f57e7f77ee5c9cce4e841116b17076b0..0ac5eb330aabdd9c3bcba9e91fc295ceda15d1a6 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 //
 
 #include "GEOMToolsGUI_PublishDlg.h"
+#include "GEOM_Displayer.h"
+#include "GeometryGUI.h"
 
 //SALOME GUI includes
 #include <SUIT_Session.h>
 #include <SUIT_DataObject.h>
+#include <SUIT_ResourceMgr.h>
 
 #include <CAM_DataModel.h>
 
@@ -41,6 +44,7 @@
 
 
 //QT includes
+#include <QHeaderView>
 #include <QGridLayout>
 #include <QTreeWidget>
 #include <QPushButton>
 #define  DEFAULT_MARGIN 11
 #define  DEFAULT_SPACING 6
 
+#define VISIBILITY_COLUMN_WIDTH 25
+
 GEOMToolsGUI_PublishDlg::GEOMToolsGUI_PublishDlg(QWidget* parent):
   QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
 {
    setObjectName( "GEOMToolsGUI_PublishDlg" );
-   setModal( true );
+   setModal( false );
    setWindowTitle( tr( "GEOM_PUBLISH_OBJECTS_TLT" ) );
 
    setAttribute(Qt::WA_DeleteOnClose);
@@ -62,13 +68,21 @@ GEOMToolsGUI_PublishDlg::GEOMToolsGUI_PublishDlg(QWidget* parent):
    //myTreeWidget->setRootIsDecorated(false);
    //myTreeWidget->setUniformRowHeights(true);
    myTreeWidget->setAllColumnsShowFocus(true);
-   myTreeWidget->setColumnCount(2);
+   myTreeWidget->setColumnCount(3);
 
    QStringList columnNames;
    columnNames.append(tr("OBJECT_NAME"));
    columnNames.append(tr("OBJECT_ENTRY"));
+   columnNames.append("");
    QTreeWidgetItem * headerItem = new QTreeWidgetItem(columnNames);
+   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+   headerItem->setIcon( 2, QIcon( resMgr->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_VISIBLE" ) ) ) );
    myTreeWidget->setHeaderItem ( headerItem );
+   myTreeWidget->header()->setClickable( true );
+   myTreeWidget->header()->setSortIndicatorShown( true );
+   myTreeWidget->header()->moveSection( 2, 0 );
+   myTreeWidget->setSortingEnabled( true );
+   myTreeWidget->setColumnWidth( 2, VISIBILITY_COLUMN_WIDTH );
 
    //Select All button
    QPushButton* selectAllButton = new  QPushButton( tr("SELECT_ALL"),this );
@@ -99,6 +113,8 @@ GEOMToolsGUI_PublishDlg::GEOMToolsGUI_PublishDlg(QWidget* parent):
    gridLayout->addWidget(closeButton, 3, 3, 1, 1);
 
    //Connect signals and slots
+   connect( myTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(onItemClicked(QTreeWidgetItem*, int)) );
+
    connect( selectAllButton, SIGNAL(clicked()), this, SLOT(clickOnSelectAll()) );
    connect( unselectAllButton, SIGNAL(clicked()), this, SLOT(clickOnUnSelectAll()) );
    
@@ -115,6 +131,31 @@ GEOMToolsGUI_PublishDlg::GEOMToolsGUI_PublishDlg(QWidget* parent):
 //=================================================================================
 GEOMToolsGUI_PublishDlg::~GEOMToolsGUI_PublishDlg()
 {
+  SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+  if ( app ) {
+    SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+    if ( appStudy ) {
+      _PTR(Study) aStudy = appStudy->studyDS();
+      if ( aStudy ) {
+       GEOM_Displayer displayer ( appStudy );
+       QTreeWidgetItemIterator it( myTreeWidget );
+       while ( *it ) {
+         QString entry = myEntryToItem.key( *it );
+         _PTR(SObject) SO ( aStudy->FindObjectID( qPrintable( entry ) ) );
+         if ( SO ) {
+           GEOM::GEOM_Object_var aGeomObject = GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( SO ) );
+           if ( CORBA::is_nil( aGeomObject ) ) continue;
+           if ( displayer.IsDisplayed( aGeomObject->GetStudyEntry() ) ) {
+             Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( aGeomObject->GetStudyEntry(), "GEOM", "" );
+             displayer.Erase( io );
+           }
+         }
+         ++it;
+       }
+       displayer.UpdateViewer();
+      }
+    }
+  }
 }
 
 //=================================================================================
@@ -150,18 +191,18 @@ void GEOMToolsGUI_PublishDlg::initData() {
 
   buildTree(aStudy, myGeomRoot);
 
-
   myTreeWidget->resizeColumnToContents(0);
   myTreeWidget->resizeColumnToContents(1);
+  myTreeWidget->sortByColumn(0, Qt::AscendingOrder);
 }
 
 //=================================================================================
-// function : buildTree()
+// function : createItem()
 // purpose  :
 //=================================================================================
 QTreeWidgetItem* GEOMToolsGUI_PublishDlg::createItem(QTreeWidgetItem* theParent, Pair theAttributes, bool isCheckable) {
   QStringList aList;
-  aList<<theAttributes.second<<theAttributes.first;
+  aList<<theAttributes.second<<theAttributes.first<<"";
   QTreeWidgetItem* anItem = new QTreeWidgetItem(aList);
   
   if(isCheckable)
@@ -176,13 +217,14 @@ QTreeWidgetItem* GEOMToolsGUI_PublishDlg::createItem(QTreeWidgetItem* theParent,
     myTreeWidget->addTopLevelItem(anItem);
 
   myEntryToItem.insert(theAttributes.first, anItem);
-  
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+  anItem->setIcon( 2, QIcon( resMgr->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_INVISIBLE" ) ) ) );
   anItem->setExpanded(true);
   return anItem;
 }
 
 //=================================================================================
-// function : buildTree()
+// function : findParentItem()
 // purpose  :
 //=================================================================================
 QTreeWidgetItem* GEOMToolsGUI_PublishDlg::findParentItem(_PTR(Study) theStudy, SalomeApp_DataObject* theObject, BufferedList& theList ) {
@@ -298,6 +340,13 @@ void GEOMToolsGUI_PublishDlg::clickOnApply() {
           item->setData(0,Qt::CheckStateRole,QVariant());
         }
       }
+      // show references if any
+      std::vector< _PTR(SObject) > vso = aStudy->FindDependances(SO);
+      for ( int i = 0; i < vso.size(); i++ ) {
+       _PTR(SObject) refObj = vso[i];
+       aDrw = aBuilder->FindOrCreateAttribute( refObj, "AttributeDrawable" );
+       aDrw->SetDrawable( true );
+      }
     }
   }
   toProcess.clear();
@@ -387,3 +436,36 @@ void GEOMToolsGUI_PublishDlg::getTails(QTreeWidgetItem* theItem, QList<QTreeWidg
   if(theItem->data(0,Qt::UserRole).toBool())
     theList.push_back(theItem);
 }
+
+//=================================================================================
+// function : onItemClicked()
+// purpose  : Called then treeItem clicked
+//=================================================================================
+void GEOMToolsGUI_PublishDlg::onItemClicked(QTreeWidgetItem* theItem, int theColumn) {
+  if ( theColumn == 2 ) {
+    SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+    if ( !app ) return;
+    SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
+    if ( !appStudy ) return;
+    _PTR(Study) aStudy = appStudy->studyDS();
+    if ( !aStudy ) return;
+    QString entry = myEntryToItem.key( theItem );
+    _PTR(SObject) SO ( aStudy->FindObjectID( qPrintable( entry ) ) );
+    if ( !SO ) return;
+    GEOM::GEOM_Object_var aGeomObject = GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( SO ) );
+    if ( CORBA::is_nil( aGeomObject ) ) return;
+    GEOM_Displayer displayer ( appStudy );
+    SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+    Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( aGeomObject->GetStudyEntry(), "GEOM", "" );
+    if ( displayer.IsDisplayed( aGeomObject->GetStudyEntry() ) ) {
+      theItem->setIcon( 2, QIcon( resMgr->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_INVISIBLE" ) ) ) );
+      displayer.Erase( io );
+    }
+    else {
+      theItem->setIcon( 2, QIcon( resMgr->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_VISIBLE" ) ) ) );
+      displayer.Display( io );
+    }
+    displayer.UpdateViewer();
+  }
+}
+