]> OCCT Git - occt-copy.git/commitdiff
0030268: Inspectors - improvements in VInspector plugin
authornds <nds@opencascade.com>
Fri, 19 Oct 2018 05:26:37 +0000 (08:26 +0300)
committernds <nds@opencascade.com>
Fri, 19 Oct 2018 05:31:24 +0000 (08:31 +0300)
Modifications in src:
implementing methods to have text information for some of OCCT enums;
moving out the text information from Quantity_Color;
expansionFactor() in Graphic3d_AspectText3d for access to this parameter;

Modifications in tools:
implementing common controls in ViewControl to be used in all plugins: table, property view and color selector;
move properties from columns of VInspector into property view, filled by tree view item selecting;
implementing new items (aspects, graphical information)
extending information of already existing items (presentations, selection entities)
display preview presentation for selected item (if possible, GetPresentations or GetPresentationShape of the item returns not empty value)

(cherry picked from commit bc0f06ac541d3e119109c5d6a0741b5bd42aad46)

109 files changed:
src/AIS/AIS.cxx
src/AIS/AIS.hxx
src/Aspect/Aspect.cxx [new file with mode: 0644]
src/Aspect/Aspect.hxx [new file with mode: 0644]
src/Aspect/FILES
src/Font/FILES
src/Font/Font.cxx [new file with mode: 0644]
src/Font/Font.hxx [new file with mode: 0644]
src/GeomAbs/FILES
src/GeomAbs/GeomAbs.cxx [new file with mode: 0644]
src/GeomAbs/GeomAbs.hxx [new file with mode: 0644]
src/Graphic3d/FILES
src/Graphic3d/Graphic3d.cxx [new file with mode: 0644]
src/Graphic3d/Graphic3d.hxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_AspectText3d.hxx
src/OpenGl/OpenGl_Group.cxx
src/OpenGl/OpenGl_Group.hxx
src/Prs3d/Prs3d.cxx
src/Prs3d/Prs3d.hxx
src/PrsMgr/FILES
src/PrsMgr/PrsMgr.cxx [new file with mode: 0644]
src/PrsMgr/PrsMgr.hxx [new file with mode: 0644]
src/Quantity/FILES
src/Quantity/Quantity.cxx [new file with mode: 0644]
src/Quantity/Quantity.hxx [new file with mode: 0644]
src/Quantity/Quantity_Color.cxx
src/SelectMgr/FILES
src/SelectMgr/SelectMgr.cxx [new file with mode: 0644]
src/SelectMgr/SelectMgr.hxx [new file with mode: 0644]
tools/TKTreeModel/CMakeLists.txt
tools/TKTreeModel/EXTERNLIB
tools/TreeModel/TreeModel_HeaderSection.hxx
tools/TreeModel/TreeModel_ModelBase.cxx
tools/TreeModel/TreeModel_ModelBase.hxx
tools/VInspector/FILES
tools/VInspector/VInspector_DisplayActionType.hxx [new file with mode: 0644]
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
tools/VInspector/VInspector_ItemFolderObject.hxx
tools/VInspector/VInspector_ItemGraphic3dCStructure.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemGraphic3dCStructure.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemGraphic3dClipPlane.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemGraphic3dClipPlane.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemGraphic3dGroup.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemGraphic3dGroup.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemOpenGlElement.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemOpenGlElement.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemPresentableObject.cxx
tools/VInspector/VInspector_ItemPresentableObject.hxx
tools/VInspector/VInspector_ItemPresentations.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemPresentations.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemPrs3dAspect.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemPrs3dAspect.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemPrs3dDrawer.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemPrs3dDrawer.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemPrs3dPresentation.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemPrs3dPresentation.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemSelectMgrSelection.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemSelectMgrSelection.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.hxx [new file with mode: 0644]
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_ItemV3dView.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemV3dView.hxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemV3dViewer.cxx [new file with mode: 0644]
tools/VInspector/VInspector_ItemV3dViewer.hxx [new file with mode: 0644]
tools/VInspector/VInspector_PrsOpenGlElement.cxx [new file with mode: 0644]
tools/VInspector/VInspector_PrsOpenGlElement.hxx [new file with mode: 0644]
tools/VInspector/VInspector_TableModelValues.cxx [new file with mode: 0644]
tools/VInspector/VInspector_TableModelValues.hxx [new file with mode: 0644]
tools/VInspector/VInspector_Tools.cxx
tools/VInspector/VInspector_Tools.hxx
tools/VInspector/VInspector_ViewModel.cxx
tools/VInspector/VInspector_Window.cxx
tools/VInspector/VInspector_Window.hxx
tools/View/View_Tools.cxx
tools/ViewControl/FILES
tools/ViewControl/ViewControl.hxx [new file with mode: 0644]
tools/ViewControl/ViewControl_ColorSelector.cxx [new file with mode: 0644]
tools/ViewControl/ViewControl_ColorSelector.hxx [new file with mode: 0644]
tools/ViewControl/ViewControl_EditType.hxx [new file with mode: 0644]
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_TableItemDelegate.cxx [new file with mode: 0644]
tools/ViewControl/ViewControl_TableItemDelegate.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_TableModelFilter.cxx [new file with mode: 0644]
tools/ViewControl/ViewControl_TableModelFilter.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_TableProperty.cxx [new file with mode: 0644]
tools/ViewControl/ViewControl_TableProperty.hxx [new file with mode: 0644]
tools/ViewControl/ViewControl_Tools.cxx
tools/ViewControl/ViewControl_Tools.hxx

index 60b6067de3c015025205a8e0f8c733c52ec466a7..fbbced502d8a0bd757d8a69b04f7620c4ca0e771 100644 (file)
 
 const Standard_Real SquareTolerance = Precision::SquareConfusion();
 
+namespace
+{
+  static Standard_CString AIS_Table_PrintDisplayStatus[3] =
+  {
+    "DISPLAYED", "ERASED", "NONE"
+  };
+}
+
 //=======================================================================
 //function : Nearest
 //purpose  :
@@ -1538,3 +1546,33 @@ void AIS::ComputeProjVertexPresentation (const Handle( Prs3d_Presentation )& aPr
     StdPrs_WFShape::Add (aPresentation, MakEd.Edge(), aDrawer);
   }
 }
+
+//=======================================================================
+//function : DisplayStatusToString
+//purpose  :
+//=======================================================================
+Standard_CString AIS::DisplayStatusToString (AIS_DisplayStatus theType)
+{
+  return AIS_Table_PrintDisplayStatus[theType];
+}
+
+//=======================================================================
+//function : DisplayStatusFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean AIS::DisplayStatusFromString (Standard_CString theTypeString,
+                                               AIS_DisplayStatus& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= AIS_DS_None; ++aTypeIter)
+  {
+    Standard_CString aTypeName = AIS_Table_PrintDisplayStatus[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = AIS_DisplayStatus (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
index 27559d4ec042e93d7719da8d4bdac9bbecbbb300..fb441df42d2509d73c6b5c6ed927922afcf118f6 100644 (file)
@@ -27,6 +27,7 @@
 #include <AIS_KindOfSurface.hxx>
 #include <Prs3d_Drawer.hxx>
 #include <Quantity_NameOfColor.hxx>
+#include <AIS_DisplayStatus.hxx>
 #include <Aspect_TypeOfLine.hxx>
 #include <Aspect_TypeOfMarker.hxx>
 class gp_Pnt;
@@ -250,6 +251,28 @@ public:
   
   Standard_EXPORT static void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT);
 
+  //! Returns the string name for a given enum type.
+  //! @param theType display status
+  //! @return string identifier
+  Standard_EXPORT static Standard_CString DisplayStatusToString (AIS_DisplayStatus theType);
+
+  //! Returns the display status from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return status type or AIS_DS_None if string identifier is invalid
+  static AIS_DisplayStatus DisplayStatusFromString (Standard_CString theTypeString)
+  {
+    AIS_DisplayStatus aType = AIS_DS_None;
+    DisplayStatusFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected display status
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean DisplayStatusFromString (const Standard_CString theTypeString,
+                                                                   AIS_DisplayStatus& theType);
+
 };
 
 #endif // _AIS_HeaderFile
diff --git a/src/Aspect/Aspect.cxx b/src/Aspect/Aspect.cxx
new file mode 100644 (file)
index 0000000..0039b5d
--- /dev/null
@@ -0,0 +1,405 @@
+// 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.
+
+#include <Aspect.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+namespace
+{
+  static Standard_CString Aspect_Table_PrintTypeOfDeflection[2] =
+  {
+    "RELATIVE", "ABSOLUTE"
+  };
+
+  static Standard_CString Aspect_Table_PrintTypeOfFacingModel[3] =
+  {
+    "BOTH", "BACK", "FRONT"
+  };
+
+  static Standard_CString Aspect_Table_PrintTypeOfHighlightMethod[2] =
+  {
+    "COLOR", "BOUNDBOX"
+  };
+
+  static Standard_CString Aspect_Table_PrintTypeOfLine[6] =
+  {
+    "EMPTY", "SOLID", "DASH", "DOT", "DOT_DASH", "USER_DEFINED"
+  };
+
+  static Standard_CString Aspect_Table_PrintTypeOfMarker[15] =
+  {
+    "EMPTY", "POINT", "PLUS", "STAR", "X", "O", "O_POINT", "O_PLUS", "O_STAR", "O_X",
+    "RING1", "RING2", "RING3", "BALL", "USER_DEFINED"
+  };
+
+  static Standard_CString Aspect_Table_PrintTypeOfDisplayText[6] =
+  {
+    "NORMAL", "SUBTITLE", "DEKALE", "BLEND", "DIMENSION", "SHADOW"
+  };
+
+  static Standard_CString Aspect_Table_PrintTypeOfStyleText[2] =
+  {
+    "NORMAL", "ANNOTATION"
+  };
+
+  static Standard_CString Aspect_Table_PrintInteriorStyle[6] =
+  {
+    "EMPTY", "HOLLOW", "HATCH", "SOLID", "HIDDEN_LINE", "POINT"
+  };
+
+  static Standard_CString Aspect_Table_PrintPolygonOffsetMode[7] =
+  {
+    "OFF", "FILL", "LINE", "POINT", "ALL", "NONE", "MASK"
+  };
+
+  static Standard_CString Aspect_Table_PrintHatchStyle[14] =
+  {
+    "SOLID", "HORIZONTAL", "HORIZONTAL_WIDE", "VERTICAL", "VERTICAL_WIDE",
+    "DIAGONAL_45", "DIAGONAL_45_WIDE", "DIAGONAL_135", "DIAGONAL_135_WIDE",
+    "GRID", "GRID_WIDE", "GRID_DIAGONAL", "GRID_DIAGONAL_WIDE", "NB"
+  };
+}
+
+//=======================================================================
+//function : TypeOfDeflectionToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::TypeOfDeflectionToString (Aspect_TypeOfDeflection theType)
+{
+  return Aspect_Table_PrintTypeOfDeflection[theType];
+}
+
+//=======================================================================
+//function : TypeOfDeflectionFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::TypeOfDeflectionFromString (Standard_CString theTypeString,
+                                                     Aspect_TypeOfDeflection& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Aspect_TOD_ABSOLUTE; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Aspect_Table_PrintTypeOfDeflection[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Aspect_TypeOfDeflection (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfFacingModelToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::TypeOfFacingModelToString (Aspect_TypeOfFacingModel theType)
+{
+  return Aspect_Table_PrintTypeOfFacingModel[theType];
+}
+
+//=======================================================================
+//function : TypeOfFacingModelFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::TypeOfFacingModelFromString (Standard_CString theTypeString,
+                                                   Aspect_TypeOfFacingModel& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Aspect_TOFM_FRONT_SIDE; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Aspect_Table_PrintTypeOfFacingModel[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Aspect_TypeOfFacingModel (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfHighlightMethodToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::TypeOfHighlightMethodToString (Aspect_TypeOfHighlightMethod theType)
+{
+  return Aspect_Table_PrintTypeOfHighlightMethod[theType];
+}
+
+//=======================================================================
+//function : TypeOfHighlightMethodFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::TypeOfHighlightMethodFromString (Standard_CString theTypeString,
+                                                          Aspect_TypeOfHighlightMethod& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Aspect_TOHM_BOUNDBOX; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Aspect_Table_PrintTypeOfHighlightMethod[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Aspect_TypeOfHighlightMethod (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfLineToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::TypeOfLineToString (Aspect_TypeOfLine theType)
+{
+  return Aspect_Table_PrintTypeOfLine[theType];
+}
+
+//=======================================================================
+//function : TypeOfLineFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::TypeOfLineFromString (Standard_CString theTypeString,
+                                               Aspect_TypeOfLine& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Aspect_TOL_EMPTY; aTypeIter <= Aspect_TOL_USERDEFINED; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Aspect_Table_PrintTypeOfLine[aTypeIter + 1];
+    if (aName == aTypeName)
+    {
+      theType = Aspect_TypeOfLine (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfMarkerToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::TypeOfMarkerToString (Aspect_TypeOfMarker theType)
+{
+  return Aspect_Table_PrintTypeOfMarker[theType];
+}
+
+//=======================================================================
+//function : TypeOfMarkerFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::TypeOfMarkerFromString (Standard_CString theTypeString,
+                                                 Aspect_TypeOfMarker& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Aspect_TOM_EMPTY; aTypeIter <= Aspect_TOM_USERDEFINED; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Aspect_Table_PrintTypeOfMarker[aTypeIter + 1];
+    if (aName == aTypeName)
+    {
+      theType = Aspect_TypeOfMarker (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfDisplayTextToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::TypeOfDisplayTextToString (Aspect_TypeOfDisplayText theType)
+{
+  return Aspect_Table_PrintTypeOfDisplayText[theType];
+}
+
+//=======================================================================
+//function : TypeOfDisplayTextFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::TypeOfDisplayTextFromString (Standard_CString theTypeString,
+                                                 Aspect_TypeOfDisplayText& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Aspect_TODT_NORMAL; aTypeIter <= Aspect_TODT_SHADOW; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Aspect_Table_PrintTypeOfDisplayText[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Aspect_TypeOfDisplayText (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfStyleTextToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::TypeOfStyleTextToString (Aspect_TypeOfStyleText theType)
+{
+  return Aspect_Table_PrintTypeOfStyleText[theType];
+}
+
+//=======================================================================
+//function : TypeOfStyleTextFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::TypeOfStyleTextFromString (Standard_CString theTypeString,
+                                                 Aspect_TypeOfStyleText& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Aspect_TOST_NORMAL; aTypeIter <= Aspect_TOST_ANNOTATION; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Aspect_Table_PrintTypeOfStyleText[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Aspect_TypeOfStyleText (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : InteriorStyleToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::InteriorStyleToString (Aspect_InteriorStyle theType)
+{
+  return Aspect_Table_PrintInteriorStyle[theType];
+}
+
+//=======================================================================
+//function : InteriorStyleFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::InteriorStyleFromString (Standard_CString theTypeString,
+                                                  Aspect_InteriorStyle& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Aspect_IS_EMPTY; aTypeIter <= Aspect_IS_POINT; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Aspect_Table_PrintInteriorStyle[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Aspect_InteriorStyle (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : PolygonOffsetModeToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::PolygonOffsetModeToString (Aspect_PolygonOffsetMode theType)
+{
+  switch (theType)
+  {
+    case Aspect_POM_Off: return Aspect_Table_PrintPolygonOffsetMode[0];
+    case Aspect_POM_Fill: return Aspect_Table_PrintPolygonOffsetMode[1];
+    case Aspect_POM_Line: return Aspect_Table_PrintPolygonOffsetMode[2];
+    case Aspect_POM_Point: return Aspect_Table_PrintPolygonOffsetMode[3];
+    case Aspect_POM_All: return Aspect_Table_PrintPolygonOffsetMode[4];
+    case Aspect_POM_None: return Aspect_Table_PrintPolygonOffsetMode[5];
+    case Aspect_POM_Mask: return Aspect_Table_PrintPolygonOffsetMode[6];
+  }
+  return "";
+}
+
+//=======================================================================
+//function : PolygonOffsetModeFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::PolygonOffsetModeFromString (Standard_CString theTypeString,
+                                                      Aspect_PolygonOffsetMode& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  if (aName == Aspect_Table_PrintPolygonOffsetMode[0]) { theType = Aspect_POM_Off; return Standard_True; }
+  else if (aName == Aspect_Table_PrintPolygonOffsetMode[1]) { theType = Aspect_POM_Fill; return Standard_True; }
+  else if (aName == Aspect_Table_PrintPolygonOffsetMode[2]) { theType = Aspect_POM_Line; return Standard_True; }
+  else if (aName == Aspect_Table_PrintPolygonOffsetMode[3]) { theType = Aspect_POM_Point; return Standard_True; }
+  else if (aName == Aspect_Table_PrintPolygonOffsetMode[4]) { theType = Aspect_POM_All; return Standard_True; }
+  else if (aName == Aspect_Table_PrintPolygonOffsetMode[5]) { theType = Aspect_POM_None; return Standard_True; }
+  else if (aName == Aspect_Table_PrintPolygonOffsetMode[6]) { theType = Aspect_POM_Mask; return Standard_True; }
+
+  return Standard_False;
+}
+
+//=======================================================================
+//function : HatchStyleToString
+//purpose  :
+//=======================================================================
+Standard_CString Aspect::HatchStyleToString (Aspect_HatchStyle theType)
+{
+  return Aspect_Table_PrintHatchStyle[theType];
+  switch (theType)
+  {
+    case Aspect_HS_SOLID: return Aspect_Table_PrintHatchStyle[0];
+    case Aspect_HS_HORIZONTAL: return Aspect_Table_PrintHatchStyle[1];
+    case Aspect_HS_HORIZONTAL_WIDE: return Aspect_Table_PrintHatchStyle[2];
+    case Aspect_HS_VERTICAL: return Aspect_Table_PrintHatchStyle[3];
+    case Aspect_HS_VERTICAL_WIDE: return Aspect_Table_PrintHatchStyle[4];
+    case Aspect_HS_DIAGONAL_45: return Aspect_Table_PrintHatchStyle[5];
+    case Aspect_HS_DIAGONAL_45_WIDE: return Aspect_Table_PrintHatchStyle[6];
+    case Aspect_HS_DIAGONAL_135: return Aspect_Table_PrintHatchStyle[7];
+    case Aspect_HS_DIAGONAL_135_WIDE: return Aspect_Table_PrintHatchStyle[8];
+    case Aspect_HS_GRID: return Aspect_Table_PrintHatchStyle[9];
+    case Aspect_HS_GRID_WIDE: return Aspect_Table_PrintHatchStyle[10];
+    case Aspect_HS_GRID_DIAGONAL: return Aspect_Table_PrintHatchStyle[11];
+    case Aspect_HS_GRID_DIAGONAL_WIDE: return Aspect_Table_PrintHatchStyle[12];
+    case Aspect_HS_NB: return Aspect_Table_PrintHatchStyle[13];
+  }
+  return "";
+}
+
+//=======================================================================
+//function : HatchStyleFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Aspect::HatchStyleFromString (Standard_CString theTypeString,
+                                               Aspect_HatchStyle& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  if (aName == Aspect_Table_PrintHatchStyle[0]) { theType = Aspect_HS_SOLID; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[1]) { theType = Aspect_HS_HORIZONTAL; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[2]) { theType = Aspect_HS_HORIZONTAL_WIDE; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[3]) { theType = Aspect_HS_VERTICAL; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[4]) { theType = Aspect_HS_VERTICAL_WIDE; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[5]) { theType = Aspect_HS_DIAGONAL_45; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[6]) { theType = Aspect_HS_DIAGONAL_45_WIDE; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[7]) { theType = Aspect_HS_DIAGONAL_135; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[8]) { theType = Aspect_HS_DIAGONAL_135_WIDE; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[9]) { theType = Aspect_HS_GRID; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[10]) { theType = Aspect_HS_GRID_WIDE; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[11]) { theType = Aspect_HS_GRID_DIAGONAL; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[12]) { theType = Aspect_HS_GRID_DIAGONAL_WIDE; return Standard_True; }
+  else if (aName == Aspect_Table_PrintHatchStyle[13]) { theType = Aspect_HS_NB; return Standard_True; }
+  return Standard_False;
+}
+
diff --git a/src/Aspect/Aspect.hxx b/src/Aspect/Aspect.hxx
new file mode 100644 (file)
index 0000000..0157100
--- /dev/null
@@ -0,0 +1,261 @@
+// 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.
+
+#ifndef _Aspect_HeaderFile
+#define _Aspect_HeaderFile
+
+#include <Aspect_HatchStyle.hxx>
+#include <Aspect_InteriorStyle.hxx>
+#include <Aspect_PolygonOffsetMode.hxx>
+#include <Aspect_TypeOfDeflection.hxx>
+#include <Aspect_TypeOfDisplayText.hxx>
+#include <Aspect_TypeOfFacingModel.hxx>
+#include <Aspect_TypeOfHighlightMethod.hxx>
+#include <Aspect_TypeOfLine.hxx>
+#include <Aspect_TypeOfMarker.hxx>
+#include <Aspect_TypeOfStyleText.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_Type.hxx>
+
+//! Provides methods to cast enumerations of package to string value
+class Aspect
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+  
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfDeflectionToString (Aspect_TypeOfDeflection theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_TOFM_BOTH_SIDE if string identifier is invalid
+  static Aspect_TypeOfDeflection TypeOfDeflectionFromString (Standard_CString theTypeString)
+  {
+    Aspect_TypeOfDeflection aType = Aspect_TOD_RELATIVE;
+    TypeOfDeflectionFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfDeflectionFromString (const Standard_CString theTypeString,
+                                                                      Aspect_TypeOfDeflection& theType);
+
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfFacingModelToString (Aspect_TypeOfFacingModel theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_TOFM_BOTH_SIDE if string identifier is invalid
+  static Aspect_TypeOfFacingModel TypeOfFacingModelFromString (Standard_CString theTypeString)
+  {
+    Aspect_TypeOfFacingModel aType = Aspect_TOFM_BOTH_SIDE;
+    TypeOfFacingModelFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfFacingModelFromString (const Standard_CString theTypeString,
+                                                                       Aspect_TypeOfFacingModel& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfHighlightMethodToString (Aspect_TypeOfHighlightMethod theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_TOHM_COLOR if string identifier is invalid
+  static Aspect_TypeOfHighlightMethod TypeOfHighlightMethodFromString (Standard_CString theTypeString)
+  {
+    Aspect_TypeOfHighlightMethod aType = Aspect_TOHM_COLOR;
+    TypeOfHighlightMethodFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfHighlightMethodFromString (const Standard_CString theTypeString,
+                                                                           Aspect_TypeOfHighlightMethod& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfLineToString (Aspect_TypeOfLine theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_TOL_EMPTY if string identifier is invalid
+  static Aspect_TypeOfLine TypeOfLineFromString (Standard_CString theTypeString)
+  {
+    Aspect_TypeOfLine aType = Aspect_TOL_EMPTY;
+    TypeOfLineFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfLineFromString (const Standard_CString theTypeString,
+                                                                Aspect_TypeOfLine& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfMarkerToString (Aspect_TypeOfMarker theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_TOM_EMPTY if string identifier is invalid
+  static Aspect_TypeOfMarker TypeOfMarkerFromString (Standard_CString theTypeString)
+  {
+    Aspect_TypeOfMarker aType = Aspect_TOM_EMPTY;
+    TypeOfMarkerFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfMarkerFromString (const Standard_CString theTypeString,
+                                                                  Aspect_TypeOfMarker& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfDisplayTextToString (Aspect_TypeOfDisplayText theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_TODT_NORMAL if string identifier is invalid
+  static Aspect_TypeOfDisplayText TypeOfDisplayTextFromString (Standard_CString theTypeString)
+  {
+    Aspect_TypeOfDisplayText aType = Aspect_TODT_NORMAL;
+    TypeOfDisplayTextFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfDisplayTextFromString (const Standard_CString theTypeString,
+                                                                       Aspect_TypeOfDisplayText& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfStyleTextToString (Aspect_TypeOfStyleText theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_TODT_NORMAL if string identifier is invalid
+  static Aspect_TypeOfStyleText TypeOfStyleTextFromString (Standard_CString theTypeString)
+  {
+    Aspect_TypeOfStyleText aType = Aspect_TOST_NORMAL;
+    TypeOfStyleTextFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfStyleTextFromString (const Standard_CString theTypeString,
+                                                                     Aspect_TypeOfStyleText& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString InteriorStyleToString (Aspect_InteriorStyle theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_IS_EMPTY if string identifier is invalid
+  static Aspect_InteriorStyle InteriorStyleFromString (Standard_CString theTypeString)
+  {
+    Aspect_InteriorStyle aType = Aspect_IS_EMPTY;
+    InteriorStyleFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean InteriorStyleFromString (const Standard_CString theTypeString,
+                                                                   Aspect_InteriorStyle& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString PolygonOffsetModeToString (Aspect_PolygonOffsetMode theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_POM_Off if string identifier is invalid
+  static Aspect_PolygonOffsetMode PolygonOffsetModeFromString (Standard_CString theTypeString)
+  {
+    Aspect_PolygonOffsetMode aType = Aspect_POM_Off;
+    PolygonOffsetModeFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean PolygonOffsetModeFromString (const Standard_CString theTypeString,
+                                                                       Aspect_PolygonOffsetMode& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString HatchStyleToString (Aspect_HatchStyle theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_POM_Off if string identifier is invalid
+  static Aspect_HatchStyle HatchStyleFromString (Standard_CString theTypeString)
+  {
+    Aspect_HatchStyle aType = Aspect_HS_SOLID;
+    HatchStyleFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean HatchStyleFromString (const Standard_CString theTypeString,
+                                                                Aspect_HatchStyle& theType);
+
+};
+
+#endif // _Aspect_HeaderFile
index c63cdf036f99e5c8d8a5c7bd27b31caf3cab4b4f..76cb7e616722e0ce493d8fdae144d140feefe916 100755 (executable)
@@ -1,3 +1,5 @@
+Aspect.cxx
+Aspect.hxx
 Aspect_AspectFillAreaDefinitionError.hxx
 Aspect_AspectLineDefinitionError.hxx
 Aspect_AspectMarkerDefinitionError.hxx
index 234bb0142c366fa41fe7193cb6c46e09f3bf0c56..6bda2ca7ee4fc33c63a28be9ee4cb84ef1a9e043 100644 (file)
@@ -1,3 +1,5 @@
+Font.cxx
+Font.hxx
 Font_BRepFont.cxx
 Font_BRepFont.hxx
 Font_BRepTextBuilder.cxx
diff --git a/src/Font/Font.cxx b/src/Font/Font.cxx
new file mode 100644 (file)
index 0000000..355447f
--- /dev/null
@@ -0,0 +1,56 @@
+// 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.
+
+#include <Font.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+namespace
+{
+  static Standard_CString Font_Table_PrintFontAspect[5] =
+  {
+    "UNDEFINED", "REGULAR", "BOLD", "ITALIC", "BOLD_ITALIC"
+  };
+
+}
+
+//=======================================================================
+//function : FontAspectToString
+//purpose  :
+//=======================================================================
+Standard_CString Font::FontAspectToString (Font_FontAspect theType)
+{
+  return Font_Table_PrintFontAspect[theType];
+}
+
+//=======================================================================
+//function : FontAspectFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Font::FontAspectFromString (Standard_CString theTypeString,
+                                             Font_FontAspect& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Font_FA_BoldItalic; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Font_Table_PrintFontAspect[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Font_FontAspect (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
diff --git a/src/Font/Font.hxx b/src/Font/Font.hxx
new file mode 100644 (file)
index 0000000..6abf4a2
--- /dev/null
@@ -0,0 +1,54 @@
+// 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.
+
+#ifndef _Font_HeaderFile
+#define _Font_HeaderFile
+
+#include <Font_FontAspect.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_Type.hxx>
+
+//! Provides methods to cast enumerations of package to string value
+class Font
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+  
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString FontAspectToString (Font_FontAspect theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Aspect_TOFM_BOTH_SIDE if string identifier is invalid
+  static Font_FontAspect FontAspectFromString (Standard_CString theTypeString)
+  {
+    Font_FontAspect aType = Font_FA_Undefined;
+    FontAspectFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean FontAspectFromString (const Standard_CString theTypeString,
+                                                                Font_FontAspect& theType);
+
+
+};
+
+#endif // _Font_HeaderFile
index 80df5eea2ec36ecb8eb256464e76a40be327f2da..53cf13d3ebfc3d96b4bb85fbb2c6225c963cd932 100644 (file)
@@ -1,3 +1,5 @@
+GeomAbs.cxx
+GeomAbs.hxx
 GeomAbs_BSplKnotDistribution.hxx
 GeomAbs_CurveForm.hxx
 GeomAbs_CurveType.hxx
diff --git a/src/GeomAbs/GeomAbs.cxx b/src/GeomAbs/GeomAbs.cxx
new file mode 100644 (file)
index 0000000..39d4c4b
--- /dev/null
@@ -0,0 +1,59 @@
+// Created on: 2018-06-10
+// 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 <GeomAbs.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+namespace
+{
+  static Standard_CString GeomAbs_Table_PrintSurfaceTypeEnum[11] =
+  {
+    "Plane", "Cylinder", "Cone", "Sphere", "Torus", "BezierSurface", "BSplineSurface",
+    "SurfaceOfRevolution", "SurfaceOfExtrusion", "OffsetSurface", "OtherSurface"
+  };
+}
+
+//=======================================================================
+//function : SurfaceTypeToString
+//purpose  :
+//=======================================================================
+
+Standard_CString GeomAbs::SurfaceTypeToString (const GeomAbs_SurfaceType theValue)
+{
+  return GeomAbs_Table_PrintSurfaceTypeEnum[theValue];
+}
+
+//=======================================================================
+//function : SurfaceTypeFromString
+//purpose  :
+//=======================================================================
+
+Standard_Boolean GeomAbs::SurfaceTypeFromString (const Standard_CString theString,
+                                                 GeomAbs_SurfaceType& theType)
+{
+  TCollection_AsciiString aName (theString);
+  //aName.UpperCase();
+  for (Standard_Integer aTypeIter = GeomAbs_Plane; aTypeIter <= GeomAbs_OtherSurface; ++aTypeIter)
+  {
+    Standard_CString aTypeName = GeomAbs_Table_PrintSurfaceTypeEnum[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = GeomAbs_SurfaceType (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
diff --git a/src/GeomAbs/GeomAbs.hxx b/src/GeomAbs/GeomAbs.hxx
new file mode 100644 (file)
index 0000000..c46edda
--- /dev/null
@@ -0,0 +1,54 @@
+// Created on: 2018-06-10
+// 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 _GeomAbs_HeaderFile
+#define _GeomAbs_HeaderFile
+
+#include <GeomAbs_SurfaceType.hxx>
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+//! Defines
+//! - tools to work with geomAbs
+class GeomAbs
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+
+  //! Returns the string name for a type.
+  //! @param surface type
+  //! @return string identifier from the enumeration
+  Standard_EXPORT static Standard_CString SurfaceTypeToString (const GeomAbs_SurfaceType theSurfaceType);
+
+  //! Returns the surface type from the given string identifier (using case-insensitive comparison).
+  //! @param theString string identifier
+  //! @return type or GeomAbs_OtherSurface if string identifier is invalid
+  static GeomAbs_SurfaceType SurfaceTypeFromString (const Standard_CString theString)
+  {
+    GeomAbs_SurfaceType aSurfaceType = GeomAbs_OtherSurface;
+    SurfaceTypeFromString (theString, aSurfaceType);
+    return aSurfaceType;
+  }
+
+  //! Determines the surface type from the given string identifier (using case-insensitive comparison).
+  //! @param theString string identifier
+  //! @param theSurfaceType detected surface type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean SurfaceTypeFromString (const Standard_CString theString,
+                                                                 GeomAbs_SurfaceType& theType);
+};
+
+#endif // _GeomAbs_HeaderFile
index 5fed7ee2fbbb65e5087369595ed511a2a1c6b18e..435625c267ccd954e4ca526cf9d0c208bf48cc57 100755 (executable)
@@ -1,3 +1,5 @@
+Graphic3d.cxx
+Graphic3d.hxx
 Graphic3d_AlphaMode.hxx
 Graphic3d_ArrayOfPoints.hxx
 Graphic3d_ArrayOfPolygons.hxx
diff --git a/src/Graphic3d/Graphic3d.cxx b/src/Graphic3d/Graphic3d.cxx
new file mode 100644 (file)
index 0000000..605a517
--- /dev/null
@@ -0,0 +1,318 @@
+// 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.
+
+#include <Graphic3d.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+namespace
+{
+  static Standard_CString Graphic3d_Table_PrintZLayerId[6] =
+  {
+    "INKNOWN", "DEFAULT", "TOP", "TOPMOST", "TOP_OSD", "BOT_OSD"
+  };
+
+  static Standard_CString Graphic3d_Table_PrintHorizontalTextAlignment[3] =
+  {
+    "LEFT", "CENTER", "RIGHT"
+  };
+
+  static Standard_CString Graphic3d_Table_PrintVerticalTextAlignment[4] =
+  {
+    "BOTTOM", "CENTER", "TOP", "TOP_FIRST_LINE"
+  };
+
+  static Standard_CString Graphic3d_Table_PrintTextPath[4] =
+  {
+    "UP", "DOWN", "LEFT", "RIGHT"
+  };
+
+  static Standard_CString Graphic3d_Table_PrintAlphaMode[4] =
+  {
+    "BLEND_AUTO", "OPAQUE", "MASK", "BLEND"
+  };
+
+  static Standard_CString Graphic3d_Table_PrintTypeOfShadingModel[5] =
+  {
+    "DEFAULT", "UNLIT", "FACET", "VERTEX", "FRAGMENT"
+  };
+
+  static Standard_CString Graphic3d_Table_PrintTypeOfAttribute[5] =
+  {
+    "POS", "NORM", "UV", "COLOR", "CUSTOM"
+  };
+
+  static Standard_CString Graphic3d_Table_PrintTypeOfData[7] =
+  {
+    "USHORT", "UINT", "VEC2", "VEC3", "VEC4", "VEC4UB", "FLOAT"
+  };
+}
+
+//=======================================================================
+//function : ZLayerIdToString
+//purpose  :
+//=======================================================================
+Standard_CString Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId theType)
+{
+  switch (theType)
+  {
+    case Graphic3d_ZLayerId_UNKNOWN: return Graphic3d_Table_PrintZLayerId[0]; break;
+    case Graphic3d_ZLayerId_Default: return Graphic3d_Table_PrintZLayerId[1]; break;
+    case Graphic3d_ZLayerId_Top: return Graphic3d_Table_PrintZLayerId[2]; break;
+    case Graphic3d_ZLayerId_Topmost: return Graphic3d_Table_PrintZLayerId[3]; break;
+    case Graphic3d_ZLayerId_TopOSD: return Graphic3d_Table_PrintZLayerId[4]; break;
+    case Graphic3d_ZLayerId_BotOSD: return Graphic3d_Table_PrintZLayerId[5]; break;
+  }
+  return "";
+}
+
+//=======================================================================
+//function : ZLayerIdFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Graphic3d::ZLayerIdFromString (Standard_CString theTypeString,
+                                                Graphic3d_ZLayerId& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= 5; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Graphic3d_Table_PrintZLayerId[aTypeIter];
+    if (aName == aTypeName)
+    {
+      switch (aTypeIter)
+      {
+        case 0: theType = Graphic3d_ZLayerId_UNKNOWN; break;
+        case 1: theType = Graphic3d_ZLayerId_Default; break;
+        case 2: theType = Graphic3d_ZLayerId_Top; break;
+        case 3: theType = Graphic3d_ZLayerId_Topmost; break;
+        case 4: theType = Graphic3d_ZLayerId_TopOSD; break;
+        case 5: theType = Graphic3d_ZLayerId_BotOSD; break;
+      }
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : HorizontalTextAlignmentToString
+//purpose  :
+//=======================================================================
+Standard_CString Graphic3d::HorizontalTextAlignmentToString (Graphic3d_HorizontalTextAlignment theType)
+{
+  return Graphic3d_Table_PrintHorizontalTextAlignment[theType];
+}
+
+//=======================================================================
+//function : HorizontalTextAlignmentFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Graphic3d::HorizontalTextAlignmentFromString (Standard_CString theTypeString,
+                                                               Graphic3d_HorizontalTextAlignment& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Graphic3d_HTA_LEFT; aTypeIter <= Graphic3d_HTA_RIGHT; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Graphic3d_Table_PrintHorizontalTextAlignment[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Graphic3d_HorizontalTextAlignment (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : VerticalTextAlignmentToString
+//purpose  :
+//=======================================================================
+Standard_CString Graphic3d::VerticalTextAlignmentToString (Graphic3d_VerticalTextAlignment theType)
+{
+  return Graphic3d_Table_PrintVerticalTextAlignment[theType];
+}
+
+//=======================================================================
+//function : VerticalTextAlignmentFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Graphic3d::VerticalTextAlignmentFromString (Standard_CString theTypeString,
+                                                             Graphic3d_VerticalTextAlignment& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Graphic3d_VTA_BOTTOM; aTypeIter <= Graphic3d_VTA_TOPFIRSTLINE; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Graphic3d_Table_PrintVerticalTextAlignment[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Graphic3d_VerticalTextAlignment (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TextPathToString
+//purpose  :
+//=======================================================================
+Standard_CString Graphic3d::TextPathToString (Graphic3d_TextPath theType)
+{
+  return Graphic3d_Table_PrintTextPath[theType];
+}
+
+//=======================================================================
+//function : TextPathFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Graphic3d::TextPathFromString (Standard_CString theTypeString,
+                                                Graphic3d_TextPath& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Graphic3d_TP_UP; aTypeIter <= Graphic3d_TP_RIGHT; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Graphic3d_Table_PrintTextPath[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Graphic3d_TextPath (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : AlphaModeToString
+//purpose  :
+//=======================================================================
+Standard_CString Graphic3d::AlphaModeToString (Graphic3d_AlphaMode theType)
+{
+  return Graphic3d_Table_PrintAlphaMode[theType + 1];
+}
+
+//=======================================================================
+//function : AlphaModeFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Graphic3d::AlphaModeFromString (Standard_CString theTypeString,
+                                                 Graphic3d_AlphaMode& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Graphic3d_AlphaMode_BlendAuto; aTypeIter <= Graphic3d_AlphaMode_Blend; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Graphic3d_Table_PrintAlphaMode[aTypeIter + 1];
+    if (aName == aTypeName)
+    {
+      theType = Graphic3d_AlphaMode (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfShadingModelToString
+//purpose  :
+//=======================================================================
+Standard_CString Graphic3d::TypeOfShadingModelToString (Graphic3d_TypeOfShadingModel theType)
+{
+  return Graphic3d_Table_PrintTypeOfShadingModel[theType + 1];
+}
+
+//=======================================================================
+//function : TypeOfShadingModelFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Graphic3d::TypeOfShadingModelFromString (Standard_CString theTypeString,
+                                                 Graphic3d_TypeOfShadingModel& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Graphic3d_TOSM_DEFAULT; aTypeIter <= Graphic3d_TOSM_FRAGMENT; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Graphic3d_Table_PrintTypeOfShadingModel[aTypeIter + 1];
+    if (aName == aTypeName)
+    {
+      theType = Graphic3d_TypeOfShadingModel (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfAttributeToString
+//purpose  :
+//=======================================================================
+Standard_CString Graphic3d::TypeOfAttributeToString (Graphic3d_TypeOfAttribute theType)
+{
+  return Graphic3d_Table_PrintTypeOfAttribute[theType];
+}
+
+//=======================================================================
+//function : TypeOfAttributeFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Graphic3d::TypeOfAttributeFromString (Standard_CString theTypeString,
+                                                 Graphic3d_TypeOfAttribute& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Graphic3d_TOA_POS; aTypeIter <= Graphic3d_TOA_CUSTOM; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Graphic3d_Table_PrintTypeOfAttribute[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Graphic3d_TypeOfAttribute (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+
+
+//=======================================================================
+//function : TypeOfDataToString
+//purpose  :
+//=======================================================================
+Standard_CString Graphic3d::TypeOfDataToString (Graphic3d_TypeOfData theType)
+{
+  return Graphic3d_Table_PrintTypeOfData[theType];
+}
+
+//=======================================================================
+//function : TypeOfDataFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Graphic3d::TypeOfDataFromString (Standard_CString theTypeString,
+                                                 Graphic3d_TypeOfData& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = Graphic3d_TOD_USHORT; aTypeIter <= Graphic3d_TOD_FLOAT; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Graphic3d_Table_PrintTypeOfData[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Graphic3d_TypeOfData (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
diff --git a/src/Graphic3d/Graphic3d.hxx b/src/Graphic3d/Graphic3d.hxx
new file mode 100644 (file)
index 0000000..cf0e59d
--- /dev/null
@@ -0,0 +1,215 @@
+// 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.
+
+#ifndef _Graphic3d_HeaderFile
+#define _Graphic3d_HeaderFile
+
+#include <Graphic3d_AlphaMode.hxx>
+#include <Graphic3d_Buffer.hxx>
+#include <Graphic3d_HorizontalTextAlignment.hxx>
+#include <Graphic3d_VerticalTextAlignment.hxx>
+#include <Graphic3d_TextPath.hxx>
+#include <Graphic3d_TypeOfShadingModel.hxx>
+
+#include <Graphic3d_ZLayerId.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_Type.hxx>
+
+//! Provides methods to cast enumerations of package to string value
+class Graphic3d
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+  
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString ZLayerIdToString (Graphic3d_ZLayerId theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Graphic3d_ZLayerId_UNKNOWN if string identifier is invalid
+  static Graphic3d_ZLayerId ZLayerIdFromString (Standard_CString theTypeString)
+  {
+    Graphic3d_ZLayerId aType = Graphic3d_ZLayerId_UNKNOWN;
+    ZLayerIdFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean ZLayerIdFromString (const Standard_CString theTypeString,
+                                                              Graphic3d_ZLayerId& theType);
+
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString HorizontalTextAlignmentToString (Graphic3d_HorizontalTextAlignment theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Graphic3d_HTA_LEFT if string identifier is invalid
+  static Graphic3d_HorizontalTextAlignment HorizontalTextAlignmentFromString (Standard_CString theTypeString)
+  {
+    Graphic3d_HorizontalTextAlignment aType = Graphic3d_HTA_LEFT;
+    HorizontalTextAlignmentFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean HorizontalTextAlignmentFromString (const Standard_CString theTypeString,
+                                                                             Graphic3d_HorizontalTextAlignment& theType);
+
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString VerticalTextAlignmentToString (Graphic3d_VerticalTextAlignment theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Graphic3d_VTA_BOTTOM if string identifier is invalid
+  static Graphic3d_VerticalTextAlignment VerticalTextAlignmentFromString (Standard_CString theTypeString)
+  {
+    Graphic3d_VerticalTextAlignment aType = Graphic3d_VTA_BOTTOM;
+    VerticalTextAlignmentFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean VerticalTextAlignmentFromString (const Standard_CString theTypeString,
+                                                                           Graphic3d_VerticalTextAlignment& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TextPathToString (Graphic3d_TextPath theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Graphic3d_TP_UP if string identifier is invalid
+  static Graphic3d_TextPath TextPathFromString (Standard_CString theTypeString)
+  {
+    Graphic3d_TextPath aType = Graphic3d_TP_UP;
+    TextPathFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TextPathFromString (const Standard_CString theTypeString,
+                                                              Graphic3d_TextPath& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString AlphaModeToString (Graphic3d_AlphaMode theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Graphic3d_AlphaMode_Opaque if string identifier is invalid
+  static Graphic3d_AlphaMode AlphaModeFromString (Standard_CString theTypeString)
+  {
+    Graphic3d_AlphaMode aType = Graphic3d_AlphaMode_Opaque;
+    AlphaModeFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean AlphaModeFromString (const Standard_CString theTypeString,
+                                                               Graphic3d_AlphaMode& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfShadingModelToString (Graphic3d_TypeOfShadingModel theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Graphic3d_TOSM_DEFAULT if string identifier is invalid
+  static Graphic3d_TypeOfShadingModel TypeOfShadingModelFromString (Standard_CString theTypeString)
+  {
+    Graphic3d_TypeOfShadingModel aType = Graphic3d_TOSM_DEFAULT;
+    TypeOfShadingModelFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfShadingModelFromString (const Standard_CString theTypeString,
+                                                                        Graphic3d_TypeOfShadingModel& theType);
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfAttributeToString (Graphic3d_TypeOfAttribute theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Graphic3d_TOA_POS if string identifier is invalid
+  static Graphic3d_TypeOfAttribute TypeOfAttributeFromString (Standard_CString theTypeString)
+  {
+    Graphic3d_TypeOfAttribute aType = Graphic3d_TOA_POS;
+    TypeOfAttributeFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfAttributeFromString (const Standard_CString theTypeString,
+                                                                     Graphic3d_TypeOfAttribute& theType);
+
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfDataToString (Graphic3d_TypeOfData theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Graphic3d_TOSM_DEFAULT if string identifier is invalid
+  static Graphic3d_TypeOfData TypeOfDataFromString (Standard_CString theTypeString)
+  {
+    Graphic3d_TypeOfData aType = Graphic3d_TOD_USHORT;
+    TypeOfDataFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfDataFromString (const Standard_CString theTypeString,
+                                                                Graphic3d_TypeOfData& theType);
+
+};
+
+#endif // _Graphic3d_HeaderFile
index 8efcbf0cd24029e857b24769344c771414be508d..3ca41527420555b8571b4a606109bac72fa589aa 100644 (file)
@@ -80,6 +80,9 @@ public:
   //! Modifies the color.
   void SetColor (const Quantity_ColorRGBA& theColor) { myColor = theColor; }
 
+  //! Returns the expansion factor.
+  Standard_Real ExpansionFactor() const { return myFactor; }
+
   //! Modifies the expansion factor (height/width ratio)
   //! If the factor is less than 1, the characters will
   //! be higher than they are wide.
index 874864e3b9ed76415f9fac709d07d627d8aba970..d837385f16ae27ddc666fe44a82e36a86e419c9f 100644 (file)
@@ -64,7 +64,8 @@ OpenGl_Group::OpenGl_Group (const Handle(Graphic3d_Structure)& theStruct)
   myAspectText(NULL),
   myFirst(NULL),
   myLast(NULL),
-  myIsRaytracable (Standard_False)
+  myIsRaytracable (Standard_False),
+  myIsDestroyElements (Standard_True)
 {
   Handle(OpenGl_Structure) aStruct = Handle(OpenGl_Structure)::DownCast (myStructure->CStructure());
   if (aStruct.IsNull())
@@ -493,12 +494,15 @@ void OpenGl_Group::Clear (const Standard_Boolean theToUpdateStructureMgr)
 void OpenGl_Group::Release (const Handle(OpenGl_Context)& theGlCtx)
 {
   // Delete elements
-  while (myFirst != NULL)
+  if (myIsDestroyElements)
   {
-    OpenGl_ElementNode* aNext = myFirst->next;
-    OpenGl_Element::Destroy (theGlCtx.operator->(), myFirst->elem);
-    delete myFirst;
-    myFirst = aNext;
+    while (myFirst != NULL)
+    {
+      OpenGl_ElementNode* aNext = myFirst->next;
+      OpenGl_Element::Destroy (theGlCtx.operator->(), myFirst->elem);
+      delete myFirst;
+      myFirst = aNext;
+    }
   }
   myLast = NULL;
 
index ae0e1b3cd59739a20e6aada1ebc1364e4e8d2f54..01b45c4bae2ef02f34b37e0fb9b8466b9141cb70 100644 (file)
@@ -151,6 +151,14 @@ public:
   //! Add stencil test element
   Standard_EXPORT virtual void SetStencilTestOptions (const Standard_Boolean theIsEnabled) Standard_OVERRIDE;
 
+  //! Sets possibility to destroy or not OpenGl_Elements by Release() of the group. The default value is Standard_True
+  //! \param theIsEnabled state whether destroy element or not
+  void SetDestroyElements (const Standard_Boolean& theIsEnabled) { myIsDestroyElements = theIsEnabled; }
+
+  //! Returns flag whether OpenGl_Elements are to be destroyed by Release() of the group.
+  //! \return state whether elements are destroyed or not
+  Standard_Boolean DestroyElements() const { return myIsDestroyElements; }
+
 public:
 
   OpenGl_Structure* GlStruct() const { return (OpenGl_Structure* )(myStructure->CStructure().operator->()); }
@@ -188,6 +196,7 @@ protected:
   OpenGl_ElementNode*    myLast;
 
   Standard_Boolean       myIsRaytracable;
+  Standard_Boolean       myIsDestroyElements;
 
 public:
 
index 54b78691701031fd89e389bf628986ff663d0f45..bb49cb08fa3257b760df45b4fccf1dda38aac760 100644 (file)
 #include <TopoDS_Shape.hxx>
 #include <Graphic3d_ArrayOfSegments.hxx>
 
+namespace
+{
+  static Standard_CString Prs3d_Table_PrintTypeOfHighlight[7] =
+  {
+    "NONE", "SELECTED", "DYNAMIC", "LOCAL_SELECTED", "LOCAL_DYNAMIC", "SUB_INTENSITY", "NB"
+  };
+
+  static Standard_CString Prs3d_Table_PrintTypeOfHLR[3] =
+  {
+    "NOT_SET", "POLY_ALGO", "ALGO"
+  };
+
+  static Standard_CString Prs3d_Table_PrintVertexDrawMode[3] =
+  {
+    "ISOLATED", "ALL", "INHERITED"
+  };
+
+  static Standard_CString Prs3d_Table_PrintDatumParts[11] =
+  {
+    "ORIGIN", "X_AXIS", "Y_AXIS", "Z_AXIS", "X_ARROW", "Y_ARROW", "Z_ARROW",
+    "XOY_AXIS", "YOZ_AXIS", "XOZ_AXIS", "NONE"
+  };
+
+  static Standard_CString Prs3d_Table_PrintDatumAttribute[8] =
+  {
+    "X_AXIS_LENGTH", "Y_AXIS_LENGTH", "Z_AXIS_LENGTH", "SHADING_TUBE_RADIUS_PERCENT",
+    "SHADING_CONE_RADIUS_PERCENT", "SHADING_CONE_LENGTH_PERCENT", "SHADING_ORIGIN_RADIUS_PERCENT",
+    "SHADING_NUMBER_OF_FACETTES"
+  };
+
+  static Standard_CString Prs3d_Table_PrintDatumAxes[7] =
+  {
+    "X_AXIS", "Y_AXIS", "Z_AXIS", "XY_AXIS", "YZ_AXIS", "XZ_AXIS", "XYZ_AXIS"
+  };
+
+  static Standard_CString Prs3d_Table_PrintDimensionArrowOrientation[3] =
+  {
+    "INTERNAL", "EXTERNAL", "FIT"
+  };
+
+  static Standard_CString Prs3d_Table_PrintDimensionTextHorizontalPosition[4] =
+  {
+    "LEFT", "RIGHT", "CENTER", "FIT"
+  };
+
+  static Standard_CString Prs3d_Table_PrintDimensionTextVerticalPosition[3] =
+  {
+    "ABOVE", "BELOW", "CENTER"
+  };
+}
+
 //=======================================================================
 //function : MatchSegment
 //purpose  :
@@ -135,3 +186,273 @@ void Prs3d::AddPrimitivesGroup (const Handle(Prs3d_Presentation)& thePrs,
     aGroup->AddPrimitiveArray (aPrims);
   }
 }
+
+//=======================================================================
+//function : TypeOfHighlightToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::TypeOfHighlightToString (Prs3d_TypeOfHighlight theType)
+{
+  return Prs3d_Table_PrintTypeOfHighlight[theType];
+}
+
+//=======================================================================
+//function : TypeOfHighlightFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::TypeOfHighlightFromString (Standard_CString theTypeString,
+                                                   Prs3d_TypeOfHighlight& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_TypeOfHighlight_NB; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintTypeOfHighlight[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_TypeOfHighlight (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : TypeOfHLRToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::TypeOfHLRToString (Prs3d_TypeOfHLR theType)
+{
+  return Prs3d_Table_PrintTypeOfHLR[theType];
+}
+
+//=======================================================================
+//function : TypeOfHLRFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::TypeOfHLRFromString (Standard_CString theTypeString,
+                                             Prs3d_TypeOfHLR& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_TOH_Algo; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintTypeOfHLR[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_TypeOfHLR (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : VertexDrawModeToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::VertexDrawModeToString (Prs3d_VertexDrawMode theType)
+{
+  return Prs3d_Table_PrintVertexDrawMode[theType];
+}
+
+//=======================================================================
+//function : VertexDrawModeFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::VertexDrawModeFromString (Standard_CString theTypeString,
+                                                  Prs3d_VertexDrawMode& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_VDM_Inherited; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintVertexDrawMode[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_VertexDrawMode (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : DatumPartsToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::DatumPartsToString (Prs3d_DatumParts theType)
+{
+  return Prs3d_Table_PrintDatumParts[theType];
+}
+
+//=======================================================================
+//function : DatumPartsFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::DatumPartsFromString (Standard_CString theTypeString,
+                                              Prs3d_DatumParts& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DP_None; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintDatumParts[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_DatumParts (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : DatumAttributeToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::DatumAttributeToString (Prs3d_DatumAttribute theType)
+{
+  return Prs3d_Table_PrintDatumAttribute[theType];
+}
+
+//=======================================================================
+//function : DatumAttributeFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::DatumAttributeFromString (Standard_CString theTypeString,
+                                                  Prs3d_DatumAttribute& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DP_ShadingNumberOfFacettes; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintDatumAttribute[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_DatumAttribute (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : DatumAxesToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::DatumAxesToString (Prs3d_DatumAxes theType)
+{
+  return Prs3d_Table_PrintDatumAxes[theType];
+}
+
+//=======================================================================
+//function : DatumAxesFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::DatumAxesFromString (Standard_CString theTypeString,
+                                             Prs3d_DatumAxes& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DA_XYZAxis; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintDatumAxes[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_DatumAxes (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : DimensionArrowOrientationToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::DimensionArrowOrientationToString (Prs3d_DimensionArrowOrientation theType)
+{
+  return Prs3d_Table_PrintDimensionArrowOrientation[theType];
+}
+
+//=======================================================================
+//function : DimensionArrowOrientationFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::DimensionArrowOrientationFromString (Standard_CString theTypeString,
+                                                             Prs3d_DimensionArrowOrientation& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DAO_Fit; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintDimensionArrowOrientation[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_DimensionArrowOrientation (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : DimensionTextHorizontalPositionToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::DimensionTextHorizontalPositionToString (Prs3d_DimensionTextHorizontalPosition theType)
+{
+  return Prs3d_Table_PrintDimensionTextHorizontalPosition[theType];
+}
+
+//=======================================================================
+//function : DimensionTextHorizontalPositionFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::DimensionTextHorizontalPositionFromString (Standard_CString theTypeString,
+                                                                   Prs3d_DimensionTextHorizontalPosition& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DTHP_Fit; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintDimensionTextHorizontalPosition[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_DimensionTextHorizontalPosition (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : DimensionTextVerticalPositionToString
+//purpose  :
+//=======================================================================
+Standard_CString Prs3d::DimensionTextVerticalPositionToString (Prs3d_DimensionTextVerticalPosition theType)
+{
+  return Prs3d_Table_PrintDimensionTextVerticalPosition[theType];
+}
+
+//=======================================================================
+//function : DimensionTextVerticalPositionFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Prs3d::DimensionTextVerticalPositionFromString (Standard_CString theTypeString,
+                                                                 Prs3d_DimensionTextVerticalPosition& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Prs3d_DTVP_Center; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Prs3d_Table_PrintDimensionTextVerticalPosition[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Prs3d_DimensionTextVerticalPosition (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
index 0fc819df50446726343dad0b3f1fa890f1bb3479..7e4403fea6c5a3deccfbd42dfb72610ad6f4e5fb 100644 (file)
 #define _Prs3d_HeaderFile
 
 #include <Graphic3d_ArrayOfPrimitives.hxx>
+#include <Prs3d_DatumAttribute.hxx>
+#include <Prs3d_DatumAxes.hxx>
+#include <Prs3d_DatumParts.hxx>
+#include <Prs3d_DimensionArrowOrientation.hxx>
+#include <Prs3d_DimensionTextHorizontalPosition.hxx>
+#include <Prs3d_DimensionTextVerticalPosition.hxx>
+#include <Prs3d_Drawer.hxx>
+#include <Prs3d_NListOfSequenceOfPnt.hxx>
+#include <Prs3d_TypeOfHighlight.hxx>
+#include <Prs3d_TypeOfHLR.hxx>
 #include <Standard.hxx>
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
 #include <Standard_Boolean.hxx>
 #include <Standard_Real.hxx>
-#include <Prs3d_Drawer.hxx>
-#include <Prs3d_NListOfSequenceOfPnt.hxx>
+#include <Prs3d_VertexDrawMode.hxx>
 
 class TopoDS_Shape;
 class Prs3d_Presentation;
@@ -76,6 +85,204 @@ public:
                                                   const Handle(Prs3d_LineAspect)&   theAspect,
                                                   Prs3d_NListOfSequenceOfPnt&       thePolylines);
 
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString TypeOfHighlightToString (Prs3d_TypeOfHighlight theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_TypeOfHighlight_None if string identifier is invalid
+  static Prs3d_TypeOfHighlight TypeOfHighlightFromString (Standard_CString theTypeString)
+  {
+    Prs3d_TypeOfHighlight aType = Prs3d_TypeOfHighlight_None;
+    TypeOfHighlightFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfHighlightFromString (const Standard_CString theTypeString,
+                                                                     Prs3d_TypeOfHighlight& theType);
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString TypeOfHLRToString (Prs3d_TypeOfHLR theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_TOH_NotSet if string identifier is invalid
+  static Prs3d_TypeOfHLR TypeOfHLRFromString (Standard_CString theTypeString)
+  {
+    Prs3d_TypeOfHLR aType = Prs3d_TOH_NotSet;
+    TypeOfHLRFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfHLRFromString (const Standard_CString theTypeString,
+                                                               Prs3d_TypeOfHLR& theType);
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString VertexDrawModeToString (Prs3d_VertexDrawMode theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_VDM_Isolated if string identifier is invalid
+  static Prs3d_VertexDrawMode VertexDrawModeFromString (Standard_CString theTypeString)
+  {
+    Prs3d_VertexDrawMode aType = Prs3d_VDM_Isolated;
+    VertexDrawModeFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean VertexDrawModeFromString (const Standard_CString theTypeString,
+                                                                    Prs3d_VertexDrawMode& theType);
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString DatumPartsToString (Prs3d_DatumParts theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_DP_None if string identifier is invalid
+  static Prs3d_DatumParts DatumPartsFromString (Standard_CString theTypeString)
+  {
+    Prs3d_DatumParts aType = Prs3d_DP_None;
+    DatumPartsFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean DatumPartsFromString (const Standard_CString theTypeString,
+                                                                Prs3d_DatumParts& theType);
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString DatumAttributeToString (Prs3d_DatumAttribute theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_DA_XAxisLength if string identifier is invalid
+  static Prs3d_DatumAttribute DatumAttributeFromString (Standard_CString theTypeString)
+  {
+    Prs3d_DatumAttribute aType = Prs3d_DA_XAxisLength;
+    DatumAttributeFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean DatumAttributeFromString (const Standard_CString theTypeString,
+                                                                    Prs3d_DatumAttribute& theType);
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString DatumAxesToString (Prs3d_DatumAxes theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_DA_XAxis if string identifier is invalid
+  static Prs3d_DatumAxes DatumAxesFromString (Standard_CString theTypeString)
+  {
+    Prs3d_DatumAxes aType = Prs3d_DA_XAxis;
+    DatumAxesFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean DatumAxesFromString (const Standard_CString theTypeString,
+                                                               Prs3d_DatumAxes& theType);
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString DimensionArrowOrientationToString (Prs3d_DimensionArrowOrientation theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_DAO_Internal if string identifier is invalid
+  static Prs3d_DimensionArrowOrientation DimensionArrowOrientationFromString (Standard_CString theTypeString)
+  {
+    Prs3d_DimensionArrowOrientation aType = Prs3d_DAO_Internal;
+    DimensionArrowOrientationFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean DimensionArrowOrientationFromString (const Standard_CString theTypeString,
+                                                                               Prs3d_DimensionArrowOrientation& theType);
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString DimensionTextHorizontalPositionToString (Prs3d_DimensionTextHorizontalPosition theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_DTHP_Left if string identifier is invalid
+  static Prs3d_DimensionTextHorizontalPosition DimensionTextHorizontalPositionFromString (Standard_CString theTypeString)
+  {
+    Prs3d_DimensionTextHorizontalPosition aType = Prs3d_DTHP_Left;
+    DimensionTextHorizontalPositionFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean DimensionTextHorizontalPositionFromString (const Standard_CString theTypeString,
+                                                                                     Prs3d_DimensionTextHorizontalPosition& theType);
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString DimensionTextVerticalPositionToString (Prs3d_DimensionTextVerticalPosition theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or Prs3d_DTVP_Above if string identifier is invalid
+  static Prs3d_DimensionTextVerticalPosition DimensionTextVerticalPositionFromString (Standard_CString theTypeString)
+  {
+    Prs3d_DimensionTextVerticalPosition aType = Prs3d_DTVP_Above;
+    DimensionTextVerticalPositionFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean DimensionTextVerticalPositionFromString (const Standard_CString theTypeString,
+                                                                                   Prs3d_DimensionTextVerticalPosition& theType);
+
 };
 
 #endif // _Prs3d_HeaderFile
index 44922a483d77ed25332199f85d08f13f87af1c50..53f7ef00cf9eab786c166bdf1f2a3ddd986d39d2 100644 (file)
@@ -1,3 +1,5 @@
+PrsMgr.cxx
+PrsMgr.hxx
 PrsMgr_ListOfPresentableObjects.hxx
 PrsMgr_ListOfPresentations.hxx
 PrsMgr_ModedPresentation.cxx
diff --git a/src/PrsMgr/PrsMgr.cxx b/src/PrsMgr/PrsMgr.cxx
new file mode 100644 (file)
index 0000000..ac8436e
--- /dev/null
@@ -0,0 +1,54 @@
+// 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.
+
+#include <PrsMgr.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+namespace
+{
+  static Standard_CString PrsMgr_Table_PrintTypeOfPresentation3d[2] =
+  {
+    "ALL_VIEW", "PROJECTOR_DEPENDANT"
+  };
+}
+
+//=======================================================================
+//function : TypeOfPresentation3dToString
+//purpose  :
+//=======================================================================
+Standard_CString PrsMgr::TypeOfPresentation3dToString (PrsMgr_TypeOfPresentation3d theType)
+{
+  return PrsMgr_Table_PrintTypeOfPresentation3d[theType];
+}
+
+//=======================================================================
+//function : TypeOfPresentation3dFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean PrsMgr::TypeOfPresentation3dFromString (Standard_CString theTypeString,
+                                                   PrsMgr_TypeOfPresentation3d& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= PrsMgr_TOP_ProjectorDependant; ++aTypeIter)
+  {
+    Standard_CString aTypeName = PrsMgr_Table_PrintTypeOfPresentation3d[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = PrsMgr_TypeOfPresentation3d (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
diff --git a/src/PrsMgr/PrsMgr.hxx b/src/PrsMgr/PrsMgr.hxx
new file mode 100644 (file)
index 0000000..4adcbb2
--- /dev/null
@@ -0,0 +1,53 @@
+// 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.
+
+#ifndef _PrsMgr_HeaderFile
+#define _PrsMgr_HeaderFile
+
+#include <PrsMgr_TypeOfPresentation3d.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_Type.hxx>
+
+//! Provides methods to cast enumerations of package to string value
+class PrsMgr 
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+  
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString TypeOfPresentation3dToString (PrsMgr_TypeOfPresentation3d theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or PrsMgr_TOP_AllView if string identifier is invalid
+  static PrsMgr_TypeOfPresentation3d TypeOfPresentation3dFromString (Standard_CString theTypeString)
+  {
+    PrsMgr_TypeOfPresentation3d aType = PrsMgr_TOP_AllView;
+    TypeOfPresentation3dFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean TypeOfPresentation3dFromString (const Standard_CString theTypeString,
+                                                                       PrsMgr_TypeOfPresentation3d& theType);
+
+};
+
+#endif // _PrsMgr_HeaderFile
index 121a03b3acecb0f0d3ce4677971d899476e0d5b7..de7dce5e1d75451bace980add69922c7fabdedde 100755 (executable)
@@ -1,3 +1,5 @@
+Quantity.cxx
+Quantity.hxx
 Quantity_AbsorbedDose.hxx
 Quantity_Acceleration.hxx
 Quantity_AcousticIntensity.hxx
diff --git a/src/Quantity/Quantity.cxx b/src/Quantity/Quantity.cxx
new file mode 100644 (file)
index 0000000..d800fed
--- /dev/null
@@ -0,0 +1,191 @@
+// 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.
+
+#include <Quantity.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+namespace
+{
+  static Standard_CString Quantity_Table_PrintNameOfColor[517] =
+  {
+    "BLACK", "MATRABLUE", "MATRAGRAY", "ALICEBLUE",
+    "ANTIQUEWHITE", "ANTIQUEWHITE1", "ANTIQUEWHITE2", "ANTIQUEWHITE3", "ANTIQUEWHITE4",
+    "AQUAMARINE1", "AQUAMARINE2", "AQUAMARINE4",
+    "AZURE", "AZURE2", "AZURE3", "AZURE4",
+    "BEIGE",
+    "BISQUE", "BISQUE2", "BISQUE3", "BISQUE4",
+    "BLANCHEDALMOND",
+    "BLUE1", "BLUE2", "BLUE3", "BLUE4",
+    "BLUEVIOLET",
+    "BROWN", "BROWN1", "BROWN2", "BROWN3", "BROWN4",
+    "BURLYWOOD", "BURLYWOOD1", "BURLYWOOD2", "BURLYWOOD3", "BURLYWOOD4",
+    "CADETBLUE", "CADETBLUE1", "CADETBLUE2", "CADETBLUE3", "CADETBLUE4",
+    "CHARTREUSE", "CHARTREUSE1", "CHARTREUSE2", "CHARTREUSE3", "CHARTREUSE4",
+    "CHOCOLATE", "CHOCOLATE1", "CHOCOLATE2", "CHOCOLATE3", "CHOCOLATE4",
+    "CORAL", "CORAL1", "CORAL2", "CORAL3", "CORAL4",
+    "CORNFLOWERBLUE",
+    "CORNSILK1", "CORNSILK2", "CORNSILK3", "CORNSILK4",
+    "CYAN1", "CYAN2", "CYAN3", "CYAN4",
+    "DARKGOLDENROD", "DARKGOLDENROD1", "DARKGOLDENROD2", "DARKGOLDENROD3", "DARKGOLDENROD4",
+    "DARKGREEN",
+    "DARKKHAKI",
+    "DARKOLIVEGREEN", "DARKOLIVEGREEN1", "DARKOLIVEGREEN2", "DARKOLIVEGREEN3", "DARKOLIVEGREEN4",
+    "DARKORANGE", "DARKORANGE1", "DARKORANGE2", "DARKORANGE3", "DARKORANGE4",
+    "DARKORCHID", "DARKORCHID1", "DARKORCHID2", "DARKORCHID3", "DARKORCHID4",
+    "DARKSALMON",
+    "DARKSEAGREEN", "DARKSEAGREEN1", "DARKSEAGREEN2", "DARKSEAGREEN3", "DARKSEAGREEN4",
+    "DARKSLATEBLUE",
+    "DARKSLATEGRAY1", "DARKSLATEGRAY2", "DARKSLATEGRAY3", "DARKSLATEGRAY4", "DARKSLATEGRAY",
+    "DARKTURQUOISE",
+    "DARKVIOLET",
+    "DEEPPINK", "DEEPPINK2", "DEEPPINK3", "DEEPPINK4",
+    "DEEPSKYBLUE1", "DEEPSKYBLUE2", "DEEPSKYBLUE3", "DEEPSKYBLUE4",
+    "DODGERBLUE1", "DODGERBLUE2", "DODGERBLUE3", "DODGERBLUE4",
+    "FIREBRICK", "FIREBRICK1", "FIREBRICK2", "FIREBRICK3", "FIREBRICK4",
+    "FLORALWHITE",
+    "FORESTGREEN",
+    "GAINSBORO",
+    "GHOSTWHITE",
+    "GOLD", "GOLD1", "GOLD2", "GOLD3", "GOLD4",
+    "GOLDENROD", "GOLDENROD1", "GOLDENROD2", "GOLDENROD3", "GOLDENROD4",
+    "GRAY", "GRAY0", "GRAY1", "GRAY10", "GRAY11", "GRAY12", "GRAY13", "GRAY14", "GRAY15", "GRAY16",
+    "GRAY17", "GRAY18", "GRAY19", "GRAY2", "GRAY20", "GRAY21", "GRAY22", "GRAY23", "GRAY24", "GRAY25",
+    "GRAY26", "GRAY27", "GRAY28", "GRAY29", "GRAY3", "GRAY30", "GRAY31", "GRAY32", "GRAY33", "GRAY34",
+    "GRAY35", "GRAY36", "GRAY37", "GRAY38", "GRAY39", "GRAY4", "GRAY40", "GRAY41", "GRAY42", "GRAY43",
+    "GRAY44", "GRAY45", "GRAY46", "GRAY47", "GRAY48", "GRAY49", "GRAY5", "GRAY50", "GRAY51", "GRAY52",
+    "GRAY53", "GRAY54", "GRAY55", "GRAY56", "GRAY57", "GRAY58", "GRAY59", "GRAY6", "GRAY60", "GRAY61",
+    "GRAY62", "GRAY63", "GRAY64", "GRAY65", "GRAY66", "GRAY67", "GRAY68", "GRAY69", "GRAY7", "GRAY70",
+    "GRAY71", "GRAY72", "GRAY73", "GRAY74", "GRAY75", "GRAY76", "GRAY77", "GRAY78", "GRAY79", "GRAY8",
+    "GRAY80", "GRAY81", "GRAY82", "GRAY83", "GRAY85", "GRAY86", "GRAY87", "GRAY88", "GRAY89", "GRAY9",
+    "GRAY90", "GRAY91", "GRAY92", "GRAY93", "GRAY94", "GRAY95",
+    "GREEN", "GREEN1", "GREEN2", "GREEN3", "GREEN4",
+    "GREENYELLOW",
+    "GRAY97", "GRAY98", "GRAY99",
+    "HONEYDEW", "HONEYDEW2", "HONEYDEW3", "HONEYDEW4",
+    "HOTPINK", "HOTPINK1", "HOTPINK2", "HOTPINK3", "HOTPINK4",
+    "INDIANRED", "INDIANRED1", "INDIANRED2", "INDIANRED3", "INDIANRED4",
+    "IVORY", "IVORY2", "IVORY3", "IVORY4",
+    "KHAKI", "KHAKI1", "KHAKI2", "KHAKI3", "KHAKI4",
+    "LAVENDER", "LAVENDERBLUSH1", "LAVENDERBLUSH2", "LAVENDERBLUSH3", "LAVENDERBLUSH4",
+    "LAWNGREEN", "LEMONCHIFFON1", "LEMONCHIFFON2", "LEMONCHIFFON3", "LEMONCHIFFON4",
+    "LIGHTBLUE", "LIGHTBLUE1", "LIGHTBLUE2", "LIGHTBLUE3", "LIGHTBLUE4",
+    "LIGHTCORAL",
+    "LIGHTCYAN1", "LIGHTCYAN2", "LIGHTCYAN3", "LIGHTCYAN4",
+    "LIGHTGOLDENROD", "LIGHTGOLDENROD1", "LIGHTGOLDENROD2", "LIGHTGOLDENROD3", "LIGHTGOLDENROD4",
+    "LIGHTGOLDENRODYELLOW",
+    "LIGHTGRAY"
+    "LIGHTPINK", "LIGHTPINK1", "LIGHTPINK2", "LIGHTPINK3", "LIGHTPINK4",
+    "LIGHTSALMON1", "LIGHTSALMON2", "LIGHTSALMON3", "LIGHTSALMON4",
+    "LIGHTSEAGREEN",
+    "LIGHTSKYBLUE", "LIGHTSKYBLUE1", "LIGHTSKYBLUE2", "LIGHTSKYBLUE3", "LIGHTSKYBLUE4",
+    "LIGHTSLATEBLUE",
+    "LIGHTSLATEGRAY",
+    "LIGHTSTEELBLUE", "LIGHTSTEELBLUE1", "LIGHTSTEELBLUE2", "LIGHTSTEELBLUE3", "LIGHTSTEELBLUE4",
+    "LIGHTYELLOW", "LIGHTYELLOW2", "LIGHTYELLOW3", "LIGHTYELLOW4",
+    "LIMEGREEN",
+    "LINEN",
+    "MAGENTA1", "MAGENTA2", "MAGENTA3", "MAGENTA4",
+    "MAROON", "MAROON1", "MAROON2", "MAROON3", "MAROON4",
+    "MEDIUMAQUAMARINE",
+    "MEDIUMORCHID", "MEDIUMORCHID1", "MEDIUMORCHID2", "MEDIUMORCHID3", "MEDIUMORCHID4",
+    "MEDIUMPURPLE", "MEDIUMPURPLE1", "MEDIUMPURPLE2", "MEDIUMPURPLE3", "MEDIUMPURPLE4",
+    "MEDIUMSEAGREEN",
+    "MEDIUMSLATEBLUE",
+    "MEDIUMSPRINGGREEN",
+    "MEDIUMTURQUOISE",
+    "MEDIUMVIOLETRED",
+    "MIDNIGHTBLUE",
+    "MINTCREAM",
+    "MISTYROSE", "MISTYROSE2", "MISTYROSE3", "MISTYROSE4",
+    "MOCCASIN",
+    "NAVAJOWHITE1", "NAVAJOWHITE2", "NAVAJOWHITE3", "NAVAJOWHITE4",
+    "NAVYBLUE",
+    "OLDLACE",
+    "OLIVEDRAB", "OLIVEDRAB1", "OLIVEDRAB2", "OLIVEDRAB3", "OLIVEDRAB4",
+    "ORANGE", "ORANGE1", "ORANGE2", "ORANGE3", "ORANGE4",
+    "ORANGERED", "ORANGERED1", "ORANGERED2", "ORANGERED3", "ORANGERED4",
+    "ORCHID", "ORCHID1", "ORCHID2", "ORCHID3", "ORCHID4",
+    "PALEGOLDENROD",
+    "PALEGREEN", "PALEGREEN1", "PALEGREEN2", "PALEGREEN3", "PALEGREEN4",
+    "PALETURQUOISE", "PALETURQUOISE1", "PALETURQUOISE2", "PALETURQUOISE3", "PALETURQUOISE4",
+    "PALEVIOLETRED", "PALEVIOLETRED1", "PALEVIOLETRED2", "PALEVIOLETRED3", "PALEVIOLETRED4",
+    "PAPAYAWHIP",
+    "PEACHPUFF", "PEACHPUFF2", "PEACHPUFF3", "PEACHPUFF4",
+    "PERU",
+    "PINK", "PINK1", "PINK2", "PINK3", "PINK4",
+    "PLUM", "PLUM1", "PLUM2", "PLUM3", "PLUM4",
+    "POWDERBLUE",
+    "PURPLE", "PURPLE1", "PURPLE2", "PURPLE3", "PURPLE4",
+    "RED", "RED1", "RED2", "RED3", "RED4",
+    "ROSYBROWN", "ROSYBROWN1", "ROSYBROWN2", "ROSYBROWN3", "ROSYBROWN4",
+    "ROYALBLUE", "ROYALBLUE1", "ROYALBLUE2", "ROYALBLUE3", "ROYALBLUE4",
+    "SADDLEBROWN",
+    "SALMON", "SALMON1", "SALMON2", "SALMON3", "SALMON4",
+    "SANDYBROWN",
+    "SEAGREEN", "SEAGREEN1", "SEAGREEN2", "SEAGREEN3", "SEAGREEN4",
+    "SEASHELL", "SEASHELL2", "SEASHELL3", "SEASHELL4",
+    "BEET",
+    "TEAL",
+    "SIENNA", "SIENNA1", "SIENNA2", "SIENNA3", "SIENNA4",
+    "SKYBLUE", "SKYBLUE1", "SKYBLUE2", "SKYBLUE3", "SKYBLUE4",
+    "SLATEBLUE", "SLATEBLUE1", "SLATEBLUE2", "SLATEBLUE3", "SLATEBLUE4",
+    "SLATEGRAY1", "SLATEGRAY2", "SLATEGRAY3", "SLATEGRAY4", "SLATEGRAY",
+    "SNOW", "SNOW2", "SNOW3", "SNOW4",
+    "SPRINGGREEN", "SPRINGGREEN2", "SPRINGGREEN3", "SPRINGGREEN4",
+    "STEELBLUE", "STEELBLUE1", "STEELBLUE2", "STEELBLUE3", "STEELBLUE4",
+    "TAN", "TAN1", "TAN2", "TAN3", "TAN4",
+    "THISTLE", "THISTLE1", "THISTLE2", "THISTLE3", "THISTLE4",
+    "TOMATO", "TOMATO1", "TOMATO2", "TOMATO3", "TOMATO4",
+    "TURQUOISE", "TURQUOISE1", "TURQUOISE2", "TURQUOISE3", "TURQUOISE4",
+    "VIOLET",
+    "VIOLETRED", "VIOLETRED1", "VIOLETRED2", "VIOLETRED3", "VIOLETRED4",
+    "WHEAT", "WHEAT1", "WHEAT2", "WHEAT3", "WHEAT4",
+    "WHITESMOKE",
+    "YELLOW", "YELLOW1", "YELLOW2", "YELLOW3", "YELLOW4",
+    "YELLOWGREEN",
+    "WHITE"
+  };
+
+}
+
+//=======================================================================
+//function : NameOfColorToString
+//purpose  :
+//=======================================================================
+Standard_CString Quantity::NameOfColorToString (Quantity_NameOfColor theType)
+{
+  return Quantity_Table_PrintNameOfColor[theType];
+}
+
+//=======================================================================
+//function : NameOfColorFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean Quantity::NameOfColorFromString (Standard_CString theTypeString,
+                                                  Quantity_NameOfColor& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= Quantity_NOC_WHITE; ++aTypeIter)
+  {
+    Standard_CString aTypeName = Quantity_Table_PrintNameOfColor[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = Quantity_NameOfColor (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
diff --git a/src/Quantity/Quantity.hxx b/src/Quantity/Quantity.hxx
new file mode 100644 (file)
index 0000000..d254c09
--- /dev/null
@@ -0,0 +1,53 @@
+// 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.
+
+#ifndef _Quantity_HeaderFile
+#define _Quantity_HeaderFile
+
+#include <Quantity_NameOfColor.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_Type.hxx>
+
+//! Provides methods to cast enumerations of package to string value
+class Quantity
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+  
+  //! Returns the string name for a given type.
+  //! @param theType an enumeration type
+  //! @return string identifier from the enumeration list
+  Standard_EXPORT static Standard_CString NameOfColorToString (Quantity_NameOfColor theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return enumeration type or Quantity_NOC_BLACK if string identifier is invalid
+  static Quantity_NameOfColor NameOfColorFromString (Standard_CString theTypeString)
+  {
+    Quantity_NameOfColor aType = Quantity_NOC_BLACK;
+    NameOfColorFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean NameOfColorFromString (const Standard_CString theTypeString,
+                                                                 Quantity_NameOfColor& theType);
+
+};
+
+#endif // _Quantity_HeaderFile
index 3c056ff8ebf889c653cfd42a668d8808c99a2336..c6c478adf4a0b7b04d4917733c6cc2c8885a7205 100644 (file)
@@ -14,6 +14,7 @@
 // commercial license or contractual agreement.
 
 #include <Quantity_Color.hxx>
+#include <Quantity.hxx>
 
 #include <Quantity_ColorDefinitionError.hxx>
 #include <Standard_ErrorHandler.hxx>
@@ -47,6 +48,8 @@ static Standard_Real TheEpsilon = 0.0001;
 Standard_Boolean Quantity_Color::ColorFromName (const Standard_CString theName,
                                                 Quantity_NameOfColor&  theColor)
 {
+  return Quantity::NameOfColorFromString (theName, theColor);
+  /*
   TCollection_AsciiString aName (theName);
   aName.UpperCase();
   if (aName.Search("QUANTITY_NOC_") == 1)
@@ -63,7 +66,7 @@ Standard_Boolean Quantity_Color::ColorFromName (const Standard_CString theName,
       return Standard_True;
     }
   }
-  return Standard_False;
+  return Standard_False;*/
 }
 
 Quantity_Color::Quantity_Color () {
@@ -2040,6 +2043,8 @@ switch (AName) {
 Standard_CString Quantity_Color::StringName (
                                  const Quantity_NameOfColor AName) {
 
+  return Quantity::NameOfColorToString (AName);
+/*
 Standard_CString TheName;
  
 switch (AName) {
@@ -3600,7 +3605,7 @@ switch (AName) {
                throw Standard_OutOfRange("Bad name");
        break;
 }
-return (TheName);
+return (TheName);*/
 }
 
 //\f
index 767862f74d43a69b0cf088699c7a4ea84b68be0a..4049bf73b8cec2b2c26c54ea914e540f027950ea 100755 (executable)
@@ -1,3 +1,5 @@
+SelectMgr.cxx
+SelectMgr.hxx
 SelectMgr_AndFilter.cxx
 SelectMgr_AndFilter.hxx
 SelectMgr_BaseFrustum.cxx
diff --git a/src/SelectMgr/SelectMgr.cxx b/src/SelectMgr/SelectMgr.cxx
new file mode 100644 (file)
index 0000000..4e5c63b
--- /dev/null
@@ -0,0 +1,54 @@
+// 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.
+
+#include <SelectMgr.hxx>
+
+#include <TCollection_AsciiString.hxx>
+
+namespace
+{
+  static Standard_CString SelectMgr_Table_PrintPickingStrategy[2] =
+  {
+    "FIRST_ACCEPTABLE", "ONLY_TOPMOST"
+  };
+}
+
+//=======================================================================
+//function : TypeOfOrientationToString
+//purpose  :
+//=======================================================================
+Standard_CString SelectMgr::PickingStrategyToString (SelectMgr_PickingStrategy theType)
+{
+  return SelectMgr_Table_PrintPickingStrategy[theType];
+}
+
+//=======================================================================
+//function : PickingStrategyFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean SelectMgr::PickingStrategyFromString (Standard_CString theTypeString,
+                                                       SelectMgr_PickingStrategy& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  aName.UpperCase();
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= SelectMgr_PickingStrategy_OnlyTopmost; ++aTypeIter)
+  {
+    Standard_CString aTypeName = SelectMgr_Table_PrintPickingStrategy[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = SelectMgr_PickingStrategy (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
diff --git a/src/SelectMgr/SelectMgr.hxx b/src/SelectMgr/SelectMgr.hxx
new file mode 100644 (file)
index 0000000..9b96b59
--- /dev/null
@@ -0,0 +1,57 @@
+// 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.
+
+#ifndef _SelectMgr_HeaderFile
+#define _SelectMgr_HeaderFile
+
+#include <SelectMgr_PickingStrategy.hxx>
+#include <SelectMgr_StateOfSelection.hxx>
+#include <SelectMgr_TypeOfBVHUpdate.hxx>
+#include <SelectMgr_TypeOfUpdate.hxx>
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+#include <Standard_TypeDef.hxx>
+
+//! This package contains the set of commands and services of the SelectMgr
+class SelectMgr
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+
+  //! Returns the string name for a given orientation type.
+  //! @param theType orientation type
+  //! @return string identifier from the list Xpos, Ypos, Zpos and others
+  Standard_EXPORT static Standard_CString PickingStrategyToString (SelectMgr_PickingStrategy theType);
+
+  //! Returns the orientation type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return orientation type or V3d_TypeOfOrientation if string identifier is invalid
+  static SelectMgr_PickingStrategy PickingStrategyFromString (Standard_CString theTypeString)
+  {
+    SelectMgr_PickingStrategy aType = SelectMgr_PickingStrategy_FirstAcceptable;
+    PickingStrategyFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the shape type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected shape type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean PickingStrategyFromString (const Standard_CString theTypeString,
+                                                                     SelectMgr_PickingStrategy& theType);
+
+};
+
+#endif // _SelectMgr_HeaderFile
index 99fc0254948b97f7384dfa79bc6393d0099f401d..de376fe96414423f3fa343f94ca1e148a97a3afd 100644 (file)
@@ -1,5 +1,7 @@
 project(TKTreeModel)
 
+add_definitions("-D__ViewControl_DLL")
+
 OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)
 OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit)
 OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_tool)
index 893b52c7088cbb8bccc069b59b185f9c86d5d38e..100866c7f355eaeb7b7e72237694eec566386d88 100644 (file)
@@ -1 +1,3 @@
+TKernel
+TKMath
 CSF_QT
\ No newline at end of file
index 5ea9ca1e4f0e9bc40b0af21825244d39f4216c92..dd57708c91a6ec8299647caf19d6283eb5219654 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; }
index 72acad8d01514a9419014454165921cb94519df9..c85e942769c6653f51140f3f5247259e2ff5428d 100644 (file)
@@ -207,21 +207,32 @@ void TreeModel_ModelBase::EmitDataChanged (const QModelIndex& theTopLeft, const
 }
 
 // =======================================================================
-// function : SingleSelected
+// function : GetSelected
 // purpose :
 // =======================================================================
-QModelIndex TreeModel_ModelBase::SingleSelected (const QModelIndexList& theIndices, const int theCellId,
-                                                 const Qt::Orientation theOrientation)
+QModelIndexList TreeModel_ModelBase::GetSelected (const QModelIndexList& theIndices, const int theCellId,
+                                                  const Qt::Orientation theOrientation)
 {
-  QModelIndexList aFirstColumnSelectedIndices;
+  QModelIndexList aSelected;
   for (QModelIndexList::const_iterator anIndicesIt = theIndices.begin(); anIndicesIt != theIndices.end(); anIndicesIt++)
   {
     QModelIndex anIndex = *anIndicesIt;
     if ((theOrientation == Qt::Horizontal && anIndex.column() == theCellId) ||
         (theOrientation == Qt::Vertical && anIndex.row() == theCellId))
-      aFirstColumnSelectedIndices.append (anIndex);
+      aSelected.append (anIndex);
   }
-  return aFirstColumnSelectedIndices.size() == 1 ? aFirstColumnSelectedIndices.first() : QModelIndex();
+  return aSelected;
+}
+
+// =======================================================================
+// function : SingleSelected
+// purpose :
+// =======================================================================
+QModelIndex TreeModel_ModelBase::SingleSelected (const QModelIndexList& theIndices, const int theCellId,
+                                                 const Qt::Orientation theOrientation)
+{
+  QModelIndexList aSelected = GetSelected (theIndices, theCellId, theOrientation);
+  return aSelected.size() == 1 ? aSelected.first() : QModelIndex();
 }
 
 // =======================================================================
index d304c164e5ca3c4b2a9feecb3776cab402f902de..a86b683ef72c96d547271c1fb913869645d3a60a 100644 (file)
@@ -146,6 +146,14 @@ public:
   //! \return integer value
   static int ColumnVisibilityWidth() { return 20; }
 
+  //! Returns selected items in the cell of given orientation.
+  //! \param theIndices a container of selected indices
+  //! \param theCellId column index if orientation is horizontal, row index otherwise
+  //! \param theOrientation an orientation to apply the cell index
+  //! \return model indices from the list
+  Standard_EXPORT static QModelIndexList GetSelected (const QModelIndexList& theIndices, const int theCellId,
+                                                      const Qt::Orientation theOrientation = Qt::Horizontal);
+
   //! Returns single selected item in the cell of given orientation. If the orientation is Horizontal,
   //! in the cell id colum, one row should be selected.
   //! \param theIndices a container of selected indices
index 68312f8eb143ca930b00824146a1ad1bec7b490a..0996ea34052584ff432e547b3cf99815915df019 100644 (file)
@@ -4,14 +4,19 @@ VInspector_CallBack.hxx
 VInspector_CallBackMode.hxx
 VInspector_Communicator.cxx
 VInspector_Communicator.hxx
+VInspector_DisplayActionType.hxx
 VInspector_ItemBase.cxx
 VInspector_ItemBase.hxx
 VInspector_ItemContext.cxx
 VInspector_ItemContext.hxx
 VInspector_ItemFolderObject.cxx
 VInspector_ItemFolderObject.hxx
-VInspector_ItemEntityOwner.cxx
-VInspector_ItemEntityOwner.hxx
+VInspector_ItemGraphic3dClipPlane.cxx
+VInspector_ItemGraphic3dClipPlane.hxx
+VInspector_ItemGraphic3dCStructure.cxx
+VInspector_ItemGraphic3dCStructure.hxx
+VInspector_ItemGraphic3dGroup.cxx
+VInspector_ItemGraphic3dGroup.hxx
 VInspector_ItemHistoryElement.cxx
 VInspector_ItemHistoryElement.hxx
 VInspector_ItemHistoryRoot.cxx
@@ -19,15 +24,37 @@ VInspector_ItemHistoryRoot.hxx
 VInspector_ItemHistoryType.cxx
 VInspector_ItemHistoryType.hxx
 VInspector_ItemHistoryTypeInfo.hxx
+VInspector_ItemOpenGlElement.cxx
+VInspector_ItemOpenGlElement.hxx
 VInspector_ItemPresentableObject.cxx
 VInspector_ItemPresentableObject.hxx
-VInspector_ItemSelection.cxx
-VInspector_ItemSelection.hxx
+VInspector_ItemPresentations.cxx
+VInspector_ItemPresentations.hxx
+VInspector_ItemPrs3dAspect.cxx
+VInspector_ItemPrs3dAspect.hxx
+VInspector_ItemPrs3dDrawer.cxx
+VInspector_ItemPrs3dDrawer.hxx
+VInspector_ItemPrs3dPresentation.cxx
+VInspector_ItemPrs3dPresentation.hxx
+VInspector_ItemSelectBasicsEntityOwner.cxx
+VInspector_ItemSelectBasicsEntityOwner.hxx
+VInspector_ItemSelectBasicsSensitiveEntity.cxx
+VInspector_ItemSelectBasicsSensitiveEntity.hxx
 VInspector_ItemSelectMgrFilter.cxx
 VInspector_ItemSelectMgrFilter.hxx
-VInspector_ItemSensitiveEntity.cxx
-VInspector_ItemSensitiveEntity.hxx
+VInspector_ItemSelectMgrSelection.cxx
+VInspector_ItemSelectMgrSelection.hxx
+VInspector_ItemSelectMgrSensitiveEntity.cxx
+VInspector_ItemSelectMgrSensitiveEntity.hxx
+VInspector_ItemV3dView.cxx
+VInspector_ItemV3dView.hxx
+VInspector_ItemV3dViewer.cxx
+VInspector_ItemV3dViewer.hxx
+VInspector_PrsOpenGlElement.cxx
+VInspector_PrsOpenGlElement.hxx
 VInspector_SelectionType.hxx
+VInspector_TableModelValues.cxx
+VInspector_TableModelValues.hxx
 VInspector_ToolActionType.hxx
 VInspector_ToolBar.cxx
 VInspector_ToolBar.hxx
diff --git a/tools/VInspector/VInspector_DisplayActionType.hxx b/tools/VInspector/VInspector_DisplayActionType.hxx
new file mode 100644 (file)
index 0000000..0e39185
--- /dev/null
@@ -0,0 +1,29 @@
+// Created on: 2018-08-19
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef VInspector_DisplayActionType_H
+#define VInspector_DisplayActionType_H
+
+//! \enum VInspector_DisplayActionType
+enum VInspector_DisplayActionType
+{
+  VInspector_DisplayActionType_NoneId, //!< No action activated
+  VInspector_DisplayActionType_DisplayId, //!< Display action
+  VInspector_DisplayActionType_RedisplayId, //!< Redisplay action
+  VInspector_DisplayActionType_EraseId, //!< Erase action
+  VInspector_DisplayActionType_RemoveId //!< Remove action
+};
+
+#endif
index 8f1cee216ebf2a40401c4e23410f239d44446adf..7ee4d9beee255d927fdcd4184e6402a4d7044b90 100644 (file)
 #include <inspector/VInspector_ItemBase.hxx>
 #include <inspector/VInspector_ItemContext.hxx>
 
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemBase::Reset()
+{
+  myPresentationShape = TopoDS_Shape();
+  TreeModel_ItemBase::Reset();
+}
+
 // =======================================================================
 // function : GetContext
 // purpose :
index c0c268d395f54e7b96d3e8a52e91dac29ea53534..b4096233a3f8ea513a135003b11cfe598e2b1965 100644 (file)
 
 #include <AIS_InteractiveContext.hxx>
 #include <Standard.hxx>
+#include <TopoDS_Shape.hxx>
+
 #include <inspector/TreeModel_ItemBase.hxx>
+#include <inspector/ViewControl_EditType.hxx>
 
 class VInspector_ItemBase;
 typedef QExplicitlySharedDataPointer<VInspector_ItemBase> VInspector_ItemBasePtr;
@@ -29,7 +32,7 @@ class VInspector_ItemBase : public TreeModel_ItemBase
 {
 public:
   //! Resets cached values
-  virtual void Reset() Standard_OVERRIDE { TreeModel_ItemBase::Reset(); }
+  virtual void Reset() Standard_OVERRIDE;
 
   //! Sets the context 
   //! \param theLabel an object where the child items structure is found
@@ -43,6 +46,46 @@ public:
   //! \return a context
   Standard_EXPORT Handle(AIS_InteractiveContext) GetContext() const;
 
+  //! Returns presentation of the attribute to be visualized in the view
+  //! \thePresentations [out] container of presentation handles to be visualized
+  virtual void GetPresentations (NCollection_List<Handle(Standard_Transient)>& thePresentations)
+  { (void)thePresentations; }
+
+  //! Returns shape of the item parameters
+  //! \return generated shape of the item parameters
+  virtual TopoDS_Shape GetPresentationShape() const { initItem(); return myPresentationShape; }
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const { return 0; }
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const
+    { (void)theRow; (void)theColumn; return ViewControl_EditType_None; }
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues (const int theRow, const int theColumn) const
+    { (void)theRow; (void)theColumn; return QList<QVariant>(); }
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const
+  {  (void)theRow; (void)theColumn; (void)theRole; return QVariant(); }
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue)
+    { (void)theRow; (void)theColumn; (void)theValue; return false; }
+
 protected:
 
   //! Initialize the current item. It creates a backup of the specific item information
@@ -60,6 +103,7 @@ protected:
 protected:
 
   Handle(AIS_InteractiveContext) myContext; //!< the current context
+  TopoDS_Shape myPresentationShape; //!< item presentation shape
 };
 
 #endif
\ No newline at end of file
index 8c724d05a7cbbc1dbc94284cc2e8f65a4aa0faf0..57bf423e6d6912d8e279da5ae3a8473aa3a3fc3e 100644 (file)
@@ -15,7 +15,9 @@
 
 #include <inspector/VInspector_ItemContext.hxx>
 
+#include <AIS.hxx>
 #include <AIS_ListOfInteractive.hxx>
+#include <SelectMgr.hxx>
 #include <SelectMgr_EntityOwner.hxx>
 #include <inspector/VInspector_ItemFolderObject.hxx>
 #include <inspector/VInspector_ItemPresentableObject.hxx>
@@ -109,6 +111,115 @@ QVariant VInspector_ItemContext::initValue (const int theItemRole) const
   return QVariant();
 }
 
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemContext::GetTableRowCount() const
+{
+  return 11;
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemContext::GetTableEditType (const int theRow, const int) const
+{
+  switch (theRow)
+  {
+    case 0: return ViewControl_EditType_Spin;
+    case 1: return ViewControl_EditType_Combo;
+    case 2: return ViewControl_EditType_Bool;
+    case 3: return ViewControl_EditType_Bool;
+    case 4: return ViewControl_EditType_Bool;
+    default: return ViewControl_EditType_None;
+  }
+}
+
+// =======================================================================
+// function : GetTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemContext::GetTableEnumValues (const int theRow, const int) const
+{
+  QList<QVariant> aValues;
+  switch (theRow)
+  {
+    case 1:
+    {
+      for (int i = 0; i <= SelectMgr_PickingStrategy_OnlyTopmost; i++)
+        aValues.append (SelectMgr::PickingStrategyToString ((SelectMgr_PickingStrategy)i));
+    }
+    break;
+    default: break;
+  }
+
+  return aValues;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemContext::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+  switch (theRow)
+  {
+    case 0: return isFirstColumn ? QVariant ("PixelTolerance") : QVariant (myContext->PixelTolerance());
+    case 1: return isFirstColumn ? QVariant ("PickingStrategy") : QVariant (SelectMgr::PickingStrategyToString (myContext->PickingStrategy()));
+    case 2: return isFirstColumn ? QVariant ("AutomaticHilight") : QVariant (myContext->AutomaticHilight());
+    case 3: return isFirstColumn ? QVariant ("ToHilightSelected") : QVariant (myContext->ToHilightSelected());
+    case 4: return isFirstColumn ? QVariant ("AutoActivateSelection") : QVariant (myContext->GetAutoActivateSelection());
+    case 5:
+    case 6:
+    case 7:
+    {
+      AIS_DisplayStatus aDisplayStatus = (AIS_DisplayStatus)(theRow - 5);
+      if (isFirstColumn)
+        return QString ("ObjectsByDisplayStatus: %1").arg (AIS::DisplayStatusToString (aDisplayStatus));
+      AIS_ListOfInteractive anObjects;
+      myContext->ObjectsByDisplayStatus(aDisplayStatus, anObjects);
+      return QVariant (anObjects.Extent());
+    }
+    break;
+    case 8: return isFirstColumn ? QVariant ("DetectedOwner") : QVariant (VInspector_Tools::GetPointerInfo (myContext->DetectedOwner()).ToCString());
+    case 9:
+    {
+      if (isFirstColumn)
+        return QVariant ("DetectedOwners");
+      int aNbOfDetected = 0;
+      for (myContext->InitDetected(); myContext->MoreDetected(); myContext->NextDetected())
+        aNbOfDetected++;
+      return aNbOfDetected;
+    }
+    case 10: return isFirstColumn ? QVariant ("NbSelected") : QVariant (myContext->NbSelected());
+    default: return QVariant();
+  }
+}
+
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemContext::SetTableData (const int theRow, const int, const QVariant& theValue)
+{
+  switch (theRow)
+  {
+    case 0: myContext->SetPixelTolerance (theValue.toInt()); break;
+    case 1: myContext->SetPickingStrategy (SelectMgr::PickingStrategyFromString (theValue.toString().toStdString().c_str())); break;
+    case 2: myContext->SetAutomaticHilight (theValue.toBool()); break;
+    case 3: myContext->SetToHilightSelected (theValue.toBool()); break;
+    case 4: myContext->SetAutoActivateSelection (theValue.toBool()); break;
+    default: return false;
+  }
+  return true;
+}
+
 // =======================================================================
 // function : createChild
 // purpose :
index 166b8a6519cb786937af9e8b48dec81067345b0e..7a37ed133d70abfbc0b1d2664faee58cdd6158c2 100644 (file)
@@ -47,6 +47,33 @@ public:
   //! \return the value
   Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
 
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
+
 protected:
 
   //! Initialize the current item. It creates a backup of the specific item information
diff --git a/tools/VInspector/VInspector_ItemEntityOwner.cxx b/tools/VInspector/VInspector_ItemEntityOwner.cxx
deleted file mode 100644 (file)
index 80f1f30..0000000
+++ /dev/null
@@ -1,186 +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/VInspector_ItemEntityOwner.hxx>
-#include <inspector/VInspector_ItemSensitiveEntity.hxx>
-#include <inspector/VInspector_ItemPresentableObject.hxx>
-#include <inspector/VInspector_Tools.hxx>
-
-#include <SelectMgr_SensitiveEntity.hxx>
-#include <SelectBasics_SensitiveEntity.hxx>
-#include <Standard_Version.hxx>
-#include <StdSelect_BRepOwner.hxx>
-
-#include <Standard_WarningsDisable.hxx>
-#include <QItemSelectionModel>
-#include <QColor>
-#include <Standard_WarningsRestore.hxx>
-
-// =======================================================================
-// function : initValue
-// purpose :
-// =======================================================================
-QVariant VInspector_ItemEntityOwner::initValue(int theItemRole) const
-{
-  switch (theItemRole)
-  { 
-    case Qt::DisplayRole:
-    case Qt::EditRole:
-    case Qt::ToolTipRole:
-    {
-      Handle(SelectBasics_EntityOwner) anOwner = getEntityOwner();
-      if (anOwner.IsNull())
-        return QVariant();
-
-      switch (Column())
-      {
-        case 0: return anOwner->DynamicType()->Name();
-        case 2: return VInspector_Tools::GetPointerInfo (anOwner, true).ToCString();
-        case 3:
-        {
-          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
-          if (BROwnr.IsNull())
-            return QVariant();
-
-          const TopoDS_Shape& aShape = BROwnr->Shape();
-          if (aShape.IsNull())
-            return QVariant();
-
-          return VInspector_Tools::GetShapeTypeInfo (aShape.ShapeType()).ToCString();
-        }
-        case 17:
-        case 18:
-        case 19:
-          {
-          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
-          if (BROwnr.IsNull())
-            return QVariant();
-
-          const TopoDS_Shape& aShape = BROwnr->Shape();
-          if (aShape.IsNull())
-            return QVariant();
-
-          return Column() == 17 ? VInspector_Tools::GetPointerInfo (aShape.TShape(), true).ToCString()
-               : Column() == 18 ? VInspector_Tools::OrientationToName (aShape.Orientation()).ToCString()
-               :           /*19*/ VInspector_Tools::LocationToName (aShape.Location()).ToCString();
-        }
-        default: break;
-      }
-      break;
-    }
-    case Qt::BackgroundRole:
-    case Qt::ForegroundRole:
-    {
-      if (Column() == 2)
-      {
-        Handle(AIS_InteractiveContext) aContext = GetContext();
-        if (!aContext.IsNull())
-        {
-          if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner()))
-            return (theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white);
-        }
-      }
-      VInspector_ItemSensitiveEntityPtr aParentItem = itemDynamicCast<VInspector_ItemSensitiveEntity>(Parent());
-      if (aParentItem)
-        return aParentItem->data(QModelIndex(), theItemRole);
-      break;
-    }
-  }
-  return QVariant();
-}
-
-// =======================================================================
-// function : Init
-// purpose :
-// =======================================================================
-void VInspector_ItemEntityOwner::Init()
-{
-  Handle(SelectBasics_EntityOwner) anOwner;
-
-  VInspector_ItemSensitiveEntityPtr aParentItem = itemDynamicCast<VInspector_ItemSensitiveEntity>(Parent());
-  if (aParentItem)
-  {
-    Handle(SelectMgr_SensitiveEntity) anEntity = aParentItem->GetSensitiveEntity();
-    anOwner = anEntity->BaseSensitive()->OwnerId();
-  }
-  else
-  {
-    VInspector_ItemPresentableObjectPtr aPOItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
-    if (aPOItem)
-    {
-      Handle(AIS_InteractiveObject) anIO = aPOItem->GetInteractiveObject();
-
-      int aRowId = Row();
-      int aCurrentIndex = 0;
-#if OCC_VERSION_HEX < 0x070201
-      for (anIO->Init(); anIO->More() && anOwner.IsNull(); anIO->Next())
-      {
-        const Handle(SelectMgr_Selection)& aSelection = anIO->CurrentSelection();
-        for (aSelection->Init(); aSelection->More() && anOwner.IsNull(); aSelection->Next())
-        {
-          Handle(SelectMgr_SensitiveEntity) anEntity = aSelection->Sensitive();
-#else
-      for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anIO->Selections()); aSelIter.More() && anOwner.IsNull(); aSelIter.Next())
-      {
-        const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
-        for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More() && anOwner.IsNull(); aSelEntIter.Next())
-        {
-          Handle(SelectMgr_SensitiveEntity) anEntity = aSelEntIter.Value();
-#endif
-          const Handle(SelectBasics_SensitiveEntity)& aBase = anEntity->BaseSensitive();
-          if (!aBase.IsNull())
-          {
-            if (aRowId == aCurrentIndex)
-              anOwner = aBase->OwnerId();
-            aCurrentIndex++;
-          }
-        }
-      }
-    }
-  }
-  myOwner = anOwner;
-  TreeModel_ItemBase::Init();
-}
-
-// =======================================================================
-// function : Reset
-// purpose :
-// =======================================================================
-void VInspector_ItemEntityOwner::Reset()
-{
-  VInspector_ItemBase::Reset();
-  SetContext (NULL);
-}
-
-// =======================================================================
-// function : initItem
-// purpose :
-// =======================================================================
-void VInspector_ItemEntityOwner::initItem() const
-{
-  if (IsInitialized())
-    return;
-  const_cast<VInspector_ItemEntityOwner*>(this)->Init();
-}
-
-// =======================================================================
-// function : getEntityOwner
-// purpose :
-// =======================================================================
-Handle(SelectBasics_EntityOwner) VInspector_ItemEntityOwner::getEntityOwner() const
-{
-  initItem();
-  return myOwner;
-}
diff --git a/tools/VInspector/VInspector_ItemEntityOwner.hxx b/tools/VInspector/VInspector_ItemEntityOwner.hxx
deleted file mode 100644 (file)
index 598ca26..0000000
+++ /dev/null
@@ -1,89 +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 VInspector_ItemEntityOwner_H
-#define VInspector_ItemEntityOwner_H
-
-#include <AIS_InteractiveObject.hxx>
-#include <Standard.hxx>
-#include <inspector/VInspector_ItemBase.hxx>
-
-class QItemSelectionModel;
-
-class VInspector_ItemEntityOwner;
-typedef QExplicitlySharedDataPointer<VInspector_ItemEntityOwner> VInspector_ItemEntityOwnerPtr;
-
-//! \class VInspector_ItemPresentableObject
-//! Item for selection entity owner. The parent is sensitive entity item, there are no children
-class VInspector_ItemEntityOwner : public VInspector_ItemBase
-{
-
-public:
-
-  //! Creates an item wrapped by a shared pointer
-  static VInspector_ItemEntityOwnerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  { return VInspector_ItemEntityOwnerPtr (new VInspector_ItemEntityOwner (theParent, theRow, theColumn)); }
-
-  //! Destructor
-  virtual ~VInspector_ItemEntityOwner() Standard_OVERRIDE {};
-
-  //! Inits the item, fills internal containers
-  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
-
-  //! Resets cached values
-  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
-
-  //! Returns the current entity owner
-  Handle(SelectBasics_EntityOwner) EntityOwner() const { return myOwner; }
-
-protected:
-  //! \return number of children.
-  virtual int initRowCount() const Standard_OVERRIDE{ return 0; }
-
-  //! Returns item information for the given role. Fills internal container if it was not filled yet
-  //! \param theItemRole a value role
-  //! \return the value
-  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
-
-  //! Initialize the current item. It is empty because Reset() is also empty.
-  virtual void initItem() const Standard_OVERRIDE;
-
-protected:
-
-  //! 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) Standard_OVERRIDE
-  { (void)theRow; (void)theColumn; return TreeModel_ItemBasePtr(); }
-
-private:
-
-  //! Constructor
-  //! param theParent a parent item
-  VInspector_ItemEntityOwner(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  : VInspector_ItemBase(theParent, theRow, theColumn) {}
-
-private:
-
-  //! Returns the current entity owner. Initializes the item if it was not initialized yet
-  Handle(SelectBasics_EntityOwner) getEntityOwner() const;
-
-private:
-
-  Handle(SelectBasics_EntityOwner) myOwner; //!< the current entity owner
-};
-
-#endif
index cbd413bc5c2b6ea04053bb837e1d7cfe838102fc..81f8f737ce7159da424d6b759434f91bc658f7ca 100644 (file)
 #include <inspector/VInspector_ItemFolderObject.hxx>
 
 #include <inspector/VInspector_ItemContext.hxx>
+#include <inspector/VInspector_ItemPresentableObject.hxx>
+#include <inspector/VInspector_ItemPrs3dDrawer.hxx>
 #include <inspector/VInspector_ItemSelectMgrFilter.hxx>
+#include <inspector/VInspector_ItemV3dViewer.hxx>
+
+#include <AIS_InteractiveObject.hxx>
+#include <Prs3d.hxx>
 
 // =======================================================================
 // function : initValue
 // =======================================================================
 QVariant VInspector_ItemFolderObject::initValue (int theItemRole) const
 {
-  if (Column() == 0 && (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole))
+  if (Column() != 0 || (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole))
+    return QVariant();
+
+  ParentKind aParentKind = GetParentItemKind();
+  switch (aParentKind)
   {
-    if (parentItemIsContext()) return "Properties";
-    else if (Row() == 0) return "Filters";
-    else return QVariant();
+    case ParentKind_ContextItem: return "Properties";
+    case ParentKind_PresentationItem: return "Properties";
+    case ParentKind_FolderItem: return Row() == 0 ? "Filters" : QVariant();
+    default: return QVariant();
   }
-  return QVariant();
 }
 
 // =======================================================================
@@ -39,7 +49,30 @@ QVariant VInspector_ItemFolderObject::initValue (int theItemRole) const
 // =======================================================================
 int VInspector_ItemFolderObject::initRowCount() const
 {
-  return parentItemIsContext() ? 1 : (GetContext().IsNull() ? 0 : GetContext()->Filters().Extent());
+  ParentKind aParentKind = GetParentItemKind();
+  switch (aParentKind)
+  {
+    case ParentKind_ContextItem:
+    {
+      int aNbChildren = 2; // Filters, Viewer
+      aNbChildren++; // DefaultDrawer
+      for (int aTypeId = 0; aTypeId < Prs3d_TypeOfHighlight_NB; aTypeId++)
+      {
+        const Handle(Prs3d_Drawer)& aStyle = GetContext()->HighlightStyle ((Prs3d_TypeOfHighlight)aTypeId);
+        if (!aStyle.IsNull())
+          aNbChildren++;
+      }
+      return aNbChildren;
+    }
+    case ParentKind_PresentationItem:
+    {
+      return 3; // Attributes, HilightAttributes and DynamicHilightAttributes
+    }
+    case ParentKind_FolderItem:
+      return (GetContext().IsNull() ? 0 : GetContext()->Filters().Extent());
+    default:
+      return 0;
+  }
 }
 
 // =======================================================================
@@ -48,10 +81,24 @@ int VInspector_ItemFolderObject::initRowCount() const
 // =======================================================================
 TreeModel_ItemBasePtr VInspector_ItemFolderObject::createChild (int theRow, int theColumn)
 {
-  if (parentItemIsContext())
-    return VInspector_ItemFolderObject::CreateItem (currentItem(), theRow, theColumn);
-  else
-    return VInspector_ItemSelectMgrFilter::CreateItem (currentItem(), theRow, theColumn);
+  ParentKind aParentKind = GetParentItemKind();
+  switch (aParentKind)
+  {
+    case ParentKind_ContextItem:
+    {
+      if (theRow == 0)
+        return VInspector_ItemFolderObject::CreateItem (currentItem(), theRow, theColumn);
+      else if (theRow == 1)
+        return VInspector_ItemV3dViewer::CreateItem (currentItem(), theRow, theColumn);
+      else
+        return VInspector_ItemPrs3dDrawer::CreateItem (currentItem(), theRow, theColumn);
+    }
+    case ParentKind_PresentationItem:
+      return VInspector_ItemPrs3dDrawer::CreateItem (currentItem(), theRow, theColumn);
+    case ParentKind_FolderItem:
+      return VInspector_ItemSelectMgrFilter::CreateItem (currentItem(), theRow, theColumn);
+    default: return TreeModel_ItemBasePtr();
+  }
 }
 
 // =======================================================================
@@ -72,6 +119,61 @@ void VInspector_ItemFolderObject::Reset()
   VInspector_ItemBase::Reset();
 }
 
+// =======================================================================
+// function : GetPrs3dDrawer
+// purpose :
+// =======================================================================
+Handle(Prs3d_Drawer) VInspector_ItemFolderObject::GetPrs3dDrawer (const int theRow,
+                                                                  TCollection_AsciiString& theName) const
+{
+  ParentKind aParentKind = GetParentItemKind();
+  switch (aParentKind)
+  {
+    case ParentKind_ContextItem:
+    {
+      if (theRow == 0 || theRow == 1) // "Filters", "Viewer"
+        return 0;
+
+      if (theRow == 2)
+      {
+        theName = "DefaultDrawer";
+        return GetContext()->DefaultDrawer();
+      }
+
+      for (int aTypeId = 0, aCurId = 0; aTypeId < Prs3d_TypeOfHighlight_NB; aTypeId++)
+      {
+        Prs3d_TypeOfHighlight aType = (Prs3d_TypeOfHighlight)aTypeId;
+        const Handle(Prs3d_Drawer)& aDrawer = GetContext()->HighlightStyle (aType);
+        if (aDrawer.IsNull())
+          continue;
+        if (aCurId == theRow - 3)
+        {
+          theName = TCollection_AsciiString ("HighlightStyle: ") + Prs3d::TypeOfHighlightToString (aType);
+          return aDrawer;
+        }
+        aCurId++;
+      }
+    }
+    case ParentKind_PresentationItem:
+    {
+      VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
+      Handle(AIS_InteractiveObject) aPrs = aParentPrsItem->GetInteractiveObject();
+      switch (theRow)
+      {
+        case 0: theName = "Attributes"; return aPrs->Attributes();
+        case 1: theName = "HilightAttributes"; return aPrs->HilightAttributes();
+        case 2: theName = "DynamicHilightAttributes"; return aPrs->DynamicHilightAttributes();
+        default: break;
+      }
+    }
+    case ParentKind_FolderItem:
+    default: break;
+  }
+
+  theName = "None";
+  return Handle(Prs3d_Drawer)();
+}
+
 // =======================================================================
 // function : initItem
 // purpose :
@@ -84,10 +186,18 @@ void VInspector_ItemFolderObject::initItem() const
 }
 
 // =======================================================================
-// function : parentItemIsContext
+// function : GetParentItemKind
 // purpose :
 // =======================================================================
-bool VInspector_ItemFolderObject::parentItemIsContext() const
+VInspector_ItemFolderObject::ParentKind VInspector_ItemFolderObject::GetParentItemKind() const
 {
-  return itemDynamicCast<VInspector_ItemContext> (Parent());
+  VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
+  if (aParentPrsItem)
+    return ParentKind_PresentationItem;
+
+  VInspector_ItemContextPtr aParentContextItem = itemDynamicCast<VInspector_ItemContext>(Parent());
+  if (aParentContextItem)
+    return ParentKind_ContextItem;
+
+  return ParentKind_FolderItem;
 }
index a0a754f8d84d8e0d5150236eb8438dfd3ab53469..17d847f54e58ee77f22954c2a82b22e61b413bf1 100644 (file)
@@ -23,6 +23,8 @@
 #include <NCollection_List.hxx>
 #include <TCollection_AsciiString.hxx>
 
+class Prs3d_Drawer;
+
 class QItemSelectionModel;
 
 class VInspector_ItemFolderObject;
@@ -49,6 +51,23 @@ public:
   //! Resets cached values
   Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
 
+  //! Returns drawer of the row if possible
+  //! \param theRow child row index
+  //! \param theName [out] drawer name
+  Standard_EXPORT Handle(Prs3d_Drawer) GetPrs3dDrawer (const int theRow,
+                                                       TCollection_AsciiString& theName) const;
+
+  enum ParentKind
+  {
+    ParentKind_ContextItem, //!< "Properties" item under an interactive context
+    ParentKind_PresentationItem, //!< "Properties" item under an interactive presentation
+    ParentKind_FolderItem //!< "Filters" item under an interactive context
+  };
+
+  //! Finds kind of the parent item
+  //! \return item kind
+  ParentKind GetParentItemKind() const;
+
 protected:
 
   //! Initialize the current item. It is empty because Reset() is also empty.
@@ -69,11 +88,6 @@ protected:
   //! \return the created item
   virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE;
 
-private:
-  //! Returns whether the parent item is context item
-  //! \returns bolean value
-  bool parentItemIsContext() const;
-
 private:
 
   //! Constructor
diff --git a/tools/VInspector/VInspector_ItemGraphic3dCStructure.cxx b/tools/VInspector/VInspector_ItemGraphic3dCStructure.cxx
new file mode 100644 (file)
index 0000000..bf466b3
--- /dev/null
@@ -0,0 +1,211 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#include <inspector/VInspector_ItemGraphic3dCStructure.hxx>
+#include <inspector/VInspector_ItemGraphic3dGroup.hxx>
+
+#include <inspector/VInspector_ItemPrs3dPresentation.hxx>
+#include <inspector/VInspector_Tools.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Graphic3d.hxx>
+#include <Graphic3d_CStructure.hxx>
+#include <Graphic3d_GraphicDriver.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : GetCStructure
+// purpose :
+// =======================================================================
+Handle(Graphic3d_CStructure) VInspector_ItemGraphic3dCStructure::GetCStructure() const
+{
+  initItem();
+  return myCStructure;
+}
+
+// =======================================================================
+// function : GetGroup
+// purpose :
+// =======================================================================
+Handle(Graphic3d_Group) VInspector_ItemGraphic3dCStructure::GetGroup (const int theRowId) const
+{
+  Handle(Graphic3d_CStructure) aCStructure = GetCStructure();
+  if (aCStructure.IsNull())
+    return Handle(Graphic3d_Group)();
+
+  const Graphic3d_SequenceOfGroup& aGroups = aCStructure->Groups();
+  int aCurrentIndex = 0;
+  for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
+  {
+    if (theRowId == aCurrentIndex)
+      return aGroupIter.Value();
+
+    aCurrentIndex++;
+  }
+  return Handle(Graphic3d_Group)();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemGraphic3dCStructure::Init()
+{
+  VInspector_ItemPrs3dPresentationPtr aParentItem = itemDynamicCast<VInspector_ItemPrs3dPresentation>(Parent());
+
+  Handle(Prs3d_Presentation) aPresentation = aParentItem->GetPresentation();
+  myCStructure = aPresentation->CStructure();
+
+  TreeModel_ItemBase::Init();
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemGraphic3dCStructure::Reset()
+{
+  VInspector_ItemBase::Reset();
+  myCStructure = NULL;
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemGraphic3dCStructure::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemGraphic3dCStructure*>(this)->Init();
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemGraphic3dCStructure::initRowCount() const
+{
+  if (Column() != 0)
+    return 0;
+
+  Handle(Graphic3d_CStructure) aCStructure = GetCStructure();
+  return !aCStructure.IsNull() ? aCStructure->Groups().Length() : 0;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemGraphic3dCStructure::initValue (const int theItemRole) const
+{
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  Handle(Graphic3d_CStructure) aCStructure = GetCStructure();
+  if (aCStructure.IsNull())
+    return Column() == 0 ? "Empty CStructure" : "";
+
+  switch (Column())
+  {
+    case 0: return aCStructure->DynamicType()->Name();
+    case 1: return rowCount();
+    default:
+      break;
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemGraphic3dCStructure::GetTableRowCount() const
+{
+  return 40;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemGraphic3dCStructure::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+
+  Handle(Graphic3d_CStructure) aCStructure = GetCStructure();
+  if (aCStructure.IsNull())
+    return QVariant();
+
+  switch (theRow)
+  {
+    case 0: return isFirstColumn ? QVariant ("GraphicDriver")
+      : QVariant (ViewControl_Tools::GetPointerInfo (aCStructure->GraphicDriver()).ToCString());
+    case 1: return isFirstColumn ? QVariant ("Groups") : QVariant (aCStructure->Groups().Length());
+    case 2: return isFirstColumn ? QVariant ("Transformation")
+      : (!aCStructure->Transformation().IsNull() ?
+         QVariant (ViewControl_Tools::ToString (aCStructure->Transformation()->Trsf()).ToCString()) : QVariant());
+    case 3: return isFirstColumn ? QVariant ("TransformPersistence")
+                                 : QVariant (ViewControl_Tools::GetPointerInfo (aCStructure->TransformPersistence()).ToCString());
+    case 4: return isFirstColumn ? QVariant ("ClipPlanes")
+      : (!aCStructure->ClipPlanes().IsNull() ? QVariant (aCStructure->ClipPlanes()->Size()) : QVariant());
+    //case 5: return isFirstColumn ? QVariant ("BoundingBox")
+    //                             : QVariant (ViewControl_Tools::ToString (aCStructure->BoundingBox()).ToCString());
+    case 6: return isFirstColumn ? QVariant ("HighlightStyle")
+                                 : QVariant (ViewControl_Tools::GetPointerInfo (aCStructure->HighlightStyle()).ToCString());
+
+    case 7: return isFirstColumn ? QVariant ("Id") : QVariant (aCStructure->Id);
+    case 8: return isFirstColumn ? QVariant ("ZLayer")
+                                 : QVariant (Graphic3d::ZLayerIdToString(aCStructure->ZLayer()));
+    case 9: return isFirstColumn ? QVariant ("Priority") : QVariant (aCStructure->Priority);
+    case 10: return isFirstColumn ? QVariant ("PreviousPriority") : QVariant (aCStructure->PreviousPriority);
+    case 11: return isFirstColumn ? QVariant ("ContainsFacet") : QVariant (aCStructure->ContainsFacet);
+    case 12: return isFirstColumn ? QVariant ("IsInfinite") : QVariant (aCStructure->IsInfinite);
+    
+    case 13: return isFirstColumn ? QVariant ("stick") : QVariant (aCStructure->stick);
+    case 14: return isFirstColumn ? QVariant ("highlight") : QVariant (aCStructure->highlight);
+    case 15: return isFirstColumn ? QVariant ("visible") : QVariant (aCStructure->visible);
+    case 16: return isFirstColumn ? QVariant ("HLRValidation") : QVariant (aCStructure->HLRValidation);
+    case 17: return isFirstColumn ? QVariant ("IsForHighlight") : QVariant (aCStructure->IsForHighlight);
+    case 18: return isFirstColumn ? QVariant ("IsMutable") : QVariant (aCStructure->IsMutable);
+    case 19: return isFirstColumn ? QVariant ("Is2dText") : QVariant (aCStructure->Is2dText);
+
+    default: return QVariant();
+  }
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemGraphic3dCStructure::createChild (int theRow, int theColumn)
+{
+  Handle(Graphic3d_CStructure) aCStructure = GetCStructure();
+  //Handle(Prs3d_Presentation) aPresentation = GetPresentation();
+  //Standard_EXPORT const Handle(Graphic3d_SequenceOfHClipPlane)& ClipPlanes() const;
+
+  if (theRow >= 0 && theRow < GetCStructure()->Groups().Length())
+    return VInspector_ItemGraphic3dGroup::CreateItem (currentItem(), theRow, theColumn);
+  //else
+  //  return VInspector_ItemPresentableObject::CreateItem (currentItem(), theRow, theColumn);
+
+  return TreeModel_ItemBasePtr();
+}
diff --git a/tools/VInspector/VInspector_ItemGraphic3dCStructure.hxx b/tools/VInspector/VInspector_ItemGraphic3dCStructure.hxx
new file mode 100644 (file)
index 0000000..cd90b69
--- /dev/null
@@ -0,0 +1,103 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef VInspector_ItemGraphic3dCStructure_H
+#define VInspector_ItemGraphic3dCStructure_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+class Graphic3d_CStructure;
+
+class VInspector_ItemGraphic3dCStructure;
+typedef QExplicitlySharedDataPointer<VInspector_ItemGraphic3dCStructure> VInspector_ItemGraphic3dCStructurePtr;
+
+//! \class VInspector_ItemGraphic3dCStructure
+//! Parent item, that corresponds to AIS_InteractiveContext
+//! Children of the item are:
+//! - "Property" item to show context attributes such as selection filters and drawer properties
+//! - presentation items to show all interactive elements displayed/erased in the context
+class VInspector_ItemGraphic3dCStructure : public VInspector_ItemBase
+{
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemGraphic3dCStructurePtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemGraphic3dCStructurePtr (new VInspector_ItemGraphic3dCStructure (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemGraphic3dCStructure() Standard_OVERRIDE {};
+
+  //! Returns the current C structure, init item if it was not initialized yet
+  //! \return graphic C structure object
+  Standard_EXPORT Handle(Graphic3d_CStructure) GetCStructure() const;
+
+  //! Returns group of the C structure
+  //! \param theRowId a group index
+  //! \return graphical group
+  Standard_EXPORT Handle(Graphic3d_Group) GetGroup (const int theRowId) const;
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It creates a backup of the specific item information
+  //! Do nothing as context has been already set into item
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of displayed presentations
+  //! \return rows count
+  virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! 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
+  VInspector_ItemGraphic3dCStructure(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+    : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+private:
+  Handle(Graphic3d_CStructure) myCStructure;
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemGraphic3dClipPlane.cxx b/tools/VInspector/VInspector_ItemGraphic3dClipPlane.cxx
new file mode 100644 (file)
index 0000000..9e9eb99
--- /dev/null
@@ -0,0 +1,179 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#include <inspector/VInspector_ItemGraphic3dClipPlane.hxx>
+
+#include <AIS.hxx>
+#include <AIS_InteractiveContext.hxx>
+#include <inspector/VInspector_ItemContext.hxx>
+#include <inspector/VInspector_ItemGraphic3dClipPlane.hxx>
+#include <inspector/VInspector_ItemV3dView.hxx>
+#include <inspector/VInspector_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemGraphic3dClipPlane::initRowCount() const
+{
+  if (Column() != 0)
+    return 0;
+
+  VInspector_ItemV3dViewPtr aParentViewItem = itemDynamicCast<VInspector_ItemV3dView>(Parent());
+  if (aParentViewItem)
+    return aParentViewItem->GetView()->ClipPlanes()->Size();
+
+  return 0;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemGraphic3dClipPlane::initValue (const int theItemRole) const
+{
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  if (GetClipPlane().IsNull())
+    return Column() == 0 ? "Clip Planes" : "";
+
+  switch (Column())
+  {
+    case 0: return GetClipPlane()->DynamicType()->Name();
+    case 1: return rowCount();
+    default:
+      break;
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void VInspector_ItemGraphic3dClipPlane::Init()
+{
+  VInspector_ItemV3dViewPtr aParentViewItem = itemDynamicCast<VInspector_ItemV3dView>(Parent());
+  Handle(Graphic3d_ClipPlane) aClipPlane;
+  if (!aParentViewItem) // ClipPlanes
+  {
+    aParentViewItem = itemDynamicCast<VInspector_ItemV3dView>(Parent()->Parent());
+    aClipPlane = aParentViewItem->GetClipPlane(Row());
+  }
+  setClipPlane (aClipPlane);
+  TreeModel_ItemBase::Init();
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+
+void VInspector_ItemGraphic3dClipPlane::Reset()
+{
+  VInspector_ItemBase::Reset();
+
+  setClipPlane (NULL);
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+
+void VInspector_ItemGraphic3dClipPlane::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemGraphic3dClipPlane*>(this)->Init();
+}
+
+// =======================================================================
+// function : GetView
+// purpose :
+// =======================================================================
+
+Handle(Graphic3d_ClipPlane) VInspector_ItemGraphic3dClipPlane::GetClipPlane() const
+{
+  initItem();
+  return myClipPlane;
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemGraphic3dClipPlane::GetTableRowCount() const
+{
+  return 0;
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemGraphic3dClipPlane::GetTableEditType (const int theRow, const int) const
+{
+  return ViewControl_EditType_None;
+}
+
+// =======================================================================
+// function : GetTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemGraphic3dClipPlane::GetTableEnumValues (const int theRow, const int) const
+{
+  QList<QVariant> aValues;
+  return aValues;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemGraphic3dClipPlane::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  return QVariant();
+}
+
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemGraphic3dClipPlane::SetTableData (const int theRow, const int, const QVariant& theValue)
+{
+  return true;
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemGraphic3dClipPlane::createChild (int theRow, int theColumn)
+{
+  if (theRow == 0)
+    return VInspector_ItemGraphic3dClipPlane::CreateItem (currentItem(), theRow, theColumn);
+
+  return TreeModel_ItemBasePtr();
+}
diff --git a/tools/VInspector/VInspector_ItemGraphic3dClipPlane.hxx b/tools/VInspector/VInspector_ItemGraphic3dClipPlane.hxx
new file mode 100644 (file)
index 0000000..77818db
--- /dev/null
@@ -0,0 +1,120 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef VInspector_ItemGraphic3dClipPlane_H
+#define VInspector_ItemGraphic3dClipPlane_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+#include <Graphic3d_ClipPlane.hxx>
+
+class VInspector_ItemGraphic3dClipPlane;
+typedef QExplicitlySharedDataPointer<VInspector_ItemGraphic3dClipPlane> VInspector_ItemGraphic3dClipPlanePtr;
+
+//! \class VInspector_ItemGraphic3dClipPlane
+//! Parent item, that corresponds to AIS_InteractiveContext
+//! Children of the item are:
+//! - "Property" item to show context attributes such as selection filters and drawer properties
+//! - presentation items to show all interactive elements displayed/erased in the context
+class VInspector_ItemGraphic3dClipPlane : public VInspector_ItemBase
+{
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemGraphic3dClipPlanePtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemGraphic3dClipPlanePtr (new VInspector_ItemGraphic3dClipPlane (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemGraphic3dClipPlane() Standard_OVERRIDE {};
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns current clip plane, initialize if it was not initialized yet
+  Standard_EXPORT Handle(Graphic3d_ClipPlane) GetClipPlane() const;
+
+protected:
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of displayed presentations
+  //! \return rows count
+  Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! Set Clip Plane into the current field
+  //! \param theViewer a viewer
+  void setClipPlane (const Handle(Graphic3d_ClipPlane)& theClipPlane) { myClipPlane = theClipPlane; }
+
+private:
+
+  //! 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
+  VInspector_ItemGraphic3dClipPlane(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+    : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+protected:
+
+  Handle(Graphic3d_ClipPlane) myClipPlane; //!< the current ClipPlane
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemGraphic3dGroup.cxx b/tools/VInspector/VInspector_ItemGraphic3dGroup.cxx
new file mode 100644 (file)
index 0000000..69cb56a
--- /dev/null
@@ -0,0 +1,207 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#include <inspector/VInspector_ItemGraphic3dGroup.hxx>
+
+#include <inspector/VInspector_ItemGraphic3dCStructure.hxx>
+#include <inspector/VInspector_ItemOpenGlElement.hxx>
+#include <inspector/VInspector_Tools.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <AIS.hxx>
+#include <OpenGl_Group.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : GetGroup
+// purpose :
+// =======================================================================
+Handle(Graphic3d_Group) VInspector_ItemGraphic3dGroup::GetGroup() const
+{
+  initItem();
+  return myGroup;
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemGraphic3dGroup::Init()
+{
+  VInspector_ItemGraphic3dCStructurePtr aParentItem = itemDynamicCast<VInspector_ItemGraphic3dCStructure>(Parent());
+  myGroup = aParentItem->GetGroup (Row());
+
+  TreeModel_ItemBase::Init();
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemGraphic3dGroup::Reset()
+{
+  VInspector_ItemBase::Reset();
+  myGroup = NULL;
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemGraphic3dGroup::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemGraphic3dGroup*>(this)->Init();
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemGraphic3dGroup::initRowCount() const
+{
+  if (Column() != 0)
+    return 0;
+
+  Handle(Graphic3d_Group) aGroup = GetGroup();
+  Handle(OpenGl_Group) anOpenGlGroup = Handle(OpenGl_Group)::DownCast(aGroup);
+  if (anOpenGlGroup.IsNull())
+    return 0;
+
+  int aNbElements = 0;
+  for (const OpenGl_ElementNode* aNodeIter = anOpenGlGroup->FirstNode(); aNodeIter != NULL; aNodeIter = aNodeIter->next)
+  {
+    aNbElements++;
+  }
+  return aNbElements;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemGraphic3dGroup::initValue (const int theItemRole) const
+{
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  Handle(Graphic3d_Group) aGroup = GetGroup();
+  if (aGroup.IsNull())
+    return Column() == 0 ? "Empty group" : "";
+
+  switch (Column())
+  {
+    case 0: return aGroup->DynamicType()->Name();
+    case 1:
+      return rowCount();
+    case 2:
+      return ViewControl_Tools::GetPointerInfo (aGroup, true).ToCString();
+    default:
+      break;
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : GetElementNode
+// purpose :
+// =======================================================================
+OpenGl_Element* VInspector_ItemGraphic3dGroup::GetElementNode (const int theRowId) const
+{
+  int aCurrentIndex = 0;
+
+  Handle(Graphic3d_Group) aGroup = GetGroup();
+  Handle(OpenGl_Group) anOpenGlGroup = Handle(OpenGl_Group)::DownCast(aGroup);
+  if (anOpenGlGroup.IsNull())
+    return 0;
+  for (const OpenGl_ElementNode* aNodeIter = anOpenGlGroup->FirstNode(); aNodeIter != NULL; aNodeIter = aNodeIter->next)
+  {
+    if (theRowId == aCurrentIndex)
+      return aNodeIter->elem;
+    aCurrentIndex++;
+  }
+  return 0;
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemGraphic3dGroup::GetTableRowCount() const
+{
+  return 40;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemGraphic3dGroup::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  Handle(Graphic3d_Group) aGroup = GetGroup();
+  if (aGroup.IsNull())
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+  //switch (theRow)
+  //{
+  //  case 0: return isFirstColumn ? QVariant ("PixelTolerance") : QVariant (myContext->PixelTolerance());
+  //  case 1: return isFirstColumn ? QVariant ("PickingStrategy") : QVariant (SelectMgr::PickingStrategyToString (myContext->PickingStrategy()));
+  //  case 2: return isFirstColumn ? QVariant ("AutomaticHilight") : QVariant (myContext->AutomaticHilight());
+  //  case 3: return isFirstColumn ? QVariant ("ToHilightSelected") : QVariant (myContext->ToHilightSelected());
+  //  case 4: return isFirstColumn ? QVariant ("AutoActivateSelection") : QVariant (myContext->GetAutoActivateSelection());
+  //  case 5:
+  //  case 6:
+  //  case 7:
+  //  {
+  //    AIS_DisplayStatus aDisplayStatus = (AIS_DisplayStatus)(theRow - 5);
+  //    if (isFirstColumn)
+  //      return QString ("ObjectsByDisplayStatus: %1").arg (AIS::DisplayStatusToString (aDisplayStatus));
+  //    AIS_ListOfInteractive anObjects;
+  //    myContext->ObjectsByDisplayStatus(aDisplayStatus, anObjects);
+  //    return QVariant (anObjects.Extent());
+  //  }
+  //  break;
+  //  case 8: return isFirstColumn ? QVariant ("DetectedOwner") : QVariant (VInspector_Tools::GetPointerInfo (myContext->DetectedOwner()).ToCString());
+  //  case 9:
+  //  {
+  //    if (isFirstColumn)
+  //      return QVariant ("DetectedOwners");
+  //    int aNbOfDetected = 0;
+  //    for (myContext->InitDetected(); myContext->MoreDetected(); myContext->NextDetected())
+  //      aNbOfDetected++;
+  //    return aNbOfDetected;
+  //  }
+  //  case 10: return isFirstColumn ? QVariant ("NbSelected") : QVariant (myContext->NbSelected());
+  //  default: return QVariant();
+  //}
+  return QVariant();
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemGraphic3dGroup::createChild (int theRow, int theColumn)
+{
+  return VInspector_ItemOpenGlElement::CreateItem (currentItem(), theRow, theColumn);
+}
diff --git a/tools/VInspector/VInspector_ItemGraphic3dGroup.hxx b/tools/VInspector/VInspector_ItemGraphic3dGroup.hxx
new file mode 100644 (file)
index 0000000..fe2c82b
--- /dev/null
@@ -0,0 +1,104 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef VInspector_ItemGraphic3dGroup_H
+#define VInspector_ItemGraphic3dGroup_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+class Graphic3d_Group;
+class OpenGl_Element;
+
+class VInspector_ItemGraphic3dGroup;
+typedef QExplicitlySharedDataPointer<VInspector_ItemGraphic3dGroup> VInspector_ItemGraphic3dGroupPtr;
+
+//! \class VInspector_ItemGraphic3dGroup
+//! Parent item, that corresponds to AIS_InteractiveContext
+//! Children of the item are:
+//! - "Property" item to show context attributes such as selection filters and drawer properties
+//! - presentation items to show all interactive elements displayed/erased in the context
+class VInspector_ItemGraphic3dGroup : public VInspector_ItemBase
+{
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemGraphic3dGroupPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemGraphic3dGroupPtr (new VInspector_ItemGraphic3dGroup (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemGraphic3dGroup() Standard_OVERRIDE {};
+
+  //! Returns the current graphic3d group, init item if it was not initialized yet
+  //! \return graphic group
+  Standard_EXPORT Handle(Graphic3d_Group) GetGroup() const;
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns element node or NULL
+  //! \param theRowId row index
+  //! \return element node
+  OpenGl_Element* GetElementNode(const int theRowId) const;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It creates a backup of the specific item information
+  //! Do nothing as context has been already set into item
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of displayed presentations
+  //! \return rows count
+  Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! 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
+  VInspector_ItemGraphic3dGroup(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+    : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+private:
+  Handle(Graphic3d_Group) myGroup; //! current graphic group
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemOpenGlElement.cxx b/tools/VInspector/VInspector_ItemOpenGlElement.cxx
new file mode 100644 (file)
index 0000000..a5c159a
--- /dev/null
@@ -0,0 +1,220 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#include <inspector/VInspector_ItemOpenGlElement.hxx>
+
+#include <inspector/VInspector_ItemGraphic3dGroup.hxx>
+#include <inspector/VInspector_Tools.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <AIS.hxx>
+#include <AIS_ListOfInteractive.hxx>
+#include <OpenGl_Element.hxx>
+#include <OpenGl_Group.hxx>
+#include <OpenGl_PrimitiveArray.hxx>
+#include <OpenGl_Text.hxx>
+#include <SelectMgr.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : GetGroup
+// purpose :
+// =======================================================================
+OpenGl_Element* VInspector_ItemOpenGlElement::GetElement() const
+{
+  initItem();
+  return myElement;
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemOpenGlElement::Init()
+{
+  VInspector_ItemGraphic3dGroupPtr aParentItem = itemDynamicCast<VInspector_ItemGraphic3dGroup>(Parent());
+  myElement = aParentItem->GetElementNode (Row());
+
+  TreeModel_ItemBase::Init();
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemOpenGlElement::Reset()
+{
+  VInspector_ItemBase::Reset();
+  myElement = 0;
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemOpenGlElement::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemOpenGlElement*>(this)->Init();
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemOpenGlElement::initRowCount() const
+{
+  if (Column() != 0)
+    return 0;
+
+  return 0;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemOpenGlElement::initValue (const int theItemRole) const
+{
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  OpenGl_Element* anElement = GetElement();
+  if (anElement == 0)
+    return Column() == 0 ? "Empty element" : "";
+
+  switch (Column())
+  {
+    case 0:
+    {
+      VInspector_ElementKind aKind = GetElementKind();
+      if (aKind == VInspector_ElementKind_PrimitiveArray) return "OpenGl_PrimitiveArray";
+      else if (aKind == VInspector_ElementKind_Text) return "OpenGl_Text";
+      else return "OpenGl_Element";
+    }
+    case 1:
+      return rowCount();
+    case 2:
+      return ViewControl_Tools::GetPointerInfo (anElement, true).ToCString();
+    default:
+      break;
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemOpenGlElement::GetTableRowCount() const
+{
+  return 40;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemOpenGlElement::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  OpenGl_Element* anElement = GetElement();
+  if (anElement == 0)
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+
+  VInspector_ElementKind aKind = GetElementKind();
+  if (aKind == VInspector_ElementKind_PrimitiveArray)
+  {
+    OpenGl_PrimitiveArray* aCElement = dynamic_cast<OpenGl_PrimitiveArray*>(anElement);
+    switch (theRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("IsInitialized") : QVariant (aCElement->IsInitialized());
+      case 1: return isFirstColumn ? QVariant ("DrawMode") : QVariant (aCElement->DrawMode());
+      case 2: return isFirstColumn ? QVariant ("IsFillDrawMode") : QVariant (aCElement->IsFillDrawMode());
+
+      case 3: return isFirstColumn ? QVariant ("GetUID") : QVariant (aCElement->GetUID());
+      case 4: return isFirstColumn ? QVariant ("IndexVbo()")
+        : !aCElement->IndexVbo().IsNull() ? QVariant (ViewControl_Tools::GetPointerInfo (aCElement->IndexVbo()).ToCString()) : QVariant();
+      case 5: return isFirstColumn ? QVariant ("AttributesVbo()")
+        : !aCElement->AttributesVbo().IsNull() ? QVariant (ViewControl_Tools::GetPointerInfo (aCElement->AttributesVbo()).ToCString()) : QVariant();
+
+      case 6: return isFirstColumn ? QVariant ("Indices") : VInspector_Tools::ToVariant (aCElement->Indices());
+      case 7:
+      {
+        const Handle(Graphic3d_Buffer)& anAttributes = aCElement->Attributes();
+        return isFirstColumn ? QVariant ("Attributes") : VInspector_Tools::ToVariant (aCElement->Attributes());
+      }
+      case 8: return isFirstColumn ? QVariant ("Bounds") : VInspector_Tools::ToVariant (aCElement->Bounds());
+      default: return QVariant();
+    }
+  }
+  else if (aKind == VInspector_ElementKind_Text)
+  {
+    OpenGl_Text* aCmElement = dynamic_cast<OpenGl_Text*>(anElement);
+    switch (theRow)
+    {
+      case 0:
+      {
+        if (isFirstColumn)
+          return QVariant ("PixelTolerance");
+        //: QVariant (myContext->PixelTolerance());
+        return QVariant();
+      }
+      default: return QVariant();
+    }
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemOpenGlElement::createChild (int theRow, int theColumn)
+{
+  //if (theRow == 0)
+  //  return VInspector_ItemFolderObject::CreateItem (currentItem(), theRow, theColumn);
+  //else
+  //  return VInspector_ItemPresentableObject::CreateItem (currentItem(), theRow, theColumn);
+
+  return TreeModel_ItemBasePtr();
+}
+
+// =======================================================================
+// function : GetElementKind
+// purpose :
+// =======================================================================
+VInspector_ItemOpenGlElement::VInspector_ElementKind VInspector_ItemOpenGlElement::GetElementKind() const
+{
+  OpenGl_Element* anElement = GetElement();
+  if (anElement == 0)
+    return VInspector_ElementKind_Undefined;
+
+  if (dynamic_cast<OpenGl_PrimitiveArray*>(anElement))
+    return VInspector_ElementKind_PrimitiveArray;
+  else if (dynamic_cast<OpenGl_Text*>(anElement))
+    return VInspector_ElementKind_Text;
+
+  return VInspector_ElementKind_Undefined;
+}
diff --git a/tools/VInspector/VInspector_ItemOpenGlElement.hxx b/tools/VInspector/VInspector_ItemOpenGlElement.hxx
new file mode 100644 (file)
index 0000000..3a333cc
--- /dev/null
@@ -0,0 +1,109 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef VInspector_ItemOpenGlElement_H
+#define VInspector_ItemOpenGlElement_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+class Graphic3d_Group;
+class OpenGl_Element;
+
+class VInspector_ItemOpenGlElement;
+typedef QExplicitlySharedDataPointer<VInspector_ItemOpenGlElement> VInspector_ItemOpenGlElementPtr;
+
+//! \class VInspector_ItemOpenGlElement
+//! Parent item, that corresponds to AIS_InteractiveContext
+//! Children of the item are:
+//! - "Property" item to show context attributes such as selection filters and drawer properties
+//! - presentation items to show all interactive elements displayed/erased in the context
+class VInspector_ItemOpenGlElement : public VInspector_ItemBase
+{
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemOpenGlElementPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemOpenGlElementPtr (new VInspector_ItemOpenGlElement (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemOpenGlElement() Standard_OVERRIDE {};
+
+  //! Returns the current graphic3d group, init item if it was not initialized yet
+  //! \return graphic group
+  Standard_EXPORT OpenGl_Element* GetElement() const;
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It creates a backup of the specific item information
+  //! Do nothing as context has been already set into item
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of displayed presentations
+  //! \return rows count
+  Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+  enum VInspector_ElementKind
+  {
+    VInspector_ElementKind_PrimitiveArray, //!< OpenGl_PrimitiveArray
+    VInspector_ElementKind_Text, //!< OpenGl_Text
+    VInspector_ElementKind_Undefined //!< another OpenGl_Element kind
+  };
+
+  //! Returns kind of the current element
+  //! \return kind
+  VInspector_ElementKind GetElementKind() 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
+  VInspector_ItemOpenGlElement(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+    : VInspector_ItemBase(theParent, theRow, theColumn), myElement (0) {}
+
+private:
+  OpenGl_Element* myElement; //! current element
+};
+
+#endif
index 45b22ed9eb76f24ec2f7cc15ebd2e728c1c2699f..6f31c6dfca6c488d35089611ffd0793ddc13ad5d 100644 (file)
 #include <AIS_Shape.hxx>
 #include <AIS_ListOfInteractive.hxx>
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
+#include <Aspect.hxx>
+
 #include <inspector/VInspector_ItemContext.hxx>
-#include <inspector/VInspector_ItemEntityOwner.hxx>
-#include <inspector/VInspector_ItemSelection.hxx>
+#include <inspector/VInspector_ItemSelectBasicsEntityOwner.hxx>
+#include <inspector/VInspector_ItemFolderObject.hxx>
+#include <inspector/VInspector_ItemPresentations.hxx>
+#include <inspector/VInspector_ItemSelectMgrSelection.hxx>
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_Tools.hxx>
 #include <inspector/VInspector_Tools.hxx>
 #include <inspector/VInspector_ViewModel.hxx>
 
 #include <NCollection_List.hxx>
 #include <Prs3d.hxx>
 #include <Prs3d_Drawer.hxx>
+#include <PrsMgr.hxx>
 #include <SelectBasics_EntityOwner.hxx>
 #include <StdSelect_BRepOwner.hxx>
 #include <Standard_Version.hxx>
@@ -155,7 +162,7 @@ QVariant VInspector_ItemPresentableObject::initValue (int theItemRole) const
 
         return Column() == 17 ? VInspector_Tools::GetPointerInfo (aShape.TShape(), true).ToCString()
               : Column() == 18 ? VInspector_Tools::OrientationToName (aShape.Orientation()).ToCString()
-              :           /*19*/ VInspector_Tools::LocationToName (aShape.Location()).ToCString();
+              :           /*19*/ ViewControl_Tools::ToString (aShape.Location()).ToCString();
       }
       default: break;
     }
@@ -192,6 +199,11 @@ QVariant VInspector_ItemPresentableObject::initValue (int theItemRole) const
 // =======================================================================
 int VInspector_ItemPresentableObject::initRowCount() const
 {
+  if (Column() != 0)
+    return 0;
+
+  int aNbProperties = 2; // "Properties", "Presentations"
+
   Handle(AIS_InteractiveObject) anIO = GetInteractiveObject();
 #if OCC_VERSION_HEX < 0x070201
   int aRows = 0;
@@ -200,12 +212,12 @@ int VInspector_ItemPresentableObject::initRowCount() const
   // iteration through sensitive privitives
   for (anIO->Init(); anIO->More(); anIO->Next())
     aRows++;
-  return aRows;
+  int aNbSelected = aRows;
 #else
-  return !anIO.IsNull()
-        ? anIO->Selections().Size()
-        : 0;
+  int aNbSelected = !anIO.IsNull() ? anIO->Selections().Size() : 0;
 #endif
+
+  return aNbProperties + aNbSelected;
 }
 
 // =======================================================================
@@ -214,7 +226,12 @@ int VInspector_ItemPresentableObject::initRowCount() const
 // =======================================================================
 TreeModel_ItemBasePtr VInspector_ItemPresentableObject::createChild (int theRow, int theColumn)
 {
-  return VInspector_ItemSelection::CreateItem(currentItem(), theRow, theColumn);
+  if (theRow == 0)
+    return VInspector_ItemFolderObject::CreateItem (currentItem(), theRow, theColumn);
+  if (theRow == 1)
+    return VInspector_ItemPresentations::CreateItem (currentItem(), theRow, theColumn);
+  else
+    return VInspector_ItemSelectMgrSelection::CreateItem(currentItem(), theRow, theColumn);
 }
 
 // =======================================================================
@@ -246,6 +263,11 @@ void VInspector_ItemPresentableObject::Init()
   }
 
   setInteractiveObject (anIO);
+
+  Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (anIO);
+  if (!aShape.IsNull())
+    myPresentationShape = aShape->Shape();
+
   TreeModel_ItemBase::Init(); // to use getIO() without circling initialization
 }
 
@@ -292,40 +314,147 @@ QString VInspector_ItemPresentableObject::PointerInfo() const
 }
 
 // =======================================================================
-// function : GetSelectedPresentations
+// function : GetPresentations
+// purpose :
+// =======================================================================
+void VInspector_ItemPresentableObject::GetPresentations (NCollection_List<Handle(Standard_Transient)>& thePresentations)
+{
+  if (Column() != 0)
+    return;
+
+  thePresentations.Append (GetInteractiveObject());
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemPresentableObject::GetTableRowCount() const
+{
+  return 23;
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemPresentableObject::GetTableEditType (const int theRow, const int) const
+{
+  switch (theRow)
+  {
+    case 4: return ViewControl_EditType_Line;
+    case 5: return ViewControl_EditType_Combo;
+    case 6: return ViewControl_EditType_Bool;
+    case 12: return ViewControl_EditType_Bool;
+    case 17: return ViewControl_EditType_Combo;
+    case 18: return ViewControl_EditType_Bool;
+    case 22: return ViewControl_EditType_Bool;
+    default: return ViewControl_EditType_None;
+  }
+}
+
+// =======================================================================
+// function : GetTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemPresentableObject::GetTableEnumValues (const int theRow, const int) const
+{
+  QList<QVariant> aValues;
+  switch (theRow)
+  {
+    case 5:
+    {
+      for (int i = 0; i <= Aspect_TOFM_FRONT_SIDE; i++)
+        aValues.append (Aspect::TypeOfFacingModelToString((Aspect_TypeOfFacingModel)i));
+    }
+    break;
+    case 17:
+    {
+      for (int i = 0; i <= PrsMgr_TOP_ProjectorDependant; i++)
+        aValues.append (PrsMgr::TypeOfPresentation3dToString ((PrsMgr_TypeOfPresentation3d)i));
+    }
+    break;
+    default: break;
+  }
+  return aValues;
+}
+
+// =======================================================================
+// function : GetTableData
 // purpose :
 // =======================================================================
-NCollection_List<Handle(AIS_InteractiveObject)> VInspector_ItemPresentableObject::GetSelectedPresentations
-                                                                  (QItemSelectionModel* theSelectionModel)
+QVariant VInspector_ItemPresentableObject::GetTableData (const int theRow, const int theColumn, const int theRole) const
 {
-  NCollection_List<Handle(AIS_InteractiveObject)> aResultList;
-  if (!theSelectionModel)
-    return aResultList;
-  
-  QList<TreeModel_ItemBasePtr> anItems;
-  
-  QModelIndexList anIndices = theSelectionModel->selectedIndexes();
-  for (QModelIndexList::const_iterator anIndicesIt = anIndices.begin(); anIndicesIt != anIndices.end(); anIndicesIt++)
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+
+  Handle(AIS_InteractiveObject) aPrs = GetInteractiveObject();
+  switch (theRow)
   {
-    TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex (*anIndicesIt);
-    if (!anItem || anItems.contains (anItem))
-      continue;
-    anItems.append (anItem);
+    case 0: return ViewControl_Table::SeparatorData();
+    case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (AIS_InteractiveObject)->Name())
+                                 : ViewControl_Tools::GetPointerInfo (aPrs).ToCString();
+    case 2: return ViewControl_Table::SeparatorData();
+    case 3: return isFirstColumn ? QVariant ("HasWidth") : QVariant (aPrs->HasWidth());
+    case 4: return isFirstColumn ? QVariant ("Width") : QVariant (aPrs->Width());
+    case 5: return isFirstColumn ? QVariant ("CurrentFacingModel")
+                                 : QVariant (Aspect::TypeOfFacingModelToString (aPrs->CurrentFacingModel()));
+    case 6: return isFirstColumn ? QVariant ("IsInfinite") : QVariant (aPrs->IsInfinite());
+    case 7: return isFirstColumn ? QVariant ("HasColor") : QVariant (aPrs->HasColor());
+    case 8: return isFirstColumn ? QVariant ("HasMaterial") : QVariant (aPrs->HasMaterial());
+
+    case 9: return ViewControl_Table::SeparatorData();
+    case 10: return isFirstColumn ? QVariant (STANDARD_TYPE (SelectMgr_SelectableObject)->Name())
+                                 : ViewControl_Tools::GetPointerInfo (aPrs).ToCString();
+    case 11: return ViewControl_Table::SeparatorData();
+    case 12: return isFirstColumn ? QVariant ("IsAutoHilight") : QVariant (aPrs->IsAutoHilight());
+    case 13: return isFirstColumn ? QVariant ("GlobalSelectionMode") : QVariant (aPrs->GlobalSelectionMode());
+
+    case 14: return ViewControl_Table::SeparatorData();
+    case 15: return isFirstColumn ? QVariant (STANDARD_TYPE (PrsMgr_PresentableObject)->Name())
+                                 : ViewControl_Tools::GetPointerInfo (aPrs).ToCString();
+    case 16: return ViewControl_Table::SeparatorData();
+    case 17: return isFirstColumn ? QVariant ("TypeOfPresentation3d")
+                                  : QVariant (PrsMgr::TypeOfPresentation3dToString (aPrs->TypeOfPresentation3d()));
+    case 18: return isFirstColumn ? QVariant ("IsMutable") : QVariant (aPrs->IsMutable());
+    case 19: return isFirstColumn ? QVariant ("HasOwnPresentations") : QVariant (aPrs->HasOwnPresentations());
+    case 20: return isFirstColumn ? QVariant ("TransformationGeom")
+      : (!aPrs->TransformationGeom().IsNull()
+        ? QVariant (ViewControl_Tools::ToString(aPrs->TransformationGeom()->Trsf()).ToCString()) : QVariant());
+    case 21: return isFirstColumn ? QVariant ("LocalTransformationGeom")
+      : (!aPrs->LocalTransformationGeom().IsNull()
+        ? QVariant (ViewControl_Tools::ToString(aPrs->LocalTransformationGeom()->Trsf()).ToCString()) : QVariant());
+    case 22: return isFirstColumn ? QVariant ("ResetTransformation") : (!aPrs->LocalTransformationGeom().IsNull());
+    default: return QVariant();
   }
+  return QVariant();
+}
 
-  QList<size_t> aSelectedIds; // Remember of selected address in order to avoid duplicates
-  for (QList<TreeModel_ItemBasePtr>::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++)
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemPresentableObject::SetTableData (const int theRow, const int, const QVariant& theValue)
+{
+  Handle(AIS_InteractiveObject) aPrs = GetInteractiveObject();
+  switch (theRow)
   {
-    TreeModel_ItemBasePtr anItem = *anItemIt;
-    VInspector_ItemPresentableObjectPtr aPrsItem = itemDynamicCast<VInspector_ItemPresentableObject>(anItem);
-    if (!aPrsItem)
-      continue;
-    Handle(AIS_InteractiveObject) aPresentation = aPrsItem->GetInteractiveObject();
-    if (aSelectedIds.contains ((size_t)aPresentation.operator->()))
-      continue;
-    aSelectedIds.append ((size_t)aPresentation.operator->());
-    if (!aPresentation.IsNull())
-      aResultList.Append (aPresentation);
+    case 4:
+    {
+      double aValue = theValue.toDouble();
+      if (aValue > 0) aPrs->SetWidth (aValue);
+      else aPrs->UnsetWidth();
+    }
+    break;
+    case 5: aPrs->SetCurrentFacingModel (Aspect::TypeOfFacingModelFromString (theValue.toString().toStdString().c_str()));
+    case 6: aPrs->SetInfiniteState (theValue.toBool());
+    case 12: aPrs->SetAutoHilight(theValue.toBool());
+    case 17: aPrs->SetTypeOfPresentation (PrsMgr::TypeOfPresentation3dFromString (theValue.toString().toStdString().c_str()));
+    case 18: aPrs->SetMutable (theValue.toBool());
+    case 22: if (!theValue.toBool()) aPrs->ResetTransformation();
+    default: return false;
   }
-  return aResultList;
+  return true;
 }
index ed5765200f2757368a6afc18a669c314187e05c8..afabf1dcfb7dff9d25f0478af88de77c02cbbb22 100644 (file)
@@ -55,11 +55,36 @@ public:
   //! Resets cached values
   Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
 
-  //! Returns presentations, which items are selected in tree view
-  //! \param theSelectionModel a selection model
-  //! \return container of presentations
-  Standard_EXPORT static NCollection_List<Handle(AIS_InteractiveObject)> GetSelectedPresentations
-    (QItemSelectionModel* theSelectionModel);
+  //! Returns presentation of the attribute to be visualized in the view
+  //! \thePresentations [out] container of presentation handles to be visualized
+  Standard_EXPORT virtual void GetPresentations (NCollection_List<Handle(Standard_Transient)>& thePresentations);
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
 
 protected:
 
diff --git a/tools/VInspector/VInspector_ItemPresentations.cxx b/tools/VInspector/VInspector_ItemPresentations.cxx
new file mode 100644 (file)
index 0000000..4bfb3dc
--- /dev/null
@@ -0,0 +1,150 @@
+// 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/VInspector_ItemPresentations.hxx>
+
+#include <inspector/VInspector_ItemPresentableObject.hxx>
+#include <inspector/VInspector_ItemPrs3dPresentation.hxx>
+
+#include <AIS_InteractiveObject.hxx>
+#include <PrsMgr_PresentationManager3d.hxx>
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemPresentations::initValue (int theItemRole) const
+{
+  if (Column() != 0 || (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole))
+    return QVariant();
+
+  return "Presentations";
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemPresentations::initRowCount() const
+{
+  if (Column() != 0)
+    return 0;
+
+  VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
+  if (!aParentPrsItem)
+    return 0;
+
+  Handle(AIS_InteractiveObject) aPresentation = aParentPrsItem->GetInteractiveObject();
+
+  int aNbProperties = 0;
+  if (!aPresentation->GetSelectPresentation (NULL).IsNull())
+    aNbProperties++;
+
+  if (!aPresentation->GetHilightPresentation (NULL).IsNull())
+    aNbProperties++;
+
+  for (PrsMgr_Presentations::Iterator aPrsIter (aPresentation->Presentations()); aPrsIter.More(); aPrsIter.Next())
+  {
+    const Handle(PrsMgr_Presentation)& aPrs3d = aPrsIter.ChangeValue().Presentation();
+    if (!aPrs3d.IsNull() && !aPrs3d->Presentation().IsNull())
+      aNbProperties++;
+  }
+  return aNbProperties;
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemPresentations::createChild (int theRow, int theColumn)
+{
+  return VInspector_ItemPrs3dPresentation::CreateItem (currentItem(), theRow, theColumn);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemPresentations::Init()
+{
+  TreeModel_ItemBase::Init(); // to use getIO() without circling initialization
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemPresentations::Reset()
+{
+  VInspector_ItemBase::Reset();
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemPresentations::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemPresentations*>(this)->Init();
+}
+
+// =======================================================================
+// function : GetPresentation
+// purpose :
+// =======================================================================
+Handle(Prs3d_Presentation) VInspector_ItemPresentations::GetPresentation (const int theRowId,
+                                                                           TCollection_AsciiString& theName) const
+{
+  VInspector_ItemPresentableObjectPtr aParentPrsItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
+  if (!aParentPrsItem)
+    return 0;
+
+  Handle(AIS_InteractiveObject) aPresentation = aParentPrsItem->GetInteractiveObject();
+
+  bool aHasSelectedPresentation = !aPresentation->GetSelectPresentation (NULL).IsNull();
+  if (aHasSelectedPresentation && theRowId == 0)
+  {
+    theName = "SelectPresentation";
+    return aPresentation->GetSelectPresentation (NULL);
+  }
+
+  bool aHasHilightPresentation = !aPresentation->GetHilightPresentation (NULL).IsNull();
+  if (aHasHilightPresentation && ((aHasSelectedPresentation && theRowId == 1) || !aHasSelectedPresentation && theRowId == 0))
+  {
+    theName = "HilightPresentation";
+    return aPresentation->GetHilightPresentation (NULL);
+  }
+
+  int aNextPresentationIndex = aHasSelectedPresentation ? 1 : 0;
+  if (aHasHilightPresentation)
+    aNextPresentationIndex++;
+
+  int aCurrentIndex = 0;
+  for (PrsMgr_Presentations::Iterator aPrsIter (aPresentation->Presentations()); aPrsIter.More(); aPrsIter.Next())
+  {
+    const Handle(PrsMgr_Presentation)& aPrs3d = aPrsIter.ChangeValue().Presentation();
+    if (aPrs3d.IsNull() || aPrs3d->Presentation().IsNull())
+      continue;
+    if (theRowId - aNextPresentationIndex == aCurrentIndex)
+    {
+      theName = QString ("Prs3d_Presentation (mode = %1)").arg (aPrsIter.ChangeValue().Mode()).toStdString().c_str();
+      return aPrs3d->Presentation();
+    }
+    aCurrentIndex++;
+  }
+  return Handle(Prs3d_Presentation)();
+}
diff --git a/tools/VInspector/VInspector_ItemPresentations.hxx b/tools/VInspector/VInspector_ItemPresentations.hxx
new file mode 100644 (file)
index 0000000..134302d
--- /dev/null
@@ -0,0 +1,81 @@
+// 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 VInspector_ItemPresentations_H
+#define VInspector_ItemPresentations_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+#include <TCollection_AsciiString.hxx>
+#include <Prs3d_Presentation.hxx>
+
+class VInspector_ItemPresentations;
+typedef QExplicitlySharedDataPointer<VInspector_ItemPresentations> VInspector_ItemPresentationsPtr;
+
+//! \class VInspector_ItemPresentations
+//! Item presents information about AIS_InteractiveObject.
+//! Parent is item context, children are item selections.
+class VInspector_ItemPresentations : public VInspector_ItemBase
+{
+
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemPresentationsPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemPresentationsPtr (new VInspector_ItemPresentations (theParent, theRow, theColumn)); }
+  //! Destructor
+  virtual ~VInspector_ItemPresentations() Standard_OVERRIDE {};
+
+  //! Returns presentation of the parent interactive object
+  //! \return presentation object
+  Standard_EXPORT Handle(Prs3d_Presentation) GetPresentation (const int theRowId, TCollection_AsciiString& theName) const;
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of item selected
+  //! \return rows count
+  virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! Constructor
+  //! param theParent a parent item
+  VInspector_ItemPresentations(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemPrs3dAspect.cxx b/tools/VInspector/VInspector_ItemPrs3dAspect.cxx
new file mode 100644 (file)
index 0000000..7f2e1fd
--- /dev/null
@@ -0,0 +1,1115 @@
+// Created on: 2018-08-26
+// 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/VInspector_ItemPrs3dAspect.hxx>
+#include <inspector/VInspector_ItemPrs3dDrawer.hxx>
+#include <inspector/ViewControl_ColorSelector.hxx>
+#include <inspector/VInspector_Tools.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Aspect.hxx>
+#include <Font.hxx>
+#include <Graphic3d.hxx>
+#include <Graphic3d_AspectLine3d.hxx>
+#include <Graphic3d_AspectMarker3d.hxx>
+#include <Graphic3d_AspectText3d.hxx>
+#include <Prs3d.hxx>
+#include <Prs3d_ArrowAspect.hxx>
+#include <Prs3d_DatumAspect.hxx>
+#include <Prs3d_DimensionAspect.hxx>
+#include <Prs3d_IsoAspect.hxx>
+#include <Prs3d_LineAspect.hxx>
+#include <Prs3d_PlaneAspect.hxx>
+#include <Prs3d_PointAspect.hxx>
+#include <Prs3d_ShadingAspect.hxx>
+#include <Prs3d_TextAspect.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QColor>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+
+QVariant VInspector_ItemPrs3dAspect::initValue (int theItemRole) const
+{
+  if (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole)
+  {
+    Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+    bool aNullAspect = anAspect.IsNull();
+    switch (Column())
+    {
+      case 0:
+      {
+        return theItemRole == Qt::ToolTipRole
+          ? (aNullAspect ? QVariant("Prs3d_BasicAspect is empty") : QVariant (anAspect->DynamicType()->Name()))
+          : QVariant (myName.ToCString());
+      }
+      case 1:
+        return rowCount();
+      case 2:
+      {
+        if (!aNullAspect)
+          return VInspector_Tools::GetPointerInfo (anAspect, true).ToCString();
+        break;
+      }
+      default: break;
+    }
+  }
+  if (theItemRole == Qt::ForegroundRole)
+  {
+    Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+    bool aNullAspect = anAspect.IsNull();
+    if (aNullAspect) return QColor (Qt::lightGray);
+
+    VInspector_ItemPrs3dDrawerPtr aParentItem = itemDynamicCast<VInspector_ItemPrs3dDrawer>(Parent());
+    if (aParentItem)
+    {
+      Handle(Prs3d_Drawer) aDrawer = aParentItem->GetDrawer();
+      if (aDrawer->Link().IsNull())
+        return QVariant(); // default color
+
+      TCollection_AsciiString aName;
+      Standard_Boolean isOwnAspect;
+      aParentItem->GetPrs3dAspect(Row(), aName, isOwnAspect);
+    if (!isOwnAspect)
+      return QColor (Qt::lightGray);
+    }
+    else
+    {
+      VInspector_ItemPrs3dAspectPtr aParentAspectItem = itemDynamicCast<VInspector_ItemPrs3dAspect>(Parent());
+      if (aParentAspectItem)
+        return aParentAspectItem->initValue (theItemRole);
+    }
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+
+int VInspector_ItemPrs3dAspect::initRowCount() const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return 0;
+
+  Standard_CString anAspectKind = anAspect->DynamicType()->Name();
+  if (anAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name())
+    return 3 + 2 * (int) Prs3d_DP_None;
+  else if (anAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name())
+    return 3;
+  else if (anAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name())
+    return 3;
+
+  return 0;
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+
+TreeModel_ItemBasePtr VInspector_ItemPrs3dAspect::createChild (int theRow, int theColumn)
+{
+  return VInspector_ItemPrs3dAspect::CreateItem (currentItem(), theRow, theColumn);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void VInspector_ItemPrs3dAspect::Init()
+{
+  TCollection_AsciiString aName;
+  Handle(Prs3d_BasicAspect) anAspect;
+  VInspector_ItemPrs3dDrawerPtr aParentItem = itemDynamicCast<VInspector_ItemPrs3dDrawer>(Parent());
+
+  if (aParentItem)
+  {
+    Standard_Boolean isOwnAspect;
+    anAspect = aParentItem->GetPrs3dAspect(Row(), aName, isOwnAspect);
+  }
+  else
+  {
+    VInspector_ItemPrs3dAspectPtr aParentAspectItem = itemDynamicCast<VInspector_ItemPrs3dAspect>(Parent());
+    Standard_Boolean isOwnAspect;
+    anAspect = aParentAspectItem->GetPrs3dAspect(Row(), aName, isOwnAspect);
+  }
+
+  setAspect(anAspect, aName);
+  TreeModel_ItemBase::Init(); // to use getIO() without circling initialization
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+
+void VInspector_ItemPrs3dAspect::Reset()
+{
+  VInspector_ItemBase::Reset();
+
+  setAspect (NULL, TCollection_AsciiString());
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+
+void VInspector_ItemPrs3dAspect::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemPrs3dAspect*>(this)->Init();
+}
+
+// =======================================================================
+// function : GetDrawer
+// purpose :
+// =======================================================================
+
+Handle(Prs3d_BasicAspect) VInspector_ItemPrs3dAspect::GetAspect() const
+{
+  initItem();
+  return myAspect;
+}
+
+// =======================================================================
+// function : GetPrs3dAspect
+// purpose :
+// =======================================================================
+
+Handle(Prs3d_BasicAspect) VInspector_ItemPrs3dAspect::GetPrs3dAspect (const int theRow,
+                                                                      TCollection_AsciiString& theName,
+                                                                      Standard_Boolean& theOwnAspect) const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return 0;
+
+  Standard_CString anAspectKind = anAspect->DynamicType()->Name();
+  theOwnAspect = true;
+  if (anAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name())
+  {
+    Handle(Prs3d_DatumAspect) aCustomAspect = Handle(Prs3d_DatumAspect)::DownCast (anAspect);
+    switch (theRow) {
+      case 0: theName = "TextAspect"; return aCustomAspect->TextAspect();
+      case 1: theName = "PointAspect"; return aCustomAspect->PointAspect();
+      case 2: theName = "ArrowAspect"; return aCustomAspect->ArrowAspect();
+      default:
+      {
+        if (theRow >= 3 && theRow < 3 + Prs3d_DP_None)
+        {
+          Prs3d_DatumParts aParts = (Prs3d_DatumParts)(theRow - 3);
+          theName = TCollection_AsciiString ("LineAspect: ") + Prs3d::DatumPartsToString (aParts);
+          return aCustomAspect->LineAspect (aParts);
+        }
+
+        if (theRow >= 3 + Prs3d_DP_None && theRow < 3 + 2 * Prs3d_DP_None)
+        {
+          Prs3d_DatumParts aParts = (Prs3d_DatumParts)(theRow - (3+ Prs3d_DP_None));
+          theName = TCollection_AsciiString ("ShadingAspect: ") + Prs3d::DatumPartsToString (aParts);
+          return aCustomAspect->ShadingAspect (aParts);
+        }
+      }
+      break;
+    }
+  }
+  else if (anAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name())
+  {
+    Handle(Prs3d_PlaneAspect) aCustomAspect = Handle(Prs3d_PlaneAspect)::DownCast (anAspect);
+    switch (theRow)
+    {
+      case 0: theName = "EdgesAspect"; return aCustomAspect->EdgesAspect();
+      case 1: theName = "IsoAspect"; return aCustomAspect->IsoAspect();
+      case 2: theName = "ArrowAspect"; return aCustomAspect->ArrowAspect();
+    }
+  }
+  else if (anAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name())
+  {
+    Handle(Prs3d_DimensionAspect) aCustomAspect = Handle(Prs3d_DimensionAspect)::DownCast (anAspect);
+    switch (theRow)
+    {
+      case 0: theName = "LineAspect"; return aCustomAspect->LineAspect();
+      case 1: theName = "TextAspect"; return aCustomAspect->TextAspect();
+      case 2: theName = "ArrowAspect"; return aCustomAspect->ArrowAspect();
+    }
+  }
+
+  theName = "None";
+  return Handle(Prs3d_BasicAspect)();
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemPrs3dAspect::GetTableRowCount() const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return 0;
+
+  return getTableRowCount (anAspect->DynamicType()->Name());
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemPrs3dAspect::GetTableEditType (const int theRow, const int) const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return ViewControl_EditType_None;
+
+  return getTableEditType (theRow, anAspect->DynamicType()->Name(), 0);
+}
+
+// =======================================================================
+// function : GetTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemPrs3dAspect::GetTableEnumValues (const int theRow, const int) const
+{
+  QList<QVariant> aValues;
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return aValues;
+
+  return getTableEnumValues (theRow, anAspect->DynamicType()->Name(), 0);
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemPrs3dAspect::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return QVariant();
+
+  return getTableData (theRow, theColumn, theRole, anAspect->DynamicType()->Name(), 0);
+}
+
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemPrs3dAspect::SetTableData (const int theRow, const int, const QVariant& theValue)
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return false;
+
+  return setTableData (theRow, anAspect->DynamicType()->Name(), 0, theValue);
+}
+
+
+// =======================================================================
+// function : getTableRowCount
+// purpose :
+// =======================================================================
+
+int VInspector_ItemPrs3dAspect::getTableRowCount (const TCollection_AsciiString& theAspectKind) const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return 0;
+
+  if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name())
+    return 3 + (Prs3d_DP_ShadingNumberOfFacettes + 1);
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name())
+    return 1 + getTableRowCount (STANDARD_TYPE (Prs3d_LineAspect)->Name());
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name())
+    return 3; // TODO: add Graphic3d_ShaderProgram
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name())
+    return 3; // TODO: add Graphic3d_ShaderProgram, Graphic3d_MarkerImage
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name())
+    return 15; // TODO: add Graphic3d_ShaderProgram
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name())
+    return 10;
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name())
+    return 2 + 3; // TODO: add Graphic3d_ShaderProgram
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name())
+    return 10;
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name())
+    return 17; // TODO: Graphic3d_ShaderProgram, Graphic3d_TextureSet, Graphic3d_MaterialAspect
+
+  return 0;
+}
+
+// =======================================================================
+// function : getTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemPrs3dAspect::getTableEditType (const int theRow,
+                                                                   const TCollection_AsciiString& theAspectKind,
+                                                                   const int theStartRow) const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return ViewControl_EditType_None;
+
+  int aRow = theRow - theStartRow;
+  if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name())
+  {
+    switch (aRow)
+    {
+      case 0: return ViewControl_EditType_Combo;
+      case 1: return ViewControl_EditType_Bool;
+      case 2: return ViewControl_EditType_Bool;
+      default:
+      {
+        if (theRow >= 3 && theRow <= 3 + Prs3d_DP_ShadingNumberOfFacettes)
+          return ViewControl_EditType_Double;
+        break;
+      }
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name())
+  {
+    switch (aRow)
+    {
+      case 0:  return ViewControl_EditType_Spin;
+      default: return getTableEditType (theRow, STANDARD_TYPE (Prs3d_LineAspect)->Name(), 1);
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name())
+  {
+    switch (aRow)
+    {
+      case 0: return ViewControl_EditType_Color;
+      case 1: return ViewControl_EditType_Combo;
+      case 2: return ViewControl_EditType_Double;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name())
+  {
+    switch (aRow)
+    {
+      case 0: return ViewControl_EditType_Color;
+      case 1: return ViewControl_EditType_Combo;
+      case 2: return ViewControl_EditType_Double;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name())
+  {
+    switch (aRow)
+    {
+      case 0: return ViewControl_EditType_Double;
+      case 1: return ViewControl_EditType_Double;
+      case 2: return ViewControl_EditType_Combo;
+      case 3: return ViewControl_EditType_Combo;
+      case 4: return ViewControl_EditType_Combo;
+      case 5: return ViewControl_EditType_Line;
+      case 6: return ViewControl_EditType_Color;
+      case 7: return ViewControl_EditType_Double;
+      case 8: return ViewControl_EditType_Double;
+      case 9: return ViewControl_EditType_Combo;
+      case 10: return ViewControl_EditType_Combo;
+      case 11: return ViewControl_EditType_Color;
+      case 12: return ViewControl_EditType_Bool;
+      case 13: return ViewControl_EditType_Double;
+      case 14: return ViewControl_EditType_Combo;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name())
+  {
+    if (aRow >= 0 && aRow < 6 ) return ViewControl_EditType_Double;
+    if (aRow >= 6 && aRow < 16 ) return ViewControl_EditType_Bool;
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name())
+  {
+    switch (aRow)
+    {
+      case 0: return ViewControl_EditType_Double;
+      case 1: return ViewControl_EditType_Double;
+
+      case 2: return ViewControl_EditType_Color;
+      case 3: return ViewControl_EditType_Combo;
+      case 4: return ViewControl_EditType_Double;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name())
+  {
+    switch (aRow)
+    {
+      case 0: return ViewControl_EditType_Line;
+      case 1: return ViewControl_EditType_Double;
+      case 2: return ViewControl_EditType_Double;
+
+      case 3: return ViewControl_EditType_Combo;
+      case 4: return ViewControl_EditType_Combo;
+      case 5: return ViewControl_EditType_Combo;
+
+      case 6: return ViewControl_EditType_Bool;
+      case 7: return ViewControl_EditType_Bool;
+      case 8: return ViewControl_EditType_Bool;
+      case 9: return ViewControl_EditType_Bool;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name())
+  {
+    switch (aRow)
+    {
+      case 0: return ViewControl_EditType_Color;
+      case 1: return ViewControl_EditType_Color;
+      case 2: return ViewControl_EditType_Color;
+
+      case 3: return ViewControl_EditType_Combo;
+      case 4: return ViewControl_EditType_Combo;
+      case 5: return ViewControl_EditType_Combo;
+
+      case 6: return ViewControl_EditType_Double;
+      case 7: return ViewControl_EditType_Combo;
+      case 8: return ViewControl_EditType_Double;
+      case 9: return ViewControl_EditType_Combo; // Graphic3d_HatchStyle is not modified
+      case 10: return ViewControl_EditType_Combo;
+      case 11: return ViewControl_EditType_Double;
+      case 12: return ViewControl_EditType_Double;
+
+      case 13: return ViewControl_EditType_Bool;
+      case 14: return ViewControl_EditType_Bool;
+      case 15: return ViewControl_EditType_Bool;
+      case 16: return ViewControl_EditType_Bool;
+      default: break;
+    }
+  }
+
+  return ViewControl_EditType_None;
+}
+
+// =======================================================================
+// function : getTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemPrs3dAspect::getTableEnumValues (const int theRow,
+                                                                const TCollection_AsciiString& theAspectKind,
+                                                                const int theStartRow) const
+{
+  QList<QVariant> aValues;
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return aValues;
+
+  int aRow = theRow - theStartRow;
+  if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name())
+  {
+    Handle(Prs3d_DatumAspect) aCustomAspect = Handle(Prs3d_DatumAspect)::DownCast (anAspect);
+    if (aRow == 0)
+    {
+      for (int i = 0; i <= Prs3d_DA_XYZAxis; i++)
+        aValues.append (Prs3d::DatumAxesToString ((Prs3d_DatumAxes)i));
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name())
+  {
+    Handle(Prs3d_IsoAspect) aCustomAspect = Handle(Prs3d_IsoAspect)::DownCast (anAspect);
+    if (aRow > 0)
+      return getTableEnumValues (theRow, STANDARD_TYPE (Prs3d_LineAspect)->Name(), 1);
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name())
+  {
+    if (aRow == 1)
+    {
+      for (int i = 0; i <= Aspect_TOL_USERDEFINED; i++)
+        aValues.append (Aspect::TypeOfLineToString ((Aspect_TypeOfLine)i));
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name())
+  {
+    if (aRow == 1)
+    {
+      for (int i = Aspect_TOM_EMPTY; i <= Aspect_TOM_USERDEFINED; i++)
+        aValues.append (Aspect::TypeOfMarkerToString ((Aspect_TypeOfMarker)i));
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name())
+  {
+    if (theRow == 2)
+    {
+      for (int i = Graphic3d_HTA_LEFT; i <= Graphic3d_HTA_RIGHT; i++)
+        aValues.append (Graphic3d::HorizontalTextAlignmentToString ((Graphic3d_HorizontalTextAlignment)i));
+    }
+    else if (theRow == 3)
+    {
+      for (int i = Graphic3d_VTA_BOTTOM; i <= Graphic3d_VTA_TOPFIRSTLINE; i++)
+        aValues.append (Graphic3d::VerticalTextAlignmentToString ((Graphic3d_VerticalTextAlignment)i));
+    }
+    else if (theRow == 4)
+    {
+      for (int i = Graphic3d_TP_UP; i <= Graphic3d_TP_RIGHT; i++)
+        aValues.append (Graphic3d::TextPathToString ((Graphic3d_TextPath)i));
+    }
+    else if (theRow == 9)
+    {
+      for (int i = Aspect_TOST_NORMAL; i <= Aspect_TOST_ANNOTATION; i++)
+        aValues.append (Aspect::TypeOfStyleTextToString ((Aspect_TypeOfStyleText)i));
+    }
+    else if (theRow == 10)
+    {
+      for (int i = Aspect_TODT_NORMAL; i <= Aspect_TODT_SHADOW; i++)
+        aValues.append (Aspect::TypeOfDisplayTextToString ((Aspect_TypeOfDisplayText)i));
+    }
+    else if (theRow == 14)
+    {
+      for (int i = Font_FA_Undefined; i <= Font_FA_BoldItalic; i++)
+        aValues.append (Font::FontAspectToString ((Font_FontAspect)i));
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name())
+  {
+    if  (theRow == 0)
+    {
+      QList<QVariant> aValues;
+      aValues << 0 << M_PI / 2.0 << 6;
+      return aValues;
+    }
+    else if (aRow == 3)
+    {
+      for (int i = 0; i <= Aspect_TOL_USERDEFINED; i++)
+        aValues.append (Aspect::TypeOfLineToString ((Aspect_TypeOfLine)i));
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name())
+  {
+    if (aRow == 3)
+    {
+      for (int i = 0; i <= Prs3d_DAO_Fit; i++)
+        aValues.append (Prs3d::DimensionArrowOrientationToString ((Prs3d_DimensionArrowOrientation)i));
+    }
+    if (aRow == 4)
+    {
+      for (int i = 0; i <= Prs3d_DTHP_Fit; i++)
+        aValues.append (Prs3d::DimensionTextHorizontalPositionToString ((Prs3d_DimensionTextHorizontalPosition)i));
+    }
+    if (aRow == 5)
+    {
+      for (int i = 0; i <= Prs3d_DTVP_Center; i++)
+        aValues.append (Prs3d::DimensionTextVerticalPositionToString ((Prs3d_DimensionTextVerticalPosition)i));
+    }
+  }
+
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name())
+  {
+    if (aRow == 3)
+    {
+      for (int i = 0; i <= Aspect_IS_POINT; i++)
+        aValues.append (Aspect::InteriorStyleToString ((Aspect_InteriorStyle)i));
+    }
+    else if (aRow == 4)
+    {
+      for (int i = Graphic3d_TOSM_DEFAULT; i <= Graphic3d_TOSM_FRAGMENT; i++)
+        aValues.append (Graphic3d::TypeOfShadingModelToString ((Graphic3d_TypeOfShadingModel)i));
+    }
+    else if (aRow == 5)
+    {
+      for (int i = Graphic3d_AlphaMode_BlendAuto; i <= Graphic3d_AlphaMode_Blend; i++)
+        aValues.append (Graphic3d::AlphaModeToString ((Graphic3d_AlphaMode)i));
+    }
+    else if (aRow == 7)
+    {
+      for (int i = 0; i <= Aspect_TOL_USERDEFINED; i++)
+        aValues.append (Aspect::TypeOfLineToString ((Aspect_TypeOfLine)i));
+    }
+    else if (aRow == 9) //Aspect_HatchStyle
+    {
+      for (int i = 0; i <= Aspect_HS_NB; i++)
+        aValues.append (Aspect::HatchStyleToString ((Aspect_HatchStyle)i));
+    }
+    else if (aRow == 10) //Aspect_PolygonOffsetMode
+    {
+       aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Off));
+       aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Fill));
+       aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Line));
+       aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Point));
+       aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_All));
+       aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_None));
+       aValues.append (Aspect::PolygonOffsetModeToString (Aspect_POM_Mask));
+    }
+  }
+
+  return aValues;
+}
+
+// =======================================================================
+// function : getTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemPrs3dAspect::getTableData (const int theRow,
+                                                   const int theColumn,
+                                                   const int theRole,
+                                                   const TCollection_AsciiString& theAspectKind,
+                                                   const int theStartRow) const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+  int aRow = theRow - theStartRow;
+
+  if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name())
+  {
+    if (theRole != Qt::DisplayRole)
+      return QVariant();
+
+    Handle(Prs3d_DatumAspect) aCustomAspect = Handle(Prs3d_DatumAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("DatumAxes") : QVariant (Prs3d::DatumAxesToString (aCustomAspect->DatumAxes()));
+      case 1: return isFirstColumn ? QVariant ("DrawLabels") : QVariant (aCustomAspect->ToDrawLabels());
+      case 2: return isFirstColumn ? QVariant ("DrawArrows") : QVariant (aCustomAspect->ToDrawArrows());
+      default:
+      {
+        if (theRow >= 3 && theRow <= 3 + Prs3d_DP_ShadingNumberOfFacettes)
+        {
+          Prs3d_DatumAttribute aType = (Prs3d_DatumAttribute)(theRow - 3);
+          return isFirstColumn ? QVariant (Prs3d::DatumAttributeToString (aType))
+                               : ViewControl_Tools::ToVariant (aCustomAspect->Attribute (aType));
+        }
+        break;
+      }
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name())
+  {
+    Handle(Prs3d_IsoAspect) aCustomAspect = Handle(Prs3d_IsoAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0:
+      {
+        if (theRole != Qt::DisplayRole) return QVariant();
+        else return isFirstColumn ? QVariant ("Number") : QVariant (aCustomAspect->Number());
+      }
+      default: return getTableData (theRow, theColumn, theRole, STANDARD_TYPE (Prs3d_LineAspect)->Name(), 1);
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name())
+  {
+    if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole ||
+        (theRole == Qt::BackgroundRole && (isFirstColumn || aRow != 0)))
+      return QVariant();
+
+    Handle(Prs3d_LineAspect) aCustomAspect = Handle(Prs3d_LineAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: return getColorData("ColorRGBA", aCustomAspect->Aspect()->ColorRGBA(), isFirstColumn, theRole);
+      case 1: return isFirstColumn ? QVariant ("Type")
+                                  : QVariant (Aspect::TypeOfLineToString (aCustomAspect->Aspect()->Type()));
+      case 2: return isFirstColumn ? QVariant ("Width") : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->Width());
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name())
+  {
+    if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole ||
+        (theRole == Qt::BackgroundRole && (isFirstColumn || aRow != 0)))
+      return QVariant();
+
+    Handle(Prs3d_PointAspect) aCustomAspect = Handle(Prs3d_PointAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: return getColorData("ColorRGBA", aCustomAspect->Aspect()->ColorRGBA(), isFirstColumn, theRole);
+      case 1: return isFirstColumn ? QVariant ("Type")
+                                  : QVariant (Aspect::TypeOfMarkerToString (aCustomAspect->Aspect()->Type()));
+      case 2: return isFirstColumn ? QVariant ("Scale") : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->Scale());
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name())
+  {
+    if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole ||
+       (theRole == Qt::BackgroundRole && (isFirstColumn || (aRow != 6 && theRow != 11))))
+      return QVariant();
+
+    Handle(Prs3d_TextAspect) aCustomAspect = Handle(Prs3d_TextAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("Angle") : ViewControl_Tools::ToVariant (aCustomAspect->Angle());
+      case 1: return isFirstColumn ? QVariant ("Height") : ViewControl_Tools::ToVariant (aCustomAspect->Height());
+      case 2: return isFirstColumn ? QVariant ("HorizontalJustification")
+                                   : QVariant (Graphic3d::HorizontalTextAlignmentToString (aCustomAspect->HorizontalJustification()));
+      case 3: return isFirstColumn ? QVariant ("VerticalJustification")
+                                   : QVariant (Graphic3d::VerticalTextAlignmentToString (aCustomAspect->VerticalJustification()));
+      case 4: return isFirstColumn ? QVariant ("Orientation") : QVariant (Graphic3d::TextPathToString (aCustomAspect->Orientation()));
+      // Graphic3d_AspectText3d attributes
+      case 5: return isFirstColumn ? QVariant ("Font") : QVariant (aCustomAspect->Aspect()->Font().ToCString());
+      case 6: return getColorData("ColorRGBA", aCustomAspect->Aspect()->ColorRGBA(), isFirstColumn, theRole);
+      case 7: return isFirstColumn ? QVariant ("ExpansionFactor")
+                                   : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->ExpansionFactor());
+      case 8: return isFirstColumn ? QVariant ("Space")
+                                   : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->Space());
+      case 9: return isFirstColumn ? QVariant ("Style")
+                                   : QVariant (Aspect::TypeOfStyleTextToString (aCustomAspect->Aspect()->Style()));
+      case 10: return isFirstColumn ? QVariant ("DisplayType")
+                                    : QVariant (Aspect::TypeOfDisplayTextToString (aCustomAspect->Aspect()->DisplayType()));
+      case 11: return getColorData("ColorSubTitleRGBA", aCustomAspect->Aspect()->ColorSubTitleRGBA(), isFirstColumn, theRole);
+      case 12: return isFirstColumn ? QVariant ("TextZoomable") : QVariant (aCustomAspect->Aspect()->GetTextZoomable());
+      case 13: return isFirstColumn ? QVariant ("TextAngle")
+                                    : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->GetTextAngle());
+      case 14: return isFirstColumn ? QVariant ("TextFontAspect")
+                                    : QVariant (Font::FontAspectToString (aCustomAspect->Aspect()->GetTextFontAspect()));
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name())
+  {
+    if (theRole != Qt::DisplayRole)
+      return QVariant();
+
+    Handle(Prs3d_PlaneAspect) aCustomAspect = Handle(Prs3d_PlaneAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("ArrowsLength") : ViewControl_Tools::ToVariant (aCustomAspect->ArrowsLength());
+      case 1: return isFirstColumn ? QVariant ("ArrowsSize") : ViewControl_Tools::ToVariant (aCustomAspect->ArrowsSize());
+      case 2: return isFirstColumn ? QVariant ("ArrowsAngle") : ViewControl_Tools::ToVariant (aCustomAspect->ArrowsAngle());
+      case 3: return isFirstColumn ? QVariant ("PlaneXLength") : ViewControl_Tools::ToVariant (aCustomAspect->PlaneXLength());
+      case 4: return isFirstColumn ? QVariant ("PlaneYLength") : ViewControl_Tools::ToVariant (aCustomAspect->PlaneYLength());
+      case 5: return isFirstColumn ? QVariant ("IsoDistance") : ViewControl_Tools::ToVariant (aCustomAspect->IsoDistance());
+
+      case 6: return isFirstColumn ? QVariant ("DisplayCenterArrow") : aCustomAspect->DisplayCenterArrow();
+      case 7: return isFirstColumn ? QVariant ("DisplayEdgesArrows") : aCustomAspect->DisplayEdgesArrows();
+      case 8: return isFirstColumn ? QVariant ("DisplayEdges") : aCustomAspect->DisplayEdges();
+      case 9: return isFirstColumn ? QVariant ("DisplayIso") : aCustomAspect->DisplayIso();
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name())
+  {
+    if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole ||
+        (theRole == Qt::BackgroundRole && (isFirstColumn || aRow != 2)))
+      return QVariant();
+
+    Handle(Prs3d_ArrowAspect) aCustomAspect = Handle(Prs3d_ArrowAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("Angle") : ViewControl_Tools::ToVariant (aCustomAspect->Angle());
+      case 1: return isFirstColumn ? QVariant ("Length") : ViewControl_Tools::ToVariant (aCustomAspect->Length());
+      case 2: return getColorData("ColorRGBA", aCustomAspect->Aspect()->ColorRGBA(), isFirstColumn, theRole);
+      case 3: return isFirstColumn ? QVariant ("Type")
+                                  : QVariant (Aspect::TypeOfLineToString (aCustomAspect->Aspect()->Type()));
+      case 4: return isFirstColumn ? QVariant ("Width") : ViewControl_Tools::ToVariant (aCustomAspect->Aspect()->Width());
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name())
+  {
+    if (theRole != Qt::DisplayRole)
+      return QVariant();
+
+    Handle(Prs3d_DimensionAspect) aCustomAspect = Handle(Prs3d_DimensionAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("ValueStringFormat") : QVariant (aCustomAspect->ValueStringFormat().ToCString());
+      case 1: return isFirstColumn ? QVariant ("ExtensionSize") : ViewControl_Tools::ToVariant (aCustomAspect->ExtensionSize());
+      case 2: return isFirstColumn ? QVariant ("ArrowTailSize") : ViewControl_Tools::ToVariant (aCustomAspect->ArrowTailSize());
+
+      case 3: return isFirstColumn ? QVariant ("ArrowOrientation")
+                                  : QVariant (Prs3d::DimensionArrowOrientationToString (aCustomAspect->ArrowOrientation()));
+      case 4: return isFirstColumn ? QVariant ("TextHorizontalPosition")
+                                  : QVariant (Prs3d::DimensionTextHorizontalPositionToString (aCustomAspect->TextHorizontalPosition()));
+      case 5: return isFirstColumn ? QVariant ("TextVerticalPosition")
+                                  : QVariant (Prs3d::DimensionTextVerticalPositionToString (aCustomAspect->TextVerticalPosition()));
+
+      case 6: return isFirstColumn ? QVariant ("IsUnitsDisplayed") : aCustomAspect->IsUnitsDisplayed();
+      case 7: return isFirstColumn ? QVariant ("IsText3d") : aCustomAspect->IsText3d();
+      case 8: return isFirstColumn ? QVariant ("IsTextShaded") : aCustomAspect->IsTextShaded();
+      case 9: return isFirstColumn ? QVariant ("IsArrows3d") : aCustomAspect->IsArrows3d();
+
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name())
+  {
+    if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole ||
+       (theRole == Qt::BackgroundRole && (isFirstColumn || (aRow != 0 && theRow != 1 && theRow != 2))))
+      return QVariant();
+
+    Handle(Prs3d_ShadingAspect) aCustomAspect = Handle(Prs3d_ShadingAspect)::DownCast (anAspect);
+    Handle(Graphic3d_AspectFillArea3d) anAspect = aCustomAspect->Aspect();
+    switch (aRow)
+    {
+      case 0: return getColorData("InteriorColorRGBA", anAspect->InteriorColorRGBA(), isFirstColumn, theRole);
+      case 1: return getColorData("BackInteriorColorRGBA", anAspect->BackInteriorColorRGBA(), isFirstColumn, theRole);
+      case 2: return getColorData("EdgeColorRGBA", anAspect->EdgeColorRGBA(), isFirstColumn, theRole);
+      case 3: return isFirstColumn ? QVariant ("InteriorStyle")
+                                   : QVariant (Aspect::InteriorStyleToString (anAspect->InteriorStyle()));
+      case 4: return isFirstColumn ? QVariant ("ShadingModel")
+                                   : QVariant (Graphic3d::TypeOfShadingModelToString (anAspect->ShadingModel()));
+      case 5: return isFirstColumn ? QVariant ("AlphaMode")
+                                   : QVariant (Graphic3d::AlphaModeToString (anAspect->AlphaMode()));
+      case 6: return isFirstColumn ? QVariant ("AlphaCutoff") : ViewControl_Tools::ToVariant (anAspect->AlphaCutoff());
+      case 7: return isFirstColumn ? QVariant ("EdgeLineType")
+                                   : QVariant (Aspect::TypeOfLineToString (anAspect->EdgeLineType()));
+      case 8:  return isFirstColumn ? QVariant ("EdgeWidth") : ViewControl_Tools::ToVariant (anAspect->EdgeWidth());
+      case 9: return isFirstColumn ? QVariant ("HatchStyle: Type")
+                                   : (!anAspect->HatchStyle().IsNull() ? QVariant (Aspect::HatchStyleToString
+                                                   ((Aspect_HatchStyle)anAspect->HatchStyle()->HatchType())) : QVariant());
+      case 10: return isFirstColumn ? QVariant ("PolygonOffset: Mode")
+                                   : QVariant (Aspect::PolygonOffsetModeToString (anAspect->PolygonOffset().Mode));
+      case 11: return isFirstColumn ? QVariant ("PolygonOffset: Factor")
+                                    : ViewControl_Tools::ToVariant (anAspect->PolygonOffset().Factor);
+      case 12: return isFirstColumn ? QVariant ("PolygonOffset: Units")
+                                    : ViewControl_Tools::ToVariant (anAspect->PolygonOffset().Units);
+      case 13: return isFirstColumn ? QVariant ("Distinguish") : anAspect->Distinguish();
+      case 14: return isFirstColumn ? QVariant ("ToDrawEdges") : anAspect->ToDrawEdges();
+      case 15: return isFirstColumn ? QVariant ("ToSuppressBackFaces") : anAspect->ToSuppressBackFaces();
+      case 16: return isFirstColumn ? QVariant ("ToMapTexture") : anAspect->ToMapTexture();
+      default: break;
+    }
+  }
+
+  return QVariant();
+}
+
+// =======================================================================
+// function : setTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemPrs3dAspect::setTableData (const int theRow,
+                                               const TCollection_AsciiString& theAspectKind,
+                                               const int theStartRow,
+                                               const QVariant& theValue) const
+{
+  Handle(Prs3d_BasicAspect) anAspect = GetAspect();
+  if (anAspect.IsNull())
+    return false;
+
+  int aRow = theRow - theStartRow;
+  if (theAspectKind == STANDARD_TYPE (Prs3d_DatumAspect)->Name())
+  {
+    Handle(Prs3d_DatumAspect) aCustomAspect = Handle(Prs3d_DatumAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: aCustomAspect->SetDrawDatumAxes (Prs3d::DatumAxesFromString (theValue.toString().toStdString().c_str())); break;
+      case 1: aCustomAspect->SetDrawLabels (theValue.toBool()); break;
+      case 2: aCustomAspect->SetDrawArrows (theValue.toBool()); break;
+      default:
+      {
+        if (theRow >= 3 && theRow <= 3 + Prs3d_DP_ShadingNumberOfFacettes)
+        {
+          Prs3d_DatumAttribute aType = (Prs3d_DatumAttribute)(theRow - 3);
+          aCustomAspect->SetAttribute (aType, ViewControl_Tools::ToRealValue (theValue));
+        }
+        break;
+      }
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_IsoAspect)->Name())
+  {
+    Handle(Prs3d_IsoAspect) aCustomAspect = Handle(Prs3d_IsoAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: aCustomAspect->SetNumber(theValue.toInt()); break;
+      default: setTableData (theRow, STANDARD_TYPE (Prs3d_LineAspect)->Name(), 1, theValue); break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_LineAspect)->Name())
+  {
+    Handle(Prs3d_LineAspect) aCustomAspect = Handle(Prs3d_LineAspect)::DownCast (anAspect);
+    Handle(Graphic3d_AspectLine3d) anAspect = aCustomAspect->Aspect();
+    switch (aRow)
+    {
+      case 0: anAspect->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break;
+      case 1: anAspect->SetType (Aspect::TypeOfLineFromString (theValue.toString().toStdString().c_str())); break;
+      case 2: anAspect->SetWidth (ViewControl_Tools::ToShortRealValue (theValue)); break;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PointAspect)->Name())
+  {
+    Handle(Prs3d_PointAspect) aCustomAspect = Handle(Prs3d_PointAspect)::DownCast (anAspect);
+    Handle(Graphic3d_AspectMarker3d) anAspect = aCustomAspect->Aspect();
+    switch (aRow)
+    {
+      case 0: anAspect->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break;
+      case 1: anAspect->SetType (Aspect::TypeOfMarkerFromString (theValue.toString().toStdString().c_str())); break;
+      case 2: anAspect->SetScale (ViewControl_Tools::ToShortRealValue (theValue)); break;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_TextAspect)->Name())
+  {
+    Handle(Prs3d_TextAspect) aCustomAspect = Handle(Prs3d_TextAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: aCustomAspect->SetAngle (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 1: aCustomAspect->SetHeight (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 2: aCustomAspect->SetHorizontalJustification (Graphic3d::HorizontalTextAlignmentFromString
+        (theValue.toString().toStdString().c_str())); break;
+      case 3: aCustomAspect->SetVerticalJustification (Graphic3d::VerticalTextAlignmentFromString
+        (theValue.toString().toStdString().c_str())); break;
+      case 4: aCustomAspect->SetOrientation (Graphic3d::TextPathFromString (theValue.toString().toStdString().c_str())); break;
+      // Graphic3d_AspectText3d attributes
+      case 5: aCustomAspect->Aspect()->SetFont (theValue.toString().toStdString().c_str()); break;
+      case 6: aCustomAspect->Aspect()->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break;
+      case 7: aCustomAspect->Aspect()->SetExpansionFactor (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 8: aCustomAspect->Aspect()->SetSpace (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 9: aCustomAspect->Aspect()->SetStyle (Aspect::TypeOfStyleTextFromString (theValue.toString().toStdString().c_str())); break;
+      case 10: aCustomAspect->Aspect()->SetDisplayType (Aspect::TypeOfDisplayTextFromString (theValue.toString().toStdString().c_str())); break;
+      case 11: aCustomAspect->Aspect()->SetColorSubTitle (ViewControl_ColorSelector::StringToColor (theValue.toString())); break;
+      case 12: aCustomAspect->Aspect()->SetTextZoomable (theValue.toBool()); break;
+      case 13: aCustomAspect->Aspect()->SetTextAngle (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 14: aCustomAspect->Aspect()->SetTextFontAspect (Font::FontAspectFromString (theValue.toString().toStdString().c_str())); break;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_PlaneAspect)->Name())
+  {
+    Handle(Prs3d_PlaneAspect) aCustomAspect = Handle(Prs3d_PlaneAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: aCustomAspect->SetArrowsLength (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 1: aCustomAspect->SetArrowsSize (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 2: aCustomAspect->SetArrowsAngle (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 3: aCustomAspect->SetPlaneLength (ViewControl_Tools::ToRealValue (theValue),
+                                             aCustomAspect->PlaneYLength()); break;
+      case 4: aCustomAspect->SetPlaneLength (aCustomAspect->PlaneXLength(),
+                                             ViewControl_Tools::ToRealValue (theValue)); break;
+      case 5: aCustomAspect->SetIsoDistance (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 6: aCustomAspect->SetDisplayCenterArrow (theValue.toBool()); break;
+      case 7: aCustomAspect->SetDisplayEdgesArrows (theValue.toBool()); break;
+      case 8: aCustomAspect->SetDisplayEdges (theValue.toBool()); break;
+      case 9: aCustomAspect->SetDisplayIso (theValue.toBool()); break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ArrowAspect)->Name())
+  {
+    Handle(Prs3d_ArrowAspect) aCustomAspect = Handle(Prs3d_ArrowAspect)::DownCast (anAspect);
+    Handle(Graphic3d_AspectLine3d) anAspect = aCustomAspect->Aspect();
+    switch (aRow)
+    {
+      case 0: aCustomAspect->SetAngle (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 1: aCustomAspect->SetLength (ViewControl_Tools::ToRealValue (theValue)); break;
+
+      case 2: anAspect->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break;
+      case 3: anAspect->SetType (Aspect::TypeOfLineFromString (theValue.toString().toStdString().c_str())); break;
+      case 4: anAspect->SetWidth (ViewControl_Tools::ToShortRealValue (theValue)); break;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_DimensionAspect)->Name())
+  {
+    Handle(Prs3d_DimensionAspect) aCustomAspect = Handle(Prs3d_DimensionAspect)::DownCast (anAspect);
+    switch (aRow)
+    {
+      case 0: aCustomAspect->SetValueStringFormat (theValue.toString().toStdString().c_str()); break;
+      case 1: aCustomAspect->SetExtensionSize (ViewControl_Tools::ToRealValue (theValue)); break;
+      case 2: aCustomAspect->SetArrowTailSize (ViewControl_Tools::ToRealValue (theValue)); break;
+
+      case 3: aCustomAspect->SetArrowOrientation (Prs3d::DimensionArrowOrientationFromString (
+                                                  theValue.toString().toStdString().c_str())); break;
+      case 4: aCustomAspect->SetTextHorizontalPosition (Prs3d::DimensionTextHorizontalPositionFromString (
+                                                        theValue.toString().toStdString().c_str())); break;
+      case 5: aCustomAspect->SetTextVerticalPosition (Prs3d::DimensionTextVerticalPositionFromString (
+                                                      theValue.toString().toStdString().c_str())); break;
+      case 6: aCustomAspect->MakeUnitsDisplayed (theValue.toBool()); break;
+      case 7: aCustomAspect->MakeText3d (theValue.toBool()); break;
+      case 8: aCustomAspect->MakeTextShaded (theValue.toBool()); break;
+      case 9: aCustomAspect->MakeArrows3d (theValue.toBool()); break;
+      default: break;
+    }
+  }
+  else if (theAspectKind == STANDARD_TYPE (Prs3d_ShadingAspect)->Name())
+  {
+    Handle(Prs3d_ShadingAspect) aCustomAspect = Handle(Prs3d_ShadingAspect)::DownCast (anAspect);
+    Handle(Graphic3d_AspectFillArea3d) anAspect = aCustomAspect->Aspect();
+    switch (aRow)
+    {
+      case 0: anAspect->SetInteriorColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break;
+      case 1: anAspect->SetBackInteriorColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break;
+      case 2: anAspect->SetEdgeColor (ViewControl_ColorSelector::StringToColor (theValue.toString())); break;
+      case 3: anAspect->SetInteriorStyle (Aspect::InteriorStyleFromString (
+                                          theValue.toString().toStdString().c_str())); break;
+      case 4: anAspect->SetShadingModel (Graphic3d::TypeOfShadingModelFromString (
+                                         theValue.toString().toStdString().c_str())); break;
+      case 5:
+      case 6:
+      {
+        Graphic3d_AlphaMode aMode = anAspect->AlphaMode();
+        Standard_ShortReal aCutoff = anAspect->AlphaCutoff();
+        if (aRow == 5)
+          aMode = Graphic3d::AlphaModeFromString (theValue.toString().toStdString().c_str());
+        else
+          aCutoff = ViewControl_Tools::ToShortRealValue (theValue);
+        anAspect->SetAlphaMode (aMode, aCutoff);
+        break;
+      }
+      case 7: anAspect->SetEdgeLineType (Aspect::TypeOfLineFromString (
+                                         theValue.toString().toStdString().c_str())); break;
+      case 8: anAspect->SetEdgeWidth (ViewControl_Tools::ToShortRealValue (theValue)); break;
+      case 9: break; // Graphic3d_HatchStyle is not modified
+
+      case 10:
+      case 11:
+      case 12:
+      {
+        Standard_Integer aMode;
+        Standard_ShortReal aFactor, aUnits;
+        anAspect->PolygonOffsets (aMode, aFactor, aUnits);
+        if (aRow == 10)
+          aMode = Aspect::PolygonOffsetModeFromString (theValue.toString().toStdString().c_str());
+        else if (aRow == 11)
+          aFactor = ViewControl_Tools::ToShortRealValue (theValue);
+        else if (aRow == 12)
+          aUnits = ViewControl_Tools::ToShortRealValue (theValue);
+
+        anAspect->SetPolygonOffsets (aMode, aFactor, aUnits);
+        break;
+      }
+      case 13: anAspect->SetDistinguish (theValue.toBool()); break;
+      case 14: anAspect->SetDrawEdges (theValue.toBool()); break;
+      case 15: anAspect->SetSuppressBackFaces (theValue.toBool()); break;
+      case 16: anAspect->SetTextureMapOn (theValue.toBool()); break;
+      default: break;
+    }
+  }
+  return true;
+}
+
+// =======================================================================
+// function : getColorData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemPrs3dAspect::getColorData(const TCollection_AsciiString& theInfo,
+                                                  const Quantity_ColorRGBA& theColor,
+                                                  const Standard_Boolean isFirstColumn,
+                                                  const int theRole) const
+{
+  if (isFirstColumn)
+    return theInfo.ToCString();
+
+  if (theRole == Qt::BackgroundRole)
+    return ViewControl_ColorSelector::ColorToQColor (theColor);
+
+  else if (theRole == Qt::DisplayRole)
+    return ViewControl_ColorSelector::ColorToString (theColor);
+
+  return QVariant();
+}
\ No newline at end of file
diff --git a/tools/VInspector/VInspector_ItemPrs3dAspect.hxx b/tools/VInspector/VInspector_ItemPrs3dAspect.hxx
new file mode 100644 (file)
index 0000000..86fcf58
--- /dev/null
@@ -0,0 +1,179 @@
+// Created on: 2018-08-26
+// 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 VInspector_ItemPrs3dAspect_H
+#define VInspector_ItemPrs3dAspect_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+#include <Prs3d_BasicAspect.hxx>
+
+class QItemSelectionModel;
+
+class VInspector_ItemPrs3dAspect;
+typedef QExplicitlySharedDataPointer<VInspector_ItemPrs3dAspect> VInspector_ItemPrs3dAspectPtr;
+
+//! \class VInspector_ItemPrs3dAspect
+//! Item presents information about AIS_InteractiveObject.
+//! Parent is item context, children are item selections.
+class VInspector_ItemPrs3dAspect : public VInspector_ItemBase
+{
+
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemPrs3dAspectPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemPrs3dAspectPtr (new VInspector_ItemPrs3dAspect (theParent, theRow, theColumn)); }
+  //! Destructor
+  virtual ~VInspector_ItemPrs3dAspect() Standard_OVERRIDE {};
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  Standard_EXPORT Handle(Prs3d_BasicAspect) GetAspect() const;
+
+  //! Returns sub aspect of the row if possible, e.g. Datum/Dimension aspect
+  //! \param theRow child row index
+  //! \param theName [out] drawer name
+  Standard_EXPORT Handle(Prs3d_BasicAspect) GetPrs3dAspect (const int theRow,
+                                                            TCollection_AsciiString& theName,
+                                                            Standard_Boolean& theOwnAspect) const;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of item selected
+  //! \return rows count
+  virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! Set interactive object into the current field
+  //! \param theIO a presentation
+  //! \param theName item display data value
+  void setAspect (Handle(Prs3d_BasicAspect) theAspect, const TCollection_AsciiString& theName)
+  { myAspect = theAspect; myName = theName; }
+
+private:
+
+  //! Returns number of table rows depending on the aspect kind
+  //! \param theAspectKind kind or parent kind of aspect
+  int getTableRowCount (const TCollection_AsciiString& theAspectKind) const;
+
+  //! Returns number of table rows depending on the aspect kind
+  //! \param theRow a model index row
+  //! \param theAspectKind kind or parent kind of aspect
+  //! \param theStartRow number of rows following before the parameter row, use sum of row and start row
+  ViewControl_EditType getTableEditType (const int theRow,
+                                         const TCollection_AsciiString& theAspectKind,
+                                         const int theStartRow) const;
+
+  //! Returns container of string values for enumeration in the model row depending on the aspect kind
+  //! \param theRow table model row index
+  //! \param theAspectKind kind or parent kind of aspect
+  //! \param theStartRow number of rows following before the parameter row, use sum of row and start row
+  //! \return string values for the enumeration presented in the row or an empty container
+  QList<QVariant> getTableEnumValues (const int theRow,
+                                      const TCollection_AsciiString& theAspectKind,
+                                      const int theStartRow) const;
+
+  //! Returns table value for the row in form: <function name> <function value> depending on the aspect kind
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theAspectKind kind or parent kind of aspect
+  //! \param theStartRow number of rows following before the parameter row, use sum of row and start row
+  QVariant getTableData (const int theRow,
+                         const int theColumn,
+                         const int theRole,
+                         const TCollection_AsciiString& theAspectKind,
+                         const int theStartRow) const;
+
+  //! Sets the value into the table cell depending on the aspect kind
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  bool setTableData (const int theRow,
+                     const TCollection_AsciiString& theAspectKind,
+                     const int theStartRow,
+                     const QVariant& theValue) const;
+
+  //! Returns color data depending on parameters
+  //! \param theInfo information value if column is the first one
+  //! \param theColor color value
+  //! \param isFirstColumn true if the column id is zero, return info value
+  //! \param theRole if background, returns color or text parameters of color
+  QVariant getColorData (const TCollection_AsciiString& theInfo,
+                         const Quantity_ColorRGBA& theColor,
+                         const Standard_Boolean isFirstColumn,
+                         const int theRole) const;
+
+private:
+
+  //! Constructor
+  //! param theParent a parent item
+  VInspector_ItemPrs3dAspect(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+protected:
+
+  Handle(Prs3d_BasicAspect) myAspect; //!< the current interactive context
+  TCollection_AsciiString myName; //!< the item display data value
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemPrs3dDrawer.cxx b/tools/VInspector/VInspector_ItemPrs3dDrawer.cxx
new file mode 100644 (file)
index 0000000..a5ec2e8
--- /dev/null
@@ -0,0 +1,587 @@
+// Created on: 2018-08-10
+// 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/VInspector_ItemPrs3dDrawer.hxx>
+#include <inspector/VInspector_ItemPrs3dAspect.hxx>
+#include <inspector/VInspector_Tools.hxx>
+
+#include <inspector/VInspector_ItemFolderObject.hxx>
+#include <inspector/ViewControl_ColorSelector.hxx>
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Aspect.hxx>
+#include <Graphic3d.hxx>
+#include <Prs3d.hxx>
+#include <Prs3d_ArrowAspect.hxx>
+#include <Prs3d_DatumAspect.hxx>
+#include <Prs3d_DimensionAspect.hxx>
+#include <Prs3d_Drawer.hxx>
+#include <Prs3d_IsoAspect.hxx>
+#include <Prs3d_LineAspect.hxx>
+#include <Prs3d_PlaneAspect.hxx>
+#include <Prs3d_PointAspect.hxx>
+#include <Prs3d_ShadingAspect.hxx>
+#include <Prs3d_TextAspect.hxx>
+#include <TCollection_AsciiString.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QColor>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+
+QVariant VInspector_ItemPrs3dDrawer::initValue (int theItemRole) const
+{
+  Handle(Prs3d_Drawer) aDrawer = GetDrawer();
+  bool aNullDrawer = aDrawer.IsNull();
+  if (theItemRole == Qt::DisplayRole || theItemRole == Qt::ToolTipRole)
+  {
+    switch (Column())
+    {
+      case 0:
+      {
+        return theItemRole == Qt::ToolTipRole
+          ? (aNullDrawer ? QVariant("Prs3d_Drawer is empty") : QVariant (aDrawer->DynamicType()->Name()))
+          : QVariant (myName.ToCString());
+      }
+      case 1:
+        return rowCount();
+      case 2:
+      {
+        if (!aNullDrawer)
+          return VInspector_Tools::GetPointerInfo (aDrawer, true).ToCString();
+        break;
+      }
+      default: break;
+    }
+  }
+  if (theItemRole == Qt::ForegroundRole)
+    return !aNullDrawer ? QColor (Qt::black) : QColor (Qt::lightGray);
+
+  return QVariant();
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+
+int VInspector_ItemPrs3dDrawer::initRowCount() const
+{
+  VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast<VInspector_ItemFolderObject>(Parent());
+  if (!aParentItem)
+    return 0;
+
+  Handle(Prs3d_Drawer) aDrawer = GetDrawer();
+  if (aDrawer.IsNull())
+    return 0;
+
+  int aChildCount = 1; // Link
+  aChildCount += 18; // Prs3d_Drawer aspects
+  return aChildCount;
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+
+TreeModel_ItemBasePtr VInspector_ItemPrs3dDrawer::createChild (int theRow, int theColumn)
+{
+  if (theRow == 0)
+  {
+    VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast<VInspector_ItemFolderObject>(Parent());
+    if (aParentItem)
+      return VInspector_ItemPrs3dDrawer::CreateItem (currentItem(), theRow, theColumn); // "Link"
+  }
+  else
+    return VInspector_ItemPrs3dAspect::CreateItem (currentItem(), theRow, theColumn); // "Aspects"
+
+  return TreeModel_ItemBasePtr();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void VInspector_ItemPrs3dDrawer::Init()
+{
+  VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast<VInspector_ItemFolderObject>(Parent());
+  Handle(Prs3d_Drawer) aDrawer;
+  TCollection_AsciiString aName;
+  if (aParentItem)
+    aDrawer = aParentItem->GetPrs3dDrawer(Row(), aName);
+  else
+  {
+    VInspector_ItemPrs3dDrawerPtr aParentDrawerItem = itemDynamicCast<VInspector_ItemPrs3dDrawer>(Parent());
+    if (aParentDrawerItem)
+    {
+      aDrawer = aParentDrawerItem->GetDrawer()->Link();
+      aName = "Link";
+    }
+  }
+  setDrawer (aDrawer, aName);
+  TreeModel_ItemBase::Init(); // to use getIO() without circling initialization
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+
+void VInspector_ItemPrs3dDrawer::Reset()
+{
+  VInspector_ItemBase::Reset();
+
+  setDrawer (NULL, "None");
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+
+void VInspector_ItemPrs3dDrawer::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemPrs3dDrawer*>(this)->Init();
+}
+
+// =======================================================================
+// function : GetDrawer
+// purpose :
+// =======================================================================
+
+Handle(Prs3d_Drawer) VInspector_ItemPrs3dDrawer::GetDrawer() const
+{
+  initItem();
+  return myDrawer;
+}
+
+// =======================================================================
+// function : GetPrs3dAspect
+// purpose :
+// =======================================================================
+
+Handle(Prs3d_BasicAspect) VInspector_ItemPrs3dDrawer::GetPrs3dAspect (const int theRow,
+                                                                      TCollection_AsciiString& theName,
+                                                                      Standard_Boolean& theOwnAspect) const
+{
+  if (theRow == 0) // "Link" driver, there is no aspect
+    return 0;
+
+  Handle(Prs3d_Drawer) aDrawer = GetDrawer();
+  if (aDrawer.IsNull())
+    return 0;
+
+  // do not create a new instance of the aspect
+  switch (theRow)
+  {
+    case 1: theName = "UIsoAspect"; theOwnAspect = aDrawer->HasOwnUIsoAspect(); return aDrawer->UIsoAspect();
+    case 2: theName = "VIsoAspect"; theOwnAspect = aDrawer->HasOwnVIsoAspect(); return aDrawer->VIsoAspect();
+    case 3: theName = "WireAspect"; theOwnAspect = aDrawer->HasOwnWireAspect(); return aDrawer->WireAspect();
+    case 4: theName = "PointAspect"; theOwnAspect = aDrawer->HasOwnPointAspect(); return aDrawer->PointAspect();
+    case 5: theName = "LineAspect"; theOwnAspect = aDrawer->HasOwnLineAspect(); return aDrawer->LineAspect();
+    case 6: theName = "TextAspect"; theOwnAspect = aDrawer->HasOwnTextAspect(); return aDrawer->TextAspect();
+    case 7: theName = "ShadingAspect"; theOwnAspect = aDrawer->HasOwnShadingAspect(); return aDrawer->ShadingAspect();
+    case 8: theName = "PlaneAspect"; theOwnAspect = aDrawer->HasOwnPlaneAspect(); return aDrawer->PlaneAspect();
+    case 9: theName = "SeenLineAspect"; theOwnAspect = aDrawer->HasOwnSeenLineAspect(); return aDrawer->SeenLineAspect();
+    case 10: theName = "ArrowAspect"; theOwnAspect = aDrawer->HasOwnArrowAspect(); return aDrawer->ArrowAspect();
+    case 11: theName = "HiddenLineAspect"; theOwnAspect = aDrawer->HasOwnHiddenLineAspect(); return aDrawer->HiddenLineAspect();
+    case 12: theName = "VectorAspect"; theOwnAspect = aDrawer->HasOwnVectorAspect(); return aDrawer->VectorAspect();
+    case 13: theName = "DatumAspect"; theOwnAspect = aDrawer->HasOwnDatumAspect(); return aDrawer->DatumAspect();
+    case 14: theName = "SectionAspect"; theOwnAspect = aDrawer->HasOwnSectionAspect(); return aDrawer->SectionAspect();
+    case 15: theName = "FreeBoundaryAspect"; theOwnAspect = aDrawer->HasOwnFreeBoundaryAspect(); return aDrawer->FreeBoundaryAspect();
+    case 16: theName = "UnFreeBoundaryAspect"; theOwnAspect = aDrawer->HasOwnUnFreeBoundaryAspect(); return aDrawer->UnFreeBoundaryAspect();
+    case 17: theName = "FaceBoundaryAspect"; theOwnAspect = aDrawer->HasOwnFaceBoundaryAspect(); return aDrawer->FaceBoundaryAspect();
+    case 18: theName = "DimensionAspect"; theOwnAspect = aDrawer->HasOwnDimensionAspect(); return aDrawer->DimensionAspect();
+    default: break;
+  }
+
+  theName = "None";
+  return Handle(Prs3d_BasicAspect)();
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemPrs3dDrawer::GetTableRowCount() const
+{
+  Handle(Prs3d_Drawer) aDrawer = GetDrawer();
+  if (aDrawer.IsNull())
+    return 0;
+
+  return 76;
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemPrs3dDrawer::GetTableEditType (const int theRow, const int) const
+{
+  Handle(Prs3d_Drawer) aDrawer = GetDrawer();
+  if (aDrawer.IsNull())
+    return ViewControl_EditType_None;
+
+  switch (theRow)
+  {
+    case 4: return ViewControl_EditType_Spin;
+    case 6: return ViewControl_EditType_Line;
+    case 8: return ViewControl_EditType_Line;
+    case 10: return ViewControl_EditType_Combo;
+    case 12: return ViewControl_EditType_Combo;
+    case 13: return ViewControl_EditType_Bool;
+    case 14: return ViewControl_EditType_Line;
+    case 15: return ViewControl_EditType_Bool;
+    case 16: return ViewControl_EditType_Line;
+    case 18: return ViewControl_EditType_Line;
+    case 21: return ViewControl_EditType_Line;
+    case 24: return ViewControl_EditType_Bool;
+    case 26: return ViewControl_EditType_Bool;
+    case 28: return ViewControl_EditType_Bool;
+    // aspects
+    case 30:
+    case 31:
+    case 32:
+    case 34:
+    case 35:
+    case 36:
+    case 37:
+    case 38:
+    case 39:
+    case 40:
+    case 41:
+    case 43:
+    case 44:
+    case 46:
+    case 47: return ViewControl_EditType_Bool;
+
+    case 48: return ViewControl_EditType_Combo;
+
+    case 49:
+    case 50:
+    case 51:
+    case 53:
+    case 54:
+    case 56:
+    case 57:
+    case 59:
+    case 60: return ViewControl_EditType_Bool;
+
+    case 62:
+    case 64:
+    case 66:
+    case 68: return ViewControl_EditType_Line;
+    case 72: return ViewControl_EditType_Color;
+
+    case 73: return ViewControl_EditType_Combo;
+    case 74: return ViewControl_EditType_Combo;
+    case 75: return ViewControl_EditType_Spin;
+
+    default: return ViewControl_EditType_None;
+  }
+}
+
+// =======================================================================
+// function : GetTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemPrs3dDrawer::GetTableEnumValues (const int theRow, const int) const
+{
+  Handle(Prs3d_Drawer) aDrawer = GetDrawer();
+  if (aDrawer.IsNull())
+    return QList<QVariant>();
+
+  QList<QVariant> aValues;
+  switch (theRow)
+  {
+    case 10:
+    {
+      for (int i = 0; i <= Aspect_TOD_ABSOLUTE; i++)
+        aValues.append (Aspect::TypeOfDeflectionToString ((Aspect_TypeOfDeflection)i));
+    }
+    break;
+    case 12:
+    {
+      for (int i = 0; i <= Prs3d_TOH_Algo; i++)
+        aValues.append (Prs3d::TypeOfHLRToString ((Prs3d_TypeOfHLR)i));
+    }
+    break;
+    case 48:
+    {
+      for (int i = 0; i <= Prs3d_VDM_Inherited; i++)
+        aValues.append (Prs3d::VertexDrawModeToString ((Prs3d_VertexDrawMode)i));
+    }
+    break;
+    case 73:
+    {
+      for (int i = 0; i <= Aspect_TOHM_BOUNDBOX; i++)
+        aValues.append (Aspect::TypeOfHighlightMethodToString ((Aspect_TypeOfHighlightMethod)i));
+    }
+    break;
+    case 74:
+    {
+      aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_UNKNOWN));
+      aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Default));
+      aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Top));
+      aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_Topmost));
+      aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_TopOSD));
+      aValues.append (Graphic3d::ZLayerIdToString (Graphic3d_ZLayerId_BotOSD));
+    }
+    break;
+    default: break;
+  }
+  return aValues;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemPrs3dDrawer::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  Handle(Prs3d_Drawer) aDrawer = GetDrawer();
+  if (aDrawer.IsNull())
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+  if (theRole != Qt::DisplayRole && theRole != Qt::BackgroundRole ||
+      (theRole == Qt::BackgroundRole && (isFirstColumn || theRow != 72)))
+    return QVariant();
+
+  switch (theRow)
+  {
+    case 0: return ViewControl_Table::SeparatorData();
+    case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (Prs3d_Drawer)->Name())
+                                 : ViewControl_Tools::GetPointerInfo (aDrawer).ToCString();
+    case 2: return ViewControl_Table::SeparatorData();
+    case 3: return isFirstColumn ? QVariant ("HasOwnDiscretisation") : QVariant (aDrawer->HasOwnDiscretisation());
+    case 4: return isFirstColumn ? QVariant ("Discretisation") : QVariant (aDrawer->Discretisation());
+    case 5: return isFirstColumn ? QVariant ("HasOwnMaximalParameterValue") : QVariant (aDrawer->HasOwnMaximalParameterValue());
+    case 6: return isFirstColumn ? QVariant ("MaximalParameterValue") : QVariant (aDrawer->MaximalParameterValue());
+    case 7: return isFirstColumn ? QVariant ("HasOwnMaximalChordialDeviation") : QVariant (aDrawer->HasOwnMaximalChordialDeviation());
+    case 8: return isFirstColumn ? QVariant ("MaximalChordialDeviation") : QVariant (aDrawer->MaximalChordialDeviation());
+    case 9: return isFirstColumn ? QVariant ("HasOwnTypeOfDeflection") : QVariant (aDrawer->HasOwnTypeOfDeflection());
+    case 10: return isFirstColumn ? QVariant ("TypeOfDeflection")
+                                  : QVariant (Aspect::TypeOfDeflectionToString (aDrawer->TypeOfDeflection()));
+    case 11: return isFirstColumn ? QVariant ("HasOwnTypeOfHLR") : QVariant (aDrawer->HasOwnTypeOfHLR());
+    case 12: return isFirstColumn ? QVariant ("TypeOfHLR")
+                                  : QVariant (Prs3d::TypeOfHLRToString (aDrawer->TypeOfHLR()));
+
+    case 13: return isFirstColumn ? QVariant ("HasOwnDeviationCoefficient") : QVariant (aDrawer->HasOwnDeviationCoefficient());
+    case 14: return isFirstColumn ? QVariant ("DeviationCoefficient") : QVariant (aDrawer->DeviationCoefficient());
+    case 15: return isFirstColumn ? QVariant ("HasOwnHLRDeviationCoefficient") : QVariant (aDrawer->HasOwnHLRDeviationCoefficient());
+    case 16: return isFirstColumn ? QVariant ("HLRDeviationCoefficient") : QVariant (aDrawer->HLRDeviationCoefficient());
+
+    case 17: return isFirstColumn ? QVariant ("HasOwnDeviationAngle") : QVariant (aDrawer->HasOwnDeviationAngle());
+    case 18: return isFirstColumn ? QVariant ("DeviationAngle") : QVariant (aDrawer->DeviationAngle());
+    case 19: return isFirstColumn ? QVariant ("PreviousDeviationAngle") : QVariant (aDrawer->PreviousDeviationAngle());
+
+    case 20: return isFirstColumn ? QVariant ("HasOwnHLRDeviationAngle") : QVariant (aDrawer->HasOwnHLRDeviationAngle());
+    case 21: return isFirstColumn ? QVariant ("HLRAngle") : QVariant (aDrawer->HLRAngle());
+    case 22: return isFirstColumn ? QVariant ("PreviousHLRDeviationAngle") : QVariant (aDrawer->PreviousHLRDeviationAngle());
+
+    case 23: return isFirstColumn ? QVariant ("HasOwnIsoOnPlane") : QVariant (aDrawer->HasOwnIsoOnPlane());
+    case 24: return isFirstColumn ? QVariant ("IsoOnPlane") : QVariant (aDrawer->IsoOnPlane());
+    case 25: return isFirstColumn ? QVariant ("HasOwnIsoOnTriangulation") : QVariant (aDrawer->HasOwnIsoOnTriangulation());
+    case 26: return isFirstColumn ? QVariant ("IsoOnTriangulation") : QVariant (aDrawer->IsoOnTriangulation());
+    case 27: return isFirstColumn ? QVariant ("HasOwnIsAutoTriangulation") : QVariant (aDrawer->HasOwnIsAutoTriangulation());
+    case 28: return isFirstColumn ? QVariant ("IsAutoTriangulation") : QVariant (aDrawer->IsAutoTriangulation());
+    case 29: return ViewControl_Table::SeparatorData(); // aspects separation
+
+    case 30: return isFirstColumn ? QVariant ("HasOwnUIsoAspect") : QVariant (aDrawer->HasOwnUIsoAspect());
+    case 31: return isFirstColumn ? QVariant ("HasOwnVIsoAspect") : QVariant (aDrawer->HasOwnVIsoAspect());
+    case 32: return isFirstColumn ? QVariant ("HasOwnWireAspect") : QVariant (aDrawer->HasOwnWireAspect());
+    case 33: return isFirstColumn ? QVariant ("HasOwnWireDraw") : QVariant (aDrawer->HasOwnWireDraw());
+    case 34: return isFirstColumn ? QVariant ("WireDraw") : QVariant (aDrawer->WireDraw());
+    case 35: return isFirstColumn ? QVariant ("HasOwnPointAspect") : QVariant (aDrawer->HasOwnPointAspect());
+    case 36: return isFirstColumn ? QVariant ("HasOwnLineAspect") : QVariant (aDrawer->HasOwnLineAspect());
+    case 37: return isFirstColumn ? QVariant ("HasOwnTextAspect") : QVariant (aDrawer->HasOwnTextAspect());
+    case 38: return isFirstColumn ? QVariant ("HasOwnShadingAspect") : QVariant (aDrawer->HasOwnShadingAspect());
+    case 39: return isFirstColumn ? QVariant ("HasOwnPlaneAspect") : QVariant (aDrawer->HasOwnPlaneAspect());
+    case 40: return isFirstColumn ? QVariant ("HasOwnSeenLineAspect") : QVariant (aDrawer->HasOwnSeenLineAspect());
+
+    case 41: return isFirstColumn ? QVariant ("HasOwnArrowAspect") : QVariant (aDrawer->HasOwnArrowAspect());
+    case 42: return isFirstColumn ? QVariant ("HasOwnLineArrowDraw") : QVariant (aDrawer->HasOwnLineArrowDraw());
+    case 43: return isFirstColumn ? QVariant ("LineArrowDraw") : QVariant (aDrawer->LineArrowDraw());
+
+    case 44: return isFirstColumn ? QVariant ("HasOwnHiddenLineAspect") : QVariant (aDrawer->HasOwnHiddenLineAspect());
+    case 45: return isFirstColumn ? QVariant ("HasOwnDrawHiddenLine") : QVariant (aDrawer->HasOwnDrawHiddenLine());
+    case 46: return isFirstColumn ? QVariant ("DrawHiddenLine") : QVariant (aDrawer->DrawHiddenLine());
+
+    case 47: return isFirstColumn ? QVariant ("HasOwnVectorAspect") : QVariant (aDrawer->HasOwnVectorAspect());
+    case 48: return isFirstColumn ? QVariant ("VertexDrawMode")
+                                  : QVariant (Prs3d::VertexDrawModeToString (aDrawer->VertexDrawMode()));
+
+    case 49: return isFirstColumn ? QVariant ("HasOwnDatumAspect") : QVariant (aDrawer->HasOwnDatumAspect());
+
+    case 50: return isFirstColumn ? QVariant ("HasOwnSectionAspect") : QVariant (aDrawer->HasOwnSectionAspect());
+
+    case 51: return isFirstColumn ? QVariant ("HasOwnFreeBoundaryAspect") : QVariant (aDrawer->HasOwnFreeBoundaryAspect());
+    case 52: return isFirstColumn ? QVariant ("HasOwnFreeBoundaryDraw") : QVariant (aDrawer->HasOwnFreeBoundaryDraw());
+    case 53: return isFirstColumn ? QVariant ("FreeBoundaryDraw") : QVariant (aDrawer->FreeBoundaryDraw());
+
+    case 54: return isFirstColumn ? QVariant ("HasOwnUnFreeBoundaryAspect") : QVariant (aDrawer->HasOwnUnFreeBoundaryAspect());
+    case 55: return isFirstColumn ? QVariant ("HasOwnUnFreeBoundaryDraw") : QVariant (aDrawer->HasOwnUnFreeBoundaryDraw());
+    case 56: return isFirstColumn ? QVariant ("UnFreeBoundaryDraw") : QVariant (aDrawer->UnFreeBoundaryDraw());
+
+    case 57: return isFirstColumn ? QVariant ("HasOwnFaceBoundaryAspect") : QVariant (aDrawer->HasOwnFaceBoundaryAspect());
+    case 58: return isFirstColumn ? QVariant ("HasOwnFaceBoundaryDraw") : QVariant (aDrawer->HasOwnFaceBoundaryDraw());
+    case 59: return isFirstColumn ? QVariant ("FaceBoundaryDraw") : QVariant (aDrawer->FaceBoundaryDraw());
+
+    case 60: return isFirstColumn ? QVariant ("HasOwnDimensionAspect") : QVariant (aDrawer->HasOwnDimensionAspect());
+
+    case 61: return isFirstColumn ? QVariant ("HasOwnDimLengthModelUnits") : QVariant (aDrawer->HasOwnDimLengthModelUnits());
+    case 62: return isFirstColumn ? QVariant ("DimLengthModelUnits") : QVariant (aDrawer->DimLengthModelUnits().ToCString());
+    case 63: return isFirstColumn ? QVariant ("HasOwnDimLengthModelUnits") : QVariant (aDrawer->HasOwnDimLengthModelUnits());
+    case 64: return isFirstColumn ? QVariant ("DimAngleModelUnits") : QVariant (aDrawer->DimAngleModelUnits().ToCString());
+
+    case 65: return isFirstColumn ? QVariant ("HasOwnDimLengthDisplayUnits") : QVariant (aDrawer->HasOwnDimLengthDisplayUnits());
+    case 66: return isFirstColumn ? QVariant ("DimLengthDisplayUnits") : QVariant (aDrawer->DimLengthDisplayUnits().ToCString());
+    case 67: return isFirstColumn ? QVariant ("HasOwnDimAngleDisplayUnits") : QVariant (aDrawer->HasOwnDimAngleDisplayUnits());
+    case 68: return isFirstColumn ? QVariant ("DimAngleDisplayUnits") : QVariant (aDrawer->DimAngleDisplayUnits().ToCString());
+
+    // Graphic3d_PresentationAttributes
+    case 69: return ViewControl_Table::SeparatorData();
+    case 70: return isFirstColumn ? QVariant (STANDARD_TYPE (Graphic3d_PresentationAttributes)->Name())
+                                 : ViewControl_Tools::GetPointerInfo (aDrawer).ToCString();
+    case 72:
+    {
+      if (isFirstColumn) return QVariant ("ColorRGBA");
+      else if (theRole == Qt::BackgroundRole) return ViewControl_ColorSelector::ColorToQColor (aDrawer->ColorRGBA());
+      else if (theRole == Qt::DisplayRole) return ViewControl_ColorSelector::ColorToString (aDrawer->ColorRGBA());
+    }
+    case 71: return ViewControl_Table::SeparatorData();
+    case 73: return isFirstColumn ? QVariant ("Method")
+                                  : QVariant (Aspect::TypeOfHighlightMethodToString (aDrawer->Method()));
+    case 74: return isFirstColumn ? QVariant ("ZLayer")
+                                  : QVariant (Graphic3d::ZLayerIdToString (aDrawer->ZLayer()));
+    case 75: return isFirstColumn ? QVariant ("DisplayMode") : QVariant (aDrawer->DisplayMode());
+
+
+    default: return QVariant();
+  }
+}
+
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemPrs3dDrawer::SetTableData (const int theRow, const int, const QVariant& theValue)
+{
+  Handle(Prs3d_Drawer) aDrawer = GetDrawer();
+  if (aDrawer.IsNull())
+    return false;
+
+  switch (theRow)
+  {
+    case 4: aDrawer->SetDiscretisation (theValue.toInt()); break;
+    case 6: aDrawer->SetMaximalParameterValue (theValue.toDouble()); break;
+    case 8: aDrawer->SetMaximalChordialDeviation (theValue.toDouble()); break;
+    case 10: aDrawer->SetTypeOfDeflection (Aspect::TypeOfDeflectionFromString (theValue.toString().toStdString().c_str())); break;
+    case 12: aDrawer->SetTypeOfHLR (Prs3d::TypeOfHLRFromString (theValue.toString().toStdString().c_str())); break;
+    case 13: aDrawer->SetDeviationCoefficient(); break;
+    case 14: aDrawer->SetDeviationCoefficient (theValue.toDouble()); break;
+    case 15: aDrawer->SetHLRDeviationCoefficient(); break;
+    case 16: aDrawer->SetHLRDeviationCoefficient (theValue.toDouble()); break;
+    case 18: aDrawer->SetDeviationAngle (theValue.toDouble()); break;
+    case 21: aDrawer->SetHLRAngle (theValue.toDouble()); break;
+    case 24: aDrawer->SetIsoOnPlane (theValue.toBool()); break;
+    case 26: aDrawer->SetIsoOnTriangulation (theValue.toBool()); break;
+    case 28: aDrawer->SetAutoTriangulation (theValue.toBool()); break;
+    // aspects
+    case 30:
+    case 31:
+    case 32:
+    case 35:
+    case 36:
+    case 37:
+    case 38:
+    case 39:
+    case 40:
+    case 41:
+    case 44:
+    case 47:
+    case 49:
+    case 50:
+    case 51:
+    case 54:
+    case 57:
+    case 60:
+    {
+      Standard_Boolean isOwnAspect = (Standard_Boolean)theValue.toBool();
+      if (!isOwnAspect)
+        aDrawer->SetUIsoAspect (NULL);
+      Handle(Prs3d_Drawer) aLink = aDrawer->Link(); // copy link drawer to restore it
+      aDrawer->SetLink(NULL);
+      // creates and sets default aspect
+       // TODO: suggest to fill myHasOwnUIsoAspect in UIsoAspect
+      if (theRow == 30) aDrawer->SetUIsoAspect (isOwnAspect ? aDrawer->UIsoAspect() : NULL);
+      if (theRow == 31) aDrawer->SetVIsoAspect (isOwnAspect ? aDrawer->VIsoAspect() : NULL);
+      if (theRow == 32) aDrawer->SetWireAspect (isOwnAspect ? aDrawer->WireAspect() : NULL);
+      if (theRow == 35) aDrawer->SetPointAspect (isOwnAspect ? aDrawer->PointAspect() : NULL);
+      if (theRow == 36) aDrawer->SetLineAspect (isOwnAspect ? aDrawer->LineAspect() : NULL);
+      if (theRow == 37) aDrawer->SetTextAspect (isOwnAspect ? aDrawer->TextAspect() : NULL);
+      if (theRow == 38) aDrawer->SetShadingAspect (isOwnAspect ? aDrawer->ShadingAspect() : NULL);
+      if (theRow == 39) aDrawer->SetPlaneAspect (isOwnAspect ? aDrawer->PlaneAspect() : NULL);
+      if (theRow == 40) aDrawer->SetSeenLineAspect (isOwnAspect ? aDrawer->SeenLineAspect() : NULL);
+      if (theRow == 41) aDrawer->SetArrowAspect (isOwnAspect ? aDrawer->ArrowAspect() : NULL);
+      if (theRow == 44) aDrawer->SetHiddenLineAspect (isOwnAspect ? aDrawer->HiddenLineAspect() : NULL);
+      if (theRow == 47) aDrawer->SetVectorAspect (isOwnAspect ? aDrawer->VectorAspect() : NULL);
+      if (theRow == 49) aDrawer->SetDatumAspect (isOwnAspect ? aDrawer->DatumAspect() : NULL);
+      if (theRow == 50) aDrawer->SetSectionAspect (isOwnAspect ? aDrawer->SectionAspect() : NULL);
+      if (theRow == 51) aDrawer->SetFreeBoundaryAspect (isOwnAspect ? aDrawer->FreeBoundaryAspect() : NULL);
+      if (theRow == 54) aDrawer->SetUnFreeBoundaryAspect (isOwnAspect ? aDrawer->UnFreeBoundaryAspect() : NULL);
+      if (theRow == 57) aDrawer->SetFaceBoundaryAspect (isOwnAspect ? aDrawer->FaceBoundaryAspect() : NULL);
+      if (theRow == 60) aDrawer->SetDimensionAspect (isOwnAspect ? aDrawer->DimensionAspect() : NULL);
+
+      aDrawer->SetLink(aLink);
+    }
+    break;
+    case 34: aDrawer->SetWireDraw (theValue.toBool()); break;
+    case 43: aDrawer->SetLineArrowDraw (theValue.toBool()); break;
+    case 46: { if (theValue.toBool()) aDrawer->EnableDrawHiddenLine(); else aDrawer->DisableDrawHiddenLine(); } break;
+    case 48: aDrawer->SetVertexDrawMode (Prs3d::VertexDrawModeFromString (theValue.toString().toStdString().c_str())); break;
+    case 53: aDrawer->SetFreeBoundaryDraw (theValue.toBool()); break;
+    case 56: aDrawer->SetUnFreeBoundaryDraw (theValue.toBool()); break;
+    case 59: aDrawer->SetFaceBoundaryDraw (theValue.toBool()); break;
+
+    case 62: aDrawer->SetDimLengthModelUnits (theValue.toString().toStdString().c_str()); break;
+    case 64: aDrawer->SetDimAngleModelUnits (theValue.toString().toStdString().c_str()); break;
+    case 66: aDrawer->SetDimLengthDisplayUnits (theValue.toString().toStdString().c_str()); break;
+    case 68: aDrawer->SetDimAngleDisplayUnits (theValue.toString().toStdString().c_str()); break;
+
+    case 72:
+    {
+      float anAlpha;
+      aDrawer->SetColor (ViewControl_ColorSelector::StringToColor (theValue.toString(), anAlpha));
+      aDrawer->SetTransparency (anAlpha);
+    }
+    case 73: aDrawer->SetMethod (Aspect::TypeOfHighlightMethodFromString (theValue.toString().toStdString().c_str())); break;
+    case 74: aDrawer->SetZLayer (Graphic3d::ZLayerIdFromString (theValue.toString().toStdString().c_str())); break;
+    case 75: aDrawer->SetDisplayMode (theValue.toInt()); break;
+
+    default: return false;
+  }
+  return true;
+}
diff --git a/tools/VInspector/VInspector_ItemPrs3dDrawer.hxx b/tools/VInspector/VInspector_ItemPrs3dDrawer.hxx
new file mode 100644 (file)
index 0000000..99d4f90
--- /dev/null
@@ -0,0 +1,129 @@
+// Created on: 2018-08-10
+// 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 VInspector_ItemPrs3dDrawer_H
+#define VInspector_ItemPrs3dDrawer_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+#include <Prs3d_Drawer.hxx>
+
+class Prs3d_BasicAspect;
+
+class QItemSelectionModel;
+
+class VInspector_ItemPrs3dDrawer;
+typedef QExplicitlySharedDataPointer<VInspector_ItemPrs3dDrawer> VInspector_ItemPrs3dDrawerPtr;
+
+//! \class VInspector_ItemPrs3dDrawer
+//! Item presents information about AIS_InteractiveObject.
+//! Parent is item context, children are item selections.
+class VInspector_ItemPrs3dDrawer : public VInspector_ItemBase
+{
+
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemPrs3dDrawerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemPrs3dDrawerPtr (new VInspector_ItemPrs3dDrawer (theParent, theRow, theColumn)); }
+  //! Destructor
+  virtual ~VInspector_ItemPrs3dDrawer() Standard_OVERRIDE {};
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns current drawer, initialize the drawer if it was not initialized yet
+  Standard_EXPORT Handle(Prs3d_Drawer) GetDrawer() const;
+
+  //! Returns drawer of the row if possible
+  //! \param theRow child row index
+  //! \param theName [out] drawer name
+  Standard_EXPORT Handle(Prs3d_BasicAspect) GetPrs3dAspect (const int theRow,
+                                                            TCollection_AsciiString& theName,
+                                                            Standard_Boolean& theOwnAspect) const;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of item selected
+  //! \return rows count
+  virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! Set interactive object into the current field
+  //! \param theIO a presentation
+  //! \param theName item display data value
+  void setDrawer (const Handle(Prs3d_Drawer)& theDrawer, const TCollection_AsciiString& theName)
+  { myDrawer = theDrawer; myName = theName; }
+
+private:
+
+  //! Constructor
+  //! param theParent a parent item
+  VInspector_ItemPrs3dDrawer(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+protected:
+
+  Handle(Prs3d_Drawer) myDrawer; //!< the current drawer
+  TCollection_AsciiString myName; //!< the item display data value
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemPrs3dPresentation.cxx b/tools/VInspector/VInspector_ItemPrs3dPresentation.cxx
new file mode 100644 (file)
index 0000000..73a9b5d
--- /dev/null
@@ -0,0 +1,185 @@
+// 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/VInspector_ItemPrs3dPresentation.hxx>
+#include <inspector/VInspector_ItemGraphic3dCStructure.hxx>
+#include <inspector/VInspector_ItemPresentations.hxx>
+#include <inspector/VInspector_Tools.hxx>
+
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Graphic3d.hxx>
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemPrs3dPresentation::initValue (int theItemRole) const
+{
+  if (Column() != 0 || (theItemRole != Qt::DisplayRole && theItemRole != Qt::ToolTipRole))
+    return QVariant();
+
+  Handle(Prs3d_Presentation) aPresentation = GetPresentation();
+  bool aNullPresentation = aPresentation.IsNull();
+
+  switch (Column())
+  {
+    case 0:
+    {
+      return theItemRole == Qt::ToolTipRole
+        ? (aNullPresentation ? QVariant("Prs3d_Presentation is empty") : QVariant (aPresentation->DynamicType()->Name()))
+        : QVariant (myName.ToCString());
+    }
+  }
+
+  return QVariant();
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemPrs3dPresentation::initRowCount() const
+{
+  if (Column() != 0)
+    return 0;
+
+  //Handle(Prs3d_Presentation) aPresentation = GetPresentation();
+
+  //Standard_EXPORT const Handle(Graphic3d_SequenceOfHClipPlane)& ClipPlanes() const;
+
+  return 1; //aPresentation->NumberOfGroups();
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemPrs3dPresentation::createChild (int theRow, int theColumn)
+{
+  if (theRow == 0)
+    return VInspector_ItemGraphic3dCStructure::CreateItem (currentItem(), theRow, theColumn);
+  //if (theRow == 1)
+  //  return VInspector_ItemPrs3dPresentation::CreateItem (currentItem(), theRow, theColumn);
+  //else
+  //  return VInspector_ItemSelectMgrSelection::CreateItem(currentItem(), theRow, theColumn);
+  return TreeModel_ItemBasePtr();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemPrs3dPresentation::Init()
+{
+  VInspector_ItemPresentationsPtr aParentItem = itemDynamicCast<VInspector_ItemPresentations>(Parent());
+
+  TCollection_AsciiString aName;
+  Handle(Prs3d_Presentation) aPresentation = aParentItem->GetPresentation (Row(), aName);
+  setPresentation (aPresentation, aName);
+
+  myPresentationShape = VInspector_Tools::CreateShape (aPresentation->MinMaxValues());
+
+  TreeModel_ItemBase::Init(); // to use getIO() without circling initialization
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemPrs3dPresentation::Reset()
+{
+  VInspector_ItemBase::Reset();
+
+  setPresentation (NULL, "None");
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemPrs3dPresentation::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemPrs3dPresentation*>(this)->Init();
+}
+
+// =======================================================================
+// function : GetInteractiveObject
+// purpose :
+// =======================================================================
+Handle(Prs3d_Presentation) VInspector_ItemPrs3dPresentation::GetPresentation() const
+{
+  initItem();
+  return myPresentation;
+}
+
+// =======================================================================
+// function : setPresentation
+// purpose :
+// =======================================================================
+void VInspector_ItemPrs3dPresentation::setPresentation (const Handle(Prs3d_Presentation)& thePresentation,
+                                                         const TCollection_AsciiString& theName)
+{
+  myPresentation = thePresentation;
+  myName = theName;
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemPrs3dPresentation::GetTableRowCount() const
+{
+  return 14;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemPrs3dPresentation::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+
+  Handle(Prs3d_Presentation) aPrs = GetPresentation();
+  switch (theRow)
+  {
+    case 0: return ViewControl_Table::SeparatorData();
+    case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (Graphic3d_Structure)->Name())
+                                 : ViewControl_Tools::GetPointerInfo (aPrs).ToCString();
+    case 2: return ViewControl_Table::SeparatorData();
+    case 3: return isFirstColumn ? QVariant ("DisplayPriority") : QVariant (aPrs->DisplayPriority());
+    case 4: return isFirstColumn ? QVariant ("GetZLayer")
+                                 : QVariant (Graphic3d::ZLayerIdToString (aPrs->GetZLayer()));
+    case 5: return isFirstColumn ? QVariant ("MinMaxValues")
+                                 : QVariant (ViewControl_Tools::ToString (aPrs->MinMaxValues()).ToCString());
+    case 6: return isFirstColumn ? QVariant ("ContainsFacet") : QVariant (aPrs->ContainsFacet());
+    case 7: return isFirstColumn ? QVariant ("IsDeleted") : QVariant (aPrs->IsDeleted());
+    case 8: return isFirstColumn ? QVariant ("IsDisplayed") : QVariant (aPrs->IsDisplayed());
+    case 9: return isFirstColumn ? QVariant ("IsEmpty") : QVariant (aPrs->IsEmpty());
+    case 10: return isFirstColumn ? QVariant ("IsInfinite") : QVariant (aPrs->IsInfinite());
+    case 11: return isFirstColumn ? QVariant ("IsHighlighted") : QVariant (aPrs->IsHighlighted());
+    case 12: return isFirstColumn ? QVariant ("IsTransformed") : QVariant (aPrs->IsTransformed());
+    case 13: return isFirstColumn ? QVariant ("IsVisible") : QVariant (aPrs->IsVisible());
+    default: return QVariant();
+  }
+  return QVariant();
+}
diff --git a/tools/VInspector/VInspector_ItemPrs3dPresentation.hxx b/tools/VInspector/VInspector_ItemPrs3dPresentation.hxx
new file mode 100644 (file)
index 0000000..a9051ba
--- /dev/null
@@ -0,0 +1,104 @@
+// 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 VInspector_ItemPrs3dPresentation_H
+#define VInspector_ItemPrs3dPresentation_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+#include <AIS_InteractiveObject.hxx>
+#include <NCollection_List.hxx>
+
+class QItemSelectionModel;
+
+class VInspector_ItemPrs3dPresentation;
+typedef QExplicitlySharedDataPointer<VInspector_ItemPrs3dPresentation> VInspector_ItemPrs3dPresentationPtr;
+
+//! \class VInspector_ItemPrs3dPresentation
+//! Item presents information about AIS_InteractiveObject.
+//! Parent is item context, children are item selections.
+class VInspector_ItemPrs3dPresentation : public VInspector_ItemBase
+{
+
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemPrs3dPresentationPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemPrs3dPresentationPtr (new VInspector_ItemPrs3dPresentation (theParent, theRow, theColumn)); }
+  //! Destructor
+  virtual ~VInspector_ItemPrs3dPresentation() Standard_OVERRIDE {};
+
+  //! Returns the current presentation, init item if it was not initialized yet
+  //! \return presentation object
+  Standard_EXPORT Handle(Prs3d_Presentation) GetPresentation() const;
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of item selected
+  //! \return rows count
+  virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! Set presentation into the current field
+  //! \param thePresentation a presentation
+  //! \param theName the item name
+  void setPresentation (const Handle(Prs3d_Presentation)& thePresentation,
+                        const TCollection_AsciiString& theName);
+
+private:
+
+  //! Constructor
+  //! param theParent a parent item
+  VInspector_ItemPrs3dPresentation(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+protected:
+
+  Handle(Prs3d_Presentation) myPresentation; //!< the current presentation
+  TCollection_AsciiString myName; //!< the item display data value
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.cxx b/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.cxx
new file mode 100644 (file)
index 0000000..90ad9a0
--- /dev/null
@@ -0,0 +1,325 @@
+// 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/VInspector_ItemSelectBasicsEntityOwner.hxx>
+#include <inspector/VInspector_ItemSelectMgrSensitiveEntity.hxx>
+#include <inspector/VInspector_ItemPresentableObject.hxx>
+#include <inspector/VInspector_Tools.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <SelectMgr_SensitiveEntity.hxx>
+#include <SelectBasics_SensitiveEntity.hxx>
+#include <Standard_Version.hxx>
+#include <StdSelect_BRepOwner.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QItemSelectionModel>
+#include <QColor>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemSelectBasicsEntityOwner::initValue(int theItemRole) const
+{
+  switch (theItemRole)
+  { 
+    case Qt::DisplayRole:
+    case Qt::EditRole:
+    case Qt::ToolTipRole:
+    {
+      Handle(SelectBasics_EntityOwner) anOwner = getEntityOwner();
+      if (anOwner.IsNull())
+        return QVariant();
+
+      switch (Column())
+      {
+        case 0: return anOwner->DynamicType()->Name();
+        case 2: return VInspector_Tools::GetPointerInfo (anOwner, true).ToCString();
+        case 3:
+        {
+          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
+          if (BROwnr.IsNull())
+            return QVariant();
+
+          const TopoDS_Shape& aShape = BROwnr->Shape();
+          if (aShape.IsNull())
+            return QVariant();
+
+          return VInspector_Tools::GetShapeTypeInfo (aShape.ShapeType()).ToCString();
+        }
+        case 17:
+        case 18:
+        case 19:
+          {
+          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
+          if (BROwnr.IsNull())
+            return QVariant();
+
+          const TopoDS_Shape& aShape = BROwnr->Shape();
+          if (aShape.IsNull())
+            return QVariant();
+
+          return Column() == 17 ? VInspector_Tools::GetPointerInfo (aShape.TShape(), true).ToCString()
+               : Column() == 18 ? VInspector_Tools::OrientationToName (aShape.Orientation()).ToCString()
+               :           /*19*/ ViewControl_Tools::ToString (aShape.Location()).ToCString();
+        }
+        case 21:
+          {
+          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
+          if (BROwnr.IsNull())
+            return QVariant();
+
+          //const TopoDS_Shape& aShape = BROwnr->Shape();
+          //if (aShape.IsNull())
+          //  return QVariant();
+
+          return ViewControl_Tools::ToString (BROwnr->Location()).ToCString();
+        }
+        default: break;
+      }
+      break;
+    }
+    case Qt::BackgroundRole:
+    case Qt::ForegroundRole:
+    {
+      if (Column() == 2)
+      {
+        Handle(AIS_InteractiveContext) aContext = GetContext();
+        if (!aContext.IsNull())
+        {
+          if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner()))
+            return (theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white);
+        }
+      }
+      VInspector_ItemSelectMgrSensitiveEntityPtr aParentItem = itemDynamicCast<VInspector_ItemSelectMgrSensitiveEntity>(Parent());
+      if (aParentItem)
+        return aParentItem->data(QModelIndex(), theItemRole);
+      break;
+    }
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectBasicsEntityOwner::Init()
+{
+  Handle(SelectBasics_EntityOwner) anOwner;
+
+  VInspector_ItemSelectMgrSensitiveEntityPtr aParentItem = itemDynamicCast<VInspector_ItemSelectMgrSensitiveEntity>(Parent());
+  if (aParentItem)
+  {
+    Handle(SelectMgr_SensitiveEntity) anEntity = aParentItem->GetSensitiveEntity();
+    anOwner = anEntity->BaseSensitive()->OwnerId();
+  }
+  else
+  {
+    VInspector_ItemPresentableObjectPtr aPOItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
+    if (aPOItem)
+    {
+      Handle(AIS_InteractiveObject) anIO = aPOItem->GetInteractiveObject();
+
+      int aRowId = Row();
+      int aCurrentIndex = 0;
+#if OCC_VERSION_HEX < 0x070201
+      for (anIO->Init(); anIO->More() && anOwner.IsNull(); anIO->Next())
+      {
+        const Handle(SelectMgr_Selection)& aSelection = anIO->CurrentSelection();
+        for (aSelection->Init(); aSelection->More() && anOwner.IsNull(); aSelection->Next())
+        {
+          Handle(SelectMgr_SensitiveEntity) anEntity = aSelection->Sensitive();
+#else
+      for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anIO->Selections()); aSelIter.More() && anOwner.IsNull(); aSelIter.Next())
+      {
+        const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value();
+        for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More() && anOwner.IsNull(); aSelEntIter.Next())
+        {
+          Handle(SelectMgr_SensitiveEntity) anEntity = aSelEntIter.Value();
+#endif
+          const Handle(SelectBasics_SensitiveEntity)& aBase = anEntity->BaseSensitive();
+          if (!aBase.IsNull())
+          {
+            if (aRowId == aCurrentIndex)
+              anOwner = aBase->OwnerId();
+            aCurrentIndex++;
+          }
+        }
+      }
+    }
+  }
+  myOwner = anOwner;
+  TreeModel_ItemBase::Init();
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectBasicsEntityOwner::Reset()
+{
+  VInspector_ItemBase::Reset();
+  SetContext (NULL);
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectBasicsEntityOwner::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemSelectBasicsEntityOwner*>(this)->Init();
+}
+
+// =======================================================================
+// function : getEntityOwner
+// purpose :
+// =======================================================================
+Handle(SelectBasics_EntityOwner) VInspector_ItemSelectBasicsEntityOwner::getEntityOwner() const
+{
+  initItem();
+  return myOwner;
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemSelectBasicsEntityOwner::GetTableRowCount() const
+{
+  return 20;
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemSelectBasicsEntityOwner::GetTableEditType(const int theRow, const int) const
+{
+  /*switch (theRow)
+  {
+  case 4: return ViewControl_EditType_Line;
+  case 5: return ViewControl_EditType_Combo;
+  case 6: return ViewControl_EditType_Bool;
+  case 12: return ViewControl_EditType_Bool;
+  case 17: return ViewControl_EditType_Combo;
+  case 18: return ViewControl_EditType_Bool;
+  default: return ViewControl_EditType_None;
+  }*/
+  return ViewControl_EditType_None;
+}
+
+// =======================================================================
+// function : GetTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemSelectBasicsEntityOwner::GetTableEnumValues(const int theRow, const int) const
+{
+  QList<QVariant> aValues;
+  /*switch (theRow)
+  {
+  case 5:
+  {
+  for (int i = 0; i <= Aspect_TOFM_FRONT_SIDE; i++)
+  aValues.append (Aspect::TypeOfFacingModelToString((Aspect_TypeOfFacingModel)i));
+  }
+  break;
+  case 17:
+  {
+  for (int i = 0; i <= PrsMgr_TOP_ProjectorDependant; i++)
+  aValues.append (PrsMgr::TypeOfPresentation3dToString ((PrsMgr_TypeOfPresentation3d)i));
+  }
+  break;
+  default: break;
+  }*/
+  return aValues;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemSelectBasicsEntityOwner::GetTableData(const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+
+  /*Handle(AIS_InteractiveObject) aPrs = GetInteractiveObject();
+  switch (theRow)
+  {
+  case 0: return ViewControl_Table::SeparatorData();
+  case 1: return isFirstColumn ? QVariant (STANDARD_TYPE (AIS_InteractiveObject)->Name())
+  : ViewControl_Tools::GetPointerInfo (aPrs).ToCString();
+  case 2: return ViewControl_Table::SeparatorData();
+  case 3: return isFirstColumn ? QVariant ("HasWidth") : QVariant (aPrs->HasWidth());
+  case 4: return isFirstColumn ? QVariant ("Width") : QVariant (aPrs->Width());
+  case 5: return isFirstColumn ? QVariant ("CurrentFacingModel")
+  : QVariant (Aspect::TypeOfFacingModelToString (aPrs->CurrentFacingModel()));
+  case 6: return isFirstColumn ? QVariant ("IsInfinite") : QVariant (aPrs->IsInfinite());
+  case 7: return isFirstColumn ? QVariant ("HasColor") : QVariant (aPrs->HasColor());
+  case 8: return isFirstColumn ? QVariant ("HasMaterial") : QVariant (aPrs->HasMaterial());
+
+  case 9: return ViewControl_Table::SeparatorData();
+  case 10: return isFirstColumn ? QVariant (STANDARD_TYPE (SelectMgr_SelectableObject)->Name())
+  : ViewControl_Tools::GetPointerInfo (aPrs).ToCString();
+  case 11: return ViewControl_Table::SeparatorData();
+  case 12: return isFirstColumn ? QVariant ("IsAutoHilight") : QVariant (aPrs->IsAutoHilight());
+  case 13: return isFirstColumn ? QVariant ("GlobalSelectionMode") : QVariant (aPrs->GlobalSelectionMode());
+
+  case 14: return ViewControl_Table::SeparatorData();
+  case 15: return isFirstColumn ? QVariant (STANDARD_TYPE (PrsMgr_PresentableObject)->Name())
+  : ViewControl_Tools::GetPointerInfo (aPrs).ToCString();
+  case 16: return ViewControl_Table::SeparatorData();
+  case 17: return isFirstColumn ? QVariant ("TypeOfPresentation3d")
+  : QVariant (PrsMgr::TypeOfPresentation3dToString (aPrs->TypeOfPresentation3d()));
+  case 18: return isFirstColumn ? QVariant ("IsMutable") : QVariant (aPrs->IsMutable());
+  case 19: return isFirstColumn ? QVariant ("HasOwnPresentations") : QVariant (aPrs->HasOwnPresentations());
+  default: return QVariant();
+  }*/
+  return QVariant();
+}
+
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemSelectBasicsEntityOwner::SetTableData(const int theRow, const int, const QVariant& theValue)
+{
+  /*Handle(AIS_InteractiveObject) aPrs = GetInteractiveObject();
+  switch (theRow)
+  {
+  case 4:
+  {
+  double aValue = theValue.toDouble();
+  if (aValue > 0) aPrs->SetWidth (aValue);
+  else aPrs->UnsetWidth();
+  }
+  break;
+  case 5: aPrs->SetCurrentFacingModel (Aspect::TypeOfFacingModelFromString (theValue.toString().toStdString().c_str()));
+  case 6: aPrs->SetInfiniteState (theValue.toBool());
+  case 12: aPrs->SetAutoHilight(theValue.toBool());
+  case 17: aPrs->SetTypeOfPresentation (PrsMgr::TypeOfPresentation3dFromString (theValue.toString().toStdString().c_str()));
+  case 18: aPrs->SetMutable (theValue.toBool());
+  default: return false;
+  }*/
+  return true;
+}
diff --git a/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.hxx b/tools/VInspector/VInspector_ItemSelectBasicsEntityOwner.hxx
new file mode 100644 (file)
index 0000000..6a99243
--- /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 VInspector_ItemSelectBasicsEntityOwner_H
+#define VInspector_ItemSelectBasicsEntityOwner_H
+
+#include <AIS_InteractiveObject.hxx>
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+class QItemSelectionModel;
+
+class VInspector_ItemSelectBasicsEntityOwner;
+typedef QExplicitlySharedDataPointer<VInspector_ItemSelectBasicsEntityOwner> VInspector_ItemSelectBasicsEntityOwnerPtr;
+
+//! \class VInspector_ItemPresentableObject
+//! Item for selection entity owner. The parent is sensitive entity item, there are no children
+class VInspector_ItemSelectBasicsEntityOwner : public VInspector_ItemBase
+{
+
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemSelectBasicsEntityOwnerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemSelectBasicsEntityOwnerPtr (new VInspector_ItemSelectBasicsEntityOwner (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemSelectBasicsEntityOwner() Standard_OVERRIDE {};
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns the current entity owner
+  Handle(SelectBasics_EntityOwner) EntityOwner() const { return myOwner; }
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType(const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues(const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData(const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData(const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
+
+protected:
+  //! \return number of children.
+  virtual int initRowCount() const Standard_OVERRIDE{ return 0; }
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE
+  { (void)theRow; (void)theColumn; return TreeModel_ItemBasePtr(); }
+
+private:
+
+  //! Constructor
+  //! param theParent a parent item
+  VInspector_ItemSelectBasicsEntityOwner(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+private:
+
+  //! Returns the current entity owner. Initializes the item if it was not initialized yet
+  Handle(SelectBasics_EntityOwner) getEntityOwner() const;
+
+private:
+
+  Handle(SelectBasics_EntityOwner) myOwner; //!< the current entity owner
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.cxx b/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.cxx
new file mode 100644 (file)
index 0000000..b62bbfa
--- /dev/null
@@ -0,0 +1,487 @@
+// 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/VInspector_ItemSelectBasicsSensitiveEntity.hxx>
+
+#include <AIS_ListOfInteractive.hxx>
+#include <AIS_Shape.hxx>
+#include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_MakeEdge.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
+#include <SelectBasics_SensitiveEntity.hxx>
+#include <Select3D_SensitiveBox.hxx>
+#include <Select3D_SensitiveCircle.hxx>
+#include <Select3D_SensitiveCurve.hxx>
+#include <Select3D_SensitiveFace.hxx>
+#include <Select3D_SensitivePoint.hxx>
+#include <Select3D_SensitiveSegment.hxx>
+#include <Select3D_SensitiveSet.hxx>
+#include <Select3D_SensitiveTriangle.hxx>
+#include <Select3D_InteriorSensitivePointSet.hxx> // child of Select3D_SensitiveSet
+#include <Select3D_SensitiveGroup.hxx>
+#include <Select3D_SensitivePoly.hxx>
+#include <Select3D_SensitivePrimitiveArray.hxx>
+#include <Select3D_SensitiveTriangulation.hxx>
+#include <Select3D_SensitiveWire.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+#include <SelectMgr_Selection.hxx>
+#include <SelectMgr_SensitiveEntity.hxx>
+#include <Standard_Version.hxx>
+#include <StdSelect_BRepOwner.hxx>
+#include <TColgp_HArray1OfPnt.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopoDS_Vertex.hxx>
+
+#include <inspector/VInspector_ItemContext.hxx>
+#include <inspector/VInspector_ItemSelectBasicsEntityOwner.hxx>
+#include <inspector/VInspector_ItemSelectMgrSensitiveEntity.hxx>
+#include <inspector/VInspector_Tools.hxx>
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+#include <QColor>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : GetSensitiveEntity
+// purpose :
+// =======================================================================
+Handle(SelectBasics_SensitiveEntity) VInspector_ItemSelectBasicsSensitiveEntity::GetSensitiveEntity() const
+{
+  initItem();
+  return myEntity;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+int VInspector_ItemSelectBasicsSensitiveEntity::initRowCount() const
+{
+  return 0;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemSelectBasicsSensitiveEntity::initValue (int theItemRole) const
+{
+  Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity();
+  Handle(SelectBasics_EntityOwner) anOwner = anEntity->OwnerId();
+
+  switch (theItemRole)
+  {
+    case Qt::DisplayRole:
+    case Qt::EditRole:
+    case Qt::ToolTipRole:
+    {
+      switch (Column())
+      {
+        case 0: return anEntity->DynamicType()->Name();
+        default:
+          break;
+      }
+      break;
+    }
+    case Qt::BackgroundRole:
+    case Qt::ForegroundRole:
+    {
+      if (Column() == 2)
+      {
+        Handle(AIS_InteractiveContext) aContext = GetContext();
+        if (!aContext.IsNull())
+        {
+          if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner()))
+            return QVariant ((theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white));
+        }
+      }
+      VInspector_ItemSelectMgrSensitiveEntityPtr aParentItem = itemDynamicCast<VInspector_ItemSelectMgrSensitiveEntity>(Parent());
+      if (aParentItem)
+        return aParentItem->data(QModelIndex(), theItemRole);
+      break;
+    }
+    default:
+    break;
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemSelectBasicsSensitiveEntity::createChild (int theRow, int theColumn)
+{
+  return VInspector_ItemSelectBasicsEntityOwner::CreateItem (currentItem(), theRow, theColumn);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectBasicsSensitiveEntity::Init()
+{
+  VInspector_ItemSelectMgrSensitiveEntityPtr aParentItem = itemDynamicCast<VInspector_ItemSelectMgrSensitiveEntity>(Parent());
+
+  Handle(SelectMgr_SensitiveEntity) anEntity = aParentItem->GetSensitiveEntity();
+
+  myEntity = anEntity->BaseSensitive();
+  myPresentationShape = buildPresentationShape (myEntity);
+
+  TreeModel_ItemBase::Init();
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectBasicsSensitiveEntity::Reset()
+{
+  // an empty method to don't clear the main label, otherwise the model will be empty
+  TreeModel_ItemBase::Reset();
+  myEntity = NULL;
+  //if (!myPresentation.IsNull() && !myPresentation->GetContext().IsNull())
+  //{
+  //  myPresentation->GetContext()->Erase (myPresentation, Standard_False);
+  //  myPresentation = NULL;
+  //}
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectBasicsSensitiveEntity::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemSelectBasicsSensitiveEntity*>(this)->Init();
+}
+
+// =======================================================================
+// function : getEntityOwner
+// purpose :
+// =======================================================================
+Handle(SelectBasics_EntityOwner) VInspector_ItemSelectBasicsSensitiveEntity::getEntityOwner() const
+{
+  initItem();
+
+  Handle(SelectBasics_EntityOwner) anOwner;
+  const Handle(SelectBasics_SensitiveEntity)& aBase = GetSensitiveEntity();
+  if (aBase.IsNull())
+    return anOwner;
+  return aBase->OwnerId();
+}
+
+// =======================================================================
+// function : GetPresentations
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectBasicsSensitiveEntity::GetPresentations(NCollection_List<Handle(Standard_Transient)>& thePresentations)
+{
+  if (Column() != 0)
+    return;
+
+  if (!myPresentation.IsNull())
+    return;
+
+  Handle(Select3D_SensitiveEntity) aBaseEntity = Handle(Select3D_SensitiveEntity)::DownCast (GetSensitiveEntity());
+  if (aBaseEntity.IsNull())
+    return;
+
+  myPresentation = new AIS_Shape (myPresentationShape);
+  myPresentation->SetColor (Quantity_Color (Quantity_NOC_BLUE1));
+  thePresentations.Append (myPresentation);
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemSelectBasicsSensitiveEntity::GetTableRowCount() const
+{
+  return 40;
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemSelectBasicsSensitiveEntity::GetTableEditType(const int theRow, const int) const
+{
+  switch (theRow)
+  {
+    case 3: return ViewControl_EditType_Spin;
+    default: return ViewControl_EditType_None;
+  }
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemSelectBasicsSensitiveEntity::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+
+  Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity();
+  switch (theRow)
+  {
+    case 0: return ViewControl_Table::SeparatorData();
+    case 1: return isFirstColumn ? QVariant(STANDARD_TYPE(SelectBasics_SensitiveEntity)->Name())
+                                 : ViewControl_Tools::GetPointerInfo (anEntity).ToCString();
+    case 2: return ViewControl_Table::SeparatorData();
+
+    case 3: return isFirstColumn ? QVariant ("SensitivityFactor") : QVariant(anEntity->SensitivityFactor());
+    case 4: return isFirstColumn ? QVariant ("NbSubElements") : QVariant (anEntity->NbSubElements());
+    case 5: return isFirstColumn ? QVariant ("BoundingBox") : QVariant (VInspector_Tools::ToVariant (anEntity->BoundingBox()));
+
+    case 6: return isFirstColumn ? QVariant ("HasInitLocation") : QVariant (anEntity->HasInitLocation());
+    case 7: return isFirstColumn ? QVariant ("InvInitLocation")
+                                 : QVariant (ViewControl_Tools::ToString (anEntity->InvInitLocation().Trsf()).ToCString());
+
+    case 8: return ViewControl_Table::SeparatorData();
+    case 9: return isFirstColumn ? QVariant (anEntity->DynamicType()->Name())
+                                 : ViewControl_Tools::GetPointerInfo (anEntity).ToCString();
+    case 10: return ViewControl_Table::SeparatorData();
+    default: return getTableData (theRow, theColumn, theRole, anEntity->DynamicType()->Name());
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemSelectBasicsSensitiveEntity::SetTableData(const int theRow, const int, const QVariant& theValue)
+{
+  Handle(SelectBasics_SensitiveEntity) anEntity = GetSensitiveEntity();
+  switch (theRow)
+  {
+    case 3: anEntity->SetSensitivityFactor(theValue.toInt());
+    //case 5: aPrs->SetCurrentFacingModel (Aspect::TypeOfFacingModelFromString (theValue.toString().toStdString().c_str()));
+    //case 6: aPrs->SetInfiniteState (theValue.toBool());
+    //case 12: aPrs->SetAutoHilight(theValue.toBool());
+    //case 17: aPrs->SetTypeOfPresentation (PrsMgr::TypeOfPresentation3dFromString (theValue.toString().toStdString().c_str()));
+    //case 18: aPrs->SetMutable (theValue.toBool());
+    default: return false;
+  }
+  return true;
+}
+
+// =======================================================================
+// function : getTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemSelectBasicsSensitiveEntity::getTableData (const int theRow,
+                                                                   const int theColumn,
+                                                                   const int,
+                                                                   const TCollection_AsciiString& theEntityKind) const
+{
+  Handle(Select3D_SensitiveEntity) aBaseEntity = Handle(Select3D_SensitiveEntity)::DownCast (GetSensitiveEntity());
+  if (aBaseEntity.IsNull())
+    return QVariant();
+
+  int aRow = theRow - 11;
+  bool isFirstColumn = theColumn == 0;
+
+  if (aRow == 0)
+    return isFirstColumn ? QVariant ("CenterOfGeometry")
+                         : QVariant (ViewControl_Tools::ToString (aBaseEntity->CenterOfGeometry()).ToCString());
+  aRow = aRow - 1; // for Select3D_SensitiveEntity common value
+
+  Handle(Select3D_SensitiveSet) aSetEntity = Handle(Select3D_SensitiveSet)::DownCast (aBaseEntity);
+  if (!aSetEntity.IsNull())
+  {
+    if (aRow == 0)
+    {
+      return isFirstColumn ? QVariant ("Size") : QVariant (aSetEntity->Size());
+    }
+    aRow = aRow - 1; // for Select3D_SensitiveSet common value
+  }
+  //if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveBox)->Name())
+  //{
+    //Handle(Select3D_SensitiveBox) anEntity = Handle(Select3D_SensitiveBox)::DownCast (aBaseEntity);
+  //}
+  if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveCircle)->Name())
+  {
+    Handle(Select3D_SensitiveCircle) anEntity = Handle(Select3D_SensitiveCircle)::DownCast (aBaseEntity);
+    //if (aRow == 0)
+  }
+  if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveCurve)->Name())
+  {
+    Handle(Select3D_SensitiveCurve) anEntity = Handle(Select3D_SensitiveCurve)::DownCast (aBaseEntity);
+    //if (aRow == 0)
+  }
+  if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveFace)->Name())
+  {
+    Handle(Select3D_SensitiveFace) anEntity = Handle(Select3D_SensitiveFace)::DownCast (aBaseEntity);
+    if (aRow == 0)
+    {
+      if (isFirstColumn)
+        return "GetPoints";
+      else
+      {
+        Handle(TColgp_HArray1OfPnt) aPoints;
+        anEntity->GetPoints (aPoints);
+        return ViewControl_Tools::ToString (aPoints).ToCString();
+      }
+    }
+  }
+  else if (theEntityKind == STANDARD_TYPE (Select3D_SensitivePoint)->Name())
+  {
+    Handle(Select3D_SensitivePoint) anEntity = Handle(Select3D_SensitivePoint)::DownCast (aBaseEntity);
+    if (aRow == 0)
+      return isFirstColumn ? QVariant ("Point") : QVariant (ViewControl_Tools::ToString (anEntity->Point()).ToCString());
+  }
+  else if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveSegment)->Name())
+  {
+    Handle(Select3D_SensitiveSegment) anEntity = Handle(Select3D_SensitiveSegment)::DownCast (aBaseEntity);
+    switch (aRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("StartPoint") : QVariant (ViewControl_Tools::ToString (anEntity->StartPoint()).ToCString());
+      case 1: return isFirstColumn ? QVariant ("EndPoint") : QVariant (ViewControl_Tools::ToString (anEntity->EndPoint()).ToCString());
+      default: break;
+    }
+  }
+  //Select3D_SensitiveSet
+  else if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveTriangle)->Name())
+  {
+    Handle(Select3D_SensitiveTriangle) anEntity = Handle(Select3D_SensitiveTriangle)::DownCast (aBaseEntity);
+    gp_Pnt aPnt0, aPnt1, aPnt2;
+    anEntity->Points3D (aPnt0, aPnt1, aPnt2);
+    switch (aRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("Points (0)") : QVariant (ViewControl_Tools::ToString (aPnt0).ToCString());
+      case 1: return isFirstColumn ? QVariant ("Points (1)") : QVariant (ViewControl_Tools::ToString (aPnt1).ToCString());
+      case 2: return isFirstColumn ? QVariant ("Points (2)") : QVariant (ViewControl_Tools::ToString (aPnt2).ToCString());
+      default: break;
+    }
+  }
+  //Select3D_InteriorSensitivePointSet
+  //Select3D_SensitiveGroup
+  else if (theEntityKind == STANDARD_TYPE (Select3D_SensitivePoly)->Name() ||
+           theEntityKind == STANDARD_TYPE (Select3D_SensitiveCircle)->Name() ||
+           theEntityKind == STANDARD_TYPE (Select3D_SensitiveCurve)->Name())
+  {
+    if (aRow == 0)
+    {
+      if (isFirstColumn)
+        return "GetPoints";
+      else
+      {
+        Handle(Select3D_SensitivePoly) anEntity = Handle(Select3D_SensitivePoly)::DownCast (aBaseEntity);
+        Handle(TColgp_HArray1OfPnt) aPoints;
+        anEntity->Points3D (aPoints);
+        return ViewControl_Tools::ToString (aPoints).ToCString();
+      }
+    }
+  }
+  //Select3D_SensitivePrimitiveArray
+  else if (theEntityKind == STANDARD_TYPE (Select3D_SensitiveTriangulation)->Name())
+  {
+    Handle(Select3D_SensitiveTriangulation) anEntity = Handle(Select3D_SensitiveTriangulation)::DownCast (aBaseEntity);
+    if (aRow == 0)
+      return isFirstColumn ? QVariant ("Triangulation") : QVariant (ViewControl_Tools::GetPointerInfo (anEntity->Triangulation()).ToCString());
+  }
+  //Select3D_SensitiveWire
+  return QVariant();
+}
+
+// =======================================================================
+// function : buildPresentationShape
+// purpose :
+// =======================================================================
+TopoDS_Shape VInspector_ItemSelectBasicsSensitiveEntity::buildPresentationShape
+  (const Handle(SelectBasics_SensitiveEntity)& theEntity)
+{
+  Handle(Select3D_SensitiveEntity) aBaseEntity = Handle(Select3D_SensitiveEntity)::DownCast (theEntity);
+  if (aBaseEntity.IsNull())
+    return TopoDS_Shape();
+
+  BRep_Builder aBuilder;
+  TopoDS_Compound aCompound;
+  aBuilder.MakeCompound (aCompound);
+
+  aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aBaseEntity->CenterOfGeometry()));
+
+  Standard_CString aTypeName = aBaseEntity->DynamicType()->Name();
+  if (aTypeName == STANDARD_TYPE (Select3D_SensitiveBox)->Name())
+  {
+    Handle(Select3D_SensitiveBox) anEntity = Handle(Select3D_SensitiveBox)::DownCast (aBaseEntity);
+    TopoDS_Shape aShape = VInspector_Tools::CreateShape(anEntity->Box());
+    aBuilder.Add (aCompound, aShape);
+  }
+  else if (aTypeName == STANDARD_TYPE (Select3D_SensitiveFace)->Name())
+  {
+    Handle(Select3D_SensitiveFace) anEntity = Handle(Select3D_SensitiveFace)::DownCast (aBaseEntity);
+    Handle(TColgp_HArray1OfPnt) aPoints;
+    anEntity->GetPoints (aPoints);
+    for (Standard_Integer aPntIter = aPoints->Lower(); aPntIter <= aPoints->Upper(); ++aPntIter)
+      aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPoints->Value (aPntIter)));
+  }
+  else if (aTypeName == STANDARD_TYPE (Select3D_SensitivePoint)->Name())
+  {
+    Handle(Select3D_SensitivePoint) anEntity = Handle(Select3D_SensitivePoint)::DownCast (aBaseEntity);
+    aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(anEntity->Point()));
+  }
+  else if (aTypeName == STANDARD_TYPE (Select3D_SensitiveSegment)->Name())
+  {
+    Handle(Select3D_SensitiveSegment) anEntity = Handle(Select3D_SensitiveSegment)::DownCast (aBaseEntity);
+    aBuilder.Add (aCompound, BRepBuilderAPI_MakeEdge(anEntity->StartPoint(), anEntity->EndPoint()));
+  }
+  else if (aTypeName == STANDARD_TYPE (Select3D_SensitiveTriangle)->Name())
+  {
+    Handle(Select3D_SensitiveTriangle) anEntity = Handle(Select3D_SensitiveTriangle)::DownCast (aBaseEntity);
+    gp_Pnt aPnt0, aPnt1, aPnt2;
+    anEntity->Points3D (aPnt0, aPnt1, aPnt2);
+    aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPnt0));
+    aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPnt1));
+    aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPnt2));
+  }
+  else if (aTypeName == STANDARD_TYPE (Select3D_SensitivePoly)->Name() ||
+           aTypeName == STANDARD_TYPE (Select3D_SensitiveCircle)->Name() ||
+           aTypeName == STANDARD_TYPE (Select3D_SensitiveCurve)->Name())
+  {
+    Handle(Select3D_SensitivePoly) anEntity = Handle(Select3D_SensitivePoly)::DownCast (aBaseEntity);
+
+    Handle(TColgp_HArray1OfPnt) aPoints;
+    anEntity->Points3D (aPoints);
+    for (Standard_Integer aPntIter = aPoints->Lower(); aPntIter <= aPoints->Upper(); ++aPntIter)
+      aBuilder.Add (aCompound, BRepBuilderAPI_MakeVertex(aPoints->Value (aPntIter)));
+  }
+  else if (aTypeName == STANDARD_TYPE (Select3D_SensitiveTriangulation)->Name())
+  {
+    Handle(Select3D_SensitiveTriangulation) anEntity = Handle(Select3D_SensitiveTriangulation)::DownCast (aBaseEntity);
+    const Handle(Poly_Triangulation)& aPolyTriangulation = anEntity->Triangulation();
+    if (!aPolyTriangulation.IsNull())
+    {
+      TopoDS_Face aFace;
+      aBuilder.MakeFace (aFace, aPolyTriangulation);
+      aBuilder.Add (aCompound, aFace);
+    }
+  }
+
+  return aCompound;
+}
diff --git a/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.hxx b/tools/VInspector/VInspector_ItemSelectBasicsSensitiveEntity.hxx
new file mode 100644 (file)
index 0000000..f8cf542
--- /dev/null
@@ -0,0 +1,132 @@
+// 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 VInspector_ItemSelectBasicsSensitiveEntity_H
+#define VInspector_ItemSelectBasicsSensitiveEntity_H
+
+#include <AIS_InteractiveObject.hxx>
+#include <SelectBasics_SensitiveEntity.hxx>
+#include <SelectBasics_SensitiveEntity.hxx>
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+class QItemSelectionModel;
+class SelectBasics_EntityOwner;
+class VInspector_ItemSelectBasicsSensitiveEntity;
+
+typedef QExplicitlySharedDataPointer<VInspector_ItemSelectBasicsSensitiveEntity> VInspector_ItemSelectBasicsSensitiveEntityPtr;
+
+//! \class VInspector_ItemSelectBasicsSensitiveEntity
+//! The item shows information about SelectBasics_EntityOwner.
+//! The parent is item selection, children are item entity owners
+class VInspector_ItemSelectBasicsSensitiveEntity : public VInspector_ItemBase
+{
+
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemSelectBasicsSensitiveEntityPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemSelectBasicsSensitiveEntityPtr (new VInspector_ItemSelectBasicsSensitiveEntity (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemSelectBasicsSensitiveEntity() Standard_OVERRIDE {};
+
+  //! \return the current sensitive entity
+  Standard_EXPORT Handle(SelectBasics_SensitiveEntity) GetSensitiveEntity() const;
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns presentation of the attribute to be visualized in the view
+  //! \thePresentations [out] container of presentation handles to be visualized
+  Standard_EXPORT virtual void GetPresentations (NCollection_List<Handle(Standard_Transient)>& thePresentations);
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! \return number of children.
+  virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+  //! Returns owner of the current sensitive entity
+  //! \return owner
+  Handle(SelectBasics_EntityOwner) getEntityOwner() const;
+
+  //! Returns table value for the row in form: <function name> <function value> depending on the aspect kind
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theEntityKind kind or kind of entity
+  QVariant getTableData (const int theRow,
+                         const int theColumn,
+                         const int theRole,
+                         const TCollection_AsciiString& theEntityKind) const;
+
+  //! Creates shape depending on the entity kind and parameters
+  //! \param theEntity current sensitive entity
+  //! \return shape or NULL
+  static TopoDS_Shape buildPresentationShape (const Handle(SelectBasics_SensitiveEntity)& theEntity);
+
+private:
+
+  //! Constructor
+  //! param theParent a parent item
+  VInspector_ItemSelectBasicsSensitiveEntity(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+private:
+
+  Handle(SelectBasics_SensitiveEntity) myEntity; //!< the current sensitive entity
+  Handle(AIS_InteractiveObject) myPresentation; //!< the current presentation
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemSelectMgrSelection.cxx b/tools/VInspector/VInspector_ItemSelectMgrSelection.cxx
new file mode 100644 (file)
index 0000000..01e69d3
--- /dev/null
@@ -0,0 +1,201 @@
+// 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/VInspector_ItemSelectMgrSelection.hxx>
+
+#include <AIS_ListOfInteractive.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+#include <SelectMgr_Selection.hxx>
+#include <SelectMgr_SensitiveEntity.hxx>
+#include <Standard_Version.hxx>
+#include <inspector/VInspector_ItemContext.hxx>
+#include <inspector/VInspector_ItemPresentableObject.hxx>
+#include <inspector/VInspector_ItemSelectMgrSensitiveEntity.hxx>
+#include <inspector/VInspector_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+
+#include <QColor>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : getSelection
+// purpose :
+// =======================================================================
+Handle(SelectMgr_Selection) VInspector_ItemSelectMgrSelection::getSelection() const
+{
+  initItem();
+  return mySelection;
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemSelectMgrSelection::initRowCount() const
+{
+  Handle(SelectMgr_Selection) aSelection = getSelection();
+#if OCC_VERSION_HEX < 0x070201
+  int aRows = 0;
+  for (aSelection->Init(); aSelection->More(); aSelection->Next())
+    aRows++;
+  return aRows;
+#else
+  return aSelection->Entities().Size();
+#endif
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemSelectMgrSelection::initValue (int theItemRole) const
+{
+  switch (theItemRole)
+  {
+    case Qt::DisplayRole:
+    case Qt::EditRole:
+    case Qt::ToolTipRole:
+    {
+      switch (Column())
+      {
+        case 0: return getSelection()->DynamicType()->Name();
+        case 1: return rowCount();
+        case 3:
+        {
+          if (theItemRole == Qt::ToolTipRole)
+            return "Mode";
+          else
+          {
+            VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
+            return VInspector_Tools::SelectionModeToName(getSelection()->Mode(), aParentItem->GetInteractiveObject()).ToCString();
+          }
+        }
+        case 4:
+        {
+          if (theItemRole == Qt::ToolTipRole)
+            return "SelectMgr_StateOfSelection";
+          else {
+            int aNbSelected = 0;
+            SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState();
+            if (aState == SelectMgr_SOS_Activated || aState == SelectMgr_SOS_Any)
+            {
+              Handle(AIS_InteractiveContext) aContext = GetContext();
+#if OCC_VERSION_HEX < 0x070201
+              for (mySelection->Init(); mySelection->More(); mySelection->Next())
+              {
+                const Handle(SelectBasics_EntityOwner)& anOwner = mySelection->Sensitive()->BaseSensitive()->OwnerId();
+#else
+              for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (mySelection->Entities()); aSelEntIter.More(); aSelEntIter.Next())
+              {
+                const Handle(SelectBasics_EntityOwner)& anOwner = aSelEntIter.Value()->BaseSensitive()->OwnerId();
+#endif
+                if (VInspector_Tools::IsOwnerSelected(aContext, anOwner))
+                  aNbSelected++;
+              }
+            }
+            return aNbSelected > 0 ? QString::number (aNbSelected) : "";
+          }
+        }
+        case 9:
+        {
+          SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState();
+          return VInspector_Tools::ToName (VInspector_SelectionType_StateOfSelection, aState).ToCString();
+        }
+        case 10: return QString::number (getSelection()->Sensitivity());
+        case 11:
+          return VInspector_Tools::ToName (VInspector_SelectionType_TypeOfUpdate,
+                                           getSelection()->UpdateStatus()).ToCString();
+        case 12:
+          return VInspector_Tools::ToName (VInspector_SelectionType_TypeOfBVHUpdate,
+                                           getSelection()->BVHUpdateStatus()).ToCString();
+        default:
+          break;
+      }
+      break;
+    }
+    case Qt::ForegroundRole:
+    {
+      SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState();
+      return QVariant (aState == SelectMgr_SOS_Activated ? QColor (Qt::black) : QColor (Qt::darkGray));
+    }
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemSelectMgrSelection::createChild (int theRow, int theColumn)
+{
+  return VInspector_ItemSelectMgrSensitiveEntity::CreateItem (currentItem(), theRow, theColumn);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectMgrSelection::Init()
+{
+  VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
+
+  Handle(AIS_InteractiveObject) anIO = aParentItem->GetInteractiveObject();
+
+  int aRowId = Row();
+  int aDeltaIndex = 2; // properties, presentation items
+  int aCurrentId = 0;
+#if OCC_VERSION_HEX < 0x070201
+  for (anIO->Init(); anIO->More(); anIO->Next(), aCurrentId++)
+#else
+  for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anIO->Selections()); aSelIter.More(); aSelIter.Next(), aCurrentId++)
+#endif
+  {
+    if (aCurrentId != aRowId - aDeltaIndex)
+      continue;
+#if OCC_VERSION_HEX < 0x070201
+    mySelection = anIO->CurrentSelection();
+#else
+    mySelection = aSelIter.Value();
+#endif
+    break;
+  }
+  TreeModel_ItemBase::Init();
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectMgrSelection::Reset()
+{
+  // an empty method to don't clear the main label, otherwise the model will be empty
+  TreeModel_ItemBase::Reset();
+
+  mySelection = NULL;
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectMgrSelection::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemSelectMgrSelection*>(this)->Init();
+  // an empty method to don't initialize the main label, as it was not cleared in Reset()
+}
diff --git a/tools/VInspector/VInspector_ItemSelectMgrSelection.hxx b/tools/VInspector/VInspector_ItemSelectMgrSelection.hxx
new file mode 100644 (file)
index 0000000..0c43351
--- /dev/null
@@ -0,0 +1,84 @@
+// 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 VInspector_ItemSelectMgrSelection_H
+#define VInspector_ItemSelectMgrSelection_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+#include <SelectMgr_Selection.hxx>
+
+class VInspector_ItemSelectMgrSelection;
+typedef QExplicitlySharedDataPointer<VInspector_ItemSelectMgrSelection> VInspector_ItemSelectMgrSelectionPtr;
+
+//! \class VInspector_ItemSelectMgrSelection
+//! Item about SelectMgr_Selection.
+//! Parent is presentable object item, children are sensitive entity items 
+class VInspector_ItemSelectMgrSelection : public VInspector_ItemBase
+{
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemSelectMgrSelectionPtr CreateItem(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemSelectMgrSelectionPtr (new VInspector_ItemSelectMgrSelection (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemSelectMgrSelection() {};
+
+  //! \return current selection value
+  Standard_EXPORT Handle(SelectMgr_Selection) getSelection() const;
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+protected:
+
+  //! Initializes the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Initializes number of children
+  //! \return integer value
+  virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! Constructor
+  //! param theParent a parent item
+  VInspector_ItemSelectMgrSelection(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+private:
+
+  Handle(SelectMgr_Selection) mySelection; //!< the current selection
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.cxx b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.cxx
new file mode 100644 (file)
index 0000000..14e30f9
--- /dev/null
@@ -0,0 +1,242 @@
+// 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/VInspector_ItemSelectMgrSensitiveEntity.hxx>
+#include <inspector/VInspector_ItemSelectBasicsSensitiveEntity.hxx>
+
+#include <AIS_ListOfInteractive.hxx>
+#include <SelectBasics_SensitiveEntity.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+#include <SelectMgr_Selection.hxx>
+#include <SelectMgr_SensitiveEntity.hxx>
+#include <Standard_Version.hxx>
+#include <StdSelect_BRepOwner.hxx>
+#include <TopoDS_Shape.hxx>
+#include <inspector/VInspector_ItemContext.hxx>
+#include <inspector/VInspector_ItemSelectBasicsEntityOwner.hxx>
+#include <inspector/VInspector_ItemSelectMgrSelection.hxx>
+#include <inspector/VInspector_Tools.hxx>
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+#include <QColor>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : GetSensitiveEntity
+// purpose :
+// =======================================================================
+Handle(SelectMgr_SensitiveEntity) VInspector_ItemSelectMgrSensitiveEntity::GetSensitiveEntity() const
+{
+  initItem();
+  return myEntity;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+int VInspector_ItemSelectMgrSensitiveEntity::initRowCount() const
+{
+  if (GetSensitiveEntity()->BaseSensitive().IsNull())
+    return 0;
+
+  return 2;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemSelectMgrSensitiveEntity::initValue (int theItemRole) const
+{
+  Handle(SelectMgr_SensitiveEntity) anEntity = GetSensitiveEntity();
+  Handle(SelectBasics_EntityOwner) anOwner = anEntity->BaseSensitive()->OwnerId();
+
+  switch (theItemRole)
+  {
+    case Qt::DisplayRole:
+    case Qt::EditRole:
+    case Qt::ToolTipRole:
+    {
+      switch (Column())
+      {
+        case 0: return anEntity->DynamicType()->Name();
+        /*case 2: return VInspector_Tools::GetPointerInfo (GetSensitiveEntity()->BaseSensitive()->OwnerId(), true).ToCString();
+        case 3:
+        {
+          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
+          if (BROwnr.IsNull())
+            return QVariant();
+
+          const TopoDS_Shape& aShape = BROwnr->Shape();
+          if (aShape.IsNull())
+            return QVariant();
+
+          return VInspector_Tools::GetShapeTypeInfo (aShape.ShapeType()).ToCString();
+        }
+        case 13: return
+#if OCC_VERSION_HEX <= 0x060901
+                       ("none");
+#else
+                       myEntity->IsActiveForSelection() ? QString ("true") : QString ("false");
+#endif
+        case 14: return QString::number (GetSensitiveEntity()->BaseSensitive()->SensitivityFactor());
+        case 15: return QString::number (GetSensitiveEntity()->BaseSensitive()->NbSubElements());
+        case 16:
+        {
+          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
+          if (BROwnr.IsNull())
+            return QVariant();
+          return anOwner->Priority();
+        }*/
+        default:
+          break;
+      }
+      break;
+    }
+    case Qt::BackgroundRole:
+    case Qt::ForegroundRole:
+    {
+      if (Column() == 2)
+      {
+        Handle(AIS_InteractiveContext) aContext = GetContext();
+        if (!aContext.IsNull())
+        {
+          if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner()))
+            return QVariant ((theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white));
+        }
+      }
+      VInspector_ItemSelectMgrSelectionPtr aParentItem = itemDynamicCast<VInspector_ItemSelectMgrSelection>(Parent());
+      if (aParentItem)
+        return aParentItem->data(QModelIndex(), theItemRole);
+      break;
+    }
+    default:
+    break;
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemSelectMgrSensitiveEntity::createChild (int theRow, int theColumn)
+{
+  if (theRow == 0)
+    return VInspector_ItemSelectBasicsEntityOwner::CreateItem (currentItem(), theRow, theColumn);
+  else if (theRow == 1)
+    return VInspector_ItemSelectBasicsSensitiveEntity::CreateItem (currentItem(), theRow, theColumn);
+
+  return TreeModel_ItemBasePtr();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectMgrSensitiveEntity::Init()
+{
+  VInspector_ItemSelectMgrSelectionPtr aParentItem = itemDynamicCast<VInspector_ItemSelectMgrSelection>(Parent());
+
+  Handle(SelectMgr_Selection) aSelection = aParentItem->getSelection();
+
+  int aRowId = Row();
+  int aCurrentId = 0;
+#if OCC_VERSION_HEX < 0x070201
+  for (aSelection->Init(); aSelection->More(); aSelection->Next(), aCurrentId++)
+#else
+  for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More(); aSelEntIter.Next(), aCurrentId++)
+#endif
+  {
+    if (aCurrentId != aRowId)
+      continue;
+#if OCC_VERSION_HEX < 0x070201
+    myEntity = aSelection->Sensitive();
+#else
+    myEntity = aSelEntIter.Value();
+#endif
+    break;
+  }
+  TreeModel_ItemBase::Init();
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectMgrSensitiveEntity::Reset()
+{
+  // an empty method to don't clear the main label, otherwise the model will be empty
+  TreeModel_ItemBase::Reset();
+  myEntity = NULL;
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+void VInspector_ItemSelectMgrSensitiveEntity::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemSelectMgrSensitiveEntity*>(this)->Init();
+}
+
+// =======================================================================
+// function : getEntityOwner
+// purpose :
+// =======================================================================
+Handle(SelectBasics_EntityOwner) VInspector_ItemSelectMgrSensitiveEntity::getEntityOwner() const
+{
+  initItem();
+
+  Handle(SelectBasics_EntityOwner) anOwner;
+  const Handle(SelectBasics_SensitiveEntity)& aBase = myEntity->BaseSensitive();
+  if (aBase.IsNull())
+    return anOwner;
+  return aBase->OwnerId();
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemSelectMgrSensitiveEntity::GetTableRowCount() const
+{
+  return 1;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemSelectMgrSensitiveEntity::GetTableData(const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+  bool isFirstColumn = theColumn == 0;
+  Handle(SelectMgr_SensitiveEntity) anEntity = GetSensitiveEntity();
+  switch (theRow)
+  {
+    case 0: return isFirstColumn ? QVariant ("IsActiveForSelection") : QVariant (anEntity->IsActiveForSelection());
+    default: return QVariant();
+  }
+}
diff --git a/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.hxx b/tools/VInspector/VInspector_ItemSelectMgrSensitiveEntity.hxx
new file mode 100644 (file)
index 0000000..1972846
--- /dev/null
@@ -0,0 +1,99 @@
+// 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 VInspector_ItemSelectMgrSensitiveEntity_H
+#define VInspector_ItemSelectMgrSensitiveEntity_H
+
+#include <SelectMgr_SensitiveEntity.hxx>
+#include <SelectBasics_SensitiveEntity.hxx>
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+class SelectBasics_EntityOwner;
+class VInspector_ItemSelectMgrSensitiveEntity;
+
+typedef QExplicitlySharedDataPointer<VInspector_ItemSelectMgrSensitiveEntity> VInspector_ItemSelectMgrSensitiveEntityPtr;
+
+//! \class VInspector_ItemSelectMgrSensitiveEntity
+//! The item shows information about SelectBasics_EntityOwner.
+//! The parent is item selection, children are item entity owners
+class VInspector_ItemSelectMgrSensitiveEntity : public VInspector_ItemBase
+{
+
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemSelectMgrSensitiveEntityPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemSelectMgrSensitiveEntityPtr (new VInspector_ItemSelectMgrSensitiveEntity (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemSelectMgrSensitiveEntity() Standard_OVERRIDE {};
+
+  //! \return the current sensitive entity
+  Standard_EXPORT Handle(SelectMgr_SensitiveEntity) GetSensitiveEntity() const;
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData(const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! \return number of children.
+  virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+  //! Returns owner of the current sensitive entity
+  //! \return owner
+  Handle(SelectBasics_EntityOwner) getEntityOwner() const;
+
+private:
+
+  //! Constructor
+  //! param theParent a parent item
+  VInspector_ItemSelectMgrSensitiveEntity(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+private:
+
+  Handle(SelectMgr_SensitiveEntity) myEntity; //!< the current entity owner
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemSelection.cxx b/tools/VInspector/VInspector_ItemSelection.cxx
deleted file mode 100644 (file)
index bcfb5e9..0000000
+++ /dev/null
@@ -1,200 +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/VInspector_ItemSelection.hxx>
-
-#include <AIS_ListOfInteractive.hxx>
-#include <SelectMgr_EntityOwner.hxx>
-#include <SelectMgr_Selection.hxx>
-#include <SelectMgr_SensitiveEntity.hxx>
-#include <Standard_Version.hxx>
-#include <inspector/VInspector_ItemContext.hxx>
-#include <inspector/VInspector_ItemPresentableObject.hxx>
-#include <inspector/VInspector_ItemSensitiveEntity.hxx>
-#include <inspector/VInspector_Tools.hxx>
-
-#include <Standard_WarningsDisable.hxx>
-#include <QStringList>
-
-#include <QColor>
-#include <Standard_WarningsRestore.hxx>
-
-// =======================================================================
-// function : getSelection
-// purpose :
-// =======================================================================
-Handle(SelectMgr_Selection) VInspector_ItemSelection::getSelection() const
-{
-  initItem();
-  return mySelection;
-}
-
-// =======================================================================
-// function : initRowCount
-// purpose :
-// =======================================================================
-int VInspector_ItemSelection::initRowCount() const
-{
-  Handle(SelectMgr_Selection) aSelection = getSelection();
-#if OCC_VERSION_HEX < 0x070201
-  int aRows = 0;
-  for (aSelection->Init(); aSelection->More(); aSelection->Next())
-    aRows++;
-  return aRows;
-#else
-  return aSelection->Entities().Size();
-#endif
-}
-
-// =======================================================================
-// function : initValue
-// purpose :
-// =======================================================================
-QVariant VInspector_ItemSelection::initValue (int theItemRole) const
-{
-  switch (theItemRole)
-  {
-    case Qt::DisplayRole:
-    case Qt::EditRole:
-    case Qt::ToolTipRole:
-    {
-      switch (Column())
-      {
-        case 0: return getSelection()->DynamicType()->Name();
-        case 1: return rowCount();
-        case 3:
-        {
-          if (theItemRole == Qt::ToolTipRole)
-            return "Mode";
-          else
-          {
-            VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
-            return VInspector_Tools::SelectionModeToName(getSelection()->Mode(), aParentItem->GetInteractiveObject()).ToCString();
-          }
-        }
-        case 4:
-        {
-          if (theItemRole == Qt::ToolTipRole)
-            return "SelectMgr_StateOfSelection";
-          else {
-            int aNbSelected = 0;
-            SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState();
-            if (aState == SelectMgr_SOS_Activated || aState == SelectMgr_SOS_Any)
-            {
-              Handle(AIS_InteractiveContext) aContext = GetContext();
-#if OCC_VERSION_HEX < 0x070201
-              for (mySelection->Init(); mySelection->More(); mySelection->Next())
-              {
-                const Handle(SelectBasics_EntityOwner)& anOwner = mySelection->Sensitive()->BaseSensitive()->OwnerId();
-#else
-              for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (mySelection->Entities()); aSelEntIter.More(); aSelEntIter.Next())
-              {
-                const Handle(SelectBasics_EntityOwner)& anOwner = aSelEntIter.Value()->BaseSensitive()->OwnerId();
-#endif
-                if (VInspector_Tools::IsOwnerSelected(aContext, anOwner))
-                  aNbSelected++;
-              }
-            }
-            return aNbSelected > 0 ? QString::number (aNbSelected) : "";
-          }
-        }
-        case 9:
-        {
-          SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState();
-          return VInspector_Tools::ToName (VInspector_SelectionType_StateOfSelection, aState).ToCString();
-        }
-        case 10: return QString::number (getSelection()->Sensitivity());
-        case 11:
-          return VInspector_Tools::ToName (VInspector_SelectionType_TypeOfUpdate,
-                                           getSelection()->UpdateStatus()).ToCString();
-        case 12:
-          return VInspector_Tools::ToName (VInspector_SelectionType_TypeOfBVHUpdate,
-                                           getSelection()->BVHUpdateStatus()).ToCString();
-        default:
-          break;
-      }
-      break;
-    }
-    case Qt::ForegroundRole:
-    {
-      SelectMgr_StateOfSelection aState = getSelection()->GetSelectionState();
-      return QVariant (aState == SelectMgr_SOS_Activated ? QColor (Qt::black) : QColor (Qt::darkGray));
-    }
-  }
-  return QVariant();
-}
-
-// =======================================================================
-// function : createChild
-// purpose :
-// =======================================================================
-TreeModel_ItemBasePtr VInspector_ItemSelection::createChild (int theRow, int theColumn)
-{
-  return VInspector_ItemSensitiveEntity::CreateItem (currentItem(), theRow, theColumn);
-}
-
-// =======================================================================
-// function : Init
-// purpose :
-// =======================================================================
-void VInspector_ItemSelection::Init()
-{
-  VInspector_ItemPresentableObjectPtr aParentItem = itemDynamicCast<VInspector_ItemPresentableObject>(Parent());
-
-  Handle(AIS_InteractiveObject) anIO = aParentItem->GetInteractiveObject();
-
-  int aRowId = Row();
-  int aCurrentId = 0;
-#if OCC_VERSION_HEX < 0x070201
-  for (anIO->Init(); anIO->More(); anIO->Next(), aCurrentId++)
-#else
-  for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anIO->Selections()); aSelIter.More(); aSelIter.Next(), aCurrentId++)
-#endif
-  {
-    if (aCurrentId != aRowId)
-      continue;
-#if OCC_VERSION_HEX < 0x070201
-    mySelection = anIO->CurrentSelection();
-#else
-    mySelection = aSelIter.Value();
-#endif
-    break;
-  }
-  TreeModel_ItemBase::Init();
-}
-
-// =======================================================================
-// function : Reset
-// purpose :
-// =======================================================================
-void VInspector_ItemSelection::Reset()
-{
-  // an empty method to don't clear the main label, otherwise the model will be empty
-  TreeModel_ItemBase::Reset();
-
-  mySelection = NULL;
-}
-
-// =======================================================================
-// function : initItem
-// purpose :
-// =======================================================================
-void VInspector_ItemSelection::initItem() const
-{
-  if (IsInitialized())
-    return;
-  const_cast<VInspector_ItemSelection*>(this)->Init();
-  // an empty method to don't initialize the main label, as it was not cleared in Reset()
-}
diff --git a/tools/VInspector/VInspector_ItemSelection.hxx b/tools/VInspector/VInspector_ItemSelection.hxx
deleted file mode 100644 (file)
index f1565a6..0000000
+++ /dev/null
@@ -1,84 +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 VInspector_ItemSelection_H
-#define VInspector_ItemSelection_H
-
-#include <Standard.hxx>
-#include <inspector/VInspector_ItemBase.hxx>
-
-#include <SelectMgr_Selection.hxx>
-
-class VInspector_ItemSelection;
-typedef QExplicitlySharedDataPointer<VInspector_ItemSelection> VInspector_ItemSelectionPtr;
-
-//! \class VInspector_ItemSelection
-//! Item about SelectMgr_Selection.
-//! Parent is presentable object item, children are sensitive entity items 
-class VInspector_ItemSelection : public VInspector_ItemBase
-{
-public:
-
-  //! Creates an item wrapped by a shared pointer
-  static VInspector_ItemSelectionPtr CreateItem(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  { return VInspector_ItemSelectionPtr (new VInspector_ItemSelection (theParent, theRow, theColumn)); }
-
-  //! Destructor
-  virtual ~VInspector_ItemSelection() {};
-
-  //! \return current selection value
-  Standard_EXPORT Handle(SelectMgr_Selection) getSelection() const;
-
-  //! Inits the item, fills internal containers
-  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
-
-  //! Resets cached values
-  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
-
-protected:
-
-  //! Initializes the current item. It is empty because Reset() is also empty.
-  virtual void initItem() const Standard_OVERRIDE;
-
-  //! Initializes number of children
-  //! \return integer value
-  virtual int initRowCount() const Standard_OVERRIDE;
-
-  //! Returns item information for the given role. Fills internal container if it was not filled yet
-  //! \param theItemRole a value role
-  //! \return the value
-  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
-
-protected:
-
-  //! 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) Standard_OVERRIDE;
-
-private:
-
-  //! Constructor
-  //! param theParent a parent item
-  VInspector_ItemSelection(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  : VInspector_ItemBase(theParent, theRow, theColumn) {}
-
-private:
-
-  Handle(SelectMgr_Selection) mySelection; //!< the current selection
-};
-
-#endif
diff --git a/tools/VInspector/VInspector_ItemSensitiveEntity.cxx b/tools/VInspector/VInspector_ItemSensitiveEntity.cxx
deleted file mode 100644 (file)
index 5c244a1..0000000
+++ /dev/null
@@ -1,195 +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/VInspector_ItemSensitiveEntity.hxx>
-
-#include <AIS_ListOfInteractive.hxx>
-#include <SelectBasics_SensitiveEntity.hxx>
-#include <SelectMgr_EntityOwner.hxx>
-#include <SelectMgr_Selection.hxx>
-#include <SelectMgr_SensitiveEntity.hxx>
-#include <Standard_Version.hxx>
-#include <StdSelect_BRepOwner.hxx>
-#include <TopoDS_Shape.hxx>
-#include <inspector/VInspector_ItemContext.hxx>
-#include <inspector/VInspector_ItemEntityOwner.hxx>
-#include <inspector/VInspector_ItemSelection.hxx>
-#include <inspector/VInspector_Tools.hxx>
-
-#include <Standard_WarningsDisable.hxx>
-#include <QStringList>
-#include <QColor>
-#include <Standard_WarningsRestore.hxx>
-
-// =======================================================================
-// function : GetSensitiveEntity
-// purpose :
-// =======================================================================
-Handle(SelectMgr_SensitiveEntity) VInspector_ItemSensitiveEntity::GetSensitiveEntity() const
-{
-  initItem();
-  return myEntity;
-}
-
-// =======================================================================
-// function : initValue
-// purpose :
-// =======================================================================
-QVariant VInspector_ItemSensitiveEntity::initValue (int theItemRole) const
-{
-  Handle(SelectMgr_SensitiveEntity) aBase = GetSensitiveEntity();
-  Handle(SelectBasics_EntityOwner) anOwner = aBase->BaseSensitive()->OwnerId();
-
-  switch (theItemRole)
-  {
-    case Qt::DisplayRole:
-    case Qt::EditRole:
-    case Qt::ToolTipRole:
-    {
-      switch (Column())
-      {
-        case 0: return myEntity->DynamicType()->Name();
-        case 2: return VInspector_Tools::GetPointerInfo (GetSensitiveEntity()->BaseSensitive()->OwnerId(), true).ToCString();
-        case 3:
-        {
-          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
-          if (BROwnr.IsNull())
-            return QVariant();
-
-          const TopoDS_Shape& aShape = BROwnr->Shape();
-          if (aShape.IsNull())
-            return QVariant();
-
-          return VInspector_Tools::GetShapeTypeInfo (aShape.ShapeType()).ToCString();
-        }
-        case 13: return
-#if OCC_VERSION_HEX <= 0x060901
-                       ("none");
-#else
-                       myEntity->IsActiveForSelection() ? QString ("true") : QString ("false");
-#endif
-        case 14: return QString::number (GetSensitiveEntity()->BaseSensitive()->SensitivityFactor());
-        case 15: return QString::number (GetSensitiveEntity()->BaseSensitive()->NbSubElements());
-        case 16:
-        {
-          Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast (anOwner);
-          if (BROwnr.IsNull())
-            return QVariant();
-          return anOwner->Priority();
-        }
-        default:
-          break;
-      }
-      break;
-    }
-    case Qt::BackgroundRole:
-    case Qt::ForegroundRole:
-    {
-      if (Column() == 2)
-      {
-        Handle(AIS_InteractiveContext) aContext = GetContext();
-        if (!aContext.IsNull())
-        {
-          if (VInspector_Tools::IsOwnerSelected(aContext, getEntityOwner()))
-            return QVariant ((theItemRole == Qt::BackgroundRole) ? QColor (Qt::darkBlue) : QColor (Qt::white));
-        }
-      }
-      VInspector_ItemSelectionPtr aParentItem = itemDynamicCast<VInspector_ItemSelection>(Parent());
-      if (aParentItem)
-        return aParentItem->data(QModelIndex(), theItemRole);
-      break;
-    }
-    default:
-    break;
-  }
-  return QVariant();
-}
-
-// =======================================================================
-// function : createChild
-// purpose :
-// =======================================================================
-TreeModel_ItemBasePtr VInspector_ItemSensitiveEntity::createChild (int theRow, int theColumn)
-{
-  return VInspector_ItemEntityOwner::CreateItem (currentItem(), theRow, theColumn);
-}
-
-// =======================================================================
-// function : Init
-// purpose :
-// =======================================================================
-void VInspector_ItemSensitiveEntity::Init()
-{
-  VInspector_ItemSelectionPtr aParentItem = itemDynamicCast<VInspector_ItemSelection>(Parent());
-
-  Handle(SelectMgr_Selection) aSelection = aParentItem->getSelection();
-
-  int aRowId = Row();
-  int aCurrentId = 0;
-#if OCC_VERSION_HEX < 0x070201
-  for (aSelection->Init(); aSelection->More(); aSelection->Next(), aCurrentId++)
-#else
-  for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More(); aSelEntIter.Next(), aCurrentId++)
-#endif
-  {
-    if (aCurrentId != aRowId)
-      continue;
-#if OCC_VERSION_HEX < 0x070201
-    myEntity = aSelection->Sensitive();
-#else
-    myEntity = aSelEntIter.Value();
-#endif
-    break;
-  }
-  TreeModel_ItemBase::Init();
-}
-
-// =======================================================================
-// function : Reset
-// purpose :
-// =======================================================================
-void VInspector_ItemSensitiveEntity::Reset()
-{
-  // an empty method to don't clear the main label, otherwise the model will be empty
-  TreeModel_ItemBase::Reset();
-  myEntity = NULL;
-}
-
-// =======================================================================
-// function : initItem
-// purpose :
-// =======================================================================
-void VInspector_ItemSensitiveEntity::initItem() const
-{
-  if (IsInitialized())
-    return;
-  const_cast<VInspector_ItemSensitiveEntity*>(this)->Init();
-}
-
-// =======================================================================
-// function : getEntityOwner
-// purpose :
-// =======================================================================
-Handle(SelectBasics_EntityOwner) VInspector_ItemSensitiveEntity::getEntityOwner() const
-{
-  initItem();
-
-  Handle(SelectBasics_EntityOwner) anOwner;
-  const Handle(SelectBasics_SensitiveEntity)& aBase = myEntity->BaseSensitive();
-  if (aBase.IsNull())
-    return anOwner;
-  return aBase->OwnerId();
-}
diff --git a/tools/VInspector/VInspector_ItemSensitiveEntity.hxx b/tools/VInspector/VInspector_ItemSensitiveEntity.hxx
deleted file mode 100644 (file)
index ecda997..0000000
+++ /dev/null
@@ -1,90 +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 VInspector_ItemSensitiveEntity_H
-#define VInspector_ItemSensitiveEntity_H
-
-#include <SelectMgr_SensitiveEntity.hxx>
-#include <SelectBasics_SensitiveEntity.hxx>
-#include <Standard.hxx>
-#include <inspector/VInspector_ItemBase.hxx>
-
-class SelectBasics_EntityOwner;
-class VInspector_ItemSensitiveEntity;
-
-typedef QExplicitlySharedDataPointer<VInspector_ItemSensitiveEntity> VInspector_ItemSensitiveEntityPtr;
-
-//! \class VInspector_ItemSensitiveEntity
-//! The item shows information about SelectBasics_EntityOwner.
-//! The parent is item selection, children are item entity owners
-class VInspector_ItemSensitiveEntity : public VInspector_ItemBase
-{
-
-public:
-
-  //! Creates an item wrapped by a shared pointer
-  static VInspector_ItemSensitiveEntityPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  { return VInspector_ItemSensitiveEntityPtr (new VInspector_ItemSensitiveEntity (theParent, theRow, theColumn)); }
-
-  //! Destructor
-  virtual ~VInspector_ItemSensitiveEntity() Standard_OVERRIDE {};
-
-  //! \return the current sensitive entity
-  Standard_EXPORT Handle(SelectMgr_SensitiveEntity) GetSensitiveEntity() const;
-
-  //! Inits the item, fills internal containers
-  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
-
-  //! Resets cached values
-  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
-
-protected:
-
-  //! Initialize the current item. It is empty because Reset() is also empty.
-  virtual void initItem() const Standard_OVERRIDE;
-
-  //! \return number of children.
-  virtual int initRowCount() const Standard_OVERRIDE { return !GetSensitiveEntity()->BaseSensitive().IsNull() ? 1 : 0; }
-
-  //! Returns item information for the given role. Fills internal container if it was not filled yet
-  //! \param theItemRole a value role
-  //! \return the value
-  virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
-
-protected:
-
-  //! 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) Standard_OVERRIDE;
-
-  //! Returns owner of the current sensitive entity
-  //! \return owner
-  Handle(SelectBasics_EntityOwner) getEntityOwner() const;
-
-private:
-
-  //! Constructor
-  //! param theParent a parent item
-  VInspector_ItemSensitiveEntity(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
-  : VInspector_ItemBase(theParent, theRow, theColumn) {}
-
-private:
-
-  Handle(SelectMgr_SensitiveEntity) myEntity; //!< the current entity owner
-};
-
-#endif
diff --git a/tools/VInspector/VInspector_ItemV3dView.cxx b/tools/VInspector/VInspector_ItemV3dView.cxx
new file mode 100644 (file)
index 0000000..7fee49d
--- /dev/null
@@ -0,0 +1,193 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#include <inspector/VInspector_ItemV3dView.hxx>
+
+#include <AIS.hxx>
+#include <AIS_InteractiveContext.hxx>
+#include <inspector/VInspector_ItemContext.hxx>
+#include <inspector/VInspector_ItemGraphic3dClipPlane.hxx>
+#include <inspector/VInspector_ItemV3dViewer.hxx>
+#include <inspector/VInspector_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+Handle(Graphic3d_ClipPlane) VInspector_ItemV3dView::GetClipPlane(const int theRow)
+{
+  Handle(V3d_View) aView = GetView();
+
+  const Handle(Graphic3d_SequenceOfHClipPlane)& aClipPlanes = aView->ClipPlanes();
+
+  Standard_Integer aPlaneId = 0;
+  for (Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt (*aClipPlanes); aPlaneIt.More(); aPlaneIt.Next(), ++aPlaneId)
+  {
+    if (aPlaneId == theRow)
+      return aPlaneIt.Value();
+  }
+  return 0;
+}
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemV3dView::initRowCount() const
+{
+  if (Column() != 0)
+    return 0;
+
+  return 1; // ClipPlanes
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemV3dView::initValue (const int theItemRole) const
+{
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  if (GetView().IsNull())
+    return Column() == 0 ? "Empty view" : "";
+
+  switch (Column())
+  {
+    case 0: return GetView()->DynamicType()->Name();
+    case 1: return rowCount();
+    default:
+      break;
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void VInspector_ItemV3dView::Init()
+{
+  VInspector_ItemV3dViewerPtr aParentItem = itemDynamicCast<VInspector_ItemV3dViewer>(Parent());
+  Handle(V3d_View) aView;
+  if (aParentItem)
+  {
+    Handle(V3d_Viewer) aViewer = aParentItem->GetViewer();
+    aViewer->InitActiveViews();
+    aView = aViewer->ActiveView();
+  }
+  setView (aView);
+  TreeModel_ItemBase::Init(); // to use getIO() without circling initialization
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+
+void VInspector_ItemV3dView::Reset()
+{
+  VInspector_ItemBase::Reset();
+
+  setView (NULL);
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+
+void VInspector_ItemV3dView::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemV3dView*>(this)->Init();
+}
+
+// =======================================================================
+// function : GetView
+// purpose :
+// =======================================================================
+
+Handle(V3d_View) VInspector_ItemV3dView::GetView() const
+{
+  initItem();
+  return myView;
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemV3dView::GetTableRowCount() const
+{
+  return 0;
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemV3dView::GetTableEditType (const int theRow, const int) const
+{
+  return ViewControl_EditType_None;
+}
+
+// =======================================================================
+// function : GetTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemV3dView::GetTableEnumValues (const int theRow, const int) const
+{
+  QList<QVariant> aValues;
+  return aValues;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemV3dView::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+}
+
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemV3dView::SetTableData (const int theRow, const int, const QVariant& theValue)
+{
+  return true;
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemV3dView::createChild (int theRow, int theColumn)
+{
+  if (theRow == 0)
+    return VInspector_ItemGraphic3dClipPlane::CreateItem (currentItem(), theRow, theColumn);
+
+  return TreeModel_ItemBasePtr();
+}
diff --git a/tools/VInspector/VInspector_ItemV3dView.hxx b/tools/VInspector/VInspector_ItemV3dView.hxx
new file mode 100644 (file)
index 0000000..05f9703
--- /dev/null
@@ -0,0 +1,124 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef VInspector_ItemV3dView_H
+#define VInspector_ItemV3dView_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+#include <V3d_View.hxx>
+
+class VInspector_ItemV3dView;
+typedef QExplicitlySharedDataPointer<VInspector_ItemV3dView> VInspector_ItemV3dViewPtr;
+
+//! \class VInspector_ItemV3dView
+//! Parent item, that corresponds to AIS_InteractiveContext
+//! Children of the item are:
+//! - "Property" item to show context attributes such as selection filters and drawer properties
+//! - presentation items to show all interactive elements displayed/erased in the context
+class VInspector_ItemV3dView : public VInspector_ItemBase
+{
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemV3dViewPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemV3dViewPtr (new VInspector_ItemV3dView (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemV3dView() Standard_OVERRIDE {};
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns current drawer, initialize the drawer if it was not initialized yet
+  Standard_EXPORT Handle(V3d_View) GetView() const;
+
+  //! Returns clip plane of the row if possible
+  //! \param theRow child row index
+  Standard_EXPORT Handle(Graphic3d_ClipPlane) GetClipPlane(const int theRow);
+
+protected:
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of displayed presentations
+  //! \return rows count
+  Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! Set V3d view into the current field
+  //! \param theViewer a viewer
+  void setView (const Handle(V3d_View)& theView) { myView = theView; }
+
+private:
+
+  //! 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
+  VInspector_ItemV3dView(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+    : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+protected:
+
+  Handle(V3d_View) myView; //!< the current view
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_ItemV3dViewer.cxx b/tools/VInspector/VInspector_ItemV3dViewer.cxx
new file mode 100644 (file)
index 0000000..d8ce0df
--- /dev/null
@@ -0,0 +1,174 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#include <inspector/VInspector_ItemV3dViewer.hxx>
+
+#include <AIS.hxx>
+#include <AIS_InteractiveContext.hxx>
+#include <inspector/VInspector_ItemContext.hxx>
+#include <inspector/VInspector_ItemFolderObject.hxx>
+#include <inspector/VInspector_ItemV3dView.hxx>
+#include <inspector/VInspector_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QStringList>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : initRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemV3dViewer::initRowCount() const
+{
+  if (Column() != 0)
+    return 0;
+
+  return 1;
+}
+
+// =======================================================================
+// function : initValue
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemV3dViewer::initValue (const int theItemRole) const
+{
+  if (theItemRole != Qt::DisplayRole && theItemRole != Qt::EditRole && theItemRole != Qt::ToolTipRole)
+    return QVariant();
+
+  if (GetViewer().IsNull())
+    return Column() == 0 ? "Empty viewer" : "";
+
+  switch (Column())
+  {
+    case 0: return GetViewer()->DynamicType()->Name();
+    case 1: return rowCount();
+    default:
+      break;
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void VInspector_ItemV3dViewer::Init()
+{
+  VInspector_ItemFolderObjectPtr aParentItem = itemDynamicCast<VInspector_ItemFolderObject>(Parent());
+  Handle(V3d_Viewer) aViewer;
+  if (aParentItem)
+  {
+    VInspector_ItemContextPtr aParentContextItem = itemDynamicCast<VInspector_ItemContext>(aParentItem->Parent());
+    if (aParentContextItem)
+    {
+      Handle(AIS_InteractiveContext) aContext = aParentContextItem->GetContext();
+      aViewer = aContext->CurrentViewer();
+    }
+  }
+  setViewer (aViewer);
+  TreeModel_ItemBase::Init(); // to use getIO() without circling initialization
+}
+
+// =======================================================================
+// function : Reset
+// purpose :
+// =======================================================================
+
+void VInspector_ItemV3dViewer::Reset()
+{
+  VInspector_ItemBase::Reset();
+
+  setViewer (NULL);
+}
+
+// =======================================================================
+// function : initItem
+// purpose :
+// =======================================================================
+
+void VInspector_ItemV3dViewer::initItem() const
+{
+  if (IsInitialized())
+    return;
+  const_cast<VInspector_ItemV3dViewer*>(this)->Init();
+}
+
+// =======================================================================
+// function : GetViewer
+// purpose :
+// =======================================================================
+
+Handle(V3d_Viewer) VInspector_ItemV3dViewer::GetViewer() const
+{
+  initItem();
+  return myViewer;
+}
+
+// =======================================================================
+// function : GetTableRowCount
+// purpose :
+// =======================================================================
+int VInspector_ItemV3dViewer::GetTableRowCount() const
+{
+  return 0;
+}
+
+// =======================================================================
+// function : GetTableEditType
+// purpose :
+// =======================================================================
+ViewControl_EditType VInspector_ItemV3dViewer::GetTableEditType (const int theRow, const int) const
+{
+  return ViewControl_EditType_None;
+}
+
+// =======================================================================
+// function : GetTableEnumValues
+// purpose :
+// =======================================================================
+QList<QVariant> VInspector_ItemV3dViewer::GetTableEnumValues (const int theRow, const int) const
+{
+  QList<QVariant> aValues;
+  return aValues;
+}
+
+// =======================================================================
+// function : GetTableData
+// purpose :
+// =======================================================================
+QVariant VInspector_ItemV3dViewer::GetTableData (const int theRow, const int theColumn, const int theRole) const
+{
+  if (theRole != Qt::DisplayRole)
+    return QVariant();
+}
+
+// =======================================================================
+// function : SetTableData
+// purpose :
+// =======================================================================
+bool VInspector_ItemV3dViewer::SetTableData (const int theRow, const int, const QVariant& theValue)
+{
+  return true;
+}
+
+// =======================================================================
+// function : createChild
+// purpose :
+// =======================================================================
+TreeModel_ItemBasePtr VInspector_ItemV3dViewer::createChild (int theRow, int theColumn)
+{
+  return VInspector_ItemV3dView::CreateItem (currentItem(), theRow, theColumn);
+}
diff --git a/tools/VInspector/VInspector_ItemV3dViewer.hxx b/tools/VInspector/VInspector_ItemV3dViewer.hxx
new file mode 100644 (file)
index 0000000..ebdde76
--- /dev/null
@@ -0,0 +1,120 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef VInspector_ItemV3dViewer_H
+#define VInspector_ItemV3dViewer_H
+
+#include <Standard.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+
+#include <V3d_Viewer.hxx>
+
+class VInspector_ItemV3dViewer;
+typedef QExplicitlySharedDataPointer<VInspector_ItemV3dViewer> VInspector_ItemV3dViewerPtr;
+
+//! \class VInspector_ItemV3dViewer
+//! Parent item, that corresponds to AIS_InteractiveContext
+//! Children of the item are:
+//! - "Property" item to show context attributes such as selection filters and drawer properties
+//! - presentation items to show all interactive elements displayed/erased in the context
+class VInspector_ItemV3dViewer : public VInspector_ItemBase
+{
+public:
+
+  //! Creates an item wrapped by a shared pointer
+  static VInspector_ItemV3dViewerPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+  { return VInspector_ItemV3dViewerPtr (new VInspector_ItemV3dViewer (theParent, theRow, theColumn)); }
+
+  //! Destructor
+  virtual ~VInspector_ItemV3dViewer() Standard_OVERRIDE {};
+
+  //! Inits the item, fills internal containers
+  Standard_EXPORT virtual void Init() Standard_OVERRIDE;
+
+  //! Resets cached values
+  Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
+
+  //! Returns current drawer, initialize the drawer if it was not initialized yet
+  Standard_EXPORT Handle(V3d_Viewer) GetViewer() const;
+
+protected:
+  //! Initialize the current item. It is empty because Reset() is also empty.
+  virtual void initItem() const Standard_OVERRIDE;
+
+  //! Returns number of displayed presentations
+  //! \return rows count
+  Standard_EXPORT virtual int initRowCount() const Standard_OVERRIDE;
+
+  //! Returns item information for the given role. Fills internal container if it was not filled yet
+  //! \param theItemRole a value role
+  //! \return the value
+  Standard_EXPORT virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
+
+  //! Returns number of table rows
+  //! \return an integer value
+  virtual int GetTableRowCount() const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetTableEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetTableEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns table value for the row in form: <function name> <function value>
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  virtual QVariant GetTableData (const int theRow, const int theColumn, const int theRole) const Standard_OVERRIDE;
+
+  //! Sets the value into the table cell. Only 1st column value might be modified.
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theValue a new cell value
+  virtual bool SetTableData (const int theRow, const int theColumn, const QVariant& theValue) Standard_OVERRIDE;
+
+protected:
+
+  //! 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) Standard_OVERRIDE;
+
+private:
+
+  //! Set V3d viewer into the current field
+  //! \param theViewer a viewer
+  void setViewer (const Handle(V3d_Viewer)& theViewer) { myViewer = theViewer; }
+
+private:
+
+  //! 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
+  VInspector_ItemV3dViewer(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
+    : VInspector_ItemBase(theParent, theRow, theColumn) {}
+
+protected:
+
+  Handle(V3d_Viewer) myViewer; //!< the current viewer
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_PrsOpenGlElement.cxx b/tools/VInspector/VInspector_PrsOpenGlElement.cxx
new file mode 100644 (file)
index 0000000..cf7f6ad
--- /dev/null
@@ -0,0 +1,50 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#include <inspector/VInspector_PrsOpenGlElement.hxx>
+
+#include <OpenGl_Workspace.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(VInspector_PrsOpenGlElement, AIS_InteractiveObject)
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+VInspector_PrsOpenGlElement::VInspector_PrsOpenGlElement ()
+: AIS_InteractiveObject ()
+{
+}
+
+// =======================================================================
+// function : Compute
+// purpose :
+// =======================================================================
+void VInspector_PrsOpenGlElement::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
+                                           const Handle(Prs3d_Presentation)& thePrs,
+                                           const Standard_Integer /*theMode*/)
+{
+  thePrs->Clear();
+
+  Handle(OpenGl_Group) aGroup = Handle(OpenGl_Group)::DownCast (thePrs->NewGroup());
+  aGroup->SetDestroyElements (Standard_False);
+  for (NCollection_List<OpenGl_Element*>::Iterator anElementsIt (myElements); anElementsIt.More(); anElementsIt.Next())
+  {
+    OpenGl_Element* anElement = anElementsIt.Value();
+    aGroup->AddElement (anElement);
+  }
+  // invalidate bounding box of the scene
+  thePrsMgr->StructureManager()->Update();
+}
diff --git a/tools/VInspector/VInspector_PrsOpenGlElement.hxx b/tools/VInspector/VInspector_PrsOpenGlElement.hxx
new file mode 100644 (file)
index 0000000..3c49589
--- /dev/null
@@ -0,0 +1,68 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef VInspector_PrsOpenGlElement_H
+#define VInspector_PrsOpenGlElement_H
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+#include <AIS_InteractiveObject.hxx>
+#include <NCollection_List.hxx>
+#include <OpenGl_Element.hxx>
+
+class OpenGl_Workspace;
+
+DEFINE_STANDARD_HANDLE(VInspector_PrsOpenGlElement, AIS_InteractiveObject)
+
+//! \class VInspector_PrsOpenGlElement
+//! Presentation to display container of OpenGl_Element
+class VInspector_PrsOpenGlElement : public AIS_InteractiveObject
+{
+public:
+
+  //! Constructor
+  Standard_EXPORT VInspector_PrsOpenGlElement();
+
+  //! Destructor
+  ~VInspector_PrsOpenGlElement() { myElements.Clear(); }
+
+  //! Fills internal container of elements
+  //! \param theElements elements to be displayed
+  void Set (const NCollection_List<OpenGl_Element*>& theElements) { myElements = theElements; }
+
+private:
+  //! Calculates the 3D view aPresentation and its updates.
+  //! \param thePrsMgr processor for the presentation
+  //! \param thePrs presentation
+  //! \param theMode presentable object display mode
+  Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
+                                        const Handle(Prs3d_Presentation)& thePrs,
+                                        const Standard_Integer theMode) Standard_OVERRIDE;
+
+  //! Recovers and calculates any sensitive primitive,
+  //! aSelection, available in Shape mode, specified by
+  //! aMode
+  Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
+                                                 const Standard_Integer theMode) {}
+
+  // OCCT RTTI
+  DEFINE_STANDARD_RTTIEXT(VInspector_PrsOpenGlElement, AIS_InteractiveObject)
+
+private:
+  NCollection_List<OpenGl_Element*> myElements;
+};
+
+#endif
diff --git a/tools/VInspector/VInspector_TableModelValues.cxx b/tools/VInspector/VInspector_TableModelValues.cxx
new file mode 100644 (file)
index 0000000..5127d9a
--- /dev/null
@@ -0,0 +1,149 @@
+// 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/VInspector_TableModelValues.hxx>
+
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableModelFilter.hxx>
+#include <inspector/VInspector_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QFont>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+VInspector_TableModelValues::VInspector_TableModelValues (const TreeModel_ItemBasePtr& theItem)
+ : ViewControl_TableModelValues(), myItem (theItem)
+{
+  QList<TreeModel_HeaderSection> aHeaderValues;
+  aHeaderValues.append(TreeModel_HeaderSection ("Function", 190));
+  aHeaderValues.append(TreeModel_HeaderSection ("Value", -2));
+  SetHeaderValues(aHeaderValues, Qt::Horizontal);
+
+  SetHeaderVisible(Qt::Horizontal, Standard_False);
+  SetHeaderVisible(Qt::Vertical, Standard_False);
+
+  SetUseTableSeparateSize (false);
+  SetUseTableProperties (false);
+  SetUseTablePropertiesXStep (false, -1);
+}
+
+// =======================================================================
+// function : Data
+// purpose :
+// =======================================================================
+
+QVariant VInspector_TableModelValues::Data (const int theRow, const int theColumn, int theRole) const
+{
+  switch (theRole)
+  {
+    case Qt::FontRole:
+    {
+      if (theColumn == 0)
+      {
+        QFont aFont = qApp->font();
+        aFont.setItalic (true);
+        return aFont;
+      }
+    }
+    case Qt::ForegroundRole:
+    {
+      if (theColumn == 0)
+        return QColor (Qt::darkGray).darker(150);
+      else if (GetEditType (theRow, theColumn) != ViewControl_EditType_None)
+        return ViewControl_TableModelValues::EditCellColor();
+    }
+    default:
+      return GetItem()->GetTableData (theRow, theColumn, theRole);
+  }
+}
+
+// =======================================================================
+// function : GetRangeValues
+// purpose :
+// =======================================================================
+
+bool VInspector_TableModelValues::SetData (const int theRow, const int theColumn, const QVariant& theValue, int theRole)
+{
+  if (theRole != Qt::EditRole)
+    return false;
+
+  return GetItem()->SetTableData (theRow, theColumn, theValue);
+}
+
+// =======================================================================
+// function : Flags
+// purpose :
+// =======================================================================
+
+Qt::ItemFlags VInspector_TableModelValues::Flags (const QModelIndex& theIndex) const
+{
+  Qt::ItemFlags aFlags = ViewControl_TableModelValues::Flags (theIndex);
+
+  if (theIndex.column() == 1)
+    aFlags = aFlags | Qt::ItemIsEditable;
+
+  return aFlags;
+}
+
+// =======================================================================
+// function : GetRangeValues
+// purpose :
+// =======================================================================
+
+int VInspector_TableModelValues::GetValuesCount () const
+{
+  return GetItem()->GetTableRowCount() * 2;
+}
+
+// =======================================================================
+// function : GetEditType
+// purpose :
+// =======================================================================
+
+ViewControl_EditType VInspector_TableModelValues::GetEditType (const int theRow, const int theColumn) const
+{
+  if (theColumn == 0)
+    return ViewControl_EditType_None;
+
+  return GetItem()->GetTableEditType (theRow, theColumn);
+}
+
+// =======================================================================
+// function : GetEnumValues
+// purpose :
+// =======================================================================
+
+QList<QVariant> VInspector_TableModelValues::GetEnumValues (const int theRow, const int theColumn) const
+{
+  if (theColumn != 1)
+    return QList<QVariant>();
+
+  return GetItem()->GetTableEnumValues (theRow, theColumn);
+}
+
+// =======================================================================
+// function : GetItem
+// purpose :
+// =======================================================================
+
+VInspector_ItemBasePtr VInspector_TableModelValues::GetItem() const
+{
+  return itemDynamicCast<VInspector_ItemBase>(myItem);
+}
diff --git a/tools/VInspector/VInspector_TableModelValues.hxx b/tools/VInspector/VInspector_TableModelValues.hxx
new file mode 100644 (file)
index 0000000..527d1b7
--- /dev/null
@@ -0,0 +1,90 @@
+// 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 VInspector_TableModelValues_H
+#define VInspector_TableModelValues_H
+
+#include <inspector/ViewControl_TableModelValues.hxx>
+#include <inspector/ViewControl_TableModelFilter.hxx>
+#include <inspector/VInspector_ItemBase.hxx>
+#include <inspector/TreeModel_ItemBase.hxx>
+
+//! \class VInspector_TableModelValues
+//! \brief This is an implementation for ViewControl_TableModel to present tree item values
+class VInspector_TableModelValues : public ViewControl_TableModelValues
+{
+public:
+
+  //! Constructor
+  Standard_EXPORT VInspector_TableModelValues (const TreeModel_ItemBasePtr& theItem);
+
+  //! Destructor
+  virtual ~VInspector_TableModelValues() Standard_OVERRIDE {}
+
+  //! Returns number of columns. It has two columns: <funciton name> <function value>
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  Standard_EXPORT virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const
+  { (void)theParent; return 2; }
+
+  //! 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 theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theRole a view role
+  //! \return value intepreted depending on the given role
+  Standard_EXPORT virtual QVariant Data (const int theRow, const int theColumn, int theRole = Qt::DisplayRole) const;
+
+  //! Sets content of the model index for the given role, it is applyed 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 flags for the item: ItemIsEnabled | Qt::ItemIsSelectable.
+  //! Additional flag for the column 1 is Qt::ItemIsEditable.
+  //! \param theIndex a model index
+  //! \return flags
+  virtual Qt::ItemFlags Flags (const QModelIndex& theIndex) const Standard_OVERRIDE;
+
+  //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  virtual int GetValuesCount () const Standard_OVERRIDE;
+
+  //! 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
+  virtual ViewControl_EditType GetEditType (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetEnumValues (const int theRow, const int theColumn) const Standard_OVERRIDE;
+
+private:
+
+  //!< Returns source item base
+  VInspector_ItemBasePtr GetItem() const;
+
+private:
+  TreeModel_ItemBasePtr myItem; //!< source item base
+};
+
+#endif
index 795a45e8d602f83efd5cd7520a0ab9001080421f..7db5f8704869b970db83896b37b7dba0f799d417 100644 (file)
 
 #include <inspector/VInspector_Tools.hxx>
 
+#include <inspector/ViewControl_TableModelValues.hxx>
+#include <inspector/VInspector_ItemFolderObject.hxx>
+#include <inspector/VInspector_TableModelValues.hxx>
+
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
 #include <AIS_ListOfInteractive.hxx>
+#include <Standard_Version.hxx>
+#if OCC_VERSION_HEX < 0x060901
+#include <AIS_LocalContext.hxx>
+#endif
 #include <AIS_Selection.hxx>
 #include <AIS_Shape.hxx>
 #include <AIS_Trihedron.hxx>
 #include <BRep_Builder.hxx>
+#include <BRepPrimAPI_MakeBox.hxx>
 #include <BRepTools.hxx>
-#include <gp_Trsf.hxx>
+#include <Graphic3d.hxx>
+#include <Graphic3d_IndexBuffer.hxx>
+#include <Graphic3d_Buffer.hxx>
+#include <Graphic3d_BoundBuffer.hxx>
+
 #include <SelectMgr_StateOfSelection.hxx>
 #include <SelectMgr_TypeOfUpdate.hxx>
 #include <SelectMgr_TypeOfBVHUpdate.hxx>
@@ -234,11 +247,23 @@ void VInspector_Tools::AddOrRemoveSelectedShapes (const Handle(AIS_InteractiveCo
 
   theContext->UnhilightSelected(Standard_False);
 
+  //TODO: processing in local context only
+#if OCC_VERSION_HEX < 0x060901
+  Handle(AIS_LocalContext) aLContext = theContext->LocalContext();
+  TCollection_AsciiString aSelectionName = aLContext->SelectionName();
+  aLContext->UnhilightPicked(Standard_False);
+#endif
+
   for (NCollection_List<Handle(SelectBasics_EntityOwner)>::Iterator anOwnersIt(theOwners);
        anOwnersIt.More(); anOwnersIt.Next())
   {
     Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anOwnersIt.Value());
+#if OCC_VERSION_HEX > 0x060901
     theContext->AddOrRemoveSelected (anOwner, Standard_False);
+#else
+    AIS_Selection::Selection(aSelectionName.ToCString())->Select(anOwner);
+    anOwner->SetSelected(Standard_True);
+#endif
   }
   theContext->UpdateCurrentViewer();
 }
@@ -468,37 +493,159 @@ TCollection_AsciiString VInspector_Tools::OrientationToName (const TopAbs_Orient
 }
 
 // =======================================================================
-// function : LocationToName
+// function : ReadShape
 // purpose :
 // =======================================================================
-TCollection_AsciiString VInspector_Tools::LocationToName (const TopLoc_Location& theLocation)
+TopoDS_Shape VInspector_Tools::ReadShape (const TCollection_AsciiString& theFileName)
 {
-  gp_Trsf aTrsf = theLocation.Transformation();
+  TopoDS_Shape aShape;
 
-  TCollection_AsciiString aValues;
-  for (int aRowId = 1; aRowId <= 3; aRowId++)
-  {
-    for (int aColId = 1; aColId <= 4; aColId++) {
-      aValues += TCollection_AsciiString (aTrsf.Value(aRowId, aColId));
-      if (aColId != 4)
-        aValues += ",";
-    }
-    if (aRowId != 3)
-      aValues += "  ";
-  }
-  return aValues;
+  BRep_Builder aBuilder;
+  BRepTools::Read (aShape, theFileName.ToCString(), aBuilder);
+
+  return aShape;
 }
 
 // =======================================================================
-// function : ReadShape
+// function : GetPropertyTableValues
 // purpose :
 // =======================================================================
-TopoDS_Shape VInspector_Tools::ReadShape (const TCollection_AsciiString& theFileName)
+void VInspector_Tools::GetPropertyTableValues (const TreeModel_ItemBasePtr& theItem,
+                                               QList<ViewControl_TableModelValues*>& theTableValues)
 {
-  TopoDS_Shape aShape;
+  TreeModel_ItemBasePtr anItem = theItem;
+  VInspector_ItemFolderObjectPtr aFolderItem = itemDynamicCast<VInspector_ItemFolderObject>(anItem);
+  if (aFolderItem)
+  {
+    VInspector_ItemFolderObject::ParentKind aParentKind = aFolderItem->GetParentItemKind();
+    if (aParentKind == VInspector_ItemFolderObject::ParentKind_ContextItem ||
+        aParentKind == VInspector_ItemFolderObject::ParentKind_PresentationItem)
+      anItem = theItem->Parent();
+  }
 
-  BRep_Builder aBuilder;
-  BRepTools::Read (aShape, theFileName.ToCString(), aBuilder);
+  theTableValues.append (new VInspector_TableModelValues (anItem));
+}
 
-  return aShape;
+namespace
+{
+  static Standard_CString VInspector_Table_PrintDisplayActionType[5] =
+  {
+    "None", "Display", "Redisplay", "Erase", "Remove"
+  };
+}
+
+//=======================================================================
+//function : DisplayActionTypeToString
+//purpose  :
+//=======================================================================
+Standard_CString VInspector_Tools::DisplayActionTypeToString (VInspector_DisplayActionType theType)
+{
+  return VInspector_Table_PrintDisplayActionType[theType];
+}
+
+//=======================================================================
+//function : DisplayActionTypeFromString
+//purpose  :
+//=======================================================================
+Standard_Boolean VInspector_Tools::DisplayActionTypeFromString (Standard_CString theTypeString,
+                                                                VInspector_DisplayActionType& theType)
+{
+  TCollection_AsciiString aName (theTypeString);
+  for (Standard_Integer aTypeIter = 0; aTypeIter <= VInspector_DisplayActionType_RemoveId; ++aTypeIter)
+  {
+    Standard_CString aTypeName = VInspector_Table_PrintDisplayActionType[aTypeIter];
+    if (aName == aTypeName)
+    {
+      theType = VInspector_DisplayActionType (aTypeIter);
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : ToVariant
+//purpose  :
+//=======================================================================
+QVariant VInspector_Tools::ToVariant (const Select3D_BndBox3d& theBoundingBox)
+{
+  return QString ("(%1, %2, %3), (%4, %5, %6)")
+    .arg (theBoundingBox.CornerMin().x()).arg (theBoundingBox.CornerMin().y()).arg (theBoundingBox.CornerMin().z())
+    .arg (theBoundingBox.CornerMax().x()).arg (theBoundingBox.CornerMax().y()).arg (theBoundingBox.CornerMax().z());
+}
+
+//=======================================================================
+//function : CreateShape
+//purpose  :
+//=======================================================================
+TopoDS_Shape VInspector_Tools::CreateShape (const Bnd_Box& theBoundingBox)
+{
+  if (theBoundingBox.IsVoid() || theBoundingBox.IsWhole() ||
+      theBoundingBox.IsXThin (Precision::Confusion()) ||
+      theBoundingBox.IsYThin (Precision::Confusion()) ||
+      theBoundingBox.IsZThin (Precision::Confusion()))
+    return TopoDS_Shape();
+
+  BRepPrimAPI_MakeBox aBoxBuilder(theBoundingBox.CornerMin(), theBoundingBox.CornerMax());
+  return aBoxBuilder.Shape();
+}
+
+//=======================================================================
+//function : ToVariant
+//purpose  :
+//=======================================================================
+QVariant VInspector_Tools::ToVariant (const Handle(Graphic3d_IndexBuffer)& theIndexBuffer)
+{
+  const Handle(Graphic3d_Buffer)& aBuffer = theIndexBuffer;
+  return VInspector_Tools::ToVariant (aBuffer);
+}
+
+//=======================================================================
+//function : ToVariant
+//purpose  :
+//=======================================================================
+QVariant VInspector_Tools::ToVariant (const Handle(Graphic3d_Buffer)& theBuffer)
+{
+  if (theBuffer.IsNull())
+    return QVariant();
+
+  QString anInfo;
+  anInfo = "NbElements = " + QString::number (theBuffer->NbElements) + ",";
+  anInfo = "NbAttributes = " + QString::number (theBuffer->NbAttributes) + ",";
+  anInfo = "Stride = " + QString::number (theBuffer->Stride) + ",";
+  QStringList anAttributes;
+  for (Standard_Integer anAttribIter = 0; anAttribIter < theBuffer->NbAttributes; ++anAttribIter)
+  {
+    const Graphic3d_Attribute& anAttrib = theBuffer->Attribute (anAttribIter);
+    anAttributes.append(VInspector_Tools::ToString (anAttrib));
+  }
+  return anInfo + " (" + anAttributes.join(", ") + ")";
+}
+
+//=======================================================================
+//function : ToVariant
+//purpose  :
+//=======================================================================
+QVariant VInspector_Tools::ToVariant (const Handle(Graphic3d_BoundBuffer)& theBoundBuffer)
+{
+  //const Handle(Graphic3d_Buffer)& aBuffer = theBoundBuffer;
+  //Handle(Graphic3d_Buffer) aBuffer = Handle(Graphic3d_Buffer)::DownCast (theBoundBuffer);
+  //return VInspector_Tools::ToVariant (aBuffer);
+  return QVariant();
+}
+
+//=======================================================================
+//function : ToString
+//purpose  :
+//=======================================================================
+QString VInspector_Tools::ToString (const Graphic3d_Attribute& theAttribute)
+{
+  Graphic3d_TypeOfAttribute anId = theAttribute.Id;
+  Graphic3d_TypeOfData aDataType = theAttribute.DataType;
+
+  QString anInfo = Graphic3d::TypeOfAttributeToString (anId);
+  anInfo += ": ";
+  anInfo += Graphic3d::TypeOfDataToString (aDataType);
+
+  return anInfo;
 }
index e22ff5d539c84286ecb18d83ee78ed90cb0a7a4f..45403134d45a179e06c726ee3e0bcfbbea2d082e 100644 (file)
@@ -17,6 +17,9 @@
 #define VInspector_Tools_H
 
 #include <AIS_InteractiveContext.hxx>
+#include <Bnd_Box.hxx>
+#include <Graphic3d_Buffer.hxx>
+#include <Select3D_BndBox3d.hxx>
 #include <SelectMgr_EntityOwner.hxx>
 #include <Standard.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TopoDS_Shape.hxx>
 
 #include <inspector/VInspector_CallBackMode.hxx>
+#include <inspector/VInspector_DisplayActionType.hxx>
 #include <inspector/VInspector_SelectionType.hxx>
+#include <inspector/TreeModel_ItemBase.hxx>
 
 #include <Standard_WarningsDisable.hxx>
 #include <QList>
 #include <QVariant>
 #include <Standard_WarningsRestore.hxx>
 
+class ViewControl_TableModelValues;
+
+class Graphic3d_IndexBuffer;
+class Graphic3d_Buffer;
+class Graphic3d_BoundBuffer;
+
 //! \class VInspector_Tools
 //! The class that gives auxiliary methods for Visualization elements manipulation
 class VInspector_Tools
@@ -50,7 +61,7 @@ public:
   //! \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);
+                                                                 const bool isShortInfo = true);
 
   //! Returns number of selected owners for presentation
   //! \param theContext an interactive context
@@ -128,15 +139,67 @@ public:
   //! \return text value
   Standard_EXPORT static TCollection_AsciiString OrientationToName (const TopAbs_Orientation& theOrientation);
 
-  //! Returns text of orientation
-  //! \param theLocation a location value
-  //! \return text value
-  Standard_EXPORT static TCollection_AsciiString LocationToName (const TopLoc_Location& theLocation);
-
   //! Read Shape using BREP reader
   //! \param theFileName a file name
   //! \return shape or NULL
   Standard_EXPORT static TopoDS_Shape ReadShape (const TCollection_AsciiString& theFileName);
+
+  //! Fills container of table values
+  //! \param theAlert a message alert
+  //! \param theTableValue container of values
+  Standard_EXPORT static void GetPropertyTableValues (const TreeModel_ItemBasePtr& theItem,
+                                                      QList<ViewControl_TableModelValues*>& theTableValues);
+
+  //! Returns the string name for a given type.
+  //! @param theType action type
+  //! @return string identifier from the display action type
+  Standard_EXPORT static Standard_CString DisplayActionTypeToString (VInspector_DisplayActionType theType);
+
+  //! Returns the enumeration type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @return string identifier from the display action type
+  static VInspector_DisplayActionType DisplayActionTypeFromString (Standard_CString theTypeString)
+  {
+    VInspector_DisplayActionType aType = VInspector_DisplayActionType_NoneId;
+    DisplayActionTypeFromString (theTypeString, aType);
+    return aType;
+  }
+
+  //! Determines the enumeration type from the given string identifier (using case-insensitive comparison).
+  //! @param theTypeString string identifier
+  //! @param theType detected action type
+  //! @return TRUE if string identifier is known
+  Standard_EXPORT static Standard_Boolean DisplayActionTypeFromString (const Standard_CString theTypeString,
+                                                                       VInspector_DisplayActionType& theType);
+
+  //! Build string presentation of bounding box information in form: (xmin, ymin, zmin), (xmax, ymax, zmax)
+  //! \param theBoundingBox bounding box
+  //! \return string presentation
+  Standard_EXPORT static QVariant ToVariant (const Select3D_BndBox3d& theBoundingBox);
+
+
+  //! Creates box shape
+  //! \param theBoundingBox box shape parameters
+  //! \return created shape
+  Standard_EXPORT static TopoDS_Shape CreateShape (const Bnd_Box& theBoundingBox);
+
+  //! Build string presentation of Graphic3D index buffer
+  //! \param theIndexBuffer index buffer
+  //! \return string presentation
+  Standard_EXPORT static QVariant ToVariant (const Handle(Graphic3d_IndexBuffer)& theIndexBuffer);
+
+  //! Build string presentation of Graphic3D buffer
+  //! \param theBuffer index buffer
+  //! \return string presentation
+  Standard_EXPORT static QVariant ToVariant (const Handle(Graphic3d_Buffer)& theBuffer);
+
+  //! Build string presentation of Graphic3D bound buffer
+  //! \param theBoundBuffer index buffer
+  //! \return string presentation
+  Standard_EXPORT static QVariant ToVariant (const Handle(Graphic3d_BoundBuffer)& theBoundBuffer);
+
+  Standard_EXPORT static QString ToString (const Graphic3d_Attribute& theAttribute);
+
 };
 
 #endif
index d8f6c026a5b242be16d25a4dbbe6bead0e71f01b..b008f6066361df175e2717c63f0eebb938227b64 100644 (file)
@@ -17,9 +17,9 @@
 
 #include <inspector/TreeModel_Tools.hxx>
 #include <inspector/VInspector_ItemContext.hxx>
-#include <inspector/VInspector_ItemEntityOwner.hxx>
+#include <inspector/VInspector_ItemSelectBasicsEntityOwner.hxx>
 #include <inspector/VInspector_ItemPresentableObject.hxx>
-#include <inspector/VInspector_ItemSensitiveEntity.hxx>
+#include <inspector/VInspector_ItemSelectMgrSensitiveEntity.hxx>
 #include <SelectBasics_EntityOwner.hxx>
 
 #include <Standard_WarningsDisable.hxx>
@@ -64,6 +64,8 @@ VInspector_ViewModel::VInspector_ViewModel (QObject* theParent)
   SetHeaderItem (19, TreeModel_HeaderSection ("Location", -1, true)); // ItemEntityOwner
 
   SetHeaderItem (20, TreeModel_HeaderSection ("Color", -1)); // ItemPresentableObject
+
+  SetHeaderItem (21, TreeModel_HeaderSection ("Owner Location", -1, true)); // ItemEntityOwner
 }
 
 // =======================================================================
@@ -95,7 +97,8 @@ void VInspector_ViewModel::SetContext (const Handle(AIS_InteractiveContext)& the
   // fill root item by the application
   for (int aColId = 0, aNbColumns = columnCount(); aColId < aNbColumns; aColId++)
     itemDynamicCast<VInspector_ItemContext>(myRootItems[aColId])->SetContext (theContext);
-  EmitLayoutChanged();
+
+  UpdateTreeModel();
 }
 
 // =======================================================================
@@ -166,11 +169,11 @@ void VInspector_ViewModel::GetSelectedOwners (QItemSelectionModel* theSelectionM
   {
     TreeModel_ItemBasePtr anItem = *anItemIt;
     Handle(SelectBasics_EntityOwner) anEntityOwner;
-    if (VInspector_ItemEntityOwnerPtr anOwnerItem = itemDynamicCast<VInspector_ItemEntityOwner>(anItem))
+    if (VInspector_ItemSelectBasicsEntityOwnerPtr anOwnerItem = itemDynamicCast<VInspector_ItemSelectBasicsEntityOwner>(anItem))
     {
       anEntityOwner = anOwnerItem->EntityOwner();
     }
-    else if (VInspector_ItemSensitiveEntityPtr aSensItem = itemDynamicCast<VInspector_ItemSensitiveEntity>(anItem))
+    else if (VInspector_ItemSelectMgrSensitiveEntityPtr aSensItem = itemDynamicCast<VInspector_ItemSelectMgrSensitiveEntity>(anItem))
     {
       anEntityOwner = aSensItem->GetSensitiveEntity()->BaseSensitive()->OwnerId();
     }
index b1af3fe97f9156eedecdcbc6fcb7b03ccee5081d..0e2d520f54f17cbcd22dd742e631effd3bd6731a 100644 (file)
@@ -16,6 +16,8 @@
 #include <inspector/VInspector_Window.hxx>
 
 #include <AIS_Shape.hxx>
+#include <BRep_Builder.hxx>
+#include <TopoDS_Compound.hxx>
 
 #include <inspector/TreeModel_ColumnType.hxx>
 #include <inspector/TreeModel_ContextMenu.hxx>
 #include <inspector/ViewControl_MessageDialog.hxx>
 #include <inspector/ViewControl_Tools.hxx>
 
-#include <inspector/VInspector_ItemPresentableObject.hxx>
 #include <inspector/VInspector_ToolBar.hxx>
 #include <inspector/VInspector_Tools.hxx>
 #include <inspector/VInspector_ViewModel.hxx>
 #include <inspector/VInspector_CallBack.hxx>
 #include <inspector/VInspector_Communicator.hxx>
-#include <inspector/VInspector_ItemEntityOwner.hxx>
+#include <inspector/VInspector_ItemContext.hxx>
+#include <inspector/VInspector_ItemSelectBasicsEntityOwner.hxx>
+#include <inspector/VInspector_ItemFolderObject.hxx>
+#include <inspector/VInspector_ItemOpenGlElement.hxx>
 #include <inspector/VInspector_ItemPresentableObject.hxx>
+#include <inspector/VInspector_PrsOpenGlElement.hxx>
 #include <inspector/VInspector_ToolBar.hxx>
 #include <inspector/VInspector_Tools.hxx>
 #include <inspector/VInspector_ViewModel.hxx>
 #include <inspector/VInspector_ViewModelHistory.hxx>
 
+#include <inspector/ViewControl_PropertyView.hxx>
 #include <inspector/ViewControl_TreeView.hxx>
 
 #include <inspector/View_Widget.hxx>
@@ -56,6 +62,9 @@
 #include <QWidget>
 #include <Standard_WarningsRestore.hxx>
 
+const int VINSPECTOR_DEFAULT_PROPERTY_VIEW_WIDTH = 300;//600;
+const int VINSPECTOR_DEFAULT_PROPERTY_VIEW_HEIGHT = 1000;
+
 const int VINSPECTOR_DEFAULT_WIDTH  = 1250;
 const int VINSPECTOR_DEFAULT_HEIGHT = 800;
 
@@ -96,6 +105,8 @@ VInspector_Window::VInspector_Window()
   myTreeView->setSelectionMode (QAbstractItemView::ExtendedSelection);
   myTreeView->header()->setStretchLastSection (true);
   myTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
+  //((ViewControl_TreeView*)myTreeView)->SetPredefinedSize (QSize (VINSPECTOR_DEFAULT_TREE_VIEW_WIDTH,
+  //                                                               VINSPECTOR_DEFAULT_TREE_VIEW_HEIGHT));
   VInspector_ViewModel* aTreeModel = new VInspector_ViewModel (myTreeView);
   myTreeView->setModel (aTreeModel);
   // hide Visibility column
@@ -110,12 +121,23 @@ VInspector_Window::VInspector_Window()
   QItemSelectionModel* aSelModel = new QItemSelectionModel (myTreeView->model(), myTreeView);
   myTreeView->setSelectionModel (aSelModel);
   connect (aSelModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
-           this, SLOT (onSelectionChanged (const QItemSelection&, const QItemSelection&)));
+           this, SLOT (onTreeViewSelectionChanged (const QItemSelection&, const QItemSelection&)));
 
   aParentLay->addWidget(myTreeView, 1, 0);
   aParentLay->setRowStretch (1, 1);
   myMainWindow->setCentralWidget (aCentralWidget);
 
+  // property view
+  myPropertyView = new ViewControl_PropertyView (myMainWindow,
+    QSize(VINSPECTOR_DEFAULT_PROPERTY_VIEW_WIDTH, VINSPECTOR_DEFAULT_PROPERTY_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);
+  connect (myPropertyPanelWidget->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT (onPropertyPanelShown (bool)));
+  connect (myPropertyView, SIGNAL (propertyViewSelectionChanged()), this, SLOT (onPropertyViewSelectionChanged ()));
+
   myHistoryView = new ViewControl_TreeView (myMainWindow);
   myHistoryView->setSelectionBehavior (QAbstractItemView::SelectRows);
   ((ViewControl_TreeView*)myHistoryView)->SetPredefinedSize (QSize (VINSPECTOR_DEFAULT_HISTORY_VIEW_WIDTH,
@@ -280,6 +302,123 @@ void VInspector_Window::UpdateContent()
   }
 }
 
+// =======================================================================
+// function : GetSelectedPresentations
+// purpose :
+// =======================================================================
+NCollection_List<Handle(AIS_InteractiveObject)> VInspector_Window::GetSelectedPresentations (QItemSelectionModel* theModel)
+{
+  NCollection_List<Handle(AIS_InteractiveObject)> aSelectedPresentations;
+
+  QList<TreeModel_ItemBasePtr> anItems;
+  QModelIndexList anIndices = theModel->selectedIndexes();
+  for (QModelIndexList::const_iterator anIndicesIt = anIndices.begin(); anIndicesIt != anIndices.end(); anIndicesIt++)
+  {
+    TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex (*anIndicesIt);
+    if (!anItem || anItems.contains (anItem))
+      continue;
+    anItems.append (anItem);
+  }
+
+  QList<size_t> aSelectedIds; // Remember of selected address in order to avoid duplicates
+  NCollection_List<Handle(Standard_Transient)> anItemPresentations;
+  for (QList<TreeModel_ItemBasePtr>::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++)
+  {
+    TreeModel_ItemBasePtr anItem = *anItemIt;
+    VInspector_ItemBasePtr aVItem = itemDynamicCast<VInspector_ItemBase>(anItem);
+    if (!aVItem)
+      continue;
+
+    anItemPresentations.Clear();
+    aVItem->GetPresentations (anItemPresentations);
+
+    for (NCollection_List<Handle(Standard_Transient)>::Iterator anIt (anItemPresentations); anIt.More(); anIt.Next())
+    {
+      Handle(AIS_InteractiveObject) aPresentation = Handle(AIS_InteractiveObject)::DownCast (anIt.Value());
+      if (aSelectedIds.contains ((size_t)aPresentation.operator->()))
+        continue;
+      aSelectedIds.append ((size_t)aPresentation.operator->());
+      if (!aPresentation.IsNull())
+        aSelectedPresentations.Append (aPresentation);
+    }
+  }
+  return aSelectedPresentations;
+}
+
+// =======================================================================
+// function : GetSelectedShapes
+// purpose :
+// =======================================================================
+NCollection_List<TopoDS_Shape> VInspector_Window::GetSelectedShapes (QItemSelectionModel* theModel)
+{
+  NCollection_List<TopoDS_Shape> aSelectedShapes;
+
+  QList<TreeModel_ItemBasePtr> anItems;
+  QModelIndexList anIndices = theModel->selectedIndexes();
+  for (QModelIndexList::const_iterator anIndicesIt = anIndices.begin(); anIndicesIt != anIndices.end(); anIndicesIt++)
+  {
+    TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex (*anIndicesIt);
+    if (!anItem || anItems.contains (anItem))
+      continue;
+    anItems.append (anItem);
+  }
+
+  QList<size_t> aSelectedIds; // Remember of selected address in order to avoid duplicates
+  for (QList<TreeModel_ItemBasePtr>::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++)
+  {
+    TreeModel_ItemBasePtr anItem = *anItemIt;
+    VInspector_ItemBasePtr aVItem = itemDynamicCast<VInspector_ItemBase>(anItem);
+    if (!aVItem)
+      continue;
+
+    TopoDS_Shape aShape = aVItem->GetPresentationShape();
+    if (aShape.IsNull())
+      continue;
+
+    aSelectedShapes.Append (aShape);
+  }
+  return aSelectedShapes;
+}
+
+// =======================================================================
+// function : GetSelectedElements
+// purpose :
+// =======================================================================
+NCollection_List<OpenGl_Element*> VInspector_Window::GetSelectedElements (QItemSelectionModel* theModel)
+{
+  NCollection_List<OpenGl_Element*> anElements;
+  QList<TreeModel_ItemBasePtr> anItems;
+  QModelIndexList anIndices = theModel->selectedIndexes();
+  for (QModelIndexList::const_iterator anIndicesIt = anIndices.begin(); anIndicesIt != anIndices.end(); anIndicesIt++)
+  {
+    QModelIndex anIndex = *anIndicesIt;
+    TreeModel_ItemBasePtr anItem = TreeModel_ModelBase::GetItemByIndex (anIndex);
+     if (anIndex.column() != 0)
+       continue;
+
+    if (!anItem || anItems.contains (anItem))
+      continue;
+    anItems.append (anItem);
+  }
+
+  QList<size_t> aSelectedIds; // Remember of selected address in order to avoid duplicates
+  for (QList<TreeModel_ItemBasePtr>::const_iterator anItemIt = anItems.begin(); anItemIt != anItems.end(); anItemIt++)
+  {
+    TreeModel_ItemBasePtr anItem = *anItemIt;
+    VInspector_ItemOpenGlElementPtr aVItem = itemDynamicCast<VInspector_ItemOpenGlElement>(anItem);
+    if (!aVItem)
+      continue;
+
+    OpenGl_Element* anElement = aVItem->GetElement();
+    if (!anElement)
+      continue;
+
+    anElements.Append (anElement);
+  }
+
+  return anElements;
+}
+
 // =======================================================================
 // function : Init
 // purpose :
@@ -372,8 +511,12 @@ void VInspector_Window::onTreeViewContextMenuRequested(const QPoint& thePosition
 {
   QMenu* aMenu = new QMenu (GetMainWindow());
   aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Export to ShapeView"), SLOT (onExportToShapeView()), GetMainWindow(), this));
-  aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Show"), SLOT (onShow()), GetMainWindow(), this));
-  aMenu->addAction (ViewControl_Tools::CreateAction (tr ("Hide"), SLOT (onHide()), GetMainWindow(), this));
+
+  aMenu->addSeparator();
+  for (int aTypeId = (int)VInspector_DisplayActionType_DisplayId; aTypeId <= (int)VInspector_DisplayActionType_RemoveId; aTypeId++)
+    aMenu->addAction (ViewControl_Tools::CreateAction (VInspector_Tools::DisplayActionTypeToString ((VInspector_DisplayActionType) aTypeId),
+                      SLOT (onDisplayActionTypeClicked()), GetMainWindow(), this));
+  aMenu->addSeparator();
   QPoint aPoint = myTreeView->mapToGlobal (thePosition);
   aMenu->exec(aPoint);
 }
@@ -397,12 +540,12 @@ void VInspector_Window::onToolBarActionClicked (const int theActionId)
     }
     case VInspector_ToolActionType_SelectPresentationsId:
     {
-      bool isChecked = myToolBar->GetToolButton((VInspector_ToolActionType)theActionId)->isChecked();
+      bool isChecked = myToolBar->GetToolButton ((VInspector_ToolActionType)theActionId)->isChecked();
       NCollection_List<Handle(AIS_InteractiveObject)> aPresentationsForViewer;
       if (isChecked)
-        aPresentationsForViewer = VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel());
+        aPresentationsForViewer = GetSelectedPresentations (myTreeView->selectionModel());
       Handle(AIS_InteractiveContext) aContext = aViewModel->GetContext();
-      VInspector_Tools::AddOrRemovePresentations(aContext, aPresentationsForViewer);
+      VInspector_Tools::AddOrRemovePresentations (aContext, aPresentationsForViewer);
       UpdateTreeModel();
       break;
     }
@@ -421,11 +564,85 @@ void VInspector_Window::onToolBarActionClicked (const int theActionId)
 }
 
 // =======================================================================
-// function : onSelectionChanged
+// function : onPropertyPanelShown
 // purpose :
 // =======================================================================
-void VInspector_Window::onSelectionChanged (const QItemSelection&,
-                                            const QItemSelection&)
+void VInspector_Window::onPropertyPanelShown (bool isToggled)
+{
+  if (!isToggled)
+    return;
+
+  updatePropertyPanelBySelection();
+}
+
+// =======================================================================
+// function : onPropertyViewSelectionChanged
+// purpose :
+// =======================================================================
+void VInspector_Window::onPropertyViewSelectionChanged()
+{
+  /*QItemSelectionModel* aModel = myTreeView->selectionModel();
+  if (!aModel)
+    return;
+  QModelIndex aSelectedIndex = TreeModel_ModelBase::SingleSelected (aModel->selectedIndexes(), 0);
+  QModelIndex anIndex = myTreeView->model()->index (aSelectedIndex.row(), TreeModel_ColumnType_Visibility, aSelectedIndex.parent());
+
+  TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
+  if (!anItemBase)
+    return;
+  MessageModel_ItemAlertPtr anAlertItem = itemDynamicCast<MessageModel_ItemAlert>(anItemBase);
+  if (!anAlertItem)
+    return;
+
+  QList<ViewControl_Table*> aPropertyTables;
+  myPropertyView->GetActiveTables (aPropertyTables);
+  if (aPropertyTables.isEmpty())
+    return;
+
+  ViewControl_Table* aFirstTable = aPropertyTables[0]; // TODO: implement for several tables
+
+  QMap<int, QList<int>> aSelectedIndices;
+  aFirstTable->GetSelectedIndices (aSelectedIndices);
+
+  // clear presentation if selection is empty
+  MessageModel_TreeModel* aTreeModel = dynamic_cast<MessageModel_TreeModel*> (myTreeView->model());
+  TreeModel_VisibilityState* aVisibilityState = aTreeModel->GetVisibilityState();
+  if (aSelectedIndices.isEmpty() && aVisibilityState->IsVisible (anIndex))
+  {
+    aVisibilityState->SetVisible (anIndex, false, true);
+    anAlertItem->SetCustomShape (TopoDS_Shape());
+    return;
+  }
+
+  TopoDS_Shape aShapeOfSelection = MessageModel_Tools::BuildShape (anAlertItem->GetAlert(), aSelectedIndices[0], aFirstTable);
+  if (aShapeOfSelection.IsNull())
+    return;
+
+  if (aVisibilityState->IsVisible (anIndex))
+  {
+    View_Displayer* aDisplayer = myViewWindow->GetDisplayer();
+
+    Handle(AIS_InteractiveObject) aPresentation = myViewWindow->GetDisplayer()->FindPresentation (anAlertItem->GetCustomShape());
+
+    Handle(AIS_Shape) aShapePresentation = Handle(AIS_Shape)::DownCast (aPresentation);
+    aShapePresentation->Set (aShapeOfSelection);
+
+    aDisplayer->RedisplayPresentation (aPresentation);
+    anAlertItem->SetCustomShape (aShapeOfSelection);
+  }
+  else
+  {
+    anAlertItem->SetCustomShape (aShapeOfSelection);
+    aVisibilityState->SetVisible (anIndex, true);
+  }*/
+}
+
+// =======================================================================
+// function : onTreeViewSelectionChanged
+// purpose :
+// =======================================================================
+void VInspector_Window::onTreeViewSelectionChanged (const QItemSelection&,
+                                                    const QItemSelection&)
 {
   QApplication::setOverrideCursor (Qt::WaitCursor);
 
@@ -434,6 +651,15 @@ void VInspector_Window::onSelectionChanged (const QItemSelection&,
   else if (myToolBar->GetToolButton(VInspector_ToolActionType_SelectOwnersId)->isChecked())
     onToolBarActionClicked(VInspector_ToolActionType_SelectOwnersId);
 
+  if (myPropertyPanelWidget->toggleViewAction()->isChecked())
+    updatePropertyPanelBySelection();
+
+  NCollection_List<TopoDS_Shape> aSelectedShapes = GetSelectedShapes (myTreeView->selectionModel());
+  updatePreviewPresentation(aSelectedShapes);
+
+  NCollection_List<OpenGl_Element*> aSelectedElements = GetSelectedElements (myTreeView->selectionModel());
+  updatePreviewPresentation(aSelectedElements);
+
   QApplication::restoreOverrideCursor();
 }
 
@@ -475,8 +701,7 @@ void VInspector_Window::onHistoryViewSelectionChanged (const QItemSelection& the
 // =======================================================================
 void VInspector_Window::onExportToShapeView()
 {
-  NCollection_List<Handle(AIS_InteractiveObject)> aSelectedPresentations =
-            VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel());
+  NCollection_List<Handle(AIS_InteractiveObject)> aSelectedPresentations = GetSelectedPresentations (myTreeView->selectionModel());
   if (aSelectedPresentations.Extent() <= 0)
     return;
 
@@ -523,21 +748,14 @@ void VInspector_Window::onExportToShapeView()
 }
 
 // =======================================================================
-// function : onShow
+// function : onDisplayActionTypeClicked
 // purpose :
 // =======================================================================
-void VInspector_Window::onShow()
+void VInspector_Window::onDisplayActionTypeClicked()
 {
-  displaySelectedPresentations (true);
-}
+  QAction* anAction = (QAction*)sender();
 
-// =======================================================================
-// function : onHide
-// purpose :
-// =======================================================================
-void VInspector_Window::onHide()
-{
-  displaySelectedPresentations (false);
+  displaySelectedPresentations (VInspector_Tools::DisplayActionTypeFromString (anAction->text().toStdString().c_str()));
 }
 
 // =======================================================================
@@ -551,11 +769,33 @@ void VInspector_Window::UpdateTreeModel()
     aViewModel->UpdateTreeModel();
 }
 
+// =======================================================================
+// function : updatePropertyPanelBySelection
+// purpose :
+// =======================================================================
+void VInspector_Window::updatePropertyPanelBySelection()
+{
+  QItemSelectionModel* aModel = myTreeView->selectionModel();
+  if (!aModel)
+    return;
+
+  QModelIndexList aSelected = TreeModel_ModelBase::GetSelected (aModel->selectedIndexes(), 0);
+  QList<ViewControl_TableModelValues*> aTableValues;
+
+  if (aSelected.size() == 1)
+  {
+    TreeModel_ItemBasePtr aSelectedItem = TreeModel_ModelBase::GetItemByIndex(aSelected.first());
+    VInspector_Tools::GetPropertyTableValues (aSelectedItem, aTableValues);
+  }
+  myPropertyView->Init (aTableValues);
+}
+
 // =======================================================================
 // function : displaySelectedPresentations
 // purpose :
 // =======================================================================
-void VInspector_Window::displaySelectedPresentations(const bool theToDisplay)
+
+void VInspector_Window::displaySelectedPresentations (const VInspector_DisplayActionType theType)
 {
   VInspector_ViewModel* aViewModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
   if (!aViewModel)
@@ -565,29 +805,38 @@ void VInspector_Window::displaySelectedPresentations(const bool theToDisplay)
   if (aContext.IsNull())
     return;
 
-  NCollection_List<Handle(AIS_InteractiveObject)> aSelectedPresentations =
-    VInspector_ItemPresentableObject::GetSelectedPresentations(myTreeView->selectionModel());
+  QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
+  if (!aSelectionModel)
+    return;
+
+  NCollection_List<Handle(AIS_InteractiveObject)> aSelectedPresentations = GetSelectedPresentations (aSelectionModel);
   if (aSelectedPresentations.Extent() <= 0)
     return;
 
+  // the order of objects returned by AIS_InteractiveContext is changed because the processed object is moved from
+  // Erased to Displayed container or back
+  aSelectionModel->clear();
+
   for (NCollection_List<Handle(AIS_InteractiveObject)>::Iterator anIOIt(aSelectedPresentations); anIOIt.More(); anIOIt.Next())
   {
     Handle(AIS_InteractiveObject) aPresentation = anIOIt.Value();
-    if (theToDisplay)
+    switch (theType)
     {
-      aContext->Display(aPresentation, false);
-      aContext->Load(aPresentation, -1);
+      case VInspector_DisplayActionType_DisplayId:
+      {
+        aContext->Display(aPresentation, false);
+        aContext->Load(aPresentation, -1);
+      }
+      break;
+
+      case VInspector_DisplayActionType_RedisplayId: aContext->Redisplay (aPresentation, false); break;
+      case VInspector_DisplayActionType_EraseId: aContext->Erase (aPresentation, false); break;
+      case VInspector_DisplayActionType_RemoveId: aContext->Remove (aPresentation, false); break;
+      default: break;
     }
-    else
-      aContext->Erase(aPresentation, false);
   }
   aContext->UpdateCurrentViewer();
 
-  // the order of objects returned by AIS_InteractiveContext is changed because the processed object is moved from
-  // Erased to Displayed container or back
-  QItemSelectionModel* aSelectionModel = myTreeView->selectionModel();
-  aSelectionModel->clear();
-
   UpdateTreeModel();
 }
 
@@ -604,3 +853,83 @@ Handle(AIS_InteractiveContext) VInspector_Window::createView()
 
   return myViewWindow->GetView()->GetViewer()->GetContext();
 }
+
+// =======================================================================
+// function : updatePreviewPresentation
+// purpose :
+// =======================================================================
+void VInspector_Window::updatePreviewPresentation (const NCollection_List<TopoDS_Shape>& theShapes)
+{
+  Handle(AIS_InteractiveContext) aContext;
+  VInspector_ViewModel* aViewModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
+  if (aViewModel)
+    aContext = aViewModel->GetContext();
+
+  if (theShapes.IsEmpty())
+  {
+    if (!aContext.IsNull())
+      aContext->Remove (myPreviewPresentation, Standard_True);
+    myPreviewPresentation = NULL;
+    return;
+  }
+
+  BRep_Builder aBuilder;
+  TopoDS_Compound aCompound;
+  aBuilder.MakeCompound (aCompound);
+  for (NCollection_List<TopoDS_Shape>::Iterator anIterator (theShapes); anIterator.More(); anIterator.Next())
+  {
+    aBuilder.Add (aCompound, anIterator.Value());
+  }
+
+  if (myPreviewPresentation.IsNull())
+  {
+    myPreviewPresentation = new AIS_Shape (aCompound);
+    myPreviewPresentation->SetColor (Quantity_Color (Quantity_NOC_BLUE1));
+    myPreviewPresentation->SetZLayer (Graphic3d_ZLayerId_Topmost);
+    if (!aContext.IsNull())
+      aContext->Display (myPreviewPresentation, Standard_True);
+  }
+  else
+  {
+    Handle(AIS_Shape)::DownCast (myPreviewPresentation)->Set (aCompound);
+    if (!aContext.IsNull())
+      aContext->Redisplay (myPreviewPresentation, Standard_True);
+  }
+}
+
+// =======================================================================
+// function : updatePreviewPresentation
+// purpose :
+// =======================================================================
+void VInspector_Window::updatePreviewPresentation (const NCollection_List<OpenGl_Element*>& theElements)
+{
+  Handle(AIS_InteractiveContext) aContext;
+  VInspector_ViewModel* aViewModel = dynamic_cast<VInspector_ViewModel*> (myTreeView->model());
+  if (aViewModel)
+    aContext = aViewModel->GetContext();
+
+  if (theElements.IsEmpty())
+  {
+    if (!aContext.IsNull())
+      aContext->Remove (myOpenGlPreviewPresentation, Standard_False);
+    myOpenGlPreviewPresentation = NULL;
+    return;
+  }
+
+  if (myOpenGlPreviewPresentation.IsNull())
+  {
+    myOpenGlPreviewPresentation = new VInspector_PrsOpenGlElement();
+    myOpenGlPreviewPresentation->Set (theElements);
+
+    myOpenGlPreviewPresentation->SetColor (Quantity_Color (Quantity_NOC_BLUE1));
+    myOpenGlPreviewPresentation->SetZLayer (Graphic3d_ZLayerId_Topmost);
+    if (!aContext.IsNull())
+      aContext->Display (myOpenGlPreviewPresentation, Standard_True);
+  }
+  else
+  {
+    Handle(VInspector_PrsOpenGlElement)::DownCast (myOpenGlPreviewPresentation)->Set (theElements);
+    if (!aContext.IsNull())
+      aContext->Redisplay (myOpenGlPreviewPresentation, Standard_True);
+  }
+}
index 7d004e59b95616fce83c23112e53242270cd3ae8..14c52f4385a53c26d6141e4024f15e52b7e629a0 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <inspector/TInspectorAPI_PluginParameters.hxx>
 #include <inspector/VInspector_CallBack.hxx>
+#include <inspector/VInspector_DisplayActionType.hxx>
 
 #include <Standard_WarningsDisable.hxx>
 #include <QObject>
 #include <QMainWindow>
 #include <Standard_WarningsRestore.hxx>
 
+class OpenGl_Element;
+
+class VInspector_PrsOpenGlElement;
+
 class ViewControl_MessageDialog;
+class ViewControl_PropertyView;
 
 class VInspector_ToolBar;
 class View_Window;
 
 class QAbstractItemModel;
 class QAction;
-class QMainWindow;
+class QDockWidget;
 class QTreeView;
 class QWidget;
 
@@ -82,6 +88,21 @@ public:
   //! Returns main control
   QWidget* GetMainWindow() const { return myMainWindow; }
 
+  //! Returns presentations of selected items in tree model
+  //! \param theModel selection model
+  //! \return container of presentations
+  NCollection_List<Handle(AIS_InteractiveObject)> GetSelectedPresentations (QItemSelectionModel* theModel);
+
+  //! Returns selected shapes
+  //! \param theModel selection model
+  //! \return container of shapes
+  NCollection_List<TopoDS_Shape> GetSelectedShapes (QItemSelectionModel* theModel);
+
+  //! Returns selected elements
+  //! \param theModel selection model
+  //! \return container of OpenGl elements
+  NCollection_List<OpenGl_Element*> GetSelectedElements (QItemSelectionModel* theModel);
+
 private:
 
   //! Fills controls of the plugin by parameters:
@@ -103,6 +124,15 @@ private slots:
   //! \param theActionId an action identifier in tool bar
   void onToolBarActionClicked (const int theActionId);
 
+  //! Display content of selected tree view item if isToggled is true
+  //! \param isToggled true if the property dock widget is shown
+  void onPropertyPanelShown (bool isToggled);
+
+  //! Update presentation of the selected tree view item using information about selection in property view
+  //! \param theSelected container of selected table cells
+  //! \param theDeselected container of selected table cells
+  void onPropertyViewSelectionChanged();
+
   //! Synchronization selection between history and tree view. Selection by history view
   //! \param theSelected a selected items
   //! \param theDeselected a deselected items
@@ -113,16 +143,13 @@ private slots:
   //! check box is checked
   //! \param theSelected a selected items
   //! \param theDeselected a deselected items
-  void onSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
+  void onTreeViewSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
 
   //! Exports the first selected shape into ShapeViewer plugin.
   void onExportToShapeView();
 
-  //! Shows selected presentation if it is not shown yet
-  void onShow();
-
-  //! Erase selected presentation if it is shown
-  void onHide();
+  //! Apply activated display action
+  void onDisplayActionTypeClicked();
 
 private:
 
@@ -133,21 +160,36 @@ private:
   //! Updates tree model
   void UpdateTreeModel();
 
+  //! Updates property panel content by item selected in tree view.
+  void updatePropertyPanelBySelection();
+
   //! Set selected in tree view presentations displayed or erased in the current context. Note that erased presentations
   //! still belongs to the current context until Remove is called.
-  //! \param theToDisplay if true, presentation is displayed otherwise erased
-  void displaySelectedPresentations (const bool theToDisplay);
+  //! \param theType display action type
+  void displaySelectedPresentations (const VInspector_DisplayActionType theType);
 
   //! Creates an istance of 3D view to initialize context.
   //! \return a context of created view.
   Handle(AIS_InteractiveContext) createView();
 
+  //!< Updates presentation of preview for parameter shapes. Creates a compound of the shapes
+  //!< \param theShape container of shapes
+  void updatePreviewPresentation (const NCollection_List<TopoDS_Shape>& theShapes);
+
+  //!< Updates presentation of preview for OpenGl elements.
+  //!< \param theElements container of elements
+  void updatePreviewPresentation (const NCollection_List<OpenGl_Element*>& theElements);
+
 private:
 
   QWidget* myParent; //!< widget, comes when Init window, the window control lays in the layout, updates window title
 
   QMainWindow* myMainWindow; //!< main control
   VInspector_ToolBar* myToolBar; //!< tool bar actions
+
+  QDockWidget* myPropertyPanelWidget; //!< property pane dockable widget
+  ViewControl_PropertyView* myPropertyView; //!< property control to display model item values if exist
+
   QTreeView* myTreeView; //!< tree view of AIS content
   QTreeView* myHistoryView; //!< history of AIS context calls
   Handle(VInspector_CallBack) myCallBack; //!< AIS context call back, if set
@@ -156,6 +198,8 @@ private:
   View_Window* myViewWindow; //!< temporary view window, it is created if Open is called but context is still NULL
 
   Handle(TInspectorAPI_PluginParameters) myParameters; //!< plugins parameters container
+  Handle(AIS_InteractiveObject) myPreviewPresentation; //!< presentation of preview for a selected object
+  Handle(VInspector_PrsOpenGlElement) myOpenGlPreviewPresentation; //!< presentation of preview for OpenGl elements
 };
 
 #endif
index 1699446f006ea579ab58536b29adf53b4125dbe6..3ecb175c22442cc874806a0b18a9a7f8d8550baa 100644 (file)
@@ -45,7 +45,11 @@ void View_Tools::SaveState (View_Window* theView, QMap<QString, QString>& theIte
 {
   QStringList aCameraDirection;
   Standard_Real aVX, aVY, aVZ;
-  theView->GetView()->GetViewer()->GetView()->Proj (aVX, aVY, aVZ);
+  Handle(V3d_View) aView = theView->GetView()->GetViewer()->GetView();
+  if (aView.IsNull())
+    return;
+
+  aView->Proj (aVX, aVY, aVZ);
   aCameraDirection << QString::number (aVX) << QString::number (aVY) << QString::number (aVZ);
 
   theItems[thePrefix + "view_camera_direction"] = aCameraDirection.join (",");
index 432c6f8adf2d5effcd57cf18244ac69b5c4a5d7e..0e775a72dd7e1055778392dbcbd4c514d9c91cab 100644 (file)
@@ -1,5 +1,23 @@
+ViewControl.hxx
+ViewControl_ColorSelector.cxx
+ViewControl_ColorSelector.hxx
+ViewControl_EditType.hxx
 ViewControl_MessageDialog.cxx
 ViewControl_MessageDialog.hxx
+ViewControl_PropertyView.cxx
+ViewControl_PropertyView.hxx
+ViewControl_Table.cxx
+ViewControl_Table.hxx
+ViewControl_TableItemDelegate.cxx
+ViewControl_TableItemDelegate.hxx
+ViewControl_TableModel.cxx
+ViewControl_TableModel.hxx
+ViewControl_TableModelFilter.cxx
+ViewControl_TableModelFilter.hxx
+ViewControl_TableModelValues.cxx
+ViewControl_TableModelValues.hxx
+ViewControl_TableProperty.cxx
+ViewControl_TableProperty.hxx
 ViewControl_Tools.cxx
 ViewControl_Tools.hxx
-ViewControl_TreeView.hxx
\ No newline at end of file
+ViewControl_TreeView.hxx
diff --git a/tools/ViewControl/ViewControl.hxx b/tools/ViewControl/ViewControl.hxx
new file mode 100644 (file)
index 0000000..1ea5334
--- /dev/null
@@ -0,0 +1,33 @@
+// 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 VIEWCONTROL_H
+#define VIEWCONTROL_H
+
+#ifdef __ViewControl_DLL
+  #ifdef _WIN32
+    #define VIEWCONTROL_EXPORT __declspec(dllexport)
+  #else
+    #define VIEWCONTROL_EXPORT
+  #endif
+#else
+  #ifdef _WIN32
+    #define VIEWCONTROL_EXPORT __declspec(dllimport)
+  #else
+    #define VIEWCONTROL_EXPORT
+  #endif
+#endif
+
+#endif
diff --git a/tools/ViewControl/ViewControl_ColorSelector.cxx b/tools/ViewControl/ViewControl_ColorSelector.cxx
new file mode 100644 (file)
index 0000000..ec42dba
--- /dev/null
@@ -0,0 +1,593 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#include <inspector/ViewControl_ColorSelector.hxx>
+#include <inspector/ViewControl_TableItemDelegate.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+#include <inspector/TreeModel_Tools.hxx>
+
+#include <Quantity.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAbstractTableModel>
+#include <QDialogButtonBox>
+#include <QHeaderView>
+#include <QGridLayout>
+#include <QItemSelectionModel>
+#include <QPainter>
+#include <QTableView>
+#include <QWidget>
+#include <Standard_WarningsRestore.hxx>
+
+//! Kinds of delegate cell in OCCT Color model to present a custom presentation (rect bounded by a colored frame)
+enum ViewControl_ColorDelegateKind
+{
+  ViewControl_ColorDelegateKind_None, //!< usual item
+  ViewControl_ColorDelegateKind_Activated, //!< active item
+  ViewControl_ColorDelegateKind_Highlighted, //!< highlighted item
+  ViewControl_ColorDelegateKind_Selected //!< selected item
+};
+
+//! Model for a table of parameters: Current Color, Red, Green, Blue, Alpha, OCCT color name
+class ViewControl_ParametersModel : public ViewControl_TableModelValues
+{
+public:
+  ViewControl_ParametersModel (ViewControl_ColorSelector* theSelector)
+    : ViewControl_TableModelValues(), mySelector (theSelector) {}
+  virtual ~ViewControl_ParametersModel() {}
+
+  //! Inits model by the parameter color
+  //! \param theColor model active color
+  void SetColor (const Quantity_ColorRGBA& theColor, ViewControl_TableModel* theModel)
+  { myColor = theColor; theModel->EmitLayoutChanged(); }
+
+  //! Returns current selected color
+  //! \return color value
+  Quantity_ColorRGBA GetColor() const { return myColor; }
+
+  //! Returns item information(short) for display role.
+  //! \param theIndex a model index
+  //! \param theRole a view role
+  //! \return value intepreted depending on the given role
+  Standard_EXPORT virtual QVariant Data (const int theRow, const int theColumn,
+                                         int theRole = Qt::DisplayRole) const Standard_OVERRIDE
+  {
+    if (theRole == Qt::BackgroundRole && theColumn == 1 && theRow == 0)
+      return ViewControl_ColorSelector::ColorToQColor (myColor);
+
+    if (theRole == Qt::ForegroundRole && theColumn == 1 && theRow >= 2 && theRow <= 5)
+      return ViewControl_TableModelValues::EditCellColor();
+
+    if (theRole != Qt::DisplayRole)
+    return QVariant();
+
+    bool isFirstColumn = theColumn == 0;
+    switch (theRow)
+    {
+      case 0: return isFirstColumn ? QVariant ("Color") : QVariant ();
+      case 1:
+      {
+        if (isFirstColumn)
+          return QVariant ("Name");
+        Quantity_NameOfColor aColorName;
+        if (ViewControl_ColorSelector::IsExactColorName(myColor, aColorName))
+          return Quantity::NameOfColorToString (aColorName);
+      }
+      break;
+      case 2: return isFirstColumn ? QVariant ("Red") : ViewControl_Tools::ToVariant (myColor.GetRGB().Red());
+      case 3: return isFirstColumn ? QVariant ("Green") : ViewControl_Tools::ToVariant (myColor.GetRGB().Green());
+      case 4: return isFirstColumn ? QVariant ("Blue") : ViewControl_Tools::ToVariant (myColor.GetRGB().Blue());
+      case 5: return isFirstColumn ? QVariant ("Alpha") : ViewControl_Tools::ToVariant (myColor.Alpha());
+      case 6: return isFirstColumn ? QVariant ("Near Name") 
+                                   : Quantity::NameOfColorToString (myColor.GetRGB().Name());
+    }
+    return QVariant();
+  }
+
+  //! Sets content of the model index for the given role, it is applyed 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
+  virtual bool SetData (const int theRow, const int theColumn, const QVariant& theValue, int)
+  {
+    if (theColumn != 1 || theRow < 2 || theRow > 5)
+      return false;
+
+    switch (theRow)
+    {
+      case 2:
+      case 3:
+      case 4:
+      {
+        myColor.ChangeRGB().SetValues (theRow == 2 ? ViewControl_Tools::ToShortRealValue (theValue) : myColor.GetRGB().Red(),
+                                       theRow == 3 ? ViewControl_Tools::ToShortRealValue (theValue) : myColor.GetRGB().Green(),
+                                       theRow == 4 ? ViewControl_Tools::ToShortRealValue (theValue) : myColor.GetRGB().Blue(),
+                                       Quantity_TOC_RGB);
+      }
+      break;
+      case 5: myColor.SetAlpha (ViewControl_Tools::ToShortRealValue (theValue)); break;
+    }
+    mySelector->ParameterColorChanged();
+    return true;
+  }
+
+  //! Returns number of tree level line items = colums in table view
+  virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
+  { (void)theParent; return 2; }
+
+  //! Returns onlly one row in table view
+  virtual int RowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
+  { (void)theParent; return 7; }
+
+  //! Returns editable flag for color RGB and alpha rows
+  //! \return flags
+  Qt::ItemFlags Flags (const QModelIndex& theIndex) const
+  {
+    Qt::ItemFlags aFlags = ViewControl_TableModelValues::Flags (theIndex);
+
+    if (theIndex.column() == 1 && theIndex.row() >= 2 && theIndex.row() <= 5)
+      aFlags = aFlags | Qt::ItemIsEditable;
+
+    return aFlags;
+  }
+
+  //! 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
+  virtual ViewControl_EditType GetEditType (const int theRow, const int theColumn) const
+  {
+    if (theColumn == 1 && theRow >= 2 && theRow <= 5)
+      return ViewControl_EditType_Double;
+
+    return ViewControl_EditType_None;
+  }
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetEnumValues (const int theRow, const int theColumn) const
+  {
+    if (theColumn == 1 && theRow >= 2 && theRow <= 5)
+    {
+      QList<QVariant> aValues;
+      aValues << 0 << 1 << 6;
+      return aValues;
+    }
+    return QList<QVariant>();
+  }
+
+private:
+  Quantity_ColorRGBA myColor;
+  ViewControl_ColorSelector* mySelector;
+};
+
+//! Table of parameters: Red, Green, Blue, Alpha, OCCT color name
+class ViewControl_OCCTColorModel : public QAbstractTableModel
+{
+public:
+  ViewControl_OCCTColorModel (QObject* theParent)
+    : QAbstractTableModel (theParent), myCurrentIndexKind (ViewControl_ColorDelegateKind_None) {}
+  virtual ~ViewControl_OCCTColorModel() {}
+
+  //! Sets current color, that should have custom presented
+  //! \param theColor current color
+  //! \param theKind presentation kind
+  void SetColor (const Quantity_NameOfColor& theColor, const ViewControl_ColorDelegateKind theKind)
+  {
+    int aColorPosition = (int)theColor;
+    int aRow = (int) (aColorPosition / columnCount());
+    int aColumn = aColorPosition - aRow * columnCount();
+    myCurrentIndex = index (aRow, aColumn);
+    myCurrentIndexKind = theKind;
+
+    emit layoutChanged();
+  }
+
+  //! Returns OCCT name of color if index position does not exceed Quantity_NameOfColor elements
+  //! \param theIndex model index
+  //! \param theNameOfColor [out] OCCT color name
+  //! \return true if the color is found
+  bool GetOCCTColor (const QModelIndex& theIndex, Quantity_NameOfColor& theNameOfColor) const
+  {
+    int aNameOfColorId = theIndex.row() * columnCount() + theIndex.column();
+    if (aNameOfColorId > Quantity_NOC_WHITE)
+      return false;
+    theNameOfColor = (Quantity_NameOfColor)aNameOfColorId;
+    return true;
+  }
+
+  //! Returns index that has custom presentation
+  //! \return model index
+  QModelIndex GetCurrentIndex() const { return myCurrentIndex; }
+
+  //! Returns index color kind that has custom presentation
+  //! \return kind
+  ViewControl_ColorDelegateKind GetCurrentIndexKind() const { return myCurrentIndexKind; }
+
+  //! Returns item information(short) for display role.
+  //! \param theIndex a model index
+  //! \param theRole a view role
+  //! \return value intepreted depending on the given role
+  Standard_EXPORT virtual QVariant data (const QModelIndex& theIndex,
+                                         int theRole = Qt::DisplayRole) const Standard_OVERRIDE
+  {
+    if (theRole != Qt::ToolTipRole) // background is processed in table item delegate
+      return QVariant();
+
+    Quantity_NameOfColor aNameOfColor;
+    if (!GetOCCTColor (theIndex, aNameOfColor))
+      return QVariant();
+
+    if (theRole == Qt::ToolTipRole)
+      return QString("%1 (%2)").arg(Quantity::NameOfColorToString (aNameOfColor))
+                               .arg (ViewControl_ColorSelector::ColorToString (Quantity_Color (aNameOfColor)));
+    return QVariant();
+  }
+
+  //! Returns number of tree level line items = colums in table view
+  virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
+  { (void)theParent; return 26; }
+
+  //! Returns onlly one row in table view
+  virtual int rowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
+  { (void)theParent; return 20; }
+
+  //! Returns color for the delegate kind
+  //! \param theKind kind
+  //! \return color
+  static QColor GetKindColor (const ViewControl_ColorDelegateKind theKind)
+  {
+    switch (theKind)
+    {
+      case ViewControl_ColorDelegateKind_Activated:
+      case ViewControl_ColorDelegateKind_Highlighted: return Qt::blue;
+      case ViewControl_ColorDelegateKind_Selected: return Qt::black;
+      default: break;
+    }
+    return QColor();
+  }
+
+private:
+  QModelIndex myCurrentIndex; //!< index to be presented through item delegate
+  ViewControl_ColorDelegateKind myCurrentIndexKind; //!< kind of custom item
+};
+
+//! \class DFBrowser_HighlightDelegate
+//! \brief An item delegate to paint in highlight color the cell when the mouse cursor is over it
+class ViewControl_OCCTColorDelegate : public QItemDelegate
+{
+public:
+
+  //! Constructor
+  ViewControl_OCCTColorDelegate (QObject* theParent = 0) : QItemDelegate (theParent) {}
+
+  //! Destructor
+  virtual ~ViewControl_OCCTColorDelegate() Standard_OVERRIDE {}
+
+  //! Redefine 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
+  virtual void paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
+                      const QModelIndex& theIndex) const Standard_OVERRIDE
+  {
+    QRect aBaseRect = theOption.rect;
+    int aNameOfColorId = theIndex.row() * theIndex.model()->columnCount(theIndex) + theIndex.column();
+    Quantity_NameOfColor aNameOfColor = Quantity_NOC_WHITE;
+    if (aNameOfColorId < (int)Quantity_NOC_WHITE)
+      aNameOfColor = (Quantity_NameOfColor)aNameOfColorId;
+
+    Quantity_Color anOCCTColor (aNameOfColor);
+    QColor aQColor = ViewControl_ColorSelector::ColorToQColor (Quantity_ColorRGBA (anOCCTColor));
+    thePainter->fillRect (aBaseRect, aQColor);
+
+    QColor aColor;
+    // highlight cell
+    if (theOption.state & QStyle::State_MouseOver)
+      aColor = ViewControl_OCCTColorModel::GetKindColor (ViewControl_ColorDelegateKind_Highlighted);
+    else
+    {
+      const ViewControl_OCCTColorModel* aTableModel = dynamic_cast<const ViewControl_OCCTColorModel*> (theIndex.model());
+      QModelIndex anIndex = aTableModel->GetCurrentIndex();
+      if (anIndex.isValid() && anIndex.row() == theIndex.row() && anIndex.column() == theIndex.column())
+        aColor = ViewControl_OCCTColorModel::GetKindColor (aTableModel->GetCurrentIndexKind());
+    }
+    
+    if (aColor.isValid())
+    {
+      int aRectSize = 2;
+      thePainter->fillRect (QRect (aBaseRect.topLeft(), QPoint (aBaseRect.bottomLeft().x() + aRectSize, aBaseRect.bottomLeft().y())),
+                            aColor);
+      thePainter->fillRect (QRect (QPoint (aBaseRect.topRight().x() - aRectSize, aBaseRect.topRight().y()), aBaseRect.bottomRight()),
+                            aColor);
+      thePainter->fillRect (QRect (QPoint (aBaseRect.topLeft().x() + aRectSize, aBaseRect.topLeft().y()),
+                                   QPoint (aBaseRect.topRight().x() - aRectSize, aBaseRect.topRight().y() + aRectSize)),
+                            aColor);
+      thePainter->fillRect (QRect (QPoint (aBaseRect.bottomLeft().x() + aRectSize, aBaseRect.bottomLeft().y() - aRectSize),
+                                   QPoint (aBaseRect.bottomRight().x() - aRectSize, aBaseRect.bottomRight().y())),
+                            aColor);
+    }
+  }
+};
+
+//! Color picker class
+class ViewControl_ColorPicker : public QWidget
+{
+public:
+  ViewControl_ColorPicker (QWidget* theParent) : QWidget (theParent) {}
+  virtual ~ViewControl_ColorPicker() {}
+};
+
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+ViewControl_ColorSelector::ViewControl_ColorSelector (QWidget* theParent)
+: QDialog (theParent)
+{
+  QGridLayout* aLayout = new QGridLayout (this);
+  aLayout->setContentsMargins (0, 0, 0, 0);
+
+  myParameters = new QTableView (this);
+  ViewControl_TableModel* aTableModel = new ViewControl_TableModel (myParameters);
+  aTableModel->SetModelValues (new ViewControl_ParametersModel (this));
+  myParameters->setModel(aTableModel);
+
+  ViewControl_TableItemDelegate* anItemDelegate = new ViewControl_TableItemDelegate();
+  anItemDelegate->SetModelValues (aTableModel->GetModelValues());
+  myParameters->setItemDelegate(anItemDelegate);
+
+  myParameters->verticalHeader()->setDefaultSectionSize (myParameters->verticalHeader()->minimumSectionSize());
+  myParameters->verticalHeader()->setVisible (false);
+  myParameters->horizontalHeader()->setVisible (false);
+  myParameters->setMinimumHeight (myParameters->verticalHeader()->minimumSectionSize() * aTableModel->rowCount() +
+                                  TreeModel_Tools::HeaderSectionMargin());
+
+  QItemSelectionModel* aSelectionModel = new QItemSelectionModel (myParameters->model());
+  myParameters->setSelectionMode (QAbstractItemView::SingleSelection);
+  myParameters->setSelectionModel (aSelectionModel);
+  connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
+          this, SLOT (onParametersTableSelectionChanged (const QItemSelection&, const QItemSelection&)));
+
+  aLayout->addWidget (myParameters, 0, 0);
+
+  myColorPicker = new ViewControl_ColorPicker (this);
+  aLayout->addWidget (myColorPicker, 0, 1);
+
+  myOCCTColors = new QTableView (this);
+  myOCCTColors->setFixedSize (525, 405);
+  myOCCTColors->verticalHeader()->setDefaultSectionSize (20);
+  myOCCTColors->verticalHeader()->setVisible (false);
+  myOCCTColors->horizontalHeader()->setDefaultSectionSize (20);
+  myOCCTColors->horizontalHeader()->setVisible (false);
+  myOCCTColors->setModel(new ViewControl_OCCTColorModel(myOCCTColors));
+
+  myOCCTColors->viewport()->setAttribute (Qt::WA_Hover);
+  myOCCTColors->setItemDelegate (new ViewControl_OCCTColorDelegate (myOCCTColors));
+
+  aSelectionModel = new QItemSelectionModel (myOCCTColors->model());
+  myOCCTColors->setSelectionMode (QAbstractItemView::SingleSelection);
+  myOCCTColors->setSelectionModel (aSelectionModel);
+  connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
+          this, SLOT (onOCCTColorsTableSelectionChanged (const QItemSelection&, const QItemSelection&)));
+  aLayout->addWidget (myOCCTColors, 1, 0, 1, 2);
+
+  myDialogButtons = new QDialogButtonBox (QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
+  connect(myDialogButtons, &QDialogButtonBox::accepted, this, &QDialog::accept);
+  connect(myDialogButtons, &QDialogButtonBox::rejected, this, &QDialog::reject);
+
+  aLayout->addWidget(myDialogButtons, 2, 0, 1, 2);
+}
+
+// =======================================================================
+// function : SetColor
+// purpose :
+// =======================================================================
+
+void ViewControl_ColorSelector::SetColor (const QString& theColor)
+{
+  Quantity_ColorRGBA aColor = StringToColorRGBA (theColor);
+  // parameters model
+  ViewControl_TableModel* aTableModel = dynamic_cast<ViewControl_TableModel*> (myParameters->model());
+  ViewControl_ParametersModel* aParametersModel = dynamic_cast<ViewControl_ParametersModel*> (aTableModel->GetModelValues());
+  aParametersModel->SetColor (aColor, aTableModel);
+
+  // OCCT color model
+  Quantity_NameOfColor aColorName;
+  bool isExactColorName = ViewControl_ColorSelector::IsExactColorName(aColor, aColorName);
+  ViewControl_OCCTColorModel* anOCCTColorModel = dynamic_cast<ViewControl_OCCTColorModel*>(myOCCTColors->model());
+  anOCCTColorModel->SetColor (aColorName, isExactColorName ? ViewControl_ColorDelegateKind_Selected
+                                                           : ViewControl_ColorDelegateKind_Activated);
+}
+
+// =======================================================================
+// function : GetColor
+// purpose :
+// =======================================================================
+
+QString ViewControl_ColorSelector::GetColor() const
+{
+  ViewControl_TableModel* aTableModel = dynamic_cast<ViewControl_TableModel*> (myParameters->model());
+  ViewControl_ParametersModel* aParametersModel = dynamic_cast<ViewControl_ParametersModel*> (aTableModel->GetModelValues());
+
+  return ColorToString (aParametersModel->GetColor());
+}
+
+// =======================================================================
+// function : ParameterColorChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_ColorSelector::ParameterColorChanged()
+{
+  ViewControl_TableModel* aTableModel = dynamic_cast<ViewControl_TableModel*> (myParameters->model());
+  ViewControl_ParametersModel* aParametersModel = dynamic_cast<ViewControl_ParametersModel*> (aTableModel->GetModelValues());
+  Quantity_ColorRGBA aColor = aParametersModel->GetColor();
+
+  // OCCT color model
+  Quantity_NameOfColor aColorName;
+  bool isExactColorName = ViewControl_ColorSelector::IsExactColorName(aColor, aColorName);
+  ViewControl_OCCTColorModel* anOCCTColorModel = dynamic_cast<ViewControl_OCCTColorModel*>(myOCCTColors->model());
+  anOCCTColorModel->SetColor (aColorName, isExactColorName ? ViewControl_ColorDelegateKind_Selected
+                                                           : ViewControl_ColorDelegateKind_Activated);
+}
+
+// =======================================================================
+// function : ColorToString
+// purpose :
+// =======================================================================
+
+QString ViewControl_ColorSelector::ColorToString (const Quantity_Color& theColor)
+{
+  Standard_Real aRed, aGreen, aBlue;
+  theColor.Values (aRed, aGreen, aBlue, Quantity_TOC_RGB);
+  return QString::number (aRed) + ViewControl_ColorSelector::ColorSeparator() +
+         QString::number (aGreen) + ViewControl_ColorSelector::ColorSeparator() +
+         QString::number (aBlue);
+}
+
+// =======================================================================
+// function : ColorToString
+// purpose :
+// =======================================================================
+
+QString ViewControl_ColorSelector::ColorToString (const Quantity_ColorRGBA& theColor)
+{
+  const Quantity_Color& aRGBColor = theColor.GetRGB();
+  Standard_ShortReal anAlpha = theColor.Alpha();
+
+  return ColorToString (aRGBColor) + ViewControl_ColorSelector::ColorSeparator() + QString::number (anAlpha);
+}
+
+// =======================================================================
+// function : ColorToQColor
+// purpose :
+// =======================================================================
+
+QColor ViewControl_ColorSelector::ColorToQColor (const Quantity_ColorRGBA& theColor)
+{
+  int aDelta = 255;
+
+  Standard_Real aRed, aGreen, aBlue;
+  theColor.GetRGB().Values (aRed, aGreen, aBlue, Quantity_TOC_RGB);
+
+  return QColor((int)(aRed * aDelta), (int)(aGreen * aDelta), (int)(aBlue * aDelta));
+}
+
+// =======================================================================
+// function : StringToColor
+// purpose :
+// =======================================================================
+
+Quantity_Color ViewControl_ColorSelector::StringToColor (const QString& theColor, Standard_ShortReal& theAlpha)
+{
+  Quantity_ColorRGBA aColorGRBA = StringToColorRGBA (theColor);
+  theAlpha = aColorGRBA.Alpha();
+  return aColorGRBA.GetRGB();
+}
+
+// =======================================================================
+// function : StringToColor
+// purpose :
+// =======================================================================
+
+Quantity_Color ViewControl_ColorSelector::StringToColor (const QString& theColor)
+{
+  return StringToColorRGBA (theColor).GetRGB();
+}
+
+// =======================================================================
+// function : StringToColorRGBA
+// purpose :
+// =======================================================================
+
+Quantity_ColorRGBA ViewControl_ColorSelector::StringToColorRGBA (const QString& theColor)
+{
+  float anAlpha = 1.0f;
+
+  QStringList aList = theColor.split (ViewControl_ColorSelector::ColorSeparator(), QString::SkipEmptyParts);
+  if (aList.size() < 3)
+    return Quantity_ColorRGBA();
+
+  if (aList.size() == 4)
+    anAlpha = aList[3].toFloat();
+
+  return Quantity_ColorRGBA (aList[0].toFloat(), aList[1].toFloat(), aList[2].toFloat(), anAlpha);
+}
+
+// =======================================================================
+// function : onParametersTableSelectionChanged
+// purpose :
+// =======================================================================
+
+Standard_Boolean ViewControl_ColorSelector::IsExactColorName (const Quantity_ColorRGBA& theColor,
+                                                              Quantity_NameOfColor& theColorName)
+{
+  theColorName = theColor.GetRGB().Name();
+  return Quantity_Color (theColorName).IsEqual (theColor.GetRGB());
+}
+
+// =======================================================================
+// function : onParametersTableSelectionChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_ColorSelector::onParametersTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection&)
+{
+  //Quantity_ColorRGBA aColor = StringToColorRGBA (theColor);
+  //// parameters model
+  //ViewControl_TableModel* aTableModel = dynamic_cast<ViewControl_TableModel*> (myParameters->model());
+  //ViewControl_ParametersModel* aParametersModel = dynamic_cast<ViewControl_ParametersModel*> (aTableModel->GetModelValues());
+  //aParametersModel->SetColor (aColor);
+
+  //// OCCT color model
+  //Quantity_NameOfColor aColorName;
+  //bool isExactColorName = ViewControl_ColorSelector::IsExactColorName(aColor, aColorName);
+  //ViewControl_OCCTColorModel* anOCCTColorModel = dynamic_cast<ViewControl_OCCTColorModel*>(myOCCTColors->model());
+  //anOCCTColorModel->SetColor (aColorName, isExactColorName ? ViewControl_ColorDelegateKind_Selected
+  //                                                         : ViewControl_ColorDelegateKind_Activated);
+}
+
+// =======================================================================
+// function : onOCCTColorsTableSelectionChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_ColorSelector::onOCCTColorsTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection&)
+{
+  QModelIndexList aSelectedIndices = theSelected.indexes();
+  if (aSelectedIndices.size() != 1)
+    return;
+
+  ViewControl_OCCTColorModel* anOCCTColorModel = dynamic_cast<ViewControl_OCCTColorModel*>(myOCCTColors->model());
+  Quantity_NameOfColor aNameOfColor;
+  if (!anOCCTColorModel->GetOCCTColor (aSelectedIndices.first(), aNameOfColor))
+    return;
+
+  anOCCTColorModel->SetColor (aNameOfColor, ViewControl_ColorDelegateKind_Selected);
+
+  // parameters model
+  ViewControl_TableModel* aTableModel = dynamic_cast<ViewControl_TableModel*> (myParameters->model());
+  ViewControl_ParametersModel* aParametersModel = dynamic_cast<ViewControl_ParametersModel*> (aTableModel->GetModelValues());
+  Quantity_Color anOCCTColor (aNameOfColor);
+  aParametersModel->SetColor (Quantity_ColorRGBA (anOCCTColor), aTableModel);
+}
diff --git a/tools/ViewControl/ViewControl_ColorSelector.hxx b/tools/ViewControl/ViewControl_ColorSelector.hxx
new file mode 100644 (file)
index 0000000..a666300
--- /dev/null
@@ -0,0 +1,115 @@
+// Created on: 2018-08-16
+// Created by: Natalia ERMOLAEVA
+// 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. 
+
+#ifndef ViewControl_ColorSelector_H
+#define ViewControl_ColorSelector_H
+
+#include <inspector/ViewControl.hxx>
+
+#include <Quantity_ColorRGBA.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QColor>
+#include <QDialog>
+//#include <QPushButton>
+#include <QItemSelection>
+#include <QString>
+#include <QWidget>
+#include <Standard_WarningsRestore.hxx>
+
+class ViewControl_ColorPicker;
+class QDialogButtonBox;
+class QTableView;
+
+//! \class ViewControl_ColorSelector
+//! \brief Selector of OCCT color
+class VIEWCONTROL_EXPORT ViewControl_ColorSelector : public QDialog
+{
+  Q_OBJECT
+public:
+
+  //! Constructor
+  ViewControl_ColorSelector (QWidget* theParent);
+
+  //! Destructor
+  virtual ~ViewControl_ColorSelector() Standard_OVERRIDE {}
+
+  //! Inits control by the color value
+  //! \param theColor text color value
+  void SetColor (const QString& theColor);
+
+  //! Returns current selected color value
+  //! \return text color value
+  QString GetColor() const;
+
+  //! Updates OCCT color model by changing color in parameter model
+  void ParameterColorChanged();
+
+  //! Converts color to string value in form: r;g;b
+  //! \param theColor color value
+  //! \return text value
+  static QString ColorToString (const Quantity_Color& theColor);
+
+  //! Converts color to string value in form: r;g;b;alpha
+  //! \param theColor color value
+  //! \return text value
+  static QString ColorToString (const Quantity_ColorRGBA& theColor);
+
+  //! Converts color to QColor value in form: r;g;b;a
+  //! \param theColor color value
+  //! \return qt color value
+  static QColor ColorToQColor (const Quantity_ColorRGBA& theColor);
+
+  //! Converts string to color value from a form: r;g;b;a
+  //! \param theColor text color value
+  //! \return color value
+  static Quantity_Color StringToColor (const QString& theColor, Standard_ShortReal& theAlpha);
+
+  //! Converts string to color value from a form: r;g;b
+  //! \param theColor text color value
+  //! \return color value
+  static Quantity_Color StringToColor (const QString& theColor);
+
+  //! Converts string to color value from a form: r;g;b;a
+  //! \param theColor text color value
+  //! \return color value
+  static Quantity_ColorRGBA StringToColorRGBA (const QString& theColor);
+
+  static Standard_Boolean IsExactColorName (const Quantity_ColorRGBA& theColor,
+                                            Quantity_NameOfColor& theColorName);
+
+private:
+  //! Returns symbol used as a separtor of color components in string conversion
+  //! \return symbol value
+  static QString ColorSeparator() { return ";"; }
+
+private slots:
+  //! Slots listen selection change and update the current control content by selection
+  //! \param theSelected container of selected items
+  //! \param theDeselected container of items that become deselected
+  void onParametersTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+  //! Slots listen selection change and update the current control content by selection
+  //! \param theSelected container of selected items
+  //! \param theDeselected container of items that become deselected
+  void onOCCTColorsTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+private:
+  QTableView* myParameters; //! current color parameters (RGB, alpha, color name)
+  ViewControl_ColorPicker* myColorPicker; //! color picker
+  QTableView* myOCCTColors; //! OCCT color values
+  QDialogButtonBox* myDialogButtons; //! OK/Cancel buttons
+};
+#endif
diff --git a/tools/ViewControl/ViewControl_EditType.hxx b/tools/ViewControl/ViewControl_EditType.hxx
new file mode 100644 (file)
index 0000000..7779b04
--- /dev/null
@@ -0,0 +1,31 @@
+// 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 ViewControl_EditType_H
+#define ViewControl_EditType_H
+
+//! Type of context used in a tool library
+enum ViewControl_EditType
+{
+  ViewControl_EditType_None, //!< View widget is null
+  ViewControl_EditType_Bool, //!< check box widget
+  ViewControl_EditType_Color, //!< color selector widget
+  ViewControl_EditType_Combo, //!< combo box widget
+  ViewControl_EditType_Double, //!< line edit widget used double validator
+  ViewControl_EditType_Line, //!< line edit widget
+  ViewControl_EditType_Spin //!< spin box widget
+};
+
+#endif
diff --git a/tools/ViewControl/ViewControl_PropertyView.cxx b/tools/ViewControl/ViewControl_PropertyView.cxx
new file mode 100644 (file)
index 0000000..e09527e
--- /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/ViewControl_PropertyView.hxx>
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+#include <inspector/ViewControl_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAbstractTableModel>
+#include <QStackedWidget>
+#include <QScrollArea>
+#include <QTableView>
+#include <QVBoxLayout>
+#include <QWidget>
+#include <Standard_WarningsRestore.hxx>
+
+class ViewControl_Widget : public QWidget
+{
+public:
+  //! Constructor
+  ViewControl_Widget (QWidget* theParent, const QSize& theSize) : QWidget (theParent) { SetPredefinedSize (theSize); }
+
+  //! Destructor
+  virtual ~ViewControl_Widget() {}
+
+  //! Sets default size of control, that is used by the first control show
+  //! \param theDefaultWidth the width value
+  //! \param theDefaultHeight the height value
+  void SetPredefinedSize (const QSize& theSize) { myDefaultSize = theSize;}
+
+  //! Returns predefined size if both values are positive, otherwise parent size hint
+  virtual QSize sizeHint() const Standard_OVERRIDE { return myDefaultSize.isValid() ? myDefaultSize : QWidget::sizeHint(); }
+
+private:
+  QSize myDefaultSize; //! default size, empty isze if it should not be used
+};
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+ViewControl_PropertyView::ViewControl_PropertyView (QWidget* theParent, const QSize& thePredefinedSize)
+: QObject (theParent), myOwnSelectionChangeBlocked (false)
+{
+  myMainWidget = new ViewControl_Widget (theParent, QSize (1, 100));
+  if (!thePredefinedSize.isEmpty())
+    ((ViewControl_Widget*)myMainWidget)->SetPredefinedSize (thePredefinedSize);
+
+  QVBoxLayout* aLayout = new QVBoxLayout (myMainWidget);
+  aLayout->setContentsMargins (0, 0, 0, 0);
+
+  QScrollArea* anArea = new QScrollArea (myMainWidget);
+
+  myAttributesStack = new QStackedWidget (myMainWidget);
+  anArea->setWidget (myAttributesStack);
+  anArea->setWidgetResizable( true );
+  aLayout->addWidget (anArea);
+
+  myEmptyWidget = new QWidget (myAttributesStack);
+  myAttributesStack->addWidget (myEmptyWidget);
+
+  myTableWidget = new QWidget (myAttributesStack);
+  myTableWidgetLayout = new QVBoxLayout (myTableWidget);
+  myTableWidgetLayout->setContentsMargins (0, 0, 0, 0);
+  myAttributesStack->addWidget (myTableWidget);
+
+  myAttributesStack->setCurrentWidget (myEmptyWidget);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::Init (const QList<ViewControl_TableModelValues*>& theTableValues)
+{
+  for (int aTableId = 0; aTableId < theTableValues.size(); aTableId++)
+  {
+    ViewControl_TableModelValues* aValues = theTableValues[aTableId];
+
+    ViewControl_Table* aTable = findTable (aTableId);
+
+    aTable->Init (aValues);
+    ViewControl_Tools::SetDefaultHeaderSections (aTable->GetTableView(), Qt::Horizontal);
+
+    aTable->SetActive (true);
+  }
+  // hide not used tables
+  for (int aTableId = theTableValues.size(); aTableId < myTables.size(); aTableId++)
+  {
+    ViewControl_Table* aTable = findTable (aTableId, false);
+    if (!aTable)
+      continue;
+
+    ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (aTable->GetTableView()->model());
+    aModel->SetModelValues (0);
+
+    aTable->SetActive (false);
+  }
+
+  if (theTableValues.size() > 0)
+    myAttributesStack->setCurrentWidget (myTableWidget);
+  else
+    myAttributesStack->setCurrentWidget (myEmptyWidget);
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::Init (QWidget*)
+{
+}
+
+// =======================================================================
+// function : GetActiveTables
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::GetActiveTables (QList<ViewControl_Table*>& theTables)
+{
+  for (int aTableId = 0; aTableId < myTables.size(); aTableId++)
+  {
+    ViewControl_Table* aTable = findTable (aTableId, false);
+    if (aTable && aTable->IsActive())
+      theTables.append (aTable);
+  }
+}
+
+// =======================================================================
+// function : ClearActiveTablesSelection
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::ClearActiveTablesSelection()
+{
+  bool aWasBlocked = myOwnSelectionChangeBlocked;
+  myOwnSelectionChangeBlocked = true;
+
+  QList<ViewControl_Table*> aTables;
+  for (int aTableId = 0; aTableId < myTables.size(); aTableId++)
+  {
+    ViewControl_Table* aTable = findTable (aTableId, false);
+    if (aTable && aTable->IsActive())
+      aTable->GetTableView()->selectionModel()->clearSelection();
+  }
+  myOwnSelectionChangeBlocked = aWasBlocked;
+}
+
+// =======================================================================
+// function : Clear
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::Clear()
+{
+  for (int aTableId = 0; aTableId < myTables.size(); aTableId++)
+  {
+    ViewControl_Table* aTable = findTable (aTableId, false);
+    if (!aTable)
+      continue;
+
+    ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (aTable->GetTableView()->model());
+    aModel->SetModelValues (0);
+
+    aTable->SetActive (true);
+  }
+  myAttributesStack->setCurrentWidget (myEmptyWidget);
+}
+
+// =======================================================================
+// function : findTable
+// purpose :
+// =======================================================================
+ViewControl_Table* ViewControl_PropertyView::findTable (const int theTableId, const bool isToCreate)
+{
+  if (!isToCreate && theTableId >= myTables.size())
+    return 0;
+
+  if (theTableId < myTables.size())
+    return myTables[theTableId];
+
+  ViewControl_Table* aTable = new ViewControl_Table (myMainWidget);
+  ViewControl_TableModel* aModel = new ViewControl_TableModel(aTable->GetTableView());
+  aTable->SetModel (aModel);
+
+
+  connect (aTable->GetTableView()->selectionModel(),
+          SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
+          this, SLOT(onTableSelectionChanged (const QItemSelection&, const QItemSelection&)));
+  connect (aTable->GetProperty(), SIGNAL (propertyChanged()), this, SIGNAL (propertyViewSelectionChanged()));
+
+  if (myXStepValues.size() > theTableId)
+    aTable->GetProperty()->SetXStep (myXStepValues[theTableId]);
+
+  if (myDivideValues.size() > theTableId)
+    aTable->GetProperty()->SetDivideSize (myDivideValues[theTableId]);
+
+  myTableWidgetLayout->addWidget (aTable->GetControl());
+
+  myTables.insert (theTableId, aTable);
+
+  return myTables[theTableId];
+}
+
+// =======================================================================
+// function : onTableSelectionChanged
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::onTableSelectionChanged (const QItemSelection&, const QItemSelection&)
+{
+  if (myOwnSelectionChangeBlocked)
+    return;
+
+  emit propertyViewSelectionChanged();
+}
+
+// =======================================================================
+// function : SaveState
+// purpose :
+// =======================================================================
+void ViewControl_PropertyView::SaveState (ViewControl_PropertyView* theView,
+                                          QMap<QString, QString>& theItems,
+                                          const QString& thePrefix)
+{
+  QList<ViewControl_Table*> anActiveTables;
+  theView->GetActiveTables(anActiveTables);
+
+  if (anActiveTables.size() == 0)
+    return;
+
+  anActiveTables[0]->GetProperty()->GetXStep();
+  QStringList aDivideSizes, aXSteps;
+  for (int i = 0; i < anActiveTables.size(); i++)
+  {
+    aXSteps.append (QString::number (anActiveTables[i]->GetProperty()->GetXStep()));
+    aDivideSizes.append (QString::number (anActiveTables[i]->GetProperty()->GetDivideSize()));
+  }
+  theItems[thePrefix + "property_view_xstep_value"] = aXSteps.join (",");
+  theItems[thePrefix + "property_view_divide_value"] = aDivideSizes.join (",");
+}
+
+// =======================================================================
+// function : RestoreState
+// purpose :
+// =======================================================================
+bool ViewControl_PropertyView::RestoreState (ViewControl_PropertyView* theView,
+                                             const QString& theKey,
+                                             const QString& theValue,
+                                             const QString& thePrefix)
+{
+  if (theKey == thePrefix + "property_view_xstep_value")
+  {
+    QList<double> aXStepValues;
+    QStringList aValues = theValue.split (",", QString::SkipEmptyParts);
+    for (int aValueId = 0; aValueId < aValues.size(); aValueId++)
+      aXStepValues.append (aValues.at (aValueId).toDouble());
+    theView->SetXSteps (aXStepValues);
+  }
+  else if (theKey == thePrefix + "property_view_divide_value")
+  {
+    QList<int> aDivideValues;
+    QStringList aValues = theValue.split (",", QString::SkipEmptyParts);
+    for (int aValueId = 0; aValueId < aValues.size(); aValueId++)
+      aDivideValues.append (aValues.at (aValueId).toInt());
+    theView->SetDivideValues (aDivideValues);
+  }
+  else
+    return false;
+  return true;
+}
diff --git a/tools/ViewControl/ViewControl_PropertyView.hxx b/tools/ViewControl/ViewControl_PropertyView.hxx
new file mode 100644 (file)
index 0000000..1a82c21
--- /dev/null
@@ -0,0 +1,127 @@
+// 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_PropertyView_H
+#define TreeModel_PropertyView_H
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+#include <inspector/ViewControl_Table.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QObject>
+#include <QList>
+#include <Standard_WarningsRestore.hxx>
+
+class QAbstractTableModel;
+class QStackedWidget;
+class QWidget;
+class QVBoxLayout;
+
+class ViewControl_TableModelValues;
+
+//! \class ViewControl_PropertyView
+//! \brief View widget where several tables are visualized in vertical layout.
+class ViewControl_PropertyView : public QObject
+{
+  Q_OBJECT
+public:
+
+  //! Constructor
+  Standard_EXPORT ViewControl_PropertyView (QWidget* theParent, const QSize& thePredefinedSize = QSize());
+
+  //! Destructor
+  virtual ~ViewControl_PropertyView() Standard_OVERRIDE {}
+
+  //! Fills the view content with values. Number of visible tables is size of container,
+  //! Each element of container is values of the corresponded table
+  //! \param theTableValues values
+  Standard_EXPORT void Init (const QList<ViewControl_TableModelValues*>& theTableValues);
+
+  //! Fills the view content with the parameter custom widget.
+  //! \param theWidget control
+  Standard_EXPORT void Init (QWidget* theWidget);
+
+    //! Clears layout of the view and tables models.
+  Standard_EXPORT void Clear();
+
+  //! \return the text edit control
+  QWidget* GetControl() const { return myMainWidget; }
+
+  //! Returns container of active tables
+  //! \param theTables [out] modified container
+  Standard_EXPORT void GetActiveTables (QList<ViewControl_Table*>& theTables);
+
+  //! Clears selection in active tables
+  Standard_EXPORT void ClearActiveTablesSelection();
+
+  //! Sets X steps values for table properties
+  //! \param container of values
+  void SetXSteps (const QList<double>& theValues) { myXStepValues = theValues; }
+
+  //! Sets divide values for table properties
+  //! \param container of values
+  void SetDivideValues (const QList<int>& theValues) { myDivideValues = theValues; }
+
+  //! Save state of three view in a container in form: key, value. It saves:
+  //! - XStep of property table
+  //! - divide values of property table
+  //! \param theTreeView a view instance
+  //! \param theItems [out] properties
+  //! \param thePrefix peference item prefix
+  Standard_EXPORT static void SaveState (ViewControl_PropertyView* theView, QMap<QString, QString>& theItems,
+                                         const QString& thePrefix = QString());
+  //! Restore state of three view by a container
+  //! \param theTreeView a view instance
+  //! \param theKey property key
+  //! \param theValue property value
+  //! \param thePrefix peference item prefix
+  //! \return boolean value whether the property is applyed to the tree view
+  Standard_EXPORT static bool RestoreState (ViewControl_PropertyView* theView, const QString& theKey, const QString& theValue,
+                                            const QString& thePrefix = QString());
+
+signals:
+  void propertyViewSelectionChanged();
+
+protected slots:
+  //! Emits signal about selection is changed
+  //! \param theSelected container of selected table cells
+  //! \param theDeselected container of selected table cells
+  void onTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+protected:
+  //! Returns table instance or create if it was not created ealier
+  //! \param theTableId an index in internal container of tables
+  //! \param isToCreate if true, the table is created if not exists
+  ViewControl_Table* findTable (const int theTableId, const bool isToCreate = true);
+
+private:
+  bool myOwnSelectionChangeBlocked; //! blocking emit of selection changed signal
+
+  QWidget* myMainWidget; //! parent of all controls
+
+  QStackedWidget* myAttributesStack; //!< container of already created panes
+  QWidget* myEmptyWidget; //!< an empty widget when nothing is selected in tree view
+
+  QWidget* myTableWidget; //!< widget of tables in vertical layout
+  QVBoxLayout* myTableWidgetLayout; //! main view layout where tables or custom widgets are presented
+  QList<ViewControl_Table*> myTables; //!< table view, shown only first tables filled in Init method
+  QWidget* myCustomWidget; //!< custom view widget
+
+  QList<double> myXStepValues; //! predefined values for XStep in ViewControl_TableProperty
+  QList<int> myDivideValues; //! predefined values for divide value in ViewControl_TableProperty
+};
+#endif
diff --git a/tools/ViewControl/ViewControl_Table.cxx b/tools/ViewControl/ViewControl_Table.cxx
new file mode 100644 (file)
index 0000000..9975924
--- /dev/null
@@ -0,0 +1,144 @@
+// 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/ViewControl_Table.hxx>
+#include <inspector/ViewControl_TableItemDelegate.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableProperty.hxx>
+
+#include <inspector/TreeModel_Tools.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAction>
+#include <QGridLayout>
+#include <QHeaderView>
+#include <QItemDelegate>
+#include <QLabel>
+#include <QTableView>
+#include <QWidget>
+#include <Standard_WarningsRestore.hxx>
+
+#include <limits>
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+ViewControl_Table::ViewControl_Table (QWidget* theParent)
+: QObject (theParent), myIsUseProperty (false)
+{
+  myMainWidget = new QWidget (theParent);
+  QGridLayout* aLayout = new QGridLayout (myMainWidget);
+  aLayout->setContentsMargins (0, 0, 0, 0);
+
+  myProperty = new ViewControl_TableProperty(myMainWidget, this);
+  aLayout->addWidget (myProperty->GetControl());
+
+  myTableView = new QTableView (myMainWidget);
+  myTableView->setVerticalScrollMode (QAbstractItemView::ScrollPerPixel);
+
+  myTableView->setItemDelegate (new ViewControl_TableItemDelegate (theParent));
+
+  QHeaderView* aVHeader = myTableView->verticalHeader();
+  int aDefCellSize = aVHeader->minimumSectionSize();
+  aVHeader->setDefaultSectionSize (aDefCellSize);
+
+  aLayout->addWidget (myTableView);
+  aLayout->addWidget (myProperty->GetInformationControl());
+}
+
+// =======================================================================
+// function : SetModel
+// purpose :
+// =======================================================================
+
+void ViewControl_Table::SetModel (QAbstractTableModel* theModel)
+{
+  myTableView->setModel (theModel);
+
+  myTableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+  QItemSelectionModel* aSelectionModel = new QItemSelectionModel(theModel);
+  myTableView->setSelectionModel (aSelectionModel);
+  connect(aSelectionModel, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+          this, SLOT(onTableSelectionChanged(const QItemSelection&, const QItemSelection&)));
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void ViewControl_Table::Init (ViewControl_TableModelValues* theModelValues)
+{
+  myTableView->selectionModel()->clearSelection();
+
+  ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (myTableView->model());
+  aModel->SetModelValues (theModelValues);
+
+  myProperty->SetActive (theModelValues->UseTableProperties());
+  myProperty->Init();
+
+  ViewControl_TableItemDelegate* aDelegate = dynamic_cast<ViewControl_TableItemDelegate*>(myTableView->itemDelegate());
+  aDelegate->SetModelValues (theModelValues);
+
+  int aSectionSize;
+  myTableView->horizontalHeader()->setVisible (theModelValues->IsHeaderVisible (Qt::Horizontal));
+  if (theModelValues->GetDefaultSectionSize (Qt::Horizontal, aSectionSize) )
+    myTableView->horizontalHeader()->setDefaultSectionSize (aSectionSize);
+
+  myTableView->verticalHeader()->setVisible (theModelValues->IsHeaderVisible (Qt::Vertical));
+  if (theModelValues->GetDefaultSectionSize (Qt::Vertical, aSectionSize) )
+  {
+    myTableView->verticalHeader()->setDefaultSectionSize (aSectionSize);
+  }
+  else
+    myTableView->verticalHeader()->setDefaultSectionSize (myTableView->verticalHeader()->minimumSectionSize());
+
+  aModel->EmitLayoutChanged();
+}
+
+// =======================================================================
+// function : GetSelectedIndices
+// purpose :
+// =======================================================================
+
+void ViewControl_Table::GetSelectedIndices (QMap<int, QList<int>>& theSelectedIndices)
+{
+  QModelIndexList aSelected = myTableView->selectionModel()->selectedIndexes();
+  ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (myTableView->model());
+
+  int aRow, aColumn;
+  for (QModelIndexList::const_iterator anIt = aSelected.begin(); anIt != aSelected.end(); anIt++)
+  {
+    aModel->GetSourcePosition (*anIt, aRow, aColumn);
+
+    if (!theSelectedIndices.contains (aRow))
+      theSelectedIndices.insert (aRow, QList<int>());
+    theSelectedIndices[aRow].append (aColumn);
+  }
+}
+
+// =======================================================================
+// function : onTableSelectionChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_Table::onTableSelectionChanged(const QItemSelection&, const QItemSelection&)
+{
+  QModelIndexList aSelected = myTableView->selectionModel()->selectedIndexes();
+
+  myProperty->UpdateOnTableSelectionChanged();
+}
diff --git a/tools/ViewControl/ViewControl_Table.hxx b/tools/ViewControl/ViewControl_Table.hxx
new file mode 100644 (file)
index 0000000..c4f93f2
--- /dev/null
@@ -0,0 +1,99 @@
+// 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 ViewControl_Table_H
+#define ViewControl_Table_H
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+#include <inspector/ViewControl_TableProperty.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QItemSelection>
+#include <QObject>
+#include <QTableView>
+#include <Standard_WarningsRestore.hxx>
+
+class ViewControl_TableModelValues;
+
+class QAbstractTableModel;
+class QContextMenuEvent;
+class QWidget;
+
+//! \class ViewControl_Table
+//! \brief View to display table values with possibility to change table columns
+//! if the table has 1D dimension and Horizontal orientation
+class ViewControl_Table : public QObject
+{
+  Q_OBJECT
+public:
+
+  //! Constructor
+  Standard_EXPORT ViewControl_Table (QWidget* theParent);
+
+  //! Destructor
+  virtual ~ViewControl_Table() Standard_OVERRIDE {}
+
+  //! Set model into table view, init selection model by the given model, connect to selection change
+  //! \param theModel table values model
+  void SetModel (QAbstractTableModel* theModel);
+
+  //! Fills table view and table size control by the model
+  //! \param theModel values model
+  Standard_EXPORT void Init (ViewControl_TableModelValues* theModelValues);
+
+  //! Sets the table active and show the table
+  //! \param theState boolean value
+  void SetActive (const bool theState) { myIsActive = theState; GetTableView()->setVisible (theState); }
+
+  //!< true if the table is used in property view and visible
+  bool IsActive() const { return myIsActive; }
+
+  //! \return the text edit control
+  QWidget* GetControl() const { return myMainWidget; }
+
+  //! \return the table view
+  QTableView* GetTableView() const { return myTableView; }
+
+  //! Returns instance of table property control
+  //! \return property
+  ViewControl_TableProperty* GetProperty() const { return myProperty; }
+
+  //! Retuns model indices of the selected cells in table view
+  //! \param theSelectedIndices [out] a container of indices: row to list of columns
+  Standard_EXPORT void GetSelectedIndices (QMap<int, QList<int>>& aSelectedIndices);
+
+  //! Returns text of separation row in table
+  //! \return string value
+  static QString SeparatorData() { return "---------------------------"; }
+
+protected slots:
+
+  //! Updates controls by selection change in table view
+  //! \param theSelected container of selected table cells
+  //! \param theDeselected container of selected table cells
+  void onTableSelectionChanged(const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+private:
+  bool myIsActive; //!< true if the table is used in property view and visible
+
+  QWidget* myMainWidget; //!< parent of all controls
+  bool myIsUseProperty; //!< boolean value whether the property control should be shown/hidden
+  QTableView* myTableView; //!< table view
+
+  ViewControl_TableProperty* myProperty; //!< modifier of the table visual properties
+};
+#endif
diff --git a/tools/ViewControl/ViewControl_TableItemDelegate.cxx b/tools/ViewControl/ViewControl_TableItemDelegate.cxx
new file mode 100644 (file)
index 0000000..ba7558e
--- /dev/null
@@ -0,0 +1,204 @@
+// Created on: 2018-08-09
+// 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/ViewControl_TableItemDelegate.hxx>
+#include <inspector/ViewControl_ColorSelector.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+#include <inspector/ViewControl_EditType.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QFont>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QDoubleValidator>
+#include <QLineEdit>
+#include <QSpinBox>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+ViewControl_TableItemDelegate::ViewControl_TableItemDelegate (QObject* theParent)
+ : QItemDelegate (theParent), myModelValues (0)
+{
+}
+
+// =======================================================================
+// function : createEditor
+// purpose :
+// =======================================================================
+
+QWidget* ViewControl_TableItemDelegate::createEditor (QWidget* theParent,
+                                                      const QStyleOptionViewItem&,
+                                                      const QModelIndex& theIndex) const
+{
+  if (!myModelValues)
+    return 0;
+
+  int aRow, aColumn;
+  myModelValues->GetSourcePosition (theIndex.row(), theIndex.column(), aRow, aColumn);
+  ViewControl_EditType anEditType = myModelValues->GetEditType (aRow, aColumn);
+
+  QWidget* anEditor = createEditorControl (theParent, anEditType);
+  initEditorParameters (anEditor, anEditType, myModelValues, aRow, aColumn);
+  return anEditor;
+}
+
+// =======================================================================
+// function : setEditorData
+// purpose :
+// =======================================================================
+
+void ViewControl_TableItemDelegate::setEditorData (QWidget* theEditor, const QModelIndex& theIndex) const
+{
+  if (!myModelValues)
+    return;
+
+  int aRow, aColumn;
+  myModelValues->GetSourcePosition (theIndex.row(), theIndex.column(), aRow, aColumn);
+  ViewControl_EditType anEditType = myModelValues->GetEditType (aRow, aColumn);
+
+  setEditorValue (theEditor, anEditType, theIndex.model()->data(theIndex));
+}
+
+// =======================================================================
+// function : setModelData
+// purpose :
+// =======================================================================
+
+void ViewControl_TableItemDelegate::setModelData (QWidget* theEditor, QAbstractItemModel* theModel,
+                                                  const QModelIndex& theIndex) const
+{
+  if (!myModelValues)
+    return;
+
+  int aRow, aColumn;
+  myModelValues->GetSourcePosition (theIndex.row(), theIndex.column(), aRow, aColumn);
+  ViewControl_EditType anEditType = myModelValues->GetEditType (aRow, aColumn);
+
+  theModel->setData (theIndex, getEditorValue (theEditor, anEditType));
+}
+
+// =======================================================================
+// function : createEditorControl
+// purpose :
+// =======================================================================
+
+QWidget* ViewControl_TableItemDelegate::createEditorControl (QWidget* theParent, const ViewControl_EditType theEditType)
+{
+  switch (theEditType)
+  {
+    case ViewControl_EditType_None: return 0;
+    case ViewControl_EditType_Bool: return new QComboBox (theParent);
+    case ViewControl_EditType_Color: return new ViewControl_ColorSelector (theParent);
+    case ViewControl_EditType_Combo: return new QComboBox (theParent);
+    case ViewControl_EditType_Double:
+    {
+      QLineEdit* aLineEdit = new QLineEdit (theParent);
+      aLineEdit->setValidator (new QDoubleValidator (theParent));
+      return aLineEdit;
+    }
+    case ViewControl_EditType_Line: return new QLineEdit (theParent);
+    case ViewControl_EditType_Spin: return new QSpinBox (theParent);
+
+    default: return 0;
+  }
+}
+
+// =======================================================================
+// function : initEditorParameters
+// purpose :
+// =======================================================================
+
+void ViewControl_TableItemDelegate::initEditorParameters (QWidget* theEditor,
+                                                          const ViewControl_EditType theEditType,
+                                                          ViewControl_TableModelValues* theModelValues,
+                                                          const int theRow, const int theColumn)
+{
+  switch (theEditType)
+  {
+    case ViewControl_EditType_Bool:
+    {
+      (qobject_cast<QComboBox*> (theEditor))->insertItem(0, "true");
+      (qobject_cast<QComboBox*> (theEditor))->insertItem(1, "false");
+      break;
+    }
+    case ViewControl_EditType_Combo:
+    {
+      QList<QVariant> aValues = theModelValues->GetEnumValues (theRow, theColumn);
+      for (int aValuesId = 0; aValuesId < aValues.size(); aValuesId++)
+        (qobject_cast<QComboBox*> (theEditor))->insertItem(aValuesId, aValues[aValuesId].toString());
+    }
+    break;
+    case ViewControl_EditType_Double:
+    {
+      QList<QVariant> aValues = theModelValues->GetEnumValues (theRow, theColumn);
+      if (aValues.size() < 3)
+        break;
+
+      QDoubleValidator* aValidator = (QDoubleValidator*)(qobject_cast<QLineEdit*> (theEditor))->validator();
+      aValidator->setBottom (aValues[0].toDouble());
+      aValidator->setTop (aValues[1].toDouble());
+      aValidator->setDecimals (aValues[2].toInt());
+      break;
+    }
+    default: break;
+  }
+}
+
+// =======================================================================
+// function : setEditorValue
+// purpose :
+// =======================================================================
+
+void ViewControl_TableItemDelegate::setEditorValue (QWidget* theEditor, const ViewControl_EditType theEditType,
+                                                    const QVariant& theValue)
+{
+  switch (theEditType)
+  {
+    case ViewControl_EditType_None: break;
+    case ViewControl_EditType_Bool: (qobject_cast<QComboBox*>(theEditor))->setCurrentIndex (theValue.toBool() ? 0 : 1); break;
+    case ViewControl_EditType_Color: (qobject_cast<ViewControl_ColorSelector*>(theEditor))->SetColor (theValue.toString()); break;
+    case ViewControl_EditType_Combo: (qobject_cast<QComboBox*>(theEditor))->setCurrentText (theValue.toString()); break;
+    case ViewControl_EditType_Double:
+    case ViewControl_EditType_Line: (qobject_cast<QLineEdit*>(theEditor))->setText (theValue.toString()); break;
+    case ViewControl_EditType_Spin: (qobject_cast<QSpinBox*>(theEditor))->setValue (theValue.toInt()); break;
+
+    default: break;
+  }
+}
+
+// =======================================================================
+// function : getEditorValue
+// purpose :
+// =======================================================================
+
+QVariant ViewControl_TableItemDelegate::getEditorValue (QWidget* theEditor, const ViewControl_EditType theEditType)
+{
+  switch (theEditType)
+  {
+    case ViewControl_EditType_None: return QVariant();
+    case ViewControl_EditType_Bool: return (qobject_cast<QComboBox*>(theEditor))->currentIndex() == 0 ? true : false;
+    case ViewControl_EditType_Color: return (qobject_cast<ViewControl_ColorSelector*>(theEditor))->GetColor();
+    case ViewControl_EditType_Combo: return (qobject_cast<QComboBox*>(theEditor))->currentText();
+    case ViewControl_EditType_Double:
+    case ViewControl_EditType_Line: return (qobject_cast<QLineEdit*>(theEditor))->text();
+    case ViewControl_EditType_Spin: return (qobject_cast<QSpinBox*>(theEditor))->value();
+
+    default: return QVariant();
+  }
+}
diff --git a/tools/ViewControl/ViewControl_TableItemDelegate.hxx b/tools/ViewControl/ViewControl_TableItemDelegate.hxx
new file mode 100644 (file)
index 0000000..79d83bf
--- /dev/null
@@ -0,0 +1,96 @@
+// Created on: 2018-08-09
+// 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 ViewControl_TableItemDelegate_H
+#define ViewControl_TableItemDelegate_H
+
+#include <Standard_Macro.hxx>
+#include <inspector/ViewControl_EditType.hxx>
+
+#include <QItemDelegate>
+
+class ViewControl_TableModelValues;
+
+//! \class ViewControl_TableItemDelegate
+//! \brief This is an implementation for ViewControl_TableModel to present AIS_InteractiveContext object
+class ViewControl_TableItemDelegate : public QItemDelegate
+{
+public:
+
+  //! Constructor
+  //! \param theParent parent object
+  Standard_EXPORT ViewControl_TableItemDelegate (QObject* theParent = 0);
+
+  //! Destructor
+  virtual ~ViewControl_TableItemDelegate() Standard_OVERRIDE {}
+
+  //! Sets table model values
+  //! \param theModelValues instance of model values
+  void SetModelValues (ViewControl_TableModelValues* theModelValues) { myModelValues = theModelValues; }
+
+  //! Creates widget editor: spin box, combo box or line edit
+  //! \param theParent parent widget
+  //! \param theOption style option
+  //! \param theIndex index of requested widget
+  virtual QWidget* createEditor (QWidget* theParent, const QStyleOptionViewItem& theOption,
+                                 const QModelIndex& theIndex) const Standard_OVERRIDE;
+
+  //! Sets the data to be displayed and edited by the editor from the data model item specified by the model index
+  //! \param theEditor editor to be filled
+  //! \param theIndex index of requested widget, contains information about model
+  virtual void setEditorData (QWidget* theEditor, const QModelIndex& theIndex) const Standard_OVERRIDE;
+
+  //! Gets data from the editor widget and stores it in the specified model at the item index.
+  //! \param theEditor editor to be filled
+  //! \param theModel data model
+  //! \param theIndex index of requested widget, contains information about model
+  virtual void setModelData (QWidget* theEditor, QAbstractItemModel* theModel,
+                             const QModelIndex& theIndex) const Standard_OVERRIDE;
+
+private:
+  //! Creates an editor
+  //! \param theParent parent widget
+  //! \param theEditType edition control type
+  //! \return edit control
+  static QWidget* createEditorControl (QWidget* theParent, const ViewControl_EditType theEditType);
+
+  //! Inits an editor by model values parameters
+  //! \param theEditor editor
+  //! \param theEditType edition control type
+  //! \param theModelValues custom implementation to provide parameters
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \return edit control
+  static void initEditorParameters (QWidget* theEditor, const ViewControl_EditType theEditType,
+                                    ViewControl_TableModelValues* theModelValues,
+                                    const int theRow, const int theColumn);
+
+  //! Sets editor value
+  //! \param theEditor editor
+  //! \param theEditType editor typ
+  //! \param theValue new value
+  static void setEditorValue (QWidget* theEditor, const ViewControl_EditType theEditType, const QVariant& theValue);
+
+  //! Returns value of spin box editor
+  //! \param theEditor editor
+  //! \param theEditType editor typ
+  //! \return current value
+  static QVariant getEditorValue (QWidget* theEditor, const ViewControl_EditType theEditType);
+
+private:
+  ViewControl_TableModelValues* myModelValues; //!< table model values
+};
+
+#endif
diff --git a/tools/ViewControl/ViewControl_TableModel.cxx b/tools/ViewControl/ViewControl_TableModel.cxx
new file mode 100644 (file)
index 0000000..511d39f
--- /dev/null
@@ -0,0 +1,99 @@
+// 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/ViewControl_TableModel.hxx>
+
+// =======================================================================
+// function : SetModelValues
+// purpose :
+// =======================================================================
+void ViewControl_TableModel::SetModelValues (ViewControl_TableModelValues* theModelValues)
+{
+  if (myModelValues)
+    delete myModelValues;
+
+  myModelValues = theModelValues;
+  SetFilter(0);
+}
+
+// =======================================================================
+// function : columnCount
+// purpose :
+// =======================================================================
+int ViewControl_TableModel::columnCount(const QModelIndex& theParent) const
+{
+  if (!myModelValues)
+    return 0;
+
+  int aColumnCount = myModelValues->ColumnCount (theParent);
+  return isFilterActive() ? myFilter->ColumnCount (aColumnCount) : aColumnCount;
+}
+
+// =======================================================================
+// function : rowCount
+// purpose :
+// =======================================================================
+int ViewControl_TableModel::rowCount(const QModelIndex& theParent ) const
+{
+  if (!myModelValues)
+    return 0;
+
+  return isFilterActive() ? myFilter->RowCount (myModelValues->ColumnCount (theParent))
+                          : myModelValues->RowCount (theParent);
+}
+
+// =======================================================================
+// function : data
+// purpose :
+// =======================================================================
+QVariant ViewControl_TableModel::data (const QModelIndex& theIndex, int theRole) const
+{
+  if (!myModelValues)
+    return QVariant();
+
+  int aRow = theIndex.row(), aColumn = theIndex.column();
+  if (isFilterActive())
+    myFilter->GetSourcePosition (theIndex, aRow, aColumn);
+
+  return myModelValues->Data (aRow, aColumn, theRole);
+}
+
+// =======================================================================
+// function : setData
+// purpose :
+// =======================================================================
+bool ViewControl_TableModel::setData (const QModelIndex& theIndex, const QVariant& theValue, int theRole)
+{
+  if (!myModelValues)
+    return false;
+
+  int aRow = theIndex.row(), aColumn = theIndex.column();
+  if (isFilterActive())
+    myFilter->GetSourcePosition (theIndex, aRow, aColumn);
+
+  return myModelValues->SetData (aRow, aColumn, theValue, theRole);
+}
+
+// =======================================================================
+// function : GetSourcePosition
+// purpose :
+// =======================================================================
+void ViewControl_TableModel::GetSourcePosition (const QModelIndex& theIndex, int& theRow, int& theColumn)
+{
+  if (isFilterActive())
+    myFilter->GetSourcePosition (theIndex, theRow, theColumn);
+  else
+    myModelValues->GetSourcePosition (theIndex.row(), theIndex.column(), theRow, theColumn);
+}
diff --git a/tools/ViewControl/ViewControl_TableModel.hxx b/tools/ViewControl/ViewControl_TableModel.hxx
new file mode 100644 (file)
index 0000000..aff5e39
--- /dev/null
@@ -0,0 +1,117 @@
+// 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 ViewControl_TableModel_H
+#define ViewControl_TableModel_H
+
+#include <Standard.hxx>
+
+#include <inspector/ViewControl_TableModelFilter.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QAbstractTableModel>
+#include <QList>
+#include <QVariant>
+#include <Standard_WarningsRestore.hxx>
+
+#include <vector>
+
+//! \class ViewControl_TableModel
+//! \brief This is an extension of table model to visualize a container of values
+//! It is possible to:
+//! - set orientation to interpretate the values.
+//! - set table view header values.
+//! Items of the view are enabled and selectable.
+class ViewControl_TableModel : public QAbstractTableModel
+{
+public:
+
+  //! Constructor
+  ViewControl_TableModel (QObject* theParent = 0) : myModelValues (0), myFilter (0) { (void)theParent; }
+
+  //! Destructor
+  virtual ~ViewControl_TableModel() {}
+
+  //! Sets interface to table values
+  //! \theModelValues instance of values
+  Standard_EXPORT void SetModelValues (ViewControl_TableModelValues* theModelValues);
+
+  //! Returns instance of interface for access totable values
+  //! \return interface or NULL
+  ViewControl_TableModelValues* GetModelValues() const { return myModelValues; }
+
+  //! Sets table values filter to rearrange values presentation
+  //! \param filter instance
+  void SetFilter (ViewControl_TableModelFilter* theFilter) { myFilter = theFilter; }
+
+  //! Emits the layoutChanged signal from outside of this class
+  void EmitLayoutChanged() { emit layoutChanged(); }
+
+  //! Returns number of columns, depending on orientation: myColumnCount or size of values container
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  Standard_EXPORT virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE;
+
+  //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  Standard_EXPORT virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE;
+
+  //! 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
+  Standard_EXPORT virtual QVariant data (const QModelIndex& theIndex, int theRole = Qt::DisplayRole) const Standard_OVERRIDE;
+
+  //! Sets the new value of passed role to tree cell.
+  //! \param[in] index refers to item in tree.
+  //! \param[in] value the new value.
+  //! \param[in] role the role of value.
+  Standard_EXPORT virtual bool setData (const QModelIndex& theIndex, const QVariant& theValue, int theRole) Standard_OVERRIDE;
+
+  //! Returns content of the model index for the given role, it is obtainer from internal container of header values
+  //! It returns value only for DisplayRole.
+  //! \param theSection an index of value in the container 
+  //! \param theIndex a model index
+  //! \param theRole a view role
+  //! \return value intepreted depending on the given role
+  virtual QVariant headerData (int theSection, Qt::Orientation theOrientation, int theRole = Qt::DisplayRole) const Standard_OVERRIDE
+  { return myModelValues ? myModelValues->HeaderData (theSection, theOrientation, theRole) : QVariant(); }
+
+  //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable
+  //! \param theIndex a model index
+  //! \return flags
+  Qt::ItemFlags flags (const QModelIndex& theIndex) const
+  { return myModelValues ? myModelValues->Flags (theIndex) : Qt::NoItemFlags; }
+
+  //! Returns source row and column values peforming conversion back from filter
+  //! \param theIndex a model index
+  //! \param theRow a model row
+  //! \param theColumn a model column
+  Standard_EXPORT void GetSourcePosition (const QModelIndex& theIndex, int& theRow, int& theColumn);
+
+protected:
+  //! Returns true if the filter is not NULL and active
+  //! \return true if active
+  Standard_Boolean isFilterActive() const { return myFilter && myFilter->IsActive(); }
+
+private:
+  ViewControl_TableModelValues* myModelValues; //! interface to table values
+  ViewControl_TableModelFilter* myFilter; //! filter of values
+};
+
+#endif
diff --git a/tools/ViewControl/ViewControl_TableModelFilter.cxx b/tools/ViewControl/ViewControl_TableModelFilter.cxx
new file mode 100644 (file)
index 0000000..3389147
--- /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. 
+
+#include <inspector/ViewControl_TableModelFilter.hxx>
+
+// =======================================================================
+// function : ColumnCount
+// purpose :
+// =======================================================================
+
+int ViewControl_TableModelFilter::ColumnCount (const int theSourceColumnCount) const
+{
+  return myColumnCount <= 0 ? theSourceColumnCount : myColumnCount;
+}
+
+// =======================================================================
+// function : RowCount
+// purpose :
+// =======================================================================
+
+int ViewControl_TableModelFilter::RowCount (const int theSourceColumnCount) const
+{
+  if (myColumnCount <= 0)
+    return 1;
+
+  int aRows = (int) (theSourceColumnCount / myColumnCount);
+  if (myColumnCount > 0 && aRows * myColumnCount < theSourceColumnCount)
+    aRows++; /// row with left values, not fully filled
+
+  return aRows;
+}
+
+// =======================================================================
+// function : GetSourcePosition
+// purpose :
+// =======================================================================
+
+void ViewControl_TableModelFilter::GetSourcePosition (const QModelIndex& theIndex, int& theRow, int& theColumn) const
+{
+  GetSourcePosition (theIndex.row(), theIndex.column(), theRow, theColumn);
+}
+
+// =======================================================================
+// function : GetSourcePosition
+// purpose :
+// =======================================================================
+
+void ViewControl_TableModelFilter::GetSourcePosition (const int theSourceRow, const int theSourceColumn, int& theRow,
+                                                      int& theColumn) const
+{
+  theRow = 0;
+  theColumn = myColumnCount * theSourceRow + theSourceColumn;
+}
diff --git a/tools/ViewControl/ViewControl_TableModelFilter.hxx b/tools/ViewControl/ViewControl_TableModelFilter.hxx
new file mode 100644 (file)
index 0000000..3e3adc0
--- /dev/null
@@ -0,0 +1,76 @@
+// 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 ViewControl_TableModelFilter_H
+#define ViewControl_TableModelFilter_H
+
+#include <Standard.hxx>
+
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+//! \class ViewControl_TableModelFilter
+//! \brief It provides separation of 1D container of values in 2D presentation depending on number of column value
+class ViewControl_TableModelFilter
+{
+public:
+
+  //! Constructor
+  Standard_EXPORT ViewControl_TableModelFilter(const Standard_Integer theColumnCount = -1)
+    : myIsActive (Standard_True), myColumnCount (theColumnCount) {}
+
+  //! Destructor
+  virtual ~ViewControl_TableModelFilter() {}
+
+  //! Activate/Deactivate filter
+  //! \param theActive state is the filter to be active or not
+  virtual void SetActive (const Standard_Boolean theActive) { myIsActive = theActive; }
+
+  //! Returns boolean state whether the filter is activated
+  //! \return true if active
+  virtual Standard_Boolean IsActive() const { return myIsActive; }
+
+  //! Sets number of columns
+  //! \param theColumnCount a column count
+  void SetColumnCount (const int theColumnCount) { myColumnCount = theColumnCount; }
+
+  //! Returns number of columns: parameter value
+  //! \param theSourceColumnCount number of columns in the source table
+  //! \return an integer value
+  Standard_EXPORT int ColumnCount (const int theSourceColumnCount) const;
+
+  //! Returns number of rows: whole number of columns is divided to the current column value
+  //! \param theSourceColumnCount number of columns in the source table
+  //! \return an integer value
+  Standard_EXPORT int RowCount (const int theSourceColumnCount) const;
+
+  //! Returns source row/column indices for the filtered model index
+  //! \param theIndex a model index
+  //! \param theRow [out] row number value
+  //! \param theColumn [out] column value
+  Standard_EXPORT void GetSourcePosition (const QModelIndex& theIndex, int& theRow, int& theColumn) const;
+
+  //! Returns source row/column indices for the filtered model index
+  //! \param theSourceRow model row index
+  //! \param theSourceColumn model column index
+  //! \param theRow [out] row number value
+  //! \param theColumn [out] column value
+  Standard_EXPORT void GetSourcePosition (const int theSourceRow, const int theSourceColumn, int& theRow, int& theColumn) const;
+
+private:
+  Standard_Boolean myIsActive; //!< active state of the filter
+  Standard_Integer myColumnCount; //!< number of table columns
+};
+
+#endif
diff --git a/tools/ViewControl/ViewControl_TableModelValues.cxx b/tools/ViewControl/ViewControl_TableModelValues.cxx
new file mode 100644 (file)
index 0000000..8ac5e59
--- /dev/null
@@ -0,0 +1,91 @@
+// 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/ViewControl_TableModelValues.hxx>
+
+#include <Standard_WarningsDisable.hxx>
+#include <QApplication>
+#include <QFont>
+#include <Standard_WarningsRestore.hxx>
+
+// =======================================================================
+// function : ColumnCount
+// purpose :
+// =======================================================================
+
+int ViewControl_TableModelValues::ColumnCount (const QModelIndex&) const
+{
+  Qt::Orientation anAdditionalOrientation = myOrientation == Qt::Vertical ? Qt::Horizontal : Qt::Vertical;
+  if (myHeaderValues[anAdditionalOrientation].size() > 0)
+    return myHeaderValues[anAdditionalOrientation].size();
+
+  return myValues.size();
+}
+
+// =======================================================================
+// function : Data
+// purpose :
+// =======================================================================
+
+QVariant ViewControl_TableModelValues::Data (const int theRow, const int theColumn, int theRole) const
+{
+  if (theRole == Qt::DisplayRole)
+    return myValues.at ((int)getPosition (theRow, theColumn));
+
+  if (theRole == Qt::TextAlignmentRole) // for multi-lines text, align it to the top
+    return Qt::AlignTop;
+
+  if ((theRole == Qt::FontRole || theRole == Qt::ForegroundRole) && isItalicHeader (theRow, theColumn))
+  {
+    if (theRole == Qt::FontRole)
+    {
+      QFont aFont = qApp->font();
+      aFont.setItalic (true);
+      return aFont;
+    }
+    else
+      QColor (Qt::darkGray).darker (150);
+  }
+  return QVariant();
+}
+
+// =======================================================================
+// function : HeaderData
+// purpose :
+// =======================================================================
+
+QVariant ViewControl_TableModelValues::HeaderData (int theSection, Qt::Orientation theOrientation, int theRole) const
+{
+  if (theRole == Qt::DisplayRole)
+    return myHeaderValues.contains (theOrientation) ? myHeaderValues[theOrientation][theSection].GetName()
+                                                    : QString::number (theSection + 1);
+  else if (theRole == Qt::ForegroundRole)
+    return QColor (Qt::darkGray);
+
+  return QVariant();
+}
+
+// =======================================================================
+// function : isItalicHeader
+// purpose :
+// =======================================================================
+
+bool ViewControl_TableModelValues::isItalicHeader (const int theRow, const int theColumn) const
+{
+  Qt::Orientation anOrientation = myOrientation == Qt::Vertical ? Qt::Horizontal : Qt::Vertical;
+  int aCell = anOrientation == Qt::Horizontal ? theColumn : theRow;
+
+  return GetHeaderItem (anOrientation, aCell).IsItalic();
+}
\ No newline at end of file
diff --git a/tools/ViewControl/ViewControl_TableModelValues.hxx b/tools/ViewControl/ViewControl_TableModelValues.hxx
new file mode 100644 (file)
index 0000000..c0d8ac5
--- /dev/null
@@ -0,0 +1,236 @@
+// 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 ViewControl_TableModelValues_H
+#define ViewControl_TableModelValues_H
+
+#include <Standard.hxx>
+
+#include <inspector/TreeModel_HeaderSection.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 QItemDelegate;
+
+//! \class ViewControl_TableModelValues
+//! \brief This is an interace for ViewControl_TableModel to give real values of the model
+//! It should be filled or redefined.
+class ViewControl_TableModelValues
+{
+public:
+
+  //! Constructor
+  Standard_EXPORT ViewControl_TableModelValues (const Qt::Orientation& theOrientation = Qt::Vertical)
+    : myUseTableProperties (false), myUseTableSeparateSize (true), myUseTablePropertiesXStep (false),
+      myUseTablePropertiesXStepValue (-1)
+  { SetOrientation (theOrientation); }
+
+  //! Destructor
+  virtual ~ViewControl_TableModelValues() {}
+
+  //! 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
+  void SetOrientation (const Qt::Orientation& theOrientation) { myOrientation = theOrientation; }
+
+  //! Fills the model values.
+  //! \param theValues a container of table model values
+  void SetValues (const QVector<QVariant>& theValues) { myValues = theValues; }
+
+  //! Fills the model header values for orientation.
+  //! \param theValues a container of header text values
+  //! \param theOrientation an orientation of header
+  void SetHeaderValues (const QList<TreeModel_HeaderSection>& theValues, const Qt::Orientation theOrientation)
+  { myHeaderValues.insert (theOrientation, theValues); }
+
+  //! Returns whether the column is hidden by default
+  //! \param theColumnId a column index
+  //! \return header section values container
+  TreeModel_HeaderSection GetHeaderItem (const Qt::Orientation theOrientation, const int theColumnId) const
+  { return myHeaderValues.contains(theOrientation) ? myHeaderValues[theOrientation][theColumnId] : TreeModel_HeaderSection(); }
+
+  //! Stores information about table view header visibility
+  //! \param theOrientation an orientation of header
+  //! \param theVisibility if true, header is visible
+  void SetHeaderVisible (const Qt::Orientation theOrientation, const bool theVisibility)
+  { myVisibleHeader.insert (theOrientation, theVisibility); }
+
+  //! Stores information about table view header visibility
+  //! \param theOrientation an orientation of header
+  //! \param theVisibility if true, header is visible
+  bool IsHeaderVisible (const Qt::Orientation theOrientation) const
+  { return myVisibleHeader.contains(theOrientation) ? myVisibleHeader[theOrientation] : true; }
+
+  //! Set default section size if defined
+  //! \param theOrientation an orientation of header
+  //! \param theVisibility if true, header is visible
+  void SetDefaultSectionSize (const Qt::Orientation theOrientation, const int& theSectionSize)
+  { myDefaultSectionSize.insert(theOrientation, theSectionSize); }
+
+  //! Get default section size if defined
+  //! \param theOrientation an orientation of header
+  //! \param theVisibility if true, header is visible
+  bool GetDefaultSectionSize (const Qt::Orientation theOrientation, int& theSectionSize)
+  {
+    theSectionSize = myDefaultSectionSize.contains (theOrientation) ? myDefaultSectionSize[theOrientation] : -1;
+    return myDefaultSectionSize.contains (theOrientation);
+  }
+
+  //! Stores whether the properties control of the table visible or not
+  //! \param theUseProperties boolean state
+  void SetUseTableProperties (const bool theUseProperties) { myUseTableProperties = theUseProperties; }
+
+  //! Returns true if the properties control of the table visible or not
+  //! \return boolean value
+  bool UseTableProperties() const { return myUseTableProperties; }
+
+  //! Stores whether the properties control of the table visible or not
+  //! \param theUseProperties boolean state
+  void SetUseTableSeparateSize (const bool theUseSize)
+  { myUseTableSeparateSize = theUseSize; }
+
+  //! Returns true if the properties control of the table visible or not
+  //! \return boolean value
+  bool UseTableSeparateSize() const
+  { return myUseTableSeparateSize; }
+
+  //! Stores whether the properties control of the table visible or not
+  //! \param theUseProperties boolean state
+  void SetUseTablePropertiesXStep (const bool theUseStep, const double theStep)
+  { myUseTablePropertiesXStep = theUseStep; myUseTablePropertiesXStepValue = theStep; }
+
+  //! Returns true if the properties control of the table visible or not
+  //! \return boolean value
+  double UseTablePropertiesXStep(bool& theUseStep) const
+  { theUseStep = myUseTablePropertiesXStep; return myUseTablePropertiesXStepValue; }
+
+  //! Returns number of columns, size of header values
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  Standard_EXPORT virtual int ColumnCount (const QModelIndex& theParent = QModelIndex()) const;
+
+  //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  virtual int RowCount (const QModelIndex& theParent = QModelIndex()) const
+  { return ColumnCount (theParent) > 0 ? GetValuesCount() / ColumnCount (theParent) : 0; }
+
+  //! 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 theRow a model index row
+  //! \param theColumn a model index column
+  //! \param theRole a view role
+  //! \return value intepreted depending on the given role
+  Standard_EXPORT virtual QVariant Data (const int theRow, const int theColumn, int theRole = Qt::DisplayRole) const;
+
+  //! Sets content of the model index for the given role, it is applyed 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)
+  { (void)theRow; (void)theColumn; (void)theValue; (void)theRole; return false; }
+
+  //! Returns content of the model index for the given role, it is obtainer from internal container of header values
+  //! It returns value only for DisplayRole.
+  //! \param theSection an index of value in the container 
+  //! \param theIndex a model index
+  //! \param theRole a view role
+  //! \return value intepreted depending on the given role
+  Standard_EXPORT virtual QVariant HeaderData (int theSection, Qt::Orientation theOrientation, int theRole = Qt::DisplayRole) const;
+
+  //! Returns flags for the item: ItemIsEnabled | Qt::ItemIsSelectable
+  //! \param theIndex a model index
+  //! \return flags
+  virtual Qt::ItemFlags Flags (const QModelIndex& theIndex) const
+  { return theIndex.isValid() ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags; }
+
+  //! Returns minimum and maximum values of the table content
+  //! \param theMinValue minimum
+  //! \param theMaxValue maximum
+  virtual void GetRangeValues (QString& theMinValue, QString& theMaxValue, const QModelIndexList& theSelected) const
+  { (void)theMinValue; (void)theMaxValue; (void)theSelected; }
+
+  //! Returns additional info
+  virtual QString AdditionalInformation() const { return QString(); }
+
+  //! Returns number of rows, depending on orientation: myColumnCount or size of values container
+  //! \param theParent an index of the parent item
+  //! \return an integer value
+  virtual int GetValuesCount () const { return myValues.size(); }
+
+  //! Returns source row/column indices for the filtered model index for the given role
+  //! \param theSourceRow model row index
+  //! \param theSourceColumn model column index
+  //! \param theRow [out] row number value
+  //! \param theColumn [out] column value
+  Standard_EXPORT virtual void GetSourcePosition (const int theSourceRow, const int theSourceColumn, int& theRow, int& theColumn) const
+  { theRow = theSourceRow; theColumn = theSourceColumn; }
+
+  //! Returns item delegate to provide cell editors. By default, it is empty
+  //! \return delegate
+  virtual QItemDelegate* GetItemDelegate() { return 0; }
+
+  //! 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
+  virtual ViewControl_EditType GetEditType (const int theRow, const int theColumn) const
+  { (void)theRow; (void)theColumn; return ViewControl_EditType_None; }
+
+  //! Returns container of string values for enumeration in the model row
+  //! \param theRow table model row index
+  //! \param theColumn a model index column
+  //! \return string values for the enumeration presented in the row or an empty container
+  virtual QList<QVariant> GetEnumValues (const int theRow, const int theColumn) const
+  { (void)theRow; (void)theColumn; return QList<QVariant>(); }
+
+  //! Returns default color for editable cell
+  //! \return color value
+  static QColor EditCellColor() { return QColor (Qt::darkBlue); }
+
+protected:
+  //! Finds position in internal vector of values using the table column/row count
+  //! \param theRow a row of a table cell
+  //! \param theColumn a column of a table cell
+  size_t getPosition (const int theRow, const int theColumn) const { return ColumnCount() * theRow + theColumn; }
+
+  //! Returns true if the header item is italic of the parameter index
+  //! \param theRow a model index row
+  //! \param theColumn a model index column
+  //! \param boolean value
+  bool isItalicHeader (const int theRow, const int theColumn) const;
+
+protected:
+
+  Qt::Orientation myOrientation; //!< orientation how the values should fill the current table view
+  QMap<Qt::Orientation, QList<TreeModel_HeaderSection> > myHeaderValues; //!< table header values
+  QMap<Qt::Orientation, bool> myVisibleHeader; //! table header visibility
+  QMap<Qt::Orientation, int> myDefaultSectionSize; //! table section default size
+  QVector<QVariant> myValues; //! cached container of table values
+  bool myUseTableProperties; //! state whether the table property control is visible
+  bool myUseTableSeparateSize; //! state whether table custom column size is possible
+  bool myUseTablePropertiesXStep; //! true if XStep value is used
+  double myUseTablePropertiesXStepValue; //! value to define OX step for 1D table, Z = 0
+};
+
+#endif
diff --git a/tools/ViewControl/ViewControl_TableProperty.cxx b/tools/ViewControl/ViewControl_TableProperty.cxx
new file mode 100644 (file)
index 0000000..e3c3a08
--- /dev/null
@@ -0,0 +1,224 @@
+// 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/ViewControl_TableProperty.hxx>
+#include <inspector/ViewControl_Table.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
+#include <inspector/ViewControl_TableModelFilter.hxx>
+#include <inspector/ViewControl_TableModelValues.hxx>
+
+#include <inspector/TreeModel_Tools.hxx>
+
+#include <QAbstractItemModel>
+#include <QAction>
+#include <QGridLayout>
+#include <QHeaderView>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMenu>
+#include <QPlainTextEdit>
+#include <QPushButton>
+#include <QSpinBox>
+#include <QTableView>
+#include <QWidget>
+
+#include <limits>
+
+const int DEFAULT_COLUMN_WIDTH = 60;
+
+// =======================================================================
+// function : Constructor
+// purpose :
+// =======================================================================
+
+ViewControl_TableProperty::ViewControl_TableProperty (QWidget* theParent, ViewControl_Table* theTable)
+: QObject (theParent), myTable (theTable), myIsActive (false)
+{
+  myFilter = new ViewControl_TableModelFilter();
+
+  myMainWidget = new QWidget (theParent);
+  QGridLayout* aMainLayout = new QGridLayout (myMainWidget);
+
+  QWidget* aProperties = new QWidget (myMainWidget);
+  aMainLayout->addWidget (aProperties);
+  QHBoxLayout* aPropertiesLayout = new QHBoxLayout (aProperties);
+  aPropertiesLayout->setContentsMargins (0, 0, 0, 0);
+
+  mySize = new QLabel ("", myMainWidget);
+  myDivideSize = new QLabel("Divide:", myMainWidget);
+  mySeparateSize = new QSpinBox (myMainWidget);
+  mySeparateSize->setRange (0, 100000);
+  myVisualizedSize = new QLabel ("", myMainWidget);
+
+  aPropertiesLayout->addWidget (mySize);
+  aPropertiesLayout->addWidget (myDivideSize);
+  aPropertiesLayout->addWidget (mySeparateSize);
+  aPropertiesLayout->addWidget (myVisualizedSize);
+
+  myXStepLabel = new QLabel ("XStep:");
+  myXStep = new QDoubleSpinBox (myMainWidget);
+  myXStep->setRange(1.e-12, 1.e+7);
+  myXStep->setDecimals (8);
+  myXStep->setValue(1.);
+
+  setXStepActive (false);
+
+  connect (myXStep, SIGNAL(editingFinished()), this, SIGNAL (propertyChanged()));
+
+  aPropertiesLayout->addWidget (myXStepLabel);
+  aPropertiesLayout->addWidget (myXStep);
+
+  myInformationWidget = new QWidget (theParent);
+  QGridLayout* anInfoLayout = new QGridLayout (myInformationWidget);
+
+  myModelInformation = new QPlainTextEdit (myInformationWidget);
+  myModelInformation->setVisible (false);
+  anInfoLayout->addWidget (myModelInformation, 2, 0, 1, 4);
+
+  myMinValue = new QPushButton ("Min", myInformationWidget);
+  myMaxValue = new QPushButton ("Max", myInformationWidget);
+  myMinSelectedValue = new QPushButton ("Min of selected", myInformationWidget);
+  myMaxSelectedValue = new QPushButton ("Max of selected", myInformationWidget);
+
+  anInfoLayout->addWidget (myMinValue, 3, 0);
+  anInfoLayout->addWidget (myMinSelectedValue, 3, 1);
+  anInfoLayout->addWidget (myMaxValue, 4, 0);
+  anInfoLayout->addWidget (myMaxSelectedValue, 4, 1);
+
+  connect (mySeparateSize, SIGNAL (valueChanged (int)),
+           this, SLOT (onSeparateSizeChanged (int)));
+}
+
+// =======================================================================
+// function : Init
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::Init()
+{
+  ViewControl_TableModel* aViewModel = dynamic_cast<ViewControl_TableModel*>(myTable->GetTableView()->model());
+  ViewControl_TableModelValues* aModelValues = aViewModel->GetModelValues();
+
+  bool aUseXStep;
+  double aXStep = aModelValues->UseTablePropertiesXStep (aUseXStep);
+  setXStepActive (aUseXStep, aXStep);
+
+  QString aMinValue = QString::number (DBL_MIN), aMaxValue = QString::number (DBL_MAX);
+  aModelValues->GetRangeValues (aMinValue, aMaxValue, QModelIndexList());
+  QString anInfo = aModelValues->AdditionalInformation();
+
+  bool aUseSeparateSize = aModelValues->UseTableSeparateSize();
+  mySize->setVisible (aUseSeparateSize);
+  myDivideSize->setVisible (aUseSeparateSize);
+  mySeparateSize->setVisible (aUseSeparateSize);
+  myVisualizedSize->setVisible (aUseSeparateSize);
+  myFilter->SetActive (aUseSeparateSize);
+  if (aUseSeparateSize && mySeparateSize->value() != 0)
+    myFilter->SetColumnCount(mySeparateSize->value());
+  
+  mySize->setText (QString("[ %1, %2 ]").arg (aViewModel->rowCount()).arg (aViewModel->columnCount()));
+
+  myVisualizedSize->setText (mySize->text());
+  myVisualizedSize->setToolTip (QString ("sqrt: (%1, %2)").arg (sqrt (aViewModel->rowCount())).arg (sqrt (aViewModel->columnCount())));
+  myModelInformation->setVisible(!anInfo.isEmpty());
+  if (!anInfo.isEmpty())
+    myModelInformation->setPlainText (anInfo);
+
+  myMinValue->setText (QString ("Min: ") + aMinValue);
+  myMaxValue->setText (QString ("Max: ") + aMaxValue);
+  myMinSelectedValue->setText (QString("Min of selected: ") + QString::number(0));
+  myMaxSelectedValue->setText (QString("Max of selected: ") + QString::number(0));
+}
+
+// =======================================================================
+// function : SetActive
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::SetActive (const bool theActive)
+{
+  GetControl()->setVisible (theActive);
+  GetInformationControl()->setVisible (theActive);
+
+  ViewControl_TableModel* aModel = dynamic_cast<ViewControl_TableModel*> (myTable->GetTableView()->model());
+  aModel->SetFilter (theActive ? GetFilter() : 0);
+}
+
+// =======================================================================
+// function : onSeparateSizeChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::onSeparateSizeChanged (int theValue)
+{
+  myFilter->SetColumnCount(theValue);
+
+  myTable->GetTableView()->selectionModel()->clearSelection();
+
+  ViewControl_TableModel* aViewModel = dynamic_cast<ViewControl_TableModel*>(myTable->GetTableView()->model());
+  aViewModel->EmitLayoutChanged();
+
+  myVisualizedSize->setText (QString ("[ %1, %2 ]").arg (aViewModel->rowCount()).arg (aViewModel->columnCount()));
+}
+
+// =======================================================================
+// function : onToleranceSizeChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::onToleranceSizeChanged (int theValue)
+{
+  (void)theValue;
+}
+
+// =======================================================================
+// function : onSeparateSizeChanged
+// purpose :
+// =======================================================================
+
+void ViewControl_TableProperty::UpdateOnTableSelectionChanged()
+{
+  QModelIndexList aSelected = myTable->GetTableView()->selectionModel()->selectedIndexes();
+  if (aSelected.isEmpty())
+  {
+    myMinSelectedValue->setText(QString("Min of selected:") + QString::number(0));
+    myMaxSelectedValue->setText(QString("Max of selected:") + QString::number(0));
+    return;
+  }
+
+  ViewControl_TableModel* aViewModel = dynamic_cast<ViewControl_TableModel*>(myTable->GetTableView()->model());
+  ViewControl_TableModelValues* aModelValues = aViewModel->GetModelValues();
+
+  QString aMinValue = QString::number (DBL_MIN), aMaxValue = QString::number (DBL_MAX);
+  aModelValues->GetRangeValues (aMinValue, aMaxValue, aSelected);
+
+  myMinSelectedValue->setText (QString ("Min of selected:") + aMinValue);
+  myMaxSelectedValue->setText (QString ("Max of selected:") + aMaxValue);
+}
+
+// =======================================================================
+// function : createAction
+// purpose :
+// =======================================================================
+void ViewControl_TableProperty::setXStepActive (const bool theState, const double theValue)
+{
+  myXStepActive = theState;
+
+  myXStepLabel->setVisible (myXStepActive);
+  myXStep->setVisible (myXStepActive);
+
+  if (theValue > 0)
+    myXStep->setValue (theValue);
+}
diff --git a/tools/ViewControl/ViewControl_TableProperty.hxx b/tools/ViewControl/ViewControl_TableProperty.hxx
new file mode 100644 (file)
index 0000000..fbfa98c
--- /dev/null
@@ -0,0 +1,141 @@
+// 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 ViewControl_TableProperty_H
+#define ViewControl_TableProperty_H
+
+#include <Standard.hxx>
+#include <Standard_Macro.hxx>
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4127) // conditional expression is constant
+#endif
+
+#include <QDoubleSpinBox>
+#include <QObject>
+#include <QSpinBox>
+
+class ViewControl_Table;
+class ViewControl_TableModelFilter;
+
+class QContextMenuEvent;
+class QLabel;
+class QItemSelection;
+class QPlainTextEdit;
+class QPushButton;
+class QSpinBox;
+class QWidget;
+
+//! \class ViewControl_TableProperty
+//! \brief View to display table values with possibility to change table columns
+//! if the table has 1D dimension and Horizontal orientation
+class ViewControl_TableProperty : public QObject
+{
+  Q_OBJECT
+public:
+
+  //! Constructor
+  Standard_EXPORT ViewControl_TableProperty (QWidget* theParent, ViewControl_Table* theTable);
+
+  //! Destructor
+  virtual ~ViewControl_TableProperty() Standard_OVERRIDE {}
+
+  //! Fills table view and table size control by the model
+  Standard_EXPORT void Init();
+
+  //! Sets whether the properties pane is visible or not
+  //! \param theUseProperty boolean state
+  Standard_EXPORT void SetActive (const bool theActive);
+
+  //! Returns main control
+  //! \return widget
+  QWidget* GetControl() const { return myMainWidget; }
+
+  //! Returns information control
+  //! \return widget
+  QWidget* GetInformationControl() { return myInformationWidget; }
+
+  //! Returns table values filter to apply separation size
+  //! \return filter instance
+  ViewControl_TableModelFilter* GetFilter() { return myFilter; }
+
+  //! Returns X step or -1 if it is not used
+  //! \return double value
+  double GetXStep() const { return myXStepActive ? myXStep->value() : -1;};
+
+  //! Sets X step
+  //! \param theValue value
+  void SetXStep(const double theValue) const { myXStep->setValue (theValue); };
+
+  //! Returns divide valid
+  //! \return control value
+  int GetDivideSize() const { return mySeparateSize->value(); }
+
+  //! Sets separate size value
+  //! \param theValue new value
+  void SetDivideSize (const int theValue) { mySeparateSize->setValue (theValue); }
+
+signals:
+  //! Signals about header cell is clicked
+  //! \param theEvent context menu event
+  void headerContextMenuRequsted (QContextMenuEvent* theEvent);
+
+  //! Signals about the following properties are changed: XStep.
+  void propertyChanged();
+
+protected slots:
+  //! Reacts to the spin box value change, it divides table model values to has given number of columns
+  //! \param theValue a new value of spin box
+  void onSeparateSizeChanged (int theValue);
+
+  //! Reacts to the tolerance value change, it sets it into table model
+  //! \param theValue a new value of spin box
+  void onToleranceSizeChanged (int theValue);
+
+public:
+  //! Updates controls by selection change in table view
+  //! \param theSelected container of selected table cells
+  //! \param theDeselected container of selected table cells
+  void UpdateOnTableSelectionChanged();
+
+private:
+  //! Changes visibility of XStep control, if visible, set parameter value
+  //! \param theState if true, the control is visible
+  //! \param theValue the current for the control
+  void setXStepActive (const bool theState, const double theValue = -1);
+
+private:
+  bool myIsActive; //!< state whether the control is visible and used
+  QWidget* myMainWidget; //!< parent of all controls
+  QLabel* mySize; //!< control to visualize initial values size
+  QLabel* myDivideSize; //!< size of division table values to rows
+  QSpinBox* mySeparateSize; //!< control to divide table by given size if thable has only 1 dimension
+  QLabel* myVisualizedSize; //!< control to visualize current table size
+
+  bool myXStepActive; //!< state whether the XStep control is visible
+  QLabel* myXStepLabel; //!< label of X step
+  QDoubleSpinBox* myXStep; //!< control to enter X step
+
+  QWidget* myInformationWidget; //!< parent of all controls
+  QPlainTextEdit* myModelInformation; //!< control to visualize current table size
+  QPushButton* myMinValue; //!< minimum table value
+  QPushButton* myMaxValue; //!< maximum table value
+  QPushButton* myMinSelectedValue; //!< minimum value of selected table cells
+  QPushButton* myMaxSelectedValue; //!< maximum value of selected table cells
+
+  ViewControl_Table* myTable; //!< table control
+  ViewControl_TableModelFilter* myFilter; //!< table values filter to apply separation size
+};
+#endif
index 99d3e441ef2942ad52f9855a91b2d2a8a1834c96..36b2401a4167a8cfee7a210e7ad0aa9de522e159 100644 (file)
 // commercial license or contractual agreement. 
 
 #include <inspector/ViewControl_Tools.hxx>
+#include <inspector/ViewControl_TableModel.hxx>
 
 #include <Standard_WarningsDisable.hxx>
 #include <QAction>
+#include <QHeaderView>
+#include <QLocale>
 #include <QObject>
 #include <QPalette>
+#include <QTableView>
 #include <QWidget>
 #include <Standard_WarningsRestore.hxx>
 
@@ -43,3 +47,165 @@ void ViewControl_Tools::SetWhiteBackground (QWidget* theControl)
   aPalette.setColor (QPalette::All, QPalette::Foreground, Qt::white);
   theControl->setPalette (aPalette);
 }
+
+// =======================================================================
+// function : SetDefaultHeaderSections
+// purpose :
+// =======================================================================
+void ViewControl_Tools::SetDefaultHeaderSections(QTableView* theTableView, const Qt::Orientation theOrientation)
+{
+  ViewControl_TableModel * aTableModel = dynamic_cast<ViewControl_TableModel*> (theTableView->model());
+  ViewControl_TableModelValues* aModelValues = aTableModel->GetModelValues();
+  if (!aModelValues)
+    return;
+
+  int aSectionSize;
+  if (aModelValues->GetDefaultSectionSize (Qt::Horizontal, aSectionSize) )
+    theTableView->horizontalHeader()->setDefaultSectionSize (aSectionSize);
+  else {
+    bool isStretchLastSection = true;
+    for (int aColumnId = 0, aNbColumns = aTableModel->columnCount(); aColumnId < aNbColumns; aColumnId++)
+    {
+      TreeModel_HeaderSection aSection = aModelValues->GetHeaderItem (theOrientation, aColumnId);
+      if (aSection.IsEmpty())
+        continue;
+
+      int aColumnWidth = aSection.GetWidth();
+      if (aColumnWidth > 0)
+      {
+        theTableView->setColumnWidth (aColumnId, aColumnWidth);
+        if (aColumnId == aNbColumns - 1)
+          isStretchLastSection = false;
+      }
+      theTableView->setColumnHidden (aColumnId, aSection.IsHidden());
+    }
+    if (isStretchLastSection != theTableView->horizontalHeader()->stretchLastSection())
+      theTableView->horizontalHeader()->setStretchLastSection (isStretchLastSection);
+
+  }
+}
+
+// =======================================================================
+// function : GetPointerInfo
+// purpose :
+// =======================================================================
+TCollection_AsciiString ViewControl_Tools::GetPointerInfo (const Handle(Standard_Transient)& thePointer, const bool isShortInfo)
+{
+  return GetPointerInfo(thePointer.operator->(), isShortInfo);
+}
+
+// =======================================================================
+// function : GetPointerInfo
+// purpose :
+// =======================================================================
+TCollection_AsciiString ViewControl_Tools::GetPointerInfo (const void* thePointer, const bool isShortInfo)
+{
+  std::ostringstream aPtrStr;
+  aPtrStr << thePointer;
+  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 : ToVariant
+// purpose :
+// =======================================================================
+QVariant ViewControl_Tools::ToVariant (const Standard_ShortReal theValue)
+{
+  return QVariant (QLocale().toString (theValue));
+}
+
+// =======================================================================
+// function : ToVariant
+// purpose :
+// =======================================================================
+QVariant ViewControl_Tools::ToVariant (const Standard_Real theValue)
+{
+  return QVariant (QLocale().toString (theValue));
+}
+
+// =======================================================================
+// function : ToRealValue
+// purpose :
+// =======================================================================
+Standard_ShortReal ViewControl_Tools::ToShortRealValue (const QVariant& theValue)
+{
+  return QLocale().toFloat (theValue.toString());
+}
+
+// =======================================================================
+// function : ToRealValue
+// purpose :
+// =======================================================================
+Standard_Real ViewControl_Tools::ToRealValue (const QVariant& theValue)
+{
+  return QLocale().toDouble (theValue.toString());
+}
+
+// =======================================================================
+// function : ToString
+// purpose :
+// =======================================================================
+TCollection_AsciiString ViewControl_Tools::ToString (const gp_Trsf& theValue)
+{
+  TCollection_AsciiString aValues;
+  for (int aRowId = 1; aRowId <= 3; aRowId++)
+  {
+    for (int aColId = 1; aColId <= 4; aColId++) {
+      aValues += TCollection_AsciiString (theValue.Value(aRowId, aColId));
+      if (aColId != 4)
+        aValues += ",";
+    }
+    if (aRowId != 3)
+      aValues += "  ";
+  }
+  return aValues;
+}
+
+// =======================================================================
+// function : ToString
+// purpose :
+// =======================================================================
+TCollection_AsciiString ViewControl_Tools::ToString (const gp_Pnt& thePoint)
+{
+  return TCollection_AsciiString (thePoint.X()) + ","
+       + TCollection_AsciiString (thePoint.Y()) + ","
+       + TCollection_AsciiString (thePoint.Z());
+}
+
+// =======================================================================
+// function : ToString
+// purpose :
+// =======================================================================
+TCollection_AsciiString ViewControl_Tools::ToString (const Bnd_Box& theValue)
+{
+  return QString ("(%1, %2, %3), (%4, %5, %6)")
+    .arg (theValue.CornerMin().X()).arg (theValue.CornerMin().Y()).arg (theValue.CornerMin().Z())
+    .arg (theValue.CornerMax().X()).arg (theValue.CornerMax().Y()).arg (theValue.CornerMax().Z()).toStdString().c_str();
+
+}
+
+// =======================================================================
+// function : ToString
+// purpose :
+// =======================================================================
+TCollection_AsciiString ViewControl_Tools::ToString (const Handle(TColgp_HArray1OfPnt)& thePoints)
+{
+  QStringList aPointList;
+  for (Standard_Integer aPntIter = thePoints->Lower(); aPntIter <= thePoints->Upper(); ++aPntIter)
+    aPointList.append(ViewControl_Tools::ToString (thePoints->Value (aPntIter)).ToCString());
+
+  return aPointList.join(" ,").toStdString().c_str();
+}
index 7dd4bd4b39b2f5c1898f0934a03ea7d020bae74b..5cff09a29606027878bab6a11b9be470be5e053a 100644 (file)
 #ifndef ViewControl_Tools_H
 #define ViewControl_Tools_H
 
+#include <gp_Pnt.hxx>
+#include <gp_Trsf.hxx>
+#include <Bnd_Box.hxx>
 #include <Standard.hxx>
 #include <Standard_Macro.hxx>
+#include <TColgp_HArray1OfPnt.hxx>
+#include <TCollection_AsciiString.hxx>
 
 #include <Standard_WarningsDisable.hxx>
 #include <QString>
+#include <QVariant>
 #include <Standard_WarningsRestore.hxx>
 
 class QAction;
 class QObject;
+class QTableView;
 class QWidget;
 
 //! \class ViewControl_Tools
@@ -46,6 +53,65 @@ public:
   //! \param theControl a widget to be modified
   Standard_EXPORT static void SetWhiteBackground (QWidget* theControl);
 
+  //! Fills tree view by default sections parameters obtained in view's table model
+  //! \param theTableView table view instance
+  //! \param theOrientation header orientation
+  Standard_EXPORT static void SetDefaultHeaderSections (QTableView* theTableView, const Qt::Orientation theOrientation);
+
+  //! Convert handle 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);
+
+  //! 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 void* thePointer,
+                                                                 const bool isShortInfo = true);
+
+  //! Convert real value to string value
+  //! \param theValue a short real value
+  //! \return the string value
+  Standard_EXPORT static QVariant ToVariant (const Standard_ShortReal theValue);
+
+  //! Convert real value to string value
+  //! \param theValue a real value
+  //! \return the string value
+  Standard_EXPORT static QVariant ToVariant (const Standard_Real theValue);
+
+  //! Convert real value to real value
+  //! \param theValue a string value
+  //! \return the real value
+  Standard_EXPORT static Standard_ShortReal ToShortRealValue (const QVariant& theValue);
+
+  //! Convert real value to string value
+  //! \param theValue a string value
+  //! \return the real value
+  Standard_EXPORT static Standard_Real ToRealValue (const QVariant& theValue);
+
+  //! Returns text of orientation
+  //! \param theLocation a location value
+  //! \return text value
+  Standard_EXPORT static TCollection_AsciiString ToString (const gp_Trsf& theValue);
+
+  //! Returns text of point
+  //! \param theValue a 3D point
+  //! \return text value
+  Standard_EXPORT static TCollection_AsciiString ToString (const gp_Pnt& theValue);
+
+  //! Returns text of bounding box in form: (xmin, ymin, zmin), (xmax, ymax, zmax)
+  //! \param theValue a bounding box
+  //! \return text value
+  Standard_EXPORT static TCollection_AsciiString ToString (const Bnd_Box& theValue);
+
+  //! Returns text of array of points
+  //! \param thePoints points
+  //! \return text value
+  Standard_EXPORT static TCollection_AsciiString ToString (const Handle(TColgp_HArray1OfPnt)& thePoints);
+
 };
 
 #endif