0030268: Inspectors - improvements in VInspector plugin
authornds <nds@opencascade.com>
Fri, 31 Jan 2020 10:12:45 +0000 (13:12 +0300)
committerbugmaster <bugmaster@opencascade.com>
Wed, 12 Feb 2020 15:00:36 +0000 (18:00 +0300)
- Convert package creation. It is used to prepare some auxiliary presentations/methods to prepare variables for inspector based on occt classes.
- ViewControl package improvement:
  Classes for property view, table, table model are implemented to visualize view of properties.
  This view is filled by selection in tree if the selected object has implemented DumpJson functionality.
- TreeModel package improvements:
  Method InitColumn is implemented in TreeModel_TreeModel to fill default columns in base model. The default columns are:
    Name, Visibility, Rows. Additional columns should be added in successors.
  Container of root items is moved into the base class
- View package imrovements:
  Store preferences: display mode, fit all checked state and type of external context
  View_DisplayPreview is added to process preview for selected in tree view objects
  hide actions Clear, Multi, Single by default (as selection in tree view or Visibility state of item define which presentations should be displayed or erased)
- ShapeView plugin improvements:
  Property View content based on DumpJson (columns in tree view for properties are removed),
  Properties for TopoDS_Shape are displayed
  Explode shape action in tree view to see content of shape by selected shape type. Type of displayed shapes is only preview, it is not used in export action.
  Export shape into BREP. The previous implementation about BREP files in some directory and default view is removed.
- VInspector plugin imrovements:
  Property View content based on DumpJson (columns in tree view for properties are removed),
  Properties for AIS_InteractiveContext and AIS_InteractiveObject are displayed
  obsolete classes to provide properties are removed.
- DFBrowser plugin improvements:
  Property View content based on DumpJson is not used yet. But there is the USE_DUMPJSON macro. It's switch off by default.
  If switch ON, it creates a Property View filled with DumpJson. It's a way of DFBrowser moving on this property view.
  Init uses static variable CDF_Session::CurrentSession()->CurrentApplication to fill plugin if application in plugin is not set but OCAF application exists

- OCC_VERSION_HEX variable used for previous OCCT versions support (before 6.9.0 or 7.2.0) is removed

214 files changed:
tools/Convert/Convert_Tools.cxx [new file with mode: 0644]
tools/Convert/Convert_Tools.hxx [new file with mode: 0644]
tools/Convert/Convert_TransientShape.hxx [new file with mode: 0644]
tools/Convert/FILES [new file with mode: 0644]
tools/DFBrowser/DFBrowser_AttributePaneStack.cxx
tools/DFBrowser/DFBrowser_Communicator.hxx
tools/DFBrowser/DFBrowser_DumpView.hxx
tools/DFBrowser/DFBrowser_HighlightDelegate.hxx
tools/DFBrowser/DFBrowser_Item.cxx
tools/DFBrowser/DFBrowser_Item.hxx
tools/DFBrowser/DFBrowser_ItemApplication.hxx
tools/DFBrowser/DFBrowser_ItemBase.cxx
tools/DFBrowser/DFBrowser_ItemBase.hxx
tools/DFBrowser/DFBrowser_ItemDocument.hxx
tools/DFBrowser/DFBrowser_Module.cxx
tools/DFBrowser/DFBrowser_Module.hxx
tools/DFBrowser/DFBrowser_OpenApplication.cxx
tools/DFBrowser/DFBrowser_OpenApplication.hxx
tools/DFBrowser/DFBrowser_PropertyPanel.hxx
tools/DFBrowser/DFBrowser_SearchLine.hxx
tools/DFBrowser/DFBrowser_SearchLineModel.hxx
tools/DFBrowser/DFBrowser_SearchView.hxx
tools/DFBrowser/DFBrowser_Thread.cxx
tools/DFBrowser/DFBrowser_ThreadItemSearch.hxx
tools/DFBrowser/DFBrowser_TreeLevelLine.hxx
tools/DFBrowser/DFBrowser_TreeLevelLineDelegate.hxx
tools/DFBrowser/DFBrowser_TreeLevelLineModel.cxx
tools/DFBrowser/DFBrowser_TreeLevelLineModel.hxx
tools/DFBrowser/DFBrowser_TreeLevelView.hxx
tools/DFBrowser/DFBrowser_TreeLevelViewModel.cxx
tools/DFBrowser/DFBrowser_TreeLevelViewModel.hxx
tools/DFBrowser/DFBrowser_TreeModel.cxx
tools/DFBrowser/DFBrowser_TreeModel.hxx
tools/DFBrowser/DFBrowser_Window.cxx
tools/DFBrowser/DFBrowser_Window.hxx
tools/DFBrowserPane/DFBrowserPane.hxx [deleted file]
tools/DFBrowserPane/DFBrowserPane_AttributePane.cxx
tools/DFBrowserPane/DFBrowserPane_AttributePane.hxx
tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.cxx
tools/DFBrowserPane/DFBrowserPane_AttributePaneCreator.hxx
tools/DFBrowserPane/DFBrowserPane_AttributePaneCreatorAPI.hxx
tools/DFBrowserPane/DFBrowserPane_AttributePaneModel.hxx
tools/DFBrowserPane/DFBrowserPane_HelperExport.hxx
tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.cxx
tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNode.hxx
tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeItem.hxx
tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.cxx
tools/DFBrowserPane/DFBrowserPane_TDataStdTreeNodeModel.hxx
tools/DFBrowserPane/DFBrowserPane_TDocStdOwner.cxx
tools/DFBrowserPane/DFBrowserPane_TNamingNamedShape.cxx
tools/DFBrowserPane/DFBrowserPane_TNamingNaming.cxx
tools/DFBrowserPane/DFBrowserPane_TNamingUsedShapes.cxx
tools/DFBrowserPane/DFBrowserPane_TPrsStdAISPresentation.cxx
tools/DFBrowserPane/DFBrowserPane_TPrsStdAISViewer.cxx
tools/DFBrowserPane/DFBrowserPane_Tools.cxx
tools/DFBrowserPane/DFBrowserPane_Tools.hxx
tools/DFBrowserPane/FILES
tools/DFBrowserPaneXDE/DFBrowserPaneXDE_AttributeCommonPane.cxx
tools/DFBrowserPaneXDE/DFBrowserPaneXDE_AttributeCommonPane.hxx
tools/DFBrowserPaneXDE/DFBrowserPaneXDE_AttributePaneCreator.cxx
tools/DFBrowserPaneXDE/DFBrowserPaneXDE_AttributePaneCreator.hxx
tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocDatum.cxx
tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XCAFDocShapeMapTool.cxx
tools/DFBrowserPaneXDE/DFBrowserPaneXDE_XDEDRAW.cxx
tools/ShapeView/FILES
tools/ShapeView/ShapeView_Communicator.hxx
tools/ShapeView/ShapeView_ItemBase.hxx [deleted file]
tools/ShapeView/ShapeView_ItemRoot.cxx
tools/ShapeView/ShapeView_ItemRoot.hxx
tools/ShapeView/ShapeView_ItemShape.cxx
tools/ShapeView/ShapeView_ItemShape.hxx
tools/ShapeView/ShapeView_OpenFileDialog.hxx
tools/ShapeView/ShapeView_OpenFileViewModel.hxx
tools/ShapeView/ShapeView_Tools.cxx
tools/ShapeView/ShapeView_Tools.hxx
tools/ShapeView/ShapeView_TreeModel.cxx
tools/ShapeView/ShapeView_TreeModel.hxx
tools/ShapeView/ShapeView_VisibilityState.cxx
tools/ShapeView/ShapeView_VisibilityState.hxx
tools/ShapeView/ShapeView_Window.cxx
tools/ShapeView/ShapeView_Window.hxx
tools/TInspector/FILES
tools/TInspector/TInspector.qrc
tools/TInspector/TInspector_Communicator.hxx
tools/TInspector/TInspector_OpenButton.cxx [new file with mode: 0644]
tools/TInspector/TInspector_OpenButton.hxx [new file with mode: 0644]
tools/TInspector/TInspector_OpenFileDialog.cxx [new file with mode: 0644]
tools/TInspector/TInspector_OpenFileDialog.hxx [new file with mode: 0644]
tools/TInspector/TInspector_OpenFileViewModel.cxx [new file with mode: 0644]
tools/TInspector/TInspector_OpenFileViewModel.hxx [new file with mode: 0644]
tools/TInspector/TInspector_PluginParameters.hxx
tools/TInspector/TInspector_Preferences.hxx
tools/TInspector/TInspector_Window.cxx
tools/TInspector/TInspector_Window.hxx
tools/TInspector/icons/folder_export.png [new file with mode: 0644]
tools/TInspector/icons/folder_import.png [new file with mode: 0644]
tools/TInspector/icons/folder_open.png [new file with mode: 0644]
tools/TInspector/icons/item_algo_folder.png [deleted file]
tools/TInspectorAPI/FILES
tools/TInspectorAPI/TInspectorAPI_Communicator.hxx
tools/TInspectorAPI/TInspectorAPI_PluginParameters.cxx
tools/TInspectorAPI/TInspectorAPI_PluginParameters.hxx
tools/TInspectorAPI/TInspectorAPI_Version.hxx [deleted file]
tools/TInspectorEXE/EXTERNLIB
tools/TInspectorEXE/FILES
tools/TInspectorEXE/PACKAGES [deleted file]
tools/TInspectorEXE/TInspectorEXE.cxx
tools/TInspectorEXE/TInspectorEXE.qrc [deleted file]
tools/TInspectorEXE/TInspectorEXE_OpenFileDialog.cxx [deleted file]
tools/TInspectorEXE/TInspectorEXE_OpenFileDialog.hxx [deleted file]
tools/TInspectorEXE/TInspectorEXE_OpenFileViewModel.cxx [deleted file]
tools/TInspectorEXE/TInspectorEXE_OpenFileViewModel.hxx [deleted file]
tools/TInspectorEXE/icons/folder_export.png [deleted file]
tools/TInspectorEXE/icons/folder_import.png [deleted file]
tools/TInspectorEXE/icons/folder_open.png [deleted file]
tools/TKShapeView/EXTERNLIB
tools/TKTInspectorAPI/EXTERNLIB
tools/TKTInspectorAPI/PACKAGES
tools/TKToolsDraw/EXTERNLIB
tools/TKTreeModel/EXTERNLIB
tools/TKView/EXTERNLIB
tools/ToolsDraw/ToolsDraw.cxx
tools/ToolsDraw/ToolsDraw.hxx
tools/TreeModel/FILES
tools/TreeModel/TreeModel.hxx [deleted file]
tools/TreeModel/TreeModel_ContextMenu.hxx
tools/TreeModel/TreeModel_HeaderSection.hxx
tools/TreeModel/TreeModel_ItemBase.cxx
tools/TreeModel/TreeModel_ItemBase.hxx
tools/TreeModel/TreeModel_ItemProperties.cxx [new file with mode: 0644]
tools/TreeModel/TreeModel_ItemProperties.hxx [new file with mode: 0644]
tools/TreeModel/TreeModel_ItemStream.cxx [new file with mode: 0644]
tools/TreeModel/TreeModel_ItemStream.hxx [new file with mode: 0644]
tools/TreeModel/TreeModel_ModelBase.cxx
tools/TreeModel/TreeModel_ModelBase.hxx
tools/TreeModel/TreeModel_Tools.cxx
tools/TreeModel/TreeModel_Tools.hxx
tools/TreeModel/TreeModel_VisibilityState.cxx
tools/TreeModel/TreeModel_VisibilityState.hxx
tools/VInspector/FILES
tools/VInspector/VInspectorAPI_CallBack.cxx
tools/VInspector/VInspectorAPI_CallBack.hxx
tools/VInspector/VInspector_CallBack.cxx
tools/VInspector/VInspector_CallBack.hxx
tools/VInspector/VInspector_Communicator.hxx
tools/VInspector/VInspector_ItemBase.cxx
tools/VInspector/VInspector_ItemBase.hxx
tools/VInspector/VInspector_ItemContext.cxx
tools/VInspector/VInspector_ItemContext.hxx
tools/VInspector/VInspector_ItemEntityOwner.cxx [deleted file]
tools/VInspector/VInspector_ItemEntityOwner.hxx [deleted file]
tools/VInspector/VInspector_ItemFolderObject.cxx [deleted file]
tools/VInspector/VInspector_ItemFolderObject.hxx [deleted file]
tools/VInspector/VInspector_ItemHistoryElement.cxx
tools/VInspector/VInspector_ItemHistoryElement.hxx
tools/VInspector/VInspector_ItemHistoryRoot.cxx
tools/VInspector/VInspector_ItemHistoryRoot.hxx
tools/VInspector/VInspector_ItemHistoryType.cxx
tools/VInspector/VInspector_ItemHistoryType.hxx
tools/VInspector/VInspector_ItemPresentableObject.cxx
tools/VInspector/VInspector_ItemPresentableObject.hxx
tools/VInspector/VInspector_ItemSelectMgrFilter.cxx [deleted file]
tools/VInspector/VInspector_ItemSelectMgrFilter.hxx [deleted file]
tools/VInspector/VInspector_ItemSelection.cxx [deleted file]
tools/VInspector/VInspector_ItemSelection.hxx [deleted file]
tools/VInspector/VInspector_ItemSensitiveEntity.cxx [deleted file]
tools/VInspector/VInspector_ItemSensitiveEntity.hxx [deleted file]
tools/VInspector/VInspector_SelectionType.hxx [deleted file]
tools/VInspector/VInspector_ToolActionType.hxx
tools/VInspector/VInspector_ToolBar.cxx
tools/VInspector/VInspector_ToolBar.hxx
tools/VInspector/VInspector_Tools.cxx
tools/VInspector/VInspector_Tools.hxx
tools/VInspector/VInspector_ViewModel.cxx
tools/VInspector/VInspector_ViewModel.hxx
tools/VInspector/VInspector_ViewModelHistory.cxx
tools/VInspector/VInspector_ViewModelHistory.hxx
tools/VInspector/VInspector_Window.cxx
tools/VInspector/VInspector_Window.hxx
tools/View/FILES
tools/View/View.qrc
tools/View/View_DisplayActionType.hxx [new file with mode: 0644]
tools/View/View_DisplayPreview.cxx [new file with mode: 0644]
tools/View/View_DisplayPreview.hxx [new file with mode: 0644]
tools/View/View_Displayer.cxx
tools/View/View_Displayer.hxx
tools/View/View_PreviewParameters.cxx [new file with mode: 0644]
tools/View/View_PreviewParameters.hxx [new file with mode: 0644]
tools/View/View_ToolActionType.hxx
tools/View/View_ToolBar.cxx
tools/View/View_ToolBar.hxx
tools/View/View_Tools.cxx [deleted file]
tools/View/View_Tools.hxx [deleted file]
tools/View/View_Viewer.cxx
tools/View/View_Viewer.hxx
tools/View/View_Widget.cxx
tools/View/View_Widget.hxx
tools/View/View_Window.cxx
tools/View/View_Window.hxx
tools/View/icons/trihedron.png [new file with mode: 0644]
tools/ViewControl/FILES
tools/ViewControl/ViewControl_EditType.hxx [new file with mode: 0644]
tools/ViewControl/ViewControl_MessageDialog.hxx
tools/ViewControl/ViewControl_PropertyView.cxx [new file with mode: 0644]
tools/ViewControl/ViewControl_PropertyView.hxx [new file with mode: 0644]
tools/ViewControl/ViewControl_Table.cxx [new file with mode: 0644]
tools/ViewControl/ViewControl_Table.hxx [new file with mode: 0644]
tools/ViewControl/ViewControl_TableModel.cxx [new file with mode: 0644]
tools/ViewControl/ViewControl_TableModel.hxx [new file with mode: 0644]
tools/ViewControl/ViewControl_TableModelValues.cxx [new file with mode: 0644]
tools/ViewControl/ViewControl_TableModelValues.hxx [new file with mode: 0644]
tools/ViewControl/ViewControl_Tools.cxx
tools/ViewControl/ViewControl_Tools.hxx
tools/ViewControl/ViewControl_TreeView.hxx

diff --git a/tools/Convert/Convert_Tools.cxx b/tools/Convert/Convert_Tools.cxx
new file mode 100644 (file)
index 0000000..47b6407
--- /dev/null
@@ -0,0 +1,54 @@
+// Created on: 2020-01-25
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#include <inspector/Convert_Tools.hxx>
+#include <inspector/Convert_TransientShape.hxx>
+
+#include <BRep_Builder.hxx>
+#include <BRepTools.hxx>
+
+// =======================================================================
+// function : ReadShape
+// purpose :
+// =======================================================================
+TopoDS_Shape Convert_Tools::ReadShape (const TCollection_AsciiString& theFileName)
+{
+  TopoDS_Shape aShape;
+
+  BRep_Builder aBuilder;
+  BRepTools::Read (aShape, theFileName.ToCString(), aBuilder);
+  return aShape;
+}
+
+//=======================================================================
+//function : ConvertStreamToPresentations
+//purpose  :
+//=======================================================================
+void Convert_Tools::ConvertStreamToPresentations (const Standard_SStream&,
+                                                  const Standard_Integer,
+                                                  const Standard_Integer,
+                                                  NCollection_List<Handle(Standard_Transient)>&)
+{
+}
+
+//=======================================================================
+//function : ConvertStreamToColor
+//purpose  :
+//=======================================================================
+Standard_Boolean Convert_Tools::ConvertStreamToColor (const Standard_SStream&,
+                                                      Quantity_Color&)
+{
+  return Standard_False;
+}
diff --git a/tools/Convert/Convert_Tools.hxx b/tools/Convert/Convert_Tools.hxx
new file mode 100644 (file)
index 0000000..3145c77
--- /dev/null
@@ -0,0 +1,54 @@
+// Created on: 2020-01-25
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#ifndef Convert_Tools_H
+#define Convert_Tools_H
+
+#include <NCollection_List.hxx>
+#include <Quantity_Color.hxx>
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_SStream.hxx>
+#include <TCollection_AsciiString.hxx>
+#include <TopoDS_Shape.hxx> 
+
+//! \class Convert_Tools
+//! \brief The tool that gives auxiliary methods converting.
+class Convert_Tools
+{
+public:
+  //! Reads Shape using BREP reader
+  //! \param theFileName a file name
+  //! \return shape or NULL
+  Standard_EXPORT static TopoDS_Shape ReadShape (const TCollection_AsciiString& theFileName);
+
+
+  //! Creates shape presentations on the stream if possible. Tries to init some OCCT base for a new presentation
+  //! \param theStream source of presentation
+  //! \param thePresentations container to collect new presentations
+  Standard_EXPORT static void ConvertStreamToPresentations (const Standard_SStream& theSStream,
+                                                            const Standard_Integer theStartPos,
+                                                            const Standard_Integer theLastPos,
+                                                            NCollection_List<Handle(Standard_Transient)>& thePresentations);
+
+  //! Converts stream to color if possible. It processes Quantity_Color, Quantity_ColorRGBA
+  //! \param theStream source of presentation
+  //! \param theColor [out] converted color
+  //! \returns true if done
+  Standard_EXPORT static Standard_Boolean ConvertStreamToColor (const Standard_SStream& theSStream,
+                                                                Quantity_Color& theColor);
+};
+
+#endif
diff --git a/tools/Convert/Convert_TransientShape.hxx b/tools/Convert/Convert_TransientShape.hxx
new file mode 100644 (file)
index 0000000..b3e20b4
--- /dev/null
@@ -0,0 +1,51 @@
+// Created on: 2020-01-25
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#ifndef Convert_TransientShape_H
+#define Convert_TransientShape_H
+
+#include <Standard.hxx>
+#include <Standard_Handle.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_Type.hxx>
+#include <Standard_Transient.hxx>
+
+#include <TopoDS_Shape.hxx>
+
+//! \class Convert_TransientShape
+//! \brief An interface to covert a shape into a transient object to use it in arguments
+class Convert_TransientShape : public Standard_Transient
+{
+public:
+
+  //! Constructor
+  Convert_TransientShape (const TopoDS_Shape& theShape) { SetShape (theShape); }
+
+  //! Destructor
+  virtual ~Convert_TransientShape() {}
+
+  //! Returns current shape
+  const TopoDS_Shape Shape() const { return myShape; }
+
+  //! Fills current shape
+  void SetShape (const TopoDS_Shape& theShape) { myShape = theShape; }
+
+  DEFINE_STANDARD_RTTI_INLINE (Convert_TransientShape, Standard_Transient)
+
+private:
+  TopoDS_Shape myShape; //!< the shape
+};
+
+#endif 
diff --git a/tools/Convert/FILES b/tools/Convert/FILES
new file mode 100644 (file)
index 0000000..77362ef
--- /dev/null
@@ -0,0 +1,3 @@
+Convert_Tools.cxx
+Convert_Tools.hxx
+Convert_TransientShape.hxx
index e602209..10bd0fd 100644 (file)
@@ -80,7 +80,7 @@ void DFBrowser_AttributePaneStack::SetPaneMode (const DFBrowser_AttributePaneTyp
   myPaneMode = theMode;
   if (myPaneMode == DFBrowser_AttributePaneType_SearchView)
   {
-    //! clear highlight in tree model
+    // clear highlight in tree model
     DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
     if (aModel && aModel->HasHighlighted())
       aModel->SetHighlighted (QModelIndexList());
@@ -103,7 +103,7 @@ void DFBrowser_AttributePaneStack::SetCurrentItem (const QModelIndex& theIndex)
   if (myPaneMode != DFBrowser_AttributePaneType_ItemView)
     return;
 
-  //! clear highlight in tree model
+  // clear highlight in tree model
   DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
   if (aModel && aModel->HasHighlighted())
     aModel->SetHighlighted (QModelIndexList());
index a1c0b6c..8281348 100644 (file)
@@ -38,7 +38,7 @@ public:
   Standard_EXPORT DFBrowser_Communicator();
 
   //! Destructor
-  virtual ~DFBrowser_Communicator() Standard_OVERRIDE {}
+  virtual ~DFBrowser_Communicator() {}
 
   //! Provides the container with a parent where this container should be inserted.
   //! If Qt implementation, it should be QWidget with QLayout set inside
@@ -49,7 +49,7 @@ public:
   //! \param theParameters a parameters container
   Standard_EXPORT virtual void SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters) Standard_OVERRIDE;
 
-  //! Provide container for actions available in inspector on general level
+  //! Provides container for actions available in inspector on general level
   //! \param theMenu if Qt implementation, it is QMenu object
   Standard_EXPORT virtual void FillActionsMenu (void* theMenu) Standard_OVERRIDE { myWindow->FillActionsMenu (theMenu); }
 
index 95c35f8..a174c83 100644 (file)
@@ -38,14 +38,14 @@ public:
   DFBrowser_DumpView (QWidget* theParent) : QObject(theParent), myTextEdit( new QPlainTextEdit(theParent) ) {}
 
   //! Destructor
-  virtual ~DFBrowser_DumpView() Standard_OVERRIDE {}
+  virtual ~DFBrowser_DumpView() {}
 
   //! \return the text edit control
   QWidget* GetControl() const { return myTextEdit; }
 
 public slots:
 
-  //! Slots listen selection change and update the current control content by selection
+  //! Listens selection change and update the current control content by selection
   //! \param theSelected container of selected items
   //! \param theDeselected container of items that become deselected
   Standard_EXPORT void OnTreeViewSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
index 5106821..351154a 100644 (file)
@@ -33,9 +33,9 @@ public:
   DFBrowser_HighlightDelegate (QObject* theParent = 0) : QItemDelegate (theParent) {}
 
   //! Destructor
-  virtual ~DFBrowser_HighlightDelegate() Standard_OVERRIDE {}
+  virtual ~DFBrowser_HighlightDelegate() {}
 
-  //! Redefine of the parent virtual method to color the cell rectangle in highlight style
+  //! Redefines of the parent virtual method to color the cell rectangle in highlight style
   //! \param thePainter a painter
   //! \param theOption a paint options
   //! \param theIndex a view index
index 1f0ea22..28f482a 100644 (file)
@@ -31,6 +31,8 @@
 #include <QObject>
 #include <Standard_WarningsRestore.hxx>
 
+//#define USE_DUMPJSON
+
 // =======================================================================
 // function : hasAttribute
 // purpose :
@@ -147,6 +149,24 @@ QVariant DFBrowser_Item::initValue (const int theItemRole) const
   return DFBrowser_Module::GetAttributeInfo (GetAttribute(), GetModule(), theItemRole, Column());
 }
 
+// =======================================================================
+// function : initStream
+// purpose :
+// =======================================================================
+void DFBrowser_Item::initStream (Standard_OStream& theOStream) const
+{
+  if (!HasAttribute())
+    return;
+
+#ifdef USE_DUMPJSON
+  Handle(TDF_Attribute) anAttribute = GetAttribute();
+  if (!anAttribute.IsNull())
+    anAttribute->DumpJson (theOStream);
+#else
+  (void)theOStream;
+#endif
+}
+
 // =======================================================================
 // function : GetAttributeInfo
 // purpose :
index 5b9220c..c2d4b55 100644 (file)
@@ -38,14 +38,14 @@ class DFBrowser_Item : public DFBrowser_ItemBase
 public:
 
   //! Creates an item wrapped by a shared pointer
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
+  //! \param theRow the item row position in the parent item
+  //! \param theColumn the item column position in the parent item
   //! \return the pointer to the created item
   static DFBrowser_ItemPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
   { return DFBrowser_ItemPtr (new DFBrowser_Item (theParent, theRow, theColumn)); }
 
   //! Destructor
-  virtual ~DFBrowser_Item() Standard_OVERRIDE {};
+  virtual ~DFBrowser_Item() {}
 
   //! \return true if the attribute is set in the item, otherwise it is initialized by a label
   Standard_EXPORT bool HasAttribute() const;
@@ -59,7 +59,7 @@ public:
   //! Resets the cached item values, set null attribute and calls reset of the parent class
   Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
 
-  //! Init item and calls cachedValue() for the role
+  //! Inits item and calls cachedValue() for the role
   //! \param theItemRole a value role
   //! \return the value
   Standard_EXPORT QVariant GetAttributeInfo(int theRole) const;
@@ -69,21 +69,25 @@ protected:
   //! \return number of children.
   virtual int initRowCount() const Standard_OVERRIDE;
 
-  //! Return data value for the role:
+  //! Returns data value for the role:
   //! - if content is label, calls DFBrowser_ItemBase;
   //! - if content is attribute, if the fole is extended display, asks additional info text or ask module about info
   //! \param theItemRole a value role
   //! \return the value
   virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
 
+  //! Returns stream value of the item to fulfill property panel.
+  //! \return stream value or dummy
+  Standard_EXPORT virtual void initStream (Standard_OStream& theOStream) const Standard_OVERRIDE;
+
   //! Constructor
