Salome HOME
e0c5ef0ba1b977fe81945d7a963de4ccb3b10ab7
[modules/geom.git] / src / RepairGUI / RepairGUI_InspectObjectDlg.cxx
1 // Copyright (C) 2014-2015  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
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, or (at your option) any later version.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 // internal includes
21 #include "RepairGUI_InspectObjectDlg.h"
22
23 // GEOM includes
24 #include <GEOMBase.h>
25 #include <GEOM_Constants.h>
26 #include <GeometryGUI.h>
27
28 // GUI includes
29 #include <SUIT_Session.h>
30 #include <SUIT_ResourceMgr.h>
31 #include <SUIT_Desktop.h>
32 #include <SUIT_ViewManager.h>
33 #include <SUIT_ViewWindow.h>
34
35 #include <LightApp_SelectionMgr.h>
36
37 #include <SalomeApp_Application.h>
38 #include <SalomeApp_Study.h>
39
40 #include <OCCViewer_ViewModel.h>
41 #include <SVTK_ViewModel.h>
42
43 // OCCT includes
44 #include <TopoDS_Iterator.hxx>
45
46 // Qt includes
47 #include <QGridLayout>
48 #include <QPushButton>
49 #include <QHeaderView>
50 #include <QItemDelegate>
51
52 //=================================================================================
53 // class    : RepairGUI_InspectObjectDlg::TreeWidgetItem
54 // purpose  : class for "Inspect Object" tree item creation
55 //=================================================================================
56 class RepairGUI_InspectObjectDlg::TreeWidgetItem : public QTreeWidgetItem
57 {
58 public:
59   TreeWidgetItem( QTreeWidget*, const QStringList&, const TopoDS_Shape&, const Handle(SALOME_InteractiveObject)&, int = Type );
60   TreeWidgetItem( QTreeWidgetItem*, const QStringList&, const TopoDS_Shape&, const QString&, int = Type );
61   ~TreeWidgetItem();
62
63   bool                             isVisible();
64   void                             setVisible( bool, QIcon& );
65
66   TopoDS_Shape                     getShape() const;
67   Handle(SALOME_InteractiveObject) getIO() const;
68
69 private:
70   bool                             myIsVisible;
71   TopoDS_Shape                     myShape;
72   Handle(SALOME_InteractiveObject) myIO;
73
74 };
75
76 RepairGUI_InspectObjectDlg::TreeWidgetItem::TreeWidgetItem( QTreeWidget* view, const QStringList &strings, const TopoDS_Shape& shape,
77                                                             const Handle(SALOME_InteractiveObject)& io, int type )
78 : QTreeWidgetItem( view, strings, type ),
79   myIsVisible( false ),
80   myShape( shape ),
81   myIO( io )
82 {
83 }
84
85 RepairGUI_InspectObjectDlg::TreeWidgetItem::TreeWidgetItem( QTreeWidgetItem* parent, const QStringList &strings,
86                                                             const TopoDS_Shape& shape, const QString& entry, int type )
87 : QTreeWidgetItem( parent, strings, type ),
88   myIsVisible( false ),
89   myShape( shape )
90 {
91   myIO = new SALOME_InteractiveObject( entry.toAscii(), "GEOM", "TEMP_IO" );
92   setFlags( flags() | Qt::ItemIsEditable );
93 }
94
95 RepairGUI_InspectObjectDlg::TreeWidgetItem::~TreeWidgetItem()
96 {
97 }
98
99 bool RepairGUI_InspectObjectDlg::TreeWidgetItem::isVisible()
100 {
101   return myIsVisible;
102 }
103
104 void RepairGUI_InspectObjectDlg::TreeWidgetItem::setVisible( bool isVisible, QIcon& icon )
105 {
106   myIsVisible = isVisible;
107   setIcon( 1, icon );
108 }
109
110 TopoDS_Shape RepairGUI_InspectObjectDlg::TreeWidgetItem::getShape() const
111 {
112   return myShape;
113 }
114
115 Handle(SALOME_InteractiveObject) RepairGUI_InspectObjectDlg::TreeWidgetItem::getIO() const
116 {
117   return myIO;
118 }
119
120 //=================================================================================
121 // class    : RepairGUI_InspectObjectDlg::Delegate
122 // purpose  : class for "Inspect Object" tree item editing
123 //=================================================================================
124 class RepairGUI_InspectObjectDlg::Delegate : public QItemDelegate
125 {
126 public:
127   Delegate( QObject* = 0 );
128   ~Delegate();
129
130   void   setEditorData( QWidget*, const QModelIndex& ) const;
131   void   setModelData( QWidget*, QAbstractItemModel*, const QModelIndex& ) const;
132   QWidget* createEditor( QWidget*, const QStyleOptionViewItem&, const QModelIndex& ) const;
133 };
134
135 RepairGUI_InspectObjectDlg::Delegate::Delegate( QObject* parent )
136 : QItemDelegate( parent )
137 {
138 }
139
140 RepairGUI_InspectObjectDlg::Delegate::~Delegate()
141 {
142 }
143
144 void RepairGUI_InspectObjectDlg::Delegate::setEditorData( QWidget* editor,
145                                                           const QModelIndex& index ) const
146 {
147   QItemDelegate::setEditorData( editor, index );
148   editor->setProperty( "___name___", editor->property( "text" ) );
149 }
150
151 void RepairGUI_InspectObjectDlg::Delegate::setModelData( QWidget* editor,
152                                                          QAbstractItemModel* model,
153                                                          const QModelIndex& index ) const
154 {
155   QString aNewName = editor->property( "text" ).toString();
156   if ( aNewName.trimmed().isEmpty() )
157     editor->setProperty( "text", editor->property( "___name___" ) );
158   QItemDelegate::setModelData( editor, model, index );
159 }
160
161 QWidget* RepairGUI_InspectObjectDlg::Delegate::createEditor( QWidget* parent,
162                                                              const QStyleOptionViewItem& option,
163                                                              const QModelIndex& index ) const
164 {
165   return index.column() == 1 ? 0 : QItemDelegate::createEditor( parent, option, index );
166 }
167
168 //=================================================================================
169 // class    : RepairGUI_InspectObjectDlg()
170 // purpose  : Constructs a RepairGUI_InspectObjectDlg which is a child of 'parent'.
171 //=================================================================================
172 RepairGUI_InspectObjectDlg::RepairGUI_InspectObjectDlg( SUIT_Desktop* parent )
173 : GEOMBase_Helper( parent ),
174   QDialog( parent ),
175   myTransparency( 0.0 ),
176   myIsSelectAll( false )
177 {
178   QIcon iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
179   myVisible = QIcon( SUIT_Session::session()->resourceMgr()->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_VISIBLE" ) ) );
180   myInvisible = QIcon( SUIT_Session::session()->resourceMgr()->loadPixmap( "SUIT", tr( "ICON_DATAOBJ_INVISIBLE" ) ) );
181
182   setWindowTitle( tr( "GEOM_INSPECT_OBJECT_TITLE" ) );
183   setAttribute( Qt::WA_DeleteOnClose );
184
185   myApp = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
186   myViewWindow = myApp->desktop()->activeWindow();
187
188   QGridLayout* topLayout = new QGridLayout( this );
189   topLayout->setMargin( 11 ); topLayout->setSpacing( 6 );
190
191   /**********************   Inspected Object    **********************/
192
193   QHBoxLayout* mainShapeLayout = new QHBoxLayout();
194
195   QLabel* label = new QLabel( tr( "GEOM_INSPECT_OBJECT_MAIN_SHAPE" ) );
196   QPushButton* selBtn = new QPushButton();
197   selBtn->setIcon( iconSelect );
198   myEditMainShape = new QLineEdit();
199   myEditMainShape->setReadOnly(true);
200
201   mainShapeLayout->addWidget( label );
202   mainShapeLayout->addWidget( selBtn );
203   mainShapeLayout->addWidget( myEditMainShape );
204
205   /**********************   Sub-objects tree    **********************/
206
207   myTreeObjects = new QTreeWidget();
208   myTreeObjects->setColumnCount( 2 );
209   QStringList columnNames;
210   columnNames.append( tr( "GEOM_INSPECT_OBJECT_NAME" ) );
211   columnNames.append("");
212   myTreeObjects->setHeaderLabels( columnNames );
213   QTreeWidgetItem* headerItem = new QTreeWidgetItem( columnNames );
214   myTreeObjects->setHeaderItem( headerItem );
215   myTreeObjects->header()->moveSection( 1, 0 );
216   myTreeObjects->header()->setClickable( true );
217   myTreeObjects->header()->setMovable( false );
218   myTreeObjects->header()->setResizeMode( 1, QHeaderView::ResizeToContents );
219   myTreeObjects->setSelectionMode( QAbstractItemView::ExtendedSelection );
220   myTreeObjects->setEditTriggers( QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed );
221   // set custom item delegate
222   myTreeObjects->setItemDelegate( new Delegate( myTreeObjects ) );
223
224   /**********************        Buttons        **********************/
225
226   QVBoxLayout* buttonsLayout1 = new QVBoxLayout();
227
228   QPushButton* buttonShow = new QPushButton( tr( "GEOM_INSPECT_OBJECT_SHOW" ) );
229   QPushButton* buttonShowOnly = new QPushButton( tr( "GEOM_INSPECT_OBJECT_SHOW_ONLY" ) );
230   QPushButton* buttonHide = new QPushButton( tr( "GEOM_INSPECT_OBJECT_HIDE" ) );
231   QPushButton* buttonPublish = new QPushButton( tr( "GEOM_INSPECT_OBJECT_PUBLISH" ) );
232
233   buttonsLayout1->addWidget( buttonShow );
234   buttonsLayout1->addWidget( buttonShowOnly );
235   buttonsLayout1->addWidget( buttonHide );
236   buttonsLayout1->addStretch();
237   buttonsLayout1->addWidget( buttonPublish );
238   buttonsLayout1->addStretch();
239
240   QHBoxLayout* buttonsLayout2 = new QHBoxLayout();
241
242   QPushButton* buttonClose = new QPushButton( tr( "GEOM_BUT_CLOSE" ) );
243   QPushButton* buttonHelp = new QPushButton( tr( "GEOM_BUT_HELP" ) );
244
245   buttonsLayout2->addWidget( buttonClose );
246   buttonsLayout2->addStretch();
247   buttonsLayout2->addWidget( buttonHelp );
248
249   topLayout->addLayout( mainShapeLayout, 0, 0 );
250   topLayout->addWidget( myTreeObjects, 1, 0 );
251   topLayout->addLayout( buttonsLayout1, 0, 1, 2, 1 );
252   topLayout->addLayout( buttonsLayout2, 2, 0, 1, 2 );
253
254   // Signals and slots connections
255
256   connect( selBtn, SIGNAL( clicked() ), this, SLOT( onEditMainShape() ) );
257
258   connect( myTreeObjects, SIGNAL( itemClicked( QTreeWidgetItem*, int ) ),
259            this, SLOT( onItemClicked( QTreeWidgetItem*, int ) ) );
260   connect( myTreeObjects, SIGNAL( itemChanged( QTreeWidgetItem*, int ) ),
261            this, SLOT( onItemChanged( QTreeWidgetItem*, int ) ) );
262   connect( myTreeObjects, SIGNAL( itemExpanded ( QTreeWidgetItem* ) ),
263            this, SLOT( onItemExpanded( QTreeWidgetItem* ) ) );
264   connect( myTreeObjects, SIGNAL( itemSelectionChanged() ),
265            this, SLOT( onItemSelectionChanged() ) );
266
267   connect( myTreeObjects->header(), SIGNAL( sectionClicked( int ) ), this, SLOT( onHeaderClicked( int ) ) );
268
269   connect( buttonShow,     SIGNAL( clicked() ), this, SLOT( clickOnShow() ) );
270   connect( buttonShowOnly, SIGNAL( clicked() ), this, SLOT( clickOnShowOnly() ) );
271   connect( buttonHide,     SIGNAL( clicked() ), this, SLOT( clickOnHide() ) );
272   connect( buttonPublish,  SIGNAL( clicked() ), this, SLOT( clickOnPublish() ) );
273
274   connect( buttonClose,    SIGNAL( clicked() ), this, SLOT( reject() ) );
275   connect( buttonHelp,     SIGNAL( clicked() ), this, SLOT( clickOnHelp() ) );
276
277   connect( myApp->selectionMgr(), SIGNAL( currentSelectionChanged() ),
278            this, SLOT( onViewSelectionChanged() ) );
279
280   connect( myApp->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
281            this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
282
283   if ( myViewWindow )
284     connect( myViewWindow->getViewManager(), SIGNAL( deleteView( SUIT_ViewWindow* ) ),
285              this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
286
287   init();
288 }
289
290 RepairGUI_InspectObjectDlg::~RepairGUI_InspectObjectDlg()
291 {
292   if ( myViewWindow )
293     onEditMainShape();
294   // restore initial parameters for viewer
295   getDisplayer()->UnsetColor();
296   getDisplayer()->UnsetWidth();
297   // no need to delete child widgets, Qt does it all for us
298 }
299
300 //=================================================================================
301 // function : init()
302 // purpose  : initialize dialog data
303 //=================================================================================
304 void RepairGUI_InspectObjectDlg::init()
305 {
306   //get shape from selection
307   SALOME_ListIO selected;
308   myApp->selectionMgr()->selectedObjects(selected);
309
310   if ( selected.Extent() != 1 )
311     return;
312
313   if ( !myViewWindow ) {
314     SUIT_ViewManager* occVm = myApp->getViewManager( OCCViewer_Viewer::Type(), true );
315     myViewWindow = occVm->getActiveView();
316     connect( occVm, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
317              this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
318   }
319
320   TopoDS_Shape aShape = GEOMBase::GetTopoFromSelection( selected );
321   if ( aShape.IsNull() )
322     return;
323
324   Handle(SALOME_InteractiveObject) anIO = selected.First();
325   GEOM::GEOM_Object_var anObject = GEOMBase::ConvertIOinGEOMObject( anIO );
326   QString aName = anObject->GetName();
327   CORBA::String_var anEntry = anObject->GetStudyEntry();
328
329   myEditMainShape->setText( aName );
330   myEditMainShape->setEnabled( false );
331
332   // remember initial transparency value
333   SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
334   QVariant v = aStudy->getObjectProperty( myViewWindow->getViewManager()->getGlobalId(),
335                                           QString( anEntry.in() ),
336                                           GEOM::propertyName( GEOM::Transparency ), myTransparency );
337   if ( v.canConvert( QVariant::Double ) )
338     myTransparency = v.toDouble();
339
340   TreeWidgetItem* anItem = new TreeWidgetItem( myTreeObjects, QStringList() << aName, aShape, anIO );
341   if ( getDisplayer()->IsDisplayed( anEntry.in() ) )
342     anItem->setVisible( true, myVisible );
343   else
344     anItem->setVisible( false, myInvisible );
345
346   setMainObjectTransparency( 0.5 );
347
348   // add sub-objects in the tree
349   addSubObjects( anItem );
350
351   // check icon for tree header
352   checkVisibleIcon();
353 }
354
355 //=================================================================================
356 // function : checkVisibleIcon()
357 // purpose  : set visible or invisible icon in the header of tree
358 //=================================================================================
359 void RepairGUI_InspectObjectDlg::checkVisibleIcon()
360 {
361   bool isInvisible = false;
362   QTreeWidgetItemIterator it( myTreeObjects );
363   while ( *it ) {
364     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
365     if ( !anItem->isVisible() )
366       isInvisible = true;
367     ++it;
368   }
369
370   if ( isInvisible ) {
371     myTreeObjects->headerItem()->setIcon( 1, myInvisible );
372     myIsSelectAll = false;
373   }
374   else {
375     myTreeObjects->headerItem()->setIcon( 1, myVisible );
376     myIsSelectAll = true;
377   }
378 }
379
380 //=================================================================================
381 // function : addSubObjects()
382 // purpose  : add sub-objects to parent object in the tree
383 //=================================================================================
384 void RepairGUI_InspectObjectDlg::addSubObjects( TreeWidgetItem* theParentItem )
385 {
386   TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
387   TopoDS_Iterator it( theParentItem->getShape() );
388   for ( ; it.More(); it.Next() ) {
389     TopoDS_Shape aSubShape = it.Value();
390     int anIndex = GEOMBase::GetIndex( aSubShape, aMainItem->getShape() );
391     QString anEntry = QString( "TEMP_" ) + aMainItem->getIO()->getEntry() + QString("_%1").arg( anIndex );
392     TreeWidgetItem* anItem = new TreeWidgetItem( theParentItem, QStringList(), aSubShape, anEntry);
393     anItem->setVisible( false, myInvisible );
394     addSubObjects( anItem );
395   }
396 }
397
398 //=================================================================================
399 // function : displayItem()
400 // purpose  : display sub-object of inspected object according its tree item
401 //=================================================================================
402 void RepairGUI_InspectObjectDlg::displayItem( TreeWidgetItem* theItem )
403 {
404   GEOM_Displayer* aDisplayer = getDisplayer();
405   if ( theItem == myTreeObjects->topLevelItem(0) ) {
406     aDisplayer->UnsetColor();
407     aDisplayer->UnsetWidth();
408   }
409   else if ( aDisplayer->GetColor() != Quantity_NOC_VIOLET && aDisplayer->GetWidth() != 2.0 ) {
410     aDisplayer->SetColor( Quantity_NOC_VIOLET );
411     aDisplayer->SetWidth( 2.0 );
412   }
413
414   SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation( theItem->getShape(), theItem->getIO()->getEntry(),
415                                                             GEOM_Displayer::GetActiveView() );
416   if ( aPrs )
417     displayPreview( aPrs, true, false );
418 }
419
420 //=================================================================================
421 // function : setItemDisplayStatus()
422 // purpose  : set visible or invisible status for the same items in the tree
423 //=================================================================================
424 void RepairGUI_InspectObjectDlg::setItemDisplayStatus( TreeWidgetItem* theItem, bool theIsVisible )
425 {
426   QTreeWidgetItemIterator it( myTreeObjects );
427   while (*it) {
428     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
429     if ( anItem->getShape().IsSame( theItem->getShape() ) )
430       anItem->setVisible( theIsVisible, theIsVisible ? myVisible : myInvisible );
431     ++it;
432   }
433 }
434
435 //=================================================================================
436 // function : setMainObjectTransparency()
437 // purpose  : set transparency for the inspected object
438 //=================================================================================
439 void RepairGUI_InspectObjectDlg::setMainObjectTransparency( double theTransparency )
440 {
441   SUIT_ViewManager* aViewMan = myViewWindow->getViewManager();
442   SALOME_View* aView = dynamic_cast<SALOME_View*>( aViewMan->getViewModel() );
443   SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
444
445   TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
446   aStudy->setObjectProperty( myViewWindow->getViewManager()->getGlobalId(),
447                              QString( aMainItem->getIO()->getEntry() ),
448                              GEOM::propertyName( GEOM::Transparency ), theTransparency );
449
450   if ( aView->isVisible( aMainItem->getIO() ) )
451     getDisplayer()->Redisplay( aMainItem->getIO(), true, aView );
452 }
453
454 //=================================================================================
455 // function : restoreParam()
456 // purpose  : restore initial parameters of the dialog and the viewer
457 //=================================================================================
458 void RepairGUI_InspectObjectDlg::restoreParam()
459 {
460   SUIT_ViewManager* aViewMan = myViewWindow->getViewManager();
461   SALOME_View* aView = dynamic_cast<SALOME_View*>( aViewMan->getViewModel() );
462   GEOM_Displayer* aDisplayer = getDisplayer();
463   // restore initial parameters for viewer
464   aDisplayer->UnsetColor();
465   aDisplayer->UnsetWidth();
466
467   // restore transparency of main object
468   setMainObjectTransparency( myTransparency );
469
470   // erase sub-shapes
471   TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
472   QTreeWidgetItemIterator it( myTreeObjects );
473   while (*it) {
474     if ( *it != aMainItem ) {
475       TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
476       aDisplayer->Erase( anItem->getIO(), false, false, aView );
477       anItem->setVisible( false, myInvisible );
478     }
479     ++it;
480   }
481 }
482
483 //=================================================================================
484 // function : onEditMainShape()
485 // purpose  : called when selection button was clicked
486 //=================================================================================
487 void RepairGUI_InspectObjectDlg::onEditMainShape()
488 {
489   if ( myEditMainShape->text().isEmpty() || !myViewWindow )
490     return;
491
492   restoreParam();
493
494   // restore initial parameters for dialog box
495   myEditMainShape->setEnabled( true );
496   myEditMainShape->setText("");
497   myEditMainShape->setFocus();
498   myTreeObjects->clear();
499 }
500
501 //=================================================================================
502 // function : onItemClicked()
503 // purpose  : called when tree item was clicked
504 //=================================================================================
505 void RepairGUI_InspectObjectDlg::onItemClicked( QTreeWidgetItem* theItem, int theColumn )
506 {
507   if ( theColumn!= 1 || !( theItem->flags() & Qt::ItemIsSelectable ) || !myViewWindow )
508     return;
509
510   GEOM_Displayer* aDisplayer = getDisplayer();
511
512   TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( theItem );
513
514   if ( anItem->isVisible() ) {
515     aDisplayer->Erase( anItem->getIO(), false, true );
516     setItemDisplayStatus( anItem, false );
517   }
518   else {
519     displayItem( anItem );
520     setItemDisplayStatus( anItem, true );
521   }
522   aDisplayer->UpdateViewer();
523   checkVisibleIcon();
524 }
525
526 //=================================================================================
527 // function : onItemChanged()
528 // purpose  : called when tree item was changed
529 //=================================================================================
530 void RepairGUI_InspectObjectDlg::onItemChanged( QTreeWidgetItem* theItem, int theColumn )
531 {
532   if ( theColumn!= 0 || !( theItem->flags() & Qt::ItemIsEditable ) )
533     return;
534
535   // rename the same items in the tree
536   QTreeWidgetItemIterator it( myTreeObjects );
537   while ( *it ) {
538     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
539     if ( anItem->getShape().IsSame( dynamic_cast<TreeWidgetItem*>( theItem )->getShape() ) )
540       anItem->setText( 0, theItem->text(0) );
541     ++it;
542   }
543 }
544
545 //=================================================================================
546 // function : onItemExpanded()
547 // purpose  : called when tree item was expanded
548 //=================================================================================
549 void RepairGUI_InspectObjectDlg::onItemExpanded( QTreeWidgetItem* theItem )
550 {
551   TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
552   GEOM::GEOM_Object_var aMainObject = GEOMBase::ConvertIOinGEOMObject( aMainItem->getIO() );
553
554   for ( int i = 0; i < theItem->childCount(); i++ ) {
555     TreeWidgetItem* aSubItem = dynamic_cast<TreeWidgetItem*>( theItem->child(i) );
556     int anIndex = GEOMBase::GetIndex( aSubItem->getShape(), aMainItem->getShape() );
557     if ( aSubItem->text(0).isEmpty() ) {
558       char* aName = aMainObject->GetSubShapeName( anIndex );
559       if ( !QString( aName ).isEmpty() )
560         aSubItem->setText( 0, QString( aName ) );
561       else
562         aSubItem->setText( 0, QString("%1_%2").arg( GEOMBase::TypeName( aSubItem->getShape().ShapeType(), true ) ).arg( anIndex ) );
563     }
564   }
565 }
566
567 //=================================================================================
568 // function : onItemSelectionChanged()
569 // purpose  : called when tree item was selected
570 //=================================================================================
571 void RepairGUI_InspectObjectDlg::onItemSelectionChanged()
572 {
573   if ( !myViewWindow )
574     return;
575
576   QList<QTreeWidgetItem*> listItem = myTreeObjects->selectedItems();
577   SALOME_ListIO aSelected;
578   for ( int i = 0; i < listItem.size(); i++ ) {
579     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( listItem.at(i) );
580     aSelected.Append( anItem->getIO() );
581   }
582   myApp->selectionMgr()->setSelectedObjects( aSelected );
583 }
584
585 //=================================================================================
586 // function : onHeaderClicked()
587 // purpose  : called when header item of tree was clicked
588 //=================================================================================
589 void RepairGUI_InspectObjectDlg::onHeaderClicked( int theColumn )
590 {
591   if ( theColumn != 1 || !myViewWindow )
592     return;
593
594   GEOM_Displayer* aDisplayer = getDisplayer();
595
596   if ( myIsSelectAll ) {
597     myIsSelectAll = false;
598     myTreeObjects->headerItem()->setIcon( 1, myInvisible );
599     SALOME_ListIO aListOfIO;
600     QTreeWidgetItemIterator it( myTreeObjects );
601     while ( *it ) {
602       TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
603       if ( ( anItem->flags() & Qt::ItemIsSelectable ) && anItem->isVisible() ) {
604         aListOfIO.Append( anItem->getIO() );
605         anItem->setVisible( false, myInvisible );
606       }
607       ++it;
608     }
609     aDisplayer->Erase( aListOfIO );
610   }
611   else {
612     myIsSelectAll = true;
613     myTreeObjects->headerItem()->setIcon( 1, myVisible );
614     QTreeWidgetItemIterator it( myTreeObjects );
615     while ( *it ) {
616       TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
617       if ( ( anItem->flags() & Qt::ItemIsSelectable ) && !anItem->isVisible() ) {
618         displayItem( anItem );
619         anItem->setVisible( true, myVisible );
620       }
621       ++it;
622     }
623   }
624
625   aDisplayer->UpdateViewer();
626 }
627
628 //=================================================================================
629 // function : onViewSelectionChanged()
630 // purpose  : called when selection of object browser was changed
631 //=================================================================================
632 void RepairGUI_InspectObjectDlg::onViewSelectionChanged()
633 {
634   if ( myEditMainShape->isEnabled() )
635     init();
636 }
637
638 //=================================================================================
639 // function : onWindowActivated()
640 // purpose  : called when other window was activated
641 //=================================================================================
642 void RepairGUI_InspectObjectDlg::onWindowActivated( SUIT_ViewWindow* theViewWindow )
643 {
644   if ( myViewWindow )
645     restoreParam();
646
647   connect( theViewWindow->getViewManager(), SIGNAL( deleteView( SUIT_ViewWindow* ) ),
648            this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
649
650   if ( theViewWindow->getViewManager()->getType() != OCCViewer_Viewer::Type() &&
651        theViewWindow->getViewManager()->getType() != SVTK_Viewer::Type() ) {
652     myViewWindow = 0;
653     return;
654   }
655   myViewWindow = theViewWindow;
656
657   if ( myTreeObjects->topLevelItemCount() > 0 ) {
658     setMainObjectTransparency( 0.5 );
659     TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
660     if ( getDisplayer()->IsDisplayed( aMainItem->getIO()->getEntry() ) )
661       aMainItem->setVisible( true, myVisible );
662     else
663       aMainItem->setVisible( false, myInvisible );
664   }
665   checkVisibleIcon();
666 }
667
668 //=================================================================================
669 // function : onCloseView()
670 // purpose  : called when last view was closed
671 //=================================================================================
672 void RepairGUI_InspectObjectDlg::onCloseView( SUIT_ViewWindow* )
673 {
674   if ( myApp->desktop()->windows().size() == 0 ) {
675     restoreParam();
676     myViewWindow = 0;
677   }
678 }
679
680 //=================================================================================
681 // function : clickOnShow()
682 // purpose  : called when "Show selected" button was clicked
683 //=================================================================================
684 void RepairGUI_InspectObjectDlg::clickOnShow()
685 {
686   if ( !myViewWindow )
687     return;
688
689   QList<QTreeWidgetItem*> listItem = myTreeObjects->selectedItems();
690   for ( int i = 0; i < listItem.size(); i++ ) {
691     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( listItem.at(i) );
692     if ( !anItem->isVisible() ) {
693       displayItem( anItem );
694       setItemDisplayStatus( anItem, true );
695     }
696   }
697   getDisplayer()->UpdateViewer();
698   checkVisibleIcon();
699 }
700
701 //=================================================================================
702 // function : clickOnShowOnly()
703 // purpose  : called when "Show only selected" button was clicked
704 //=================================================================================
705 void RepairGUI_InspectObjectDlg::clickOnShowOnly()
706 {
707   if ( !myViewWindow )
708     return;
709
710   SALOME_ListIO aListOfIO;
711   QTreeWidgetItemIterator it( myTreeObjects );
712   while ( *it ) {
713     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
714     if ( ( anItem->flags() & Qt::ItemIsSelectable ) && anItem->isVisible() ) {
715       aListOfIO.Append( anItem->getIO() );
716       anItem->setVisible( false, myInvisible );
717     }
718     ++it;
719   }
720   getDisplayer()->Erase( aListOfIO );
721
722   clickOnShow();
723 }
724
725 //=================================================================================
726 // function : clickOnHide()
727 // purpose  : called when "Hide selected" button was clicked
728 //=================================================================================
729 void RepairGUI_InspectObjectDlg::clickOnHide()
730 {
731   if ( !myViewWindow )
732     return;
733
734   QList<QTreeWidgetItem*> listItem = myTreeObjects->selectedItems();
735   for ( int i = 0; i < listItem.size(); i++ ) {
736     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( listItem.at(i) );
737     if ( anItem->isVisible() ) {
738       getDisplayer()->Erase( anItem->getIO(), false, false );
739       setItemDisplayStatus( anItem, false );
740     }
741   }
742   getDisplayer()->UpdateViewer();
743   checkVisibleIcon();
744 }
745
746 //=================================================================================
747 // function : clickOnPublish()
748 // purpose  : called when "Publish selected" button was clicked
749 //=================================================================================
750 void RepairGUI_InspectObjectDlg::clickOnPublish()
751 {
752   _PTR(Study) studyDS = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() )->studyDS();
753
754   // find main object
755   TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
756   GEOM::GEOM_Object_var aMainObject = GEOMBase::ConvertIOinGEOMObject( aMainItem->getIO() );
757
758   // find unique indices of selected objects
759   QList<QTreeWidgetItem*> selectedItems = myTreeObjects->selectedItems();
760   QMap< int, QString > anIndices;
761   GEOM::ListOfLong_var anArray = new GEOM::ListOfLong;
762   anArray->length( selectedItems.size() );
763   int j = 0;
764   for ( int i = 0; i < selectedItems.size(); i++ ) {
765     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( selectedItems.at(i) );
766     int anIndex = GEOMBase::GetIndex( anItem->getShape(), aMainItem->getShape() );
767     if ( anIndices.find( anIndex ) == anIndices.end() &&
768         anItem != aMainItem ) {
769       anIndices[ anIndex ] = anItem->text(0);
770       anArray[j++] = anIndex;
771     }
772   }
773   anArray->length(j);
774
775   // get selected sub-shapes
776   GEOM::GEOM_IShapesOperations_var anOper = getGeomEngine()->GetIShapesOperations( getStudyId() );
777   GEOM::ListOfGO_var aList = anOper->MakeSubShapes( aMainObject, anArray );
778
779   // publish sub-shapes
780   for ( int i = 0; i < aList->length(); i++ )
781     GeometryGUI::GetGeomGen()->AddInStudy( GeometryGUI::ClientStudyToStudy( studyDS ), aList[i],
782                                            anIndices.values().at(i).toStdString().c_str(), aMainObject );
783
784   updateObjBrowser();
785 }
786
787 //=================================================================================
788 // function : clickOnHelp()
789 // purpose  : called when Help button was clicked to open a help page
790 //=================================================================================
791 void RepairGUI_InspectObjectDlg::clickOnHelp()
792 {
793   myApp->onHelpContextModule( "GEOM", "inspect_object_operation_page.html" );
794 }