0029018: Documentation - Provide user guide for Qt browser
[occt.git] / tools / VInspector / VInspector_Window.cxx
1 // Created on: 2017-06-16
2 // Created by: Natalia ERMOLAEVA
3 // Copyright (c) 2017 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement. 
15
16 #include <inspector/VInspector_Window.hxx>
17
18 #include <AIS_Shape.hxx>
19
20 #include <inspector/TreeModel_MessageDialog.hxx>
21
22 #include <inspector/VInspector_ItemPresentableObject.hxx>
23 #include <inspector/VInspector_ToolBar.hxx>
24 #include <inspector/VInspector_Tools.hxx>
25 #include <inspector/VInspector_ViewModel.hxx>
26 #include <inspector/VInspector_ViewModelHistory.hxx>
27 #include <inspector/VInspector_CallBack.hxx>
28 #include <inspector/VInspector_Communicator.hxx>
29 #include <inspector/VInspector_ItemEntityOwner.hxx>
30 #include <inspector/VInspector_ItemPresentableObject.hxx>
31 #include <inspector/VInspector_ToolBar.hxx>
32 #include <inspector/VInspector_Tools.hxx>
33 #include <inspector/VInspector_ViewModel.hxx>
34 #include <inspector/VInspector_ViewModelHistory.hxx>
35
36 #include <inspector/View_Widget.hxx>
37 #include <inspector/View_Window.hxx>
38
39 #include <QApplication>
40 #include <QDockWidget>
41 #include <QHeaderView>
42 #include <QGridLayout>
43 #include <QItemSelectionModel>
44 #include <QMainWindow>
45 #include <QMenu>
46 #include <QMessageBox>
47 #include <QToolButton>
48 #include <QTreeView>
49 #include <QWidget>
50
51 const int FIRST_COLUMN_WIDTH = 230;
52
53 const int COLUMN_1_WIDTH = 30;
54 const int COLUMN_2_WIDTH = 70;
55 const int COLUMN_3_WIDTH = 70;
56 const int COLUMN_4_WIDTH = 75;
57 const int COLUMN_5_WIDTH = 120;
58 const int COLUMN_6_WIDTH = 65;
59 const int COLUMN_7_WIDTH = 70;
60
61 const int HISTORY_AIS_NAME_COLUMN_WIDTH = 140;
62
63 const int VINSPECTOR_DEFAULT_WIDTH  = 1250;
64 const int VINSPECTOR_DEFAULT_HEIGHT = 800;
65
66 const int VINSPECTOR_DEFAULT_POSITION_X = 200;
67 const int VINSPECTOR_DEFAULT_POSITION_Y = 60;
68
69 const int VINSPECTOR_DEFAULT_VIEW_WIDTH = 400;
70 const int VINSPECTOR_DEFAULT_VIEW_HEIGHT = 1000;
71
72 const int VINSPECTOR_DEFAULT_HISTORY_VIEW_WIDTH = 400;
73 const int VINSPECTOR_DEFAULT_HISTORY_VIEW_HEIGHT = 50;
74
75 const int VINSPECTOR_DEFAULT_VIEW_POSITION_X = 200 + 900 + 100; // TINSPECTOR_DEFAULT_POSITION_X + TINSPECTOR_DEFAULT_WIDTH + 100
76 const int VINSPECTOR_DEFAULT_VIEW_POSITION_Y = 60; // TINSPECTOR_DEFAULT_POSITION_Y + 50
77
78 //! \class Vinspector_TreeView
79 //! Extended tree view control with possibility to set predefined size.
80 class Vinspector_TreeView : public QTreeView
81 {
82 public:
83   //! Constructor
84   Vinspector_TreeView (QWidget* theParent) : QTreeView (theParent), myDefaultWidth (-1), myDefaultHeight (-1) {}
85
86   //! Destructor
87   virtual ~Vinspector_TreeView() {}
88
89   //! Sets default size of control, that is used by the first control show
90   //! \param theDefaultWidth the width value
91   //! \param theDefaultHeight the height value
92   void SetPredefinedSize (int theDefaultWidth, int theDefaultHeight);
93
94   //! Returns predefined size if both values are positive, otherwise parent size hint
95   virtual QSize sizeHint() const Standard_OVERRIDE;
96
97 private:
98
99   int myDefaultWidth; //!< default width, -1 if it should not be used
100   int myDefaultHeight; //!< default height, -1 if it should not be used
101 };
102
103 // =======================================================================
104 // function : SetPredefinedSize
105 // purpose :
106 // =======================================================================
107 void Vinspector_TreeView::SetPredefinedSize (int theDefaultWidth, int theDefaultHeight)
108 {
109   myDefaultWidth = theDefaultWidth;
110   myDefaultHeight = theDefaultHeight;
111 }
112
113 // =======================================================================
114 // function : sizeHint
115 // purpose :
116 // =======================================================================
117 QSize Vinspector_TreeView::sizeHint() const
118 {
119   if (myDefaultWidth > 0 && myDefaultHeight > 0)
120     return QSize (myDefaultWidth, myDefaultHeight);
121   return QTreeView::sizeHint();
122 }
123
124 // =======================================================================
125 // function : Constructor
126 // purpose :
127 // =======================================================================
128 VInspector_Window::VInspector_Window()
129 : myParent (0), myExportToShapeViewDialog (0), myViewWindow (0)
130 {
131   myMainWindow = new QMainWindow (0);
132
133   QWidget* aCentralWidget = new QWidget (myMainWindow);
134   QGridLayout* aParentLay = new QGridLayout (aCentralWidget);
135   aParentLay->setContentsMargins (0, 0, 0, 0);
136   aParentLay->setSpacing(0);
137
138   // tool bar: on the bottom of the window
139   myToolBar = new VInspector_ToolBar(aCentralWidget);
140   connect (myToolBar, SIGNAL (actionClicked (int)), this, SLOT (onToolBarActionClicked (int)));
141   aParentLay->addWidget (myToolBar->GetControl(), 0, 0);
142
143   // tree view
144   myTreeView = new QTreeView (aCentralWidget);
145   myTreeView->setSelectionBehavior (QAbstractItemView::SelectRows);
146   myTreeView->setSelectionMode (QAbstractItemView::ExtendedSelection);
147   myTreeView->header()->setStretchLastSection (true);
148   myTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
149   connect (myTreeView, SIGNAL(customContextMenuRequested(const QPoint&)),
150            this, SLOT (onTreeViewContextMenuRequested(const QPoint&)));
151   aParentLay->addWidget(myTreeView, 1, 0);
152   aParentLay->setRowStretch (1, 1);
153   myMainWindow->setCentralWidget (aCentralWidget);
154
155   // history view in bottom dock widget
156   myHistoryView = new Vinspector_TreeView (aCentralWidget);
157   myHistoryView->setSelectionBehavior (QAbstractItemView::SelectRows);
158   ((Vinspector_TreeView*)myHistoryView)->SetPredefinedSize (VINSPECTOR_DEFAULT_HISTORY_VIEW_WIDTH,
159                                                             VINSPECTOR_DEFAULT_HISTORY_VIEW_HEIGHT);
160
161   myHistoryView->setSelectionMode (QAbstractItemView::ExtendedSelection);
162   VInspector_ViewModelHistory* aHistoryModel = new VInspector_ViewModelHistory (myHistoryView);
163   myHistoryView->setModel (aHistoryModel);
164
165   QItemSelectionModel* aSelectionModel = new QItemSelectionModel (myHistoryView->model());
166   myHistoryView->setSelectionModel (aSelectionModel);
167   connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
168            this, SLOT (onHistoryViewSelectionChanged (const QItemSelection&, const QItemSelection&)));
169
170   myHistoryView->setColumnWidth (0, FIRST_COLUMN_WIDTH);
171   myHistoryView->setColumnWidth (1, COLUMN_1_WIDTH);
172   myHistoryView->setColumnWidth (2, COLUMN_2_WIDTH);
173   myHistoryView->setColumnWidth (3, COLUMN_3_WIDTH);
174   myHistoryView->setColumnWidth (4, HISTORY_AIS_NAME_COLUMN_WIDTH);
175
176   QDockWidget* aHistoryDockWidget = new QDockWidget (tr ("HistoryView"), myMainWindow);
177   aHistoryDockWidget->setTitleBarWidget (new QWidget(myMainWindow));
178   aHistoryDockWidget->setWidget (myHistoryView);
179   myMainWindow->addDockWidget (Qt::BottomDockWidgetArea, aHistoryDockWidget);
180
181   myMainWindow->resize (450, 800);
182   myMainWindow->move (60, 20);
183
184   myMainWindow->resize (VINSPECTOR_DEFAULT_WIDTH, VINSPECTOR_DEFAULT_HEIGHT);
185   myMainWindow->move (VINSPECTOR_DEFAULT_POSITION_X, VINSPECTOR_DEFAULT_POSITION_Y);
186 }
187
188 // =======================================================================
189 // function : SetParent
190 // purpose :
191 // =======================================================================
192 void VInspector_Window::SetParent (void* theParent)
193 {
194   myParent = (QWidget*)theParent;
195   if (!myParent)
196     return;
197
198   QLayout* aLayout = myParent->layout();
199   if (aLayout)
200     aLayout->addWidget (GetMainWindow());
201 }
202
203 // =======================================================================
204 // function : UpdateContent
205 // purpose :
206 // =======================================================================
207 void VInspector_Window::UpdateContent()
208 {
209   TCollection_AsciiString aName = "TKVInspector";
210
211   if (myParameters->FindParameters (aName))
212     Init(myParameters->Parameters (aName));
213   if (myParameters->FindFileNames(aName))
214   {
215     for (NCollection_List<TCollection_AsciiString>::Iterator aFileNamesIt(myParameters->FileNames(aName));
216          aFileNamesIt.More(); aFileNamesIt.Next())
217       OpenFile (aFileNamesIt.Value());
218
219     NCollection_List<TCollection_AsciiString> aNames;
220     myParameters->SetFileNames(aName, aNames);
221   }
222
223   // make AIS_InteractiveObject selected selected if exist in select parameters
224   NCollection_List<Handle(Standard_Transient)> anObjects;
225   VInspector_ViewModel* aViewModel = dynamic_cast<VInspector_ViewModel*>(myTreeView->model());
226   if (aViewModel && myParameters->GetSelectedObjects(aName, anObjects))
227   {
228     QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
229     aSelectionModel->clear();
230     for (NCollection_List<Handle(Standard_Transient)>::Iterator aParamsIt (anObjects);
231          aParamsIt.More(); aParamsIt.Next())
232     {
233       Handle(Standard_Transient) anObject = aParamsIt.Value();
234       Handle(AIS_InteractiveObject) aPresentation = Handle(AIS_InteractiveObject)::DownCast (anObject);
235       if (aPresentation.IsNull())
236         continue;
237
238       QModelIndex aPresentationIndex = aViewModel->FindIndex (aPresentation);
239       if (!aPresentationIndex.isValid())
240         continue;
241        aSelectionModel->select (aPresentationIndex, QItemSelectionModel::Select);
242        myTreeView->scrollTo (aPresentationIndex);
243     }
244   }
245 }
246
247 // =======================================================================
248 // function : Init
249 // purpose :
250 // =======================================================================
251 void VInspector_Window::Init (const NCollection_List<Handle(Standard_Transient)>& theParameters)
252 {
253   Handle(AIS_InteractiveContext) aContext;
254   Handle(VInspector_CallBack) aCallBack;
255
256   for (NCollection_List<Handle(Standard_Transient)>::Iterator aParamsIt (theParameters); aParamsIt.More(); aParamsIt.Next())
257   {
258     Handle(Standard_Transient) anObject = aParamsIt.Value();
259     if (aContext.IsNull())
260       aContext = Handle(AIS_InteractiveContext)::DownCast (anObject);
261
262     if (aCallBack.IsNull())
263       aCallBack = Handle(VInspector_CallBack)::DownCast (anObject);
264   }
265   if (aContext.IsNull())
266     return;
267   SetContext (aContext);
268
269   if (!aCallBack.IsNull())
270   {
271     myCallBack = aCallBack;
272     VInspector_ViewModelHistory* aHistoryModel = dynamic_cast<VInspector_ViewModelHistory*>
273                                                                     (myHistoryView->model());
274     myCallBack->SetContext (aContext);
275     myCallBack->SetHistoryModel(aHistoryModel);
276   }
277 }
278
279 // =======================================================================
280 // function : SetContext
281 // purpose :
282 // =======================================================================
283 void VInspector_Window::SetContext (const Handle(AIS_InteractiveContext)& theContext)
284 {
285   VInspector_ViewModel* aViewModel = new VInspector_ViewModel (myTreeView);
286   aViewModel->SetContext (theContext);
287   myTreeView->setModel (aViewModel);
288
289   myTreeView->setExpanded (aViewModel->index (0, 0), true);
290   myTreeView->setColumnWidth (0, FIRST_COLUMN_WIDTH);
291
292   if (!myCallBack.IsNull())
293     myCallBack->SetContext (theContext);
294
295   QItemSelectionModel* aSelModel = new QItemSelectionModel (aViewModel, myTreeView);
296   myTreeView->setSelectionModel (aSelModel);
297   connect (aSelModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
298            this, SLOT (onSelectionChanged (const QItemSelection&, const QItemSelection&)));
299
300   myTreeView->setColumnWidth (1, COLUMN_1_WIDTH);
301   myTreeView->setColumnWidth (2, COLUMN_2_WIDTH);
302   myTreeView->setColumnWidth (3, COLUMN_3_WIDTH);
303   myTreeView->setColumnWidth (4, COLUMN_4_WIDTH);
304   myTreeView->setColumnWidth (5, COLUMN_5_WIDTH);
305   myTreeView->setColumnWidth (6, COLUMN_6_WIDTH);
306   myTreeView->setColumnWidth (7, COLUMN_7_WIDTH);
307 }
308
309 // =======================================================================
310 // function : OpenFile
311 // purpose :
312 // =======================================================================
313 void VInspector_Window::OpenFile(const TCollection_AsciiString& theFileName)
314 {
315   VInspector_ViewModel* aViewModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
316   if (!aViewModel)
317   {
318     Handle(AIS_InteractiveContext) aContext = createView();
319     SetContext (aContext);
320     aViewModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
321   }
322   if (!aViewModel)
323     return;
324
325   Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext();
326   if (!aContext)
327     return;
328
329   TopoDS_Shape aShape = VInspector_Tools::ReadShape (theFileName);
330   if (aShape.IsNull())
331     return;
332
333   Handle(AIS_Shape) aPresentation = new AIS_Shape (aShape);
334   aContext->Display (aPresentation, false);
335   aContext->Load (aPresentation, -1/*selection mode*/, true);
336   aContext->UpdateCurrentViewer();
337
338   UpdateTreeModel();
339   myTreeView->setExpanded (aViewModel->index (0, 0), true);
340 }
341
342 // =======================================================================
343 // function : onTreeViewContextMenuRequested
344 // purpose :
345 // =======================================================================
346 void VInspector_Window::onTreeViewContextMenuRequested(const QPoint& thePosition)
347 {
348   QMenu* aMenu = new QMenu (GetMainWindow());
349   aMenu->addAction (createAction (tr ("Export to ShapeView"), SLOT(onExportToShapeView())));
350   aMenu->addAction (createAction (tr ("Show"), SLOT(onShow())));
351   aMenu->addAction (createAction (tr ("Hide"), SLOT(onHide())));
352   QPoint aPoint = myTreeView->mapToGlobal (thePosition);
353   aMenu->exec(aPoint);
354 }
355
356 // =======================================================================
357 // function : onToolBarActionClicked
358 // purpose :
359 // =======================================================================
360 void VInspector_Window::onToolBarActionClicked (const int theActionId)
361 {
362   VInspector_ViewModel* aViewModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
363   if (!aViewModel)
364     return;
365
366   switch (theActionId)
367   {
368     case VInspector_ToolActionType_UpdateId:
369     {
370       UpdateTreeModel();
371       break;
372     }
373     case VInspector_ToolActionType_SelectPresentationsId:
374     {
375       bool isChecked = myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked();
376       NCollection_List<Handle(AIS_InteractiveObject)> aPresentationsForViewer;
377       if (isChecked)
378         aPresentationsForViewer = VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel());
379       Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext();
380       VInspector_Tools::AddOrRemovePresentations(aContext, aPresentationsForViewer);
381       UpdateTreeModel();
382       break;
383     }
384     case VInspector_ToolActionType_SelectOwnersId:
385     {
386       NCollection_List<Handle(SelectBasics_EntityOwner)> anOwnersForViewer;
387       if (myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked())
388         VInspector_ViewModel::GetSelectedOwners(myTreeView->selectionModel(), anOwnersForViewer);
389       VInspector_Tools::AddOrRemoveSelectedShapes(aViewModel->GetContext(), anOwnersForViewer);
390       UpdateTreeModel();
391       break;
392     }
393     default:
394       break;
395   }
396 }
397
398 // =======================================================================
399 // function : onSelectionChanged
400 // purpose :
401 // =======================================================================
402 void VInspector_Window::onSelectionChanged (const QItemSelection&,
403                                             const QItemSelection&)
404 {
405   QApplication::setOverrideCursor (Qt::WaitCursor);
406
407   if (myToolBar->GetToolButton(VInspector_ToolActionType_SelectPresentationsId)->isChecked())
408     onToolBarActionClicked(VInspector_ToolActionType_SelectPresentationsId);
409   else if (myToolBar->GetToolButton(VInspector_ToolActionType_SelectOwnersId)->isChecked())
410     onToolBarActionClicked(VInspector_ToolActionType_SelectOwnersId);
411
412   QApplication::restoreOverrideCursor();
413 }
414
415 // =======================================================================
416 // function : onHistoryViewSelectionChanged
417 // purpose :
418 // =======================================================================
419 void VInspector_Window::onHistoryViewSelectionChanged (const QItemSelection& theSelected,
420                                                        const QItemSelection&)
421 {
422   VInspector_ViewModelHistory* aHistoryModel = dynamic_cast<VInspector_ViewModelHistory*> (myHistoryView->model());
423   if (!aHistoryModel)
424     return;
425
426   if (theSelected.size() == 0)
427     return;
428
429   QModelIndexList aSelectedIndices = theSelected.indexes();
430   QStringList aPointers = aHistoryModel->GetSelectedPointers(aSelectedIndices.first());
431
432   VInspector_ViewModel* aTreeModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
433   if (!aTreeModel)
434     return;
435
436   QModelIndexList anIndices = aTreeModel->FindPointers (aPointers);
437   QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
438   aSelectionModel->clear();
439   for (int anIndicesId = 0, aSize = anIndices.size(); anIndicesId < aSize; anIndicesId++)
440   {
441     QModelIndex anIndex = anIndices[anIndicesId];
442     myTreeView->setExpanded (aTreeModel->parent (anIndex), true);
443     aSelectionModel->select (anIndex, QItemSelectionModel::Select);
444   }
445 }
446
447 // =======================================================================
448 // function : onExportToShapeView
449 // purpose :
450 // =======================================================================
451 void VInspector_Window::onExportToShapeView()
452 {
453   NCollection_List<Handle(AIS_InteractiveObject)> aSelectedPresentations =
454             VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel());
455   if (aSelectedPresentations.Extent() <= 0)
456     return;
457
458   TCollection_AsciiString aPluginName ("TKShapeView");
459   NCollection_List<Handle(Standard_Transient)> aParameters;
460   if (myParameters->FindParameters (aPluginName))
461     aParameters = myParameters->Parameters (aPluginName);
462
463   QStringList anExportedPointers;
464   for (NCollection_List<Handle(AIS_InteractiveObject)>::Iterator anIOIt (aSelectedPresentations); anIOIt.More(); anIOIt.Next())
465   {
466     Handle(AIS_Shape) aShapePresentation = Handle(AIS_Shape)::DownCast (anIOIt.Value());
467     if (aShapePresentation.IsNull())
468       continue;
469
470     const TopoDS_Shape& aShape = aShapePresentation->Shape();
471     if (aShape.IsNull())
472       continue;
473     aParameters.Append (aShape.TShape());
474     anExportedPointers.append (VInspector_Tools::GetPointerInfo (aShape.TShape(), true).ToCString());
475   }
476   if (anExportedPointers.empty())
477     return;
478
479   TCollection_AsciiString aPluginShortName = aPluginName.SubString (3, aPluginName.Length());
480   QString aMessage = QString ("TShape %1 is sent to %2.")
481     .arg (anExportedPointers.join(", "))
482     .arg (aPluginShortName.ToCString());
483   QString aQuestion = QString ("Would you like to activate %1 immediately?\n")
484     .arg (aPluginShortName.ToCString()).toStdString().c_str();
485   if (!myExportToShapeViewDialog)
486     myExportToShapeViewDialog = new TreeModel_MessageDialog (myParent, aMessage, aQuestion);
487   else
488     myExportToShapeViewDialog->SetInformation (aMessage);
489   myExportToShapeViewDialog->Start();
490
491   myParameters->SetParameters (aPluginName, aParameters, myExportToShapeViewDialog->IsAccepted());
492 }
493
494 // =======================================================================
495 // function : onShow
496 // purpose :
497 // =======================================================================
498 void VInspector_Window::onShow()
499 {
500   displaySelectedPresentations (true);
501 }
502
503 // =======================================================================
504 // function : onHide
505 // purpose :
506 // =======================================================================
507 void VInspector_Window::onHide()
508 {
509   displaySelectedPresentations (false);
510 }
511
512 // =======================================================================
513 // function : UpdateTreeModel
514 // purpose :
515 // =======================================================================
516 void VInspector_Window::UpdateTreeModel()
517 {
518   VInspector_ViewModel* aViewModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
519   if (!aViewModel)
520     return;
521   aViewModel->Reset();
522   aViewModel->EmitLayoutChanged();
523 }
524
525 // =======================================================================
526 // function : createAction
527 // purpose :
528 // =======================================================================
529 QAction* VInspector_Window::createAction(const QString& theText, const char* theSlot)
530 {
531   QAction* anAction = new QAction(theText, GetMainWindow());
532   connect(anAction, SIGNAL(triggered(bool)), this, theSlot);
533   return anAction;
534 }
535
536 // =======================================================================
537 // function : displaySelectedPresentations
538 // purpose :
539 // =======================================================================
540 void VInspector_Window::displaySelectedPresentations(const bool theToDisplay)
541 {
542   VInspector_ViewModel* aViewModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
543   if (!aViewModel)
544     return;
545
546   Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext();
547   if (aContext.IsNull())
548     return;
549
550   NCollection_List<Handle(AIS_InteractiveObject)> aSelectedPresentations =
551     VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel());
552   if (aSelectedPresentations.Extent() <= 0)
553     return;
554
555   for (NCollection_List<Handle(AIS_InteractiveObject)>::Iterator anIOIt(aSelectedPresentations); anIOIt.More(); anIOIt.Next())
556   {
557     Handle(AIS_InteractiveObject) aPresentation = Handle(AIS_Shape)::DownCast(anIOIt.Value());
558     if (aPresentation.IsNull())
559       continue;
560     if (theToDisplay) {
561       aContext->Display(aPresentation, false);
562       aContext->Load(aPresentation, -1, true);
563     }
564     else
565       aContext->Erase(aPresentation, false);
566   }
567   aContext->UpdateCurrentViewer();
568
569   // the order of objects returned by AIS_InteractiveContext is changed because the processed object is moved from
570   // Erased to Displayed container or back
571   QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
572   aSelectionModel->clear();
573
574   UpdateTreeModel();
575 }
576
577 // =======================================================================
578 // function : createView
579 // purpose :
580 // =======================================================================
581 Handle(AIS_InteractiveContext) VInspector_Window::createView()
582 {
583   myViewWindow = new View_Window (0);
584   myViewWindow->GetView()->SetPredefinedSize (VINSPECTOR_DEFAULT_VIEW_WIDTH, VINSPECTOR_DEFAULT_VIEW_HEIGHT);
585   myViewWindow->move (VINSPECTOR_DEFAULT_VIEW_POSITION_X, VINSPECTOR_DEFAULT_VIEW_POSITION_Y);
586   myViewWindow->show();
587
588   return myViewWindow->GetView()->GetViewer()->GetContext();
589 }