-  //! param theParent a parent item
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
+  //! \param theParent a parent item
+  //! \param theRow the item row position in the parent item
+  //! \param theColumn the item column position in the parent item
   DFBrowser_Item (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
     : DFBrowser_ItemBase (theParent, theRow, theColumn) {}
 
-  //! Initialize the current item. It creates a backup of the specific item information
+  //! Initializes the current item. It creates a backup of the specific item information
   void initItem() const;
 
   //! Sets the item attribute
index dbc675f..a50d503 100644 (file)
@@ -35,7 +35,7 @@ public:
   { return DFBrowser_ItemApplicationPtr (new DFBrowser_ItemApplication (theParent)); }
 
   //! Destructor
-  virtual ~DFBrowser_ItemApplication() Standard_OVERRIDE {};
+  virtual ~DFBrowser_ItemApplication() {}
 
   //! Sets the item label
   //! \param theLabel an object where the child items structure is found
@@ -67,7 +67,7 @@ protected:
 private:
 
   //! Constructor
-  //! param theParent a parent item
+  //! \param theParent a parent item
   DFBrowser_ItemApplication(TreeModel_ItemBasePtr theParent) : DFBrowser_ItemBase(theParent, 0, 0) {}
 
 private:
index 89d58b9..e1d696b 100644 (file)
@@ -113,7 +113,7 @@ QVariant DFBrowser_ItemBase::initValue (const int theItemRole) const
       if (DFBrowser_Tools::IsEmptyLabel(GetLabel()))
         aValue = QColor (Qt::lightGray);
       else
-      { //! TEMPORARY HERE : should be moved in the pane of TDataStd_Name kind of attribute
+      { // TEMPORARY HERE : should be moved in the pane of TDataStd_Name kind of attribute
         Handle(TDataStd_Name) aName;
         if (useAdditionalInfo() && myLabel.FindAttribute (TDataStd_Name::GetID(), aName))
           aValue = QColor (Qt::darkGreen);
index c1ef3b6..c87ca1d 100644 (file)
@@ -48,7 +48,7 @@ public:
   //! \return the current module
   DFBrowser_Module* GetModule() const { return myModule; }
 
-  //! Change using of additional information in item. It it does not use additional info,
+  //! Changes using of additional information in item. If it does not use additional info,
   //! it will not return extended text in initValue().
   //! \param theValue a new value
   //! \return the previous value
@@ -84,15 +84,15 @@ protected:
   //! \return the created item
   virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE;
 
-  //! Initialize the current item. It creates a backup of the specific item information
-  virtual void initItem() const {};
+  //! Initializes the current item. It creates a backup of the specific item information
+  virtual void initItem() const {}
 
 protected:
 
   //! Constructor
-  //! param theParent a parent item
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
+  //! \param theParent a parent item
+  //! \param theRow the item row position in the parent item
+  //! \param theColumn the item column position in the parent item
   DFBrowser_ItemBase (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn);
 
 private:
index 52b516a..3f5984d 100644 (file)
@@ -32,14 +32,14 @@ class DFBrowser_ItemDocument : public DFBrowser_ItemBase
 public:
 
   //! Creates an item wrapped by a shared pointer
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
+  //! \param theRow the item row position in the parent item
+  //! \param theColumn the item column position in the parent item
   //! \return the pointer to the created item
   static DFBrowser_ItemDocumentPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
   { return DFBrowser_ItemDocumentPtr (new DFBrowser_ItemDocument (theParent, theRow, theColumn)); }
 
   //! Destructor
-  virtual ~DFBrowser_ItemDocument() Standard_OVERRIDE {};
+  virtual ~DFBrowser_ItemDocument() {}
 
   //! Returns the current label
   //! \return a label
@@ -65,10 +65,10 @@ public:
 
 protected:
 
-  //! Initialize the current item. It is empty because Reset() is also empty.
+  //! Initializes the current item. It is empty because Reset() is also empty.
   virtual void initItem() const Standard_OVERRIDE;
 
-  //!
+  //! Initializes the current item. It creates a backup of the specific item information
   virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
 
 protected:
@@ -82,7 +82,7 @@ protected:
 private:
 
   //! Constructor
-  //! param theParent a parent item
+  //! \param theParent a parent item
   DFBrowser_ItemDocument(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
     : DFBrowser_ItemBase (theParent, theRow, theColumn) {}
 
index 2aff65e..ec353e7 100644 (file)
@@ -53,7 +53,9 @@ DFBrowser_Module::DFBrowser_Module()
 // =======================================================================
 void DFBrowser_Module::CreateViewModel (void* theParent)
 {
-  myOCAFViewModel = new DFBrowser_TreeModel ((QWidget*)theParent, this);
+  myOCAFViewModel = new DFBrowser_TreeModel ((QWidget*)theParent);
+  myOCAFViewModel->InitColumns();
+  myOCAFViewModel->SetModule (this);
 }
 
 // =======================================================================
@@ -152,7 +154,7 @@ DFBrowserPane_AttributePaneAPI* DFBrowser_Module::GetAttributePane (Handle(TDF_A
 // function : GetAttributePane
 // purpose :
 // =======================================================================
-DFBrowserPane_AttributePaneAPI* DFBrowser_Module::GetAttributePane (const Standard_CString& theAttributeName)
+DFBrowserPane_AttributePaneAPI* DFBrowser_Module::GetAttributePane (Standard_CString theAttributeName)
 {
   DFBrowserPane_AttributePaneAPI* aPane = 0;
 
@@ -197,7 +199,7 @@ QVariant DFBrowser_Module::GetAttributeInfo (Handle(TDF_Attribute) theAttribute,
 // function : GetAttributeInfo
 // purpose :
 // =======================================================================
-QVariant DFBrowser_Module::GetAttributeInfo (const Standard_CString& theAttributeName, DFBrowser_Module* theModule,
+QVariant DFBrowser_Module::GetAttributeInfo (Standard_CString theAttributeName, DFBrowser_Module* theModule,
                                              int theRole, int theColumnId)
 {
   DFBrowserPane_AttributePane* anAttributePane = 0;
@@ -222,7 +224,7 @@ QVariant DFBrowser_Module::GetAttributeInfo (const Standard_CString& theAttribut
 // function : CreateAttributePane
 // purpose :
 // =======================================================================
-DFBrowserPane_AttributePaneAPI* DFBrowser_Module::CreateAttributePane (const Standard_CString& theAttributeName)
+DFBrowserPane_AttributePaneAPI* DFBrowser_Module::CreateAttributePane (Standard_CString theAttributeName)
 {
   DFBrowserPane_AttributePaneAPI* aPane = 0;
   // iteration should be performed from the tail of the list, as latest added creator has
index e75fbb0..b8f2a48 100644 (file)
@@ -55,7 +55,7 @@ public:
   Standard_EXPORT DFBrowser_Module();
 
   //! Destructor
-  virtual ~DFBrowser_Module() Standard_OVERRIDE {};
+  virtual ~DFBrowser_Module() {}
 
   //! Creates tree model for OCAF application
   Standard_EXPORT void CreateViewModel (void* theParent);
@@ -85,7 +85,7 @@ public:
   //! \return an application instance
   Standard_EXPORT Handle(TDocStd_Application) GetTDocStdApplication() const;
 
-  //! Rebuild an OCAF tree view model
+  //! Rebuilds an OCAF tree view model
   Standard_EXPORT void UpdateTreeModel();
 
   //! Sets initial selection in OCAF tree view, it is an application(root) item
@@ -96,7 +96,7 @@ public:
   //! \return an attribute
   Standard_EXPORT Handle(TDF_Attribute) FindAttribute (const QModelIndex& theIndex);
 
-  //! Append creator of a pane by attribute type
+  //! Appends creator of a pane by attribute type
   //! \param thePaneCreator
   void RegisterPaneCreator (DFBrowserPane_AttributePaneCreatorAPI* thePaneCreator)
   { myPaneCreators.append (thePaneCreator); }
@@ -111,7 +111,7 @@ public:
   //! internal map and the module processes this kind of attribute
   //! \param theAttributeGUID an attribute key
   //! \return attribute pane
-  Standard_EXPORT DFBrowserPane_AttributePaneAPI* GetAttributePane (const Standard_CString& theAttributeName);
+  Standard_EXPORT DFBrowserPane_AttributePaneAPI* GetAttributePane (Standard_CString theAttributeName);
 
   //! Finds the attribute pane according to the give attribute and returns its information
   //! \param theAttribute a source attribute
@@ -127,7 +127,7 @@ public:
   //! \param theRole a role of information, used by tree model (e.g. DisplayRole, icon, background and so on)
   //! \param theColumnId a tree model column
   //! \return value, interpreted by tree model depending on the role
-  Standard_EXPORT static QVariant GetAttributeInfo (const Standard_CString& theAttributeName, DFBrowser_Module* theModule,
+  Standard_EXPORT static QVariant GetAttributeInfo (Standard_CString theAttributeName, DFBrowser_Module* theModule,
                                                     int theRole, int theColumnId);
 signals:
 
@@ -139,7 +139,7 @@ protected:
   //! Tries to create attribute pane for the attribute name using registered attribute pane creators
   //! \param theAttributeName a source attribute
   //! \return attribute pane or NULL
-  DFBrowserPane_AttributePaneAPI* CreateAttributePane (const Standard_CString& theAttributeName);
+  DFBrowserPane_AttributePaneAPI* CreateAttributePane (Standard_CString theAttributeName);
 
 private:
 
index 65785a7..f915f91 100644 (file)
@@ -19,7 +19,6 @@
 #include <BinLDrivers.hxx>
 #include <BinXCAFDrivers.hxx>
 #include <PCDM_ReadWriter.hxx>
-#include <Standard_Version.hxx>
 #include <StdDrivers.hxx>
 #include <StdLDrivers.hxx>
 #include <STEPCAFControl_Reader.hxx>
@@ -48,7 +47,6 @@ namespace DFBrowser_OpenApplication
       return anApplication;
     }
 
-#if OCC_VERSION_HEX > 0x060901
     // Load static variables for STEPCAF (ssv; 16.08.2012)
     STEPCAFControl_Controller::Init();
 
@@ -74,7 +72,6 @@ namespace DFBrowser_OpenApplication
     PCDM_ReaderStatus aStatus = anApplication->Open (theFileName, aDocument);
     if (aStatus != PCDM_RS_OK)
       return Handle(TDocStd_Application)();
-#endif
     return anApplication;
   }
 
index ccff708..4e13117 100644 (file)
@@ -24,7 +24,7 @@
 namespace DFBrowser_OpenApplication
 {
 
-  //! Open the application by the name.
+  //! Opens the application by the name.
   //! \param theFileName a name of the file initialized the application
   //! \param isSTEPFile an output parameter, true if the file name is a STEP file
   //! \return an opened application
index 1a55af7..acc8312 100644 (file)
@@ -41,7 +41,7 @@ public:
   Standard_EXPORT DFBrowser_PropertyPanel (QWidget* theParent);
 
   //! Destructor
-  virtual ~DFBrowser_PropertyPanel() Standard_OVERRIDE {}
+  virtual ~DFBrowser_PropertyPanel() {}
 
   //! Returns main control
   QWidget* GetControl() const { return myMainWindow; }
@@ -57,7 +57,7 @@ public:
                                                  const QItemSelection& theDeselected);
 private:
 
-  QWidget* myMainWindow; //! < parent of attribute stack control
-  DFBrowser_AttributePaneStack* myAttributesStack; //! < panes stack
+  QWidget* myMainWindow; //!< parent of attribute stack control
+  DFBrowser_AttributePaneStack* myAttributesStack; //!< panes stack
 };
 #endif
index 54c3ae1..91fc567 100644 (file)
@@ -47,7 +47,7 @@ public:
   Standard_EXPORT DFBrowser_SearchLine (QWidget* theParent);
 
   //! Destructor
-  virtual ~DFBrowser_SearchLine() Standard_OVERRIDE {}
+  virtual ~DFBrowser_SearchLine() {}
 
   //! Creates search line model filled by the module. It is necessary for auto completion of line edit
   //! \param theModule a current module
@@ -66,10 +66,10 @@ public:
   Standard_EXPORT void ClearValues();
 
   //! Returns completer model
-  Standard_EXPORT QAbstractItemModel* GetModel() { return myLineControl->completer()->model(); }
+  QAbstractItemModel* GetModel() { return myLineControl->completer()->model(); }
 
   //! Returns completion completer model
-  Standard_EXPORT QAbstractItemModel* GetCompletionModel() { return myLineControl->completer()->completionModel(); }
+  QAbstractItemModel* GetCompletionModel() { return myLineControl->completer()->completionModel(); }
 
   //! Returns the current line edit text
   QString Text() const { return myLineControl->text(); }
@@ -87,15 +87,17 @@ private slots:
 
   //! Updates icon of search button depending on text is empty and emits searchActivated signal
   void onTextChanged (const QString& theText);
-  //! Set completion prefix in completer model
+
+  //! Sets completion prefix in completer model
   void onReturnPressed() { myLineControl->completer()->setCompletionPrefix (myLineControl->text()); }
-  //! Set empty text if the current text is not empty: new search is started
+
+  //! Sets empty text if the current text is not empty: new search is started
   void onSearchButtonClicked();
 
 private:
 
   QLineEdit* myLineControl; //!< line editor control
-  QToolButton* mySearchButton; //! < search button
+  QToolButton* mySearchButton; //!< search button
 };
 
 #endif
index 3aeb9ea..b7e7363 100644 (file)
@@ -49,7 +49,7 @@ public:
   Standard_EXPORT DFBrowser_SearchLineModel (QObject* theParent, DFBrowser_Module* theModule);
 
   //! Destructor
-  virtual ~DFBrowser_SearchLineModel() Standard_OVERRIDE {}
+  virtual ~DFBrowser_SearchLineModel() {}
 
   //! Separator as attribute name is divided from the label entry in information text
   static QString SplitSeparator() { return ": "; }
@@ -87,7 +87,6 @@ public:
   //! Returns the data stored under the given role for the item referred to by the index.
   //! \param theIndex a model index
   //! \param theRole an enumeration value of role for data obtaining
-
   Standard_EXPORT virtual QVariant data (const QModelIndex& theIndex,
                                          int theRole = Qt::DisplayRole) const Standard_OVERRIDE;
   //! Returns the number of rows under the given parent.
@@ -96,10 +95,10 @@ public:
 
   virtual int rowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
   { (void)theParent; return myRowCount; }
+
   //! Returns the number of columns for the children of the given parent.
   //! \param theParent a parent model index
   //! \return the number of columns
-
   virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
   { (void)theParent; return 3; }
 
index dd5b482..8e4abdf 100644 (file)
@@ -41,7 +41,7 @@ public:
   Standard_EXPORT DFBrowser_SearchView (QWidget* theParent);
 
   //! Destructor
-  virtual ~DFBrowser_SearchView() Standard_OVERRIDE {}
+  virtual ~DFBrowser_SearchView() {}
 
   //! Returns search parent control
   QWidget* GetControl() const { return myMainWindow; }
index 00e6649..75996be 100644 (file)
@@ -34,7 +34,7 @@ public:
   DFBrowser_QThread (QObject* theParent) : QThread (theParent), myItem (0) {}
 
   //! Destructor
-  virtual ~DFBrowser_QThread() Standard_OVERRIDE {}
+  virtual ~DFBrowser_QThread() {}
 
   //! Sets thread item to be processed
   //! \param theItem a thread item
index 5b73d2b..674eedb 100644 (file)
@@ -48,10 +48,10 @@ public:
   //! internal containers for search functionality
   Standard_EXPORT virtual void Run() Standard_OVERRIDE;
 
-  //! Set filled containers into search line
+  //! Sets filled containers into search line
   Standard_EXPORT virtual void ApplyValues() Standard_OVERRIDE;
 
-  //! Clear search line values
+  //! Clears search line values
   Standard_EXPORT static void ClearValues (DFBrowser_SearchLine* theSearchLine);
 
 private:
@@ -73,7 +73,7 @@ private:
   void addLabel (const TDF_Label& theLabel, const QStringList& theCurrentPath,
                  QMap<QString, DFBrowser_SearchItemInfo>& theValues, QStringList& theInfoValues);
 
-  //! Add attribute information, it is either attribute kind or attribure value for TDataStd_Name or TDataStd_Comment
+  //! Adds attribute information, it is either attribute kind or attribure value for TDataStd_Name or TDataStd_Comment
   //! \parm theAttribute a current attribute
   //! \param theCurrentPath it contains the current path to the label (stores in container)
   //! \param theValues container of document item values
index 2de8bfe..7b305d5 100644 (file)
@@ -54,7 +54,7 @@ public:
   Standard_EXPORT DFBrowser_TreeLevelLine (QWidget* theParent);
 
   //! Destructor
-  virtual ~DFBrowser_TreeLevelLine() Standard_OVERRIDE {}
+  virtual ~DFBrowser_TreeLevelLine() {}
 
   //! Clears history of selected items
   Standard_EXPORT void ClearHistory();
index c97c078..65d6b74 100644 (file)
@@ -38,7 +38,7 @@ public:
   //! Destructor
   virtual ~DFBrowser_TreeLevelLineDelegate() {}
 
-  //! Draw an icon in the cell and highlight cell if mouse is over the cell
+  //! Draws an icon in the cell and highlight cell if mouse is over the cell
   //! \param thePainter a painter
   //! \param theOption a paint options
   //! \param theIndex a view index
index 16e2964..9bb3069 100644 (file)
@@ -59,14 +59,17 @@ QVariant DFBrowser_TreeLevelLineModel::data (const QModelIndex& theIndex, int th
     if (theRole == Qt::DecorationRole) //! do not show icons presented in tree view
       return aValue;
     TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (aTreeIndex);
-    if (anItemBase)
-    {
-      DFBrowser_ItemBasePtr aDBrowserItem = itemDynamicCast<DFBrowser_ItemBase> (anItemBase);
-      bool aPrevValue = aDBrowserItem->SetUseAdditionalInfo (false);
-      aValue = aDBrowserItem->data (aTreeIndex, theRole);
-      aDBrowserItem->SetUseAdditionalInfo (aPrevValue);
+    if (!anItemBase)
+      return aValue;
+
+    DFBrowser_ItemBasePtr aDBrowserItem = itemDynamicCast<DFBrowser_ItemBase> (anItemBase);
+    if (!aDBrowserItem)
+      return aValue;
+
+    bool aPrevValue = aDBrowserItem->SetUseAdditionalInfo (false);
+    aValue = aDBrowserItem->data (aTreeIndex, theRole);
+    aDBrowserItem->SetUseAdditionalInfo (aPrevValue);
 
-    }
     if (theRole == Qt::DisplayRole)
       aValue = aValue.toString() + "  "; //! TEMPORARY to leave place for the action icon
   }
index 667f208..e8f4e51 100644 (file)
@@ -40,7 +40,7 @@ public:
   //! Destructor
   virtual ~DFBrowser_TreeLevelLineModel() {}
 
-  //!
+  //! Resets the cached values
   void Reset() { myLevelItems.clear(); }
 
   //! Inits the model by the index
@@ -50,7 +50,7 @@ public:
   //! Returns true if the tree model index is filled
   bool IsInitialized() const { return myTreeIndex.isValid(); }
 
-  //! Return OCAF tree view model index on level defined by column of the parameter index
+  //! Returns OCAF tree view model index on level defined by column of the parameter index
   //! \param theIndex a tree level view model index
   //! \return model index
   const QModelIndex& GetTreeViewIndex (const QModelIndex& theIndex) const
@@ -82,7 +82,7 @@ public:
 private:
 
   QModelIndex myTreeIndex; //!< the current OCAF tree view model index
-  QList<QModelIndex> myLevelItems; //! cached parent indices of myTreeIndex for quick access to item information
+  QList<QModelIndex> myLevelItems; //!< cached parent indices of myTreeIndex for quick access to item information
 };
 
 #endif
index ae961a9..5878545 100644 (file)
@@ -42,12 +42,12 @@ public:
   Standard_EXPORT DFBrowser_TreeLevelView (QWidget* theParent);
 
   //! Destructor
-  virtual ~DFBrowser_TreeLevelView() Standard_OVERRIDE {}
+  virtual ~DFBrowser_TreeLevelView() {}
 
   //! Returns parent control
   QWidget* GetControl() const { return myMainWindow; }
 
-  //! Clear selection of the table view selection model
+  //! Clears selection of the table view selection model
   Standard_EXPORT void ClearSelection();
 
   //! Returns true if this control may be filled by the index
@@ -56,7 +56,7 @@ public:
   //! \return boolean result
   Standard_EXPORT static bool ProcessItem (const QModelIndex& theIndex);
 
-  //! Init view by the first selected item in OCAF tree view
+  //! Inits view by the first selected item in OCAF tree view
   //! \param theSelected selected items
   //! \param theDeselected deselected items
   Standard_EXPORT void UpdateByTreeSelectionChanged (const QItemSelection& theSelected,
index 63802ba..59c6a7f 100644 (file)
@@ -92,6 +92,9 @@ QVariant DFBrowser_TreeLevelViewModel::data (const QModelIndex& theIndex, int th
   if (theIndex.column() == 0)
   {
     DFBrowser_ItemBasePtr aDBrowserItem = itemDynamicCast<DFBrowser_ItemBase> (anItemBase);
+    if (!aDBrowserItem)
+      return QVariant();
+
     bool aPrevValue = aDBrowserItem->SetUseAdditionalInfo (false);
     aValue = anItemBase->data (anIndex, theRole);
     aDBrowserItem->SetUseAdditionalInfo (aPrevValue);
index 5c564f3..a2c0613 100644 (file)
@@ -37,9 +37,9 @@ public:
   DFBrowser_TreeLevelViewModel (QObject* theParent) : QAbstractTableModel (theParent), myRowCount (0) {}
 
   //! Destructor
-  virtual ~DFBrowser_TreeLevelViewModel() Standard_OVERRIDE {}
+  virtual ~DFBrowser_TreeLevelViewModel() {}
 
-  //! Reset OCAF tree model index
+  //! Resets OCAF tree model index
   void Reset() { myIndex = QModelIndex(); }
 
   //! Fills OCAF tree model index
@@ -49,7 +49,7 @@ public:
   //! Returns true if the index is filled
   bool IsInitialized() const { return myIndex.isValid(); }
 
-  //! Return OCAF tree view model index on level defined by column of the parameter index
+  //! Returns OCAF tree view model index on level defined by column of the parameter index
   //! \param theIndex a tree level view model index
   //! \return model index
   Standard_EXPORT QModelIndex GetTreeViewIndex (const QModelIndex& theIndex) const;
@@ -57,7 +57,7 @@ public:
   //! Emits the layoutChanged signal from outside of this class
   void EmitLayoutChanged() { emit layoutChanged(); }
 
-  //! It returns value only for DisplayRole for column = 1
+  //! Returns value only for DisplayRole for column = 1
   //! \param theSection an index of value in the container 
   //! \param theIndex a model index
   //! \param theRole a view role
index 16fe104..23ab2c2 100644 (file)
@@ -38,12 +38,27 @@ const int COLUMN_NAME_WIDTH = 300;
 // function : Constructor
 // purpose :
 // =======================================================================
-DFBrowser_TreeModel::DFBrowser_TreeModel (QObject* theParent, DFBrowser_Module* theModule)
+DFBrowser_TreeModel::DFBrowser_TreeModel (QObject* theParent)
 : TreeModel_ModelBase (theParent)
 {
-  SetHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
+}
 
-  DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast<DFBrowser_ItemApplication> (m_pRootItem);
+// =======================================================================
+// function : InitColumns
+// purpose :
+// =======================================================================
+void DFBrowser_TreeModel::InitColumns()
+{
+  SetHeaderItem (0, TreeModel_HeaderSection ("Name"));
+}
+
+// =======================================================================
+// function : SetModule
+// purpose :
+// =======================================================================
+void DFBrowser_TreeModel::SetModule (DFBrowser_Module* theModule)
+{
+  DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast<DFBrowser_ItemApplication> (RootItem (0));
   aRootItem->SetModule (theModule);
 }
 
@@ -51,9 +66,9 @@ DFBrowser_TreeModel::DFBrowser_TreeModel (QObject* theParent, DFBrowser_Module*
 // function : createRootItem
 // purpose :
 // =======================================================================
-void DFBrowser_TreeModel::createRootItem (const int)
+TreeModel_ItemBasePtr DFBrowser_TreeModel::createRootItem (const int)
 {
-  m_pRootItem = DFBrowser_ItemApplication::CreateItem (TreeModel_ItemBasePtr());
+  return DFBrowser_ItemApplication::CreateItem (TreeModel_ItemBasePtr());
 }
 
 // =======================================================================
@@ -62,7 +77,7 @@ void DFBrowser_TreeModel::createRootItem (const int)
 // =======================================================================
 void DFBrowser_TreeModel::Init (const Handle(TDocStd_Application)& theApplication)
 {
-  DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast<DFBrowser_ItemApplication> (m_pRootItem);
+  DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast<DFBrowser_ItemApplication> (RootItem (0));
   Reset();
   aRootItem->SetApplication (theApplication);
   EmitLayoutChanged();
@@ -74,7 +89,7 @@ void DFBrowser_TreeModel::Init (const Handle(TDocStd_Application)& theApplicatio
 // =======================================================================
 Handle(TDocStd_Application) DFBrowser_TreeModel::GetTDocStdApplication() const
 {
-  DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast<DFBrowser_ItemApplication> (m_pRootItem);
+  DFBrowser_ItemApplicationPtr aRootItem = itemDynamicCast<DFBrowser_ItemApplication> (RootItem (0));
   return aRootItem->GetApplication();
 }
 
@@ -179,7 +194,7 @@ QModelIndex DFBrowser_TreeModel::FindIndexByPath (const QStringList& theLabelEnt
         if (aPathId == aPathCount && anItem->HasAttribute())
         {
           // processing attribute in theValue
-          DFBrowser_ItemApplicationPtr aRootAppItem = itemDynamicCast<DFBrowser_ItemApplication>(m_pRootItem);
+          DFBrowser_ItemApplicationPtr aRootAppItem = itemDynamicCast<DFBrowser_ItemApplication>(RootItem (0));
           QString anAttributeInfo = DFBrowser_Module::GetAttributeInfo (anItem->GetAttribute(), aRootAppItem->GetModule(),
                                                                         Qt::DisplayRole, 0).toString();
           if (anAttributeInfo == anEntry)
index 6182c25..c1e1f05 100644 (file)
@@ -45,14 +45,20 @@ class DFBrowser_TreeModel : public TreeModel_ModelBase
 public:
 
   //! Constructor
-  Standard_EXPORT DFBrowser_TreeModel (QObject* theParent, DFBrowser_Module* theModule);
+  Standard_EXPORT DFBrowser_TreeModel (QObject* theParent);
 
   //! Destructor
-  virtual ~DFBrowser_TreeModel() Standard_OVERRIDE {};
+  virtual ~DFBrowser_TreeModel() {}
+
+  //! Creates model columns and root items.
+  Standard_EXPORT virtual void InitColumns() Standard_OVERRIDE;
 
   //! Fills the root item by the application
   Standard_EXPORT void Init (const Handle(TDocStd_Application)& theApplication);
 
+  //! Fills root item by the module
+  Standard_EXPORT void SetModule (DFBrowser_Module* theModule);
+
   //! Returns an OCAF application or NULL
   //! \return an application instance
   Standard_EXPORT Handle(TDocStd_Application) GetTDocStdApplication() const;
@@ -98,7 +104,7 @@ public:
 protected:
   //! Creates root item
   //! \param theColumnId index of a column
-  virtual void createRootItem (const int theColumnId);
+  Standard_EXPORT virtual TreeModel_ItemBasePtr createRootItem (const int theColumnId) Standard_OVERRIDE;
 
 private:
 
index 5801326..01b100b 100644 (file)
 #include <inspector/TreeModel_ContextMenu.hxx>
 #include <inspector/TreeModel_Tools.hxx>
 
+#include <inspector/ViewControl_PropertyView.hxx>
 #include <inspector/ViewControl_TreeView.hxx>
 
-#include <inspector/View_Tools.hxx>
-
 #include <OSD_Directory.hxx>
 #include <OSD_Environment.hxx>
 #include <OSD_Protection.hxx>
@@ -102,6 +101,8 @@ const int DFBROWSER_DEFAULT_POSITION_Y = 60;
 const int DEFAULT_PROPERTY_PANEL_HEIGHT = 200;
 const int DEFAULT_BROWSER_HEIGHT = 800;
 
+//#define USE_DUMPJSON
+
 // =======================================================================
 // function : Constructor
 // purpose :
@@ -161,12 +162,24 @@ DFBrowser_Window::DFBrowser_Window()
   connect (aLevelView, SIGNAL (indexDoubleClicked (const QModelIndex&)),
            this, SLOT (onLevelDoubleClicked (const QModelIndex&)));
 
+  // property widget
   QDockWidget* aPropertyPanelWidget = new QDockWidget (tr ("PropertyPanel"), myMainWindow);
   aPropertyPanelWidget->setObjectName (aPropertyPanelWidget->windowTitle());
   aPropertyPanelWidget->setTitleBarWidget (new QWidget(myMainWindow));
   aPropertyPanelWidget->setWidget (myPropertyPanel->GetControl());
   myMainWindow->addDockWidget (Qt::RightDockWidgetArea, aPropertyPanelWidget);
 
+  // property view
+#ifdef USE_DUMPJSON
+  myPropertyPanelWidget = new QDockWidget (tr ("PropertyPanel (DumpJson)"), myMainWindow);
+  myPropertyView = new ViewControl_PropertyView (myMainWindow,
+    QSize(DFBROWSER_DEFAULT_VIEW_WIDTH, DFBROWSER_DEFAULT_VIEW_HEIGHT));
+  myPropertyPanelWidget->setObjectName (myPropertyPanelWidget->windowTitle());
+  myPropertyPanelWidget->setTitleBarWidget (new QWidget(myMainWindow));
+  myPropertyPanelWidget->setWidget (myPropertyView->GetControl());
+  myMainWindow->addDockWidget (Qt::RightDockWidgetArea, myPropertyPanelWidget);
+#endif
+
   // dump view window
   QWidget* aDumpWidget = new QWidget(myMainWindow);
   QVBoxLayout* aDumpLay = new QVBoxLayout(aDumpWidget);
@@ -181,20 +194,26 @@ DFBrowser_Window::DFBrowser_Window()
 
   // view
   myViewWindow = new View_Window (myMainWindow);
-  myViewWindow->GetView()->SetPredefinedSize (DFBROWSER_DEFAULT_VIEW_WIDTH, DFBROWSER_DEFAULT_VIEW_HEIGHT);
+  myViewWindow->ViewWidget()->SetPredefinedSize (DFBROWSER_DEFAULT_VIEW_WIDTH, DFBROWSER_DEFAULT_VIEW_HEIGHT);
 
   QDockWidget* aViewDockWidget = new QDockWidget (tr ("View"), myMainWindow);
   aViewDockWidget->setObjectName (aViewDockWidget->windowTitle());
-  aViewDockWidget->setTitleBarWidget (myViewWindow->GetViewToolBar()->GetControl());
+  aViewDockWidget->setTitleBarWidget (myViewWindow->ViewToolBar()->GetControl());
   aViewDockWidget->setWidget (myViewWindow);
   myMainWindow->addDockWidget (Qt::RightDockWidgetArea, aViewDockWidget);
 
   QColor aHColor (229, 243, 255);
-  myViewWindow->GetDisplayer()->SetAttributeColor (Quantity_Color(aHColor.red() / 255., aHColor.green() / 255.,
-                                                   aHColor.blue() / 255., Quantity_TOC_RGB), View_PresentationType_Additional);
+  myViewWindow->Displayer()->SetAttributeColor (Quantity_Color(aHColor.red() / 255., aHColor.green() / 255.,
+                                                aHColor.blue() / 255., Quantity_TOC_sRGB), View_PresentationType_Additional);
 
-  myMainWindow->splitDockWidget(aPropertyPanelWidget, aViewDockWidget, Qt::Vertical);
+  myMainWindow->splitDockWidget (aPropertyPanelWidget, aViewDockWidget, Qt::Vertical);
+
+#ifdef USE_DUMPJSON
+  myMainWindow->tabifyDockWidget (aDumpDockWidget, myPropertyPanelWidget);
+  myMainWindow->tabifyDockWidget (myPropertyPanelWidget, aViewDockWidget);
+#else
   myMainWindow->tabifyDockWidget (aDumpDockWidget, aViewDockWidget);
+#endif
 
   myTreeView->resize (DFBROWSER_DEFAULT_TREE_VIEW_WIDTH, DFBROWSER_DEFAULT_TREE_VIEW_HEIGHT);
 
@@ -254,7 +273,7 @@ void DFBrowser_Window::GetPreferences (TInspectorAPI_PreferencesDataMap& theItem
 
   QMap<QString, QString> anItems;
   TreeModel_Tools::SaveState (myTreeView, anItems);
-  View_Tools::SaveState(myViewWindow, anItems);
+  View_Window::SaveState(myViewWindow, anItems);
 
   for (QMap<QString, QString>::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++)
     theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str());
@@ -278,7 +297,7 @@ void DFBrowser_Window::SetPreferences (const TInspectorAPI_PreferencesDataMap& t
       myMainWindow->restoreState (TreeModel_Tools::ToByteArray (anItemIt.Value().ToCString()));
     else if (TreeModel_Tools::RestoreState (myTreeView, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
       continue;
-    else if (View_Tools::RestoreState(myViewWindow, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
+    else if (View_Window::RestoreState(myViewWindow, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
       continue;
   }
 }
@@ -420,6 +439,11 @@ void DFBrowser_Window::Init (const NCollection_List<Handle(Standard_Transient)>&
     }
     return;
   }
+  else
+  {
+    if (anApplication.IsNull() && CDF_Session::Exists())
+      anApplication = Handle(TDocStd_Application)::DownCast (CDF_Session::CurrentSession()->CurrentApplication());
+  }
 
   myModule = new DFBrowser_Module();
   myModule->CreateViewModel (myMainWindow);
@@ -659,7 +683,7 @@ void DFBrowser_Window::onExpand()
   for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++)
   {
     int aLevels = 2;
-    setExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels);
+    TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels);
   }
   QApplication::restoreOverrideCursor();
 }
@@ -677,7 +701,7 @@ void DFBrowser_Window::onExpandAll()
   for (int  aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++)
   {
     int aLevels = -1;
-    setExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels);
+    TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], true, aLevels);
   }
   QApplication::restoreOverrideCursor();
 }
@@ -692,7 +716,7 @@ void DFBrowser_Window::onCollapseAll()
   QModelIndexList aSelectedIndices = aSelectionModel->selectedIndexes();
   for (int aSelectedId = 0, aSize = aSelectedIndices.size(); aSelectedId < aSize; aSelectedId++) {
     int aLevels = -1;
-    setExpanded (myTreeView, aSelectedIndices[aSelectedId], false, aLevels);
+    TreeModel_Tools::SetExpanded (myTreeView, aSelectedIndices[aSelectedId], false, aLevels);
   }
 }
 
@@ -705,6 +729,12 @@ void DFBrowser_Window::onTreeViewSelectionChanged (const QItemSelection& theSele
 {
   if (!myModule)
     return;
+
+#ifdef USE_DUMPJSON
+  if (myPropertyPanelWidget->toggleViewAction()->isChecked())
+    myPropertyView->Init (ViewControl_Tools::CreateTableModelValues (myTreeView->selectionModel()));
+#endif
+
   // previuos selection should be cleared in the panel selectors
   DFBrowser_AttributePaneStack* anAttributePaneStack = myPropertyPanel->GetAttributesStack();
   anAttributePaneStack->GetPaneSelector()->ClearSelected();
@@ -716,7 +746,7 @@ void DFBrowser_Window::onTreeViewSelectionChanged (const QItemSelection& theSele
   QModelIndex aSelectedIndex = TreeModel_ModelBase::SingleSelected (aSelectedIndices, 0);
 
   myTreeView->scrollTo (aSelectedIndex);
-  View_Displayer* aDisplayer = myViewWindow->GetDisplayer();
+  View_Displayer* aDisplayer = myViewWindow->Displayer();
   
   aDisplayer->ErasePresentations (View_PresentationType_Additional, false);
   aDisplayer->DisplayPresentation (findPresentation (aSelectedIndex), View_PresentationType_Main);
@@ -765,7 +795,7 @@ void DFBrowser_Window::onPaneSelectionChanged (const QItemSelection&,
       {
         TCollection_AsciiString aPluginShortName = aPluginName.SubString (3, aPluginName.Length());
         QString aMessage = QString ("TShape %1 is sent to %2.")
-          .arg (DFBrowserPane_Tools::GetPointerInfo (aParameters.Last()).ToCString())
+          .arg (Standard_Dump::GetPointerInfo (aParameters.Last()).ToCString())
           .arg (aPluginShortName.ToCString());
         QString aQuestion = QString ("Would you like to activate %1 immediately?\n")
           .arg (aPluginShortName.ToCString()).toStdString().c_str();
@@ -793,7 +823,7 @@ void DFBrowser_Window::onPaneSelectionChanged (const QItemSelection&,
 
   // make the shape visualized
   QModelIndex aSelectedIndex = aSelectedIndices.first();
-  View_Displayer* aDisplayer = myViewWindow->GetDisplayer();
+  View_Displayer* aDisplayer = myViewWindow->Displayer();
   aDisplayer->DisplayPresentation (findPresentation (aSelectedIndex), View_PresentationType_Main);
 
   // highlight and scroll to the referenced item if it exists
@@ -894,7 +924,7 @@ void DFBrowser_Window::onLevelSelected (const QModelIndex& theIndex)
   QModelIndexList anIndices;
   anIndices.append (theIndex);
   highlightIndices (anIndices);
-  View_Displayer* aDisplayer = myViewWindow->GetDisplayer();
+  View_Displayer* aDisplayer = myViewWindow->Displayer();
   aDisplayer->ErasePresentations (View_PresentationType_Additional, false);
   aDisplayer->DisplayPresentation (findPresentation (theIndex), View_PresentationType_Main);
 }
@@ -988,26 +1018,3 @@ void DFBrowser_Window::findPresentations (const QModelIndexList& theIndices, AIS
     thePresentations.Append (aPresentation);
   }
 }
-
-// =======================================================================
-// function : setExpanded
-// purpose :
-// =======================================================================
-void DFBrowser_Window::setExpanded (QTreeView* theTreeView, const QModelIndex& theIndex, const bool isExpanded,
-                                    int& theLevels)
-{
-  bool isToExpand = theLevels == -1 || theLevels > 0;
-  if (!isToExpand)
-    return;
-
-  theTreeView->setExpanded (theIndex, isExpanded);
-  if (theLevels != -1)
-    theLevels--;
-
-  QAbstractItemModel* aModel = theTreeView->model();
-  for (int aRowId = 0, aRows = aModel->rowCount (theIndex); aRowId < aRows; aRowId++)
-  {
-    int aLevels = theLevels;
-    setExpanded (theTreeView, aModel->index (aRowId, 0, theIndex), isExpanded, aLevels);
-  }
-}
index 93fb3d7..17b2f21 100644 (file)
@@ -39,12 +39,14 @@ class DFBrowser_Thread;
 class DFBrowser_TreeLevelLine;
 
 class ViewControl_MessageDialog;
+class ViewControl_PropertyView;
 
 class View_ToolBar;
 class View_Window;
 
 class QAbstractItemModel;
 class QAction;
+class QDockWidget;
 class QTreeView;
 class QWidget;
 
@@ -62,7 +64,7 @@ public:
   Standard_EXPORT DFBrowser_Window();
 
   //! Destructor
-  Standard_EXPORT virtual ~DFBrowser_Window() Standard_OVERRIDE;
+  Standard_EXPORT virtual ~DFBrowser_Window();
 
   //! Appends main window into layout of the parent if the parent is child of QWidget
   //! \param theParent a parent class
@@ -72,7 +74,7 @@ public:
   //! \param theParameters a parameters container
   void SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters) { myParameters = theParameters; }
 
-  //! Provide container for actions available in inspector on general level
+  //! Provides container for actions available in inspector on general level
   //! \param theMenu if Qt implementation, it is QMenu object
   Standard_EXPORT virtual void FillActionsMenu (void* theMenu);
 
@@ -125,13 +127,13 @@ private slots:
   //! \param thePosition a clicked point
   void onTreeViewContextMenuRequested (const QPoint& thePosition);
 
-  //! Expand two next levels for all selected item
+  //! Expands two next levels for all selected item
   void onExpand();
 
-  //! Expand all levels for all selected items
+  //! Expands all levels for all selected items
   void onExpandAll();
 
-  //! Collapse all levels for all selected items
+  //! Collapses all levels for all selected items
   void onCollapseAll();
 
   //! Udpates all controls by changed selection in OCAF tree view
@@ -206,13 +208,6 @@ protected:
   //! \return container of presentations or NULL
   void findPresentations (const QModelIndexList& theIndices, AIS_ListOfInteractive& thePresentations);
 
-  //! Recursive items expanding in tree view staring from the index
-  //! \param theTreeView an OCAF tree view
-  //! \param theParentIndex an index which children should be expanded
-  //! \param isExpanded a boolean state if the item should be expanded or collapsed
-  //! \param theLevels a number of levels to be expanded, or -1 for all levels
-  static void setExpanded (QTreeView* theTreeView, const QModelIndex& theParentIndex, const bool isExpanded, int& theLevels);
-
 private:
 
   DFBrowser_Module* myModule; //!< current module
@@ -220,7 +215,9 @@ private:
   QMainWindow* myMainWindow; //!< main control for all components
   DFBrowser_TreeLevelLine* myTreeLevelLine; //!< navigate line of tree levels to the selected item
   QTreeView* myTreeView; //!< OCAF tree view
+  QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget
   DFBrowser_PropertyPanel* myPropertyPanel; //!< property panel shows full information about attribute or search view
+  ViewControl_PropertyView* myPropertyView; //!< property control to display model item values if exist
   View_Window* myViewWindow; //!< V3d view to visualize presentations/references if it can be build for a selected item
   DFBrowser_DumpView* myDumpView; //!< Text editor where "Dump" method output is shown
   DFBrowser_Thread* myThread; //!< Threads manipulator, starting thread items, listens finalizing
diff --git a/tools/DFBrowserPane/DFBrowserPane.hxx b/tools/DFBrowserPane/DFBrowserPane.hxx
deleted file mode 100644 (file)
index be7be47..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Created on: 2017-06-16
-// Created by: Natalia ERMOLAEVA
-// Copyright (c) 2017 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement. 
-
-#ifndef DFBROWSERPANE_H
-#define DFBROWSERPANE_H
-
-#ifdef __DFBrowserPane_DLL
-  #ifdef _WIN32
-    #define DFBROWSERPANE_EXPORT __declspec(dllexport)
-  #else
-    #define DFBROWSERPANE_EXPORT
-  #endif
-#else
-  #ifdef _WIN32
-    #define DFBROWSERPANE_EXPORT __declspec(dllimport)
-  #else
-    #define DFBROWSERPANE_EXPORT
-  #endif
-#endif
-
-#endif
index 9468629..2bf6f29 100644 (file)
@@ -140,7 +140,7 @@ void DFBrowserPane_AttributePane::GetShortAttributeInfo (const Handle(TDF_Attrib
 // function : GetAttributeInfoByType
 // purpose :
 // =======================================================================
-QVariant DFBrowserPane_AttributePane::GetAttributeInfoByType (const Standard_CString& theAttributeName,
+QVariant DFBrowserPane_AttributePane::GetAttributeInfoByType (Standard_CString theAttributeName,
                                                               int theRole, int theColumnId)
 {
   if (theColumnId != 0)
index c312d15..2a3d1a9 100644 (file)
@@ -74,7 +74,7 @@ public:
   //! \param theRole a role of information, used by tree model (e.g. DisplayRole, icon, background and so on)
   //! \param theColumnId a tree model column
   //! \return value, interpreted by tree model depending on the role
-  Standard_EXPORT static QVariant GetAttributeInfoByType(const Standard_CString& theAttributeName, int theRole, int theColumnId);
+  Standard_EXPORT static QVariant GetAttributeInfoByType(Standard_CString theAttributeName, int theRole, int theColumnId);
 
   //! Returns information for the given attribute
   //! \param theAttribute a current attribute
index 9869790..872a590 100644 (file)
 // function : Constructor
 // purpose :
 // =======================================================================
-DFBrowserPane_AttributePaneAPI* DFBrowserPane_AttributePaneCreator::CreateAttributePane (
-                                                                        const Standard_CString& theAttributeName)
+DFBrowserPane_AttributePaneAPI* DFBrowserPane_AttributePaneCreator::CreateAttributePane (Standard_CString theAttributeName)
 {
   DFBrowserPane_AttributePaneAPI* aPane = 0;
   if (theAttributeName == STANDARD_TYPE (TDF_Reference)->Name())
index 5e4fdb8..0b6a64e 100644 (file)
@@ -38,7 +38,7 @@ public:
   //! Creates attribute pane for TDF, TDataStd, TDocStd, TPrsStd, TNaming and TFunction attribute types
   //! \param theAttributeName a standard type of attribute
   //! \return an attribute pane if it can be created for this type
-  Standard_EXPORT virtual DFBrowserPane_AttributePaneAPI* CreateAttributePane(const Standard_CString& theAttributeName) Standard_OVERRIDE;
+  Standard_EXPORT virtual DFBrowserPane_AttributePaneAPI* CreateAttributePane(Standard_CString theAttributeName) Standard_OVERRIDE;
 };
 
 #endif
index e818c4d..1537b69 100644 (file)
@@ -36,7 +36,7 @@ public:
   //! Creates attribute pane for attribute types
   //! \param theAttributeName a standard type of attribute
   //! \return an attribute pane if it can be created for this type
-  virtual DFBrowserPane_AttributePaneAPI* CreateAttributePane (const Standard_CString& theAttributeName) = 0;
+  virtual DFBrowserPane_AttributePaneAPI* CreateAttributePane (Standard_CString theAttributeName) = 0;
 };
 
 #endif 
index a578052..69c64f4 100644 (file)
@@ -42,7 +42,7 @@ public:
   virtual ~DFBrowserPane_AttributePaneModel() {}
 
   //! Sets direction of the values applying, whether it should be placed by rows or by columns
-  //! \param theOrientation if horizontal, the values are applyed by rows, otherwise by columns
+  //! \param theOrientation if horizontal, the values are applied by rows, otherwise by columns
   void SetOrientation (const Qt::Orientation& theOrientation) { myOrientation = theOrientation; }
 
   //! Returns table orientation for setting data values
index dac0302..0715326 100644 (file)
@@ -16,7 +16,6 @@
 #ifndef DFBrowserPane_HelperExport_H
 #define DFBrowserPane_HelperExport_H
 
-#include <inspector/DFBrowserPane.hxx>
 #include <TopoDS_Shape.hxx>
 
 #include <Standard_WarningsDisable.hxx>
@@ -29,7 +28,7 @@
 //! It contains a conainer of shapes for model indices. If button is pressed for index where the 
 //! shape exists, this shape is exported to BREP file.
 //! It contains a container of shapes, it is important to clear this helper after using.
-class DFBROWSERPANE_EXPORT DFBrowserPane_HelperExport : public QObject
+class DFBrowserPane_HelperExport : public QObject
 {
   Q_OBJECT
 public:
@@ -55,7 +54,7 @@ public:
   //! Returns shape for the index
   //! \param theIndex a model view index
   //! \return a cached shape
-  const TopoDS_Shape& GetShape (const QModelIndex& theIndex) { return myShapes[theIndex]; }
+  const TopoDS_Shape& Shape (const QModelIndex& theIndex) { return myShapes[theIndex]; }
 
 public slots:
 
index 0e79829..a903cf3 100644 (file)
@@ -41,6 +41,7 @@ DFBrowserPane_TDataStdTreeNode::DFBrowserPane_TDataStdTreeNode()
 : DFBrowserPane_AttributePane(), myTreeNodeView (0)
 {
   myModel = new DFBrowserPane_TDataStdTreeNodeModel (0);
+  myModel->InitColumns();
   mySelectionModels.clear(); // do not use selection model of parent pane
   mySelectionModels.push_back (new QItemSelectionModel (myModel));
 }
@@ -99,15 +100,14 @@ void DFBrowserPane_TDataStdTreeNode::Init (const Handle(TDF_Attribute)& theAttri
   }
 
 
-  DFBrowserPane_TDataStdTreeNodeModel* aModel = dynamic_cast<DFBrowserPane_TDataStdTreeNodeModel*> (myModel);
-  aModel->Reset();
+  myModel->Reset();
 
   if (!aTreeNode.IsNull())
   {
     Handle(TDataStd_TreeNode) aRootItem = aTreeNode->Root();
-    aModel->SetAttribute (aRootItem);
+    myModel->SetAttribute (aRootItem);
 
-    QModelIndex anIndex = aModel->FindIndex (theAttribute, QModelIndex());
+    QModelIndex anIndex = myModel->FindIndex (theAttribute, QModelIndex());
     if (myTreeNodeView && anIndex.isValid())
     {
       myTreeNodeView->setExpanded (anIndex.parent(), true);
@@ -119,7 +119,7 @@ void DFBrowserPane_TDataStdTreeNode::Init (const Handle(TDF_Attribute)& theAttri
       anAttributeNodeItem->setCurrentAttribute (true);
     }
   }
-  aModel->EmitLayoutChanged();
+  myModel->EmitLayoutChanged();
 }
 
 // =======================================================================
index 9057060..50d676a 100644 (file)
@@ -20,7 +20,7 @@
 
 #include <Standard.hxx>
 
-class QAbstractItemModel;
+class DFBrowserPane_TDataStdTreeNodeModel;
 class QTreeView;
 
 //! \class DFBrowserPane_TDataStdTreeNode
@@ -66,7 +66,7 @@ public:
 
 private:
 
-  QAbstractItemModel* myModel;
+  DFBrowserPane_TDataStdTreeNodeModel* myModel;
   QTreeView* myTreeNodeView;
 };
 
index 2c3818f..9570aea 100644 (file)
@@ -39,15 +39,15 @@ class DFBrowserPane_TDataStdTreeNodeItem : public TreeModel_ItemBase
 public:
 
   //! Creates an item wrapped by a shared pointer
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
+  //! \param theRow the item row position in the parent item
+  //! \param theColumn the item column position in the parent item
   //! \return the pointer to the created item
   static DFBrowserPane_TDataStdTreeNodeItemPtr CreateItem (TreeModel_ItemBasePtr theParent,
                                                            const int theRow, const int theColumn)
   { return DFBrowserPane_TDataStdTreeNodeItemPtr (new DFBrowserPane_TDataStdTreeNodeItem (theParent, theRow, theColumn)); }
 
   //!Destructor
-  virtual ~DFBrowserPane_TDataStdTreeNodeItem() Standard_OVERRIDE {};
+  virtual ~DFBrowserPane_TDataStdTreeNodeItem() Standard_OVERRIDE {}
 
   //! Store a current attribute
   //! \param theAttribute an attribute
@@ -90,13 +90,13 @@ protected:
 protected:
 
   //! Constructor
-  //! param theParent a parent item
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
+  //! \param theParent a parent item
+  //! \param theRow the item row position in the parent item
+  //! \param theColumn the item column position in the parent item
   DFBrowserPane_TDataStdTreeNodeItem(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
     : TreeModel_ItemBase (theParent, theRow, theColumn), myIsCurrentItem (false) {}
 
-  //! Initialize the current item. It creates a backup of the specific item information
+  //! Initializes the current item. It creates a backup of the specific item information
   void initItem() const;
 
   //! Returns number of children attributes, initializes item is necessary
index aaa62b2..4f8a484 100644 (file)
 DFBrowserPane_TDataStdTreeNodeModel::DFBrowserPane_TDataStdTreeNodeModel (QObject* theParent)
 : TreeModel_ModelBase (theParent)
 {
-  createRootItem(0);
+}
+
+// =======================================================================
+// function : InitColumns
+// purpose :
+// =======================================================================
+void DFBrowserPane_TDataStdTreeNodeModel::InitColumns()
+{
+  SetHeaderItem (0, TreeModel_HeaderSection ("Name"));
 }
 
 // =======================================================================
 // function : createRootItem
 // purpose :
 // =======================================================================
-void DFBrowserPane_TDataStdTreeNodeModel::createRootItem (const int theColumnId)
+TreeModel_ItemBasePtr DFBrowserPane_TDataStdTreeNodeModel::createRootItem (const int theColumnId)
 {
-  m_pRootItem = DFBrowserPane_TDataStdTreeNodeItem::CreateItem (TreeModel_ItemBasePtr(), 0, theColumnId);
+  return DFBrowserPane_TDataStdTreeNodeItem::CreateItem (TreeModel_ItemBasePtr(), 0, theColumnId);
 }
 
 // =======================================================================
@@ -47,7 +55,7 @@ void DFBrowserPane_TDataStdTreeNodeModel::createRootItem (const int theColumnId)
 // =======================================================================
 void DFBrowserPane_TDataStdTreeNodeModel::SetAttribute (const Handle(TDF_Attribute)& theAttribute)
 {
-  DFBrowserPane_TDataStdTreeNodeItemPtr aRootItem = itemDynamicCast<DFBrowserPane_TDataStdTreeNodeItem>(m_pRootItem);
+  DFBrowserPane_TDataStdTreeNodeItemPtr aRootItem = itemDynamicCast<DFBrowserPane_TDataStdTreeNodeItem>(RootItem (0));
   Reset();
   aRootItem->SetAttribute (theAttribute);
   EmitLayoutChanged();
index 9223cfa..b5acae2 100644 (file)
@@ -38,7 +38,10 @@ public:
   Standard_EXPORT DFBrowserPane_TDataStdTreeNodeModel (QObject* theParent);
 
   //! Destructor
-  virtual ~DFBrowserPane_TDataStdTreeNodeModel() Standard_OVERRIDE {};
+  virtual ~DFBrowserPane_TDataStdTreeNodeModel() Standard_OVERRIDE {}
+
+  //! Creates model columns and root items.
+  Standard_EXPORT virtual void InitColumns() Standard_OVERRIDE;
 
   //! Initializes the tree model by the attribute
   //! \param theAttribute a current attribute
@@ -59,7 +62,7 @@ public:
 protected:
   //! Creates root item
   //! \param theColumnId index of a column
-  virtual void createRootItem (const int theColumnId) Standard_OVERRIDE;
+  Standard_EXPORT virtual TreeModel_ItemBasePtr createRootItem (const int theColumnId) Standard_OVERRIDE;
 
 private:
 
index 590af0b..61f48d3 100644 (file)
@@ -23,7 +23,6 @@
 #include <TDocStd_Owner.hxx>
 #include <TDF_Delta.hxx>
 #include <TDF_ListIteratorOfDeltaList.hxx>
-#include <Standard_Version.hxx>
 
 #include <Standard_WarningsDisable.hxx>
 #include <QGridLayout>
@@ -56,7 +55,7 @@ void DFBrowserPane_TDocStdOwner::GetValues (const Handle(TDF_Attribute)& theAttr
   if (aDocument.IsNull())
     return;
 
-  TCollection_AsciiString aDocumentInfo = DFBrowserPane_Tools::GetPointerInfo (aDocument).ToCString();
+  TCollection_AsciiString aDocumentInfo = Standard_Dump::GetPointerInfo (aDocument).ToCString();
   TColStd_SequenceOfExtendedString anExtensions;
   aDocument->Extensions(anExtensions);
   TCollection_AsciiString aSeparationStr = "---------------------------";
@@ -100,7 +99,7 @@ void DFBrowserPane_TDocStdOwner::GetValues (const Handle(TDF_Attribute)& theAttr
 
   // TDocStd_Document methods
   TCollection_AsciiString aDocumentDataInfo = !aDocument->GetData().IsNull()
-    ? DFBrowserPane_Tools::GetPointerInfo (aDocument->GetData()).ToCString() : "";
+    ? Standard_Dump::GetPointerInfo (aDocument->GetData()).ToCString() : "";
   theValues << aSeparationStr.ToCString() << aSeparationStr.ToCString()
             << STANDARD_TYPE (TDocStd_Document)->Name() << ""
             << aSeparationStr.ToCString() << aSeparationStr.ToCString()
@@ -119,9 +118,7 @@ void DFBrowserPane_TDocStdOwner::GetValues (const Handle(TDF_Attribute)& theAttr
             << "GetUndos" << convertToString (aDocument->GetUndos())
             << "GetAvailableRedos" << QString::number (aDocument->GetAvailableRedos())
             << "GetRedos" << convertToString (aDocument->GetRedos())
-#if OCC_VERSION_HEX > 0x070100
             << "EmptyLabelsSavingMode" << DFBrowserPane_Tools::BoolToStr (aDocument->EmptyLabelsSavingMode())
-#endif
             << "IsNestedTransactionMode" << DFBrowserPane_Tools::BoolToStr (aDocument->IsNestedTransactionMode())
             << "ModificationMode" << DFBrowserPane_Tools::BoolToStr (aDocument->ModificationMode());
 }
index bd40910..e9220e5 100644 (file)
@@ -154,7 +154,7 @@ void DFBrowserPane_TNamingNamedShape::Init (const Handle(TDF_Attribute)& theAttr
   aFreeRows << 0 << 1;
 
   TopoDS_Shape aShape = aShapeAttr->Get();
-  TCollection_AsciiString aShapeInfo = !aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()) : "";
+  TCollection_AsciiString aShapeInfo = !aShape.IsNull() ? Standard_Dump::GetPointerInfo (aShape.TShape()) : "";
   aValues << "Shape" << aShapeInfo.ToCString() << DFBrowserPane_Tools::ShapeTypeInfo (aShape) << "" << "";
   aShapes.Append (aShape);
   if (aShape.IsNull())
@@ -162,7 +162,7 @@ void DFBrowserPane_TNamingNamedShape::Init (const Handle(TDF_Attribute)& theAttr
 
   TopoDS_Shape aCurrentShape = TNaming_Tool::CurrentShape (aShapeAttr);
   TCollection_AsciiString aCurrentShapeInfo = !aCurrentShape.IsNull() ?
-                                  DFBrowserPane_Tools::GetPointerInfo (aCurrentShape.TShape()) : "";
+    Standard_Dump::GetPointerInfo (aCurrentShape.TShape()) : "";
   aValues << "CurrentShape" << aCurrentShapeInfo.ToCString()
           << DFBrowserPane_Tools::ShapeTypeInfo (aCurrentShape) << "" << "";
   aShapes.Append (aCurrentShape);
@@ -171,7 +171,7 @@ void DFBrowserPane_TNamingNamedShape::Init (const Handle(TDF_Attribute)& theAttr
 
   TopoDS_Shape anOriginalShape = TNaming_Tool::OriginalShape (aShapeAttr);
   TCollection_AsciiString anOriginalShapeInfo = !anOriginalShape.IsNull() ?
-            DFBrowserPane_Tools::GetPointerInfo (anOriginalShape.TShape()) : "";
+    Standard_Dump::GetPointerInfo (anOriginalShape.TShape()) : "";
   aValues << "OriginalShape" << anOriginalShapeInfo.ToCString()
           << DFBrowserPane_Tools::ShapeTypeInfo (anOriginalShape) << "" << "";
   aShapes.Append (anOriginalShape);
@@ -227,14 +227,14 @@ void DFBrowserPane_TNamingNamedShape::Init (const Handle(TDF_Attribute)& theAttr
         aLabelInfo = QString (DFBrowserPane_Tools::GetEntry (anOldLabel).ToCString());
     }
     if (!aNewShape.IsNull())
-      aValues << DFBrowserPane_Tools::GetPointerInfo (aNewShape.TShape()->This()).ToCString()
+      aValues << Standard_Dump::GetPointerInfo (aNewShape.TShape()->This()).ToCString()
               << DFBrowserPane_Tools::ShapeTypeInfo (aNewShape)
               << "";
     else
       aValues << "-" << "-" << "";
     aValues << "Old:";
     if (!anOldShape.IsNull())
-      aValues << DFBrowserPane_Tools::GetPointerInfo (anOldShape.TShape()->This()).ToCString()
+      aValues << Standard_Dump::GetPointerInfo (anOldShape.TShape()->This()).ToCString()
               << DFBrowserPane_Tools::ShapeTypeInfo (anOldShape)
               << aLabelInfo
               << "";
@@ -382,7 +382,7 @@ void DFBrowserPane_TNamingNamedShape::GetSelectionParameters (QItemSelectionMode
   if (aSelectedIndex.column() != 4)
     return;
 
-  const TopoDS_Shape& aShape = myHelperExport.GetShape (aSelectedIndex);
+  const TopoDS_Shape& aShape = myHelperExport.Shape (aSelectedIndex);
   if (aShape.IsNull())
     return;
   theParameters.Append (aShape.TShape());
@@ -467,7 +467,7 @@ TopoDS_Shape DFBrowserPane_TNamingNamedShape::getSelectedShapes()
     QModelIndex anIndex = *anIt;
     if (!myHelperExport.HasShape (anIndex))
       continue;
-    aBuilder.Add (aComp, myHelperExport.GetShape (anIndex));
+    aBuilder.Add (aComp, myHelperExport.Shape (anIndex));
     aHasShapes = true;
   }
 
@@ -480,7 +480,7 @@ TopoDS_Shape DFBrowserPane_TNamingNamedShape::getSelectedShapes()
     QModelIndex anIndex = *anIt;
     if (!myHelperExport.HasShape (anIndex))
       continue;
-    aBuilder.Add (aComp, myHelperExport.GetShape (anIndex));
+    aBuilder.Add (aComp, myHelperExport.Shape (anIndex));
     aHasShapes = true;
   }
   if (aHasShapes)
index a70d5f2..afd1cbe 100644 (file)
@@ -124,7 +124,7 @@ void DFBrowserPane_TNamingNaming::GetValues (const Handle(TDF_Attribute)& theAtt
   theValues.append (QString::number (aNamingName.Index()));
   TopoDS_Shape aShape = aNamingName.Shape();
   theValues.append ("Shape(TShape)");
-  theValues.append (!aShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()->This()).ToCString() : "");
+  theValues.append (!aShape.IsNull() ? Standard_Dump::GetPointerInfo (aShape.TShape()->This()).ToCString() : "");
   TDF_Label aContextLabel = aNamingName.ContextLabel();
   theValues.append ("ContextLabel");
   theValues.append (!aContextLabel.IsNull() ? DFBrowserPane_Tools::GetEntry (aContextLabel).ToCString() : "");
index 19d54ad..6f5f6c1 100644 (file)
@@ -80,7 +80,7 @@ void DFBrowserPane_TNamingUsedShapes::GetValues (const Handle(TDF_Attribute)& th
     if (!aShape.IsNull())
     {
       theValues.append(DFBrowserPane_Tools::ToName(DB_SHAPE_TYPE, aShape.ShapeType()).ToCString());
-      theValues.append(DFBrowserPane_Tools::GetPointerInfo(aShape.TShape()->This()).ToCString());
+      theValues.append(Standard_Dump::GetPointerInfo(aShape.TShape()->This()).ToCString());
     }
     else
       theValues << "EMPTY SHAPE" << "";
@@ -89,7 +89,7 @@ void DFBrowserPane_TNamingUsedShapes::GetValues (const Handle(TDF_Attribute)& th
     {
       theValues.append(DFBrowserPane_Tools::GetEntry(aPtrRefShape->Label()).ToCString());
       const TopoDS_Shape& aValueShape = aPtrRefShape->Shape();
-      theValues.append(!aValueShape.IsNull() ? DFBrowserPane_Tools::GetPointerInfo(aValueShape.TShape()->This()).ToCString() : "");
+      theValues.append(!aValueShape.IsNull() ? Standard_Dump::GetPointerInfo(aValueShape.TShape()->This()).ToCString() : "");
     }
     else
       theValues << "" << "";
index 3b21044..4a3e759 100644 (file)
@@ -63,7 +63,7 @@ void DFBrowserPane_TPrsStdAISPresentation::GetValues (const Handle(TDF_Attribute
             << "GetAIS" << (anIO.IsNull() ? "Null" : anAttribute->DynamicType()->Name())
             << "IsDisplayed" << DFBrowserPane_Tools::BoolToStr (anAttribute->IsDisplayed())
             << "GetContext()" << ((!anIO.IsNull() && !anIO->GetContext().IsNull()) ?
-                                 DFBrowserPane_Tools::GetPointerInfo (anIO->GetContext()).ToCString() : "")
+                                 Standard_Dump::GetPointerInfo (anIO->GetContext()).ToCString() : "")
             << "HasOwnMaterial" << DFBrowserPane_Tools::BoolToStr (anAttribute->HasOwnMaterial())
             << "Material" << (anAttribute->HasOwnMaterial() ?
                              DFBrowserPane_Tools::ToName (DB_MATERIAL_TYPE, anAttribute->Material()) : "").ToCString()
index 6037bb2..eecf1ee 100644 (file)
@@ -35,7 +35,7 @@ void DFBrowserPane_TPrsStdAISViewer::GetValues (const Handle(TDF_Attribute)& the
 
   Handle(AIS_InteractiveContext) aContext = aViewerAttribute->GetInteractiveContext();
   TCollection_AsciiString aPointerInfo = !aContext.IsNull()
-    ? DFBrowserPane_Tools::GetPointerInfo (aContext).ToCString() : "";
+    ? Standard_Dump::GetPointerInfo (aContext).ToCString() : "";
 
   theValues << "GetInteractiveContext" << aPointerInfo.ToCString();
 
index 3deb0ba..8abacd8 100644 (file)
@@ -19,7 +19,6 @@
 #include <CDM_CanCloseStatus.hxx>
 #include <Graphic3d_MaterialAspect.hxx>
 #include <Graphic3d_NameOfMaterial.hxx>
-#include <Standard_Version.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TDataStd.hxx>
 #include <TDataStd_RealEnum.hxx>
@@ -70,30 +69,6 @@ TCollection_AsciiString DFBrowserPane_Tools::GetEntry (const TDF_Label& theLabel
   return anAsciiEntry;
 }
 
-// =======================================================================
-// function : GetPointerInfo
-// purpose :
-// =======================================================================
-TCollection_AsciiString DFBrowserPane_Tools::GetPointerInfo (const Handle(Standard_Transient)& thePointer, const bool isShortInfo)
-{
-  std::ostringstream aPtrStr;
-  aPtrStr << thePointer.operator->();
-  if (!isShortInfo)
-    return aPtrStr.str().c_str();
-
-  TCollection_AsciiString anInfoPtr (aPtrStr.str().c_str());
-  for (int aSymbolId = 1; aSymbolId < anInfoPtr.Length(); aSymbolId++)
-  {
-    if (anInfoPtr.Value(aSymbolId) != '0')
-    {
-      anInfoPtr = anInfoPtr.SubString(aSymbolId, anInfoPtr.Length());
-      anInfoPtr.Prepend("0x");
-      return anInfoPtr;
-    }
-  }
-  return aPtrStr.str().c_str();
-}
-
 // =======================================================================
 // function : ShapeTypeInfo
 // purpose :
index cb19477..892bc7e 100644 (file)
@@ -48,13 +48,6 @@ public:
   //! \return the string value
   Standard_EXPORT static TCollection_AsciiString GetEntry (const TDF_Label& theLabel);
 
-  //! Convert pointer to string value
-  //! \param thePointer a pointer
-  //! \param isShortInfo if true, all '0' symbols in the beginning of the pointer are skipped
-  //! \return the string value
-  Standard_EXPORT static TCollection_AsciiString GetPointerInfo (const Handle(Standard_Transient)& thePointer,
-                                                                 const bool isShortInfo = true);
-
   //! Returns string value corresponded to the shape type if it is not null.
   //! \param theShape a checked shape
   //! \return string value or empty string value
index 1ea8358..de80d10 100644 (file)
@@ -1,4 +1,3 @@
-DFBrowserPane.hxx
 DFBrowserPane.qrc
 DFBrowserPane_AttributePane.cxx
 DFBrowserPane_AttributePane.hxx
index b531305..35e15ae 100644 (file)
@@ -52,7 +52,7 @@ DFBrowserPaneXDE_AttributeCommonPane::DFBrowserPaneXDE_AttributeCommonPane (DFBr
 // function : ProcessAttribute
 // purpose :
 // =======================================================================
-bool DFBrowserPaneXDE_AttributeCommonPane::ProcessAttribute (const Standard_CString& theAttributeType)
+bool DFBrowserPaneXDE_AttributeCommonPane::ProcessAttribute (Standard_CString theAttributeType)
 {
   if (AttributeTypes.empty())
   {
index dd34d91..c15e30c 100644 (file)
@@ -46,7 +46,7 @@ public:
   //! have difference in presentation (TDataStd_TreeNode, TDF_Reference, TNaming_NamedShape and TDataStd_UAttribute).
   //! Also it contains XCAFDoc attributes (should be implemented in this package or pane will be empty)
   //! \param theAttributeType an attribute type
-  Standard_EXPORT static bool ProcessAttribute (const Standard_CString& theAttributeType);
+  Standard_EXPORT static bool ProcessAttribute (Standard_CString theAttributeType);
 
   //! Creates table view and call create widget of array table helper
   //! \param theParent a parent widget
index 8c0641f..7ace10a 100644 (file)
 #include <inspector/DFBrowserPaneXDE_XCAFDocShapeMapTool.hxx>
 #include <inspector/DFBrowserPaneXDE_XCAFDocShapeTool.hxx>
 
-#include <Standard_Version.hxx>
-
 #include <XCAFDoc_Area.hxx>
 #include <XCAFDoc_Centroid.hxx>
 #include <XCAFDoc_Color.hxx>
 #include <XCAFDoc_ColorTool.hxx>
 #include <XCAFDoc_Datum.hxx>
-#if OCC_VERSION_HEX > 0x060901
 #include <XCAFDoc_Dimension.hxx>
 #include <XCAFDoc_GeomTolerance.hxx>
-#endif
 #include <XCAFDoc_DimTol.hxx>
 #include <XCAFDoc_DimTolTool.hxx>
 #include <XCAFDoc_DocumentTool.hxx>
@@ -71,7 +67,7 @@ DFBrowserPaneXDE_AttributePaneCreator::DFBrowserPaneXDE_AttributePaneCreator(
 // function : CreateAttributePane
 // purpose :
 // =======================================================================
-DFBrowserPane_AttributePaneAPI* DFBrowserPaneXDE_AttributePaneCreator::CreateAttributePane (const Standard_CString& theAttributeName)
+DFBrowserPane_AttributePaneAPI* DFBrowserPaneXDE_AttributePaneCreator::CreateAttributePane (Standard_CString theAttributeName)
 {
   DFBrowserPane_AttributePaneAPI* aPane = 0;
   if (DFBrowserPaneXDE_AttributeCommonPane::ProcessAttribute (theAttributeName))
@@ -91,7 +87,7 @@ DFBrowserPane_AttributePaneAPI* DFBrowserPaneXDE_AttributePaneCreator::CreateAtt
 // function : createXDEPane
 // purpose :
 // =======================================================================
-DFBrowserPane_AttributePaneAPI* DFBrowserPaneXDE_AttributePaneCreator::createXDEPane (const Standard_CString& theAttributeName)
+DFBrowserPane_AttributePaneAPI* DFBrowserPaneXDE_AttributePaneCreator::createXDEPane (Standard_CString theAttributeName)
 {
   DFBrowserPane_AttributePaneAPI* aPane = 0;
   if (theAttributeName == STANDARD_TYPE (XCAFDoc_ShapeMapTool)->Name())
@@ -106,20 +102,16 @@ DFBrowserPane_AttributePaneAPI* DFBrowserPaneXDE_AttributePaneCreator::createXDE
     aPane = new DFBrowserPaneXDE_XCAFDocColorTool();
   else if (theAttributeName == STANDARD_TYPE (XCAFDoc_Datum)->Name())
     aPane = new DFBrowserPaneXDE_XCAFDocDatum();
-#if OCC_VERSION_HEX > 0x060901
   else if (theAttributeName == STANDARD_TYPE (XCAFDoc_Dimension)->Name())
     aPane = new DFBrowserPaneXDE_XCAFDocDimension();
-#endif
   else if (theAttributeName == STANDARD_TYPE (XCAFDoc_DimTol)->Name())
     aPane = new DFBrowserPaneXDE_XCAFDocDimTol();
   else if (theAttributeName == STANDARD_TYPE (XCAFDoc_DimTolTool)->Name())
     aPane = new DFBrowserPaneXDE_XCAFDocDimTolTool();
   else if (theAttributeName == STANDARD_TYPE (XCAFDoc_DocumentTool)->Name())
     aPane = new DFBrowserPaneXDE_XCAFDocDocumentTool();
-#if OCC_VERSION_HEX > 0x060901
   else if (theAttributeName == STANDARD_TYPE (XCAFDoc_GeomTolerance)->Name())
     aPane = new DFBrowserPaneXDE_XCAFDocGeomTolerance();
-#endif
   else if (theAttributeName == STANDARD_TYPE (XCAFDoc_GraphNode)->Name())
     aPane = new DFBrowserPaneXDE_XCAFDocGraphNode();
   else if (theAttributeName == STANDARD_TYPE (XCAFDoc_LayerTool)->Name())
index 2520a02..00e3a86 100644 (file)
@@ -43,14 +43,14 @@ public:
   //! \param theAttributeName a type of attribute
   //! \return an attribute pane if it can be created for this type
   Standard_EXPORT virtual DFBrowserPane_AttributePaneAPI* CreateAttributePane
-    (const Standard_CString& theAttributeName) Standard_OVERRIDE;
+    (Standard_CString theAttributeName) Standard_OVERRIDE;
 
 protected:
 
   //! Cretates pane for XCAFDoc attribute name
   //! \param theAttributeName a type of attribute
   //! \return an attribute pane if it can be created for this type
-  DFBrowserPane_AttributePaneAPI* createXDEPane (const Standard_CString& theAttributeName);
+  DFBrowserPane_AttributePaneAPI* createXDEPane (Standard_CString theAttributeName);
 
 private:
 
index f9e64d7..437a9b4 100644 (file)
 
 #include <inspector/DFBrowserPane_AttributePaneModel.hxx>
 
-#include <Standard_Version.hxx>
 #include <TCollection_HAsciiString.hxx>
 
 #include <XCAFDoc_Datum.hxx>
-#if OCC_VERSION_HEX > 0x060901
 #include <XCAFDimTolObjects_DatumObject.hxx>
-#endif
 
 // =======================================================================
 // function : Constructor
@@ -50,13 +47,11 @@ void DFBrowserPaneXDE_XCAFDocDatum::GetValues (const Handle(TDF_Attribute)& theA
             << "Description" << (!aDescription.IsNull() ? aDescription->ToCString() : QString (""))
             << "Indentification" << (!anIndentification.IsNull() ? anIndentification->ToCString() : QString (""));
 
-#if OCC_VERSION_HEX > 0x060901
   Handle(XCAFDimTolObjects_DatumObject) anObject = anAttr->GetObject();
   Handle(TCollection_HAsciiString) anObjectName;
   if (!anObject.IsNull())
     anObjectName = anObject->GetName();
   theValues << "Object" << (!anObjectName.IsNull() ? anObjectName->ToCString() : "Empty Name");
-#endif
 }
 
 // =======================================================================
index 7fc6cef..7cec914 100644 (file)
@@ -116,7 +116,7 @@ void DFBrowserPaneXDE_XCAFDocShapeMapTool::GetValues (const Handle(TDF_Attribute
     const TopoDS_Shape& aShape = aShapeMap(aShapeValueId);
 
     if (!aShape.IsNull())
-      theValues << DFBrowserPane_Tools::GetPointerInfo (aShape.TShape()->This()).ToCString()
+      theValues << Standard_Dump::GetPointerInfo (aShape.TShape()->This()).ToCString()
                 << DFBrowserPane_Tools::ShapeTypeInfo (aShape)
                 << "";
     else
index 1728015..a3b7632 100644 (file)
 #include <XCAFDoc_Color.hxx>
 #include <XCAFDoc_ColorTool.hxx>
 #include <XCAFDoc_DimTol.hxx>
-#include <Standard_Version.hxx>
-#if OCC_VERSION_HEX > 0x060901
 #include <XCAFDoc_Dimension.hxx>
 #include <XCAFDoc_GeomTolerance.hxx>
-#endif
 #include <XCAFDoc_Datum.hxx>
 #include <XCAFDoc_DocumentTool.hxx>
 #include <XCAFDoc_GraphNode.hxx>
@@ -247,7 +244,6 @@ TCollection_AsciiString DFBrowserPaneXDE_XDEDRAW::GetAttributeInfo (Handle(TDF_A
     else if ( att->ID() == XCAFDoc::DatumTolRefGUID() ) {
       type = "DatumToler Link";
     }
-#if OCC_VERSION_HEX > 0x060901
     else if ( att->ID() == XCAFDoc::DimensionRefFirstGUID() ) {
       type = "Dimension Link First";
     }
@@ -257,7 +253,6 @@ TCollection_AsciiString DFBrowserPaneXDE_XDEDRAW::GetAttributeInfo (Handle(TDF_A
     else if ( att->ID() == XCAFDoc::GeomToleranceRefGUID() ){
       type = "GeomTolerance Link";
     }
-#endif
     else
       return TCollection_AsciiString();
 
index 895416e..09979b4 100644 (file)
@@ -1,7 +1,6 @@
 ShapeView.qrc
 ShapeView_Communicator.cxx
 ShapeView_Communicator.hxx
-ShapeView_ItemBase.hxx
 ShapeView_ItemRoot.cxx
 ShapeView_ItemRoot.hxx
 ShapeView_ItemShape.cxx
index babb61b..1850cff 100644 (file)
@@ -29,7 +29,7 @@ public:
   ShapeView_Communicator() : TInspectorAPI_Communicator(), myWindow (new ShapeView_Window (0)) {}
 
   //! Destructor
-  virtual ~ShapeView_Communicator() Standard_OVERRIDE { myWindow->RemoveAllShapes(); }
+  virtual ~ShapeView_Communicator() { myWindow->RemoveAllShapes(); }
 
   //! Provides the container with a parent where this container should be inserted.
   //! If Qt implementation, it should be QWidget with QLayout set inside
@@ -41,9 +41,9 @@ public:
   virtual void SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters) Standard_OVERRIDE
   { myWindow->SetParameters (theParameters); }
 
-  //! Provide container for actions available in inspector on general level
+  //! Provides container for actions available in inspector on general level
   //! \param theMenu if Qt implementation, it is QMenu object
-  Standard_EXPORT virtual void FillActionsMenu(void* theMenu) Standard_OVERRIDE { myWindow->FillActionsMenu (theMenu); }
+  virtual void FillActionsMenu(void* theMenu) Standard_OVERRIDE { myWindow->FillActionsMenu (theMenu); }
 
   //! Returns plugin preferences, empty implementation by default
   //! \param theItem container of preference elements
diff --git a/tools/ShapeView/ShapeView_ItemBase.hxx b/tools/ShapeView/ShapeView_ItemBase.hxx
deleted file mode 100644 (file)
index 3e0559c..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-// Created on: 2017-06-16
-// Created by: Natalia ERMOLAEVA
-// Copyright (c) 2017 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement. 
-
-#ifndef ShapeView_ItemBase_H
-#define ShapeView_ItemBase_H
-
-#include <Standard.hxx>
-#include <TopoDS_Shape.hxx>
-#include <inspector/TreeModel_ItemBase.hxx>
-
-class ShapeView_ItemBase;
-typedef QExplicitlySharedDataPointer<ShapeView_ItemBase> ShapeView_ItemBasePtr;
-
-//! \class ShapeView_ItemBase
-// \brief Declaration of the tree model base item.
-class ShapeView_ItemBase : public TreeModel_ItemBase
-{
-public:
-
-  //! Resets cached values
-  virtual void Reset() Standard_OVERRIDE { TreeModel_ItemBase::Reset(); }
-
-protected:
-
-  //! Initialize the current item. It creates a backup of the specific item information
-  virtual void initItem() const {};
-
-  //! Constructor
-  //! param theParent a parent item
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
-  ShapeView_ItemBase(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  : TreeModel_ItemBase (theParent, theRow, theColumn) {}
-};
-
-#endif
\ No newline at end of file
index 64d1dbe..d9f5cb2 100644 (file)
 #include <inspector/ShapeView_ItemShape.hxx>
 
 // =======================================================================
-// function : GetShape
+// function : Shape
 // purpose :
 // =======================================================================
-const TopoDS_Shape& ShapeView_ItemRoot::GetShape (const int theRowId)
+const TopoDS_Shape& ShapeView_ItemRoot::Shape (const int theRowId)
 {
   NCollection_List<TopoDS_Shape>::Iterator aShapesIt (myShapes);
   for (int aRowId = 0; aShapesIt.More(); aShapesIt.Next(), aRowId++)
index 370ab5b..c05495d 100644 (file)
@@ -17,7 +17,7 @@
 #define ShapeView_ItemRoot_H
 
 #include <NCollection_List.hxx>
-#include <inspector/ShapeView_ItemBase.hxx>
+#include <inspector/TreeModel_ItemBase.hxx>
 #include <Standard.hxx>
 #include <TopoDS_Shape.hxx>
 
@@ -28,7 +28,7 @@ typedef QExplicitlySharedDataPointer<ShapeView_ItemRoot> ShapeView_ItemRootPtr;
 //! Collects shapes that should be visualized in tree view. Shapes are cached and if shapes are not needed,
 //! cache should be cleared using RemoveAllShapes.
 //! Parent is NULL, children are ShapeView_ItemShape items.
-class ShapeView_ItemRoot : public ShapeView_ItemBase
+class ShapeView_ItemRoot : public TreeModel_ItemBase
 {
 public:
 
@@ -37,7 +37,7 @@ public:
     { return ShapeView_ItemRootPtr (new ShapeView_ItemRoot (theParent, theRow, theColumn)); }
 
   //! Destructor
-  virtual ~ShapeView_ItemRoot() Standard_OVERRIDE {};
+  virtual ~ShapeView_ItemRoot() {}
 
   //! Appends new shape
   //! \param theShape a shape instance
@@ -48,11 +48,11 @@ public:
 
   //! Returns shape by the number
   //! \param theRowId an index of the shape in the internal container.
-  Standard_EXPORT const TopoDS_Shape& GetShape (const int theRowId);
+  Standard_EXPORT const TopoDS_Shape& Shape (const int theRowId);
 
 protected:
 
-  //! Return data value for the role.
+  //! Returns data value for the role.
   //! \param theItemRole a value role
   //! \return the value
   virtual QVariant initValue(const int theItemRole) const;
@@ -69,9 +69,9 @@ protected:
 private:
 
   //! Constructor
-  //! param theParent a parent item
+  //! \param theParent a parent item
   ShapeView_ItemRoot(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  : ShapeView_ItemBase (theParent, theRow, theColumn) {}
+  : TreeModel_ItemBase (theParent, theRow, theColumn) {}
 
 private:
 
index 952534b..7a69f45 100644 (file)
 
 #include <inspector/ShapeView_ItemShape.hxx>
 
-#include <Adaptor3d_Curve.hxx>
-#include <BRep_Tool.hxx>
-#include <BRepAdaptor_Curve.hxx>
-
-#include <GCPnts_AbscissaPoint.hxx>
-#include <Geom_Curve.hxx>
-#include <GeomAdaptor_Curve.hxx>
-
 #include <inspector/ShapeView_ItemRoot.hxx>
 #include <inspector/ShapeView_ItemShape.hxx>
+
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <TopAbs.hxx>
 #include <TCollection_AsciiString.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Edge.hxx>
 #include <TopoDS_Iterator.hxx>
-#include <TopoDS_Vertex.hxx>
+
+#include <TopExp.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
 
 #include <Standard_WarningsDisable.hxx>
 #include <QObject>
 #include <Standard_WarningsRestore.hxx>
 
 // =======================================================================
-// function : ToString
-// purpose :
-// =======================================================================
-QString ToString (const Standard_Boolean& theValue)
-{
-  return theValue ? "1" : "0";
-}
-
-// =======================================================================
-// function : ToString
-// purpose :
-// =======================================================================
-QString ToString (const gp_Pnt& thePoint)
-{
-  return QString ("(%1, %2, %3)").arg (thePoint.X()).arg (thePoint.Y()).arg (thePoint.Z());
-}
-
-// =======================================================================
-// function : ToName
-// purpose :
-// =======================================================================
-QString ToName (const TopAbs_ShapeEnum& theShapeType)
-{
-  Standard_SStream aSStream;
-  TopAbs::Print (theShapeType, aSStream);
-  return QString (aSStream.str().c_str());
-}
-
-// =======================================================================
-// function : ToName
-// purpose :
-// =======================================================================
-QString ToName (const TopAbs_Orientation& theOrientation)
-{
-  Standard_SStream aSStream;
-  TopAbs::Print(theOrientation, aSStream);
-  return QString (aSStream.str().c_str());
-}
-
-// =======================================================================
-// function : ToName
+// function : Shape
 // purpose :
 // =======================================================================
-QString ToName (const GeomAbs_Shape& theType)
+TopoDS_Shape ShapeView_ItemShape::Shape (const int theRowId) const
 {
-  switch (theType)
+  if (myChildShapes.IsEmpty())
   {
-    case GeomAbs_C0: return "GeomAbs_C0";
-    case GeomAbs_G1: return "GeomAbs_G1";
-    case GeomAbs_C1: return "GeomAbs_C1";
-    case GeomAbs_G2: return "GeomAbs_G2";
-    case GeomAbs_C2: return "GeomAbs_C2";
-    case GeomAbs_C3: return "GeomAbs_C3";
-    case GeomAbs_CN: return "GeomAbs_CN";
-    default: break;
-  }
-  return QString();
-}
+    ShapeView_ItemShape* aThis = (ShapeView_ItemShape*)this;
 
-// =======================================================================
-// function : ToOtherInfo
-// purpose :
-// =======================================================================
-void ToOtherInfo (const TopoDS_Shape& theShape, QVariant& theValue, QVariant& theInfo)
-{
-  switch (theShape.ShapeType())
-  {
-    case TopAbs_COMPOUND:
-    case TopAbs_COMPSOLID:
-    case TopAbs_SOLID:
-    case TopAbs_SHELL:
-    case TopAbs_FACE:
-    case TopAbs_WIRE:
-      break;
-    case TopAbs_EDGE:
+    if (myExplodeType != TopAbs_SHAPE)
     {
-      TopoDS_Edge anEdge = TopoDS::Edge(theShape);
-      double aFirst, aLast;
-      Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aFirst, aLast);
-
-      GeomAdaptor_Curve aAdaptor(aCurve, aFirst, aLast);
-      gp_Pnt aFirstPnt = aAdaptor.Value(aFirst);
-      gp_Pnt aLastPnt = aAdaptor.Value(aLast);
-
-      BRepAdaptor_Curve aBRepAdaptor = BRepAdaptor_Curve(anEdge);
-      Adaptor3d_Curve* anAdaptor3d = &aBRepAdaptor;
-
-      QStringList aValues, anInfo;
-      aValues.append (QString::number (GCPnts_AbscissaPoint::Length(*anAdaptor3d)));
-      anInfo.append ("Length");
-
-      aValues.append (aCurve->DynamicType()->Name());
-      anInfo.append ("DynamicType");
-
-      aValues.append (ToString (aFirstPnt));
-      anInfo.append (QString ("First" + QString::number (aFirst)));
-
-      aValues.append (ToString (aLastPnt));
-      anInfo.append (QString ("Last" + QString::number (aLast)));
-
-      aValues.append (ToName (aCurve->Continuity()));
-      anInfo.append ("Continuity");
-
-      aValues.append (ToString (aCurve->IsClosed()));
-      anInfo.append ("IsClosed");
-
-      if (aCurve->IsPeriodic()) {
-        aValues.append (QString::number (aCurve->Period()));
-        anInfo.append ("IsPeriodic");
-      }
-      else
+      TopExp::MapShapes(myShape, myExplodeType, aThis->myChildShapes);
+    }
+    else
+    {
+      TopoDS_Iterator aSubShapeIt (myShape);
+      for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++)
       {
-        aValues.append (ToString (aCurve->IsPeriodic()));
-        anInfo.append ("IsPeriodic");
+        aThis->myChildShapes.Add (aSubShapeIt.Value());
       }
-      theValue = aValues.join (" / ");
-      theInfo = QString ("%1:\n%2").arg (anInfo.join (" / ")).arg (aValues.join ("\n"));
-      break;
     }
-    case TopAbs_SHAPE:
-    default:
-      break;
   }
-}
+  if (myChildShapes.Extent() >= theRowId + 1)
+    return myChildShapes(theRowId + 1);
 
-// =======================================================================
-// function : locationInfo
-// purpose :
-// =======================================================================
-QString locationInfo (const TopLoc_Location& theLocation)
-{
-  QString anInfo;
-
-  gp_Trsf aTrsf = theLocation.Transformation();
-  QStringList aValues, aRowValues;
-  for (int aRowId = 1; aRowId <= 3; aRowId++)
-  {
-    aRowValues.clear();
-    for (int aColumnId = 1; aColumnId <= 4; aColumnId++)
-      aRowValues.append (QString::number (aTrsf.Value(aRowId, aColumnId)));
-    aValues.append (aRowValues.join (","));
-  }
-  anInfo.append (aValues.join ("  "));
-  return anInfo;
-}
-
-// =======================================================================
-// function : GetShape
-// purpose :
-// =======================================================================
-TopoDS_Shape ShapeView_ItemShape::GetShape (const int theRowId) const
-{
-  TopoDS_Iterator aSubShapeIt (myShape);
-  for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++)
-  {
-    if (aCurrentIndex != theRowId)
-      continue;
-    break;
-  }
-  return aSubShapeIt.Value();
+  return TopoDS_Shape();
 }
 
 // =======================================================================
@@ -205,6 +67,10 @@ TopoDS_Shape ShapeView_ItemShape::GetShape (const int theRowId) const
 // =======================================================================
 QVariant ShapeView_ItemShape::initValue(const int theRole) const
 {
+  QVariant aParentValue = TreeModel_ItemBase::initValue (theRole);
+  if (aParentValue.isValid())
+    return aParentValue;
+
   TopoDS_Shape aShape = getShape();
   if (aShape.IsNull())
     return QVariant();
@@ -214,58 +80,7 @@ QVariant ShapeView_ItemShape::initValue(const int theRole) const
 
   switch (Column())
   {
-    case 0: return ToName (aShape.ShapeType());
-    case 2: return rowCount() > 0 ? QVariant (rowCount()) : QVariant();
-    case 3: return TShapePointer().ToCString();
-    case 4: return ToName(aShape.Orientation());
-    case 5: return locationInfo(aShape.Location());
-    case 6: return ToString (aShape.Checked());
-    case 7: return ToString (aShape.Closed());
-    case 8: return ToString (aShape.Infinite());
-    case 9: return ToString (aShape.Locked());
-    case 10: return ToString (aShape.Modified());
-    case 11: return ToString (aShape.Orientable());
-    case 12:
-    {
-      if (aShape.ShapeType() != TopAbs_VERTEX)
-        return QVariant();
-      TopoDS_Vertex aVertex = TopoDS::Vertex (aShape);
-      gp_Pnt aPoint = BRep_Tool::Pnt (aVertex);
-      return ToString (aPoint);
-    }
-    case 13:
-    case 14:
-    case 15:
-    case 16:
-    case 17:
-    case 18:
-    case 19:
-    {
-      if (aShape.ShapeType() != TopAbs_EDGE)
-        return QVariant();
-
-      TopoDS_Edge anEdge = TopoDS::Edge(aShape);
-      double aFirst, aLast;
-      Handle(Geom_Curve) aCurve = BRep_Tool::Curve(anEdge, aFirst, aLast);
-
-      GeomAdaptor_Curve aAdaptor(aCurve, aFirst, aLast);
-      gp_Pnt aFirstPnt = aAdaptor.Value(aFirst);
-      gp_Pnt aLastPnt = aAdaptor.Value(aLast);
-
-      BRepAdaptor_Curve aBRepAdaptor = BRepAdaptor_Curve(anEdge);
-      Adaptor3d_Curve* anAdaptor3d = &aBRepAdaptor;
-
-      switch (Column())
-      {
-        case 13: return QString::number (GCPnts_AbscissaPoint::Length(*anAdaptor3d));
-        case 14: return aCurve->DynamicType()->Name();
-        case 15: return ToString (aFirstPnt);
-        case 16: return ToString (aLastPnt);
-        case 17: return ToName (aCurve->Continuity());
-        case 18: return ToString (aCurve->IsClosed());
-        case 19: return aCurve->IsPeriodic() ? QString::number (aCurve->Period()) : ToString (aCurve->IsPeriodic());
-      }
-    }
+    case 0: return TopAbs::ShapeTypeToString (aShape.ShapeType());
     default: break;
   }
   return QVariant();
@@ -282,11 +97,33 @@ int ShapeView_ItemShape::initRowCount() const
     return 0;
 
   int aRowsCount = 0;
-  for (TopoDS_Iterator aSubShapeIt(aShape); aSubShapeIt.More(); aSubShapeIt.Next())
-    aRowsCount++;
+  if (myExplodeType != TopAbs_SHAPE)
+  {
+    TopTools_IndexedMapOfShape aSubShapes;
+    TopExp::MapShapes(aShape, myExplodeType, aSubShapes);
+    aRowsCount = aSubShapes.Extent();
+  }
+  else
+  {
+    for (TopoDS_Iterator aSubShapeIt(aShape); aSubShapeIt.More(); aSubShapeIt.Next())
+      aRowsCount++;
+  }
   return aRowsCount;
 }
 
+// =======================================================================
+// function : initStream
+// purpose :
+// =======================================================================
+void ShapeView_ItemShape::initStream (Standard_OStream& theOStream) const
+{
+  TopoDS_Shape aShape = getShape();
+  if (aShape.IsNull())
+    return;
+
+  aShape.DumpJson (theOStream);
+}
+
 // =======================================================================
 // function : createChild
 // purpose :
@@ -304,7 +141,9 @@ void ShapeView_ItemShape::Init()
 {
   ShapeView_ItemRootPtr aRootItem = itemDynamicCast<ShapeView_ItemRoot> (Parent());
   ShapeView_ItemShapePtr aShapeItem = itemDynamicCast<ShapeView_ItemShape> (Parent());
-  myShape = aRootItem ? aRootItem->GetShape (Row()) : aShapeItem->GetShape (Row());
+  myShape = aRootItem ? aRootItem->Shape (Row()) : aShapeItem->Shape (Row());
+
+  TreeModel_ItemBase::Init();
 }
 
 // =======================================================================
@@ -317,30 +156,6 @@ TopoDS_Shape ShapeView_ItemShape::getShape() const
   return myShape;
 }
 
-// =======================================================================
-// function : getPointerInfo
-// purpose :
-// =======================================================================
-TCollection_AsciiString ShapeView_ItemShape::getPointerInfo (const Handle(Standard_Transient)& thePointer, const bool isShortInfo)
-{
-  std::ostringstream aPtrStr;
-  aPtrStr << thePointer.operator->();
-  if (!isShortInfo)
-    return aPtrStr.str().c_str();
-
-  TCollection_AsciiString anInfoPtr (aPtrStr.str().c_str());
-  for (int aSymbolId = 1; aSymbolId < anInfoPtr.Length(); aSymbolId++)
-  {
-    if (anInfoPtr.Value(aSymbolId) != '0')
-    {
-      anInfoPtr = anInfoPtr.SubString(aSymbolId, anInfoPtr.Length());
-      anInfoPtr.Prepend("0x");
-      return anInfoPtr;
-    }
-  }
-  return aPtrStr.str().c_str();
-}
-
 // =======================================================================
 // function : Reset
 // purpose :
@@ -348,8 +163,10 @@ TCollection_AsciiString ShapeView_ItemShape::getPointerInfo (const Handle(Standa
 void ShapeView_ItemShape::Reset()
 {
   myFileName = QString();
+  myChildShapes.Clear();
+  myShape = TopoDS_Shape();
 
-  ShapeView_ItemBase::Reset();
+  TreeModel_ItemBase::Reset();
 }
 
 // =======================================================================
@@ -362,4 +179,3 @@ void ShapeView_ItemShape::initItem() const
     return;
   const_cast<ShapeView_ItemShape*>(this)->Init();
 }
-
index b040769..b6706d9 100644 (file)
 #ifndef ShapeView_ItemShape_H
 #define ShapeView_ItemShape_H
 
-#include <inspector/ShapeView_ItemBase.hxx>
+#include <inspector/TreeModel_ItemBase.hxx>
+
+#include <TopTools_IndexedMapOfShape.hxx>
+
 #include <Standard.hxx>
 #include <TCollection_AsciiString.hxx>
+#include <TopAbs_ShapeEnum.hxx>
 #include <TopoDS_Shape.hxx>
 
 #include <Standard_WarningsDisable.hxx>
@@ -32,19 +36,26 @@ typedef QExplicitlySharedDataPointer<ShapeView_ItemShape> ShapeView_ItemShapePtr
 //! \class ShapeView_ItemShape
 //! This item is connected to TopoDS_Shape.
 //! Parent is either ShapeView_ItemRoot or ShapeView_ItemShape, children are ShapeView_ItemShape or no children
-class ShapeView_ItemShape : public ShapeView_ItemBase
+class ShapeView_ItemShape : public TreeModel_ItemBase
 {
 public:
 
   //! Creates an item wrapped by a shared pointer
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
+  //! \param theRow the item row position in the parent item
+  //! \param theColumn the item column position in the parent item
   //! \return the pointer to the created item
   static ShapeView_ItemShapePtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
   { return ShapeView_ItemShapePtr (new ShapeView_ItemShape (theParent, theRow, theColumn)); }
 
   //! Destructor
-  virtual ~ShapeView_ItemShape() Standard_OVERRIDE {};
+  virtual ~ShapeView_ItemShape() {}
+
+  //! Returns explode type of the item
+  TopAbs_ShapeEnum ExplodeType() const { return myExplodeType; }
+
+  //! Sets explore type
+  //! \param theType type of item explode. If TopAbs_SHAPE, no explode, only iteration by shape
+  void SetExplodeType (const TopAbs_ShapeEnum theType) { myExplodeType  = theType; }
 
   //! Returns the current shape
   const TopoDS_Shape& GetItemShape() const { initItem(); return myShape; }
@@ -52,7 +63,7 @@ public:
   //! Returns child(extracted) shape for the current shape by the index
   //! \param theRowId an index of child shape
   //! \returns shape instance or NULL
-  Standard_EXPORT TopoDS_Shape GetShape (const int theRowId) const;
+  Standard_EXPORT TopoDS_Shape Shape (const int theRowId) const;
 
   //! Returns name of BREP file for the shape if exists
   //! \return string valuie
@@ -62,17 +73,13 @@ public:
   //! \return string valuie
   void SetFileName (const QString& theFileName) { myFileName = theFileName; }
 
-  //! Returns TShape pointer info of the current TopoDS Shape
-  //! \return string value
-  TCollection_AsciiString TShapePointer() const { return getPointerInfo (myShape.TShape()); }
-
   //! Inits the item, fills internal containers
   Standard_EXPORT virtual void Init() Standard_OVERRIDE;
 
   //! Resets cached values
   Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
 
-  //! Return data value for the role.
+  //! Returns data value for the role.
   //! \param theRole a value role
   //! \return the value
   Standard_EXPORT virtual QVariant initValue(const int theRole) const;
@@ -80,9 +87,13 @@ public:
   //! \return number of children.
   Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE;
 
+  //! Returns stream value of the item to fulfill property panel.
+  //! \return stream value or dummy
+  Standard_EXPORT virtual void initStream (Standard_OStream& theOStream) const Standard_OVERRIDE;
+
 protected:
 
-  //! Initialize the current item. It is empty because Reset() is also empty.
+  //! Initializes the current item. It is empty because Reset() is also empty.
   virtual void initItem() const Standard_OVERRIDE;
 
   //! Creates a child item in the given position.
@@ -99,22 +110,19 @@ protected:
   //! \return shape value
   TopoDS_Shape getShape() const;
 
-  //! Convert pointer to string value
-  //! \param thePointer a pointer
-  //! \param isShortInfo if true, all '0' symbols in the beginning of the pointer are skipped
-  //! \return the string value
-  static TCollection_AsciiString getPointerInfo (const Handle(Standard_Transient)& thePointer, const bool isShortInfo = true);
-
 private:
 
   //! Constructor
-  ShapeView_ItemShape(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  : ShapeView_ItemBase(theParent, theRow, theColumn) {}
+  ShapeView_ItemShape (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+    : TreeModel_ItemBase (theParent, theRow, theColumn), myExplodeType (TopAbs_SHAPE) {}
 
 private:
+  TopAbs_ShapeEnum myExplodeType; //!< type of explore own shape and get children
 
   TopoDS_Shape myShape; //!< current shape
   QString myFileName; //!< BREP file name
+
+  TopTools_IndexedMapOfShape myChildShapes; //!< cached container of child shapes
 };
 
 #endif
index 306326b..2950789 100644 (file)
@@ -135,9 +135,9 @@ private:
 
   QString myDataDir; //!< samples directory
   QString myFileName; //!< result file name
-  QTableView* mySamplesView; //! <view of sample file names
+  QTableView* mySamplesView; //!view of sample file names
   QLineEdit* mySelectedName; //!< alternative control to open file
-  QToolButton* myFolderApplyOpen; //! button to open file
+  QToolButton* myFolderApplyOpen; //!< button to open file
 };
 
 #endif
index 5a2847d..779fef5 100644 (file)
@@ -28,7 +28,7 @@
 class QObject;
 class QPainter;
 
-//! \class TInspectorEXE_OpenFileItemDelegate
+//! \class ShapeView_OpenFileItemDelegate
 //! Draws large(40x40) icons in cell. The icon background in colored in highlight when mouse is over button
 class ShapeView_OpenFileItemDelegate : public QItemDelegate
 {
@@ -41,7 +41,7 @@ public:
   //! Destructor
   virtual ~ShapeView_OpenFileItemDelegate() {}
 
-  //! Draw an icon in the cell
+  //! Draws an icon in the cell
   //! \param thePainter a painter
   //! \param theOption a paint options
   //! \param theIndex a view index
@@ -53,7 +53,7 @@ private:
   QColor myColor; //!< highlight color
 };
 
-//! \class TInspectorEXE_OpenFileViewModel
+//! \class ShapeView_OpenFileViewModel
 //! Table model that visualizes container of string values (file names)
 //! Table orientation is horizontal, it has 1 row, number of columns equals to number of values
 class ShapeView_OpenFileViewModel : public QAbstractTableModel
@@ -66,7 +66,7 @@ public:
   //! Destructor
   virtual ~ShapeView_OpenFileViewModel() {}
 
-  //! Store values
+  //! Stores values
   //! \param theValues a container of values to fill model
   void Init (const QStringList& theValues);
 
index afa6de4..daea444 100644 (file)
 // commercial license or contractual agreement. 
 
 #include <inspector/ShapeView_Tools.hxx>
+#include <inspector/ShapeView_ItemShape.hxx>
 
-#include <BRep_Builder.hxx>
-#include <BRepTools.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Iterator.hxx>
+
+#include <TopExp.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
 
-#include <AIS_Shape.hxx>
 // =======================================================================
-// function : ReadShape
+// function : IsPossibleToExplode
 // purpose :
 // =======================================================================
-TopoDS_Shape ShapeView_Tools::ReadShape (const TCollection_AsciiString& theFileName)
+Standard_Boolean ShapeView_Tools::IsPossibleToExplode (const TopoDS_Shape& theShape,
+  NCollection_List<TopAbs_ShapeEnum>& theExplodeTypes)
 {
-  TopoDS_Shape aShape;
+  TopAbs_ShapeEnum aShapeType = theShape.ShapeType();
+
+  if (!theExplodeTypes.Contains (aShapeType))
+    theExplodeTypes.Append(aShapeType);
+
+  if (theExplodeTypes.Extent() == TopAbs_SHAPE + 1) // all types are collected, stop
+    return Standard_True;
 
-  BRep_Builder aBuilder;
-  BRepTools::Read (aShape, theFileName.ToCString(), aBuilder);
-  return aShape;
+  TopoDS_Iterator aSubShapeIt (theShape);
+  for (int aCurrentIndex = 0; aSubShapeIt.More(); aSubShapeIt.Next(), aCurrentIndex++)
+  {
+    if (IsPossibleToExplode (aSubShapeIt.Value(), theExplodeTypes))
+      return Standard_True;
+  }
+  return Standard_False;
 }
index a922e42..fd8b4d4 100644 (file)
 
 #include <Standard.hxx>
 
+#include <inspector/TreeModel_ItemBase.hxx>
+
+#include <NCollection_List.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <Standard_Transient.hxx>
 #include <TopoDS_Shape.hxx>
 
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <GeomAbs_Shape.hxx>
+#include <Standard_WarningsDisable.hxx>
+#include <QList>
+#include <QVariant>
+#include <Standard_WarningsRestore.hxx>
+
 //! \class ShapeView_Tools
 //! It gives auxiliary methods for TopoDS_Shape manipulation
 class ShapeView_Tools
 {
 public:
 
-  //! Read Shape using BREP reader
-  //! \param theFileName a file name
-  //! \return shape or NULL
-  Standard_EXPORT static TopoDS_Shape ReadShape (const TCollection_AsciiString& theFileName);
+  //! Checks whether it is possible to explode the shape. The search is recursive until all types are collected.
+  //! \param theShape [in] source shape object
+  //! \param theExplodeTypes [out] container of possible shape types to be exploded
+  //! \return true if explode is finished, all types are collected.
+  Standard_EXPORT static Standard_Boolean IsPossibleToExplode(const TopoDS_Shape& theShape,
+    NCollection_List<TopAbs_ShapeEnum>& theExplodeTypes);
+
 };
 
 #endif
index bc29c11..288b20c 100644 (file)
 #include <inspector/ShapeView_ItemRoot.hxx>
 #include <inspector/ShapeView_ItemShape.hxx>
 
-const int COLUMN_NAME_WIDTH = 190;
-const int COLUMN_SIZE_WIDTH = 30;
-const int COLUMN_POINTER_WIDTH = 70;
-const int COLUMN_SHAPE_TYPE_WIDTH = 75;
-
-const int COLUMN_ORIENTATION_WIDTH = 70;
-const int COLUMN_LOCATION_WIDTH = 120;
-
 // =======================================================================
 // function : Constructor
 // purpose :
@@ -34,40 +26,15 @@ const int COLUMN_LOCATION_WIDTH = 120;
 ShapeView_TreeModel::ShapeView_TreeModel (QObject* theParent)
 : TreeModel_ModelBase (theParent)
 {
-  SetHeaderItem (0, TreeModel_HeaderSection ("Name", COLUMN_NAME_WIDTH));
-  // column 1 is reserved for visiblity state
-  SetHeaderItem (2, TreeModel_HeaderSection ("Size", COLUMN_SIZE_WIDTH));
-  SetHeaderItem (3, TreeModel_HeaderSection ("Pointer", COLUMN_POINTER_WIDTH));
-  SetHeaderItem (4, TreeModel_HeaderSection ("Orientation", COLUMN_ORIENTATION_WIDTH));
-  SetHeaderItem (5, TreeModel_HeaderSection ("Location", COLUMN_LOCATION_WIDTH));
-
-  SetHeaderItem (6, TreeModel_HeaderSection ("Checked", -1, true));
-  SetHeaderItem (7, TreeModel_HeaderSection ("Closed", -1, true));
-  SetHeaderItem (8, TreeModel_HeaderSection ("Infinite", -1, true));
-  SetHeaderItem (9, TreeModel_HeaderSection ("Locked", -1, true));
-  SetHeaderItem (10, TreeModel_HeaderSection ("Modified", -1, true));
-  SetHeaderItem (11, TreeModel_HeaderSection ("Orientable", -1, true));
-
-  SetHeaderItem (12, TreeModel_HeaderSection ("VERTEX: (X, Y, Z)", -1, true));
-
-  SetHeaderItem (13, TreeModel_HeaderSection ("EDGE: Length", -1, true));
-  SetHeaderItem (14, TreeModel_HeaderSection ("DynamicType", -1, true));
-  SetHeaderItem (15, TreeModel_HeaderSection ("First", -1, true));
-  SetHeaderItem (16, TreeModel_HeaderSection ("Last", -1, true));
-  SetHeaderItem (17, TreeModel_HeaderSection ("Continuity", -1, true));
-  SetHeaderItem (18, TreeModel_HeaderSection ("IsClosed", -1, true));
-  SetHeaderItem (19, TreeModel_HeaderSection ("IsPeriodic", -1, true));
 }
 
 // =======================================================================
 // function : createRootItem
 // purpose :
 // =======================================================================
-void ShapeView_TreeModel::createRootItem (const int theColumnId)
+TreeModel_ItemBasePtr ShapeView_TreeModel::createRootItem (const int theColumnId)
 {
-  myRootItems.insert (theColumnId, ShapeView_ItemRoot::CreateItem (TreeModel_ItemBasePtr(), 0, theColumnId));
-  if (theColumnId == 0)
-      m_pRootItem = myRootItems[0];
+  return ShapeView_ItemRoot::CreateItem (TreeModel_ItemBasePtr(), 0, theColumnId);
 }
 
 // =======================================================================
index 7778ad5..81b925b 100644 (file)
@@ -16,7 +16,7 @@
 #ifndef ShapeView_TreeModel_H
 #define ShapeView_TreeModel_H
 
-#include <inspector/ShapeView_ItemBase.hxx>
+#include <inspector/TreeModel_ItemBase.hxx>
 #include <Standard.hxx>
 #include <TopoDS_Shape.hxx>
 #include <inspector/TreeModel_ModelBase.hxx>
@@ -38,21 +38,15 @@ public:
   Standard_EXPORT ShapeView_TreeModel (QObject* theParent);
 
   //! Destructor
-  virtual ~ShapeView_TreeModel() Standard_OVERRIDE {};
+  virtual ~ShapeView_TreeModel() {}
 
-  //! Add shape, append it to the model root item
+  //! Adds shape, append it to the model root item
   //! \param theShape a shape instance
   Standard_EXPORT void AddShape (const TopoDS_Shape& theShape);
 
-  //! Remove all shapes in the model root item
+  //! Removes all shapes in the model root item
   Standard_EXPORT void RemoveAllShapes();
 
-  //! Returns root item by column
-  //! \param theColumn an index of the column
-  //! \return root item instance
-  virtual TreeModel_ItemBasePtr RootItem(const int theColumn) const Standard_OVERRIDE
-  { return myRootItems[theColumn]; }
-
   //! Returns model index of the shape.
   //! \param theShape a shape object
   //! \return the model index
@@ -61,10 +55,8 @@ public:
 protected:
   //! Creates root item
   //! \param theColumnId index of a column
-  virtual void createRootItem (const int theColumnId) Standard_OVERRIDE;
+  Standard_EXPORT virtual TreeModel_ItemBasePtr createRootItem (const int theColumnId) Standard_OVERRIDE;
 
-private:
-  QMap<int, TreeModel_ItemBasePtr> myRootItems; //!< container of root items, for each column own root item
 };
 
 #endif
index 7e7e02f..3b330f7 100644 (file)
 
 #include <inspector/ShapeView_ItemShape.hxx>
 
+// =======================================================================
+// function : OnClicked
+// purpose :
+// =======================================================================
+void ShapeView_VisibilityState::OnClicked (const QModelIndex& theIndex)
+{
+  processClicked (theIndex);
+  emit itemClicked (theIndex);
+}
+
 // =======================================================================
 // function : SetVisible
 // purpose :
 // =======================================================================
 bool ShapeView_VisibilityState::SetVisible (const QModelIndex& theIndex, const bool theState, const bool toEmitDataChanged)
 {
-  TopoDS_Shape aShape = GetShape (theIndex);
+  TopoDS_Shape aShape = Shape (theIndex);
   if (aShape.IsNull())
     return false;
 
@@ -35,10 +45,10 @@ bool ShapeView_VisibilityState::SetVisible (const QModelIndex& theIndex, const b
 }
 
 // =======================================================================
-// function : GetShape
+// function : Shape
 // purpose :
 // =======================================================================
-TopoDS_Shape ShapeView_VisibilityState::GetShape (const QModelIndex& theIndex) const
+TopoDS_Shape ShapeView_VisibilityState::Shape (const QModelIndex& theIndex) const
 {
   TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (theIndex);
   if (!anItemBase)
index 4d384d6..f38229d 100644 (file)
@@ -28,8 +28,9 @@ class TreeModel_ModelBase;
 
 //! \class ShapeView_VisibilityState
 //! \brief Class provides connection between model and visualization control
-class ShapeView_VisibilityState : public TreeModel_VisibilityState
+class ShapeView_VisibilityState : public QObject, public TreeModel_VisibilityState
 {
+  Q_OBJECT
 public:
   //! Constructor
   ShapeView_VisibilityState (TreeModel_ModelBase* theModel) : TreeModel_VisibilityState (theModel),
@@ -49,7 +50,7 @@ public:
   //! Returns true if visibility of the item can be changed
   //! \param theIndex tree model index
   //! \return boolean value
-  virtual bool CanBeVisible (const QModelIndex& theIndex) const Standard_OVERRIDE { return !GetShape (theIndex).IsNull(); }
+  virtual bool CanBeVisible (const QModelIndex& theIndex) const Standard_OVERRIDE { return !Shape (theIndex).IsNull(); }
 
   //! Sets visibility state
   //! \theIndex tree model index
@@ -60,17 +61,28 @@ public:
 
   //! Returns visibility state value
   virtual bool IsVisible (const QModelIndex& theIndex) const Standard_OVERRIDE
-  { return myDisplayer->IsVisible (GetShape (theIndex), myPresentationType); }
+  { return myDisplayer->IsVisible (Shape (theIndex), myPresentationType); }
+
+public slots:
+  //! Processes the mouse clicked on the index.
+  //! It changes the item visibility if model allows to change it.
+  //! \theIndex tree model index
+  void OnClicked (const QModelIndex& theIndex);
+
+signals:
+  //! Signal after OnClicked is performed
+  //! \theIndex tree model index
+  void itemClicked (const QModelIndex& theIndex);
 
 protected:
   //! Gets shape of the view model by the parameter index if it has a shape
   //! \param theIndex tree model index
   //! \return shape instance
-  TopoDS_Shape GetShape (const QModelIndex& theIndex) const;
+  TopoDS_Shape Shape (const QModelIndex& theIndex) const;
 
 private:
-  View_Displayer* myDisplayer; //! view displayer
-  View_PresentationType myPresentationType; //! presentation type
+  View_Displayer* myDisplayer; //!< view displayer
+  View_PresentationType myPresentationType; //!< presentation type
 };
 
 #endif
index 76eaefa..bfe8d34 100644 (file)
 #include <inspector/ShapeView_TreeModel.hxx>
 #include <inspector/ShapeView_VisibilityState.hxx>
 
+#include <inspector/Convert_Tools.hxx>
+
 #include <inspector/TreeModel_Tools.hxx>
 #include <inspector/TreeModel_ContextMenu.hxx>
 
+#include <inspector/ViewControl_PropertyView.hxx>
 #include <inspector/ViewControl_Tools.hxx>
 #include <inspector/ViewControl_TreeView.hxx>
 
 #include <inspector/View_Displayer.hxx>
 #include <inspector/View_PresentationType.hxx>
-#include <inspector/View_Tools.hxx>
 #include <inspector/View_ToolBar.hxx>
 #include <inspector/View_Widget.hxx>
 #include <inspector/View_Window.hxx>
@@ -83,7 +85,7 @@ const int SHAPEVIEW_DEFAULT_VIEW_HEIGHT = 1000;
 // purpose :
 // =======================================================================
 ShapeView_Window::ShapeView_Window (QWidget* theParent)
-: QObject (theParent), myNextPosition (0)
+: QObject (theParent)
 {
   myMainWindow = new QMainWindow (theParent);
 
@@ -95,28 +97,48 @@ ShapeView_Window::ShapeView_Window (QWidget* theParent)
           this, SLOT (onTreeViewContextMenuRequested (const QPoint&)));
   new TreeModel_ContextMenu (myTreeView);
   ShapeView_TreeModel* aModel = new ShapeView_TreeModel (myTreeView);
+  aModel->InitColumns();
+
   myTreeView->setModel (aModel);
   ShapeView_VisibilityState* aVisibilityState = new ShapeView_VisibilityState (aModel);
   aModel->SetVisibilityState (aVisibilityState);
   TreeModel_Tools::UseVisibilityColumn (myTreeView);
+  QObject::connect (myTreeView, SIGNAL (clicked (const QModelIndex&)), 
+                    aVisibilityState, SLOT (OnClicked(const QModelIndex&)));
+
+  QItemSelectionModel* aSelModel = new QItemSelectionModel (myTreeView->model(), myTreeView);
+  myTreeView->setSelectionModel (aSelModel);
+  connect (aSelModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
+           this, SLOT (onTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&)));
 
   QModelIndex aParentIndex = myTreeView->model()->index (0, 0);
   myTreeView->setExpanded (aParentIndex, true);
   myMainWindow->setCentralWidget (myTreeView);
 
+  // property view
+  myPropertyView = new ViewControl_PropertyView (myMainWindow,
+    QSize(SHAPEVIEW_DEFAULT_VIEW_WIDTH, SHAPEVIEW_DEFAULT_VIEW_HEIGHT));
+  myPropertyPanelWidget = new QDockWidget (tr ("PropertyPanel"), myMainWindow);
+  myPropertyPanelWidget->setObjectName (myPropertyPanelWidget->windowTitle());
+  myPropertyPanelWidget->setTitleBarWidget (new QWidget(myMainWindow));
+  myPropertyPanelWidget->setWidget (myPropertyView->GetControl());
+  myMainWindow->addDockWidget (Qt::RightDockWidgetArea, myPropertyPanelWidget);
+
   // view
-  myViewWindow = new View_Window (myMainWindow, false);
+  myViewWindow = new View_Window (myMainWindow, NULL, false);
   connect (myViewWindow, SIGNAL(eraseAllPerformed()), this, SLOT(onEraseAllPerformed()));
-  aVisibilityState->SetDisplayer (myViewWindow->GetDisplayer());
+  aVisibilityState->SetDisplayer (myViewWindow->Displayer());
   aVisibilityState->SetPresentationType (View_PresentationType_Main);
-  myViewWindow->GetView()->SetPredefinedSize (SHAPEVIEW_DEFAULT_VIEW_WIDTH, SHAPEVIEW_DEFAULT_VIEW_HEIGHT);
+  myViewWindow->ViewWidget()->SetPredefinedSize (SHAPEVIEW_DEFAULT_VIEW_WIDTH, SHAPEVIEW_DEFAULT_VIEW_HEIGHT);
 
   QDockWidget* aViewDockWidget = new QDockWidget (tr ("View"), myMainWindow);
   aViewDockWidget->setObjectName (aViewDockWidget->windowTitle());
   aViewDockWidget->setWidget (myViewWindow);
-  aViewDockWidget->setTitleBarWidget (myViewWindow->GetViewToolBar()->GetControl());
+  aViewDockWidget->setTitleBarWidget (myViewWindow->ViewToolBar()->GetControl());
   myMainWindow->addDockWidget (Qt::RightDockWidgetArea, aViewDockWidget);
 
+  myMainWindow->splitDockWidget(myPropertyPanelWidget, aViewDockWidget, Qt::Vertical);
+
   myMainWindow->resize (DEFAULT_SHAPE_VIEW_WIDTH, DEFAULT_SHAPE_VIEW_HEIGHT);
   myMainWindow->move (DEFAULT_SHAPE_VIEW_POSITION_X, DEFAULT_SHAPE_VIEW_POSITION_Y);
 }
@@ -127,7 +149,6 @@ ShapeView_Window::ShapeView_Window (QWidget* theParent)
 // =======================================================================
 ShapeView_Window::~ShapeView_Window()
 {
-  onCloseAllBREPViews();
 }
 
 // =======================================================================
@@ -171,7 +192,7 @@ void ShapeView_Window::GetPreferences (TInspectorAPI_PreferencesDataMap& theItem
 
   QMap<QString, QString> anItems;
   TreeModel_Tools::SaveState (myTreeView, anItems);
-  View_Tools::SaveState(myViewWindow, anItems);
+  View_Window::SaveState(myViewWindow, anItems);
   for (QMap<QString, QString>::const_iterator anItemsIt = anItems.begin(); anItemsIt != anItems.end(); anItemsIt++)
     theItem.Bind (anItemsIt.key().toStdString().c_str(), anItemsIt.value().toStdString().c_str());
 }
@@ -194,7 +215,7 @@ void ShapeView_Window::SetPreferences (const TInspectorAPI_PreferencesDataMap& t
       myMainWindow->restoreState (TreeModel_Tools::ToByteArray (anItemIt.Value().ToCString()));
     else if (TreeModel_Tools::RestoreState (myTreeView, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
       continue;
-    else if (View_Tools::RestoreState(myViewWindow, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
+    else if (View_Window::RestoreState(myViewWindow, anItemIt.Key().ToCString(), anItemIt.Value().ToCString()))
       continue;
   }
 }
@@ -302,7 +323,7 @@ void ShapeView_Window::Init (NCollection_List<Handle(Standard_Transient)>& thePa
 // =======================================================================
 void ShapeView_Window::OpenFile(const TCollection_AsciiString& theFileName)
 {
-  TopoDS_Shape aShape = ShapeView_Tools::ReadShape (theFileName);
+  TopoDS_Shape aShape = Convert_Tools::ReadShape (theFileName);
   if (!aShape.IsNull())
     addShape(aShape);
 }
@@ -315,8 +336,6 @@ void ShapeView_Window::RemoveAllShapes()
 {
   ShapeView_TreeModel* aModel = dynamic_cast<ShapeView_TreeModel*> (myTreeView->model());
   aModel->RemoveAllShapes();
-
-  onCloseAllBREPViews();
 }
 
 // =======================================================================
@@ -351,16 +370,52 @@ void ShapeView_Window::onTreeViewContextMenuRequested (const QPoint& thePosition
     aMenu->addAction (ViewControl_Tools::CreateAction ("Remove all shape items", SLOT (onClearView()), myMainWindow, this));
   }
   else {
-    if (!GetTemporaryDirectory().IsEmpty())
-      aMenu->addAction (ViewControl_Tools::CreateAction ("BREP view", SLOT (onBREPView()), myMainWindow, this));
-    aMenu->addAction (ViewControl_Tools::CreateAction ("Close All BREP views", SLOT (onCloseAllBREPViews()), myMainWindow, this));
-    aMenu->addAction (ViewControl_Tools::CreateAction ("BREP directory", SLOT (onBREPDirectory()), myMainWindow, this));
+    aMenu->addAction (ViewControl_Tools::CreateAction ("Export to BREP", SLOT (onExportToBREP()), myMainWindow, this));
+    ShapeView_ItemShapePtr aShapeItem = itemDynamicCast<ShapeView_ItemShape>(anItemBase);
+    const TopoDS_Shape& aShape = aShapeItem->GetItemShape();
+    TopAbs_ShapeEnum anExplodeType = aShapeItem->ExplodeType();
+    NCollection_List<TopAbs_ShapeEnum> anExplodeTypes;
+    ShapeView_Tools::IsPossibleToExplode (aShape, anExplodeTypes);
+    if (anExplodeTypes.Size() > 0)
+    {
+      QMenu* anExplodeMenu = aMenu->addMenu ("Explode");
+      for (NCollection_List<TopAbs_ShapeEnum>::Iterator anExpIterator (anExplodeTypes); anExpIterator.More();
+        anExpIterator.Next())
+      {
+        TopAbs_ShapeEnum aType = anExpIterator.Value();
+        QAction* anAction = ViewControl_Tools::CreateAction (TopAbs::ShapeTypeToString (aType), SLOT (onExplode()), myMainWindow, this);
+        anExplodeMenu->addAction (anAction);
+        if (anExplodeType == aType)
+        {
+          anAction->setCheckable (true);
+          anAction->setChecked (true);
+        }
+      }
+      QAction* anAction = ViewControl_Tools::CreateAction ("NONE", SLOT (onExplode()), myMainWindow, this);
+      anExplodeMenu->addSeparator();
+      anExplodeMenu->addAction (anAction);
+    }
   }
 
   QPoint aPoint = myTreeView->mapToGlobal (thePosition);
   aMenu->exec (aPoint);
 }
 
+// =======================================================================
+// function : onTreeViewSelectionChanged
+// purpose :
+// =======================================================================
+void ShapeView_Window::onTreeViewSelectionChanged (const QItemSelection&,
+                                                   const QItemSelection&)
+{
+  QApplication::setOverrideCursor (Qt::WaitCursor);
+
+  if (myPropertyPanelWidget->toggleViewAction()->isChecked())
+    myPropertyView->Init (ViewControl_Tools::CreateTableModelValues (myTreeView->selectionModel()));
+
+  QApplication::restoreOverrideCursor();
+}
+
 // =======================================================================
 // function : onEraseAllPerformed
 // purpose :
@@ -376,17 +431,43 @@ void ShapeView_Window::onEraseAllPerformed()
 }
 
 // =======================================================================
-// function : onBREPDirectory
+// function : onExplode
 // purpose :
 // =======================================================================
-void ShapeView_Window::onBREPDirectory()
+void ShapeView_Window::onExplode()
 {
-  QString aFilter (tr ("BREP file (*.brep*)"));
-  QString aSelectedFilter;
-  QString aFileName = QFileDialog::getOpenFileName (0, tr ("Export shape to BREP file"),
-                                                    GetTemporaryDirectory().ToCString(), aSelectedFilter);
-  if (!aFileName.isEmpty())
-    viewFile (aFileName);
+  QItemSelectionModel* aModel = myTreeView->selectionModel();
+  if (!aModel)
+    return;
+
+  QModelIndex anIndex = TreeModel_ModelBase::SingleSelected(aModel->selectedIndexes(), 0);
+  TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex(anIndex);
+  if (!anItemBase)
+    return;
+
+  ShapeView_ItemShapePtr aShapeItem = itemDynamicCast<ShapeView_ItemShape>(anItemBase);
+  if (!aShapeItem)
+    return;
+
+  QAction* anAction = (QAction*)sender();
+  if (!anAction)
+    return;
+
+  QApplication::setOverrideCursor (Qt::WaitCursor);
+  TopAbs_ShapeEnum aShapeType;
+  if (anAction->text() == "NONE")
+    aShapeType = TopAbs_SHAPE;
+  else
+    aShapeType = TopAbs::ShapeTypeFromString(anAction->text().toStdString().c_str());
+
+  myViewWindow->Displayer()->EraseAllPresentations();
+  aShapeItem->SetExplodeType(aShapeType);
+
+  //anItemBase->Parent()->Reset(); - TODO (update only modified sub-tree)
+  ShapeView_TreeModel* aTreeModel = dynamic_cast<ShapeView_TreeModel*> (myTreeView->model());
+  aTreeModel->Reset();
+  aTreeModel->EmitLayoutChanged();
+  QApplication::restoreOverrideCursor();
 }
 
 // =======================================================================
@@ -399,18 +480,23 @@ void ShapeView_Window::onLoadFile()
 
   QString aFileName = ShapeView_OpenFileDialog::OpenFile(0, aDataDirName);
   aFileName = QDir().toNativeSeparators (aFileName);
-  if (!aFileName.isEmpty())
-    onOpenFile(aFileName);
+  if (aFileName.isEmpty())
+    return;
+
+  QApplication::setOverrideCursor (Qt::WaitCursor);
+  onOpenFile(aFileName);
+  QApplication::restoreOverrideCursor();
 }
 
 // =======================================================================
-// function : onBREPView
+// function : onExportToBREP
 // purpose :
 // =======================================================================
-void ShapeView_Window::onBREPView()
+void ShapeView_Window::onExportToBREP()
 {
-  if (GetTemporaryDirectory().IsEmpty())
-    return;
+  QString aFilter (tr ("Boundary representation file (*.brep *)"));
+  QString aSelectedFilter;
+  QString aFileName = QFileDialog::getSaveFileName (0, tr ("Export shape to file"), QString(), aFilter, &aSelectedFilter);
 
   QItemSelectionModel* aModel = myTreeView->selectionModel();
   if (!aModel)
@@ -429,107 +515,9 @@ void ShapeView_Window::onBREPView()
   if (!anItem)
     return;
 
-  QString aFileName = anItem->GetFileName();
-  QDir aDir;
-  if (aFileName.isEmpty() || !aDir.exists (aFileName))
-  {
-    TCollection_AsciiString aFileNameIndiced = GetTemporaryDirectory() + TCollection_AsciiString ("\\") +
-                                               getNextTmpName (anItem->TShapePointer());
-    const TopoDS_Shape& aShape = anItem->GetItemShape();
-    BRepTools::Write (aShape, aFileNameIndiced.ToCString());
-    anItem->SetFileName (aFileNameIndiced.ToCString());
-    aFileName = aFileNameIndiced.ToCString();
-  }
-  viewFile (aFileName);
-}
-
-// =======================================================================
-// function : onCloseAllBREPViews
-// purpose :
-// =======================================================================
-void ShapeView_Window::onCloseAllBREPViews()
-{
-  removeBREPFiles();
-
-  for (int aViewId = myBREPViews.size()-1; aViewId >= 0; aViewId--)
-    delete myBREPViews[aViewId];
-
-  myBREPViews.clear();
-}
-
-// =======================================================================
-// function : onEditorDestroyed
-// purpose :
-// =======================================================================
-void ShapeView_Window::onEditorDestroyed(QObject* theObject)
-{
-  QWidget* aWidget = dynamic_cast<QWidget*> (theObject);
-
-  for (int aViewId = myBREPViews.size()-1; aViewId >= 0; aViewId--)
-  {
-    if (myBREPViews[aViewId] == aWidget)
-      myBREPViews.removeAll(aWidget);
-  }
-}
-
-// =======================================================================
-// function : viewFile
-// purpose :
-// =======================================================================
-void ShapeView_Window::viewFile (const QString& theFileName)
-{
-  QApplication::setOverrideCursor (Qt::WaitCursor);
-  QString aFileText;
-  QFile aFile (theFileName);
-  if (aFile.open (QIODevice::ReadOnly | QIODevice::Text))
-  {
-    QTextStream aStream(&aFile);
-    QString aLine = aStream.readLine();
-    while (!aLine.isNull())
-    {
-      aLine = aStream.readLine();
-      aFileText.append (aLine + QString ("\n"));
-    }
-    if (!aFileText.isEmpty())
-    {
-      QPlainTextEdit* anEditor = new QPlainTextEdit (0);
-      anEditor->setAttribute (Qt::WA_DeleteOnClose, true);
-      connect (anEditor, SIGNAL (destroyed(QObject*)), this, SLOT (onEditorDestroyed(QObject*)));
-      anEditor->setPlainText (aFileText);
-      anEditor->resize (DEFAULT_TEXT_VIEW_WIDTH, DEFAULT_TEXT_VIEW_HEIGHT);
-      anEditor->move (DEFAULT_TEXT_VIEW_POSITION_X + myNextPosition, DEFAULT_TEXT_VIEW_POSITION_Y);
-      myNextPosition += DEFAULT_TEXT_VIEW_DELTA;
-      anEditor->show();
-      myBREPViews.append (anEditor);
-    }
-  }
-  QApplication::restoreOverrideCursor();
-}
-
-// =======================================================================
-// function : removeBREPFiles
-// purpose :
-// =======================================================================
-void ShapeView_Window::removeBREPFiles()
-{
-  QDir aDir (GetTemporaryDirectory().ToCString());
-
-  QStringList anEntries = aDir.entryList();
-  QString aPrefix(viewBREPPrefix().ToCString());
-  for (int anEntryId = 0, aSize = anEntries.size(); anEntryId < aSize; anEntryId++)
-  {
-    if (anEntries[anEntryId].contains (aPrefix))
-      aDir.remove (anEntries[anEntryId]);
-  }
-}
-
-// =======================================================================
-// function : getNextTmpName
-// purpose :
-// =======================================================================
-TCollection_AsciiString ShapeView_Window::getNextTmpName (const TCollection_AsciiString& thePointerInfo)
-{
-  TCollection_AsciiString aTmpName(viewBREPPrefix());
-  aTmpName += thePointerInfo;
-  return aTmpName;
+  TCollection_AsciiString aFileNameIndiced = aFileName.toStdString().c_str();
+  const TopoDS_Shape& aShape = anItem->GetItemShape();
+  BRepTools::Write (aShape, aFileNameIndiced.ToCString());
+  anItem->SetFileName (aFileNameIndiced.ToCString());
+  aFileName = aFileNameIndiced.ToCString();
 }
index 39274f8..9501193 100644 (file)
 
 class View_Window;
 
+class ViewControl_PropertyView;
+
 class QAction;
+class QDockWidget;
 class QMainWindow;
 class QWidget;
 
@@ -59,7 +62,7 @@ public:
   //! \param theParameters a parameters container
   void SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters) { myParameters = theParameters; }
 
-  //! Provide container for actions available in inspector on general level
+  //! Provides container for actions available in inspector on general level
   //! \param theMenu if Qt implementation, it is QMenu object
   Standard_EXPORT virtual void FillActionsMenu (void* theMenu);
 
@@ -80,9 +83,6 @@ public:
   //! Returns current tree view
   QTreeView* GetTreeView() const { return myTreeView; }
 
-  //! Returns path to temporary directory
-  TCollection_AsciiString GetTemporaryDirectory() const { return myParameters->GetTemporaryDirectory(); }
-
   //! Removes all shapes in tree view model, remove all stored BREP files
   Standard_EXPORT void RemoveAllShapes();
 
@@ -98,7 +98,7 @@ private:
   //! \param theParameters a parameters container
   void Init (NCollection_List<Handle(Standard_Transient)>& theParameters);
 
-  //! Read Shape from the file name, add Shape into tree view
+  //! Reads Shape from the file name, add Shape into tree view
   //! \param theFileName BREP file name
   void OpenFile (const TCollection_AsciiString& theFileName);
 
@@ -108,64 +108,47 @@ protected slots:
   //! \param thePosition a clicked point
   void onTreeViewContextMenuRequested (const QPoint& thePosition);
 
+  //! Processes selection in tree view: make presentation or owner selected in the context if corresponding
+  //! check box is checked
+  //! \param theSelected a selected items
+  //! \param theDeselected a deselected items
+  void onTreeViewSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
   //! Updates visibility states by erase all in context
   void onEraseAllPerformed();
 
-  //! Exports shape to BREP file and view result file
-  void onBREPDirectory();
+  //! Sets the shape item exploded
+  void onExplode();
 
   //! Removes all shapes in tree view
   void onClearView() { RemoveAllShapes(); }
 
-  //! Load BREP file and updates tree model to have shape of the file
+  //! Loads BREP file and updates tree model to have shape of the file
   void onLoadFile();
 
-  //! View BREP files of selected items if exist
-  void onBREPView();
-
-  //! Remove BREP views, close views
-  void onCloseAllBREPViews();
-
-  //! Remove all BREP Viewse excepting active
-  void onEditorDestroyed (QObject* theObject);
+  //! Views BREP files of selected items if exist
+  void onExportToBREP();
 
   //! Convers file name to Ascii String and perform opeging file
   //! \param theFileName a file name to be opened
   void onOpenFile(const QString& theFileName) { OpenFile (TCollection_AsciiString (theFileName.toUtf8().data())); }
 
 protected:
-
-  //! Views file name content in a text editor. It creates new Qt free control with content.
-  //! \param theFileName a file name
-  void viewFile (const QString& theFileName);
-
-  //! Removes all BREP files in tmp directory
-  void removeBREPFiles();
-
   //! Creates new action and connect it to the given slot
   //! \param theText an action text
   //! \param theSlot a listener method
   QAction* createAction (const QString& theText, const char* theSlot);
 
-  //! Key that uses to generate BREP file name
-  //! \return string value
-  static TCollection_AsciiString viewBREPPrefix() { return "ShapeView_Window"; }
-
-  //! Returns newxt temporary name using BREPPrefix and pointer information
-  //! \param thePointerInfo a pointer value
-  //! \return string value
-  TCollection_AsciiString getNextTmpName (const TCollection_AsciiString& thePointerInfo);
-
 private:
 
   QMainWindow* myMainWindow; //!< main control, parent for all ShapeView controls
 
+  QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget
+  ViewControl_PropertyView* myPropertyView; //!< property control to display model item values if exist
+
   View_Window* myViewWindow; //!< OCC 3d view to visualize presentations
   QTreeView* myTreeView; //!< tree view visualized shapes
 
-  int myNextPosition; //!< delta of moving control of view BREP file
-
-  QList<QWidget*> myBREPViews; //!< list of view BREP file controls
   Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container
 };
 
index 21dba46..471fd38 100644 (file)
@@ -1,6 +1,12 @@
 TInspector.qrc
 TInspector_Communicator.cxx
 TInspector_Communicator.hxx
+TInspector_OpenButton.cxx
+TInspector_OpenButton.hxx
+TInspector_OpenFileDialog.cxx
+TInspector_OpenFileDialog.hxx
+TInspector_OpenFileViewModel.cxx
+TInspector_OpenFileViewModel.hxx
 TInspector_PluginParameters.cxx
 TInspector_PluginParameters.hxx
 TInspector_Preferences.cxx
index 8fbf4bb..439185f 100644 (file)
@@ -1,6 +1,7 @@
 <!DOCTYPE RCC><RCC version="1.0">
     <qresource>
-        <file>icons/item_algo_folder.png</file>
-        <file>icons/plugin_actions.png</file>
+        <file alias="folder_open.png">icons/folder_open.png</file>
+        <file alias="folder_import.png">icons/folder_import.png</file>
+        <file alias="plugin_actions.png">icons/plugin_actions.png</file>
     </qresource>
 </RCC>
index bd5fbc7..f2d8633 100644 (file)
@@ -64,13 +64,13 @@ public:
              const Standard_Boolean theAppend = Standard_False)
   { myWindow->Init (thePluginName, theParameters, theAppend); }
 
-  //! UpdateContent for the TInspector window
+  //! Updates content for the TInspector window
   void UpdateContent() { myWindow->UpdateContent(); }
 
-  //! SetOpenButton for the TInspector window
+  //! Sets open button for the TInspector window
   void SetOpenButton (QPushButton* theButton) { myWindow->SetOpenButton (theButton); }
 
-  //! OpenFile in TInspector window
+  //! Opens file in TInspector window
   void OpenFile (const TCollection_AsciiString& thePluginName, const TCollection_AsciiString& theFileName)
   { myWindow->OpenFile (thePluginName, theFileName); }
 
@@ -78,14 +78,13 @@ public:
   //! \param thePluginName a name of the plugin
   void Activate (const TCollection_AsciiString& thePluginName) { myWindow->ActivateTool (thePluginName); }
 
-  //! Set item selected in the active plugin
+  //! Sets item selected in the active plugin
   //! \param theItemName a containerr of name of items in plugin that should become selected
   void SetSelected (const NCollection_List<TCollection_AsciiString>& theItemNames) { myWindow->SetSelected (theItemNames); }
 
   //! Sets objects to be selected in the plugin
   //! \param theObjects an objects
-  Standard_EXPORT void SetSelected (const NCollection_List<Handle(Standard_Transient)>& theObjects)
-    { myWindow->SetSelected (theObjects); }
+  void SetSelected (const NCollection_List<Handle(Standard_Transient)>& theObjects) { myWindow->SetSelected (theObjects); }
 
   //! Sets path to a directory for temporary plugin files
   //! \param thePath a path
@@ -95,11 +94,11 @@ public:
   //! \return path
   TCollection_AsciiString GetTemporaryDirectory() const { return myWindow->GetTemporaryDirectory(); }
 
-  //! Change window visibility
+  //! Changes window visibility
   //! \param theVisible boolean state
   Standard_EXPORT virtual void SetVisible (const bool theVisible);
 
-  //! Change window position
+  //! Changes window position
   //! \param theX X pixel position of top left corner of the window
   //! \param theY Y pixel position
   Standard_EXPORT virtual void Move (const int theXPosition, const int theYPosition);
diff --git a/tools/TInspector/TInspector_OpenButton.cxx b/tools/TInspector/TInspector_OpenButton.cxx
new file mode 100644 (file)
index 0000000..6898f2a
--- /dev/null
@@ -0,0 +1,96 @@
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#include <inspector/TInspector_OpenButton.hxx>
+
+#include <inspector/TInspector_Communicator.hxx>
+#include <inspector/TInspector_OpenFileDialog.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QApplication>
+#include <QDir>
+#include <QPushButton>
+#include <Standard_WarningsRestore.hxx>
+
+const int RECENT_FILES_CACHE_SIZE = 10;
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+TInspector_OpenButton::TInspector_OpenButton (QObject* theParent)
+ : QObject (theParent), myStartButton (0)
+{
+}
+
+// =======================================================================
+// function : StartButton
+// purpose :
+// =======================================================================
+QPushButton* TInspector_OpenButton::StartButton()
+{
+  if (!myStartButton)
+  {
+    myStartButton = new QPushButton();
+    myStartButton->setIcon (QIcon (":folder_open.png"));
+    connect (myStartButton, SIGNAL (clicked()), this, SLOT (onStartButtonClicked()));
+  }
+  return myStartButton;
+}
+
+// =======================================================================
+// function : onStartButtonClicked
+// purpose :
+// =======================================================================
+void TInspector_OpenButton::onStartButtonClicked()
+{
+  QPushButton* aButton = (QPushButton*)sender();
+  TCollection_AsciiString aPluginName (aButton->objectName().toStdString().c_str());
+  if (aPluginName.IsEmpty())
+    return;
+  
+  QStringList aPluginRecentlyOpenedFiles;
+  if (myRecentlyOpenedFiles.contains(aPluginName))
+  {
+    QStringList aFileNames = myRecentlyOpenedFiles[aPluginName];
+    for (int i = 0; i < aFileNames.size(); i++)
+    {
+      QFileInfo aFileInfo (aFileNames[i]);
+      if (aFileInfo.exists() && aFileInfo.isFile())
+        aPluginRecentlyOpenedFiles.append(aFileInfo.absoluteFilePath());
+    }
+  }
+
+  QString aFileName = TInspector_OpenFileDialog::OpenFile (0, aPluginRecentlyOpenedFiles);
+  aFileName = QDir().toNativeSeparators (aFileName);
+  if (!aFileName.isEmpty()) {
+    QApplication::setOverrideCursor (Qt::WaitCursor);
+    TInspector_OpenFileDialog::Communicator()->OpenFile (aPluginName, TCollection_AsciiString (aFileName.toUtf8().data()));
+
+    QFileInfo aFileInfo (aFileName);
+    if (!aPluginRecentlyOpenedFiles.contains (aFileInfo.absoluteFilePath()))
+    {
+      myRecentlyOpenedFiles[aPluginName].append (aFileInfo.absoluteFilePath());
+      for (int i = 0; i < myRecentlyOpenedFiles[aPluginName].size() - RECENT_FILES_CACHE_SIZE; i++)
+        myRecentlyOpenedFiles[aPluginName].removeFirst();
+      TInspector_OpenFileDialog::SetPluginRecentlyOpenedFiles (aPluginName,
+        TInspector_OpenFileDialog::Communicator(), myRecentlyOpenedFiles[aPluginName]);
+
+      TInspector_OpenFileDialog::Communicator()->GetPluginParameters()->StorePreferences();
+    }
+
+    QApplication::restoreOverrideCursor();
+  }
+}
diff --git a/tools/TInspector/TInspector_OpenButton.hxx b/tools/TInspector/TInspector_OpenButton.hxx
new file mode 100644 (file)
index 0000000..d7caaec
--- /dev/null
@@ -0,0 +1,65 @@
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#ifndef TInspectorEXE_OpenButton_H
+#define TInspectorEXE_OpenButton_H
+
+#include <TCollection_AsciiString.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QObject>
+#include <QMap>
+#include <QStringList>
+#include <Standard_WarningsRestore.hxx>
+
+class QPushButton;
+
+//! \class TInspector_OpenButton
+//! Class that contains push button and the button processing. It obtains a file name from the default or current
+//! directory and gives the name into TInspector communicator
+//! Object name of the button is the name of the plugin to get the default directory, or the current directory is used.
+class TInspector_OpenButton : public QObject
+{
+  Q_OBJECT
+
+public:
+
+  //! Constructor
+  Standard_EXPORT TInspector_OpenButton (QObject* theParent);
+
+  //! Destructor
+  virtual ~TInspector_OpenButton() {}
+
+  //! Returns the start button, if this is the first call, it creates the button and connect it to the slot
+  Standard_EXPORT QPushButton* StartButton();
+
+  //! Sets the default directory of plugin.
+  void SetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
+                                     const QStringList& theRecentlyOpenedFiles)
+  { myRecentlyOpenedFiles[thePluginName] = theRecentlyOpenedFiles; }
+
+private slots:
+
+  //! Processes the button click, open default/current directory to select open file, calls OpenFile of communicator
+  void onStartButtonClicked();
+
+private:
+
+  QPushButton* myStartButton; //!< processed button
+  //!< plugins recently opened files
+  QMap<TCollection_AsciiString, QStringList> myRecentlyOpenedFiles;
+};
+
+#endif
diff --git a/tools/TInspector/TInspector_OpenFileDialog.cxx b/tools/TInspector/TInspector_OpenFileDialog.cxx
new file mode 100644 (file)
index 0000000..622818a
--- /dev/null
@@ -0,0 +1,281 @@
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#include <inspector/TInspector_OpenFileDialog.hxx>
+
+#include <inspector/TInspector_OpenButton.hxx>
+#include <inspector/TInspector_OpenFileViewModel.hxx>
+
+#include <inspector/TInspector_Communicator.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QApplication>
+#include <QCompleter>
+#include <QDir>
+#include <QFileDialog>
+#include <QFileSystemModel>
+#include <QItemSelectionModel>
+#include <QGroupBox>
+#include <QHBoxLayout>
+#include <QHeaderView>
+#include <QLabel>
+#include <QLineEdit>
+#include <QScrollBar>
+#include <QTableView>
+#include <QToolButton>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QWidget>
+#include <Standard_WarningsRestore.hxx>
+
+const int FONT_POINT_SIZE = 18;
+const int ICON_SIZE = 40;
+
+const int OPEN_DIALOG_WIDTH = 550;
+const int OPEN_DIALOG_HEIGHT = 200;
+
+const int MARGIN_DIALOG = 4;
+const int SPACING_DIALOG = 2;
+
+const int RECENT_FILES_CACHE_SIZE = 10;
+
+TInspector_Communicator* MyCommunicator;
+
+// =======================================================================
+// function : changeMargins
+// purpose :
+// =======================================================================
+void changeMargins (QBoxLayout* theLayout)
+{
+  theLayout->setContentsMargins (MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG);
+  theLayout->setSpacing (SPACING_DIALOG);
+}
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+TInspector_OpenFileDialog::TInspector_OpenFileDialog (QWidget* theParent, const QStringList& theRecentlyOpenedFiles)
+: QDialog (theParent), myRecentlyOpenedFiles (theRecentlyOpenedFiles)
+{
+  setWindowTitle (tr ("Open File"));
+
+  QVBoxLayout* aDialogLay = new QVBoxLayout (this);
+  changeMargins (aDialogLay);
+
+  // Samples View
+  QGroupBox* aSamplesBox = new QGroupBox (this);
+  aSamplesBox->setTitle (tr ("Recent files"));
+  aDialogLay->addWidget (aSamplesBox);
+  QVBoxLayout* aSampleLay = new QVBoxLayout (aSamplesBox);
+  changeMargins (aSampleLay);
+  mySamplesView = createTableView (theRecentlyOpenedFiles);
+  aSampleLay->addWidget (mySamplesView);
+
+  // Select file
+  QGroupBox* aSelectFileBox = new QGroupBox (this);
+  aSelectFileBox->setTitle (tr ("Select file"));
+  aDialogLay->addWidget (aSelectFileBox);
+  QGridLayout* aSelectFileLay = new QGridLayout (aSelectFileBox);
+  aSelectFileLay->setContentsMargins (MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG);
+
+  mySelectedName = new QLineEdit (aSelectFileBox);
+  QCompleter* aCompleter = new QCompleter();
+  QFileSystemModel* aFileSystemModel = new QFileSystemModel;
+  aFileSystemModel->setRootPath (QDir::rootPath());
+  aCompleter->setModel (aFileSystemModel);
+  mySelectedName->setCompleter (aCompleter);
+  aSelectFileLay->addWidget (mySelectedName, 1, 0);
+
+  QToolButton* aSelectFileBtn = new QToolButton (aSelectFileBox);
+  aSelectFileBtn->setIcon (QIcon (":folder_open.png"));
+  aSelectFileLay->addWidget (aSelectFileBtn, 1, 1);
+
+  connect (aSelectFileBtn, SIGNAL (clicked()), this, SLOT (onSelectClicked()));
+  connect (mySelectedName, SIGNAL (returnPressed()), this, SLOT (onApplySelectClicked()));
+
+  resize (OPEN_DIALOG_WIDTH, OPEN_DIALOG_HEIGHT);
+}
+
+// =======================================================================
+// function : OpenFile
+// purpose :
+// =======================================================================
+QString TInspector_OpenFileDialog::OpenFile (QWidget* theParent, const QStringList& theRecentlyOpenedFiles)
+{
+  QString aFileName;
+  TInspector_OpenFileDialog* aDialog = new TInspector_OpenFileDialog (theParent, theRecentlyOpenedFiles);
+  if (aDialog->exec() == QDialog::Accepted)
+    aFileName = aDialog->GetFileName();
+
+  return aFileName;
+}
+
+// =======================================================================
+// function : Communicator
+// purpose :
+// =======================================================================
+TInspector_Communicator* TInspector_OpenFileDialog::Communicator()
+{
+  if (!MyCommunicator)
+    MyCommunicator = new TInspector_Communicator();
+  return MyCommunicator;
+}
+
+// =======================================================================
+// function : GetPluginRecentlyOpenedFiles
+// purpose :
+// =======================================================================
+void TInspector_OpenFileDialog::GetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
+                                                                 TInspector_Communicator* theCommunicator,
+                                                                 QStringList& theFileNames)
+{
+  Handle(TInspectorAPI_PluginParameters) aParameters = theCommunicator->GetPluginParameters();
+  TInspectorAPI_PreferencesDataMap aPreferencesItem;
+  aParameters->GetPreferences (thePluginName, aPreferencesItem);
+
+  for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt (aPreferencesItem); anItemIt.More(); anItemIt.Next())
+  {
+    if (!anItemIt.Key().IsEqual("recently_opened_files"))
+      continue;
+    theFileNames = QString(anItemIt.Value().ToCString()).split(";", QString::SkipEmptyParts);
+    if (theFileNames.size() > RECENT_FILES_CACHE_SIZE)
+      for (int i = 0; i < theFileNames.size() - RECENT_FILES_CACHE_SIZE; i++)
+        theFileNames.removeFirst();
+    break;
+  }
+}
+
+// =======================================================================
+// function : SetPluginRecentlyOpenedFiles
+// purpose :
+// =======================================================================
+void TInspector_OpenFileDialog::SetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
+                                                                 TInspector_Communicator* theCommunicator,
+                                                                 QStringList& theFileNames)
+{
+  Handle(TInspectorAPI_PluginParameters) aParameters = theCommunicator->GetPluginParameters();
+
+  TInspectorAPI_PreferencesDataMap aPreferencesItem;
+  aParameters->GetPreferences (thePluginName, aPreferencesItem);
+  aPreferencesItem.Bind ("recently_opened_files", TCollection_AsciiString (theFileNames.join (";").toUtf8().data()));
+
+  aParameters->SetPreferences (thePluginName, aPreferencesItem);
+}
+
+// =======================================================================
+// function : onSampleSelectionChanged
+// purpose :
+// =======================================================================
+void TInspector_OpenFileDialog::onSampleSelectionChanged (const QItemSelection& theSelected,
+                                                             const QItemSelection&)
+{
+  QItemSelectionModel* aSelectionModel = (QItemSelectionModel*)sender();
+  if (!aSelectionModel)
+    return;
+  if (theSelected.isEmpty())
+    return;
+
+  QModelIndex anIndex = theSelected.first().indexes().first();
+  if (!anIndex.isValid())
+    return;
+
+  myFileName = aSelectionModel->model()->data (anIndex, Qt::ToolTipRole).toString();
+  accept();
+}
+
+// =======================================================================
+// function : onSelectClicked
+// purpose :
+// =======================================================================
+void TInspector_OpenFileDialog::onSelectClicked()
+{
+  QString anEnteredPath;
+  QString aDirName = mySelectedName->text();
+  if (!aDirName.isEmpty())
+  {
+    QDir aDir (aDirName);
+    if (aDir.exists())
+      anEnteredPath = aDirName;
+  }
+
+  QString aFileName = QFileDialog::getOpenFileName (0, "Open document", anEnteredPath);
+
+  if (aFileName.isEmpty())
+    return; // do nothing, left the previous value
+
+
+  myFileName = aFileName;
+  accept();
+}
+
+// =======================================================================
+// function : onApplySelectClicked
+// purpose :
+// =======================================================================
+void TInspector_OpenFileDialog::onApplySelectClicked()
+{
+  QString aFileName = mySelectedName->text();
+
+  QFileInfo aFileInfo (aFileName);
+  if (!aFileInfo.exists() || !aFileInfo.isFile())
+    return;
+
+  myFileName = mySelectedName->text();
+  accept();
+}
+
+// =======================================================================
+// function : createTableView
+// purpose :
+// =======================================================================
+QTableView* TInspector_OpenFileDialog::createTableView (const QStringList& theFileNames)
+{
+  QTableView* aTableView = new QTableView (this);
+  aTableView->setFrameStyle (QFrame::NoFrame);
+  QPalette aPalette = aTableView->viewport()->palette();
+  QColor aWindowColor = aPalette.color (QPalette::Window);
+  aPalette.setBrush (QPalette::Base, aWindowColor);
+  aTableView->viewport()->setPalette (aPalette);
+
+  aTableView->horizontalHeader()->setVisible (false);
+  aTableView->verticalHeader()->setVisible (false);
+  aTableView->setGridStyle (Qt::NoPen);
+  aTableView->setModel (createModel (theFileNames));
+  aTableView->setItemDelegateForRow (0, new TInspectorEXE_OpenFileItemDelegate (aTableView,
+                                                          aPalette.color (QPalette::Highlight)));
+  aTableView->viewport()->setAttribute (Qt::WA_Hover);
+  int aCellHeight = ICON_SIZE + aTableView->verticalHeader()->defaultSectionSize();
+  aTableView->setRowHeight (0, aCellHeight);
+  int aScrollHeight = aTableView->horizontalScrollBar()->sizeHint().height();
+  aTableView->setMinimumHeight (aCellHeight + aScrollHeight);
+  QItemSelectionModel* aSelectionModel = new QItemSelectionModel (aTableView->model());
+  connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
+           this, SLOT (onSampleSelectionChanged (const QItemSelection&, const QItemSelection&)));
+  aTableView->setSelectionModel (aSelectionModel);
+
+  return aTableView;
+}
+
+// =======================================================================
+// function : createModel
+// purpose :
+// =======================================================================
+QAbstractItemModel* TInspector_OpenFileDialog::createModel (const QStringList& theFileNames)
+{
+  TInspector_OpenFileViewModel* aModel = new TInspector_OpenFileViewModel (this);
+  aModel->Init (theFileNames);
+  return aModel;
+}
diff --git a/tools/TInspector/TInspector_OpenFileDialog.hxx b/tools/TInspector/TInspector_OpenFileDialog.hxx
new file mode 100644 (file)
index 0000000..9776c43
--- /dev/null
@@ -0,0 +1,116 @@
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#ifndef TInspectorEXE_OpenFileDialog_H
+#define TInspectorEXE_OpenFileDialog_H
+
+#include <inspector/TInspectorAPI_PreferencesDataMap.hxx>
+
+#include <NCollection_DataMap.hxx>
+#include <NCollection_List.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QDialog>
+#include <QItemSelection>
+#include <QStringList>
+#include <Standard_WarningsRestore.hxx>
+
+class TInspector_Communicator;
+
+class QAbstractItemModel;
+class QLineEdit;
+class QPushButton;
+class QTableView;
+class QToolButton;
+class QWidget;
+
+//! \class TInspector_OpenFileDialog
+//! Control that contains table view of samples and line to select a file name from other directory.
+//! Click on element of samples table view calls this sample opening else after entering(or opening) file name
+//! the import becomes active. Click on the button will open selected file if it is possible
+class TInspector_OpenFileDialog : public QDialog
+{
+  Q_OBJECT
+private:
+
+  //! Constructor
+  Standard_EXPORT TInspector_OpenFileDialog (QWidget* theParent, const QStringList& theRecentlyOpenedFiles);
+
+public:
+
+  //! Destructor
+  virtual ~TInspector_OpenFileDialog() Standard_OVERRIDE {}
+
+  //! Opens this file dialog using for samples view the given directory and try to open new file
+  //! \param theParent a parent for the new dialog
+  //! \param theDataDirName path to default samples directory
+  //! \returns a file name from the open file dialog
+  Standard_EXPORT static QString OpenFile (QWidget* theParent, const QStringList& theRecentlyOpenedFiles);
+
+  //! Returns selection name from the dialog
+  QString GetFileName() const { return myFileName; }
+
+  //! Returns communicator, if this is the first call, create a communicator instance
+  Standard_EXPORT static TInspector_Communicator* Communicator();
+
+  //! Returns preferences: previous opened documents.
+  //! \param thePluginName name of the plugin
+  //! \param theCommunicator source of preferences
+  //! \param theFileNames [out] container of recently opened file names
+  Standard_EXPORT static void GetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
+                                                            TInspector_Communicator* theCommunicator,
+                                                            QStringList& theFileNames);
+
+  //! Sets preferences: previous opened documents.
+  //! \param thePluginName name of the plugin
+  //! \param theCommunicator source of preferences
+  //! \param theFileNames container of recently opened file names to be set into communicator preferences
+  Standard_EXPORT static void SetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
+                                                            TInspector_Communicator* theCommunicator,
+                                                            QStringList& theFileNames);
+
+private slots:
+
+  //! Stores name of selected sample file
+  void onSampleSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+  //! Opens file dialog to select a file name. Fills file name line, enable import button
+  void onSelectClicked();
+
+  //! Accepts open file dialog
+  void onApplySelectClicked();
+
+private:
+
+  //! Creates view of file names in samples directory
+  //! \param theFileNames a container of names
+  //! \return table view
+  QTableView* createTableView (const QStringList& theFileNames);
+
+  //! Creates view model and fills it by the file names
+  //! \param theFileNames a container of names
+  //! \return model
+  QAbstractItemModel* createModel (const QStringList& theFileNames);
+
+private:
+
+  QStringList myRecentlyOpenedFiles; //!< recently opened files
+  QString myFileName; //!< result file name
+  QTableView* mySamplesView; //!< view of sample file names
+  QLineEdit* mySelectedName; //!< alternative control to open file
+};
+
+#endif
diff --git a/tools/TInspector/TInspector_OpenFileViewModel.cxx b/tools/TInspector/TInspector_OpenFileViewModel.cxx
new file mode 100644 (file)
index 0000000..d1e208a
--- /dev/null
@@ -0,0 +1,75 @@
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#include <inspector/TInspector_OpenFileViewModel.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QApplication>
+#include <QFileInfo>
+#include <QIcon>
+#include <QPainter>
+#include <Standard_WarningsRestore.hxx>
+
+const int ICON_SIZE = 40;
+
+// =======================================================================
+// function : paint
+// purpose :
+// =======================================================================
+void TInspectorEXE_OpenFileItemDelegate::paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
+                                                const QModelIndex& theIndex) const
+{
+  // highlight cell
+  if (theOption.state & QStyle::State_MouseOver)
+    thePainter->fillRect (theOption.rect, myColor);
+
+  // action icon for all indices before the last one
+  QIcon anIcon (":folder_import.png");
+  QSize anIconSize (ICON_SIZE, ICON_SIZE);
+  int aDX = (theOption.rect.width() - anIconSize.width()) / 2;
+  int aMargin = qApp->style()->pixelMetric (QStyle::PM_HeaderMargin);
+  thePainter->drawPixmap (QRect (theOption.rect.left() + aDX,
+                          theOption.rect.top() + aMargin,
+                          anIconSize.width(),
+                          anIconSize.height()),
+                          anIcon.pixmap(anIconSize.width(), anIconSize.height()));
+  // default paint
+  QItemDelegate::paint (thePainter, theOption, theIndex);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void TInspector_OpenFileViewModel::Init (const QStringList& theValues)
+{
+  myValues = theValues;
+}
+
+// =======================================================================
+// function : data
+// purpose :
+// =======================================================================
+QVariant TInspector_OpenFileViewModel::data (const QModelIndex& theIndex, int theRole) const
+{
+  switch (theRole)
+  {
+    case Qt::DisplayRole: return QFileInfo (myValues[theIndex.column()]).fileName();
+    case Qt::ToolTipRole: return myValues[theIndex.column()];
+    case Qt::TextAlignmentRole: return QVariant (Qt::AlignBottom | Qt::AlignHCenter);
+    default: break;
+  }
+  return QVariant();
+}
diff --git a/tools/TInspector/TInspector_OpenFileViewModel.hxx b/tools/TInspector/TInspector_OpenFileViewModel.hxx
new file mode 100644 (file)
index 0000000..a7ec5b4
--- /dev/null
@@ -0,0 +1,98 @@
+// Created on: 2017-06-16
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#ifndef TInspectorEXE_OpenFileViewModel_H
+#define TInspectorEXE_OpenFileViewModel_H
+
+#include <Standard_Macro.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAbstractTableModel>
+#include <QStringList>
+#include <QItemDelegate>
+#include <Standard_WarningsRestore.hxx>
+
+class QObject;
+class QPainter;
+
+//! \class TInspectorEXE_OpenFileItemDelegate
+//! Draws large(40x40) icons in cell. The icon background in colored in highlight when mouse is over button
+class TInspectorEXE_OpenFileItemDelegate : public QItemDelegate
+{
+
+public:
+
+  //! Constructor
+  TInspectorEXE_OpenFileItemDelegate (QObject* theParent, const QColor& theHighlightColor)
+  : QItemDelegate (theParent), myColor(theHighlightColor) {}
+
+  //! Destructor
+  virtual ~TInspectorEXE_OpenFileItemDelegate() {}
+
+  //! Draws an icon in the cell
+  //! \param thePainter a painter
+  //! \param theOption a paint options
+  //! \param theIndex a view index
+  virtual void paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
+                      const QModelIndex& theIndex) const Standard_OVERRIDE;
+
+private:
+
+  QColor myColor; //!< highlight color
+};
+
+//! \class TInspector_OpenFileViewModel
+//! Table model that visualizes container of string values (file names)
+//! Table orientation is horizontal, it has 1 row, number of columns equals to number of values
+class TInspector_OpenFileViewModel : public QAbstractTableModel
+{
+
+public:
+
+  //! Constructor
+  TInspector_OpenFileViewModel (QObject* theParent = 0) : QAbstractTableModel (theParent) {}
+
+  //! Destructor
+  virtual ~TInspector_OpenFileViewModel() {}
+
+  //! Store values
+  //! \param theValues a container of values to fill model
+  void Init (const QStringList& theValues);
+
+  //! Returns content of the model index for the given role, it is obtained from internal container of values
+  //! It returns value only for DisplayRole.
+  //! \param theIndex a model index
+  //! \param theRole a view role
+  //! \return value intepreted depending on the given role
+  virtual QVariant data (const QModelIndex& theIndex, int theRole = Qt::DisplayRole) const Standard_OVERRIDE;
+
+  //! Returns number of rows
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  virtual int rowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
+  { (void)theParent; return 1; }
+
+  //! Returns number of columns
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
+  { (void)theParent; return myValues.size(); }
+
+private:
+
+  QStringList myValues; //!< file names
+};
+
+#endif
index 0f1810e..a46da81 100644 (file)
@@ -35,7 +35,7 @@ public:
   Standard_EXPORT TInspector_PluginParameters (TInspector_Window* theWindow);
 
   //! Destructor
-  virtual ~TInspector_PluginParameters() Standard_OVERRIDE {}
+  virtual ~TInspector_PluginParameters() {}
 
   //! Stores the parameters for plugin
   //! \param thePluginName a plugin name
@@ -62,10 +62,10 @@ public:
                                const TInspectorAPI_PreferencesDataMap& theItem) Standard_OVERRIDE
    { myPreferences->SetPreferences (thePluginName, theItem); }
 
-  //! Store plugin preferences into a preferences file
+  //! Stores plugin preferences into a preferences file
   virtual void StorePreferences() Standard_OVERRIDE { myPreferences->StorePreferences(); }
 
-  //! Remove plugin preferences file
+  //! Removes plugin preferences file
   void RemovePreferences() { myPreferences->RemovePreferences(); }
 
 private:
index 141cf2d..d0ebefc 100644 (file)
@@ -57,17 +57,17 @@ public:
   void SetPreferences (const TCollection_AsciiString& thePluginName, const TInspectorAPI_PreferencesDataMap& theItem)
   { myLoadedPreferences.Bind(thePluginName, theItem); }
 
-  //! Store plugin preferences into a preferences file
+  //! Stores plugin preferences into a preferences file
   Standard_EXPORT void StorePreferences();
 
-  //! Remove plugin preferences file
+  //! Removes plugin preferences file
   Standard_EXPORT void RemovePreferences();
 
 private:
   //! Loads the directory preference file with filling internal container
   void loadPreferences();
 
-  //! clears all internal containers with information of already loaded file
+  //! Clears all internal containers with information of already loaded file
   void reset() { myLoadedPreferences.Clear(); myIsLoadedPreferences = Standard_False; }
 
   //! Reads plugin preferences and fill container
index 8bb89ab..af22ab7 100644 (file)
@@ -83,7 +83,7 @@ TInspector_Window::TInspector_Window()
 
   myActionsWidget = new QToolButton(aCentralWidget);
   myActionsWidget->setPopupMode(QToolButton::InstantPopup);
-  myActionsWidget->setIcon (QIcon (":/icons/plugin_actions.png"));
+  myActionsWidget->setIcon (QIcon (":plugin_actions.png"));
   myActionsWidget->setIconSize (QSize (20, 20));
   QMenu* anActionsMenu = new QMenu(myActionsWidget);
   myActionsWidget->setMenu(anActionsMenu);
index 4e7e50b..c0c802d 100644 (file)
@@ -68,7 +68,7 @@ public:
   Standard_EXPORT TInspector_Window();
 
   //! Destructor
-  virtual ~TInspector_Window() Standard_OVERRIDE {}
+  virtual ~TInspector_Window() {}
 
   //! Appends the plugin names into internal conainer
   //! \param thePluginName a name of the plugin
@@ -102,7 +102,7 @@ public:
   //! \param thePluginName a name of the plugin
   Standard_EXPORT void ActivateTool (const TCollection_AsciiString& thePluginName);
 
-  //! Set item selected in the active plugin
+  //! Sets item selected in the active plugin
   //! \param theItemNames a container of name of items in plugin that should become selected
   Standard_EXPORT void SetSelected (const NCollection_List<TCollection_AsciiString>& theItemNames);
 
@@ -149,7 +149,7 @@ public slots:
   //! Stores preferences (current state) of all plugins into a preferences file
   Standard_EXPORT void OnStorePreferences();
 
-  //! Remove preferences file
+  //! Removes preferences file
   Standard_EXPORT void OnRemovePreferences();
 
 protected slots:
@@ -180,7 +180,7 @@ protected:
   //! Applies desktop preferences to window
   void applyPreferences();
 
-  //! Generate default temp directory by 'TEMP' or 'TMP' environment variables
+  //! Generates default temp directory by 'TEMP' or 'TMP' environment variables
   //! \return generated path
   TCollection_AsciiString defaultTemporaryDirectory() const;
 
diff --git a/tools/TInspector/icons/folder_export.png b/tools/TInspector/icons/folder_export.png
new file mode 100644 (file)
index 0000000..5f45f99
Binary files /dev/null and b/tools/TInspector/icons/folder_export.png differ
diff --git a/tools/TInspector/icons/folder_import.png b/tools/TInspector/icons/folder_import.png
new file mode 100644 (file)
index 0000000..02743ab
Binary files /dev/null and b/tools/TInspector/icons/folder_import.png differ
diff --git a/tools/TInspector/icons/folder_open.png b/tools/TInspector/icons/folder_open.png
new file mode 100644 (file)
index 0000000..b0a139e
Binary files /dev/null and b/tools/TInspector/icons/folder_open.png differ
diff --git a/tools/TInspector/icons/item_algo_folder.png b/tools/TInspector/icons/item_algo_folder.png
deleted file mode 100644 (file)
index 078dd34..0000000
Binary files a/tools/TInspector/icons/item_algo_folder.png and /dev/null differ
index dcb881a..63cf600 100644 (file)
@@ -3,4 +3,3 @@ TInspectorAPI_Communicator.hxx
 TInspectorAPI_PluginParameters.cxx
 TInspectorAPI_PluginParameters.hxx
 TInspectorAPI_PreferencesDataMap.hxx
-TInspectorAPI_Version.hxx
index b25f4db..9c9cf8d 100644 (file)
 
 #include <NCollection_List.hxx>
 #include <Standard_Transient.hxx>
-#include <Standard_Version.hxx>
-#if OCC_VERSION_HEX > 0x060901
-  #include <Standard_Handle.hxx>
-#endif
+#include <Standard_Handle.hxx>
 #include <inspector/TInspectorAPI_PluginParameters.hxx>
 
 //! The Communicator is an interface that should be implemented for a separate plugin
 //! It will be placed in layout of the given parent. After the plugin is created, it is possible to
 //! set container of parameters into plugin to provide the plugin's initialization by some external
 //! objects(e.g. Interactive Context or OCAF Application). If the parameters are changed, it may be
-//! applyed in UpdateContent function. The communicator can change parameters in the following cases:
+//! applied in UpdateContent function. The communicator can change parameters in the following cases:
 //! - the plugin removes own processed parameters (e.g. file names, that was opened by the plugin)
 //! - the plugin sends some parameters to another plugin(by name) (e.g. shape to be analized)
 //!   (at the same time we should be careful here to do not change essential parameters of other plugins)
@@ -50,9 +47,9 @@ public:
   //! \param theParent a parent class
   Standard_EXPORT virtual void SetParent (void* theParent) = 0;
 
-  //! Provide container for actions available in inspector on general level
+  //! Provides container for actions available in inspector on general level
   //! \param theMenu if Qt implementation, it is QMenu object
-  Standard_EXPORT virtual void FillActionsMenu (void* theMenu) { (void)theMenu; }
+  virtual void FillActionsMenu (void* theMenu) { (void)theMenu; }
 
   //! Returns plugin preferences, empty implementation by default
   virtual void GetPreferences (TInspectorAPI_PreferencesDataMap&) {}
index 9393949..53132b4 100644 (file)
 // commercial license or contractual agreement. 
 
 #include <inspector/TInspectorAPI_PluginParameters.hxx>
-#include <inspector/TInspectorAPI_Version.hxx>
 
-#if OCC_VERSION_HEX <= 0x060901
-IMPLEMENT_STANDARD_HANDLE (TInspectorAPI_PluginParameters, Standard_Transient)
 IMPLEMENT_STANDARD_RTTIEXT (TInspectorAPI_PluginParameters, Standard_Transient)
-#else
-IMPLEMENT_STANDARD_RTTIEXT (TInspectorAPI_PluginParameters, Standard_Transient)
-#endif
 
 // =======================================================================
 // function : SetParameters
@@ -275,7 +269,6 @@ void TInspectorAPI_PluginParameters::ParametersToShape (const TCollection_AsciiS
     return;
   anOrientationStr.Split (anOrientationStr.Length() - 1);
 
-#if TINSPECTORAPI_VERSION_HEX > 0x070200
   TopAbs_Orientation anOrientation;
   if (!TopAbs::ShapeOrientationFromString (anOrientationStr.ToCString(), anOrientation))
     return;
@@ -284,7 +277,4 @@ void TInspectorAPI_PluginParameters::ParametersToShape (const TCollection_AsciiS
 
   theShape.Location (aLocation);
   theShape.Orientation (anOrientation);
-#else
-  (void)theValue; (void)theShape;
-#endif
 }
index c92b518..c7975cd 100644 (file)
 
 #include <NCollection_DataMap.hxx>
 #include <NCollection_List.hxx>
-#include <Standard_Version.hxx>
 #include <Standard_Transient.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TopoDS_Shape.hxx>
 
 #include <inspector/TInspectorAPI_PreferencesDataMap.hxx>
 
-class TInspectorAPI_PluginParameters;
-DEFINE_STANDARD_HANDLE (TInspectorAPI_PluginParameters, Standard_Transient)
-
 //! The container of parameters for all possible plugins. It stores list of parameters for each plugin, even
 //! it was not be loaded yet. There is a map of plugin name into plugin parameters.
 //! The parameters may be:
@@ -41,7 +37,7 @@ public:
   Standard_EXPORT TInspectorAPI_PluginParameters() {}
 
   //! Destructor
-  Standard_EXPORT virtual ~TInspectorAPI_PluginParameters() Standard_OVERRIDE {}
+  Standard_EXPORT virtual ~TInspectorAPI_PluginParameters() {}
 
   //! Stores the parameters for plugin
   //! \param thePluginName a plugin name
@@ -131,7 +127,7 @@ public:
   Standard_EXPORT virtual void SetPreferences (const TCollection_AsciiString& thePluginName,
                                                const TInspectorAPI_PreferencesDataMap& theItem) = 0;
 
-  //! Store plugin preferences into a preferences file
+  //! Stores plugin preferences into a preferences file
   Standard_EXPORT virtual void StorePreferences() = 0;
 
   //! Converts a Shape parameters excepting TShape into a string value
@@ -145,11 +141,7 @@ public:
   Standard_EXPORT static void ParametersToShape (const TCollection_AsciiString& theValue, TopoDS_Shape& theShape);
 
 
-#if OCC_VERSION_HEX <= 0x060901
-  DEFINE_STANDARD_RTTI (TInspectorAPI_PluginParameters)
-#else
   DEFINE_STANDARD_RTTIEXT (TInspectorAPI_PluginParameters, Standard_Transient)
-#endif
 private:
   //! container of parameters
   NCollection_DataMap<TCollection_AsciiString, NCollection_List<Handle(Standard_Transient)> > myParameters;
diff --git a/tools/TInspectorAPI/TInspectorAPI_Version.hxx b/tools/TInspectorAPI/TInspectorAPI_Version.hxx
deleted file mode 100644 (file)
index 88bcc11..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2018 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-/*======================================================================
-// 
-// Purpose:   Defines macros identifying current version of Inspector
-// The version is equal to current OCCT version and used to support compile compatibility
-// to previous OCCT versions interface.
-// To compile Inspector with earlier version of OCCT, change version variable here to needed OCCT version.
-//
-//            TINSPECTORAPI_VERSION_MAJOR       : (integer) number identifying major version 
-//            TINSPECTORAPI_VERSION_MINOR       : (integer) number identifying minor version 
-//            TINSPECTORAPI_VERSION_MAINTENANCE : (integer) number identifying maintenance version 
-//            TINSPECTORAPI_VERSION_HEX         : (hex)     complete number as hex, two positions per each of major, minor, and patch number 
-//            
-//======================================================================*/
-
-#ifndef _TInspectorAPI_Version_HeaderFile
-#define _TInspectorAPI_Version_HeaderFile
-
-#include <Standard_Version.hxx>
-
-// Primary definitions
-#define TINSPECTORAPI_VERSION_MAJOR         OCC_VERSION_MAJOR
-#define TINSPECTORAPI_VERSION_MINOR         OCC_VERSION_MINOR
-#define TINSPECTORAPI_VERSION_MAINTENANCE   0//OCC_VERSION_MAINTENANCE
-
-// Derived: complete version as hex (0x0'major'0'minor'0'maintenance')
-#define TINSPECTORAPI_VERSION_HEX    (TINSPECTORAPI_VERSION_MAJOR << 16 | TINSPECTORAPI_VERSION_MINOR << 8 | TINSPECTORAPI_VERSION_MAINTENANCE)
-
-#endif  /* _TInspectorAPI_Version_HeaderFile */
index 8f800f2..83dde91 100644 (file)
@@ -1 +1,4 @@
-TKTInspector
\ No newline at end of file
+TKTInspector
+TKTInspectorAPI
+TKernel
+CSF_QT
\ No newline at end of file
index 68b0c79..44a1d28 100644 (file)
@@ -1,7 +1,2 @@
 TInspectorEXE.cxx
-TInspectorEXE_OpenFileDialog.cxx
-TInspectorEXE_OpenFileDialog.hxx
-TInspectorEXE_OpenFileViewModel.cxx
-TInspectorEXE_OpenFileViewModel.hxx
-TInspectorEXE.qrc
 EXTERNLIB
diff --git a/tools/TInspectorEXE/PACKAGES b/tools/TInspectorEXE/PACKAGES
deleted file mode 100644 (file)
index 1736c7d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-TInspectorEXE
index 10dcf4b..73ab696 100644 (file)
@@ -14,7 +14,8 @@
 // commercial license or contractual agreement. 
 
 
-#include <inspector/TInspectorEXE_OpenFileDialog.hxx>
+#include <inspector/TInspector_OpenFileDialog.hxx>
+#include <inspector/TInspector_OpenButton.hxx>
 
 #include <inspector/TInspector_Communicator.hxx>
 
@@ -50,10 +51,10 @@ TCollection_AsciiString fileNameInDataDir (const TCollection_AsciiString& theEnv
 // purpose :
 // =======================================================================
 void setPluginSampleDirectory (const TCollection_AsciiString& theName, TInspector_Communicator* theCommunicator,
-                               TInspectorEXE_OpenButton* theButtonControl)
+                               TInspector_OpenButton* theButtonControl)
 {
   QStringList aRecentlyOpenedFiles;
-  TInspectorEXE_OpenFileDialog::GetPluginRecentlyOpenedFiles (theName, theCommunicator, aRecentlyOpenedFiles);
+  TInspector_OpenFileDialog::GetPluginRecentlyOpenedFiles (theName, theCommunicator, aRecentlyOpenedFiles);
   TCollection_AsciiString aFileName, anAdditionalFileName;
   if (!aRecentlyOpenedFiles.isEmpty())
     aFileName = TCollection_AsciiString (aRecentlyOpenedFiles.last().toUtf8().data());
@@ -107,14 +108,14 @@ int main (int argc, char** argv)
   NCollection_List<Handle(Standard_Transient)> aParameters;
 
   // Create tool communicator
-  TInspector_Communicator* aCommunicator = TInspectorEXE_OpenFileDialog::Communicator();
+  TInspector_Communicator* aCommunicator = TInspector_OpenFileDialog::Communicator();
   if (!aCommunicator)
   {
     std::cout << "Communicator can not be created" << std::endl;
     return 0;
   }
 
-  TInspectorEXE_OpenButton* aButtonControl = new TInspectorEXE_OpenButton (0);
+  TInspector_OpenButton* aButtonControl = new TInspector_OpenButton (0);
   TCollection_AsciiString anActivatedPluginName;
   if (aPlugins.empty())
   {
diff --git a/tools/TInspectorEXE/TInspectorEXE.qrc b/tools/TInspectorEXE/TInspectorEXE.qrc
deleted file mode 100644 (file)
index 5b8eac8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<!DOCTYPE RCC><RCC version="1.0">
-    <qresource prefix="/">
-        <file alias="folder_open.png">icons/folder_open.png</file>
-        <file alias="folder_import.png">icons/folder_import.png</file>
-    </qresource>
-</RCC>
diff --git a/tools/TInspectorEXE/TInspectorEXE_OpenFileDialog.cxx b/tools/TInspectorEXE/TInspectorEXE_OpenFileDialog.cxx
deleted file mode 100644 (file)
index 2393827..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-// Created on: 2017-06-16
-// Created by: Natalia ERMOLAEVA
-// Copyright (c) 2017 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement. 
-
-#include <inspector/TInspectorEXE_OpenFileDialog.hxx>
-#include <inspector/TInspectorEXE_OpenFileViewModel.hxx>
-
-#include <inspector/TInspector_Communicator.hxx>
-
-#include <Standard_WarningsDisable.hxx>
-#include <QApplication>
-#include <QCompleter>
-#include <QDir>
-#include <QFileDialog>
-#include <QFileSystemModel>
-#include <QItemSelectionModel>
-#include <QGroupBox>
-#include <QHBoxLayout>
-#include <QHeaderView>
-#include <QLabel>
-#include <QLineEdit>
-#include <QScrollBar>
-#include <QTableView>
-#include <QToolButton>
-#include <QPushButton>
-#include <QVBoxLayout>
-#include <QWidget>
-#include <Standard_WarningsRestore.hxx>
-
-const int FONT_POINT_SIZE = 18;
-const int ICON_SIZE = 40;
-
-const int OPEN_DIALOG_WIDTH = 550;
-const int OPEN_DIALOG_HEIGHT = 200;
-
-const int MARGIN_DIALOG = 4;
-const int SPACING_DIALOG = 2;
-
-const int RECENT_FILES_CACHE_SIZE = 10;
-
-TInspector_Communicator* MyCommunicator;
-
-// =======================================================================
-// function : StartButton
-// purpose :
-// =======================================================================
-QPushButton* TInspectorEXE_OpenButton::StartButton()
-{
-  if (!myStartButton)
-  {
-    myStartButton = new QPushButton();
-    myStartButton->setIcon (QIcon (":folder_open.png"));
-    connect (myStartButton, SIGNAL (clicked()), this, SLOT (onStartButtonClicked()));
-  }
-  return myStartButton;
-}
-
-// =======================================================================
-// function : onStartButtonClicked
-// purpose :
-// =======================================================================
-void TInspectorEXE_OpenButton::onStartButtonClicked()
-{
-  QPushButton* aButton = (QPushButton*)sender();
-  TCollection_AsciiString aPluginName (aButton->objectName().toStdString().c_str());
-  if (aPluginName.IsEmpty())
-    return;
-  
-  QStringList aPluginRecentlyOpenedFiles;
-  if (myRecentlyOpenedFiles.contains(aPluginName))
-  {
-    QStringList aFileNames = myRecentlyOpenedFiles[aPluginName];
-    for (int i = 0; i < aFileNames.size(); i++)
-    {
-      QFileInfo aFileInfo (aFileNames[i]);
-      if (aFileInfo.exists() && aFileInfo.isFile())
-        aPluginRecentlyOpenedFiles.append(aFileInfo.absoluteFilePath());
-    }
-  }
-
-  QString aFileName = TInspectorEXE_OpenFileDialog::OpenFile (0, aPluginRecentlyOpenedFiles);
-  aFileName = QDir().toNativeSeparators (aFileName);
-  if (!aFileName.isEmpty()) {
-    QApplication::setOverrideCursor (Qt::WaitCursor);
-    TInspectorEXE_OpenFileDialog::Communicator()->OpenFile (aPluginName, TCollection_AsciiString (aFileName.toUtf8().data()));
-
-    QFileInfo aFileInfo (aFileName);
-    if (!aPluginRecentlyOpenedFiles.contains (aFileInfo.absoluteFilePath()))
-    {
-      myRecentlyOpenedFiles[aPluginName].append (aFileInfo.absoluteFilePath());
-      for (int i = 0; i < myRecentlyOpenedFiles[aPluginName].size() - RECENT_FILES_CACHE_SIZE; i++)
-        myRecentlyOpenedFiles[aPluginName].removeFirst();
-      TInspectorEXE_OpenFileDialog::SetPluginRecentlyOpenedFiles (aPluginName,
-        TInspectorEXE_OpenFileDialog::Communicator(), myRecentlyOpenedFiles[aPluginName]);
-
-      TInspectorEXE_OpenFileDialog::Communicator()->GetPluginParameters()->StorePreferences();
-    }
-
-    QApplication::restoreOverrideCursor();
-  }
-}
-
-// =======================================================================
-// function : changeMargins
-// purpose :
-// =======================================================================
-void changeMargins (QBoxLayout* theLayout)
-{
-  theLayout->setContentsMargins (MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG);
-  theLayout->setSpacing (SPACING_DIALOG);
-}
-
-// =======================================================================
-// function : Constructor
-// purpose :
-// =======================================================================
-TInspectorEXE_OpenFileDialog::TInspectorEXE_OpenFileDialog (QWidget* theParent, const QStringList& theRecentlyOpenedFiles)
-: QDialog (theParent), myRecentlyOpenedFiles (theRecentlyOpenedFiles)
-{
-  setWindowTitle (tr ("Open File"));
-
-  QVBoxLayout* aDialogLay = new QVBoxLayout (this);
-  changeMargins (aDialogLay);
-
-  // Samples View
-  QGroupBox* aSamplesBox = new QGroupBox (this);
-  aSamplesBox->setTitle (tr ("Recent files"));
-  aDialogLay->addWidget (aSamplesBox);
-  QVBoxLayout* aSampleLay = new QVBoxLayout (aSamplesBox);
-  changeMargins (aSampleLay);
-  mySamplesView = createTableView (theRecentlyOpenedFiles);
-  aSampleLay->addWidget (mySamplesView);
-
-  // Select file
-  QGroupBox* aSelectFileBox = new QGroupBox (this);
-  aSelectFileBox->setTitle (tr ("Select file"));
-  aDialogLay->addWidget (aSelectFileBox);
-  QGridLayout* aSelectFileLay = new QGridLayout (aSelectFileBox);
-  aSelectFileLay->setContentsMargins (MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG);
-
-  mySelectedName = new QLineEdit (aSelectFileBox);
-  QCompleter* aCompleter = new QCompleter();
-  QFileSystemModel* aFileSystemModel = new QFileSystemModel;
-  aFileSystemModel->setRootPath (QDir::rootPath());
-  aCompleter->setModel (aFileSystemModel);
-  mySelectedName->setCompleter (aCompleter);
-  aSelectFileLay->addWidget (mySelectedName, 1, 0);
-
-  QToolButton* aSelectFileBtn = new QToolButton (aSelectFileBox);
-  aSelectFileBtn->setIcon (QIcon (":folder_open.png"));
-  aSelectFileLay->addWidget (aSelectFileBtn, 1, 1);
-
-  connect (aSelectFileBtn, SIGNAL (clicked()), this, SLOT (onSelectClicked()));
-  connect (mySelectedName, SIGNAL (returnPressed()), this, SLOT (onApplySelectClicked()));
-
-  resize (OPEN_DIALOG_WIDTH, OPEN_DIALOG_HEIGHT);
-}
-
-// =======================================================================
-// function : OpenFile
-// purpose :
-// =======================================================================
-QString TInspectorEXE_OpenFileDialog::OpenFile (QWidget* theParent, const QStringList& theRecentlyOpenedFiles)
-{
-  QString aFileName;
-  TInspectorEXE_OpenFileDialog* aDialog = new TInspectorEXE_OpenFileDialog (theParent, theRecentlyOpenedFiles);
-  if (aDialog->exec() == QDialog::Accepted)
-    aFileName = aDialog->GetFileName();
-
-  return aFileName;
-}
-
-// =======================================================================
-// function : Communicator
-// purpose :
-// =======================================================================
-TInspector_Communicator* TInspectorEXE_OpenFileDialog::Communicator()
-{
-  if (!MyCommunicator)
-    MyCommunicator = new TInspector_Communicator();
-  return MyCommunicator;
-}
-
-// =======================================================================
-// function : GetPluginRecentlyOpenedFiles
-// purpose :
-// =======================================================================
-void TInspectorEXE_OpenFileDialog::GetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
-                                                                 TInspector_Communicator* theCommunicator,
-                                                                 QStringList& theFileNames)
-{
-  Handle(TInspectorAPI_PluginParameters) aParameters = theCommunicator->GetPluginParameters();
-  TInspectorAPI_PreferencesDataMap aPreferencesItem;
-  aParameters->GetPreferences (thePluginName, aPreferencesItem);
-
-  for (TInspectorAPI_IteratorOfPreferencesDataMap anItemIt (aPreferencesItem); anItemIt.More(); anItemIt.Next())
-  {
-    if (!anItemIt.Key().IsEqual("recently_opened_files"))
-      continue;
-    theFileNames = QString(anItemIt.Value().ToCString()).split(";", QString::SkipEmptyParts);
-    if (theFileNames.size() > RECENT_FILES_CACHE_SIZE)
-      for (int i = 0; i < theFileNames.size() - RECENT_FILES_CACHE_SIZE; i++)
-        theFileNames.removeFirst();
-    break;
-  }
-}
-
-// =======================================================================
-// function : SetPluginRecentlyOpenedFiles
-// purpose :
-// =======================================================================
-void TInspectorEXE_OpenFileDialog::SetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
-                                                                 TInspector_Communicator* theCommunicator,
-                                                                 QStringList& theFileNames)
-{
-  Handle(TInspectorAPI_PluginParameters) aParameters = theCommunicator->GetPluginParameters();
-
-  TInspectorAPI_PreferencesDataMap aPreferencesItem;
-  aParameters->GetPreferences (thePluginName, aPreferencesItem);
-  aPreferencesItem.Bind ("recently_opened_files", TCollection_AsciiString (theFileNames.join (";").toUtf8().data()));
-
-  aParameters->SetPreferences (thePluginName, aPreferencesItem);
-}
-
-// =======================================================================
-// function : onSampleSelectionChanged
-// purpose :
-// =======================================================================
-void TInspectorEXE_OpenFileDialog::onSampleSelectionChanged (const QItemSelection& theSelected,
-                                                             const QItemSelection&)
-{
-  QItemSelectionModel* aSelectionModel = (QItemSelectionModel*)sender();
-  if (!aSelectionModel)
-    return;
-  if (theSelected.isEmpty())
-    return;
-
-  QModelIndex anIndex = theSelected.first().indexes().first();
-  if (!anIndex.isValid())
-    return;
-
-  myFileName = aSelectionModel->model()->data (anIndex, Qt::ToolTipRole).toString();
-  accept();
-}
-
-// =======================================================================
-// function : onSelectClicked
-// purpose :
-// =======================================================================
-void TInspectorEXE_OpenFileDialog::onSelectClicked()
-{
-  QString anEnteredPath;
-  QString aDirName = mySelectedName->text();
-  if (!aDirName.isEmpty())
-  {
-    QDir aDir (aDirName);
-    if (aDir.exists())
-      anEnteredPath = aDirName;
-  }
-
-  QString aFileName = QFileDialog::getOpenFileName (0, "Open document", anEnteredPath);
-
-  if (aFileName.isEmpty())
-    return; // do nothing, left the previous value
-
-
-  myFileName = aFileName;
-  accept();
-}
-
-// =======================================================================
-// function : onApplySelectClicked
-// purpose :
-// =======================================================================
-void TInspectorEXE_OpenFileDialog::onApplySelectClicked()
-{
-  QString aFileName = mySelectedName->text();
-
-  QFileInfo aFileInfo (aFileName);
-  if (!aFileInfo.exists() || !aFileInfo.isFile())
-    return;
-
-  myFileName = mySelectedName->text();
-  accept();
-}
-
-// =======================================================================
-// function : createTableView
-// purpose :
-// =======================================================================
-QTableView* TInspectorEXE_OpenFileDialog::createTableView (const QStringList& theFileNames)
-{
-  QTableView* aTableView = new QTableView (this);
-  aTableView->setFrameStyle (QFrame::NoFrame);
-  QPalette aPalette = aTableView->viewport()->palette();
-  QColor aWindowColor = aPalette.color (QPalette::Window);
-  aPalette.setBrush (QPalette::Base, aWindowColor);
-  aTableView->viewport()->setPalette (aPalette);
-
-  aTableView->horizontalHeader()->setVisible (false);
-  aTableView->verticalHeader()->setVisible (false);
-  aTableView->setGridStyle (Qt::NoPen);
-  aTableView->setModel (createModel (theFileNames));
-  aTableView->setItemDelegateForRow (0, new TInspectorEXE_OpenFileItemDelegate (aTableView,
-                                                          aPalette.color (QPalette::Highlight)));
-  aTableView->viewport()->setAttribute (Qt::WA_Hover);
-  int aCellHeight = ICON_SIZE + aTableView->verticalHeader()->defaultSectionSize();
-  aTableView->setRowHeight (0, aCellHeight);
-  int aScrollHeight = aTableView->horizontalScrollBar()->sizeHint().height();
-  aTableView->setMinimumHeight (aCellHeight + aScrollHeight);
-  QItemSelectionModel* aSelectionModel = new QItemSelectionModel (aTableView->model());
-  connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
-           this, SLOT (onSampleSelectionChanged (const QItemSelection&, const QItemSelection&)));
-  aTableView->setSelectionModel (aSelectionModel);
-
-  return aTableView;
-}
-
-// =======================================================================
-// function : createModel
-// purpose :
-// =======================================================================
-QAbstractItemModel* TInspectorEXE_OpenFileDialog::createModel (const QStringList& theFileNames)
-{
-  TInspectorEXE_OpenFileViewModel* aModel = new TInspectorEXE_OpenFileViewModel (this);
-  aModel->Init (theFileNames);
-  return aModel;
-}
diff --git a/tools/TInspectorEXE/TInspectorEXE_OpenFileDialog.hxx b/tools/TInspectorEXE/TInspectorEXE_OpenFileDialog.hxx
deleted file mode 100644 (file)
index b4d63ee..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-// Created on: 2017-06-16
-// Created by: Natalia ERMOLAEVA
-// Copyright (c) 2017 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement. 
-
-#ifndef TInspectorEXE_OpenFileDialog_H
-#define TInspectorEXE_OpenFileDialog_H
-
-#include <inspector/TInspectorAPI_PreferencesDataMap.hxx>
-
-#include <NCollection_DataMap.hxx>
-#include <NCollection_List.hxx>
-#include <TCollection_AsciiString.hxx>
-
-#include <Standard_WarningsDisable.hxx>
-#include <QDialog>
-#include <QItemSelection>
-#include <QStringList>
-#include <Standard_WarningsRestore.hxx>
-
-#include <map>
-
-class TInspector_Communicator;
-
-class QAbstractItemModel;
-class QLineEdit;
-class QPushButton;
-class QTableView;
-class QToolButton;
-class QWidget;
-
-//! \class TInspectorEXE_OpenButton
-//! Class that contains push button and the button processing. It obtains a file name from the default or current
-//! directory and gives the name into TInspector communicator
-//! Object name of the button is the name of the plugin to get the default directory, or the current directory is used.
-class TInspectorEXE_OpenButton : public QObject
-{
-  Q_OBJECT
-
-public:
-
-  //! Constructor
-  TInspectorEXE_OpenButton (QObject* theParent) : QObject (theParent), myStartButton (0) {}
-
-  //! Destructor
-  virtual ~TInspectorEXE_OpenButton() {}
-
-  //! Returns the start button, if this is the first call, it creates the button and connect it to the slot
-  QPushButton* StartButton();
-
-  //! Sets the default directory of plugin.
-  void SetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
-                                     const QStringList& theRecentlyOpenedFiles)
-  { myRecentlyOpenedFiles[thePluginName] = theRecentlyOpenedFiles; }
-
-private slots:
-
-  //! Processes the button click, open default/current directory to select open file, calls OpenFile of communicator
-  void onStartButtonClicked();
-
-private:
-
-  QPushButton* myStartButton; //!< processed button
-  //!< plugins recently opened files
-  QMap<TCollection_AsciiString, QStringList> myRecentlyOpenedFiles;
-};
-
-//! \class TInspectorEXE_OpenFileDialog
-//! Control that contains table view of samples and line to select a file name from other directory.
-//! Click on element of samples table view calls this sample opening else after entering(or opening) file name
-//! the import becomes active. Click on the button will open selected file if it is possible
-class TInspectorEXE_OpenFileDialog : public QDialog
-{
-  Q_OBJECT
-private:
-
-  //! Constructor
-  Standard_EXPORT TInspectorEXE_OpenFileDialog (QWidget* theParent, const QStringList& theRecentlyOpenedFiles);
-
-public:
-
-  //! Destructor
-  virtual ~TInspectorEXE_OpenFileDialog() Standard_OVERRIDE {}
-
-  //! Opens this file dialog using for samples view the given directory and try to open new file
-  //! \param theParent a parent for the new dialog
-  //! \param theDataDirName path to default samples directory
-  //! \returns a file name from the open file dialog
-  Standard_EXPORT static QString OpenFile (QWidget* theParent, const QStringList& theRecentlyOpenedFiles);
-
-  //! Returns selection name from the dialog
-  QString GetFileName() const { return myFileName; }
-
-  //! Returns communicator, if this is the first call, create a communicator instance
-  Standard_EXPORT static TInspector_Communicator* Communicator();
-
-  //! Returns preferences: previous opened documents.
-  //! \param thePluginName name of the plugin
-  //! \param theCommunicator source of preferences
-  //! \param theFileNames [out] container of recently opened file names
-  Standard_EXPORT static void GetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
-                                                            TInspector_Communicator* theCommunicator,
-                                                            QStringList& theFileNames);
-
-  //! Sets preferences: previous opened documents.
-  //! \param thePluginName name of the plugin
-  //! \param theCommunicator source of preferences
-  //! \param theFileNames container of recently opened file names to be set into communicator preferences
-  Standard_EXPORT static void SetPluginRecentlyOpenedFiles (const TCollection_AsciiString& thePluginName,
-                                                            TInspector_Communicator* theCommunicator,
-                                                            QStringList& theFileNames);
-
-private slots:
-
-  //! Stores name of selected sample file
-  void onSampleSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
-
-  //! Open file dialog to select a file name. Fills file name line, enable import button
-  void onSelectClicked();
-
-  //! Accepts open file dialog
-  void onApplySelectClicked();
-
-private:
-
-  //! Creates view of file names in samples directory
-  //! \param theFileNames a container of names
-  //! \return table view
-  QTableView* createTableView (const QStringList& theFileNames);
-
-  //! Creates view model and fills it by the file names
-  //! \param theFileNames a container of names
-  //! \return model
-  QAbstractItemModel* createModel (const QStringList& theFileNames);
-
-private:
-
-  QStringList myRecentlyOpenedFiles; //!< recently opened files
-  QString myFileName; //!< result file name
-  QTableView* mySamplesView; //! <view of sample file names
-  QLineEdit* mySelectedName; //!< alternative control to open file
-};
-
-#endif
diff --git a/tools/TInspectorEXE/TInspectorEXE_OpenFileViewModel.cxx b/tools/TInspectorEXE/TInspectorEXE_OpenFileViewModel.cxx
deleted file mode 100644 (file)
index 03be935..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-// Created on: 2017-06-16
-// Created by: Natalia ERMOLAEVA
-// Copyright (c) 2017 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement. 
-
-#include <inspector/TInspectorEXE_OpenFileViewModel.hxx>
-
-#include <Standard_WarningsDisable.hxx>
-#include <QApplication>
-#include <QFileInfo>
-#include <QIcon>
-#include <QPainter>
-#include <Standard_WarningsRestore.hxx>
-
-const int ICON_SIZE = 40;
-
-// =======================================================================
-// function : paint
-// purpose :
-// =======================================================================
-void TInspectorEXE_OpenFileItemDelegate::paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
-                                                const QModelIndex& theIndex) const
-{
-  // highlight cell
-  if (theOption.state & QStyle::State_MouseOver)
-    thePainter->fillRect (theOption.rect, myColor);
-
-  // action icon for all indices before the last one
-  QIcon anIcon (":folder_import.png");
-  QSize anIconSize (ICON_SIZE, ICON_SIZE);
-  int aDX = (theOption.rect.width() - anIconSize.width()) / 2;
-  int aMargin = qApp->style()->pixelMetric (QStyle::PM_HeaderMargin);
-  thePainter->drawPixmap (QRect (theOption.rect.left() + aDX,
-                          theOption.rect.top() + aMargin,
-                          anIconSize.width(),
-                          anIconSize.height()),
-                          anIcon.pixmap(anIconSize.width(), anIconSize.height()));
-  // default paint
-  QItemDelegate::paint (thePainter, theOption, theIndex);
-}
-
-// =======================================================================
-// function : Init
-// purpose :
-// =======================================================================
-void TInspectorEXE_OpenFileViewModel::Init (const QStringList& theValues)
-{
-  myValues = theValues;
-}
-
-// =======================================================================
-// function : data
-// purpose :
-// =======================================================================
-QVariant TInspectorEXE_OpenFileViewModel::data (const QModelIndex& theIndex, int theRole) const
-{
-  switch (theRole)
-  {
-    case Qt::DisplayRole: return QFileInfo (myValues[theIndex.column()]).fileName();
-    case Qt::ToolTipRole: return myValues[theIndex.column()];
-    case Qt::TextAlignmentRole: return QVariant (Qt::AlignBottom | Qt::AlignHCenter);
-    default: break;
-  }
-  return QVariant();
-}
diff --git a/tools/TInspectorEXE/TInspectorEXE_OpenFileViewModel.hxx b/tools/TInspectorEXE/TInspectorEXE_OpenFileViewModel.hxx
deleted file mode 100644 (file)
index 42b6604..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-// Created on: 2017-06-16
-// Created by: Natalia ERMOLAEVA
-// Copyright (c) 2017 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement. 
-
-#ifndef TInspectorEXE_OpenFileViewModel_H
-#define TInspectorEXE_OpenFileViewModel_H
-
-#include <Standard_Macro.hxx>
-
-#include <Standard_WarningsDisable.hxx>
-#include <QAbstractTableModel>
-#include <QStringList>
-#include <QItemDelegate>
-#include <Standard_WarningsRestore.hxx>
-
-class QObject;
-class QPainter;
-
-//! \class TInspectorEXE_OpenFileItemDelegate
-//! Draws large(40x40) icons in cell. The icon background in colored in highlight when mouse is over button
-class TInspectorEXE_OpenFileItemDelegate : public QItemDelegate
-{
-
-public:
-
-  //! Constructor
-  TInspectorEXE_OpenFileItemDelegate (QObject* theParent, const QColor& theHighlightColor)
-  : QItemDelegate (theParent), myColor(theHighlightColor) {}
-
-  //! Destructor
-  virtual ~TInspectorEXE_OpenFileItemDelegate() {}
-
-  //! Draw an icon in the cell
-  //! \param thePainter a painter
-  //! \param theOption a paint options
-  //! \param theIndex a view index
-  virtual void paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
-                      const QModelIndex& theIndex) const Standard_OVERRIDE;
-
-private:
-
-  QColor myColor; //!< highlight color
-};
-
-//! \class TInspectorEXE_OpenFileViewModel
-//! Table model that visualizes container of string values (file names)
-//! Table orientation is horizontal, it has 1 row, number of columns equals to number of values
-class TInspectorEXE_OpenFileViewModel : public QAbstractTableModel
-{
-
-public:
-
-  //! Constructor
-  TInspectorEXE_OpenFileViewModel (QObject* theParent = 0) : QAbstractTableModel (theParent) {}
-
-  //! Destructor
-  virtual ~TInspectorEXE_OpenFileViewModel() {}
-
-  //! Store values
-  //! \param theValues a container of values to fill model
-  void Init (const QStringList& theValues);
-
-  //! Returns content of the model index for the given role, it is obtained from internal container of values
-  //! It returns value only for DisplayRole.
-  //! \param theIndex a model index
-  //! \param theRole a view role
-  //! \return value intepreted depending on the given role
-  virtual QVariant data (const QModelIndex& theIndex, int theRole = Qt::DisplayRole) const Standard_OVERRIDE;
-
-  //! Returns number of rows
-  //! \param theParent an index of the parent item
-  //! \return an integer value
-  virtual int rowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
-  { (void)theParent; return 1; }
-
-  //! Returns number of columns
-  //! \param theParent an index of the parent item
-  //! \return an integer value
-  virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
-  { (void)theParent; return myValues.size(); }
-
-private:
-
-  QStringList myValues; //!< file names
-};
-
-#endif
diff --git a/tools/TInspectorEXE/icons/folder_export.png b/tools/TInspectorEXE/icons/folder_export.png
deleted file mode 100644 (file)
index 5f45f99..0000000
Binary files a/tools/TInspectorEXE/icons/folder_export.png and /dev/null differ
diff --git a/tools/TInspectorEXE/icons/folder_import.png b/tools/TInspectorEXE/icons/folder_import.png
deleted file mode 100644 (file)
index 02743ab..0000000
Binary files a/tools/TInspectorEXE/icons/folder_import.png and /dev/null differ
diff --git a/tools/TInspectorEXE/icons/folder_open.png b/tools/TInspectorEXE/icons/folder_open.png
deleted file mode 100644 (file)
index b0a139e..0000000
Binary files a/tools/TInspectorEXE/icons/folder_open.png and /dev/null differ
index a028066..b9f1451 100644 (file)
@@ -1,9 +1,11 @@
 TKTInspectorAPI
+TKernel
 TKMath
 TKBRep
 TKGeomBase
 TKG3d
 TKService
 TKTreeModel
+TKV3d
 TKView
 CSF_QT
index df0002f..0e517c2 100644 (file)
@@ -1,4 +1,8 @@
 TKG3d
 TKernel
 TKLCAF
-TKMath
\ No newline at end of file
+TKMath
+TKBRep
+TKTopAlgo
+TKPrim
+TKV3d
index 62a89ec..95df12d 100644 (file)
@@ -2,6 +2,7 @@ TKDraw
 TKDCAF
 TKTInspector
 TKTInspectorAPI
+TKernel
 TKService
 TKV3d
 TKViewerTest
index 893b52c..74b7426 100644 (file)
@@ -1 +1,6 @@
+TKernel
+TKMath
+TKPrim
+TKTopAlgo
+TKTInspectorAPI
 CSF_QT
\ No newline at end of file
index b5f6441..72cf333 100644 (file)
@@ -4,4 +4,5 @@ TKMath
 TKService
 TKOpenGl
 TKV3d
+TKTInspectorAPI
 CSF_QT
\ No newline at end of file
index e03dd5b..c0abd77 100644 (file)
@@ -40,6 +40,15 @@ Standard_EXPORT ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
 
 static TInspector_Communicator* MyCommunicator;
 
+// =======================================================================
+// function : Communicator
+// purpose  : defines plugin library name by the command argument
+// =======================================================================
+TInspector_Communicator* ToolsDraw::Communicator()
+{
+  return MyCommunicator;
+}
+
 // =======================================================================
 // function : convertToPluginName
 // purpose  : defines plugin library name by the command argument
@@ -386,7 +395,7 @@ void ToolsDraw::Commands(Draw_Interpretor& theCommands)
     "\n\t\t:           Plugins order will be the same as defined in arguments."
     "\n\t\t:           'all' adds all available plugins in the order:"
     "\n\t\t:                 DFBrowser, VInspector and ShapeView."
-    "\n\t\t:           If at the first call this option is not used, 'all' option is applyed;"
+    "\n\t\t:           If at the first call this option is not used, 'all' option is applied;"
     "\n\t\t:  -activate activates the plugin in the tool view."
     "\n\t\t:           If at the first call this option is not used, the first plugin is activated;"
     "\n\t\t:  -shape initializes plugin/s by the shape object. If 'name' is empty, initializes all plugins;"
index b004ad5..9b5dcf5 100644 (file)
@@ -20,6 +20,8 @@
 #include <Draw_Interpretor.hxx>
 #include <Standard.hxx>
 
+class TInspector_Communicator;
+
 //! \class ToolsDraw
 //! \brief Registers DRAW commands to connect to TInspector tools
 class ToolsDraw
@@ -32,10 +34,13 @@ public:
   //! \param theDI Draw interpretor
   Standard_EXPORT static void Factory (Draw_Interpretor& theDI);
 
-  //! Add all tools command in the Draw_Interpretor
+  //! Adds all tools command in the Draw_Interpretor
   //! \param theCommands
   Standard_EXPORT static void Commands (Draw_Interpretor& theCommands);
 
+  //! Returns default communicator used in DRAW commands
+  Standard_EXPORT static TInspector_Communicator* Communicator();
+
 private:
 };
 
index 2eeab8f..45b20c9 100644 (file)
@@ -1,4 +1,3 @@
-TreeModel.hxx
 TreeModel.qrc
 TreeModel_ColumnType.hxx
 TreeModel_ContextMenu.cxx
@@ -6,7 +5,11 @@ TreeModel_ContextMenu.hxx
 TreeModel_HeaderSection.hxx
 TreeModel_ItemBase.cxx
 TreeModel_ItemBase.hxx
+TreeModel_ItemProperties.cxx
+TreeModel_ItemProperties.hxx
 TreeModel_ItemRole.hxx
+TreeModel_ItemStream.cxx
+TreeModel_ItemStream.hxx
 TreeModel_ModelBase.cxx
 TreeModel_ModelBase.hxx
 TreeModel_Tools.cxx
diff --git a/tools/TreeModel/TreeModel.hxx b/tools/TreeModel/TreeModel.hxx
deleted file mode 100644 (file)
index 30ba380..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// Created on: 2017-06-16
-// Created by: Natalia ERMOLAEVA
-// Copyright (c) 2017 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement. 
-
-#ifndef TREEMODEL_H
-#define TREEMODEL_H
-
-#ifdef __TreeModel_DLL
-  #ifdef _WIN32
-    #define TREEMODEL_EXPORT __declspec(dllexport)
-  #else
-    #define TREEMODEL_EXPORT
-  #endif
-#else
-  #ifdef _WIN32
-    #define TREEMODEL_EXPORT __declspec(dllimport)
-  #else
-    #define TREEMODEL_EXPORT
-  #endif
-#endif
-
-#endif
index 925185a..c6df423 100644 (file)
@@ -47,7 +47,7 @@ protected slots:
   void onColumnVisibilityChanged();
 
 private:
-  QTreeView* myTreeView;
+  QTreeView* myTreeView; //!< current tree view
 };
 
 #endif
index 5ea9ca1..6e84d7e 100644 (file)
@@ -41,6 +41,11 @@ public:
   //! Destructor
   ~TreeModel_HeaderSection() {}
 
+  //! Returns whether the header section is not initialized with values.
+  //! The check is empty value of the name text
+  //! \return boolean value
+  bool IsEmpty() const { return myName.isEmpty(); }
+
   //! Sets text value
   //! \theName text value
   void SetName (const QString& theName) { myName = theName; }
@@ -69,10 +74,10 @@ public:
   bool IsItalic() const { return myIsItalic; }
 
 private:
-  QString myName;  //! text value
-  int myWidth; //! section width
-  bool myIsHidden; //! visibility
-  bool myIsItalic; //! italic
+  QString myName;  //!< text value
+  int myWidth; //!< section width
+  bool myIsHidden; //!< visibility
+  bool myIsItalic; //!< italic
 };
 
 #endif
index 464a788..38ef9b2 100644 (file)
 // commercial license or contractual agreement. 
 
 #include <inspector/TreeModel_ItemBase.hxx>
-
+#include <inspector/TreeModel_ItemProperties.hxx>
 #include <inspector/TreeModel_ItemRole.hxx>
+#include <inspector/TreeModel_ItemStream.hxx>
 
+#include <Standard_Dump.hxx>
 #include <Standard_WarningsDisable.hxx>
 #include <QStringList>
 #include <Standard_WarningsRestore.hxx>
@@ -26,7 +28,7 @@
 // purpose :
 // =======================================================================
 TreeModel_ItemBase::TreeModel_ItemBase (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
- : m_bInitialized (false)
+ : m_iStreamChildren (0), m_bInitialized (false)
 {
   m_pParent = theParent;
   m_iRow = theRow;
@@ -34,7 +36,7 @@ TreeModel_ItemBase::TreeModel_ItemBase (TreeModel_ItemBasePtr theParent, const i
 }
 
 // =======================================================================
-// function :  reset
+// function :  Reset
 // purpose :
 // =======================================================================
 void TreeModel_ItemBase::Reset()
@@ -46,7 +48,12 @@ void TreeModel_ItemBase::Reset()
       anItem->Reset();
   }
   m_bInitialized = false;
+  if (!myProperties.IsNull())
+  {
+    myProperties->Reset();
+  }
   myCachedValues.clear();
+  myStream.str ("");
 }
 
 // =======================================================================
@@ -55,7 +62,7 @@ void TreeModel_ItemBase::Reset()
 // =======================================================================
 void TreeModel_ItemBase::Reset (int theRole)
 {
-  if (!myCachedValues.contains (theRole))  
+  if (!myCachedValues.contains (theRole))
     return;
 
   myCachedValues.remove (theRole);
@@ -74,7 +81,11 @@ TreeModel_ItemBasePtr TreeModel_ItemBase::Child (int theRow, int theColumn, cons
 
   TreeModel_ItemBasePtr anItem;
   if (isToCreate) {
-    anItem = createChild (theRow, theColumn);
+    if (theRow < m_iStreamChildren)
+      anItem = TreeModel_ItemStream::CreateItem (currentItem(), theRow, theColumn);
+    else
+      anItem = createChild (theRow - m_iStreamChildren, theColumn);
+
     if (anItem)
       m_ChildItems[aPos] = anItem;
   }
@@ -99,8 +110,77 @@ QVariant TreeModel_ItemBase::cachedValue (const int theItemRole) const
   if (myCachedValues.contains (theItemRole))
     return myCachedValues[theItemRole];
 
-  const_cast<TreeModel_ItemBase*>(this)->myCachedValues.insert (theItemRole,
-    theItemRole == TreeModel_ItemRole_RowCountRole ? QVariant (initRowCount()) : initValue (theItemRole));
+  QVariant aValueToCache;
+  if (theItemRole == TreeModel_ItemRole_RowCountRole)
+    aValueToCache = initRowCount() + const_cast<TreeModel_ItemBase*>(this)->initStreamRowCount();
+  else
+    aValueToCache = initValue (theItemRole);
 
+  myCachedValues.insert (theItemRole, aValueToCache);
   return myCachedValues.contains (theItemRole) ? myCachedValues[theItemRole] : QVariant();
 }
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void TreeModel_ItemBase::Init()
+{
+  m_bInitialized = true;
+
+  initStream(myStream);
+  initStreamRowCount();
+}
+
+// =======================================================================
+// function : Object
+// purpose :
+// =======================================================================
+const Handle(Standard_Transient)& TreeModel_ItemBase::Object() const
+{
+  static Handle(Standard_Transient) aNullObject;
+  return aNullObject;
+}
+
+// =======================================================================
+// function : initStreamRowCount
+// purpose :
+// =======================================================================
+int TreeModel_ItemBase::initStreamRowCount()
+{
+  int aStreamChildrenCount = 0;
+  if (Column() == 0)
+  {
+    Standard_SStream aStream;
+    initStream (aStream);
+    if (!Standard_Dump::Text (aStream).IsEmpty())
+    {
+      if (!myProperties)
+      {
+        myProperties = new TreeModel_ItemProperties();
+        myProperties->SetItem (currentItem());
+      }
+      myProperties->Init();
+      aStreamChildrenCount = myProperties->Children().Extent();
+    }
+  }
+  m_iStreamChildren = aStreamChildrenCount;
+  return m_iStreamChildren;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant TreeModel_ItemBase::initValue (const int theItemRole) const
+{
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  switch (Column())
+  {
+    case 1: { return Row(); }
+  }
+
+  return QVariant();
+}
index 82ba6dc..99f7d21 100644 (file)
 
 #include <Standard.hxx>
 #include <Standard_Macro.hxx>
+#include <Standard_Handle.hxx>
+#include <Standard_OStream.hxx>
+#include <Standard_SStream.hxx>
+
 #include <inspector/TreeModel_ItemRole.hxx>
 
 #include <Standard_WarningsDisable.hxx>
@@ -32,6 +36,7 @@
 #include <Standard_WarningsRestore.hxx>
 
 class TreeModel_ItemBase;
+class TreeModel_ItemProperties;
 
 typedef QExplicitlySharedDataPointer<TreeModel_ItemBase> TreeModel_ItemBasePtr;
 
@@ -81,7 +86,11 @@ public:
 
   //! Sets the item internal initialized state to the true. If the item has internal values,
   //! there should be initialized here.
-  virtual void Init() { m_bInitialized = true; }
+  Standard_EXPORT virtual void Init();
+
+  //! Returns data object of the item.
+  //! \return object
+  Standard_EXPORT virtual const Handle(Standard_Transient)& Object() const;
 
   //! Resets the item and the child items content. Sets the initialized state to false.
   //! If the item has internal values, there should be reseted here.
@@ -91,6 +100,16 @@ public:
   //! \param theRole an item role
   Standard_EXPORT virtual void Reset(int theRole);
 
+  //! Returns stream value of the item to fulfill property panel.
+  //! \return stream value or dummy
+  const Standard_SStream& Stream() const { return myStream; }
+
+  //! Returns stream value of the item to fulfill property panel.
+  //! \return stream value or dummy
+  virtual bool SetStream (const Standard_SStream& theSStream, Standard_Integer& theStartPos,
+                          Standard_Integer& theLastPos) const
+  { (void)theSStream; (void)theStartPos; (void)theLastPos; return false; }
+
   //! Gets the parent of the item, or TreeModel_ItemBasePtr() if it has no parent.
   //! \return pointer to the item
   TreeModel_ItemBasePtr Parent() const { return m_pParent; };
@@ -115,7 +134,7 @@ public:
   //! Sets a custom value for the role in an internal cache
   //! \param theValue a value
   //! \param theRole a value role
-  void SetCustomData(const QVariant theValue, int theRole) { myCachedValues.insert (theRole, theValue); }
+  void SetCustomData(const QVariant& theValue, int theRole) { myCachedValues.insert (theRole, theValue); }
 
   //! Returns the data stored under the given role for the current item
   //! \param theIndex the item model index
@@ -127,18 +146,25 @@ public:
   //! \return the row count
   int rowCount() const { return cachedValue(TreeModel_ItemRole_RowCountRole).toInt(); }
 
+  //! Returns the item properties
+  const Handle(TreeModel_ItemProperties)& Properties() const { return myProperties; }
+
 protected:
 
   //! \param theParent the parent item
-  //! \param theRow the item row positition in the parent item
-  //! \param theColumn the item column positition in the parent item
+  //! \param theRow the item row position in the parent item
+  //! \param theColumn the item column position in the parent item
   Standard_EXPORT TreeModel_ItemBase (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn);
 
+  //! Initializes the current item. It creates a backup of the specific item information
+  virtual void initItem() const {}
+
   //! Creates a child item in the given position.
   //! \param theRow the child row position
   //! \param theColumn the child column position
   //! \return the created item
-  virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) = 0;
+  virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn)
+  { (void)theRow; (void)theColumn; return TreeModel_ItemBasePtr(); }
 
   //! Wraps the currrent item by shared pointer
   //! \return the shared pointer to the current item
@@ -153,17 +179,29 @@ protected:
   //! \return number of children. It should be reimplemented in child
   virtual int initRowCount() const = 0;
 
-  //! Return data value for the role. It should be reimplemented in child
+  //! \return number of children. It should be reimplemented in child
+  Standard_EXPORT int initStreamRowCount();
+
+  //! Returns data value for the role. It should be reimplemented in child
   //! \param theItemRole a value role
   //! \return the value
-  virtual QVariant initValue (const int theItemRole) const = 0;
+  Standard_EXPORT virtual QVariant initValue (const int theItemRole) const;
+
+  //! Returns stream value of the item to fulfill property panel.
+  //! \return stream value or dummy
+  virtual void initStream (Standard_OStream& theOStream) const { (void)theOStream; }
+
+protected:
+  Handle(TreeModel_ItemProperties) myProperties; //!< the properties
+  int m_iStreamChildren; //!< the count of stream items
+  Standard_SStream myStream; //!< stream value
 
 private:
 
   typedef QHash< QPair<int, int>, TreeModel_ItemBasePtr > PositionToItemHash;
   PositionToItemHash m_ChildItems; //!< the hash of item children
 
-  QMap<int, QVariant> myCachedValues; //!< cached values, should be cleared by reset
+  mutable QMap<int, QVariant> myCachedValues; //!< cached values, should be cleared by reset
   TreeModel_ItemBasePtr m_pParent; //!< the parent item
   int m_iRow;          //!< the item row position in the parent item
   int m_iColumn;       //!< the item column position in the parent item
diff --git a/tools/TreeModel/TreeModel_ItemProperties.cxx b/tools/TreeModel/TreeModel_ItemProperties.cxx
new file mode 100644 (file)
index 0000000..631d2f2
--- /dev/null
@@ -0,0 +1,232 @@
+// Created on: 2020-01-25
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#include <inspector/TreeModel_ItemProperties.hxx>
+#include <inspector/TreeModel_ItemStream.hxx>
+#include <inspector/Convert_Tools.hxx>
+#include <inspector/Convert_TransientShape.hxx>
+
+#include <BRepBuilderAPI_MakeVertex.hxx>
+#include <gp_XYZ.hxx>
+#include <Standard_Dump.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QApplication>
+#include <QFont>
+#include <Standard_WarningsRestore.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(TreeModel_ItemProperties, Standard_Transient)
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void TreeModel_ItemProperties::Init ()
+{
+  myRowValues.Clear();
+
+  const Standard_SStream& aStream = Item()->Stream();
+
+  NCollection_IndexedDataMap<TCollection_AsciiString, Standard_DumpValue> aValues;
+  TCollection_AsciiString aStreamText = Standard_Dump::Text (aStream);
+  Standard_Dump::SplitJson (aStreamText, aValues);
+
+  TreeModel_ItemStreamPtr aStreamParent = itemDynamicCast<TreeModel_ItemStream>(Item());
+  TCollection_AsciiString aKey;
+  Standard_DumpValue aKeyValue;
+  if (!aStreamParent)
+  {
+    const Handle(Standard_Transient)& anItemObject = Item()->Object();
+    aKey = anItemObject.IsNull() ? "Dump" : anItemObject->DynamicType()->Name();
+    aKeyValue = Standard_DumpValue (aStreamText, 1);
+
+    myKey = aKey;
+    myStreamValue = aKeyValue;
+  }
+  else
+  {
+    TCollection_AsciiString aValue;
+    if (Item()->Parent())
+    {
+      const Handle(TreeModel_ItemProperties)& aParentProperties = Item()->Parent()->Properties();
+      if (aParentProperties)
+        aParentProperties->ChildStream (Item()->Row(), aKey, aKeyValue);
+    }
+    myKey = aKey;
+    myStreamValue = aKeyValue;
+
+    aValues.Clear();
+    Standard_Dump::SplitJson (myStreamValue.myValue, aValues);
+  }
+
+  for (Standard_Integer anIndex = 1; anIndex <= aValues.Size(); anIndex++)
+  {
+    Standard_DumpValue aValue = aValues.FindFromIndex (anIndex);
+    if (Standard_Dump::HasChildKey (aValue.myValue))
+      myChildren.Add (aValues.FindKey (anIndex), aValue);
+    else
+    {
+      TreeModel_RowValue aRowValue (aValue.myStartPosition, aValues.FindKey (anIndex).ToCString(), aValue.myValue.ToCString());
+      myRowValues.Add (myRowValues.Size() + 1, aRowValue);
+    }
+  }
+  if (myRowValues.Size() == 1)
+  {
+    Quantity_Color aColor;
+    if (Convert_Tools::ConvertStreamToColor (aStream, aColor))
+    {
+      Standard_Real aRed, aGreen, aBlue;
+      aColor.Values (aRed, aGreen, aBlue, Quantity_TOC_sRGB);
+
+      int aDelta = 255;
+      myRowValues.ChangeFromIndex (1).CustomValues.insert ((int)Qt::BackgroundRole, QColor((int)(aRed * aDelta),
+        (int)(aGreen * aDelta), (int)(aBlue * aDelta)));
+    }
+  }
+}
+
+// =======================================================================
+// function :  Reset
+// purpose :
+// =======================================================================
+void TreeModel_ItemProperties::Reset()
+{
+  myKey = "";
+  myStreamValue = Standard_DumpValue();
+
+  myChildren.Clear();
+  myRowValues.Clear();
+}
+
+// =======================================================================
+// function : RowCount
+// purpose :
+// =======================================================================
+int TreeModel_ItemProperties::RowCount() const
+{
+  return RowValues().Size();
+}
+
+// =======================================================================
+// function : Data
+// purpose :
+// =======================================================================
+QVariant TreeModel_ItemProperties::Data (const int theRow, const int theColumn, int theRole) const
+{
+  if (theColumn == 1 && theRole == Qt::BackgroundRole)
+  {
+    const QMap<int, QVariant>& aCachedValues = RowValues().FindFromIndex (theRow + 1).CustomValues;
+    if (aCachedValues.contains ((int)theRole))
+      return aCachedValues[(int)theRole];
+  }
+
+  if (theRole == Qt::FontRole) // method name is in italic
+  {
+    if (Data(theRow, 0, Qt::DisplayRole).toString().contains("className"))
+    {
+      QFont aFont = qApp->font();
+      aFont.setItalic (true);
+      return aFont;
+    }
+  }
+  if (theRole == Qt::ForegroundRole)
+  {
+    if (Data(theRow, 0, Qt::DisplayRole).toString().contains("className"))
+      return QColor (Qt::darkGray).darker(150);
+  }
+
+  if (theRole == Qt::DisplayRole || theRole == Qt::ToolTipRole)
+  {
+    if (theColumn == 0) return RowValues().FindFromIndex (theRow + 1).Key;
+    else if (theColumn == 1) return RowValues().FindFromIndex (theRow + 1).Value;
+  }
+
+  return QVariant();
+}
+
+// =======================================================================
+// function : EditType
+// purpose :
+// =======================================================================
+ViewControl_EditType TreeModel_ItemProperties::EditType (const int, const int theColumn) const
+{
+  if (theColumn == 0)
+    return ViewControl_EditType_None;
+
+  return ViewControl_EditType_Line;
+}
+
+// =======================================================================
+// function : SetData
+// purpose :
+// =======================================================================
+bool TreeModel_ItemProperties::SetData (const int /*theRow*/, const int theColumn, const QVariant& /*theValue*/, int)
+{
+  if (theColumn == 0)
+    return false;
+  return false;
+}
+
+// =======================================================================
+// function : Presentations
+// purpose :
+// =======================================================================
+void TreeModel_ItemProperties::Presentations (NCollection_List<Handle(Standard_Transient)>& thePresentations)
+{
+  const Standard_SStream& aStream = Item()->Stream();
+  Convert_Tools::ConvertStreamToPresentations (aStream, 1, -1, thePresentations);
+}
+
+// =======================================================================
+// function : TableFlags
+// purpose :
+// =======================================================================
+Qt::ItemFlags TreeModel_ItemProperties::TableFlags (const int, const int theColumn) const
+{
+  Qt::ItemFlags aFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+
+  if (theColumn == 1)
+    aFlags = aFlags | Qt::ItemIsEditable;
+
+  return aFlags;
+}
+
+// =======================================================================
+// function : ChildStream
+// purpose :
+// =======================================================================
+void TreeModel_ItemProperties::ChildStream (const int theRowId,
+                                            TCollection_AsciiString& theKey,
+                                            Standard_DumpValue& theValue) const
+{
+  if (myChildren.Size() <= theRowId)
+    return;
+
+  theKey = myChildren.FindKey (theRowId + 1);
+  theValue = myChildren.FindFromIndex (theRowId + 1);
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void TreeModel_ItemProperties::initItem() const
+{
+  if (!Item())
+    return;
+  if (Item()->IsInitialized())
+    return;
+  Item()->Init();
+}
diff --git a/tools/TreeModel/TreeModel_ItemProperties.hxx b/tools/TreeModel/TreeModel_ItemProperties.hxx
new file mode 100644 (file)
index 0000000..7f498d7
--- /dev/null
@@ -0,0 +1,162 @@
+// Created on: 2020-01-25
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#ifndef TreeModel_ItemProperties_H
+#define TreeModel_ItemProperties_H
+
+#include <Standard.hxx>
+#include <Standard_Dump.hxx>
+#include <Standard_Handle.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_Type.hxx>
+#include <Standard_Transient.hxx>
+
+#include <NCollection_IndexedDataMap.hxx>
+#include <NCollection_IndexedMap.hxx>
+#include <NCollection_List.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+#include <inspector/TreeModel_ItemBase.hxx>
+#include <inspector/ViewControl_EditType.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAbstractTableModel>
+#include <QColor>
+#include <QList>
+#include <QModelIndexList>
+#include <QVariant>
+#include <Standard_WarningsRestore.hxx>
+
+//! \class TreeModel_ItemProperties
+//! Class to manipulate properties of tree item. The properties are organized in table structure
+class TreeModel_ItemProperties : public Standard_Transient
+{
+  //! enum defined the dimension type
+  enum TreeModel_DimType
+  {
+    TreeModel_DimType_Rows,   //!< defines number of rows
+    TreeModel_DimType_Columns //!< defines number of columns
+  };
+
+  //! container of values in a row of property table
+  struct TreeModel_RowValue
+  {
+    TreeModel_RowValue (const Standard_Integer theValueStartPosition, const QVariant& theKey, QVariant theValue)
+    : ValueStartPosition (theValueStartPosition), Key (theKey), Value (theValue) {}
+
+    Standard_Integer ValueStartPosition; //!< start position of the key
+    QVariant Key; //!< value in the first column
+    QVariant Value; //!< value in the second column
+    QMap<int, QVariant> CustomValues; //!< custom values, e.g. key is Background, value is a defined color
+  };
+
+public:
+  //! Constructor
+  TreeModel_ItemProperties() {}
+
+  //! Destructor
+  ~TreeModel_ItemProperties() {}
+
+  //! Sets the current item
+  void SetItem (const TreeModel_ItemBasePtr& theItem) { myItem = theItem; }
+
+  //! Returns the current item
+  TreeModel_ItemBasePtr Item() const { return myItem; }
+
+  //! Fills internal containers by item stream values
+  Standard_EXPORT void Init();
+
+  //! If the item has internal values, there should be reseted here.
+  Standard_EXPORT virtual void Reset();
+
+  //! Returns number of table rows
+  //! \return an integer value
+  Standard_EXPORT int RowCount() const;
+
+  //! Returns number of table columns
+  //! \return an integer value
+  int ColumnCount() const { return 2; }
+
+  //! Returns content of the model index for the given role, it is obtained from internal container of values
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theRole a view role
+  //! \return value interpreted depending on the given role
+  Standard_EXPORT QVariant Data (const int theRow, const int theColumn, int theRole = Qt::DisplayRole) const;
+
+  //! Returns type of edit control for the model index. By default, it is an empty control
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \return edit type
+  Standard_EXPORT ViewControl_EditType EditType (const int theRow, const int theColumn) const;
+
+  //! Sets content of the model index for the given role, it is applied to internal container of values
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theRole a view role
+  //! \return true if the value is changed
+  Standard_EXPORT virtual bool SetData (const int theRow, const int theColumn, const QVariant& theValue,
+                                        int theRole = Qt::DisplayRole);
+
+  //! Returns presentation of the attribute to be visualized in the view
+  //! \thePresentations [out] container of presentation handles to be visualized
+  Standard_EXPORT virtual void Presentations (NCollection_List<Handle(Standard_Transient)>& thePresentations);
+
+  //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable.
+  //! Additional flag for the column 1 is Qt::ItemIsEditable.
+  //! \param theIndex a model index
+  //! \return flags
+  Standard_EXPORT virtual Qt::ItemFlags TableFlags (const int theRow, const int theColumn) const;
+
+  //! Returns stream value of the item to fulfill property panel.
+  //! \return stream value or dummy
+  Standard_EXPORT void ChildStream (const int theRowId,
+                                    TCollection_AsciiString& theKey,
+                                    Standard_DumpValue& theValue) const;
+
+  //! Returns data object of the item.
+  //! \return object key
+  const TCollection_AsciiString& Key() const { return myKey; }
+
+  //! Returns stream value of the item.
+  //! \return value
+  const TCollection_AsciiString& StreamValue() const { return myStreamValue.myValue; }
+
+  //! Returns children stream values
+  //const NCollection_IndexedDataMap<TCollection_AsciiString, Standard_DumpValue>& Values() const { initItem(); return myValues; }
+
+  //! Returns children stream values
+  const NCollection_IndexedDataMap<Standard_Integer, TreeModel_RowValue>& RowValues() const { initItem(); return myRowValues; }
+
+  //! Returns children stream values
+  const NCollection_IndexedDataMap<TCollection_AsciiString, Standard_DumpValue>& Children() const { initItem(); return myChildren; }
+
+  DEFINE_STANDARD_RTTIEXT (TreeModel_ItemProperties, Standard_Transient)
+
+protected:
+  //! Initializes the current item. It creates a backup of the specific item information
+  Standard_EXPORT void initItem() const;
+
+private:
+  TreeModel_ItemBasePtr myItem; //!< current item
+
+  TCollection_AsciiString myKey; //!< the item key
+  Standard_DumpValue myStreamValue; //!< the stream value
+  NCollection_IndexedDataMap<TCollection_AsciiString, Standard_DumpValue> myChildren; //!< the children
+  NCollection_IndexedDataMap<Standard_Integer, TreeModel_RowValue> myRowValues; //!< the values
+};
+
+#endif
\ No newline at end of file
diff --git a/tools/TreeModel/TreeModel_ItemStream.cxx b/tools/TreeModel/TreeModel_ItemStream.cxx
new file mode 100644 (file)
index 0000000..efa8b36
--- /dev/null
@@ -0,0 +1,120 @@
+// Created on: 2020-01-25
+// Created by: Natalia ERMOLAEVA
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement. 
+
+#include <inspector/TreeModel_ItemStream.hxx>
+
+#include <inspector/TreeModel_ItemProperties.hxx>
+
+#include <Standard_Dump.hxx>
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+TreeModel_ItemStream::TreeModel_ItemStream (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+ : TreeModel_ItemBase (theParent, theRow, theColumn)
+{
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void TreeModel_ItemStream::Init()
+{
+  TreeModel_ItemBase::Init();
+
+  int aStreamChildrenCount = 0;
+  if (Column() == 0)
+  {
+    if (!myProperties)
+    {
+      myProperties = new TreeModel_ItemProperties();
+      myProperties->SetItem (currentItem());
+    }
+    myProperties->Init();
+    aStreamChildrenCount = myProperties->Children().Extent();
+  }
+  m_iStreamChildren = aStreamChildrenCount;
+  initStream (myStream);
+}
+
+// =======================================================================
+// function : Rest
+// purpose :
+// =======================================================================
+void TreeModel_ItemStream::Reset()
+{
+  myStream.str ("");
+  TreeModel_ItemBase::Reset();
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant TreeModel_ItemStream::initValue (const int theItemRole) const
+{
+  QVariant aParentValue = TreeModel_ItemBase::initValue (theItemRole);
+  if (aParentValue.isValid())
+    return aParentValue;
+
+  if (Column() != 0)
+    return QVariant();
+
+  if (theItemRole == Qt::ForegroundRole)
+    return QColor (Qt::darkBlue);
+
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  switch (Column())
+  {
+    case 0: return Properties() ? Properties()->Key().ToCString() : "";
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : initStream
+// purpose :
+// =======================================================================
+void TreeModel_ItemStream::initStream (Standard_OStream& theOStream) const
+{
+  if (!Properties())
+    return;
+
+  theOStream << Properties()->StreamValue();
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================