0029025: TInspector include files are not installed to inc directory by CMake
[occt.git] / tools / DFBrowser / DFBrowser_AttributePaneStack.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/DFBrowser_AttributePaneStack.hxx>
17
18 #include <inspector/DFBrowserPane_AttributePaneAPI.hxx>
19 #include <inspector/DFBrowserPane_AttributePaneSelector.hxx>
20 #include <inspector/DFBrowser_Item.hxx>
21 #include <inspector/DFBrowser_Module.hxx>
22 #include <inspector/DFBrowser_Tools.hxx>
23 #include <inspector/DFBrowser_TreeLevelView.hxx>
24 #include <inspector/DFBrowser_TreeModel.hxx>
25 #include <inspector/DFBrowser_SearchView.hxx>
26 #include <inspector/DFBrowser_Window.hxx>
27
28 #include <TDF_Attribute.hxx>
29
30 #include <QItemSelectionModel>
31 #include <QMap>
32 #include <QStackedWidget>
33
34 // =======================================================================
35 // function : Constructor
36 // purpose :
37 // =======================================================================
38 DFBrowser_AttributePaneStack::DFBrowser_AttributePaneStack (QObject* theParent)
39 : QObject (theParent), myCurrentPane (0), myAttributesStack (0), myModule (0), myTreeLevelView (0),
40   mySearchView (0), myEmptyWidget (0), myPaneMode (DFBrowser_AttributePaneType_ItemView)
41 {
42   myPaneSelector = new DFBrowserPane_AttributePaneSelector (theParent);
43 }
44
45 // =======================================================================
46 // function : CreateWidget
47 // purpose :
48 // =======================================================================
49 void DFBrowser_AttributePaneStack::CreateWidget (QWidget* theParent)
50 {
51   myAttributesStack = new QStackedWidget (theParent);
52   DFBrowser_Window::SetWhiteBackground (myAttributesStack);
53   myEmptyWidget = new QWidget (theParent);
54   DFBrowser_Window::SetWhiteBackground (myEmptyWidget);
55
56   myAttributesStack->addWidget (myEmptyWidget);
57
58   myTreeLevelView = new DFBrowser_TreeLevelView (theParent);
59   myAttributesStack->addWidget (myTreeLevelView->GetControl());
60
61   mySearchView = new DFBrowser_SearchView (theParent);
62   myAttributesStack->addWidget (mySearchView->GetControl());
63
64   myAttributesStack->setCurrentWidget (myEmptyWidget);
65 }
66
67 // =======================================================================
68 // function : SetPaneMode
69 // purpose :
70 // =======================================================================
71 void DFBrowser_AttributePaneStack::SetPaneMode (const DFBrowser_AttributePaneType& theMode)
72 {
73   if (myPaneMode == theMode)
74     return;
75
76   myPaneMode = theMode;
77   if (myPaneMode == DFBrowser_AttributePaneType_SearchView)
78   {
79     //! clear highlight in tree model
80     DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
81     if (aModel && aModel->HasHighlighted())
82       aModel->SetHighlighted (QModelIndexList());
83     myAttributesStack->setCurrentWidget (mySearchView->GetControl());
84   }
85   else
86   {
87     QItemSelectionModel* aSelectionModel = myModule->GetOCAFViewSelectionModel();
88     QModelIndex anIndex = DFBrowser_Window::SingleSelected (aSelectionModel->selectedIndexes(), 0);
89     SetCurrentItem (anIndex);
90   }
91 }
92
93 // =======================================================================
94 // function : SetCurrentItem
95 // purpose :
96 // =======================================================================
97 void DFBrowser_AttributePaneStack::SetCurrentItem (const QModelIndex& theIndex)
98 {
99   if (myPaneMode != DFBrowser_AttributePaneType_ItemView)
100     return;
101
102   //! clear highlight in tree model
103   DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
104   if (aModel && aModel->HasHighlighted())
105     aModel->SetHighlighted (QModelIndexList());
106
107   myCurrentPane = 0;
108   QWidget* aWidget = 0;
109   TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (theIndex);
110   if (!anItemBase)
111     return;
112
113   if (DFBrowser_TreeLevelView::ProcessItem (theIndex))
114     aWidget = myTreeLevelView->GetControl();
115   else
116   {
117     DFBrowser_ItemPtr anItem = itemDynamicCast<DFBrowser_Item> (anItemBase);
118     if (!anItem)
119       return;
120
121     if (myAttributesStack->currentWidget() == myTreeLevelView->GetControl())
122       myTreeLevelView->ClearSelection();
123     Handle(TDF_Attribute) anAttribute = anItem->GetAttribute();
124     myCurrentPane = myModule->GetAttributePane (anAttribute);
125     
126     if (myCurrentPane)
127     {
128       aWidget = myCurrentPane->GetWidget (myAttributesStack, true);
129       if (aWidget)
130       {
131         int aWidgetIndex = myAttributesStack->indexOf (aWidget);
132         if (aWidgetIndex < 0)
133           myAttributesStack->addWidget (aWidget);
134       }
135       myCurrentPane->Init (anAttribute);
136
137       std::list<QItemSelectionModel*> aSelectionModels = myCurrentPane->GetSelectionModels();
138       myPaneSelector->SetCurrentSelectionModels (aSelectionModels);
139     }
140   }
141   myAttributesStack->setCurrentWidget (aWidget != NULL ? aWidget : myEmptyWidget);
142 }