0029018: Documentation - Provide user guide for Qt browser
[occt.git] / tools / DFBrowserPane / DFBrowserPane_TNamingUsedShapes.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/DFBrowserPane_TNamingUsedShapes.hxx>
17
18 #include <AIS_Shape.hxx>
19 #include <BRep_Builder.hxx>
20
21 #include <inspector/DFBrowserPane_AttributePaneModel.hxx>
22 #include <inspector/DFBrowserPane_AttributePaneSelector.hxx>
23 #include <inspector/DFBrowserPane_TableView.hxx>
24 #include <inspector/DFBrowserPane_Tools.hxx>
25
26 #include <TDF_Label.hxx>
27
28 #include <TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape.hxx>
29 #include <TNaming_NamedShape.hxx>
30 #include <TNaming_PtrRefShape.hxx>
31 #include <TNaming_RefShape.hxx>
32 #include <TNaming_UsedShapes.hxx>
33
34 #include <TopoDS_Compound.hxx>
35 #include <TopoDS_Shape.hxx>
36
37 #include <QItemSelectionModel>
38 #include <QTableView>
39 #include <QVariant>
40 #include <QWidget>
41
42 const int COLUMN_TYPE_WIDTH = 70;
43 const int COLUMN_POINTER_WIDTH = 90;
44 const int COLUMN_REFERENCE_WIDTH = 90;
45
46 // =======================================================================
47 // function : Constructor
48 // purpose :
49 // =======================================================================
50 DFBrowserPane_TNamingUsedShapes::DFBrowserPane_TNamingUsedShapes()
51 : DFBrowserPane_AttributePane()
52 {
53   getPaneModel()->SetColumnCount (4);
54   getPaneModel()->SetItalicColumns (QList<int>());
55
56   QList<QVariant> aValues;
57   aValues << "ShapeType" << "TShape" << "Label" << "RefShape";
58   getPaneModel()->SetHeaderValues (aValues, Qt::Horizontal);
59 }
60
61 // =======================================================================
62 // function : GetValues
63 // purpose :
64 // =======================================================================
65 void DFBrowserPane_TNamingUsedShapes::GetValues (const Handle(TDF_Attribute)& theAttribute, QList<QVariant>& theValues)
66 {
67   Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast (theAttribute);
68   if (anAttribute.IsNull())
69     return;
70
71   std::list<TCollection_AsciiString> aReferences;
72   if (myAttributeRefs.Find (anAttribute, aReferences))
73   {
74     QMap<TCollection_AsciiString, QList<QVariant> > anEntryValues;
75     QList<QVariant> aValues;
76     TNaming_DataMapOfShapePtrRefShape& aMap = anAttribute->Map();
77     for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (aMap); aRefIt.More(); aRefIt.Next())
78     {
79       TCollection_AsciiString anEntry = DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label());
80       aValues.clear();
81       TopoDS_Shape aShape = aRefIt.Key();
82       aValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::ToName (DB_SHAPE_TYPE, aShape.ShapeType()).ToCString()
83                                        : "EMPTY SHAPE");
84       aValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()->This()).ToCString() : "");
85       const TopoDS_Shape aValueShape = aRefIt.Value()->Shape();
86       aValues.append (!aValueShape.IsNull() ?
87                                     DFBrowserPane_Tools::GetPointerInfo (aValueShape.TShape()->This()).ToCString() : "");
88       anEntryValues[anEntry] = aValues;
89     }
90
91     for (std::list<TCollection_AsciiString>::const_iterator aRefIt = aReferences.begin(); aRefIt != aReferences.end(); aRefIt++)
92     {
93       aValues = anEntryValues[*aRefIt];
94       theValues << aValues[0] << aValues[1] << QString ((*aRefIt).ToCString()) << aValues[2];
95     }
96   }
97   else
98   {
99     TNaming_DataMapOfShapePtrRefShape& aMap = anAttribute->Map();
100     for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (aMap); aRefIt.More(); aRefIt.Next())
101     {
102       TopoDS_Shape aShape = aRefIt.Key();
103       theValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::ToName (DB_SHAPE_TYPE, aShape.ShapeType()).ToCString()
104                                          : "EMPTY SHAPE");
105       theValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()->This()).ToCString() : "");
106       theValues.append (DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label()).ToCString());
107       const TopoDS_Shape aValueShape = aRefIt.Value()->Shape();
108       theValues.append (!aValueShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aValueShape.TShape()->This()).ToCString() : "");
109     }
110   }
111 }
112
113 // =======================================================================
114 // function : GetAttributeInfo
115 // purpose :
116 // =======================================================================
117 QVariant DFBrowserPane_TNamingUsedShapes::GetAttributeInfo (const Handle(TDF_Attribute)& theAttribute, int theRole,
118                                                             int theColumnId)
119 {
120   if (theColumnId != 0)
121     return DFBrowserPane_AttributePane::GetAttributeInfo (theAttribute, theRole, theColumnId);
122
123   switch (theRole)
124   {
125     case Qt::ForegroundRole: return QColor (myAttributeRefs.IsEmpty() ? Qt::gray : Qt::black);
126     case Qt::ToolTipRole:
127       return QVariant (myAttributeRefs.IsEmpty() ? QString (QObject::tr ("Content is not sorted yet")) : "");
128     default:
129       break;
130   }
131   return DFBrowserPane_AttributePane::GetAttributeInfo (theAttribute, theRole, theColumnId);
132 }
133
134 // =======================================================================
135 // function : GetShortAttributeInfo
136 // purpose :
137 // =======================================================================
138 void DFBrowserPane_TNamingUsedShapes::GetShortAttributeInfo (const Handle(TDF_Attribute)& theAttribute,
139                                                              QList<QVariant>& theValues)
140 {
141   Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast (theAttribute);
142   if (anAttribute.IsNull())
143     return;
144
145   theValues.append (QString ("%1").arg (anAttribute->Map().Extent()));
146 }
147
148 // =======================================================================
149 // function : GetAttributeReferences
150 // purpose :
151 // =======================================================================
152 void DFBrowserPane_TNamingUsedShapes::GetAttributeReferences (const Handle(TDF_Attribute)& theAttribute,
153                                                               NCollection_List<Handle(TDF_Attribute)>& theRefAttributes,
154                                                               Handle(Standard_Transient)& /*theRefPresentation*/)
155 {
156   Handle(TNaming_UsedShapes) anAttribute = Handle(TNaming_UsedShapes)::DownCast (theAttribute);
157   if (anAttribute.IsNull())
158     return;
159
160   QStringList aSelectedEntries = DFBrowserPane_TableView::GetSelectedColumnValues (getTableView()->GetTableView(), 2);
161   if (aSelectedEntries.isEmpty())
162     return;
163
164   for (TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape aRefIt (anAttribute->Map()); aRefIt.More(); aRefIt.Next())
165   {
166     if (aSelectedEntries.contains (DFBrowserPane_Tools::GetEntry (aRefIt.Value()->Label()).ToCString()))
167       theRefAttributes.Append (aRefIt.Value()->NamedShape());
168   }
169 }
170
171 // =======================================================================
172 // function : getTableColumnWidths
173 // purpose :
174 // =======================================================================
175 QMap<int, int> DFBrowserPane_TNamingUsedShapes::getTableColumnWidths() const
176 {
177   QMap<int, int> aValues;
178   aValues[0] = COLUMN_TYPE_WIDTH; // "ShapeType"
179   aValues[1] = COLUMN_POINTER_WIDTH; // "Key_TShape"
180   aValues[2] = COLUMN_REFERENCE_WIDTH; // "Label Entry"
181   return aValues;
182 }