0029018: Documentation - Provide user guide for Qt browser
[occt.git] / tools / DFBrowserPane / DFBrowserPane_TDataStdNamedData.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_TDataStdNamedData.hxx>
17
18 #include <inspector/DFBrowserPane_AttributePaneModel.hxx>
19 #include <inspector/DFBrowserPane_TableView.hxx>
20 #include <inspector/DFBrowserPane_Tools.hxx>
21
22 #include <TColStd_DataMapOfStringInteger.hxx>
23 #include <TColStd_DataMapIteratorOfDataMapOfStringInteger.hxx>
24 #include <TColStd_HArray1OfInteger.hxx>
25 #include <TColStd_HArray1OfReal.hxx>
26
27 #include <TDataStd_DataMapIteratorOfDataMapOfStringByte.hxx>
28 #include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger.hxx>
29 #include <TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal.hxx>
30 #include <TDataStd_DataMapIteratorOfDataMapOfStringReal.hxx>
31 #include <TDataStd_DataMapIteratorOfDataMapOfStringString.hxx>
32 #include <TDataStd_DataMapOfStringByte.hxx>
33 #include <TDataStd_DataMapOfStringHArray1OfInteger.hxx>
34 #include <TDataStd_DataMapOfStringReal.hxx>
35 #include <TDataStd_DataMapOfStringString.hxx>
36 #include <TDataStd_HDataMapOfStringHArray1OfInteger.hxx>
37 #include <TDataStd_NamedData.hxx>
38
39 #include <QTableView>
40 #include <QTabWidget>
41 #include <QVariant>
42 #include <QVBoxLayout>
43 #include <QWidget>
44
45 static const QString VALUES_INTEGER =    "values_integer";
46 static const QString VALUES_REAL =       "values_real";
47 static const QString VALUES_STRING =     "values_string";
48 static const QString VALUES_BYTE =       "values_byte";
49 static const QString VALUES_INT_ARRAY =  "values_int_array";
50 static const QString VALUES_REAL_ARRAY = "values_real_array";
51
52 // =======================================================================
53 // function : Constructor
54 // purpose :
55 // =======================================================================
56 DFBrowserPane_TDataStdNamedData::DFBrowserPane_TDataStdNamedData()
57  : DFBrowserPane_AttributePane(), myRealValues (0), myStringValues(0), myByteValues(0), myIntArrayValues(0),
58  myRealArrayValues(0)
59 {
60   myPaneModel = createPaneModel();
61   myRealValuesModel = createPaneModel();
62   myStringValuesModel = createPaneModel();
63   myByteValuesModel = createPaneModel();
64   myIntArrayValuesModel = createPaneModel();
65   myRealArrayModel = createPaneModel();
66 }
67
68 // =======================================================================
69 // function : createPaneModel
70 // purpose :
71 // =======================================================================
72 DFBrowserPane_AttributePaneModel* DFBrowserPane_TDataStdNamedData::createPaneModel()
73 {
74   DFBrowserPane_AttributePaneModel* aTableModel = new DFBrowserPane_AttributePaneModel();
75   aTableModel->SetColumnCount (2);
76   aTableModel->SetItalicColumns (QList<int>());
77   return aTableModel;
78 }
79
80 // =======================================================================
81 // function : CreateWidget
82 // purpose :
83 // =======================================================================
84 QWidget* DFBrowserPane_TDataStdNamedData::CreateWidget (QWidget* theParent)
85 {
86   QTabWidget* aMainWidget = new QTabWidget (theParent);
87   // gray text is visualized by default, better the black one (Qt4)
88   QPalette aPalette = aMainWidget->palette();
89   aPalette.setColor(QPalette::Foreground, Qt::black);
90   aMainWidget->setPalette (aPalette);
91
92   myTableView = new DFBrowserPane_TableView (aMainWidget);
93   myTableView->SetModel (getPaneModel());
94   aMainWidget->addTab (myTableView, "Integers");
95
96   myRealValues = new DFBrowserPane_TableView (aMainWidget);
97   myRealValues->SetModel (myRealValuesModel);
98   aMainWidget->addTab (myRealValues, "Reals");
99
100   myStringValues = new DFBrowserPane_TableView (aMainWidget);
101   myStringValues->SetModel (myStringValuesModel);
102   aMainWidget->addTab (myStringValues, "Strings");
103
104   myByteValues = new DFBrowserPane_TableView (aMainWidget);
105   myByteValues->SetModel (myByteValuesModel);
106   aMainWidget->addTab (myByteValues, "Bytes");
107
108   myIntArrayValues = new DFBrowserPane_TableView (aMainWidget);
109   myIntArrayValues->SetModel (myIntArrayValuesModel);
110   aMainWidget->addTab (myIntArrayValues, "ArraysOfIntegers");
111
112   myRealArrayValues = new DFBrowserPane_TableView (aMainWidget);
113   myRealArrayValues->SetModel (myRealArrayModel);
114   aMainWidget->addTab (myRealArrayValues, "ArraysOfReals");
115
116   return aMainWidget;
117 }
118
119 // =======================================================================
120 // function : Init
121 // purpose :
122 // =======================================================================
123 void DFBrowserPane_TDataStdNamedData::Init (const Handle(TDF_Attribute)& theAttribute)
124 {
125   QList<QVariant> aValues;
126   GetValues (theAttribute, aValues);
127
128   getPaneModel()->Init (getPartOfValues (VALUES_INTEGER, VALUES_REAL, aValues));
129   if (myTableView)
130     myTableView->GetTableView()->resizeColumnToContents (0);
131   myRealValuesModel->Init (getPartOfValues (VALUES_REAL, VALUES_STRING, aValues));
132   if (myRealValues)
133     myRealValues->GetTableView()->resizeColumnToContents (0);
134   myStringValuesModel->Init (getPartOfValues (VALUES_STRING, VALUES_BYTE, aValues));
135   if (myStringValues)
136     myStringValues->GetTableView()->resizeColumnToContents (0);
137   myByteValuesModel->Init (getPartOfValues (VALUES_BYTE, VALUES_INT_ARRAY, aValues));
138   if (myByteValues)
139     myByteValues->GetTableView()->resizeColumnToContents (0);
140   myIntArrayValuesModel->Init (getPartOfValues (VALUES_INT_ARRAY, VALUES_REAL_ARRAY, aValues));
141   if (myIntArrayValues)
142     myIntArrayValues->GetTableView()->resizeColumnToContents (0);
143   myRealArrayModel->Init (getPartOfValues (VALUES_REAL_ARRAY, "", aValues));
144   if (myRealArrayValues)
145     myRealArrayValues->GetTableView()->resizeColumnToContents (0);
146 }
147
148 // =======================================================================
149 // function : GetValues
150 // purpose :
151 // =======================================================================
152 void DFBrowserPane_TDataStdNamedData::GetValues (const Handle(TDF_Attribute)& theAttribute, QList<QVariant>& theValues)
153 {
154   Handle(TDataStd_NamedData) anAttribute = Handle(TDataStd_NamedData)::DownCast (theAttribute);
155   if (anAttribute.IsNull())
156     return;
157
158   theValues.append (VALUES_INTEGER);
159   for (TColStd_DataMapIteratorOfDataMapOfStringInteger anIntIter(anAttribute->GetIntegersContainer());
160        anIntIter.More(); anIntIter.Next())
161   {
162     theValues.append (DFBrowserPane_Tools::ToString (anIntIter.Key()));
163     theValues.append (anIntIter.Value());
164   }
165   theValues.append (VALUES_REAL);
166   for (TDataStd_DataMapIteratorOfDataMapOfStringReal aRealIter(anAttribute->GetRealsContainer());
167        aRealIter.More(); aRealIter.Next())
168   {
169     theValues.append (DFBrowserPane_Tools::ToString (aRealIter.Key()));
170     theValues.append (aRealIter.Value());
171   }
172   theValues.append (VALUES_STRING);
173   for (TDataStd_DataMapIteratorOfDataMapOfStringString aStrIter(anAttribute->GetStringsContainer());
174        aStrIter.More(); aStrIter.Next())
175   {
176     theValues.append (DFBrowserPane_Tools::ToString (aStrIter.Key()));
177     theValues.append (DFBrowserPane_Tools::ToString (aStrIter.Value()));
178   }
179   theValues.append (VALUES_BYTE);
180   for (TDataStd_DataMapIteratorOfDataMapOfStringByte aByteIter(anAttribute->GetBytesContainer());
181        aByteIter.More(); aByteIter.Next())
182   {
183     theValues.append (DFBrowserPane_Tools::ToString (aByteIter.Key()));
184     theValues.append (aByteIter.Value());
185   }
186   theValues.append (VALUES_INT_ARRAY);
187   QStringList anArrayValues;
188   for (TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger anIntArrayIter(anAttribute->GetArraysOfIntegersContainer());
189        anIntArrayIter.More(); anIntArrayIter.Next())
190   {
191     theValues.append (DFBrowserPane_Tools::ToString (anIntArrayIter.Key()));
192     anArrayValues.clear();
193     const Handle(TColStd_HArray1OfInteger)& aSubIt = anIntArrayIter.Value();
194     if (!aSubIt.IsNull())
195     {
196       for (Standard_Integer aLowerId = aSubIt->Lower(), i = aLowerId, anUpperId = aSubIt->Upper(); i <= anUpperId; i++)
197         anArrayValues.append (QString::number (aSubIt->Value (i)));
198     }
199     theValues.append (anArrayValues.join (QString (',')));
200   }
201   theValues.append (VALUES_REAL_ARRAY);
202   for (TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal aRealArrayIter (anAttribute->GetArraysOfRealsContainer());
203        aRealArrayIter.More(); aRealArrayIter.Next())
204   {
205     theValues.append (DFBrowserPane_Tools::ToString (aRealArrayIter.Key()));
206     anArrayValues.clear();
207     const Handle(TColStd_HArray1OfReal)& aSubIt = aRealArrayIter.Value();
208     if (!aSubIt.IsNull())
209     {
210       for (Standard_Integer aLowerId = aSubIt->Lower(), i = aLowerId, anUpperId = aSubIt->Upper(); i <= anUpperId; i++)
211         anArrayValues.append (QString::number (aSubIt->Value (i)));
212     }
213     theValues.append (anArrayValues.join (QString (',')));
214   }
215 }
216
217 // =======================================================================
218 // function : getPartOfValues
219 // purpose :
220 // =======================================================================
221 QList<QVariant> DFBrowserPane_TDataStdNamedData::getPartOfValues (const QString& theKey1, const QString& theKey2,
222                                                                   const QList<QVariant>& theValues) const
223 {
224   QList<QVariant> aValues;
225
226   bool aFoundKey1 = false, aFoundKey2 = false;
227   for (int aValueId = 0; aValueId < theValues.size() && !aFoundKey2; aValueId++)
228   {
229     QString aValue = theValues[aValueId].toString();
230     if (!aFoundKey1)
231       aFoundKey1 = aValue == theKey1;
232     else
233     {
234       aFoundKey2 = aValue == theKey2;
235       if (!aFoundKey2)
236         aValues.append (aValue);
237     }
238   }
239   return aValues;
240 }