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