1 // Copyright (c) 2020 OPEN CASCADE SAS
2 //
3 // This file is part of the examples of the Open CASCADE Technology software library.
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
21 
22 #include "ApplicationCommon.h"
23 
24 #include <Standard_WarningsDisable.hxx>
25 #include <QApplication>
26 #include <QDir>
27 #include <QFile>
28 #include <QFont>
29 #include <QFrame>
30 #include <QGroupBox>
31 #include <QMap>
32 #include <QMdiArea>
33 #include <QMdiSubWindow>
34 #include <QMenuBar>
35 #include <QMessageBox>
36 #include <QPair>
37 #include <QSplitter>
38 #include <QStatusBar>
39 #include <QtGlobal>
40 #include <QHBoxLayout>
41 #include <QVBoxLayout>
42 #include <QWidget>
43 #include <QDomDocument>
44 #include <QDomAttr>
45 #include <Standard_WarningsRestore.hxx>
46 
47 #include <OpenGl_GraphicDriver.hxx>
48 #include <OSD_Environment.hxx>
49 
50 #include <stdlib.h>
51 #include <memory>
52 
ApplicationCommonWindow(ApplicationType theCategory)53 ApplicationCommonWindow::ApplicationCommonWindow (ApplicationType theCategory)
54 : QMainWindow (nullptr),
55   myAppType(theCategory),
56   myStdToolBar (nullptr),
57   myViewBar (nullptr),
58   myCasCadeBar (nullptr),
59   myFilePopup (nullptr),
60   myCategoryPopup (nullptr)
61 {
62   ALL_CATEGORIES[AppType_Geometry] = "Geometry";
63   ALL_CATEGORIES[AppType_Topology] = "Topology";
64   ALL_CATEGORIES[AppType_Triangulation] = "Triangulation";
65   ALL_CATEGORIES[AppType_DataExchange] = "DataExchange";
66   ALL_CATEGORIES[AppType_Ocaf] = "OCAF";
67   ALL_CATEGORIES[AppType_Viewer3d] = "3D viewer";
68   ALL_CATEGORIES[AppType_Viewer2d] = "2D Viewer";
69 
70   mySampleMapper   = new QSignalMapper(this);
71   myExchangeMapper = new QSignalMapper(this);
72   myOcafMapper     = new QSignalMapper(this);
73   myViewer3dMapper = new QSignalMapper(this);
74   myViewer2dMapper = new QSignalMapper(this);
75 
76   myCategoryMapper = new QSignalMapper(this);
77 
78   connect(mySampleMapper,   SIGNAL(mapped(const QString &)), this, SLOT(onProcessSample(const QString &)));
79   connect(myExchangeMapper, SIGNAL(mapped(const QString &)), this, SLOT(onProcessExchange(const QString &)));
80   connect(myOcafMapper,     SIGNAL(mapped(const QString &)), this, SLOT(onProcessOcaf(const QString &)));
81   connect(myViewer3dMapper, SIGNAL(mapped(const QString &)), this, SLOT(onProcessViewer3d(const QString &)));
82   connect(myViewer2dMapper, SIGNAL(mapped(const QString &)), this, SLOT(onProcessViewer2d(const QString &)));
83 
84   connect(myCategoryMapper, SIGNAL(mapped(const QString &)), this, SLOT(onChangeCategory(const QString &)));
85 
86   setFocusPolicy(Qt::StrongFocus);
87 
88   QFont aCodeViewFont;
89   aCodeViewFont.setFamily("Courier");
90   aCodeViewFont.setFixedPitch(true);
91   aCodeViewFont.setPointSize(10);
92 
93   QGroupBox* aCodeFrame = new QGroupBox(tr("Sample code"));
94   QVBoxLayout* aCodeLayout = new QVBoxLayout(aCodeFrame);
95   aCodeLayout->setContentsMargins(3, 3, 3, 3);
96   myCodeView = new QTextEdit(aCodeFrame);
97   aCodeLayout->addWidget(myCodeView);
98   myCodeView->setDocumentTitle("Code");
99   myCodeView->setLineWrapMode(QTextEdit::NoWrap);
100   myCodeView->setReadOnly(true);
101   myCodeView->setFont(aCodeViewFont);
102   myCodeViewHighlighter = new OcctHighlighter(myCodeView->document());
103 
104   QGroupBox* aResultFrame = new QGroupBox(tr("Output"));
105   QVBoxLayout* aResultLayout = new QVBoxLayout(aResultFrame);
106   aResultLayout->setContentsMargins(3, 3, 3, 3);
107   myResultView = new QTextEdit(aResultFrame);
108   aResultLayout->addWidget(myResultView);
109   myResultView->setDocumentTitle("Output");
110   myResultView->setReadOnly(true);
111   myResultView->setFont(aCodeViewFont);
112 
113   QSplitter* aCodeResultSplitter = new QSplitter(Qt::Vertical);
114   aCodeResultSplitter->addWidget(aCodeFrame);
115   aCodeResultSplitter->addWidget(aResultFrame);
116 
117   myDocument3d = createNewDocument();
118   myDocument2d = createNewDocument();
119 
120   QFrame* aViewFrame = new QFrame;
121   aViewFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken);
122   aViewFrame->setLineWidth(3);
123   QVBoxLayout* aViewLayout = new QVBoxLayout(aViewFrame);
124   aViewLayout->setContentsMargins(0, 0, 0, 0);
125   myGeomWidget = new GeomWidget(myDocument3d, myDocument2d, aViewFrame);
126   aViewLayout->addWidget(myGeomWidget);
127 
128   myGeomWidget->setContentsMargins(0, 0, 0, 0);
129   QSplitter* aGeomTextSplitter = new QSplitter(Qt::Horizontal);
130 
131   aGeomTextSplitter->addWidget(aViewFrame);
132   aGeomTextSplitter->addWidget(aCodeResultSplitter);
133   aGeomTextSplitter->setStretchFactor(0, 1);
134   aGeomTextSplitter->setStretchFactor(1, 1);
135   QList<int> aSizeList;
136   aSizeList.append(640);
137   aSizeList.append(640);
138   aGeomTextSplitter->setSizes(aSizeList);
139   setCentralWidget(aGeomTextSplitter);
140 
141 #include <Standard_WarningsDisable.hxx>
142   Q_INIT_RESOURCE(Samples);
143 #include <Standard_WarningsRestore.hxx>
144 
145   TCollection_AsciiString aSampleSourcePach = getSampleSourceDir();
146   myGeometrySamples      = new GeometrySamples(aSampleSourcePach,
147                                                myDocument3d->getContext());
148   myTopologySamples      = new TopologySamples(aSampleSourcePach,
149                                                myDocument3d->getContext());
150   myTriangulationSamples = new TriangulationSamples(aSampleSourcePach,
151                                                     myDocument3d->getContext());
152   myDataExchangeSamples  = new DataExchangeSamples(aSampleSourcePach,
153                                                    myGeomWidget->Get3dView(),
154                                                    myDocument3d->getContext());
155   myOcafSamples          = new OcafSamples(aSampleSourcePach,
156                                            myDocument3d->getViewer(),
157                                            myDocument3d->getContext());
158   myViewer3dSamples      = new Viewer3dSamples(aSampleSourcePach,
159                                                myGeomWidget->Get3dView(),
160                                                myDocument3d->getContext());
161   myViewer2dSamples      = new Viewer2dSamples(aSampleSourcePach,
162                                                myGeomWidget->Get2dView(),
163                                                myDocument2d->getViewer(),
164                                                myDocument2d->getContext());
165 
166 
167   MenuFormXml(":/menus/Geometry.xml",      mySampleMapper,   myGeometryMenus);
168   MenuFormXml(":/menus/Topology.xml",      mySampleMapper,   myTopologyMenus);
169   MenuFormXml(":/menus/Triangulation.xml", mySampleMapper,   myTriangulationMenus);
170   MenuFormXml(":/menus/DataExchange.xml",  myExchangeMapper, myDataExchangeMenus);
171   MenuFormXml(":/menus/Ocaf.xml",          myOcafMapper,     myOcafMenus);
172   MenuFormXml(":/menus/Viewer3d.xml",      myViewer3dMapper, myViewer3dMenus);
173   MenuFormXml(":/menus/Viewer2d.xml",      myViewer2dMapper, myViewer2dMenus);
174 
175   onChangeCategory(ALL_CATEGORIES[myAppType]);
176 
177   resize(1280, 560);
178 }
179 
RebuildMenu()180 void ApplicationCommonWindow::RebuildMenu()
181 {
182   menuBar()->clear();
183 
184   myStdActions[StdActions_FileQuit] = CreateAction("Quit", "CTRL+Q");
185   connect(myStdActions[StdActions_FileQuit], SIGNAL(triggered()), this, SLOT(onCloseAllWindows()));
186   myStdActions[StdActions_HelpAbout] = CreateAction("About", "F1", ":/icons/help.png");
187   connect(myStdActions[StdActions_HelpAbout], SIGNAL(triggered()), this, SLOT(onAbout()));
188 
189   // populate a menu with all actions
190   myFilePopup = new QMenu(this);
191   myFilePopup = menuBar()->addMenu(tr("&File"));
192   myFilePopup->addAction(myStdActions[StdActions_FileQuit]);
193 
194   myCategoryPopup = new QMenu(this);
195   myCategoryPopup = menuBar()->addMenu(tr("&Category"));
196 
197   foreach (ApplicationType aCategory, ALL_CATEGORIES.keys())
198   {
199     QString aCategoryName = ALL_CATEGORIES.value(aCategory);
200     QAction* anAction = myCategoryPopup->addAction(aCategoryName);
201     anAction->setText(aCategoryName);
202     myCategoryMapper->setMapping(anAction, aCategoryName);
203     connect(anAction, SIGNAL(triggered()), myCategoryMapper, SLOT(map()));
204     myCategoryPopup->addAction(anAction);
205     myCategoryActions.insert(aCategory, anAction);
206   }
207 
208   foreach (QMenu* aSampleMenu, GetCurrentMenus())
209   {
210     menuBar()->addMenu(aSampleMenu);
211   }
212 
213   // add a help menu
214   QMenu* aHelp = new QMenu(this);
215   menuBar()->addSeparator();
216   aHelp = menuBar()->addMenu(tr("&Help"));
217   aHelp->addAction(myStdActions[StdActions_HelpAbout]);
218 }
219 
Handle(BaseSample)220 Handle(BaseSample) ApplicationCommonWindow::GetCurrentSamples()
221 {
222   switch (myAppType)
223   {
224     case AppType_Geometry:      return myGeometrySamples;
225     case AppType_Topology:      return myTopologySamples;
226     case AppType_Triangulation: return myTriangulationSamples;
227     case AppType_DataExchange:  return myDataExchangeSamples;
228     case AppType_Ocaf:          return myOcafSamples;
229     case AppType_Viewer2d:      return myViewer2dSamples;
230     case AppType_Viewer3d:      return myViewer3dSamples;
231     case AppType_Unknown:
232       break;
233   }
234   throw QString("Unknown Application type");
235 }
236 
GetCurrentMenus()237 const QList<QMenu*>& ApplicationCommonWindow::GetCurrentMenus()
238 {
239   switch (myAppType)
240   {
241     case AppType_Geometry:      return myGeometryMenus;
242     case AppType_Topology:      return myTopologyMenus;
243     case AppType_Triangulation: return myTriangulationMenus;
244     case AppType_DataExchange:  return myDataExchangeMenus;
245     case AppType_Ocaf:          return myOcafMenus;
246     case AppType_Viewer2d:      return myViewer2dMenus;
247     case AppType_Viewer3d:      return myViewer3dMenus;
248     case AppType_Unknown:
249       break;
250   }
251   throw QString("Unknown Application type");
252 }
253 
createNewDocument()254 DocumentCommon* ApplicationCommonWindow::createNewDocument()
255 {
256   return new DocumentCommon(this);
257 }
258 
onChangeCategory(const QString & theCategory)259 void ApplicationCommonWindow::onChangeCategory(const QString& theCategory)
260 {
261   myAppType = ALL_CATEGORIES.key(theCategory);
262   setWindowTitle(ALL_CATEGORIES[myAppType]);
263 
264   myOcafSamples->ClearExtra();
265   myViewer3dSamples->ClearExtra();
266   myViewer2dSamples->ClearExtra();
267 
268   GetCurrentSamples()->Clear();
269   myDocument3d->Clear();
270   myDocument2d->Clear();
271 
272   myCodeView->setPlainText("");
273   myResultView->setPlainText("");
274   GetCurrentSamples()->AppendCube();
275   myDocument3d->SetObjects(GetCurrentSamples()->Get3dObjects());
276   myGeomWidget->FitAll();
277 
278   RebuildMenu();
279 
280   switch (myAppType)
281   {
282     case AppType_DataExchange:
283     {
284       myDataExchangeSamples->AppendBottle();
285       myDocument3d->SetObjects(GetCurrentSamples()->Get3dObjects());
286       myGeomWidget->Show3d();
287       break;
288     }
289     case AppType_Ocaf:
290     {
291       onProcessOcaf("CreateOcafDocument");
292       myGeomWidget->Show3d();
293       break;
294     }
295     case AppType_Viewer2d:
296     {
297       myGeomWidget->Show2d();
298       break;
299     }
300     case AppType_Viewer3d:
301     {
302       myViewer3dSamples->AppendBottle();
303       myDocument3d->SetObjects(GetCurrentSamples()->Get3dObjects());
304       myGeomWidget->Show3d();
305       break;
306     }
307     case AppType_Geometry:
308     case AppType_Topology:
309     case AppType_Triangulation:
310     case AppType_Unknown:
311     {
312       break;
313     }
314   }
315 }
316 
onAbout()317 void ApplicationCommonWindow::onAbout()
318 {
319   QMessageBox::information(this, tr("OCCT Overview"),
320     tr("Qt based application to study OpenCASCADE Technology"),
321     tr("Ok"), QString::null, QString::null, 0, 0);
322 }
323 
getSampleSourceDir()324 TCollection_AsciiString ApplicationCommonWindow::getSampleSourceDir()
325 {
326   TCollection_AsciiString aSampleSourceDir = OSD_Environment("CSF_OCCTOverviewSampleCodePath").Value();
327   if (aSampleSourceDir.IsEmpty())
328   {
329     TCollection_AsciiString aCasRoot = OSD_Environment("CASROOT").Value();
330     if (!aCasRoot.IsEmpty())
331     {
332       aSampleSourceDir = aCasRoot + "/samples/OCCTOverview/code";
333     }
334   }
335   return aSampleSourceDir;
336 }
337 
CreateAction(const QString & theActionName,const QString & theShortcut,const QString & theIconName)338 QAction* ApplicationCommonWindow::CreateAction (const QString& theActionName,
339                                                 const QString& theShortcut,
340                                                 const QString& theIconName)
341 {
342   QAction* aAction(NULL);
343   if (theIconName.isEmpty())
344   {
345     aAction = new QAction(theActionName, this);
346   }
347   else
348   {
349     QPixmap aIcon = QPixmap(theIconName);
350     aAction = new QAction(aIcon, theActionName, this);
351   }
352   aAction->setToolTip(theActionName);
353   aAction->setStatusTip(theActionName);
354   aAction->setShortcut(theShortcut);
355 
356   return aAction;
357 }
358 
359 template <typename PointerToMemberFunction>
CreateSample(PointerToMemberFunction theHandlerMethod,const char * theActionName)360 QAction* ApplicationCommonWindow::CreateSample (PointerToMemberFunction theHandlerMethod,
361                                                 const char* theActionName)
362 {
363   QAction* anAction = new QAction(QObject::tr(theActionName), this);
364   connect(anAction, SIGNAL(triggered()), this, SLOT(theHandlerMethod()));
365   return anAction;
366 }
367 
resizeEvent(QResizeEvent * e)368 void ApplicationCommonWindow::resizeEvent(QResizeEvent* e)
369 {
370   QMainWindow::resizeEvent(e);
371   statusBar()->setSizeGripEnabled(!isMaximized());
372 }
373 
onProcessSample(const QString & theSampleName)374 void ApplicationCommonWindow::onProcessSample(const QString& theSampleName)
375 {
376   QApplication::setOverrideCursor(Qt::WaitCursor);
377   setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName);
378   GetCurrentSamples()->Process(theSampleName.toUtf8().data());
379   myDocument3d->SetObjects(GetCurrentSamples()->Get3dObjects());
380   myDocument2d->SetObjects(GetCurrentSamples()->Get2dObjects());
381   myCodeView->setPlainText(GetCurrentSamples()->GetCode().ToCString());
382   myResultView->setPlainText(GetCurrentSamples()->GetResult().ToCString());
383   myGeomWidget->FitAll();
384   QApplication::restoreOverrideCursor();
385 }
386 
onProcessExchange(const QString & theSampleName)387 void ApplicationCommonWindow::onProcessExchange(const QString& theSampleName)
388 {
389   setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName);
390   int aMode = 0;
391   QString aFileName = selectFileName(theSampleName, getDataExchangeDialog(theSampleName), aMode);
392   if (aFileName.isEmpty())
393   {
394     return;
395   }
396 
397   QApplication::setOverrideCursor(Qt::WaitCursor);
398   myDataExchangeSamples->SetFileName(aFileName.toUtf8().data());
399   myDataExchangeSamples->SetStepType(static_cast<STEPControl_StepModelType>(aMode));
400   myDataExchangeSamples->Process(theSampleName.toUtf8().data());
401   myDocument3d->SetObjects(myDataExchangeSamples->Get3dObjects());
402   myDocument2d->SetObjects(myDataExchangeSamples->Get2dObjects());
403   myCodeView->setPlainText(myDataExchangeSamples->GetCode().ToCString());
404   myResultView->setPlainText(myDataExchangeSamples->GetResult().ToCString());
405   myGeomWidget->FitAll();
406   QApplication::restoreOverrideCursor();
407 }
408 
onProcessOcaf(const QString & theSampleName)409 void ApplicationCommonWindow::onProcessOcaf(const QString& theSampleName)
410 {
411   setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName);
412 
413   if (theSampleName.indexOf("Dialog") == 0)
414   {
415     int aMode = 0; // not used
416     QString aFileName = selectFileName(theSampleName, getOcafDialog(theSampleName), aMode);
417     if (aFileName.isEmpty())
418     {
419       return;
420     }
421     myOcafSamples->SetFileName(aFileName.toUtf8().data());
422   }
423   QApplication::setOverrideCursor(Qt::WaitCursor);
424   myOcafSamples->Process(theSampleName.toUtf8().data());
425   myDocument2d->SetObjects(myOcafSamples->Get2dObjects());
426   myCodeView->setPlainText(myOcafSamples->GetCode().ToCString());
427   myResultView->setPlainText(myOcafSamples->GetResult().ToCString());
428   QApplication::restoreOverrideCursor();
429 }
430 
onProcessViewer3d(const QString & theSampleName)431 void ApplicationCommonWindow::onProcessViewer3d(const QString& theSampleName)
432 {
433   setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName);
434 
435   QApplication::setOverrideCursor(Qt::WaitCursor);
436   myViewer3dSamples->Process(theSampleName.toUtf8().data());
437   myCodeView->setPlainText(myViewer3dSamples->GetCode().ToCString());
438   myResultView->setPlainText(myViewer3dSamples->GetResult().ToCString());
439   myGeomWidget->FitAll();
440   QApplication::restoreOverrideCursor();
441 }
442 
onProcessViewer2d(const QString & theSampleName)443 void ApplicationCommonWindow::onProcessViewer2d(const QString& theSampleName)
444 {
445   setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName);
446 
447   Standard_Boolean anIsFileSample = Viewer2dSamples::IsFileSample(theSampleName.toUtf8().data());
448   QString aFileName;
449   if (anIsFileSample)
450   {
451     int aMode = 0; // not used
452     aFileName = selectFileName(theSampleName, getOcafDialog(theSampleName), aMode);
453     if (aFileName.isEmpty())
454     {
455       return;
456     }
457 
458     myViewer2dSamples->SetFileName(aFileName.toUtf8().data());
459   }
460   if (!anIsFileSample || (anIsFileSample && !aFileName.isEmpty()))
461   {
462     QApplication::setOverrideCursor(Qt::WaitCursor);
463     myViewer2dSamples->Process(theSampleName.toUtf8().data());
464     if (!Viewer2dSamples::IsShadedSample(theSampleName.toUtf8().data()))
465     {
466       myDocument2d->SetObjects(myViewer2dSamples->Get2dObjects(), Standard_False);
467     }
468     else
469     {
470       myDocument2d->SetObjects(myViewer2dSamples->Get2dObjects(), Standard_True);
471     }
472     myCodeView->setPlainText(myViewer2dSamples->GetCode().ToCString());
473     myResultView->setPlainText(myViewer2dSamples->GetResult().ToCString());
474     myGeomWidget->Show2d();
475     QApplication::restoreOverrideCursor();
476   }
477   else
478   {
479     myResultView->setPlainText("No file selected!");
480   }
481 }
482 
selectFileName(const QString & theSampleName,TranslateDialog * theDialog,int & theMode)483 QString ApplicationCommonWindow::selectFileName(const QString& theSampleName,
484                                                 TranslateDialog* theDialog, int& theMode)
485 {
486   Q_UNUSED(theSampleName)
487 
488   std::shared_ptr<TranslateDialog> aDialog(theDialog);
489 
490   int ret = aDialog->exec();
491   theMode = aDialog->getMode();
492 
493   qApp->processEvents();
494 
495   QString aFilename;
496   QStringList aFileNameList;
497   if (ret != QDialog::Accepted)
498   {
499     return aFilename;
500   }
501   aFileNameList = aDialog->selectedFiles();
502   if (!aFileNameList.isEmpty())
503   {
504     aFilename = aFileNameList[0];
505   }
506 
507   if (!QFileInfo(aFilename).completeSuffix().length())
508   {
509     QString selFilter = aDialog->selectedNameFilter();
510     int idx = selFilter.indexOf("(*.");
511     if (idx != -1)
512     {
513       QString tail = selFilter.mid(idx + 3);
514       idx = tail.indexOf(" ");
515       if (idx == -1)
516       {
517         idx = tail.indexOf(")");
518       }
519       QString ext = tail.left(idx);
520       if (ext.length())
521       {
522         aFilename += QString(".") + ext;
523       }
524     }
525   }
526 
527   return aFilename;
528 }
529 
getDataExchangeDialog(const QString & theSampleName)530 TranslateDialog* ApplicationCommonWindow::getDataExchangeDialog(const QString& theSampleName)
531 {
532   TranslateDialog* aTranslateDialog = new TranslateDialog(this, 0, true);
533   TCollection_AsciiString aSampleName(theSampleName.toUtf8().data());
534 
535   if (DataExchangeSamples::IsExportSample(aSampleName))
536   {
537     aTranslateDialog->setWindowTitle("Export file");
538     aTranslateDialog->setFileMode(QFileDialog::AnyFile);
539     aTranslateDialog->setAcceptMode(QFileDialog::AcceptSave);
540   }
541   else if (DataExchangeSamples::IsImportSample(aSampleName))
542   {
543     aTranslateDialog->setWindowTitle("Import file");
544     aTranslateDialog->setFileMode(QFileDialog::ExistingFile);
545     aTranslateDialog->setAcceptMode(QFileDialog::AcceptOpen);
546   }
547   QString aFormatFilter;
548   if (DataExchangeSamples::IsBrepSample(aSampleName))
549   {
550     aFormatFilter = "BREP Files(*.brep *.rle)";
551   }
552   else if (DataExchangeSamples::IsStepSample(aSampleName))
553   {
554     aFormatFilter = "STEP Files (*.stp *.step)";
555     aTranslateDialog->addMode(STEPControl_ManifoldSolidBrep, "Manifold Solid Brep");
556     aTranslateDialog->addMode(STEPControl_FacetedBrep, "Faceted Brep");
557     aTranslateDialog->addMode(STEPControl_ShellBasedSurfaceModel, "Shell Based Surface Model");
558     aTranslateDialog->addMode(STEPControl_GeometricCurveSet, "Geometric Curve Set");
559   }
560   else if (DataExchangeSamples::IsIgesSample(aSampleName))
561   {
562     aFormatFilter = "IGES Files (*.igs *.iges)";
563   }
564   else if (DataExchangeSamples::IsStlSample(aSampleName))
565   {
566     aFormatFilter = "STL Files (*.stl)";
567   }
568   else if (DataExchangeSamples::IsVrmlSample(aSampleName))
569   {
570     aFormatFilter = "VRML Files (*.vrml)";
571   }
572   else if (DataExchangeSamples::IsImageSample(aSampleName))
573   {
574     aFormatFilter = "All Image Files (*.bmp *.gif *.jpg *.jpeg *.png *.tga)";
575   }
576   QStringList aFilters;
577   aFilters.append(aFormatFilter);
578   aFilters.append("All Files(*.*)");
579 
580   aTranslateDialog->setNameFilters(aFilters);
581   aTranslateDialog->clear();
582   return aTranslateDialog;
583 }
584 
getOcafDialog(const QString & theSampleName)585 TranslateDialog* ApplicationCommonWindow::getOcafDialog(const QString& theSampleName)
586 {
587   TranslateDialog* aTranslateDialog = new TranslateDialog(this, 0, true);
588   TCollection_AsciiString aSampleName(theSampleName.toUtf8().data());
589 
590   if (OcafSamples::IsExportSample(aSampleName))
591   {
592     aTranslateDialog->setWindowTitle("Export file");
593     aTranslateDialog->setFileMode(QFileDialog::AnyFile);
594     aTranslateDialog->setAcceptMode(QFileDialog::AcceptSave);
595   }
596   else if (OcafSamples::IsImportSample(aSampleName))
597   {
598     aTranslateDialog->setWindowTitle("Import file");
599     aTranslateDialog->setFileMode(QFileDialog::ExistingFile);
600     aTranslateDialog->setAcceptMode(QFileDialog::AcceptOpen);
601   }
602   QStringList aFilters;
603   if (OcafSamples::IsBinarySample(aSampleName))
604   {
605     aFilters.append("Binary OCAF Sample (*.cbf)");
606   }
607   if (OcafSamples::IsXmlSample(aSampleName))
608   {
609     aFilters.append("XML OCAF Sample (*.xml)");
610   }
611   aFilters.append("All Files(*.*)");
612 
613   aTranslateDialog->setNameFilters(aFilters);
614   aTranslateDialog->clear();
615   return aTranslateDialog;
616 }
617 
MenuFromDomNode(QDomElement & theItemElement,QWidget * theParent,QSignalMapper * theMapper)618 QMenu* ApplicationCommonWindow::MenuFromDomNode(QDomElement& theItemElement,
619                                                 QWidget* theParent,
620                                                 QSignalMapper* theMapper)
621 {
622   QString anItemName        = theItemElement.attribute("name");
623   QMenu* aMenu = new QMenu(anItemName, theParent);
624   QDomElement anChildItemElement = theItemElement.firstChildElement("MenuItem");
625   QDomElement anSampleElement    = theItemElement.firstChildElement("Sample");
626 
627   while(anChildItemElement.isElement())
628   {
629     aMenu->addMenu(MenuFromDomNode(anChildItemElement, aMenu, theMapper));
630     anChildItemElement = anChildItemElement.nextSibling().toElement();
631   }
632 
633   while(anSampleElement.isElement())
634   {
635     QString aSampleName     = anSampleElement.attribute("name");
636     QString aSampleFunction = anSampleElement.attribute("function");
637     QAction* anAction = aMenu->addAction(aSampleFunction);
638     anAction->setText(aSampleName);
639     theMapper->setMapping(anAction, aSampleFunction);
640     connect(anAction, SIGNAL(triggered()), theMapper, SLOT(map()));
641     anSampleElement = anSampleElement.nextSibling().toElement();
642   }
643   return aMenu;
644 }
645 
MenuFormXml(const QString & thePath,QSignalMapper * theMapper,QList<QMenu * > & theMunusList)646 void ApplicationCommonWindow::MenuFormXml(const QString& thePath,
647                                           QSignalMapper* theMapper,
648                                           QList<QMenu*>& theMunusList)
649 {
650   QDomDocument aDomDocument;
651   theMunusList.clear();
652   QFile aXmlFile(thePath);
653   QString anErrorMessage;
654   if (aXmlFile.error() != QFile::NoError)
655   {
656     anErrorMessage = aXmlFile.errorString();
657     Message::SendFail() << "QFile creating error: " << anErrorMessage.toUtf8().constData();
658     aXmlFile.close();
659     return;
660   }
661   if (!aXmlFile.open(QIODevice::ReadOnly | QIODevice::Text))
662   {
663     Message::SendFail() << "File " << thePath.toUtf8().constData() << " could not open";
664     if (aXmlFile.error() != QFile::NoError)
665     {
666       anErrorMessage = aXmlFile.errorString();
667       Message::SendFail() << "QFile opening error: " << anErrorMessage.toUtf8().constData();
668     }
669     aXmlFile.close();
670     return;
671   }
672   bool aNamespaceProcessing(false);
673   QString anErrorMsg;
674   int anErrorLine(0);
675   int anErrorColumn(0);
676   if (!aDomDocument.setContent(&aXmlFile, aNamespaceProcessing, &anErrorMsg, &anErrorLine, &anErrorColumn))
677   {
678     Message::SendFail() << "XML file parsing error: " <<  anErrorMsg.toStdString()
679                         << " at line: " << anErrorLine << " column: " << anErrorColumn;
680     aXmlFile.close();
681     return;
682   }
683   aXmlFile.close();
684 
685   QDomElement aRootElement = aDomDocument.documentElement();
686   QDomElement anItemElement = aRootElement.firstChildElement("MenuItem");
687   while(!anItemElement.isNull())
688   {
689     theMunusList.push_back(MenuFromDomNode(anItemElement, this, theMapper));
690     anItemElement = anItemElement.nextSiblingElement("MenuItem");
691   }
692 }
693