0029310: Coding - multiple compiler warnings in Inspectors
[occt.git] / tools / DFBrowser / DFBrowser_Window.cxx
CommitLineData
14bbbdcb 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
0cb512c0 16#include <inspector/DFBrowser_Window.hxx>
14bbbdcb 17
18#include <AIS_InteractiveContext.hxx>
19#include <AIS_InteractiveObject.hxx>
20#include <AIS_ListOfInteractive.hxx>
21
22#include <CDF_Session.hxx>
23
0cb512c0 24#include <inspector/DFBrowserPane_AttributePaneAPI.hxx>
25
26#include <inspector/DFBrowser_AttributePaneStack.hxx>
27#include <inspector/DFBrowser_AttributePaneType.hxx>
28#include <inspector/DFBrowser_DumpView.hxx>
29#include <inspector/DFBrowser_Item.hxx>
30#include <inspector/DFBrowser_ItemApplication.hxx>
31#include <inspector/DFBrowser_Module.hxx>
32#include <inspector/DFBrowser_OpenApplication.hxx>
33#include <inspector/DFBrowser_PropertyPanel.hxx>
34#include <inspector/DFBrowser_SearchLine.hxx>
35#include <inspector/DFBrowser_SearchView.hxx>
36#include <inspector/DFBrowser_Shortcut.hxx>
37#include <inspector/DFBrowser_Thread.hxx>
38#include <inspector/DFBrowser_ThreadItemSearch.hxx>
39#include <inspector/DFBrowser_ThreadItemUsedShapesMap.hxx>
40#include <inspector/DFBrowser_Tools.hxx>
41#include <inspector/DFBrowser_TreeLevelLine.hxx>
42#include <inspector/DFBrowser_TreeLevelView.hxx>
43#include <inspector/DFBrowser_TreeModel.hxx>
44#include <inspector/DFBrowser_TreeView.hxx>
45
46#include <inspector/DFBrowserPane_AttributePaneSelector.hxx>
47#include <inspector/DFBrowserPane_SelectionKind.hxx>
48#include <inspector/DFBrowserPane_Tools.hxx>
14bbbdcb 49
50#include <OSD_Directory.hxx>
51#include <OSD_Environment.hxx>
52#include <OSD_Protection.hxx>
53
0cb512c0 54#include <inspector/View_Displayer.hxx>
55#include <inspector/View_ToolBar.hxx>
56#include <inspector/View_Viewer.hxx>
57#include <inspector/View_Widget.hxx>
58#include <inspector/View_Window.hxx>
59
60#include <TDF_Tool.hxx>
61#include <inspector/TreeModel_MessageDialog.hxx>
14bbbdcb 62
130eb114 63#include <Standard_WarningsDisable.hxx>
14bbbdcb 64#include <QAction>
65#include <QApplication>
66#include <QComboBox>
67#include <QDir>
68#include <QDockWidget>
69#include <QGridLayout>
70#include <QList>
71#include <QMainWindow>
14bbbdcb 72#include <QItemSelectionModel>
73#include <QTabWidget>
74#include <QToolBar>
75#include <QTreeView>
76#include <QMenu>
77#include <QMessageBox>
78#include <QStatusBar>
79#include <QWidget>
80#if QT_VERSION < 0x050000
81#include <QWindowsStyle>
82#else
83#include <QStyleFactory>
84#endif
130eb114 85#include <Standard_WarningsRestore.hxx>
14bbbdcb 86
d2c90917 87const int DFBROWSER_DEFAULT_WIDTH = 650;
88const int DFBROWSER_DEFAULT_HEIGHT = 350;
89const int DFBROWSER_DEFAULT_TREE_VIEW_WIDTH = 325;
14bbbdcb 90const int DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT = 500;
91const int DFBROWSER_DEFAULT_VIEW_WIDTH = 400;
92const int DFBROWSER_DEFAULT_VIEW_HEIGHT = 300;
93
94const int DFBROWSER_DEFAULT_POSITION_X = 200;
95const int DFBROWSER_DEFAULT_POSITION_Y = 60;
96
97const int OCAF_BROWSER_COLUMN_WIDTH_0 = 300;
d2c90917 98const int DEFAULT_PROPERTY_PANEL_HEIGHT = 200;
14bbbdcb 99const int DEFAULT_BROWSER_HEIGHT = 800;
100
101// =======================================================================
102// function : Constructor
103// purpose :
104// =======================================================================
105DFBrowser_Window::DFBrowser_Window()
0cb512c0 106: myModule (0), myParent (0), myPropertyPanel (0), myExportToShapeViewDialog (0)
14bbbdcb 107{
108 myMainWindow = new QMainWindow (0);
109
110 // tree view
111 myTreeView = new DFBrowser_TreeView (myMainWindow);
112 myTreeView->setContextMenuPolicy (Qt::CustomContextMenu);
113 connect (myTreeView, SIGNAL (customContextMenuRequested (const QPoint&)),
114 this, SLOT (onTreeViewContextMenuRequested (const QPoint&)));
115 ((DFBrowser_TreeView*)myTreeView)->SetPredefinedSize (DFBROWSER_DEFAULT_TREE_VIEW_WIDTH,
116 DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT);
117 myTreeView->setHeaderHidden (true);
118 myTreeView->setSortingEnabled (Standard_False);
119
120 QDockWidget* aTreeViewWidget = new QDockWidget (tr ("TreeView"), myMainWindow);
d2c90917 121 aTreeViewWidget->setTitleBarWidget (new QWidget(myMainWindow));
14bbbdcb 122 aTreeViewWidget->setFeatures (QDockWidget::NoDockWidgetFeatures);
123 aTreeViewWidget->setWidget (myTreeView);
124 myMainWindow->addDockWidget (Qt::LeftDockWidgetArea, aTreeViewWidget);
125 myMainWindow->setCorner (Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
126
127#if QT_VERSION < 0x050000
128 myTreeView->setStyle (new QWindowsStyle);
129#else
130 myTreeView->setStyle (QStyleFactory::create("Windows"));
131#endif
132
133 myTreeLevelLine = new DFBrowser_TreeLevelLine (myMainWindow);
134 connect (myTreeLevelLine->GetSearchLine(), SIGNAL (searchActivated()), this, SLOT (onSearchActivated()));
135 connect (myTreeLevelLine, SIGNAL (indexSelected (const QModelIndex&)),
136 this, SLOT (onTreeLevelLineSelected (const QModelIndex&)));
137 connect (myTreeLevelLine, SIGNAL (updateClicked()), this, SLOT (onUpdateClicked()));
138
139 QDockWidget* aTreeLineDockWidget = new QDockWidget (tr ("Tree Level Line"), myMainWindow);
d2c90917 140 aTreeLineDockWidget->setTitleBarWidget (new QWidget(myMainWindow));
14bbbdcb 141 aTreeLineDockWidget->setFeatures (QDockWidget::NoDockWidgetFeatures);
142 aTreeLineDockWidget->setWidget (myTreeLevelLine->GetControl());
143 myMainWindow->addDockWidget (Qt::TopDockWidgetArea, aTreeLineDockWidget);
144
145 // dump view window
146 QWidget* aDumpWidget = new QWidget (myMainWindow);
147 QVBoxLayout* aDumpLay = new QVBoxLayout (aDumpWidget);
148 aDumpLay->setMargin (0);
149 myDumpView = new DFBrowser_DumpView (aDumpWidget);
150 aDumpLay->addWidget (myDumpView->GetControl());
151 QDockWidget* aDumpDockWidget = new QDockWidget (tr ("Dump"), myMainWindow);
d2c90917 152
14bbbdcb 153 aDumpDockWidget->setWidget (aDumpWidget);
154 myMainWindow->addDockWidget (Qt::BottomDockWidgetArea, aDumpDockWidget);
155
156 // property panel
157 myPropertyPanel = new DFBrowser_PropertyPanel (myMainWindow);
158 DFBrowser_AttributePaneStack* anAttributePaneStack = myPropertyPanel->GetAttributesStack();
159 anAttributePaneStack->GetSearchView()->SetSearchLine (myTreeLevelLine->GetSearchLine());
160
161 connect (anAttributePaneStack->GetPaneSelector(),
162 SIGNAL (tableSelectionChanged (const QItemSelection&, const QItemSelection&, QItemSelectionModel*)),
163 this, SLOT (onPaneSelectionChanged (const QItemSelection&, const QItemSelection&, QItemSelectionModel*)));
164
165 DFBrowser_SearchView* aSearchView = anAttributePaneStack->GetSearchView();
166 connect (aSearchView, SIGNAL (pathSelected (const QStringList&, const QString&)),
167 this, SLOT (onSearchPathSelected (const QStringList&, const QString&)));
168 connect (aSearchView, SIGNAL (pathDoubleClicked (const QStringList&, const QString&)),
169 this, SLOT (onSearchPathDoubleClicked (const QStringList&, const QString&)));
170
171 DFBrowser_TreeLevelView* aLevelView = anAttributePaneStack->GetTreeLevelView();
172 connect (aLevelView, SIGNAL (indexSelected (const QModelIndex&)), this, SLOT (onLevelSelected (const QModelIndex&)));
173 connect (aLevelView, SIGNAL (indexDoubleClicked (const QModelIndex&)),
174 this, SLOT (onLevelDoubleClicked (const QModelIndex&)));
175
176 myMainWindow->setCentralWidget (myPropertyPanel->GetControl());
177
178 // view
179 myViewWindow = new View_Window (myMainWindow);
180 myViewWindow->GetView()->SetPredefinedSize (DFBROWSER_DEFAULT_VIEW_WIDTH, DFBROWSER_DEFAULT_VIEW_HEIGHT);
181
182 QDockWidget* aViewDockWidget = new QDockWidget (tr ("View"), myMainWindow);
d2c90917 183 aViewDockWidget->setTitleBarWidget (myViewWindow->GetViewToolBar()->GetControl());
14bbbdcb 184 aViewDockWidget->setWidget (myViewWindow);
185 myMainWindow->addDockWidget (Qt::BottomDockWidgetArea, aViewDockWidget);
186
d2c90917 187 QColor aHColor (229, 243, 255);
14bbbdcb 188 myViewWindow->GetDisplayer()->SetAttributeColor (Quantity_Color(aHColor.red() / 255., aHColor.green() / 255.,
189 aHColor.blue() / 255., Quantity_TOC_RGB), View_PresentationType_Additional);
190 myMainWindow->tabifyDockWidget (aDumpDockWidget, aViewDockWidget);
191
d2c90917 192 aTreeViewWidget->resize (DFBROWSER_DEFAULT_TREE_VIEW_WIDTH, DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT);
14bbbdcb 193
194 myThread = new DFBrowser_Thread (this);
195
196 myShortcut = new DFBrowser_Shortcut (myMainWindow);
197}
198
199// =======================================================================
200// function : Destructor
201// purpose :
202// =======================================================================
203DFBrowser_Window::~DFBrowser_Window()
204{
205 delete myModule;
206}
207
208// =======================================================================
209// function : SetParent
210// purpose :
211// =======================================================================
212void DFBrowser_Window::SetParent (void* theParent)
213{
214 myParent = (QWidget*)theParent;
215 if (myParent)
216 {
217 QLayout* aLayout = myParent->layout();
218 if (aLayout)
219 aLayout->addWidget (GetMainWindow());
220 }
221}
222
223// =======================================================================
224// function : UpdateContent
225// purpose :
226// =======================================================================
227void DFBrowser_Window::UpdateContent()
228{
229 TCollection_AsciiString aName = "TKDFBrowser";
230
231 if (myParameters->FindParameters (aName))
232 Init(myParameters->Parameters (aName));
233 else
234 Init(NCollection_List<Handle(Standard_Transient)>());
235
236 if (myParameters->FindFileNames(aName))
237 {
238 NCollection_List<TCollection_AsciiString> aFileNames = myParameters->FileNames (aName);
239 if (aFileNames.Extent() > 0) // only one document file might be opened
240 OpenFile (aFileNames.First());
241 myParameters->SetFileNames(aName, NCollection_List<TCollection_AsciiString>());
242 }
243 onUpdateClicked();
0cb512c0 244
245 // make parameter items selected if defined
246 if (myParameters->FindSelectedNames(aName))
247 {
248 const NCollection_List<TCollection_AsciiString>& aSelected = myParameters->GetSelectedNames (aName);
249
250 DFBrowser_TreeModel* aTreeModel = dynamic_cast<DFBrowser_TreeModel*> (myTreeView->model());
251 Handle(TDocStd_Application) anApplication = aTreeModel->GetTDocStdApplication();
252
253 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
254 aSelectionModel->clear();
255
256 NCollection_List<TCollection_AsciiString>::Iterator aSelectedIt (aSelected);
257 if (aSelectedIt.More())
258 {
259 TCollection_AsciiString aLabelEntry = aSelectedIt.Value();
260
261 TDF_Label aLabel;
262 for (Standard_Integer aDocId = 1, aNbDoc = anApplication->NbDocuments(); aDocId <= aNbDoc; aDocId++)
263 {
264 Handle(TDocStd_Document) aDocument;
265 anApplication->GetDocument (aDocId, aDocument);
266
267 TDF_Tool::Label(aDocument->GetData(), aLabelEntry.ToCString(), aLabel, Standard_False);
268 if (!aLabel.IsNull())
269 break;
270 }
271 if (!aLabel.IsNull())
272 {
273 QModelIndex anIndexToBeSelected = aTreeModel->FindIndex (aLabel);
274
275 TCollection_AsciiString anAttributeType;
276 aSelectedIt.Next();
277 // find attribute by attribute type on the given label
278 if (aSelectedIt.More())
279 {
280 anAttributeType = aSelectedIt.Value();
281
282 TreeModel_ItemBasePtr aLabelItem = TreeModel_ModelBase::GetItemByIndex (anIndexToBeSelected);
283 //DFBrowser_ItemPtr anItem = itemDynamicCast<DFBrowser_Item> (anItemBase);
284 for (int aChildId = 0, aNbChildren = aLabelItem->rowCount(); aChildId < aNbChildren; aChildId++)
285 {
286 QModelIndex anIndex = aTreeModel->index (aChildId, 0, anIndexToBeSelected);
287 TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
288 DFBrowser_ItemPtr anItem = itemDynamicCast<DFBrowser_Item> (anItemBase);
289 if (anItem->HasAttribute())
290 {
291 // processing attribute in theValue
292 DFBrowser_ItemApplicationPtr aRootAppItem = itemDynamicCast<DFBrowser_ItemApplication>(aTreeModel->RootItem (0));
293 QString anAttributeInfo = DFBrowser_Module::GetAttributeInfo (anItem->GetAttribute(), aRootAppItem->GetModule(),
294 Qt::DisplayRole, 0).toString();
295 if (anAttributeInfo == anAttributeType.ToCString())
296 {
297 anIndexToBeSelected = anIndex;
298 break;
299 }
300 }
301 }
302 }
303 aSelectionModel->select (anIndexToBeSelected, QItemSelectionModel::Select);
304 myTreeView->scrollTo (anIndexToBeSelected);
305 }
306 }
307
308 myParameters->SetSelectedNames(aName, NCollection_List<TCollection_AsciiString>());
309 }
14bbbdcb 310}
311
312// =======================================================================
313// function : Init
314// purpose :
315// =======================================================================
316void DFBrowser_Window::Init (const NCollection_List<Handle(Standard_Transient)>& theParameters)
317{
318 Handle(TDocStd_Application) anApplication;
319 if (myModule)
320 {
321 DFBrowser_TreeModel* anOCAFViewModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
322 if (anOCAFViewModel)
323 anApplication = anOCAFViewModel->GetTDocStdApplication();
324 }
325 Handle(AIS_InteractiveContext) aContext;
326 if (myModule)
327 aContext = myModule->GetExternalContext();
328
329 bool aSameApplication = !anApplication.IsNull(), aSameContext = !aContext.IsNull();
330 for (NCollection_List<Handle(Standard_Transient)>::Iterator aParametersIt (theParameters);
331 aParametersIt.More(); aParametersIt.Next())
332 {
333 Handle(Standard_Transient) anObject = aParametersIt.Value();
334 // check if the object is an application
335 Handle(TDocStd_Application) anIApplication = Handle(TDocStd_Application)::DownCast (anObject);
336 if (!anIApplication.IsNull())
337 {
338 aSameApplication = anApplication == anIApplication;
339 if (!aSameApplication)
340 anApplication = anIApplication;
341 }
342 // check if the object is an interactive context
343 Handle(AIS_InteractiveContext) anIContext = Handle(AIS_InteractiveContext)::DownCast (anObject);
344 if (!anIContext.IsNull())
345 {
346 aSameContext = aContext == anIContext;
347 if (!aSameContext)
348 aContext = anIContext;
349 }
350 }
351 if (aSameApplication)
352 {
353 if (!aSameContext && !aContext.IsNull())
354 {
355 myModule->SetExternalContext (aContext);
356 myViewWindow->SetContext (View_ContextType_External, aContext);
357 }
358 return;
359 }
360
361 myModule = new DFBrowser_Module();
362 myModule->CreateViewModel (myMainWindow);
363
364 myPropertyPanel->GetAttributesStack()->SetModule (myModule);
365
366 // model should be set after the attribute pane stack is initialized by module
367 QAbstractItemModel* aModel = myModule->GetOCAFViewModel();
368 setOCAFModel (aModel);
369 myModule->SetOCAFViewSelectionModel (myTreeView->selectionModel());
370 myTreeLevelLine->GetSearchLine()->SetModule (myModule);
371 myPropertyPanel->GetAttributesStack()->GetSearchView()->InitModels();
372
373 myShortcut->SetModule (myModule);
374 myThread->SetModule (myModule);
375
376 connect (myModule, SIGNAL (beforeUpdateTreeModel()), this, SLOT (onBeforeUpdateTreeModel()));
377
378 if (!aContext.IsNull())
379 {
380 myModule->SetExternalContext (aContext);
381 myViewWindow->SetContext (View_ContextType_External, aContext);
382 }
383
384 myModule->SetApplication (anApplication);
385 //! expand first three levels: CUSTOM
386 QModelIndex aParentIndex = aModel->index (0, 0);
387 setExpandedLevels (myTreeView, aParentIndex, 3/*levels*/);
388
389 myThread->ProcessApplication();
390 myModule->SetInitialTreeViewSelection();
391}
392
393// =======================================================================
394// function : OpenFile
395// purpose :
396// =======================================================================
397void DFBrowser_Window::OpenFile (const TCollection_AsciiString& theFileName)
398{
14bbbdcb 399 QApplication::setOverrideCursor (Qt::WaitCursor);
400 myThread->TerminateThread();
401
402 myTreeLevelLine->ClearHistory();
403 QItemSelectionModel* aSelectionModel = myModule->GetOCAFViewSelectionModel();
404 if (aSelectionModel)
405 {
406 aSelectionModel->clearSelection();
407 QModelIndex anIndex;
408 aSelectionModel->select (anIndex, QItemSelectionModel::ClearAndSelect);
409 }
410 ClearThreadCache();
411
412 myTreeLevelLine->ClearHistory();
413
414 DFBrowser_TreeModel* anOCAFViewModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
415 anOCAFViewModel->Reset();
416
417 //! close previous documents to open new document
418 Handle(TDocStd_Application) anApplication;
419 if (CDF_Session::Exists())
420 {
421 Handle(CDF_Session) aSession = CDF_Session::CurrentSession();
422 if (!aSession.IsNull())
423 {
424 anApplication = Handle(TDocStd_Application)::DownCast (CDF_Session::CurrentSession()->CurrentApplication());
425 if (!anApplication.IsNull())
426 {
427 for (int aDocId = 1, aNbDocuments = anApplication->NbDocuments(); aDocId <= aNbDocuments; aDocId++)
428 {
429 Handle(TDocStd_Document) aDocument;
430 anApplication->GetDocument (aDocId, aDocument);
431 if (!aDocument.IsNull())
432 anApplication->Close (aDocument);
433 }
434 }
435 }
436 }
437 //! open new document
438 bool isSTEPFileName = false;
439 anApplication = DFBrowser_OpenApplication::OpenApplication (theFileName, isSTEPFileName);
440
441 if (myParent)
442 myParent->setObjectName (isSTEPFileName ? QString (TCollection_AsciiString (theFileName).ToCString()) : getWindowTitle());
443
444 if (anApplication.IsNull())
445 {
446 QApplication::restoreOverrideCursor();
447 QMessageBox::information (0, "Error", QString ("File %1 can't be opened by OCAF application")
448 .arg(TCollection_AsciiString (theFileName).ToCString()));
449 }
450 else {
451 myModule->SetApplication (anApplication);
452 //! expand first three levels: CUSTOM
453 QModelIndex aParentIndex = anOCAFViewModel->index (0, 0);
454 setExpandedLevels (myTreeView, aParentIndex, 3/*levels*/);
455
456 myThread->ProcessApplication();
457 myModule->SetInitialTreeViewSelection();
458 QApplication::restoreOverrideCursor();
459 }
14bbbdcb 460}
461
462// =======================================================================
463// function : getWindowTitle
464// purpose :
465// =======================================================================
466QString DFBrowser_Window::getWindowTitle() const
467{
468 DFBrowser_TreeModel* anOCAFViewModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
469 if (!anOCAFViewModel)
470 return "";
471
472 Handle(TDocStd_Application) anApplication = anOCAFViewModel->GetTDocStdApplication();
473 if (anApplication.IsNull() || anApplication->NbDocuments() == 0)
474 return "";
475
476 Handle(TDocStd_Document) aDocument;
477 anApplication->GetDocument (1, aDocument);
478 if (aDocument.IsNull() || !aDocument->IsSaved())
479 return "";
480
481 return DFBrowserPane_Tools::ToString (aDocument->GetPath());
482}
483
484// =======================================================================
485// function : setExpandedLevels
486// purpose :
487// =======================================================================
488void DFBrowser_Window::setExpandedLevels (QTreeView* theTreeView, const QModelIndex& theParentIndex, const int theLevels)
489{
490 if (theLevels <= 0)
491 return;
492
493 QAbstractItemModel* aModel = theTreeView->model();
494 if (!aModel)
495 return;
496
497 theTreeView->setExpanded (theParentIndex, true);
498 for (int aRowId = 0, aRows = aModel->rowCount (theParentIndex); aRowId < aRows; aRowId++)
499 setExpandedLevels (theTreeView, aModel->index (aRowId, 0, theParentIndex), theLevels - 1);
500}
501
502// =======================================================================
503// function : setOCAFModel
504// purpose :
505// =======================================================================
506void DFBrowser_Window::setOCAFModel (QAbstractItemModel* theModel)
507{
508 myTreeView->setModel (theModel);
509 myTreeView->setColumnWidth (0, OCAF_BROWSER_COLUMN_WIDTH_0);
510
511 QItemSelectionModel* aSelectionModel = new QItemSelectionModel (theModel);
512 myTreeView->setSelectionModel (aSelectionModel);
513
514 connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
515 myTreeLevelLine, SLOT (OnTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&)));
516 connect(aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
517 myDumpView, SLOT (OnTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&)));
518 connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
519 this, SLOT (onTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&)));
520}
521
522// =======================================================================
523// function : onBeforeUpdateTreeModel
524// purpose :
525// =======================================================================
526void DFBrowser_Window::onBeforeUpdateTreeModel()
527{
528 myTreeLevelLine->ClearHistory();
529 ClearThreadCache();
530 myThread->ProcessApplication();
531}
532
533// =======================================================================
534// function : ClearThreadCache
535// purpose :
536// =======================================================================
537void DFBrowser_Window::ClearThreadCache()
538{
539 DFBrowser_ThreadItemUsedShapesMap::ClearSortedReferences (myModule);
540 DFBrowser_ThreadItemSearch::ClearValues (GetTreeLevelLine()->GetSearchLine());
541}
542
543// =======================================================================
544// function : SetWhiteBackground
545// purpose :
546// =======================================================================
547void DFBrowser_Window::SetWhiteBackground (QWidget* theControl)
548{
549 QPalette aPalette = theControl->palette();
550 aPalette.setColor (QPalette::All, QPalette::Foreground, Qt::white);
551 theControl->setPalette (aPalette);
552}
553
554// =======================================================================
555// function : TmpDirectory
556// purpose :
557// =======================================================================
558TCollection_AsciiString DFBrowser_Window::TmpDirectory()
559{
560 TCollection_AsciiString aTmpDir;
561#ifdef _WIN32
562 OSD_Environment anEnvironment ("TEMP");
563 aTmpDir = anEnvironment.Value();
564 if (aTmpDir.IsEmpty() )
565 {
566 anEnvironment.SetName("TMP");
567 aTmpDir = anEnvironment.Value();
568 if (aTmpDir.IsEmpty())
569 aTmpDir = "C:\\";
570 }
571 OSD_Path aTmpPath (aTmpDir);
572 OSD_Directory aTmpDirectory (aTmpPath);
573 if (!aTmpDirectory.Exists())
574 aTmpDirectory.Build(OSD_Protection());
575#else
576 OSD_Directory aTmpDirectory = OSD_Directory::BuildTemporary();
577 OSD_Path aTmpPath;
578 aTmpDirectory.Path (aTmpPath);
579 aTmpPath.SystemName(aTmpDir);
580#endif
581
582 return aTmpDir;
583}
584
585// =======================================================================
586// function : SingleSelected
587// purpose :
588// =======================================================================
589QModelIndex DFBrowser_Window::SingleSelected (const QModelIndexList& theIndices, const int theCellId,
590 const Qt::Orientation theOrientation)
591{
592 QModelIndexList aFirstColumnSelectedIndices;
593 for (QModelIndexList::const_iterator anIndicesIt = theIndices.begin(), aLast = theIndices.end();
594 anIndicesIt != aLast; anIndicesIt++)
595 {
596 QModelIndex anIndex = *anIndicesIt;
597 if ((theOrientation == Qt::Horizontal && anIndex.column() == theCellId) ||
598 (theOrientation == Qt::Vertical && anIndex.row() == theCellId))
599 aFirstColumnSelectedIndices.append (anIndex);
600 }
601 return aFirstColumnSelectedIndices.size() == 1 ? aFirstColumnSelectedIndices.first() : QModelIndex();
602}
603
604// =======================================================================
605// function : onTreeViewContextMenuRequested
606// purpose :
607// =======================================================================
608void DFBrowser_Window::onTreeViewContextMenuRequested (const QPoint& thePosition)
609{
610 QMenu* aMenu = new QMenu(GetMainWindow());
611 aMenu->addAction (createAction (tr ("Expand"), SLOT (onExpand())));
612 aMenu->addAction (createAction (tr ("Expand All"), SLOT (onExpandAll())));
613 aMenu->addAction (createAction (tr ("Collapse All"), SLOT (onCollapseAll())));
614
615 QPoint aPoint = myTreeView->mapToGlobal (thePosition);
616 aMenu->exec (aPoint);
617}
618
619// =======================================================================
620// function : createAction
621// purpose :
622// =======================================================================
623QAction* DFBrowser_Window::createAction (const QString& theText, const char* theSlot)
624{
625 QAction* anAction = new QAction (theText, GetMainWindow());
626 connect (anAction, SIGNAL (triggered(bool)), this, theSlot);
627 return anAction;
628}
629
630// =======================================================================
631// function : onExpand
632// purpose :
633// =======================================================================
634void DFBrowser_Window::onExpand()
635{
636 QApplication::setOverrideCursor (Qt::WaitCursor);
637
638 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
639 QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes();
640 for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++)
641 {
642 int aLevels = 2;
643 setExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels);
644 }
645 QApplication::restoreOverrideCursor();
646}
647
648// =======================================================================
649// function : onExpandAll
650// purpose :
651// =======================================================================
652void DFBrowser_Window::onExpandAll()
653{
654 QApplication::setOverrideCursor (Qt::WaitCursor);
655
656 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
657 QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes();
658 for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++)
659 {
660 int aLevels = -1;
661 setExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels);
662 }
663 QApplication::restoreOverrideCursor();
664}
665
666// =======================================================================
667// function : onCollapseAll
668// purpose :
669// =======================================================================
670void DFBrowser_Window::onCollapseAll()
671{
672 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
673 QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes();
674 for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) {
675 int aLevels = -1;
676 setExpanded (myTreeView, aSelectedIndices[aSelectedId], false, aLevels);
677 }
678}
679
680// =======================================================================
681// function : onTreeViewSelectionChanged
682// purpose :
683// =======================================================================
684void DFBrowser_Window::onTreeViewSelectionChanged (const QItemSelection& theSelected,
685 const QItemSelection& theDeselected)
686{
687 if (!myModule)
688 return;
689 // previuos selection should be cleared in the panel selectors
690 DFBrowser_AttributePaneStack* anAttributePaneStack = myPropertyPanel->GetAttributesStack();
691 anAttributePaneStack->GetPaneSelector()->ClearSelected();
692
693 myPropertyPanel->UpdateBySelectionChanged (theSelected, theDeselected);
694 anAttributePaneStack->GetTreeLevelView()->UpdateByTreeSelectionChanged (theSelected, theDeselected);
695
696 QModelIndexList aSelectedIndices = theSelected.indexes();
697 QModelIndex aSelectedIndex = DFBrowser_Window::SingleSelected (aSelectedIndices, 0);
698
699 myTreeView->scrollTo (aSelectedIndex);
700 View_Displayer* aDisplayer = myViewWindow->GetDisplayer();
701
702 aDisplayer->ErasePresentations (View_PresentationType_Additional, false);
703 aDisplayer->DisplayPresentation (findPresentation (aSelectedIndex), View_PresentationType_Main);
704}
705
706// =======================================================================
707// function : onSearchActivated
708// purpose :
709// =======================================================================
710void DFBrowser_Window::onSearchActivated()
711{
712 myPropertyPanel->GetAttributesStack()->SetPaneMode ((myTreeLevelLine->GetSearchLine()->Text().isEmpty()
713 ? DFBrowser_AttributePaneType_ItemView : DFBrowser_AttributePaneType_SearchView));
714}
715
716// =======================================================================
717// function : onPaneSelectionChanged
718// purpose :
719// =======================================================================
720void DFBrowser_Window::onPaneSelectionChanged (const QItemSelection&,
721 const QItemSelection&,
722 QItemSelectionModel* theModel)
723{
724 DFBrowserPane_AttributePaneAPI* anAttributePane = myPropertyPanel->GetAttributesStack()->GetCurrentPane();
725 switch (anAttributePane->GetSelectionKind (theModel))
726 {
727 case DFBrowserPane_SelectionKind_ExportToShapeViewer:
728 {
729 QItemSelectionModel* aSelectionModel = theModel;
730 QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes();
731 if (aSelectedIndices.size() != 1)
732 return;
733
734 TCollection_AsciiString aPluginName ("TKShapeView");
0cb512c0 735 NCollection_List<Handle(Standard_Transient)> aParameters;
736 if (myParameters->FindParameters (aPluginName))
737 aParameters = myParameters->Parameters (aPluginName);
14bbbdcb 738
14bbbdcb 739 int aParametersCount = aParameters.Extent();
740 anAttributePane->GetSelectionParameters (aSelectionModel, aParameters);
741 if (aParametersCount != aParameters.Extent()) // some TShapes are added
742 {
0cb512c0 743 TCollection_AsciiString aPluginShortName = aPluginName.SubString (3, aPluginName.Length());
744 QString aMessage = QString ("TShape %1 is sent to %2.")
745 .arg (DFBrowserPane_Tools::GetPointerInfo (aParameters.Last()).ToCString())
746 .arg (aPluginShortName.ToCString());
747 QString aQuestion = QString ("Would you like to activate %1 immediately?\n")
748 .arg (aPluginShortName.ToCString()).toStdString().c_str();
749 if (!myExportToShapeViewDialog)
750 myExportToShapeViewDialog = new TreeModel_MessageDialog (myParent, aMessage, aQuestion);
751 else
752 myExportToShapeViewDialog->SetInformation (aMessage);
753 myExportToShapeViewDialog->Start();
754
755 myParameters->SetParameters (aPluginName, aParameters, myExportToShapeViewDialog->IsAccepted());
14bbbdcb 756 }
757 return;
758 }
759 case DFBrowserPane_SelectionKind_ExportToBREP:
760 case DFBrowserPane_SelectionKind_LabelReferences:
761 case DFBrowserPane_SelectionKind_AttributeReferences:
762 default: break;
763 }
764
765 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
766 QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes();
767 if (aSelectedIndices.size() != 1)
768 return;
769
770 // make the shape visualized
771 QModelIndex aSelectedIndex = aSelectedIndices.first();
772 View_Displayer* aDisplayer = myViewWindow->GetDisplayer();
773 aDisplayer->DisplayPresentation (findPresentation (aSelectedIndex), View_PresentationType_Main);
774
775 // highlight and scroll to the referenced item if it exists
776 Handle(TDF_Attribute) anAttribute = myModule->FindAttribute (aSelectedIndex);
777 NCollection_List<TDF_Label> aReferences;
778 Handle(Standard_Transient) aPresentation;
14bbbdcb 779 anAttributePane->GetReferences (anAttribute, aReferences, aPresentation);
14bbbdcb 780 QModelIndexList anIndices;
781 DFBrowser_TreeModel* aTreeModel = dynamic_cast<DFBrowser_TreeModel*> (myTreeView->model());
782 if (!aReferences.IsEmpty())
783 aTreeModel->ConvertToIndices (aReferences, anIndices);
784 else {
785 NCollection_List<Handle(TDF_Attribute)> anAttributeReferences;
786 anAttributePane->GetAttributeReferences (anAttribute, anAttributeReferences, aPresentation);
787 aTreeModel->ConvertToIndices (anAttributeReferences, anIndices);
788 }
789 highlightIndices (anIndices);
790 // display either the reference presentation of the panel or find a presentation if the reference
791 // is an attribute
792 if (!aPresentation.IsNull())
793 aDisplayer->DisplayPresentation (aPresentation, View_PresentationType_Additional);
794 else {
d2c90917 795 aDisplayer->ErasePresentations (View_PresentationType_Additional, false);
14bbbdcb 796 AIS_ListOfInteractive aDisplayed;
797 findPresentations (anIndices, aDisplayed);
798 for (AIS_ListIteratorOfListOfInteractive aDisplayedIt (aDisplayed); aDisplayedIt.More(); aDisplayedIt.Next())
799 aDisplayer->DisplayPresentation (aDisplayedIt.Value(), View_PresentationType_Additional, false);
800
801 aDisplayer->UpdateViewer();
802 }
803}
804
805// =======================================================================
806// function : onTreeLevelLineSelected
807// purpose :
808// =======================================================================
809void DFBrowser_Window::onTreeLevelLineSelected (const QModelIndex& theIndex)
810{
811 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
812 if (theIndex.isValid())
813 aSelectionModel->select (theIndex, QItemSelectionModel::ClearAndSelect);
814 else
815 aSelectionModel->clearSelection();
816}
817
818// =======================================================================
819// function : onUpdateClicked
820// purpose :
821// =======================================================================
822void DFBrowser_Window::onUpdateClicked()
823{
824 if (myModule)
825 myModule->UpdateTreeModel();
826}
827
828// =======================================================================
829// function : onSearchPathSelected
830// purpose :
831// =======================================================================
832void DFBrowser_Window::onSearchPathSelected (const QStringList& thePath, const QString& theValue)
833{
834 DFBrowser_TreeModel* aDFBrowserModel = dynamic_cast<DFBrowser_TreeModel*> (myTreeView->model());
835 const QModelIndex& anIndex = aDFBrowserModel->FindIndexByPath (thePath, theValue);
836
837 if (anIndex.isValid())
838 {
839 QModelIndexList anIndices;
840 anIndices.append (anIndex);
841 highlightIndices (anIndices);
842 }
843}
844
845// =======================================================================
846// function : onSearchPathDoubleClicked
847// purpose :
848// =======================================================================
849void DFBrowser_Window::onSearchPathDoubleClicked (const QStringList& thePath, const QString& theValue)
850{
851 DFBrowser_TreeModel* aDFBrowserModel = dynamic_cast<DFBrowser_TreeModel*> (myTreeView->model());
852 const QModelIndex& anIndex = aDFBrowserModel->FindIndexByPath (thePath, theValue);
853
854 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
855 if (anIndex.isValid())
856 aSelectionModel->select (anIndex, QItemSelectionModel::ClearAndSelect);
857 else
858 aSelectionModel->clearSelection();
859}
860
861// =======================================================================
862// function : onLevelSelected
863// purpose :
864// =======================================================================
865void DFBrowser_Window::onLevelSelected (const QModelIndex& theIndex)
866{
867 if (!theIndex.isValid())
868 return;
869
870 QModelIndexList anIndices;
871 anIndices.append (theIndex);
872 highlightIndices (anIndices);
873 View_Displayer* aDisplayer = myViewWindow->GetDisplayer();
874 aDisplayer->ErasePresentations (View_PresentationType_Additional, false);
875 aDisplayer->DisplayPresentation (findPresentation (theIndex), View_PresentationType_Main);
876}
877
878// =======================================================================
879// function : onLevelDoubleClicked
880// purpose :
881// =======================================================================
882void DFBrowser_Window::onLevelDoubleClicked (const QModelIndex& theIndex)
883{
884 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
885 if (theIndex.isValid())
886 aSelectionModel->select (theIndex, QItemSelectionModel::ClearAndSelect);
887 else
888 aSelectionModel->clearSelection();
889}
890
891// =======================================================================
892// function : highlightIndices
893// purpose :
894// =======================================================================
895void DFBrowser_Window::highlightIndices (const QModelIndexList& theIndices)
896{
897 QAbstractItemModel* aModel = myTreeView->model();
898 if (!aModel)
899 return;
900
901 DFBrowser_TreeModel* aTreeModel = dynamic_cast<DFBrowser_TreeModel*> (aModel);
902 if (!aTreeModel)
903 return;
904
905 aTreeModel->SetHighlighted (theIndices);
906
907 QModelIndex anIndexToScroll;
d2c90917 908 if (!theIndices.isEmpty())
14bbbdcb 909 anIndexToScroll = theIndices.last(); // scroll to last selected index
910 else
911 {
912 // scroll to tree selected item
913 QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
914 QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes();
915 if (aSelectedIndices.size() == 1)
916 anIndexToScroll = aSelectedIndices.first();
917 }
918 if (anIndexToScroll.isValid())
919 myTreeView->scrollTo (anIndexToScroll);
920
d2c90917 921 if (theIndices.isEmpty())
922 myTreeView->setFocus(); // to see the selected item in active palette color
923
14bbbdcb 924 aTreeModel->EmitLayoutChanged();
925}
926
927// =======================================================================
928// function : findPresentation
929// purpose :
930// =======================================================================
931Handle(AIS_InteractiveObject) DFBrowser_Window::findPresentation (const QModelIndex& theIndex)
932{
933 Handle(AIS_InteractiveObject) aPresentation;
934
935 QModelIndexList anIndices;
936 anIndices.append (theIndex);
937 AIS_ListOfInteractive aDisplayed;
938 findPresentations (anIndices, aDisplayed);
939 if (!aDisplayed.IsEmpty())
940 aPresentation = aDisplayed.First();
941
942 return aPresentation;
943}
944
945// =======================================================================
946// function : findPresentations
947// purpose :
948// =======================================================================
949void DFBrowser_Window::findPresentations (const QModelIndexList& theIndices, AIS_ListOfInteractive& thePresentations)
950{
951 for (int anIndexId = 0, aCount = theIndices.size(); anIndexId < aCount; anIndexId++)
952 {
953 Handle(AIS_InteractiveObject) aPresentation;
954 Handle(TDF_Attribute) anAttribute = myModule->FindAttribute (theIndices[anIndexId]);
955 if (anAttribute.IsNull())
956 continue;
957 DFBrowserPane_AttributePaneAPI* anAttributePane = myModule->GetAttributePane (anAttribute);
958 if (!anAttributePane)
959 continue;
960 aPresentation = Handle(AIS_InteractiveObject)::DownCast (anAttributePane->GetPresentation (anAttribute));
961 if (aPresentation.IsNull())
962 continue;
963
964 thePresentations.Append (aPresentation);
965 }
966}
967
968// =======================================================================
969// function : setExpanded
970// purpose :
971// =======================================================================
972void DFBrowser_Window::setExpanded (QTreeView* theTreeView, const QModelIndex& theIndex, const bool isExpanded,
973 int& theLevels)
974{
975 bool isToExpand = theLevels == -1 || theLevels > 0;
976 if (!isToExpand)
977 return;
978
979 theTreeView->setExpanded (theIndex, isExpanded);
980 if (theLevels != -1)
981 theLevels--;
982
983 QAbstractItemModel* aModel = theTreeView->model();
984 for (int aRowId = 0, aRows = aModel->rowCount (theIndex); aRowId < aRows; aRowId++)
985 {
986 int aLevels = theLevels;
987 setExpanded (theTreeView, aModel->index (aRowId, 0, theIndex), isExpanded, aLevels);
988 }
989}