]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Merging with WPDev
authorabd <abd@opencascade.com>
Wed, 7 Feb 2007 10:46:23 +0000 (10:46 +0000)
committerabd <abd@opencascade.com>
Wed, 7 Feb 2007 10:46:23 +0000 (10:46 +0000)
259 files changed:
adm_local/unix/config_files/check_GUI.m4
adm_local/unix/config_files/check_corba_in_GUI.m4
adm_local/unix/config_files/check_pyqt.m4
adm_local/unix/config_files/check_sip.m4
configure.in.base
doc/salome/gui/GUI/pics/ppref1.png [new file with mode: 0755]
doc/salome/gui/GUI/pics/ppref2.png [new file with mode: 0755]
doc/salome/gui/GUI/pics/ppref3.png [new file with mode: 0755]
doc/salome/gui/GUI/pics/pref33.png
doc/salome/gui/GUI/post-pro_preferences.htm
resources/copy.png
resources/help.png
resources/paste.png
resources/plot2d_fitall.png
resources/plot2d_fitarea.png
resources/plot2d_pan.png
resources/plot2d_zoom.png
src/CAM/CAM_Module.cxx
src/CAM/CAM_Module.h
src/CAM/CAM_Study.cxx
src/DDS/DDS_DicGroup.cxx
src/DDS/DDS_DicItem.cxx
src/DDS/DDS_DicItem.h
src/DDS/DDS_Dictionary.cxx
src/DDS/DDS_Dictionary.h
src/DDS/DDS_KeyWords.cxx
src/DDS/DDS_KeyWords.h
src/Event/SALOME_Event.hxx
src/GLViewer/GLViewer_BaseObjects.cxx
src/GLViewer/GLViewer_Drawer.cxx
src/GLViewer/GLViewer_Object.cxx
src/GLViewer/GLViewer_Object.h
src/GLViewer/GLViewer_Tools.cxx
src/GLViewer/GLViewer_ViewManager.cxx
src/GLViewer/GLViewer_ViewManager.h
src/GLViewer/GLViewer_ViewPort2d.cxx
src/GLViewer/resources/GLViewer_msg_en.po
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/LightApp/LightApp_DataModel.cxx
src/LightApp/LightApp_DataOwner.cxx
src/LightApp/LightApp_DataOwner.h
src/LightApp/LightApp_DataSubOwner.cxx
src/LightApp/LightApp_DataSubOwner.h
src/LightApp/LightApp_Dialog.h
src/LightApp/LightApp_Displayer.h
src/LightApp/LightApp_GLSelector.cxx
src/LightApp/LightApp_GLSelector.h
src/LightApp/LightApp_Module.cxx
src/LightApp/LightApp_Module.h
src/LightApp/LightApp_ModuleDlg.cxx
src/LightApp/LightApp_OBSelector.cxx
src/LightApp/LightApp_OCCSelector.cxx
src/LightApp/LightApp_OCCSelector.h
src/LightApp/LightApp_Selection.cxx
src/LightApp/LightApp_Selection.h
src/LightApp/LightApp_ShowHideOp.cxx
src/LightApp/LightApp_VTKSelector.cxx
src/LightApp/LightApp_VTKSelector.h
src/Makefile.in
src/OCCViewer/Makefile.in
src/OCCViewer/OCCViewer_ClippingDlg.cxx
src/OCCViewer/OCCViewer_ClippingDlg.h
src/OCCViewer/OCCViewer_CreateRestoreViewDlg.cxx
src/OCCViewer/OCCViewer_SetRotationPointDlg.cxx [new file with mode: 0644]
src/OCCViewer/OCCViewer_SetRotationPointDlg.h [new file with mode: 0644]
src/OCCViewer/OCCViewer_ViewManager.cxx
src/OCCViewer/OCCViewer_ViewManager.h
src/OCCViewer/OCCViewer_ViewModel.cxx
src/OCCViewer/OCCViewer_ViewModel.h
src/OCCViewer/OCCViewer_ViewPort.h
src/OCCViewer/OCCViewer_ViewPort3d.cxx
src/OCCViewer/OCCViewer_ViewPort3d.h
src/OCCViewer/OCCViewer_ViewWindow.cxx
src/OCCViewer/OCCViewer_ViewWindow.h
src/OCCViewer/resources/OCCViewer_images.po
src/OCCViewer/resources/OCCViewer_msg_en.po
src/OCCViewer/resources/view_rotation_point.png [new file with mode: 0755]
src/ObjBrowser/OB_Browser.cxx
src/ObjBrowser/OB_Browser.h
src/ObjBrowser/OB_ListItem.cxx
src/ObjBrowser/OB_ListView.cxx
src/Plot2d/Plot2d_SetupCurveDlg.h
src/Plot2d/Plot2d_ViewFrame.cxx
src/Plot2d/Plot2d_ViewFrame.h
src/Plot2d/Plot2d_ViewManager.cxx
src/Plot2d/Plot2d_ViewManager.h
src/Plot2d/resources/Plot2d_msg_en.po
src/PyInterp/PyInterp.h
src/PythonConsole/PythonConsole.h
src/PythonConsole/PythonConsole_PyConsole.cxx
src/PythonConsole/PythonConsole_PyConsole.h
src/PythonConsole/PythonConsole_PyEditor.cxx
src/PythonConsole/PythonConsole_PyEditor.h
src/PythonConsole/PythonConsole_PyInterp.cxx
src/QDS/QDS.cxx
src/QDS/QDS.h
src/QDS/QDS_CheckBox.cxx
src/QDS/QDS_ComboBox.cxx
src/QDS/QDS_Datum.cxx
src/QDS/QDS_Datum.h
src/QDS/QDS_LineEdit.cxx
src/QDS/QDS_LineEdit.h
src/QDS/QDS_RadioBox.cxx
src/QDS/QDS_RadioBox.h
src/QDS/QDS_SpinBox.cxx
src/QDS/QDS_SpinBoxDbl.cxx
src/QDS/QDS_Table.cxx [new file with mode: 0644]
src/QDS/QDS_Table.h [new file with mode: 0644]
src/QDS/QDS_TextEdit.cxx
src/QDS/QDS_Validator.cxx
src/QDS/QDS_Validator.h
src/Qtx/Qtx.cxx
src/Qtx/Qtx.h
src/Qtx/QtxAction.cxx
src/Qtx/QtxAction.h
src/Qtx/QtxActionMenuMgr.cxx
src/Qtx/QtxDblValidator.h
src/Qtx/QtxDialog.cxx
src/Qtx/QtxDockWindow.cxx
src/Qtx/QtxListAction.cxx
src/Qtx/QtxListResourceEdit.cxx
src/Qtx/QtxResourceEdit.h
src/Qtx/QtxResourceMgr.cxx
src/Qtx/QtxResourceMgr.h
src/Qtx/QtxWorkstack.cxx
src/RegistryDisplay/HelpWindow.hxx
src/RegistryDisplay/IntervalWindow.hxx
src/RegistryDisplay/RegWidget.h
src/ResExporter/ResourceExporter.cxx
src/SALOME_PY/SalomePy.cxx
src/SALOME_PYQT/SALOME_PYQT_GUI/Makefile.in
src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx
src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.h
src/SALOME_PYQT/SalomePyQt/Makefile.in
src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx
src/SALOME_PYQT/SalomePyQt/SalomePyQt.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip
src/SALOME_PYQT/SalomePyQt/SalomePyQt_v4.sip
src/SALOME_SWIG/Help.py [new file with mode: 0755]
src/SALOME_SWIG/PyInterp.py [new file with mode: 0755]
src/SALOME_SWIG/SALOMEGUI_Swig.cxx
src/SALOME_SWIG/SALOMEGUI_Swig.hxx
src/SALOME_SWIG/SALOMEGUI_Swig.i
src/SALOME_SWIG/salome.py [new file with mode: 0755]
src/SOCC/SOCC_Prs.cxx
src/SOCC/SOCC_ViewModel.cxx
src/SOCC/SOCC_ViewWindow.cxx
src/SPlot2d/SPlot2d_ViewModel.cxx
src/STD/STD_Application.cxx
src/STD/STD_Application.h
src/SUIT/SUIT_Application.cxx
src/SUIT/SUIT_Application.h
src/SUIT/SUIT_DataObjectKey.h
src/SUIT/SUIT_DataOwner.cxx
src/SUIT/SUIT_DataOwner.h
src/SUIT/SUIT_Desktop.cxx
src/SUIT/SUIT_Desktop.h
src/SUIT/SUIT_PopupClient.h
src/SUIT/SUIT_ResourceMgr.cxx
src/SUIT/SUIT_SelectionFilter.h
src/SUIT/SUIT_Session.cxx
src/SUIT/SUIT_TreeSync.h
src/SUIT/SUIT_ViewManager.cxx
src/SUIT/SUIT_ViewManager.h
src/SUIT/SUIT_ViewWindow.cxx
src/SUIT/SUIT_ViewWindow.h
src/SUITApp/Makefile.in
src/SUPERVGraph/SUPERVGraph_ViewFrame.h
src/SUPERVGraph/resources/view_pan.png
src/SUPERVGraph/resources/view_reset.png
src/SVTK/Makefile.in
src/SVTK/SALOME_Actor.h
src/SVTK/SVTK_Actor.h
src/SVTK/SVTK_CubeAxesActor2D.h
src/SVTK/SVTK_DeviceActor.cxx
src/SVTK/SVTK_DeviceActor.h
src/SVTK/SVTK_Event.h
src/SVTK/SVTK_Extension.cxx [new file with mode: 0755]
src/SVTK/SVTK_Extension.h [new file with mode: 0755]
src/SVTK/SVTK_FontWidget.h
src/SVTK/SVTK_GenericRenderWindowInteractor.h
src/SVTK/SVTK_InteractorStyle.cxx
src/SVTK/SVTK_InteractorStyle.h
src/SVTK/SVTK_MainWindow.cxx
src/SVTK/SVTK_MainWindow.h
src/SVTK/SVTK_RectPicker.h
src/SVTK/SVTK_RenderWindowInteractor.cxx
src/SVTK/SVTK_RenderWindowInteractor.h
src/SVTK/SVTK_Renderer.h
src/SVTK/SVTK_Selector.cxx
src/SVTK/SVTK_Selector.h
src/SVTK/SVTK_SetRotationPointDlg.cxx [new file with mode: 0755]
src/SVTK/SVTK_SetRotationPointDlg.h [new file with mode: 0755]
src/SVTK/SVTK_SpaceMouse.cxx
src/SVTK/SVTK_SpaceMouse.h
src/SVTK/SVTK_Trihedron.cxx
src/SVTK/SVTK_ViewManager.cxx
src/SVTK/SVTK_ViewManager.h
src/SVTK/SVTK_ViewModel.cxx
src/SVTK/SVTK_ViewWindow.cxx
src/SVTK/SVTK_ViewWindow.h
src/SVTK/resources/SVTK_msg_en.po
src/SalomeApp/Makefile.in
src/SalomeApp/SalomeApp_Application.cxx
src/SalomeApp/SalomeApp_Application.h
src/SalomeApp/SalomeApp_DataModel.cxx
src/SalomeApp/SalomeApp_DataObject.cxx
src/SalomeApp/SalomeApp_ExceptionHandler.cxx
src/SalomeApp/SalomeApp_Module.h
src/SalomeApp/SalomeApp_Study.cxx
src/SalomeApp/resources/SalomeApp.xml
src/SalomeApp/resources/SalomeApp_msg_en.po
src/Session/InquireServersQThread.h
src/Session/Makefile.in
src/Session/SALOME_Session.hxx [new file with mode: 0755]
src/Session/SALOME_Session_Server.cxx
src/Session/SalomeApp_Engine_i.hxx
src/Session/Session_ServerCheck.hxx
src/Session/Session_ServerLauncher.cxx
src/Session/Session_ServerLauncher.hxx
src/Session/Session_ServerThread.cxx
src/Session/Session_ServerThread.hxx
src/Session/Session_Session_i.cxx
src/Session/Session_Session_i.hxx
src/Style/Makefile.in
src/Style/SalomeStyle.cxx
src/Style/SalomeStyle.h
src/TOOLSGUI/Makefile.in
src/TOOLSGUI/ToolsGUI_HelpWindow.h
src/TOOLSGUI/ToolsGUI_IntervalWindow.h
src/TOOLSGUI/ToolsGUI_RegWidget.cxx
src/TOOLSGUI/ToolsGUI_RegWidget.h
src/VTKViewer/Makefile.in
src/VTKViewer/VTKViewer_Actor.h
src/VTKViewer/VTKViewer_AppendFilter.h
src/VTKViewer/VTKViewer_CellRectPicker.h
src/VTKViewer/VTKViewer_ConvexTool.cxx
src/VTKViewer/VTKViewer_ConvexTool.h
src/VTKViewer/VTKViewer_ExtractUnstructuredGrid.cxx
src/VTKViewer/VTKViewer_ExtractUnstructuredGrid.h
src/VTKViewer/VTKViewer_GeometryFilter.cxx
src/VTKViewer/VTKViewer_GeometryFilter.h
src/VTKViewer/VTKViewer_InteractorStyle.h
src/VTKViewer/VTKViewer_RectPicker.cxx
src/VTKViewer/VTKViewer_ShrinkFilter.cxx
src/VTKViewer/VTKViewer_ShrinkFilter.h
src/VTKViewer/VTKViewer_Trihedron.cxx
src/VTKViewer/VTKViewer_Trihedron.h
src/VTKViewer/VTKViewer_Utilities.cxx
src/VTKViewer/VTKViewer_Utilities.h
src/VTKViewer/VTKViewer_VectorText.cxx
src/VTKViewer/VTKViewer_VectorText.h
src/VTKViewer/VTKViewer_ViewManager.cxx
src/VTKViewer/VTKViewer_ViewManager.h
src/VTKViewer/VTKViewer_ViewModel.cxx
src/VTKViewer/resources/VTKViewer_images.po
src/VTKViewer/resources/VTKViewer_msg_en.po
src/VTKViewer/resources/view_rotation_point.png [new file with mode: 0755]

index ff090e7b9b843f8e6b63eb3e3fb934fcf5e5a0b8..e0b0e24ae518b443656bf99cf25bbc9c1279b6bb 100755 (executable)
@@ -27,14 +27,14 @@ if test "x${SALOME_GUI_DIR}" = "x" ; then
     # search Salome binaries in PATH variable
     AC_PATH_PROG(TEMP, $1)
     if test "x${TEMP}" != "x" ; then
-      AC_MSG_RESULT(libLightApp.so was found at : ${TEMP})
+      AC_MSG_RESULT($1 was found at : ${TEMP})
       SALOME_BIN_DIR=`dirname ${TEMP}`
       SALOME_GUI_DIR=`cd ${SALOME_BIN_DIR}/../..; pwd`
     fi
   fi
 fi
 
-if test -f ${SALOME_GUI_DIR}/lib${LIB_LOCATION_SUFFIX}/salome/$1 ; then
+if test -f ${SALOME_GUI_DIR}/bin/salome/$1 ; then
   SalomeGUI_ok=yes
   AC_MSG_RESULT(Using SALOME GUI distribution in ${SALOME_GUI_DIR})
 
@@ -58,6 +58,6 @@ AC_MSG_RESULT(for $2: ${SalomeGUI_ok})
 ])dnl
 
 AC_DEFUN([CHECK_SALOME_GUI],[
-  CHECK_GUI([libLightApp.so],
+  CHECK_GUI([SUITApp],
             [SALOME GUI])
-])dnl
\ No newline at end of file
+])dnl
index 20be4514f656afa19b0dd366bb2319877be80a2d..381bf3b7d43a38255fe368820e1d57bf78141469 100755 (executable)
@@ -4,7 +4,7 @@
 #------------------------------------------------------------
 
 AC_DEFUN([CHECK_CORBA_IN_GUI],[
-  CHECK_GUI([libSalomeApp.so],
+  CHECK_GUI([SALOME_Session_Server],
             [CORBA SALOME GUI])
   CORBA_IN_GUI=${SalomeGUI_ok}
   AC_SUBST(CORBA_IN_GUI)
index 7be124e24b4a5f2d68c2ade5bfefc10cb0f36845..e07ead61535ce3655443f7f6d652368ab7344208 100644 (file)
@@ -49,6 +49,16 @@ if test "x$pyqt_uic_ok" == "xno"; then
     fi
   fi   
 fi
+if test "x$pyqt_uic_ok" == "xno"; then
+  dnl try in $PATH
+  AC_PATH_PROG(PYUIC, pyuic)
+  if test "x$PYUIC" != x; then
+    PYQTDIR=$PYUIC
+    PYQTDIR=`dirname $PYQTDIR`
+    PYQTDIR=`dirname $PYQTDIR`
+    pyqt_uic_ok=yes
+  fi
+fi
 if test "x$pyqt_uic_ok" == "xno"; then
   dnl try ${SIPDIR}
   if test "x${SIPDIR}" != "x"; then
@@ -106,8 +116,8 @@ if test "x${PYQTDIR}" != "x"; then
     fi
   fi
   if test "x$pyqt_lib_ok" == "xno"; then
-    dnl try {PYQTDIR}/lib
-    if test -d {PYQTDIR}/lib; then
+    dnl try ${PYQTDIR}/lib
+    if test -d ${PYQTDIR}/lib; then
       AC_CHECK_FILE(${PYQTDIR}/lib/libqtcmodule.so,pyqt_lib_ok=yes,pyqt_lib_ok=no)
       if test "x$pyqt_lib_ok" == "xyes"; then
         PYQT_LIBS="-L${PYQTDIR}/lib -lqtcmodule"
@@ -120,8 +130,8 @@ if test "x${PYQTDIR}" != "x"; then
     fi
   fi
   if test "x$pyqt_lib_ok" == "xno"; then
-    dnl try {PYQTDIR}/lib${LIB_LOCATION_SUFFIX}/python${PYTHON_VERSION}/site-packages
-    if test -d {PYQTDIR}/lib${LIB_LOCATION_SUFFIX}/python${PYTHON_VERSION}/site-packages; then
+    dnl try ${PYQTDIR}/lib${LIB_LOCATION_SUFFIX}/python${PYTHON_VERSION}/site-packages
+    if test -d ${PYQTDIR}/lib${LIB_LOCATION_SUFFIX}/python${PYTHON_VERSION}/site-packages; then
       AC_CHECK_FILE(${PYQTDIR}/lib${LIB_LOCATION_SUFFIX}/python${PYTHON_VERSION}/site-packages/libqtcmodule.so,pyqt_lib_ok=yes,pyqt_lib_ok=no)
       if test "x$pyqt_lib_ok" == "xyes"; then
         PYQT_LIBS="-L${PYQTDIR}/lib${LIB_LOCATION_SUFFIX}/python${PYTHON_VERSION}/site-packages -lqtcmodule"
@@ -220,6 +230,17 @@ if test "x$pyqt_sips_ok" == "xno"; then
     fi
   fi
 fi
+if test "x$pyqt_sips_ok" == "xno"; then
+  dnl try ${PYQTDIR}/share/sip/qt
+  if test "x${PYQTDIR}" != "x"; then
+    if test -d ${PYQTDIR}/share/sip/qt ; then
+      AC_CHECK_FILE(${PYQTDIR}/share/sip/qt/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no)
+      if test "x$pyqt_sips_ok" == "xyes"; then
+        PYQT_SIPS="${PYQTDIR}/share/sip/qt"
+      fi
+    fi
+  fi
+fi
 if test "x$pyqt_sips_ok" == "xno"; then
   dnl try ${SIPDIR}/sip
   if test "x${SIPDIR}" != "x"; then
index 83af9a907589fbcec47688ccca5c3218a82b25c9..0a087529c7050fc8a7ffa83ec9d06e48e53d6ec0 100644 (file)
@@ -44,11 +44,20 @@ else
            SIP_VERS=v4_old ;;
          4.2*)
            SIP_VERS=v4_new ;;
+         4.3*)
+           SIP_VERS=v4_new ;;
+         4.4*)
+           SIP_VERS=v4_new ;;
          *)
            AC_MSG_RESULT(sip version $version not supported)
            SIP_VERS=unsupported ;;
     esac
 
+    if test "x$SIPDIR" = "x" ; then
+        SIPDIR=`dirname $SIP`
+        SIPDIR=`dirname $SIPDIR`
+    fi
+
     sip_ok=no
     dnl Search sip.h file
     if test "x$SIPDIR" != "x" ; then
index b9e3aa93a513a5d78b0883ebfb0207d9d1a8e0a9..4d11277707f0a3b7f93c81148f5e9267d2d148d8 100644 (file)
@@ -23,8 +23,8 @@ AC_CANONICAL_HOST
 PACKAGE=salome
 AC_SUBST(PACKAGE)
 
-VERSION=3.2.2
-XVERSION=0x030202
+VERSION=3.2.4
+XVERSION=0x030204
 AC_SUBST(VERSION)
 AC_SUBST(XVERSION)
 
diff --git a/doc/salome/gui/GUI/pics/ppref1.png b/doc/salome/gui/GUI/pics/ppref1.png
new file mode 100755 (executable)
index 0000000..dd91013
Binary files /dev/null and b/doc/salome/gui/GUI/pics/ppref1.png differ
diff --git a/doc/salome/gui/GUI/pics/ppref2.png b/doc/salome/gui/GUI/pics/ppref2.png
new file mode 100755 (executable)
index 0000000..5a15f0e
Binary files /dev/null and b/doc/salome/gui/GUI/pics/ppref2.png differ
diff --git a/doc/salome/gui/GUI/pics/ppref3.png b/doc/salome/gui/GUI/pics/ppref3.png
new file mode 100755 (executable)
index 0000000..767c5cf
Binary files /dev/null and b/doc/salome/gui/GUI/pics/ppref3.png differ
index 74ea331b40ab5499a2150a77a218cc35649e6982..bdc9b764321d30d8a9c20fce0ab63b6b8ca353af 100755 (executable)
Binary files a/doc/salome/gui/GUI/pics/pref33.png and b/doc/salome/gui/GUI/pics/pref33.png differ
index 801ff8756255300903183780a2f72179a524d490..107abc6097a95ba81375a0f0272420b84d05e79e 100755 (executable)
@@ -15,40 +15,45 @@ if (navigator.appName !="Netscape")
 <style type="text/css">\r
 <!--\r
 p.whs1 { font-weight:bold; }\r
-img_whs2 { border:none; border-style:none; width:752px; height:646px; float:none; }\r
+img_whs2 { border:none; width:752px; height:646px; float:none; border-style:none; }\r
 ul.whs3 { list-style:disc; }\r
-p.whs4 { font-weight:normal; }\r
-p.whs5 { font-weight:bold; margin-left:57px; }\r
-p.whs6 { font-weight:bold; margin-left:0px; }\r
-p.whs7 { font-weight:bold; margin-left:38px; }\r
-p.whs8 { margin-left:0px; font-weight:bold; }\r
-p.whs9 { margin-left:38px; font-weight:bold; }\r
-p.whs10 { margin-left:0px; text-align:justify; }\r
-p.whs11 { margin-left:38px; }\r
-img_whs12 { border:none; width:752px; height:646px; float:none; }\r
-p.whs13 { font-weight:bold; margin-left:36px; }\r
-p.whs14 { margin-left:0px; text-align:justify; font-weight:bold; }\r
-p.whs15 { margin-left:0px; text-align:justify; font-weight:normal; }\r
-p.whs16 { text-align:justify; font-weight:bold; margin-left:38px; }\r
-ol.whs17 { list-style:disc; }\r
-ul.whs18 { list-style:square; }\r
-p.whs19 { font-style:normal; }\r
-p.whs20 { margin-left:76px; }\r
-p.whs21 { text-align:justify; font-weight:bold; margin-left:0px; }\r
-p.whs22 { margin-left:38px; text-align:justify; font-weight:bold; }\r
-p.whs23 { text-align:justify; font-weight:bold; margin-left:76px; }\r
+p.whs4 { font-weight:bold; margin-left:38px; }\r
+p.whs5 { margin-left:38px; }\r
+p.whs6 { font-weight:normal; }\r
+p.whs7 { font-weight:bold; margin-left:57px; }\r
+p.whs8 { font-weight:bold; margin-left:0px; }\r
+p.whs9 { margin-left:0px; font-weight:bold; }\r
+p.whs10 { margin-left:38px; font-weight:bold; }\r
+p.whs11 { margin-left:36px; }\r
+p.whs12 { margin-left:0px; text-align:justify; }\r
+ol.whs13 { list-style:disc; }\r
+p.whs14 { font-family:'Times New Roman' , serif; margin-left:0px; font-weight:normal; }\r
+p.whs15 { font-family:'Times New Roman' , serif; margin-left:0px; font-weight:bold; }\r
+img_whs16 { border:none; width:752px; height:646px; float:none; }\r
+p.whs17 { font-weight:bold; margin-left:36px; }\r
+p.whs18 { margin-left:0px; text-align:justify; font-weight:bold; }\r
+p.whs19 { margin-left:0px; text-align:justify; font-weight:normal; }\r
+p.whs20 { text-align:justify; font-weight:bold; margin-left:38px; }\r
+ul.whs21 { list-style:square; }\r
+p.whs22 { font-style:normal; }\r
+p.whs23 { margin-left:76px; }\r
+p.whs24 { text-align:justify; font-weight:bold; margin-left:0px; }\r
+p.whs25 { margin-left:38px; text-align:justify; font-weight:bold; }\r
+p.whs26 { text-align:justify; font-weight:bold; margin-left:76px; }\r
 -->\r
 </style><script type="text/javascript" language="JavaScript">\r
 <!--\r
 if ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) == 4))\r
 {\r
   var strNSS = "<style type='text/css'>";\r
-  strNSS += "p.whs6 {margin-left:1pt; }";\r
   strNSS += "p.whs8 {margin-left:1pt; }";\r
-  strNSS += "p.whs10 {margin-left:1pt; }";\r
+  strNSS += "p.whs9 {margin-left:1pt; }";\r
+  strNSS += "p.whs12 {margin-left:1pt; }";\r
   strNSS += "p.whs14 {margin-left:1pt; }";\r
   strNSS += "p.whs15 {margin-left:1pt; }";\r
-  strNSS += "p.whs21 {margin-left:1pt; }";\r
+  strNSS += "p.whs18 {margin-left:1pt; }";\r
+  strNSS += "p.whs19 {margin-left:1pt; }";\r
+  strNSS += "p.whs24 {margin-left:1pt; }";\r
   strNSS +="</style>";\r
   document.write(strNSS);\r
 }\r
@@ -120,6 +125,58 @@ if (window.writeIntopicBar)
 \r
 <p>&nbsp;</p>\r
 \r
+<p class="whs1"><span><B>MED import Preferences</B></span></p>\r
+\r
+<p>&nbsp;</p>\r
+\r
+<p><img src="pics/ppref1.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
+\r
+<p>&nbsp;</p>\r
+\r
+<ul type="disc" class="whs3">\r
+       \r
+       <li class=kadov-p><p class="whs1">MED files import &nbsp;</p></li>\r
+       \r
+       <li class=kadov-p><p class="whs4">Use \r
+ Build Progress - <span style="font-weight: normal;">when this option is \r
+ checked you can choose all other import MED options at the moment of loading \r
+ of each file using </span>Build Progress<span style="font-weight: normal;"> \r
+ menu, otherwise the loading will be done according to the </span>Preferences<span \r
+ style="font-weight: normal;"> without addressing to the user.</span> </p></li>\r
+       \r
+       <li class=kadov-p><p class="whs4">Full \r
+ MED Loading - <span style="font-weight: normal;">when this option is checked, \r
+ the MED file is fully loaded in the study, and no additional access to \r
+ the MED file is needed during the session. Reversibly, when unchecked, \r
+ the MED file is loaded on demand. This is the default behaviour in SALOME \r
+ and recommended for big files to optimize memory usage.</span> </p></li>\r
+       \r
+       <li class=kadov-p><p class="whs5"><span style="font-weight: bold;"><B>Build \r
+ at once</B></span> - when this option is checked, you can't perform any operations \r
+ until the MED file is fully loaded and processed. </p></li>\r
+       \r
+       <li class=kadov-p><p class="whs4">Build \r
+ fields - &nbsp;<span style="font-weight: normal;">when \r
+ this</span> <span style="font-weight: normal;">option is checked, the \r
+ fields are built automatically at loading. </span></p></li>\r
+       \r
+       <li class=kadov-p><p class="whs4">Build \r
+ min/max - <span style="font-weight: normal;">when this option is checked, \r
+ minimum and maximum values of the time stamps are found at loading. </span></p></li>\r
+       \r
+       <li class=kadov-p><p class="whs4">Build \r
+ groups - <span style="font-weight: normal;">when this</span> <span style="font-weight: normal;">option \r
+ is checked, the groups and families are built automatically at loading. \r
+ </span></p></li>\r
+       \r
+       <li class=kadov-p><p class="whs4">Close \r
+ dialog at finish - <span style="font-weight: normal;">when this option \r
+ is checked, the dialog box is closed after loading of the selected MED \r
+ file. When unchecked, it allows loading other MED files. </span></p></li>\r
+</ul>\r
+\r
+<p>&nbsp;</p>\r
+\r
 <p class="whs1">Scalar Bar Preferences</p>\r
 \r
 <p>&nbsp;</p>\r
@@ -134,20 +191,20 @@ if (window.writeIntopicBar)
        \r
        <ul type="disc" class="whs3">\r
                \r
-               <li class=kadov-p><p class="whs4"><span style="font-weight: bold;"><B>Scalar \r
+               <li class=kadov-p><p class="whs6"><span style="font-weight: bold;"><B>Scalar \r
  Mode</B></span> - this feature allows refining the value to be inspected:</p></li>\r
                \r
-               <li class=kadov-p><p class="whs5">Modulus: \r
+               <li class=kadov-p><p class="whs7">Modulus: \r
  <span style="font-weight: normal;">value of a scalar or modulus of a vector.</span></p></li>\r
                \r
-               <li class=kadov-p><p class="whs5">Component \r
+               <li class=kadov-p><p class="whs7">Component \r
  N: <span style="font-weight: normal;">Nth component of a vector, a tensor \r
  or a matrix..</span></p></li>\r
                \r
-               <li class=kadov-p><p class="whs4"><span style="font-weight: bold;"><B>Logarithmic \r
+               <li class=kadov-p><p class="whs6"><span style="font-weight: bold;"><B>Logarithmic \r
  Scaling</B></span> - this checkbox toggles logarithmic scaling.</p></li>\r
                \r
-               <li class=kadov-p><p class="whs4"><span style="font-weight: bold;"><B>Ranges \r
+               <li class=kadov-p><p class="whs6"><span style="font-weight: bold;"><B>Ranges \r
  to Use</B></span> - you can use either Field Range or Imposed Range.<span \r
  style="margin-left: 0px;"> </span><span style="margin-left: 0px; text-indent: 12px;">.</span></p></li>\r
        </ul>\r
@@ -173,24 +230,24 @@ if (window.writeIntopicBar)
  horizontal orientation of the</span> <span style="font-weight: normal;">Scalar \r
  Bar.</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs6">Origin \r
+       <li class=kadov-p><p class="whs8">Origin \r
  &amp; Size Vertical &amp; Horizontal - a<span style="font-weight: normal;">llows \r
  to define placement (</span>X <span style="font-weight: normal;">and</span> \r
  Y<span style="font-weight: normal;">) and lookout (</span>Width and Height) \r
  <span style="font-weight: normal;">of Scalar Bars</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs7">X: \r
+       <li class=kadov-p><p class="whs4">X: \r
  <span style="font-weight: normal;">abscissa of the point of origin (from \r
  the left side)</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs7">Y: \r
+       <li class=kadov-p><p class="whs4">Y: \r
  <span style="font-weight: normal;">ordinate of the origin of the bar (from \r
  the bottom)</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs8">Scalar \r
+       <li class=kadov-p><p class="whs9">Scalar \r
  bars default position</p></li>\r
        \r
-       <li class=kadov-p><p class="whs9">Arrange \r
+       <li class=kadov-p><p class="whs10">Arrange \r
  Scalar Bars - <span style="font-weight: normal;">this option prevents \r
  superposition of scalar bars during visualisation of several fields in \r
  the same window. If checked, a separate scalar bar is displayed for each \r
@@ -199,13 +256,56 @@ if (window.writeIntopicBar)
 \r
 <p>&nbsp;</p>\r
 \r
-<p class="whs1">Sweep, MED Import Preferences</p>\r
+<p class="whs1">Cut Lines Preferences</p>\r
 \r
 <p class="whs1">&nbsp;</p>\r
 \r
-<p class="whs4"><img src="pics/pref32.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
+<p class="whs1"><img src="pics/ppref2.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
 \r
-<p class="whs4">&nbsp;</p>\r
+<p class="whs1">&nbsp;</p>\r
+\r
+<ul type="disc" class="whs3">\r
+       \r
+       <li class=kadov-p><p class="whs1">CutLine Preferences \r
+ </p></li>\r
+</ul>\r
+\r
+<ul type="disc" class="whs3">\r
+       \r
+       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Show \r
+ preview </B></span>check box allows to edit the parameters of the presentation \r
+ and simultaneously observe the preview of this presentation in the viewer.</p></li>\r
+       \r
+       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Invert \r
+ all curves</B></span> check box allows to invert the resulting curves. </p></li>\r
+       \r
+       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Use \r
+ absolute length </B></span>check box allows to use absolute length for curves. \r
+ </p></li>\r
+       \r
+       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Generate \r
+ Data Table: </B></span>If this check box is marked, <span style="font-weight: bold;"><B>Post \r
+ Pro</B></span> will automatically generate a data table on the basis of your \r
+ Cut Lines presentation. This table will be created in the structure of \r
+ the study. &nbsp;<span style="font-weight: bold;"><B>&nbsp;</B></span></p></li>\r
+       \r
+       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Generate \r
+ Curves: </B></span>If this check box is marked, <span style="font-weight: bold;"><B>Post \r
+ Pro</B></span> &nbsp;will \r
+ automatically generate curve lines on the basis of values taken from the \r
+ generated data table. These curves will be created in the structure of \r
+ the study and can be visualized in a XY plot. &nbsp;</p></li>\r
+</ul>\r
+\r
+<p class="whs11">&nbsp;</p>\r
+\r
+<p class="whs1"><span><B>Sweep Preferences</B></span></p>\r
+\r
+<p class="whs1">&nbsp;</p>\r
+\r
+<p class="whs6"><img src="pics/ppref3.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
+\r
+<p class="whs6">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
@@ -213,74 +313,60 @@ if (window.writeIntopicBar)
        \r
        <ul type="disc" class="whs3">\r
                \r
-               <li class=kadov-p><p class="whs10"><span \r
+               <li class=kadov-p><p class="whs12"><span \r
  style="font-weight: bold;"><B>Time step -</B></span> in this menu you can set \r
  the<span style="font-weight: bold;"> <B></B></span>time of representation of \r
  one step.</p></li>\r
                \r
-               <li class=kadov-p><p class="whs10"><span \r
+               <li class=kadov-p><p class="whs12"><span \r
  style="font-weight: bold;"><B>Number of cycles -</B></span> in this menu you \r
  can define the number of times this animation will be repeated.</p></li>\r
                \r
-               <li class=kadov-p><p class="whs10"><span \r
+               <li class=kadov-p><p class="whs12"><span \r
  style="font-weight: bold;"><B>Number of steps</B></span> - in this menu you can \r
  define the number of steps, which will compose the whole animation.</p></li>\r
        </ul>\r
 </ul>\r
 \r
-<p class="whs10">&nbsp;</p>\r
+<p class="whs12">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
-       <li class=kadov-p><p class="whs1">MED files import &nbsp;</p></li>\r
-       \r
-       <li class=kadov-p><p class="whs7">Use \r
- Build Progress - <span style="font-weight: normal;">when this option is \r
- checked you can choose all other import MED options at the moment of loading \r
- of each file using </span>Build Progress<span style="font-weight: normal;"> \r
- menu, otherwise the loading will be done according to the </span>Preferences<span \r
- style="font-weight: normal;"> without addressing to the user.</span> </p></li>\r
-       \r
-       <li class=kadov-p><p class="whs7">Full \r
- MED Loading - <span style="font-weight: normal;">when this option is checked, \r
- the MED file is fully loaded in the study, and no additional access to \r
- the MED file is needed during the session. Reversibly, when unchecked, \r
- the MED file is loaded on demand. This is the default behaviour in SALOME \r
- and recommended for big files to optimize memory usage.</span> </p></li>\r
-       \r
-       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Build \r
- at once</B></span> - when this option is checked, you can't perform any operations \r
- until the MED file is fully loaded and processed. </p></li>\r
-       \r
-       <li class=kadov-p><p class="whs7">Build \r
- fields - &nbsp;<span style="font-weight: normal;">when \r
- this</span> <span style="font-weight: normal;">option is checked, the \r
- fields are built automatically at loading. </span></p></li>\r
-       \r
-       <li class=kadov-p><p class="whs7">Build \r
- min/max - <span style="font-weight: normal;">when this option is checked, \r
- minimum and maximum values of the time stamps are found at loading. </span></p></li>\r
-       \r
-       <li class=kadov-p><p class="whs7">Build \r
- groups - <span style="font-weight: normal;">when this</span> <span style="font-weight: normal;">option \r
- is checked, the groups and families are built automatically at loading. \r
- </span></p></li>\r
-       \r
-       <li class=kadov-p><p class="whs7">Close \r
- dialog at finish - <span style="font-weight: normal;">when this option \r
- is checked, the dialog box is closed after loading of the selected MED \r
- file. When unchecked, it allows loading other MED files. </span></p></li>\r
+       <li class=kadov-p><p class="whs1">Animation preferences</p></li>\r
 </ul>\r
 \r
-<p class="whs7">&nbsp;</p>\r
+<ol type="disc" class="whs13">\r
+       \r
+       <ul type="disc" class="whs3">\r
+               \r
+               <li class=kadov-p><p class="whs14"><span style="font-weight: bold;"><B>Speed</B></span> \r
+ - allows to define the speed of the animation.</p></li>\r
+               \r
+               <li class=kadov-p><p class="whs14"><span style="font-weight: bold;"><B>Cycled \r
+ animation</B></span> - allows to start a cycled animation of the presentation.</p></li>\r
+               \r
+               <li class=kadov-p><p class="whs15">Use proportional \r
+ timing -<span style="font-weight: normal;"> allows to render the animation \r
+ with proportional periods of time between every frame (not depending on \r
+ the time stamps).</span></p></li>\r
+               \r
+               <li class=kadov-p><p class="whs15">Clean memory at \r
+ each frame - <span style="font-weight: normal;">this option allows to \r
+ optimize the performance of the operation.</span></p></li>\r
+       </ul>\r
+</ol>\r
 \r
-<p class="whs8">Representation Preferences</p>\r
+<p class="whs12">&nbsp;</p>\r
 \r
-<p class="whs8">&nbsp;</p>\r
+<p class="whs4">&nbsp;</p>\r
 \r
-<p class="whs6"><img src="pics/pref33.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs12"></p>\r
+<p class="whs9">Representation Preferences</p>\r
 \r
-<p class="whs6">&nbsp;</p>\r
+<p class="whs9">&nbsp;</p>\r
+\r
+<p class="whs8"><img src="pics/pref33.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs16"></p>\r
+\r
+<p class="whs8">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
@@ -289,22 +375,27 @@ if (window.writeIntopicBar)
  the default representation type for each field presentation.</span><span \r
  style="margin-left: 40px; text-align: justify;"> </span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs7">Use \r
+       <li class=kadov-p><p class="whs4">Use \r
  Shading - <span style="font-weight: normal;">when this</span> <span style="font-weight: normal;">option \r
  is checked, the objects will be displayed with shading.</span></p></li>\r
+       \r
+       <li class=kadov-p><p class="whs4">Display \r
+ only on creation<span style="font-weight: normal;"> - when this option \r
+ is checked, all previously created presentations will be automatically \r
+ removed from the viewer when a new presentation is created and displayed. \r
+ You can restore the previously created presentations using the Object \r
+ Browser. </span></p></li>\r
 </ul>\r
 \r
-<p class="whs6">&nbsp;</p>\r
-\r
-<p class="whs6">&nbsp;</p>\r
+<p class="whs8">&nbsp;</p>\r
 \r
-<p class="whs6">Gauss Points Preferences</p>\r
+<p class="whs8">Gauss Points Preferences</p>\r
 \r
-<p class="whs13">&nbsp;</p>\r
+<p class="whs17">&nbsp;</p>\r
 \r
-<p class="whs6"><img src="pics/pref34.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
+<p class="whs8"><img src="pics/pref34.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
 \r
-<p class="whs13">&nbsp;</p>\r
+<p class="whs17">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
@@ -315,42 +406,42 @@ if (window.writeIntopicBar)
        \r
        <ul type="disc" class="whs3">\r
                \r
-               <li class=kadov-p><p class="whs14">Primitive type \r
+               <li class=kadov-p><p class="whs18">Primitive type \r
  - <span style="font-weight: normal;">provides choice between </span>Point \r
  sprites<span style="font-weight: normal;">, </span>Open GL points<span \r
  style="font-weight: normal;"> and </span>Geometrical Spheres<span style="font-weight: normal;">.</span></p></li>\r
                \r
-               <li class=kadov-p><p class="whs15"><span style="font-weight: bold;"><B>Maximum \r
+               <li class=kadov-p><p class="whs19"><span style="font-weight: bold;"><B>Maximum \r
  Size</B></span> <span style="font-weight: bold;"><B>(Clamp)</B></span> - defines \r
  the maximum size of sprite points ranging from 1 to 512. By default the \r
  value is set to 256 pixels. </p></li>\r
                \r
-               <li class=kadov-p><p class="whs14">Main Texture - \r
+               <li class=kadov-p><p class="whs18">Main Texture - \r
  &nbsp;<span style="font-weight: normal;">path \r
  to the </span>Main Texture<span style="font-weight: normal;"> (16x16 pixels) \r
  which defines the shape of the point sprite used for rendering.</span></p></li>\r
                \r
-               <li class=kadov-p><p class="whs10"><span \r
+               <li class=kadov-p><p class="whs12"><span \r
  style="font-weight: bold;"><B>Alpha Channel Texture (16*16) -</B></span> path \r
  to the <span style="font-weight: bold;"><B>Alpha Channel Texture</B></span> which \r
  defines the transparency of the point sprite.</p></li>\r
                \r
-               <li class=kadov-p><p class="whs14">Alpha Channel Threshold \r
+               <li class=kadov-p><p class="whs18">Alpha Channel Threshold \r
  - <span style="font-weight: normal;">defines the level of transparency \r
  ranging from 0 to 1.</span> </p></li>\r
                \r
-               <li class=kadov-p><p class="whs14">Geometrical Sphere \r
+               <li class=kadov-p><p class="whs18">Geometrical Sphere \r
  Resolution - <span style="font-weight: normal;">defines the number of \r
  faces of</span> Geometry Spheres.</p></li>\r
                \r
-               <li class=kadov-p><p class="whs14">Notify when number \r
+               <li class=kadov-p><p class="whs18">Notify when number \r
  of faces exceeds -<span style="font-weight: normal;"> limitation of the \r
  number of faces;</span> <span style="font-weight: normal;">the user will \r
  be warned if it exceeds the given value.</span></p></li>\r
        </ul>\r
 </ul>\r
 \r
-<p class="whs13">&nbsp;</p>\r
+<p class="whs17">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
@@ -360,13 +451,13 @@ if (window.writeIntopicBar)
 \r
 <ul type="disc" class="whs3">\r
        \r
-       <li class=kadov-p><p class="whs16">Range value for min \r
+       <li class=kadov-p><p class="whs20">Range value for min \r
  and max size - <span style="font-weight: normal;">these two parameters \r
  will be respectively multiplied by a reference length (average size of \r
  cells of the mesh) to define the range for minimum and maximum size of \r
  a point during rendering (at magnification = 100%). Default values are:</span></p></li>\r
        \r
-       <ol type="disc" class="whs17">\r
+       <ul type="disc" class="whs3">\r
                \r
                <ul type="disc" class="whs3">\r
                        \r
@@ -376,12 +467,12 @@ if (window.writeIntopicBar)
  scale: <span style="font-weight: bold;"><B>min = 10%</B></span>, <span style="font-weight: bold;"><B>max \r
  = 33%</B></span></p></li>\r
                        \r
-                       <ul type="square" class="whs18">\r
+                       <ul type="square" class="whs21">\r
                                \r
-                               <li class=kadov-p><p class="whs19">Min size \r
+                               <li class=kadov-p><p class="whs22">Min size \r
  is associated to the smallest real value (including negative values).</p></li>\r
                                \r
-                               <li class=kadov-p><p class="whs19">Max size \r
+                               <li class=kadov-p><p class="whs22">Max size \r
  is associated to the largest real value.</p></li>\r
                        </ul>\r
                        \r
@@ -391,32 +482,32 @@ if (window.writeIntopicBar)
  scale: <span style="font-weight: bold;"><B>min = 0</B></span> (not editable), \r
  <span style="font-weight: bold;"><B>max = 33%</B></span></p></li>\r
                        \r
-                       <ul type="square" class="whs18">\r
+                       <ul type="square" class="whs21">\r
                                \r
-                               <li class=kadov-p><p class="whs19">Null size \r
+                               <li class=kadov-p><p class="whs22">Null size \r
  is associated to the 0 scalar value.</p></li>\r
                                \r
-                               <li class=kadov-p><p class="whs19">Max size \r
+                               <li class=kadov-p><p class="whs22">Max size \r
  is associated to the largest absolute value.</p></li>\r
                        </ul>\r
                </ul>\r
-       </ol>\r
+       </ul>\r
 </ul>\r
 \r
-<p class="whs20">Both values are dynamically updated by the \r
+<p class="whs23">Both values are dynamically updated by the \r
  system according to the selected scalar bar. In the case of a <span style="font-weight: bold;"><B>Bicolor</B></span> \r
  scale, the minimum value is set to 0 in the dialog and the control is \r
  disabled.</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
-       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Magnification \r
+       <li class=kadov-p><p class="whs5"><span style="font-weight: bold;"><B>Magnification \r
  (%)</B></span> corresponds to the change of size of results at Gauss point \r
  primitives in 2D space. Acceptable values range from 0 to N; 100% means \r
  no magnification, 50% means half of its size, 200% mean twice its size \r
  and so forth. By default this value is set to 100%.</p></li>\r
        \r
-       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>+/- \r
+       <li class=kadov-p><p class="whs5"><span style="font-weight: bold;"><B>+/- \r
  Ratio</B></span> corresponds to the number by which the magnification will \r
  be respectively multiplied or divided at edition, ranging from 0.01 to \r
  10. By default this value is set to 2.</p></li>\r
@@ -428,62 +519,62 @@ if (window.writeIntopicBar)
        \r
        <li class=kadov-p><p class="whs1">Geometry </p></li>\r
        \r
-       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Size \r
+       <li class=kadov-p><p class="whs5"><span style="font-weight: bold;"><B>Size \r
  of points (%) </B></span>defines a value that will be multiplied by a reference \r
  length (representative of the average size of cells of the mesh) to define \r
  the size of points during rendering (at magnification = 100%). Default \r
  values 10%.</p></li>\r
        \r
-       <li class=kadov-p><p class="whs13">Background \r
+       <li class=kadov-p><p class="whs17">Background \r
  Color - <span style="font-weight: normal;">&nbsp;allows \r
  to select the color of points used for presentations. Click on the colored \r
  line to access to the </span><a href="select_color_and_font.htm">Select \r
  Color</a><span style="font-weight: normal;"> dialog box. </span></p></li>\r
 </ul>\r
 \r
-<p class="whs14">&nbsp;</p>\r
+<p class="whs18">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
        <li class=kadov-p><p class="whs1">Gauss Points Scalar \r
  Bar</p></li>\r
        \r
-       <li class=kadov-p><p class="whs7">Active \r
+       <li class=kadov-p><p class="whs4">Active \r
  Bar - <span style="font-weight: normal;">this option allows to choose</span> \r
  Local<span style="font-weight: normal;"> or</span> Global <span style="font-weight: normal;">Bar \r
  as active.</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs7">Display \r
+       <li class=kadov-p><p class="whs4">Display \r
  Global Bar - <span style="font-weight: normal;">this option allows to \r
  visualize or to hide the Global Bar.</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs7">Scalar \r
+       <li class=kadov-p><p class="whs4">Scalar \r
  Bar Mode - <span style="font-weight: normal;">this option allows to choose</span> \r
  <span style="font-weight: normal;">between</span> Bicolor <span style="font-weight: normal;">and</span> \r
  Rainbow <span style="font-weight: normal;">Scalar Bar Mode.</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs7">Spacing \r
+       <li class=kadov-p><p class="whs4">Spacing \r
  - <span style="font-weight: normal;">allows to define Spacing from 0.01 \r
  to 1.</span></p></li>\r
 </ul>\r
 \r
-<p class="whs14">&nbsp;</p>\r
+<p class="whs18">&nbsp;</p>\r
 \r
-<p class="whs6">Inside <span style="font-weight: normal;">and</span> \r
+<p class="whs8">Inside <span style="font-weight: normal;">and</span> \r
  Outside Cursor Preferences<span style="font-weight: normal;"> allow to \r
  set</span> Primitives, Size<span style="font-weight: normal;"> and</span> \r
  Magnification<span style="font-weight: normal;"> for the respective zones.</span> \r
  &nbsp;</p>\r
 \r
-<p class="whs6">&nbsp;</p>\r
+<p class="whs8">&nbsp;</p>\r
 \r
-<p class="whs21">Picking Preferences</p>\r
+<p class="whs24">Picking Preferences</p>\r
 \r
-<p class="whs21">&nbsp;</p>\r
+<p class="whs24">&nbsp;</p>\r
 \r
-<p class="whs21"><img src="pics/pref37.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
+<p class="whs24"><img src="pics/pref37.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
 \r
-<p class="whs5">&nbsp;</p>\r
+<p class="whs7">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
@@ -501,44 +592,44 @@ if (window.writeIntopicBar)
  (from 0% = opaque to 100% = transparent) and <span style="font-weight: bold;"><B>Position</B></span> \r
  of the window, which can be: </p></li>\r
        \r
-       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Centred \r
+       <li class=kadov-p><p class="whs5"><span style="font-weight: bold;"><B>Centred \r
  below the point</B></span>, or</p></li>\r
        \r
-       <li class=kadov-p><p class="whs11">located at <span style="font-weight: bold;"><B>Top-left \r
+       <li class=kadov-p><p class="whs5">located at <span style="font-weight: bold;"><B>Top-left \r
  corner of the 3D view</B></span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs8">Movement \r
+       <li class=kadov-p><p class="whs9">Movement \r
  of the Camera <span style="font-weight: normal;">can also be define by \r
  the user. </span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs11"><span style="font-weight: bold;"><B>Zoom \r
+       <li class=kadov-p><p class="whs5"><span style="font-weight: bold;"><B>Zoom \r
  at first selected point -</B></span> This value is used to define the focal \r
  distance at the first selected point (at the end of the movement of the \r
  camera). This value is a ratio that will be multiplied by the current \r
  zoom value.</p></li>\r
        \r
-       <li class=kadov-p><p class="whs9">Number \r
+       <li class=kadov-p><p class="whs10">Number \r
  of steps between two positions - <span style="font-weight: normal;">defines \r
  the smoothness of camera movement at selection by the number of iterations. \r
  If set to 1 the camera is zoomed and centered at the point momentarily. \r
  Greater numbers mean very slow camera movement.</span> &nbsp;&nbsp;</p></li>\r
        \r
-       <li class=kadov-p><p class="whs6">Display \r
+       <li class=kadov-p><p class="whs8">Display \r
  parent mesh element - <span style="font-weight: normal;">allows to visualize \r
  or hide the patent mesh element of the selected gauss point.</span> </p></li>\r
 </ul>\r
 \r
-<p class="whs16">&nbsp;</p>\r
+<p class="whs20">&nbsp;</p>\r
 \r
-<p class="whs21">Navigation Preferences</p>\r
+<p class="whs24">Navigation Preferences</p>\r
 \r
-<p class="whs16">&nbsp;</p>\r
+<p class="whs20">&nbsp;</p>\r
 \r
-<p class="whs21"><img src="pics/pref38.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
+<p class="whs24"><img src="pics/pref38.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
 \r
-<p class="whs22">&nbsp;</p>\r
+<p class="whs25">&nbsp;</p>\r
 \r
-<p class="whs13">&nbsp;</p>\r
+<p class="whs17">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
@@ -547,18 +638,18 @@ if (window.writeIntopicBar)
 \r
 <ul type="disc" class="whs3">\r
        \r
-       <li class=kadov-p><p class="whs16">Mouse Behaviour - <span \r
+       <li class=kadov-p><p class="whs20">Mouse Behaviour - <span \r
  style="font-weight: normal;">this option allows to choose one of the modes \r
  of work with mouse in Gauss Viewer. </span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs23">Salome Standard Controls \r
+       <li class=kadov-p><p class="whs26">Salome Standard Controls \r
  - <span style="font-weight: normal;">allows to manipulate objects in the \r
  viewer with the mouse and locked Ctrl button: increase or decrease the \r
  zoom ratio with the left mouse button, translate object in any direction \r
  with the central mouse button or rotate it with the right mouse button. \r
  </span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs23">Keyboard Free - <span \r
+       <li class=kadov-p><p class="whs26">Keyboard Free - <span \r
  style="font-weight: normal;">allows to manipulate objects in the viewer \r
  with the mouse without locking Ctrl button</span>. <span style="font-weight: normal;">In \r
  this case the operations are assigned to the buttons differently: rotation \r
@@ -566,7 +657,7 @@ if (window.writeIntopicBar)
  both pressed in the same time.</span> &nbsp;&nbsp;</p></li>\r
 </ul>\r
 \r
-<p class="whs13">&nbsp;</p>\r
+<p class="whs17">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
@@ -575,13 +666,13 @@ if (window.writeIntopicBar)
 \r
 <ul type="disc" class="whs3">\r
        \r
-       <li class=kadov-p><p class="whs16">[+]/[-] Speed Increment \r
+       <li class=kadov-p><p class="whs20">[+]/[-] Speed Increment \r
  - <span style="font-weight: normal;">defines the number of units by which \r
  the speed increases or respectively decreases after pressing [+] or [-] \r
  keyboard buttons.</span></p></li>\r
 </ul>\r
 \r
-<p class="whs13">&nbsp;</p>\r
+<p class="whs17">&nbsp;</p>\r
 \r
 <ul type="disc" class="whs3">\r
        \r
@@ -593,36 +684,36 @@ if (window.writeIntopicBar)
 \r
 <ul type="disc" class="whs3">\r
        \r
-       <li class=kadov-p><p class="whs16">Decrease Speed Increment \r
+       <li class=kadov-p><p class="whs20">Decrease Speed Increment \r
  - <span style="font-weight: normal;">decreases by 1 the speed increment \r
  used for the keyboard (same as [-] key).</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs16">Increase Speed Increment \r
+       <li class=kadov-p><p class="whs20">Increase Speed Increment \r
  - <span style="font-weight: normal;">increase by 1 the speed increment \r
  used for the keyboard (same as [+] key).</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs16">Decrease Gauss Points \r
+       <li class=kadov-p><p class="whs20">Decrease Gauss Points \r
  Magnification - <span style="font-weight: normal;">divides the current \r
  magnification by the magnification ratio.</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs16">Increase Gauss Points \r
+       <li class=kadov-p><p class="whs20">Increase Gauss Points \r
  Magnification -<span style="font-weight: normal;"> multiplies the current \r
  magnification by the magnification ratio.</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs16">Dominant / combined \r
+       <li class=kadov-p><p class="whs20">Dominant / combined \r
  switch -<span style="font-weight: normal;"> toggles button to switch to \r
  dominant or combined movements.</span></p></li>\r
 </ul>\r
 \r
-<p class="whs16">&nbsp;</p>\r
+<p class="whs20">&nbsp;</p>\r
 \r
-<p class="whs16">&nbsp;</p>\r
+<p class="whs20">&nbsp;</p>\r
 \r
-<p class="whs21">Recorder Preferences</p>\r
+<p class="whs24">Recorder Preferences</p>\r
 \r
-<p class="whs21">&nbsp;</p>\r
+<p class="whs24">&nbsp;</p>\r
 \r
-<p class="whs21"><img src="pics/pref39.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
+<p class="whs24"><img src="pics/pref39.png" x-maintain-ratio="TRUE" width="752px" height="646px" border="0" class="img_whs2"></p>\r
 \r
 <p class="whs1">&nbsp;</p>\r
 \r
@@ -633,37 +724,37 @@ if (window.writeIntopicBar)
 \r
 <ul type="disc" class="whs3">\r
        \r
-       <li class=kadov-p><p class="whs16">Mode - <span style="font-weight: normal;">allows \r
+       <li class=kadov-p><p class="whs20">Mode - <span style="font-weight: normal;">allows \r
  to choose from</span> <span style="font-weight: normal;">two recording \r
  regimes:</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs23">Recording all displayed \r
+       <li class=kadov-p><p class="whs26">Recording all displayed \r
  frames - <span style="font-weight: normal;">records exactly at the FPS \r
  rate specified by the user.</span> &nbsp;</p></li>\r
        \r
-       <li class=kadov-p><p class="whs23">Recording at a given \r
+       <li class=kadov-p><p class="whs26">Recording at a given \r
  FPS - <span style="font-weight: normal;">records only when the contents \r
  of the viewer change (some activity is performed). &nbsp;In \r
  the AVI file non-recorded images are substituted with the copies of the \r
  latest recorded image, which produces files with lower quality but requires \r
  less system resources.</span> &nbsp;</p></li>\r
        \r
-       <li class=kadov-p><p class="whs16">FPS - <span style="font-weight: normal;">allows \r
+       <li class=kadov-p><p class="whs20">FPS - <span style="font-weight: normal;">allows \r
  to define the FPS (frames per second) rate for the clip. Set greater value \r
  for better quality. &nbsp;</span></p></li>\r
        \r
-       <li class=kadov-p><p class="whs16">Quality - <span style="font-weight: normal;">allows \r
+       <li class=kadov-p><p class="whs20">Quality - <span style="font-weight: normal;">allows \r
  to set the quality of the clip in the interval between 0 and 100.</span> \r
  </p></li>\r
        \r
-       <li class=kadov-p><p class="whs16">Progressive - <span \r
+       <li class=kadov-p><p class="whs20">Progressive - <span \r
  style="font-weight: normal;">allows to record a progressive API file.</span> \r
  </p></li>\r
 </ul>\r
 \r
-<p class="whs16">&nbsp;</p>\r
+<p class="whs20">&nbsp;</p>\r
 \r
-<p class="whs16">&nbsp;</p>\r
+<p class="whs20">&nbsp;</p>\r
 \r
 <p>&nbsp;</p>\r
 \r
index 1ba2eca28870d38b00926919445e873729dc0d7d..1e43a09c2f80427d80e154e552661e4cf9596317 100644 (file)
Binary files a/resources/copy.png and b/resources/copy.png differ
index e57336285ea67f393322fd6f19a64d9d1de42e53..452b45f62a547640e2a9de3ad3870bbdcf8c0a44 100644 (file)
Binary files a/resources/help.png and b/resources/help.png differ
index d86ece38be776c9ad1efa18546100571bf7a0507..c7446259534a83a6e06232c80c732b459919cd15 100644 (file)
Binary files a/resources/paste.png and b/resources/paste.png differ
index 9a70952a1d50e98e939168a3274bfb841e63455e..c09ff94ad89b32483194de03275ece8844f985da 100644 (file)
Binary files a/resources/plot2d_fitall.png and b/resources/plot2d_fitall.png differ
index f54ae77833d0bc017682149abe77dc2b7209a64c..5b79594e709379eb5835258d8afaf6dd36951a02 100644 (file)
Binary files a/resources/plot2d_fitarea.png and b/resources/plot2d_fitarea.png differ
index 786d9cb3efdda8f07541563d690f40fa79caa622..038fba118736ff3732a97e0e62ea4420022560ff 100644 (file)
Binary files a/resources/plot2d_pan.png and b/resources/plot2d_pan.png differ
index 35e185b066cccc19bc9688fc33d9fcd46d176fb4..b46573914ded57ddbdbd0fdfdeca02dbe772beca 100644 (file)
Binary files a/resources/plot2d_zoom.png and b/resources/plot2d_zoom.png differ
index 9b37b334795b8786ddfe0982a41c59ea0199193e..511cad9e38edaa9111aa49448f271e3dbe33b8fd 100755 (executable)
@@ -87,10 +87,13 @@ CAM_Module::~CAM_Module()
 void CAM_Module::initialize( CAM_Application* app )
 {
   myApp = app;
-  if (myApp) {
+  if ( myApp )
+  {
     SUIT_Session* aSession = SUIT_Session::session();
-    connect(aSession, SIGNAL( applicationClosed( SUIT_Application* ) ),
-            this, SLOT( onApplicationClosed( SUIT_Application* ) ));
+    connect( aSession, SIGNAL( applicationClosed( SUIT_Application* ) ),
+             this, SLOT( onApplicationClosed( SUIT_Application* ) ) );
+
+    connect( myApp, SIGNAL( infoChanged( QString ) ), this, SLOT( onInfoChanged( QString ) ) );
   }
 }
 
@@ -167,6 +170,38 @@ void CAM_Module::studyChanged( SUIT_Study* , SUIT_Study* )
 {
 }
 
+/*!Return true if module is active.*/
+bool CAM_Module::isActiveModule() const
+{
+  return application() ? application()->activeModule() == this : false;
+}
+
+/*!
+  Put the message into the status bar of the desktop. Message will be displayed
+  during specified \amscec milliseconds. If parameter \amsec is negative then
+  message will be persistently displayed when module is active.
+*/
+void CAM_Module::putInfo( const QString& msg, const int msec )
+{
+  if ( application() )
+    application()->putInfo( msg, msec );
+
+  if ( msec < 0 )
+    myInfo = msg;
+}
+
+/*!
+  Restore persistently displayed info string when previos information status string erasing
+  if module is active.
+*/
+void CAM_Module::onInfoChanged( QString txt )
+{
+  if ( txt.isEmpty() && isActiveModule() && !myInfo.isEmpty() && application() )
+    application()->putInfo( myInfo );
+}
+
+
+
 /*!Public slot, nullify application pointer if the application was closed.*/
 void CAM_Module::onApplicationClosed( SUIT_Application* theApp )
 {
@@ -640,10 +675,10 @@ void CAM_Module::connectToStudy( CAM_Study* camStudy )
     CAM_DataModel* dm = it.current()->dataModel();
     if( it.current() == this && !camStudy->containsDataModel( dm ) )
     {
-      if( prev )
-       camStudy->insertDataModel( it.current()->dataModel(), prev );
+      if ( prev )
+             camStudy->insertDataModel( it.current()->dataModel(), prev );
       else
-       camStudy->insertDataModel( it.current()->dataModel(), 0 );
+             camStudy->insertDataModel( it.current()->dataModel(), 0 );
     }
     prev = dm;
   }
index 3409905e764e985401eb90cee97e9d4362754677..df9282a410f7df1e0c051fa603df0d67034112f3 100755 (executable)
@@ -64,6 +64,10 @@ public:
   virtual void           contextMenuPopup( const QString&, QPopupMenu*, QString& title ) {};
   virtual void           updateCommandsStatus() {};
 
+  virtual void           putInfo( const QString&, const int = -1 );
+
+  bool                   isActiveModule() const;
+
   /** @name Set Menu Shown*/
   //@{
   virtual void           setMenuShown( const bool );
@@ -89,6 +93,9 @@ public slots:
 
   virtual void           onApplicationClosed( SUIT_Application* );
 
+private slots:
+  void                   onInfoChanged( QString );
+
 protected: 
   virtual CAM_DataModel* createDataModel();
 
@@ -136,6 +143,7 @@ private:
   CAM_Application*       myApp;
   QString                myName;
   QPixmap                myIcon;
+  QString                myInfo;
   CAM_DataModel*         myDataModel;
   QMap<int, QAction*>    myActionMap;
 
@@ -146,7 +154,8 @@ private:
 #pragma warning( default: 4251 )
 #endif
 
-extern "C" {
+extern "C"
+{
   typedef CAM_Module* (*GET_MODULE_FUNC)();
 }
 
index d874e5a3fe2d4f0c6fce4b7892eceb73f854f49f..65ded03258e30ec307ebefe96c29becdd47f492d 100755 (executable)
@@ -127,10 +127,8 @@ void CAM_Study::dataModelInserted( const CAM_DataModel* dModel )
     openDataModel( studyName(), dm );
   else // no, just need to update data model's connection to study tree 
        //(some application may want to show model's root in a study tree even if a model is empty)
-  {
     dm->create( this );
-    updateModelRoot( dm );
-  }
+  updateModelRoot( dm );
 }
 
 /*! \retval false*/
index 4ecf18b3eb27cc96661cdf0a062e4ddc6be566c0..56197a523ef7287e5b20ad17b4a6786854a892fe 100644 (file)
 IMPLEMENT_STANDARD_HANDLE(DDS_DicGroup, MMgt_TShared)
 IMPLEMENT_STANDARD_RTTIEXT(DDS_DicGroup, MMgt_TShared)
 
+/*!
+  \class DDS_DicGroup
+  
+  This class to provide set of DDS_DicItem objects from one component.
+*/
+
+/*!
+  Constructor. Create the group with name \aname.
+*/
 DDS_DicGroup::DDS_DicGroup( const TCollection_AsciiString& name )
 : MMgt_TShared(),
 myName( name ),
@@ -40,15 +49,25 @@ myActiveSystem( UNIT_SYSTEM_SI )
 {
 }
 
+/*!
+  Copy constructor.
+*/
 DDS_DicGroup::DDS_DicGroup( const DDS_DicGroup& )
 {
 }
 
+/*!
+  Get the name of group (component).
+*/
 TCollection_AsciiString DDS_DicGroup::GetName() const
 {
   return myName;
 }
 
+/*!
+  Returns the names list of defined unit systems.
+  Parameter \atheSystems will contains the sequence of string names.
+*/
 void DDS_DicGroup::GetUnitSystems( TColStd_SequenceOfAsciiString& theSystemSeq ) const
 {
   theSystemSeq.Clear();
@@ -61,6 +80,9 @@ void DDS_DicGroup::GetUnitSystems( TColStd_SequenceOfAsciiString& theSystemSeq )
   }
 }
 
+/*!
+  Returns the label of unit system \aname. If unit system not found then empty string returned.
+*/
 TCollection_ExtendedString DDS_DicGroup::GetUnitSystemLabel( const TCollection_AsciiString& name ) const
 {
   TCollection_ExtendedString aLabel;
@@ -69,21 +91,33 @@ TCollection_ExtendedString DDS_DicGroup::GetUnitSystemLabel( const TCollection_A
   return aLabel;
 }
 
+/*!
+  Gets the name of active unit system.
+*/
 TCollection_AsciiString DDS_DicGroup::GetActiveUnitSystem() const
 {
   return myActiveSystem;
 }
 
+/*!
+  Sets the name of active unit system.
+*/
 void DDS_DicGroup::SetActiveUnitSystem( const TCollection_AsciiString& theSystem )
 {
   if ( myUnitSystem.IsBound( theSystem ) )
     myActiveSystem = theSystem;
 }
 
+/*!
+  Assignment operator.
+*/
 void DDS_DicGroup::operator=( const DDS_DicGroup& )
 {
 }
 
+/*!
+  Fill the internal data structures from XML parsed structures. Internal.
+*/
 void DDS_DicGroup::FillDataMap( const LDOM_Element& theComponentData, const LDOM_Element& theDocElement )
 {
   TCollection_AsciiString aCompName = theComponentData.getAttribute( DDS_Dictionary::KeyWord( "COMPONENT_NAME" ) );
@@ -140,9 +174,9 @@ void DDS_DicGroup::FillDataMap( const LDOM_Element& theComponentData, const LDOM
 }
 
 /*!
-  Returns DicItem with all attached data
+  Gets dictionary item with specified identifier \atheID.
+  If dictionary item not found then null handle returned.
 */
-
 Handle(DDS_DicItem) DDS_DicGroup::GetDicItem( const TCollection_AsciiString& theID ) const
 {
   Handle(DDS_DicItem) aDicItem;
index 1582aab3f881eacebac7058b645864a8fd52c788..02cdefb9371abffec57ce051ac95f8788ed9ddeb 100644 (file)
 IMPLEMENT_STANDARD_HANDLE(DDS_DicItem, MMgt_TShared)
 IMPLEMENT_STANDARD_RTTIEXT(DDS_DicItem, MMgt_TShared)
 
+/*!
+  \class DDS_DicItem
+
+  This class to provide information about datum (phisical characteristic parameter).
+*/
+
+/*!
+  Constructor. Creates the instance of empty dictionary item.
+*/
 DDS_DicItem::DDS_DicItem()
 : myType( 0 ),
 myDefValue( 0 ),
@@ -46,54 +55,87 @@ myZoomOrder( 2 )
 {
 }
 
+/*!
+  Copy constructor. Internal.
+*/
 DDS_DicItem::DDS_DicItem( const DDS_DicItem& )
 {
 }
 
+/*!
+  Assignment operator. Internal.
+*/
 void DDS_DicItem::operator=( const DDS_DicItem& )
 {
 }
 
+/*!
+  Gets the identifier of parameter.
+*/
 TCollection_AsciiString DDS_DicItem::GetId() const
 {
   return myId;
 }
 
+/*!
+  Gets the type of parameter.
+*/
 DDS_DicItem::Type DDS_DicItem::GetType() const
 {
   return (DDS_DicItem::Type)myType;
 }
 
+/*!
+  Gets the label of the parameter.
+*/
 TCollection_ExtendedString DDS_DicItem::GetLabel() const
 {
   return myLabel;
 }
 
+/*!
+  Gets the filter (regular expression) for the parameter values.
+*/
 TCollection_ExtendedString DDS_DicItem::GetFilter() const
 {
   return myFilter;
 }
 
+/*!
+  Gets the Required attribute of the parameter.
+*/
 TCollection_ExtendedString DDS_DicItem::GetRequired() const
 {
   return myRequired;
 }
 
+/*!
+  Gets the wrong value warning level of the parameter.
+*/
 DDS_MsgType DDS_DicItem::GetWarningLevel() const
 {
   return (DDS_MsgType)myWarnLevel;
 }
 
+/*!
+  Gets the long description of the parameter.
+*/
 TCollection_ExtendedString DDS_DicItem::GetLongDescription() const
 {
   return myLongDescr;
 }
 
+/*!
+  Gets the short description of the parameter.
+*/
 TCollection_ExtendedString DDS_DicItem::GetShortDescription() const
 {
   return myShortDescr;
 }
 
+/*!
+  Gets the name of component - owner of parameter.
+*/
 TCollection_AsciiString DDS_DicItem::GetComponent() const
 {
   TCollection_AsciiString aCompName;
@@ -103,11 +145,18 @@ TCollection_AsciiString DDS_DicItem::GetComponent() const
   return aCompName;
 }
 
+/*!
+  Gets the parameter unit of measure for active unit system.
+*/
 TCollection_AsciiString DDS_DicItem::GetUnits() const
 {
   return GetUnits( GetActiveUnitSystem() );
 }
 
+/*!
+  Gets the parameter unit of measure for specified unit system \atheSystem.
+  If specified unit system doesn't exist then empty string returned.
+*/
 TCollection_AsciiString DDS_DicItem::GetUnits( const UnitSystem& theSystem ) const
 {
   TCollection_AsciiString anUnits;
@@ -117,31 +166,54 @@ TCollection_AsciiString DDS_DicItem::GetUnits( const UnitSystem& theSystem ) con
   return anUnits;
 }
 
+/*!
+  Gets the minimum value of parameter for active unit system.
+  Returned value converted to SI.
+*/
 Standard_Real DDS_DicItem::GetMinValue() const
 {
   return GetMinValue( GetActiveUnitSystem() );
 }
 
+/*!
+  Gets the minimum value of parameter for specified unit system \atheSystem.
+  Returned value converted to SI.
+*/
 Standard_Real DDS_DicItem::GetMinValue( const UnitSystem& theUnitsSystem ) const
 {
   return FromSI( myMin, theUnitsSystem );
 }
 
+/*!
+  Gets the maximum value of parameter for active unit system.
+  Returned value converted to SI.
+*/
 Standard_Real DDS_DicItem::GetMaxValue() const
 {
   return GetMaxValue( GetActiveUnitSystem() );
 }
 
+/*!
+  Gets the maximum value of parameter for specified unit system \atheSystem.
+  Returned value converted to SI.
+*/
 Standard_Real DDS_DicItem::GetMaxValue( const UnitSystem& theUnitsSystem ) const
 {
   return FromSI( myMax, theUnitsSystem );
 }
 
+/*!
+  Gets the precision (number of digit after decimal point) of parameter for active unit system.
+*/
 Standard_Integer DDS_DicItem::GetPrecision() const
 {
   return GetPrecision( GetActiveUnitSystem() );
 }
 
+/*!
+  Gets the precision (number of digit after decimal point) of parameter for specified
+  unit system \atheSystem. If specified unit system doesn't exist then zero returned.
+*/
 Standard_Integer DDS_DicItem::GetPrecision( const UnitSystem& theSystem ) const
 {
   Standard_Integer aRes = 0;
@@ -151,11 +223,21 @@ Standard_Integer DDS_DicItem::GetPrecision( const UnitSystem& theSystem ) const
   return aRes;
 }
 
+/*!
+  Gets the default value of parameter for active unit system. Default value returned as string.
+  If type of value is numeric (Float or Integer) and default value defined then returned number
+  converted to SI.
+*/
 TCollection_ExtendedString DDS_DicItem::GetDefaultValue() const
 {
   return GetDefaultValue( GetActiveUnitSystem() );
 }
 
+/*!
+  Gets the default value of parameter for specified unit system \atheSystem. Default value returned
+  as string. If type of value is numeric (Float or Integer) and default value defined then returned
+  number converted to SI.
+*/
 TCollection_ExtendedString DDS_DicItem::GetDefaultValue( const UnitSystem& theSystem ) const
 {
   if ( !myDefString.Length() )
@@ -179,11 +261,21 @@ TCollection_ExtendedString DDS_DicItem::GetDefaultValue( const UnitSystem& theSy
   return aStr;
 }
 
+/*!
+  Gets the format string of parameter for active unit system. If argument \atheCanonical
+  is true then format string will be reduced to sprintf() specification (without extra
+  non standard qualifiers).
+*/
 TCollection_AsciiString DDS_DicItem::GetFormat( const Standard_Boolean theCanonical ) const
 {
   return GetFormat( GetActiveUnitSystem(), theCanonical );
 }
 
+/*!
+  Gets the format string of parameter for specified unit system \atheSystem. If argument
+  \atheCanonical is true then format string will be reduced to sprintf() specification
+  (without extra non standard qualifiers).
+*/
 TCollection_AsciiString DDS_DicItem::GetFormat( const UnitSystem& theSystem,
                                                 const Standard_Boolean theCanonical ) const
 {
@@ -212,8 +304,8 @@ TCollection_AsciiString DDS_DicItem::GetFormat( const UnitSystem& theSystem,
 }
 
 /*!
-  Access valueList:name of the parameter. This string is void if the list is
-  not defined - then use other properties: Type, DefaultValue, MaxValue, MinValue
+  Gets name of a list referenced by the parameter. This string is empty if the list
+  refernce is not defined - then use other properties: Type, DefaultValue, MaxValue, MinValue
 */
 TCollection_ExtendedString DDS_DicItem::GetNameOfValues() const
 {
@@ -221,8 +313,8 @@ TCollection_ExtendedString DDS_DicItem::GetNameOfValues() const
 }
 
 /*!
-  Access valueList of the parameter. This sequence is empty if the list is
-  not defined - then use other properties: Type, DefaultValue, MaxValue, MinValue
+  Gets item names and item ids of a list referenced by the parameter. This sequences is empty if
+  the list reference is not defined - then use other properties: Type, DefaultValue, MaxValue, MinValue
 */
 Standard_Boolean DDS_DicItem::GetListOfValues( Handle(TColStd_HArray1OfExtendedString)& theStrings,
                                                Handle(TColStd_HArray1OfInteger)& theIntegers ) const
@@ -233,8 +325,8 @@ Standard_Boolean DDS_DicItem::GetListOfValues( Handle(TColStd_HArray1OfExtendedS
 }
 
 /*!
-  Access valueList of the parameter. This sequence is empty if the list is not
-  defined - then use other properties: Type, DefaultValue, MaxValue, MinValue
+  Gets item names, item ids and item icons of a list referenced by the parameter. This sequences is empty
+  if the list reference is not defined - then use other properties: Type, DefaultValue, MaxValue, MinValue
 */
 Standard_Boolean DDS_DicItem::GetListOfValues( Handle(TColStd_HArray1OfExtendedString)& theStrings,
                                                Handle(TColStd_HArray1OfInteger)& theIntegers,
@@ -246,6 +338,10 @@ Standard_Boolean DDS_DicItem::GetListOfValues( Handle(TColStd_HArray1OfExtendedS
   return !theIntegers.IsNull() && !theStrings.IsNull() && !theIcons.IsNull();
 }
 
+
+/*!
+  Gets special values of the parameter.
+*/
 Standard_Boolean DDS_DicItem::GetSpecialValues( TColStd_MapOfReal& theMap ) const
 {
   theMap.Clear();
@@ -266,7 +362,7 @@ Standard_Boolean DDS_DicItem::GetSpecialValues( TColStd_MapOfReal& theMap ) cons
 }
 
 /*!
-  Returns min value of lateral zooming
+  Gets minimum value of lateral zooming
 */
 Standard_Real DDS_DicItem::GetMinZoom() const
 {
@@ -274,7 +370,7 @@ Standard_Real DDS_DicItem::GetMinZoom() const
 }
 
 /*!
-  Returns Max Value of lateral zooming
+  Gets maximum value of lateral zooming
 */
 Standard_Real DDS_DicItem::GetMaxZoom() const
 {
@@ -282,25 +378,31 @@ Standard_Real DDS_DicItem::GetMaxZoom() const
 }
 
 /*!
-  Get Order of lateral zooming
+  Gets order of lateral zooming
 */
 Standard_Real DDS_DicItem::GetZoomOrder() const
 {
   return myZoomOrder;
 }
 
+/*!
+  Convert value \atheVal to default SI units according to active unit system.
+*/
 Standard_Real DDS_DicItem::ToSI( const Standard_Real theVal ) const
 {
   return ToSI( theVal, GetActiveUnitSystem() );
 }
 
+/*!
+  Convert value \atheVal from default SI units according to active unit system.
+*/
 Standard_Real DDS_DicItem::FromSI( const Standard_Real theVal ) const
 {
   return FromSI( theVal, GetActiveUnitSystem() );
 }
 
 /*!
-  Convert value to default SI units according to current units
+  Convert value to default SI units according to unit system \atheUnitsSystem.
 */
 Standard_Real DDS_DicItem::ToSI( const Standard_Real theVal, const UnitSystem& theUnitsSystem ) const
 {
@@ -312,7 +414,7 @@ Standard_Real DDS_DicItem::ToSI( const Standard_Real theVal, const UnitSystem& t
 }
 
 /*!
-  Convert value from default SI units according to current units
+  Convert value from default SI units according to unit system \atheUnitsSystem.
 */
 Standard_Real DDS_DicItem::FromSI( const Standard_Real theVal, const UnitSystem& theUnitsSystem ) const
 {
@@ -324,7 +426,7 @@ Standard_Real DDS_DicItem::FromSI( const Standard_Real theVal, const UnitSystem&
 }
 
 /*!
-  Returns 'true' if specified data exist.
+  Returns 'true' if data specified by \aflag exist.
 */
 Standard_Boolean DDS_DicItem::HasData( const Standard_Integer flag ) const
 {
@@ -332,7 +434,33 @@ Standard_Boolean DDS_DicItem::HasData( const Standard_Integer flag ) const
 }
 
 /*!
-  Parse record in XML file and retrieve information relevant for this data dic item
+  Returns options for specified name \aname. If option not found then empty string returned.
+*/
+TCollection_ExtendedString DDS_DicItem::GetOption( const TCollection_AsciiString& name ) const
+{
+  TCollection_ExtendedString res;
+  if ( myOptions.IsBound( name ) )
+    res = myOptions.Find( name );
+  return res;
+}
+
+/*!
+  Returns names list of existing options in the specified sequence \anames.
+  If list not empty retunrs 'true' otherwise 'false'.
+*/
+Standard_Boolean DDS_DicItem::GetOptionNames( TColStd_SequenceOfAsciiString& names ) const
+{
+  names.Clear();
+
+  for ( OptionsMap::Iterator it( myOptions ); it.More(); it.Next() )
+    names.Append( it.Key() );
+
+  return !names.IsEmpty();
+}
+
+
+/*!
+  Parse record in XML file and retrieve information relevant for this dictionary item
 */
 void DDS_DicItem::FillDataMap( TCollection_AsciiString theID, const LDOM_Element& theDatum,
                                const LDOM_Element& theCompElement, const LDOM_Element& theDocElement,
@@ -576,6 +704,31 @@ void DDS_DicItem::FillDataMap( TCollection_AsciiString theID, const LDOM_Element
     }
   }
 
+  // Quantity::Options
+  LDOM_Element anOpt = theDatum.GetChildByTagName( DDS_Dictionary::KeyWord( "OPTIONS" ) );
+  if ( !anOpt.isNull() )
+  {
+    LDOM_NodeList anOptions = anOpt.getElementsByTagName( DDS_Dictionary::KeyWord( "OPTION" ) );
+    for ( Standard_Integer oi = 0; oi < anOptions.getLength(); oi++ )
+    {
+      LDOM_Node node = anOptions.item( oi );
+      if ( node.getNodeType() != LDOM_Node::ELEMENT_NODE )
+        continue;
+
+      LDOM_Element& elem = (LDOM_Element&)node;
+      TCollection_AsciiString name = elem.getAttribute( DDS_Dictionary::KeyWord( "OPTION_NAME" ) );
+
+      TCollection_ExtendedString value;
+      const LDOM_Text& aText = (const LDOM_Text&)elem.getFirstChild();
+      LDOM_Text anOptTxt( aText );
+      if ( !anOptTxt.isNull() )
+        value = anOptTxt.getData();
+
+      if ( !name.IsEmpty() && value.Length() && !myOptions.IsBound( name ) )
+        myOptions.Bind( name, value );
+    }
+  }
+
   NCollection_DataMap<UnitSystem, Handle(Units_Dimensions)> aDimMap;
 
   for ( NCollection_DataMap<UnitSystem, UnitData>::Iterator it( myUnitData ); it.More(); it.Next() )
@@ -793,7 +946,7 @@ void DDS_DicItem::GetFloatFormat( const TCollection_AsciiString& theFlags,
 }
 
 /*!
-  Prepares three formants for each unit systems
+  Prepares formats for each unit systems
 */
 void DDS_DicItem::PrepareFormats( const TCollection_AsciiString&  theFormat )
 {
@@ -915,6 +1068,9 @@ void DDS_DicItem::PrepareFormats( const TCollection_AsciiString&  theFormat )
   }
 }
 
+/*!
+  Split the string \atheStr by spaces and returns substrings in array \aaRes.
+*/
 void DDS_DicItem::Split( const TCollection_AsciiString& theStr, Handle(TColStd_HArray1OfExtendedString)& aRes )
 {
   aRes.Nullify();
@@ -946,6 +1102,9 @@ void DDS_DicItem::Split( const TCollection_AsciiString& theStr, Handle(TColStd_H
   }
 }
 
+/*!
+  Returns unit structure for given unit system \asys.
+*/
 DDS_DicItem::UnitData* DDS_DicItem::GetUnitData( const UnitSystem& sys ) const
 {
   UnitData* unit = 0;
@@ -956,6 +1115,9 @@ DDS_DicItem::UnitData* DDS_DicItem::GetUnitData( const UnitSystem& sys ) const
   return unit;
 }
 
+/*!
+  Gets the active unit system.
+*/
 DDS_DicItem::UnitSystem DDS_DicItem::GetActiveUnitSystem() const
 {
   UnitSystem aSystem;
index 36b30811e5cf1d6ca317b1d48fd1031b9b1f4fa0..b326399002c7ed99237cb63f0c69b5ae9d68d58d 100644 (file)
@@ -47,8 +47,23 @@ class TColStd_SequenceOfExtendedString;
 class DDS_DicItem : public MMgt_TShared
 {
 public:
-  enum Type { String, Float, Integer, List, Unknown };
-  enum Data { MinValue = 0x01, MaxValue = 0x02, DefaultValue = 0x04 };
+  /*! Enum describes type of datum value */
+  enum Type
+  {
+    String,  //!< String type of value
+    Float,   //!< Real (double) numeric type of value
+    Integer, //!< Integer (int) numeric type of value
+    List,    //!< List type of enumerable value
+    Unknown  //!< Unknown or undefined type of value
+  };
+
+  /*! Enum describes the flags for existance of domain data */
+  enum Data
+  {
+    MinValue = 0x01,    //!< Flag of minimum value definition existence
+    MaxValue = 0x02,    //!< Flag of maximum value definition existence
+    DefaultValue = 0x04 //!< Flag of default value definition existence
+  };
 
   // This struct is intended for map of Format, Units, Precision and Scale
   struct UnitData
@@ -66,114 +81,64 @@ public:
   DDS_DicItem();
 
   Standard_EXPORT TCollection_AsciiString    GetId() const;
-  // to access Type of the parameter
-
   Standard_EXPORT DDS_DicItem::Type          GetType() const;
-  // to access Type of the parameter
-
   Standard_EXPORT TCollection_ExtendedString GetLabel() const;
-  // to access Label (name) of the parameter
-
   Standard_EXPORT TCollection_ExtendedString GetFilter() const;
-  // to access filter (regexp) for the parameter values
-
   Standard_EXPORT TCollection_ExtendedString GetRequired() const;
-  // to access Required of the parameter
-
   Standard_EXPORT DDS_MsgType                GetWarningLevel() const;
-  // to access wrong value warning level of the parameter
-
   Standard_EXPORT TCollection_ExtendedString GetLongDescription() const;
-  // to access Long Description of the parameter
-
   Standard_EXPORT TCollection_ExtendedString GetShortDescription() const;
-  // to access Short Description of the parameter
-
   Standard_EXPORT TCollection_AsciiString    GetComponent() const;
 
   Standard_EXPORT TCollection_AsciiString    GetUnits() const;
   Standard_EXPORT TCollection_AsciiString    GetUnits( const UnitSystem& ) const;
-  // returns units for indicated unit systems
 
   Standard_EXPORT TCollection_ExtendedString GetDefaultValue() const;
   Standard_EXPORT TCollection_ExtendedString GetDefaultValue( const UnitSystem& ) const;
-  // to access Default Value of the parameter
 
   Standard_EXPORT Standard_Real              GetMinValue() const;
   Standard_EXPORT Standard_Real              GetMinValue( const UnitSystem& ) const;
-  // get Min Value of the parameter, either in specified unit system or in internal units (basic SI)
 
   Standard_EXPORT Standard_Real              GetMaxValue() const;
   Standard_EXPORT Standard_Real              GetMaxValue( const UnitSystem& ) const;
-  // get Max Value of the parameter, either in specified unit system or in internal units (basic SI)
 
   Standard_EXPORT Standard_Integer           GetPrecision() const;
   Standard_EXPORT Standard_Integer           GetPrecision( const UnitSystem& ) const;
-  // returns precision for indicated unit systems
 
   Standard_EXPORT TCollection_AsciiString    GetFormat( const Standard_Boolean = Standard_True ) const;
   Standard_EXPORT TCollection_AsciiString    GetFormat( const UnitSystem&,
                                                         const Standard_Boolean = Standard_True ) const;
-  // returns format for indicated unit systems
-
   Standard_EXPORT TCollection_ExtendedString GetNameOfValues() const;
-  // to access valueList:name of the parameter.
-  // This string is void if the list is not defined - then use other properties:
-  //    Type, DefaultValue, MaxValue, MinValue
-
   Standard_EXPORT Standard_Boolean           GetListOfValues( Handle(TColStd_HArray1OfExtendedString)&,
                                                               Handle(TColStd_HArray1OfInteger)& ) const;
-  // to access valueList of the parameter
-  // This sequence is empty if the list not defined - then use other properties:
-  //    Type, DefaultValue, MaxValue, MinValue
-
   Standard_EXPORT Standard_Boolean           GetListOfValues( Handle(TColStd_HArray1OfExtendedString)&,
                                                               Handle(TColStd_HArray1OfInteger)&,
                                                               Handle(TColStd_HArray1OfExtendedString)& ) const;
-  // to access valueList of the parameter
-  // This sequence is empty if the list not defined - then use other properties:
-  //    Type, DefaultValue, MaxValue, MinValue
-
   Standard_EXPORT Standard_Boolean           GetSpecialValues( TColStd_MapOfReal& ) const;
-  // get values from specVal
 
   Standard_EXPORT Standard_Real              GetMinZoom() const;
-  // get Min Value of lateral zooming
-
   Standard_EXPORT Standard_Real              GetMaxZoom() const;
-  // get Max Value of lateral zooming
-
   Standard_EXPORT Standard_Real              GetZoomOrder() const;
-  // get Order of lateral zooming
 
-  Standard_EXPORT Standard_Real ToSI( const Standard_Real ) const;
-  Standard_EXPORT Standard_Real FromSI( const Standard_Real ) const;
+  Standard_EXPORT Standard_Real              ToSI( const Standard_Real ) const;
+  Standard_EXPORT Standard_Real              FromSI( const Standard_Real ) const;
 
-  Standard_EXPORT Standard_Real ToSI( const Standard_Real, const UnitSystem& ) const;
-  Standard_EXPORT Standard_Real FromSI( const Standard_Real, const UnitSystem& ) const;
-  // convert value to and from default SI units according to current units
+  Standard_EXPORT Standard_Real              ToSI( const Standard_Real, const UnitSystem& ) const;
+  Standard_EXPORT Standard_Real              FromSI( const Standard_Real, const UnitSystem& ) const;
 
   Standard_EXPORT Standard_Boolean           HasData( const Standard_Integer ) const;
 
+  Standard_EXPORT TCollection_ExtendedString GetOption( const TCollection_AsciiString& ) const;
+  Standard_EXPORT Standard_Boolean           GetOptionNames( TColStd_SequenceOfAsciiString& ) const;
+
 private:
   DDS_DicItem( const DDS_DicItem& );
-  // Copy constructor
-
   void                                       operator=( const DDS_DicItem& );
-  // Assignment operator
-
   void                                       FillDataMap( TCollection_AsciiString, const LDOM_Element&,
                                                           const LDOM_Element&, const LDOM_Element&,
                                                           const TColStd_SequenceOfAsciiString& );
-  // prepares formants for each unit systems
-
-
   void                                       PrepareFormats( const TCollection_AsciiString& );
-  // prepares three formats for each unit systems
-
   void                                       GetDefaultFormat();
-  // returns three default formants for each unit systems
-
   UnitSystem                                 GetActiveUnitSystem() const;
 
   void                                       GetStringFormat( const TCollection_AsciiString&,
@@ -181,29 +146,26 @@ private:
                                                               const TCollection_AsciiString&,
                                                               const TCollection_AsciiString&,
                                                               TCollection_AsciiString& );
-  // returns format for the string
-
   void                                       GetIntegerFormat( const TCollection_AsciiString&,
                                                                const TCollection_AsciiString&,
                                                                const TCollection_AsciiString&,
                                                                const TCollection_AsciiString&,
                                                                const Standard_Character,
                                                                TCollection_AsciiString& );
-  // returns format for the integer
-
   void                                       GetFloatFormat( const TCollection_AsciiString&,
                                                              const TCollection_AsciiString&,
                                                              const TCollection_AsciiString&,
                                                              const TCollection_AsciiString&,
                                                              const Standard_Character,
                                                              TCollection_AsciiString& );
-  // returns format for the float
-
   void                                       Split( const TCollection_AsciiString&,
                                                     Handle(TColStd_HArray1OfExtendedString)& );
 
   UnitData*                                  GetUnitData( const UnitSystem& ) const;
 
+private:
+  typedef NCollection_DataMap<TCollection_AsciiString, TCollection_ExtendedString> OptionsMap;
+
 private:
   TCollection_AsciiString                    myId;
   TCollection_ExtendedString                 myLabel;
@@ -237,6 +199,7 @@ private:
 
   Handle(Standard_Transient)                 myComponent;
 
+  OptionsMap                                 myOptions;
   // unitData
   NCollection_DataMap<UnitSystem, UnitData>  myUnitData;
 
@@ -247,10 +210,8 @@ public:
   DEFINE_STANDARD_RTTI(DDS_DicItem)
 };
 
-// Definition of HANDLE object using Standard_DefineHandle.hxx
 DEFINE_STANDARD_HANDLE(DDS_DicItem, MMgt_TShared)
 
-// Container class XMLTools_IndexedDataMapOfDicItems (map of handles)
 DEFINE_BASECOLLECTION(DDS_BaseCollectionOfDicItems, Handle(DDS_DicItem))
 DEFINE_INDEXEDDATAMAP(DDS_IndexedDataMapOfDicItems, DDS_BaseCollectionOfDicItems,
                       TCollection_AsciiString, Handle(DDS_DicItem))
index 4fb61b601263f145c4fe74f47083289b50b01de0..dd741872fb06cee80f2e880d4d1f76cf23cffca4 100644 (file)
 IMPLEMENT_STANDARD_HANDLE(DDS_Dictionary, MMgt_TShared)
 IMPLEMENT_STANDARD_RTTIEXT(DDS_Dictionary, MMgt_TShared)
 
+/*!
+  \class DDS_Dictionary
+  
+  This class to provide information about used datums, reading them from 'xml' file
+
+  Datum is the set of parameters described a phisical characteristic. These parameters loaded from
+  special XML which has following format:
+
+  \hr
+
+  <D_URI>
+  <COMPONENT COMPONENT_NAME="component_name">
+    <UNIT_SYSTEMS>
+      <UNIT_SYSTEM UNIT_SYSTEM_NAME="[system_internal_name]" UNIT_SYSTEM_LABEL="[system_label]">
+      <UNIT_SYSTEM UNIT_SYSTEM_NAME="[system_internal_name]" UNIT_SYSTEM_LABEL="[system_label]">
+      ...
+      <UNIT_SYSTEM UNIT_SYSTEM_NAME="[system_internal_name]" UNIT_SYSTEM_LABEL="[system_label]">
+    </UNIT_SYSTEMS>
+
+    <DATUM DATUM_UNITS="[base_system_internal_name]" DATUM_FORMAT="[sprintf_format_specification]"
+           DATUM_ID="[datum_id]" DATUM_LABEL="[datum_label]" DATUM_REQUIRED="[requred_value]"
+           DATUM_FILTER="[string_regular_expression]">
+      <DY_DOMAIN>
+        <VALUE_DESCR VD_DEFV="[default_value]" VD_MAXV="[max_value]" VD_MINV="[min_value]" VD_TYPE="[value_type]"/>
+        <VALUE_LIST_REF VLR_LIST="[referenced_list_id]"/>
+      </DY_DOMAIN>
+      <DESCR>
+        <SHORT_D>[brief_desription_text]</SHORT_D>
+        <LONG_D>[full_description_text]</LONG_D>
+      </DESCR>
+      <OPTIONS>
+        <OPTION OPTION_NAME="[option_name_1]">[option_value_1]</OPTION>
+        <OPTION OPTION_NAME="[option_name_2]">[option_value_2]</OPTION>
+        ...
+        <OPTION OPTION_NAME="[option_name_n]">[option_value_n]</OPTION>
+      </OPTIONS>
+    </DATUM>
+
+    ...
+
+    <VALUE_LIST VALUE_LIST_ID="[list_id]" VALUE_LIST_NAME="[list_name]">
+      <VALUE_LIST_VALUE VALUE_LIST_VALUEID="[list_element_id]" VALUE_LIST_VALUEICON="[list_element_icon_file]">[list_element_name]</VALUE_LIST_VALUE>
+      <VALUE_LIST_VALUE VALUE_LIST_VALUEID="[list_element_id]" VALUE_LIST_VALUEICON="[list_element_icon_file]">[list_element_name]</VALUE_LIST_VALUE>
+      ...
+      <VALUE_LIST_VALUE VALUE_LIST_VALUEID="[list_element_id]" VALUE_LIST_VALUEICON="[list_element_icon_file]">[list_element_name]</VALUE_LIST_VALUE>
+    </VALUE_LIST>
+
+    ...
+
+    </COMPONENT>
+  </D_URI>
+
+  \hr
+
+  In description of datum file format used internal keys as XML tag and attributes names.
+  Concrete XML keywords defined by DDS_KeyWords class.
+
+  Describe datum file format more detailed. XML file should have one main tag named as "dictionary" (key "D_URI").
+  This tag should contains one or several components. Component is a independent set of datums and unit systems.
+  Components defined as XML tag named "component" (key "COMPONENT") with attribute "name" (key COMPONENT_NAME).
+  Component name used as component identifier and should be unique. Component tag can contains:
+
+  \li Tag "unit_systems" (key UNIT_SYSTEMS) defines set of used unit systems. Should exist at least one unit
+  system named SI ("System International"). If this system not exist then it will be defined automatically.
+  Each unit system defined by XML tag "unit system" (key UNIT_SYSTEM) under tag "unit_systems" with attributes
+  "name" (key UNIT_SYSTEM_NAME) and "label" (key UNIT_SYSTEM_LABEL). Name is identifier of unit system. Label is
+  human readable description.
+
+  \li One or several tag "datum" (key DATUM). For this tag can be defined following attributes:
+
+      \lo Identifier (key DATUM_ID) specify the unique id string for the datum.
+      \lo Label (key DATUM_LABEL) specify human readable name of the datum.
+      \lo Units of measure (key DATUM_UNITS) for given unit system. Attribute name consist of a name
+          of unit system and a keyword got from DDS_KeyWords by key DATUM_UNITS. For example for unit system
+          named SI and default keyword attribute name will be "SIunits". This attribute should be specified
+          for each deaclared unit system. Value of this attribute should be string describs units of measure.
+          Possible designations for units of measure and their multiple prefixes see in package UnitsAPI of
+          library OpenCascade (files Units.dat and Lexi_Expr.dat). Units of measure will be used for numeric
+          value conversion from one unit system to another one.
+      \lo Format (key DATUM_FORMAT) specify the format string which will be used during initial formatting
+          of value. This string should be specified in sprintf() format.
+      \lo Filter (key DATUM_FILTER) specify the regualr expression. Each user entered string will be checked up
+          on matching to this expression (if it defined). Non matched strings will be rejected.
+      \lo Required value (key DATUM_REQUIRED). If this attributed defined and value is true then user can't
+          leave a input filed blank (parameter must be always entered).
+
+      Tag "description" (key DESCR) can be defined under the tag "datum". This tag contains two sub tags:
+         \lo "short description" (key SHORT_D) specify a brief datum description text
+         \lo "long description" (key LONG_D) specify a detailed description text
+
+      Tag "options" (key OPTIONS) can be defined under the tag "datum". This tag contains one or more sub
+      tags "option" (key OPTION). Each of these XML elements should contain text option value and attribute
+      "name" (key OPTION_NAME) which specified option name.
+
+      Each tag "datum" define most common parameters of phisical characteristic.
+      This parameters placed in two groups:
+      \lo Domain parameters under tag "domain" (key DY_DOMAIN). This tag can contains value description tag
+          (key VALUE_DESCR) for discrete data or list reference tag (key VALUE_LIST_REF) for enumerable data.
+          Discrete data described following parameters:
+            default value (key VD_DEFV)
+            maximum value (key VD_MAXV)
+            minimum value (key VD_MINV)
+            type of value (key VD_TYPE) - possible values: String, Integer, Float, List
+          Enumerable data described by "list reference" attribute (key VLR_LIST) which reference on
+          list (see "list definition" tag) by list id.
+
+  \li One or several tag "list definition" (key VALUE_LIST). This tag define the list of items for enumerable
+      data. Attribute "list id" (key VALUE_LIST_ID) specify the identifier string for the list and attribute
+      "list name" (key VALUE_LIST_NAME) define a list name string. Each list item described by tag "list value"
+      (key VALUE_LIST_VALUE) under tag "list definition". Each this tag contains item string text and have
+      following attributes:
+        \lo "list item id" (key VALUE_LIST_VALUEID) - integer numerical identifier for item
+        \lo "list item icon" (key VALUE_LIST_VALUEICON) - icon file name for item
+
+  Below the example of a XML file with use default keywords.
+
+  <datadictionary version="1.0">
+    <component name="My Component">
+
+      <!-- specify two unit systems -->
+
+      <unitSystems>
+        <system name="SI" label="System international">
+        <system name="AS" label="Anglo - sacson system">
+      </unitSystems>
+
+      <!-- specify datum -->
+      <!-- units of measure for SI - meters (m), for AS - inches (in) -->
+      <datum SIunits="m" ASunits="in" format="%.25f" id="X" label="X coordinate" required="">
+        <domain>
+          <!-- default value not specified -->
+          <valueDescr default="" max="999999999.999" min="0.000" type="Float"/>
+        </domain>
+        <description>
+          <shortDescr>X coordinate for object</shortDescr>
+          <longDescr>X multiplier of object coordinates. Describe position of object in direction of X axis</longDescr>
+        </description>
+      </datum>
+
+      <datum SIunits="m" ASunits="in" format="%.25f" id="Y" label="Y coordinate" required="">
+        <domain>
+          <valueDescr default="" max="999999999.999" min="0.000" type="Float"/>
+        </domain>
+        <description>
+          <shortDescr>Y coordinate for object</shortDescr>
+          <longDescr>Y multiplier of object coordinates. Describe position of object in direction of Y axis</longDescr>
+        </description>
+      </datum>
+
+      <!-- datum for object name with filter which not allow to input more that 8 letters,
+           numbers or unerscores with first letter only -->
+      <datum format="%.8us" id="ObjectName" label="Name" required="yes"
+             filter="^([A-Z]+)([A-Z,0-9,_]*)$">
+        <domain>
+          <!-- limits and default not specified, type is string -->
+          <valueDescr default="" max="" min="" type="String" />
+        </domain>
+        <description>
+          <!-- long description not specified -->
+          <shortDescr>Name of object</shortDescr>
+        </description>
+      </datum>
+
+
+      <!-- datum for enumeration of side -->
+      <datum format="" id="Side" label="Side" required="">
+        <domain>
+          <!-- default list item is item with id 0 -->
+          <valueDescr default="0" type="List"/>
+          <!-- list reference on list named "side_list" -->
+          <listRef list="side_list"/>
+        </domain>
+        <description>
+          <shortDescr>Side of object</shortDescr>
+        </description>
+      </datum>
+
+      <!-- list definition for enumeration of side -->
+      <valueList listid="side_list" name="Side">
+        <value id="1">left</value>
+        <value id="2">right</value>
+        <value id="3">top</value>
+        <value id="4">bottom</value>
+        <value id="0">undefined</value>
+      </valueList>
+
+    </component>
+  </datadictionary>
+
+
+*/
+
+/*!
+  Constructor. Creates the instance of dictionary. Private method. Use DDS_Dictionary::Get() instead.
+*/
 DDS_Dictionary::DDS_Dictionary()
 : MMgt_TShared()
 {
 }
 
+/*!
+  Copy constructor. Internal.
+*/
 DDS_Dictionary::DDS_Dictionary( const DDS_Dictionary& )
 {
 }
 
+/*!
+  Assigment operator. Internal.
+*/
 void DDS_Dictionary::operator=( const DDS_Dictionary& )
 {
 }
 
+/*!
+  Returns the names list of defined unit systems from all components.
+  Parameter \atheSystems will contains the sequence of string names.
+*/
 void DDS_Dictionary::GetUnitSystems( TColStd_SequenceOfAsciiString& theSystems ) const
 {
   theSystems.Clear();
@@ -71,6 +276,11 @@ void DDS_Dictionary::GetUnitSystems( TColStd_SequenceOfAsciiString& theSystems )
 
 }
 
+/*!
+  Returns the names list of defined unit systems from the specified component \atheComponent.
+  Parameter \atheSystems will contains the sequence of string names. If component not found then
+  empty list returned.
+*/
 void DDS_Dictionary::GetUnitSystems( TColStd_SequenceOfAsciiString& theSystems,
                                      const TCollection_AsciiString& theComponent ) const
 {
@@ -79,6 +289,10 @@ void DDS_Dictionary::GetUnitSystems( TColStd_SequenceOfAsciiString& theSystems,
     myGroupMap.FindFromKey( theComponent )->GetUnitSystems( theSystems );
 }
 
+/*!
+  Returns the label of unit system \atheSystem. Function find the given unit system in
+  all components. If unit system not found in any component then empty string returned.
+*/
 TCollection_ExtendedString DDS_Dictionary::GetUnitSystemLabel( const TCollection_AsciiString& theSystem ) const
 {
   TCollection_ExtendedString aLabel;
@@ -87,6 +301,11 @@ TCollection_ExtendedString DDS_Dictionary::GetUnitSystemLabel( const TCollection
   return aLabel;
 }
 
+/*!
+  Returns the label of unit system \atheSystem from component \atheComponent. Function find
+  the given unit system in the specified component only. If unit system not found in the
+  component then empty string returned.
+*/
 TCollection_ExtendedString DDS_Dictionary::GetUnitSystemLabel( const TCollection_AsciiString& theSystem,
                                                                const TCollection_AsciiString& theComponent ) const
 {
@@ -96,6 +315,10 @@ TCollection_ExtendedString DDS_Dictionary::GetUnitSystemLabel( const TCollection
   return aLabel;
 }
 
+/*!
+  Gets the name of active unit system from first got component. If any component exist then
+  active unit system name returned or empty string otherwise.
+*/
 TCollection_AsciiString DDS_Dictionary::GetActiveUnitSystem() const
 {
   TCollection_AsciiString aSystem;
@@ -104,6 +327,10 @@ TCollection_AsciiString DDS_Dictionary::GetActiveUnitSystem() const
   return aSystem;
 }
 
+/*!
+  Gets the name of active unit system from component \atheComponent. If this component exist
+  active unit system name returned or empty string otherwise.
+*/
 TCollection_AsciiString DDS_Dictionary::GetActiveUnitSystem( const TCollection_AsciiString& theComponent ) const
 {
   TCollection_AsciiString aSystem;
@@ -112,12 +339,20 @@ TCollection_AsciiString DDS_Dictionary::GetActiveUnitSystem( const TCollection_A
   return aSystem;
 }
 
+/*!
+  Sets the active unit system named \atheSystem. This unit system will be activated in all
+  existing components if component have it.
+*/
 void DDS_Dictionary::SetActiveUnitSystem( const TCollection_AsciiString& theSystem )
 {
   for ( Standard_Integer i = 1; i <= myGroupMap.Extent(); i++ )
     myGroupMap.FindFromIndex( i )->SetActiveUnitSystem( theSystem );
 }
 
+/*!
+  Sets the active unit system named \atheSystem for component \atheComponent. If specified unit
+  system doesn't exist in the component then function do nothing.
+*/
 void DDS_Dictionary::SetActiveUnitSystem( const TCollection_AsciiString& theSystem,
                                           const TCollection_AsciiString& theComponent )
 {
@@ -138,6 +373,10 @@ Handle(DDS_Dictionary) DDS_Dictionary::Get()
   return sDictionary;
 }
 
+/*!
+  Load datum definitions in the dictionary from XML file \atheFileName. Returns true if load
+  successed or false otherwise.
+*/
 Standard_Boolean DDS_Dictionary::Load( const TCollection_AsciiString theFileName )
 {
   static NCollection_Map<TCollection_AsciiString> _LoadMap;
@@ -164,6 +403,10 @@ Standard_Boolean DDS_Dictionary::Load( const TCollection_AsciiString theFileName
   return Standard_True;
 }
 
+/*!
+  Gets XML keyword as LDOMString by specified \akey. If key doesn't exist then empty string
+  returned. This function provided for convenience.
+*/
 LDOMString DDS_Dictionary::KeyWord( const TCollection_AsciiString& key )
 {
   LDOMString keyWord;
@@ -178,25 +421,25 @@ LDOMString DDS_Dictionary::KeyWord( const TCollection_AsciiString& key )
 }
 
 /*!
-  Returns DicItem from specified group with all attached data
+  Gets dictionary item with specified identifier \atheID from specified component \atheComponent.
+  If component or item not found then null handle returned.
 */
-
 Handle(DDS_DicItem) DDS_Dictionary::GetDicItem( const TCollection_AsciiString& theID,
-                                                const TCollection_AsciiString& theGroup ) const
+                                                const TCollection_AsciiString& theComponent ) const
 {
   Handle(DDS_DicItem) aDicItem;
   Handle(DDS_DicGroup) aDicGroup;
-  if ( myGroupMap.Contains( theGroup ) )
-    aDicGroup = myGroupMap.FindFromKey( theGroup );
+  if ( myGroupMap.Contains( theComponent ) )
+    aDicGroup = myGroupMap.FindFromKey( theComponent );
   if ( !aDicGroup.IsNull() )
     aDicItem = aDicGroup->GetDicItem( theID );
   return aDicItem;
 }
 
 /*!
-  Returns DicItem with all attached data
+  Gets dictionary item with specified identifier \atheID. Function find the item in all components.
+  If item not found in any component then null handle returned.
 */
-
 Handle(DDS_DicItem) DDS_Dictionary::GetDicItem( const TCollection_AsciiString& theID ) const
 {
   Handle(DDS_DicItem) aDicItem;
@@ -205,6 +448,9 @@ Handle(DDS_DicItem) DDS_Dictionary::GetDicItem( const TCollection_AsciiString& t
   return aDicItem;
 }
 
+/*!
+  Fill the internal data structures from XML parsed structures. Internal.
+*/
 void DDS_Dictionary::FillDataMap( const LDOM_Element& theComponentData, const LDOM_Element& theDocElement )
 {
   TCollection_AsciiString aCompName = theComponentData.getAttribute( KeyWord( "COMPONENT_NAME" ) );
@@ -215,6 +461,10 @@ void DDS_Dictionary::FillDataMap( const LDOM_Element& theComponentData, const LD
   myGroupMap.Add( aCompName, aDicGroup );
 }
 
+/*!
+  Convert numeric value \atheValue from specified unit of measure \atheUnits to SI unit of measure
+  (mm for Length, radians for Angles, etc). Converted value returned.
+*/
 Standard_Real DDS_Dictionary::ToSI( const Standard_Real theValue, const Standard_CString theUnits )
 {
   Standard_Real aRetValue = theValue;
@@ -235,6 +485,10 @@ Standard_Real DDS_Dictionary::ToSI( const Standard_Real theValue, const Standard
   return aRetValue;
 }
 
+/*!
+  Convert numeric value \atheValue to specified unit of measure \atheUnits from SI unit of measure
+  (mm for Length, radians for Angles, etc). Converted value returned.
+*/
 Standard_Real DDS_Dictionary::FromSI( const Standard_Real theValue, const Standard_CString theUnits )
 {
   Standard_Real aRetValue = theValue;
index 427e08e1e6287d22e28f69099ff694077d1b93a5..9a5d5a886620a378ac109de2ecb56f415ea4c658 100644 (file)
@@ -30,8 +30,6 @@ class TCollection_AsciiString;
 
 DEFINE_STANDARD_HANDLE(DDS_Dictionary, MMgt_TShared)
 
-//  Class to provide information about used parameters,
-//  reading them from 'xml' file
 class DDS_Dictionary : public MMgt_TShared
 {
 public:
@@ -69,7 +67,6 @@ private:
 
   void                                           operator=( const DDS_Dictionary& );
 
-  // prepares formants for each unit systems
   void                                           FillDataMap( const LDOM_Element&, const LDOM_Element& );
 
 private:
index 8ea7f6a97915cee2a65e5b47ff203de93c76a243..626bd0fd03e82a14a6defaea4b427617a8b68df5 100644 (file)
 IMPLEMENT_STANDARD_HANDLE(DDS_KeyWords, MMgt_TShared)
 IMPLEMENT_STANDARD_RTTIEXT(DDS_KeyWords, MMgt_TShared)
 
+/*!
+  \class DDS_KeyWords
+
+  This object contains the pairs of internal keys and XML tag or attribute names. This class allow to user
+  define set of XML keywords used in datums definition file.
+
+  Default keywords table:
+  \li D_URI - dictionary
+  \li COMPONENT - component
+  \li COMPONENT_NAME - name
+  \li UNIT_SYSTEMS - unitSystems
+  \li UNIT_SYSTEM - system
+  \li UNIT_SYSTEM_NAME - name
+  \li UNIT_SYSTEM_LABEL - label
+  \li DATUM - datum
+  \li DATUM_ID - id
+  \li DATUM_LABEL - label
+  \li DATUM_UNITS - units
+  \li DATUM_FORMAT - format
+  \li DATUM_FILTER - filter
+  \li DATUM_REQUIRED - required
+  \li VALUE_LIST - valueList
+  \li VALUE_LIST_ID - listid
+  \li VALUE_LIST_NAME - name
+  \li VALUE_LIST_TYPE - type
+  \li VALUE_LIST_VALUE - value
+  \li VALUE_LIST_VALUEID - id
+  \li VALUE_LIST_VALUEICON - icon
+  \li DY_DOMAIN - domain
+  \li WARNING_LEVEL - warningLevel
+  \li WRONG_VALUE - wrongValue
+  \li VALUE_DESCR - valueDescr
+  \li VALUE_LIST_REF - listRef
+  \li DESCR - description
+  \li LONG_D - longDescr
+  \li SHORT_D - shortDescr
+  \li VD_TYPE - type
+  \li VD_DEFV - default
+  \li VD_MAXV - max
+  \li VD_MINV - min
+  \li VD_SPEC - specVal
+  \li VLR_LIST - list
+  \li PRS - presentation
+  \li LATERAL_ZOOM - lateralZoom
+  \li LZ_MINV - min
+  \li LZ_MAXV - max
+  \li LZ_ORDER - order
+  \li OPTIONS - options
+  \li OPTION - option
+  \li OPTION_NAME - name
+*/
+
+/*!
+  Constructor
+*/
+
 DDS_KeyWords::DDS_KeyWords()
 : MMgt_TShared()
 {
@@ -71,8 +127,16 @@ DDS_KeyWords::DDS_KeyWords()
   SetKeyWord( "LZ_MINV",              "min" );
   SetKeyWord( "LZ_MAXV",              "max" );
   SetKeyWord( "LZ_ORDER",             "order" );
+
+  SetKeyWord( "OPTIONS",              "options" );
+  SetKeyWord( "OPTION",               "option" );
+  SetKeyWord( "OPTION_NAME",          "name" );
 }
 
+/*!
+  Returns the static instance of the class DDS_KeyWords
+*/
+
 Handle(DDS_KeyWords) DDS_KeyWords::Get()
 {
   static Handle(DDS_KeyWords) keyWords;
@@ -83,6 +147,11 @@ Handle(DDS_KeyWords) DDS_KeyWords::Get()
   return keyWords;
 }
 
+/*!
+  Returns the XML keyword by specified internal key \a key. If the internal key isn't registered
+  then empty string will be returned.
+*/
+
 TCollection_AsciiString DDS_KeyWords::GetKeyWord( const TCollection_AsciiString& key ) const
 {
   TCollection_AsciiString keyWord;
@@ -91,6 +160,10 @@ TCollection_AsciiString DDS_KeyWords::GetKeyWord( const TCollection_AsciiString&
   return keyWord;
 }
 
+/*!
+  Register the pair of the internal key \a key and XML keyword \a keyWord.
+*/
+
 void DDS_KeyWords::SetKeyWord( const TCollection_AsciiString& key,
                                const TCollection_AsciiString& keyWord )
 {
index daee727ba3c00dfe4270dc3f3f5225a89215d651..2161f71f3338eba070d98979e6ddb7533408b7d2 100644 (file)
@@ -29,7 +29,7 @@ DEFINE_STANDARD_HANDLE(DDS_KeyWords, MMgt_TShared)
 
 class TCollection_AsciiString;
 
-class DDS_KeyWords: public MMgt_TShared
+class DDS_KeyWords : public MMgt_TShared
 {
 public:
   Standard_EXPORT static Handle(DDS_KeyWords) Get();
index 78982c4c9f0fcb1588ed6d176f9fcbd91e04e605..91f53d6bcd5ac5bf3996f2808eb4680b132bfd9f 100755 (executable)
@@ -95,7 +95,7 @@ private:
   \class TMemFunEvent
   \brief Template class for member function
 */
-template<class TObject, typename TRes> class EVENT_EXPORT TMemFunEvent: public SALOME_Event{
+template<class TObject, typename TRes> class /*EVENT_EXPORT */TMemFunEvent: public SALOME_Event{
 public:
   typedef TRes TResult;
   TResult myResult;
@@ -119,7 +119,7 @@ private:
   \class TVoidMemFunEvent
   \brief Template class for member function
 */
-template<class TObject> class EVENT_EXPORT TVoidMemFunEvent: public SALOME_Event{
+template<class TObject> class /*EVENT_EXPORT */TVoidMemFunEvent: public SALOME_Event{
 public:
   typedef void (TObject::* TAction)();
   TVoidMemFunEvent(TObject* theObject, TAction theAction):
@@ -139,7 +139,7 @@ private:
   \class TMemFun1ArgEvent
   \brief Template for member function with one argument
 */
-template<class TObject, typename TRes, typename TArg, typename TStoreArg = TArg> class EVENT_EXPORT TMemFun1ArgEvent:
+template<class TObject, typename TRes, typename TArg, typename TStoreArg = TArg> class/* EVENT_EXPORT */TMemFun1ArgEvent:
 public SALOME_Event{
 public:
   typedef TRes TResult;
@@ -166,7 +166,7 @@ private:
   \class TVoidMemFun1ArgEvent
   \brief Template for member function with one argument
 */
-template<class TObject, typename TArg, typename TStoreArg = TArg> class EVENT_EXPORT TVoidMemFun1ArgEvent: public SALOME_Event{
+template<class TObject, typename TArg, typename TStoreArg = TArg> class /*EVENT_EXPORT */TVoidMemFun1ArgEvent: public SALOME_Event{
 public:
   typedef void (TObject::* TAction)(TArg);
   TVoidMemFun1ArgEvent(TObject* theObject, TAction theAction, TArg theArg):
@@ -189,7 +189,7 @@ private:
   \brief Template for member function with two arguments
 */
 template<class TObject, typename TRes, typename TArg, typename TArg1, typename TStoreArg = TArg, typename TStoreArg1 = TArg1> class
-EVENT_EXPORT TMemFun2ArgEvent: public SALOME_Event{
+/*EVENT_EXPORT */TMemFun2ArgEvent: public SALOME_Event{
 public:
   typedef TRes TResult;
   TResult myResult;
@@ -219,7 +219,7 @@ private:
   \brief Template for member function with two arguments
 */
 template<class TObject, typename TArg, typename TArg1, typename TStoreArg = TArg, typename TStoreArg1 = TArg1> class
-EVENT_EXPORT TVoidMemFun2ArgEvent: public SALOME_Event{
+/*EVENT_EXPORT*/ TVoidMemFun2ArgEvent: public SALOME_Event{
 public:
   typedef void (TObject::* TAction)(TArg,TArg1);
   TVoidMemFun2ArgEvent(TObject* theObject, TAction theAction, TArg theArg, TArg1 theArg1):
index bac910416b3aaec740bd667c4f947415bd8843a1..338543ee3b8920c16c544ca433323e52fcffe29f 100644 (file)
@@ -746,7 +746,7 @@ QByteArray GLViewer_MarkerSet::getByteCopy()
         aResult[i] = *aPointer;
         
     
-    for( ; i < aResult.size(); i++ )
+    for ( ; i < (int)aResult.size(); i++ )
         aResult[i] = aObject[i - anISize - 2*aFSize*myNumber - aFSize];
 
     return aResult;
@@ -1284,7 +1284,7 @@ QByteArray GLViewer_Polyline::getByteCopy()
     for( ; i < anISize + 2*aFSize*myNumber + 2*aBSize; i++, aPointer++ )
         aResult[i] = *aPointer;
 
-    for( ; i < aResult.size(); i++ )
+    for ( ; i < (int)aResult.size(); i++ )
         aResult[i] = aObject[i - anISize - 2*aFSize*myNumber - 2*aBSize];
 
     return aResult;
index 399a694442820826a5ae48d79d7c931bc0f4f008..d0001a49c18f42ab8c6efd5893e05358f4e056ab 100644 (file)
@@ -306,7 +306,7 @@ void GLViewer_TexFont::drawString( QString theStr, GLdouble theX , GLdouble theY
     float aDY = ( aRowPixelHeight - 1 ) / aYScale, aDX;
     char aLetter;
     int aLettIndex, row;
-    for( int i = 0; i < theStr.length(); i++ )
+    for ( int i = 0; i < (int)theStr.length(); i++ )
     {
         aLetter    = theStr.data()[i];
         aLettIndex = (int)aLetter - FirstSymbolNumber;
@@ -338,7 +338,7 @@ void GLViewer_TexFont::drawString( QString theStr, GLdouble theX , GLdouble theY
 int GLViewer_TexFont::getStringWidth( QString theStr )
 {
     int aWidth = 0;
-    for( int i = 0; i < theStr.length(); i ++ )
+    for ( int i = 0; i < (int)theStr.length(); i ++ )
     {
         char aLetter = theStr.data()[i];
         int aLettIndex = (int)aLetter - FirstSymbolNumber;
index e5e3baa0518de9ba80878e6674de51225b6c37b5..7de98ed37321db2c9aaf99121c8a95bcc566f9a3 100644 (file)
@@ -187,17 +187,17 @@ QByteArray GLViewer_Object::getByteCopy()
 
     int aCurPos = 2*anISize + sizeOf8Float + aTypeLength + aToolTipLength;
     // adds aspect byte array
-    for( i = aCurPos; i < aCurPos + aAspect.size(); i++ )
+    for ( i = aCurPos; i < (int)( aCurPos + aAspect.size() ); i++ )
         aResult[i] = aAspect[i - aCurPos];
 
     aCurPos = aCurPos + aAspect.size();
     // adds GL text byte array
-    for( i = aCurPos; i < aCurPos + aGLText.size(); i++ )
+    for ( i = aCurPos; i < (int)( aCurPos + aGLText.size() ); i++ )
         aResult[i] = aGLText[i - aCurPos];    
 
     aCurPos += aGLText.size();
     aPointer = (char*)&myOwner;
-    for( i = 0; i < sizeof( GLViewer_Owner* ); i++, aPointer++ )
+    for( i = 0; i < sizeof( SUIT_DataOwner* ); i++, aPointer++ )
         aResult[ aCurPos + i ] = *aPointer;
 
     return aResult;
index 49373a8ccad7fe42674392d6de2fed26e6c527c1..2384bb4408db88e3522320870621435e329c5c48 100644 (file)
@@ -50,7 +50,7 @@ class GLViewer_AspectLine;
 class GLViewer_Group;
 class GLViewer_CoordSystem;
 class GLViewer_Text;
-class GLViewer_Owner;
+//class GLViewer_Owner;
 
 /*! 
  * Class GLViewer_Object
@@ -233,9 +233,9 @@ public:
   virtual bool              translateToEMF( HDC dc, GLViewer_CoordSystem* aViewerCS, GLViewer_CoordSystem* aEMFCS ) = 0;
 #endif
   //!\warning It is for ouv
-  GLViewer_Owner*           owner() const { return myOwner; }
+  SUIT_DataOwner*           owner() const { return myOwner; }
   //!\warning It is for ouv
-  void                      setOwner( GLViewer_Owner* owner ) { myOwner = owner; }
+  void                      setOwner( SUIT_DataOwner* owner ) { myOwner = owner; }
   
   //! Adds object to group theGroup
   void                      setGroup( GLViewer_Group* theGroup );
@@ -297,26 +297,12 @@ protected:
   bool                      myIsVisible;
 
   //!\warning It is for ouv
-  GLViewer_Owner*           myOwner;
+  SUIT_DataOwner*           myOwner;
 
   //! Object Group
   GLViewer_Group*           myGroup;
 };
 
-
-//!\warning It is for ouv
-class GLVIEWER_API GLViewer_Owner : public SUIT_DataOwner
-{
-public:
-  //!\warning It is for ouv
-  GLViewer_Owner() : SUIT_DataOwner() {}
-  //!\warning It is for ouv
-  ~GLViewer_Owner() {}
-
-protected:
-
-};
-
 #ifdef WNT
 #pragma warning ( default:4251 )
 #endif
index 517aff5144b1a0346004a8ca56bf3186fc0e4fab..1f270a253f9bff75c83d254c7021b4b265eb426e 100644 (file)
 // File:      GLViewer_Tools.cxx
 // Created:   April, 2005
 
-//#include "GLViewerAfx.h"
 #include "GLViewer_Tools.h"
 
 #include <GL/gl.h>
 
-#include <iostream.h>
+#include <iostream>
 
 /*!
   Constructor
@@ -43,7 +42,7 @@ GLViewer_LineList::GLViewer_LineList( int size )
 
   if( !myArray )
   {
-    cout << "Can't allocate memory: " << size << endl;
+    std::cout << "Can't allocate memory: " << size << std::endl;
     myRealSize = 0;
   }
   else
@@ -386,11 +385,11 @@ void GLViewer_LineList::clear()
 */
 void GLViewer_LineList::print()
 {
-  cout << "MainCoord: " << myMainCoord <<" SIZE: " << myRealSize << " ENum: " << mySegmentNumber << " :::";
+  std::cout << "MainCoord: " << myMainCoord <<" SIZE: " << myRealSize << " ENum: " << mySegmentNumber << " :::";
   for( int i = 0; i < mySegmentNumber; i++ )
-    cout << "  " << myArray[2*i] << " " << myArray[2*i+1] << " | ";
+    std::cout << "  " << myArray[2*i] << " " << myArray[2*i+1] << " | ";
 
-  cout << endl;
+  std::cout << std::endl;
 }
 
 /*!
@@ -694,11 +693,11 @@ void GLViewer_LineField::addRectangle( double top, double right, double bottom,
 */
 void GLViewer_LineField::print()
 {
-  cout << "My X matrix Number: " << myXSize << endl;
+  std::cout << "My X matrix Number: " << myXSize << std::endl;
   for( int i = 0; i < myXSize; i++ )
     myXLineArray[i]->print();
 
-  cout << "My Y matrix Number: " << myYSize << endl;
+  std::cout << "My Y matrix Number: " << myYSize << std::endl;
   for( int j = 0; j < myYSize; j++ )
     myYLineArray[j]->print();
 }
@@ -724,7 +723,7 @@ void GLViewer_LineField::show()
   }
   glEnd();
   delete[] anArray;
-  cout << "Show function" << endl;
+  std::cout << "Show function" << std::endl;
 }
 
 /*!
@@ -1005,7 +1004,7 @@ GLViewer_LineField::IterationStatus GLViewer_LineField::checkComplete()
           aCurArray[i].myLineIndex == myEndPoint.myXLineIndex && 
           aCurArray[i].mySegmentindex == myEndPoint.myXSegmentIndex )
       {
-        cout << "Algorithm complete X!!!!!!!" << endl;
+        std::cout << "Algorithm complete X!!!!!!!" << std::endl;
         myEndPoint.mySolveIndex = i;
         return IS_SOLVED;
       }
@@ -1013,7 +1012,7 @@ GLViewer_LineField::IterationStatus GLViewer_LineField::checkComplete()
                aCurArray[i].myLineIndex == myEndPoint.myYLineIndex && 
                aCurArray[i].mySegmentindex == myEndPoint.myYSegmentIndex )
       {
-        cout << "Algorithm complete Y!!!!!!!" << endl;
+        std::cout << "Algorithm complete Y!!!!!!!" << std::endl;
         myEndPoint.mySolveIndex = i;  
         return IS_SOLVED;
       }
@@ -1031,7 +1030,7 @@ GLViewer_LineField::IterationStatus GLViewer_LineField::checkComplete()
   else
     myCurArrayIndex = 0;
 
-  cout << "Number of ways: " << count << endl;
+  std::cout << "Number of ways: " << count << std::endl;
   if( count == 0 )
     return IS_LOOP;
 
@@ -1099,7 +1098,7 @@ GLViewer_LineField::EndStatus GLViewer_LineField::startAlgorithm()
 
   while( true )
   {
-    cout << "-----------Iteration #" << myCurCount << "-------------" << endl;
+    std::cout << "-----------Iteration #" << myCurCount << "-------------" << std::endl;
     iteration();
 
     IterationStatus is = checkComplete();
index b9cbff5aef4336c90bd1ba3522ff838edeb416e4..8e1f1e860f69d761d704a7db5d0972594b534e88 100644 (file)
 #include "GLViewer_Viewer2d.h"
 #include "SUIT_Desktop.h"
 
-int GLViewer_ViewManager::myMaxId = 0;
-
 /*!Constructor.*/
 GLViewer_ViewManager::GLViewer_ViewManager( SUIT_Study* theStudy, SUIT_Desktop* theDesktop )
-: SUIT_ViewManager( theStudy, theDesktop )
+: SUIT_ViewManager( theStudy, theDesktop, new GLViewer_Viewer2d( "GLViewer" ) )
 {
-    myId = ++myMaxId;
-    setViewModel( new GLViewer_Viewer2d( "GLViewer" ) );
+  setTitle( tr( "GL_VIEW_TITLE" ) );
 }
 
 /*!Destructor.*/
@@ -43,13 +40,6 @@ GLViewer_ViewManager::~GLViewer_ViewManager()
 {
 }
 
-/*!Sets view name for view window \a theView.*/
-void GLViewer_ViewManager::setViewName(SUIT_ViewWindow* theView)
-{
-    int aPos = myViews.find(theView);
-    theView->setCaption( QString( "GL scene:%1 - viewer:%2" ).arg(myId).arg(aPos+1));
-}
-
 /*!Context menu popup for \a popup.*/
 void GLViewer_ViewManager::contextMenuPopup( QPopupMenu* popup )
 {
index cfc25f1f97084821e022a317a2445a80aa9775a3..3542d63f35cf876df4333af606660068c24c13ec 100644 (file)
@@ -36,18 +36,11 @@ class GLVIEWER_API GLViewer_ViewManager : public SUIT_ViewManager
   Q_OBJECT
 public:
     GLViewer_ViewManager( SUIT_Study* theStudy, SUIT_Desktop* theDesktop );
-    ~GLViewer_ViewManager();
+    virtual ~GLViewer_ViewManager();
 
     GLViewer_Viewer* getGLViewer() { return (GLViewer_Viewer*) myViewModel; }
 
     virtual void     contextMenuPopup( QPopupMenu* );
-
-protected:
-    void         setViewName(SUIT_ViewWindow* theView);
-
-protected:
-    static  int  myMaxId;
-    int          myId;
 };
 
 #endif // GLVIEWER_VIEWMANAGER_H
index 180ed113e3f104660247508b53dfa0b9ad5de61b..3055726ec0eca88903758397465ce623d648825c 100644 (file)
@@ -1367,7 +1367,7 @@ void GLViewer_ViewPort2d::onMaybeTip( QPoint thePoint, QString& theText, QFont&
       int str_size = aList.first().length();
       for( int i = 1, size = aList.count(); i < size; i++ )
       {
-        if( str_size < aList[i].length() )
+        if ( str_size < (int)aList[i].length() )
         {
           index = i;
           str_size = aList[i].length();
index d51c7d3a381f95dc0790ea8177ced823bc5c222b..d978408314bc1aef08253fdc63c11a359a3d3dbf 100644 (file)
@@ -103,3 +103,6 @@ msgstr "Error"
 
 msgid "GLViewer_ViewFrame::DUMP_VIEW_ERROR_DLG_TEXT"
 msgstr "Can't save Dump View in file"
+
+msgid "GLViewer_ViewManager::GL_VIEW_TITLE"
+msgstr "GL Scene:%M - viewer:%V"
index 1e53b1621e8b8dc39c2e95172edeb54ea693cfbd..f77fbe38ed878b5986dcba13576961361d6856d1 100644 (file)
@@ -42,6 +42,7 @@
 
 #include "LightApp_OBSelector.h"
 #include "LightApp_SelectionMgr.h"
+#include "LightApp_DataObject.h"
 
 #include <CAM_Module.h>
 #include <CAM_DataModel.h>
@@ -58,6 +59,7 @@
 #include <QtxMRUAction.h>
 #include <QtxDockAction.h>
 #include <QtxToolBar.h>
+#include <qprocess.h>
 
 #include <LogWindow.h>
 #include <OB_Browser.h>
@@ -233,7 +235,7 @@ myPrefs( 0 )
   myAccel->setActionKey( SUIT_Accel::RotateUp,    ALT+Key_Up,        VTKViewer_Viewer::Type() );
   myAccel->setActionKey( SUIT_Accel::RotateDown,  ALT+Key_Down,      VTKViewer_Viewer::Type() );
 #endif
-#ifndef DISABLE_PLOT2DKVIEWER
+#ifndef DISABLE_PLOT2DVIEWER
   myAccel->setActionKey( SUIT_Accel::PanLeft,     CTRL+Key_Left,     Plot2d_Viewer::Type() );
   myAccel->setActionKey( SUIT_Accel::PanRight,    CTRL+Key_Right,    Plot2d_Viewer::Type() );
   myAccel->setActionKey( SUIT_Accel::PanUp,       CTRL+Key_Up,       Plot2d_Viewer::Type() );
@@ -522,51 +524,53 @@ void LightApp_Application::createActions()
   if ( modIcon.isNull() )
     modIcon = QPixmap( imageEmptyIcon );
 
-  QToolBar* modTBar = new QtxToolBar( true, desk );
-  modTBar->setLabel( tr( "INF_TOOLBAR_MODULES" ) );
+  QStringList modList;
+  modules( modList, false );
 
-  QActionGroup* modGroup = new QActionGroup( this );
-  modGroup->setExclusive( true );
-  modGroup->setUsesDropDown( true );
+  if( modList.count()>1 )
+  {
+    QToolBar* modTBar = new QtxToolBar( true, desk );
+    modTBar->setLabel( tr( "INF_TOOLBAR_MODULES" ) );
 
-  a = createAction( -1, tr( "APP_NAME" ), defIcon, tr( "APP_NAME" ),
-                    tr( "PRP_APP_MODULE" ), 0, desk, true );
-  modGroup->add( a );
-  myActions.insert( QString(), a );
+    QActionGroup* modGroup = new QActionGroup( this );
+    modGroup->setExclusive( true );
+    modGroup->setUsesDropDown( true );
 
-  QMap<QString, QString> iconMap;
-  moduleIconNames( iconMap );
+    a = createAction( -1, tr( "APP_NAME" ), defIcon, tr( "APP_NAME" ),
+                      tr( "PRP_APP_MODULE" ), 0, desk, true );
+    modGroup->add( a );
+    myActions.insert( QString(), a );
 
-  const int iconSize = 20;
+    QMap<QString, QString> iconMap;
+    moduleIconNames( iconMap );
 
-  modGroup->addTo( modTBar );
-  QObjectList *l = modTBar->queryList( "QComboBox" );
-  QObjectListIt oit( *l );
-  while ( QObject* obj = oit.current() ) {
-    QComboBox* cb = (QComboBox*)obj;
-    if ( cb ) cb->setFocusPolicy( QWidget::NoFocus );
+    const int iconSize = 20;
+
+    modGroup->addTo( modTBar );
+    QObjectList *l = modTBar->queryList( "QComboBox" );
+    QObjectListIt oit( *l );
+    while ( QObject* obj = oit.current() ) {
+      QComboBox* cb = (QComboBox*)obj;
+      if ( cb ) cb->setFocusPolicy( QWidget::NoFocus );
     ++oit;
-  }
-  delete l;
+    }
+    delete l;
   
-   modTBar->addSeparator();
-
-  QStringList modList;
-  modules( modList, false );
+    modTBar->addSeparator();
 
-  for ( it = modList.begin(); it != modList.end(); ++it )
-  {
-    if ( !isLibExists( *it ) )
-      continue;
+    for ( it = modList.begin(); it != modList.end(); ++it )
+    {
+      if ( !isLibExists( *it ) )
+        continue;
     
-    QString iconName;
-    if ( iconMap.contains( *it ) )
-      iconName = iconMap[*it];
+      QString iconName;
+      if ( iconMap.contains( *it ) )
+        iconName = iconMap[*it];
 
-    QString modName = moduleName( *it );
+      QString modName = moduleName( *it );
 
-    QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
-    if ( icon.isNull() )
+      QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
+      if ( icon.isNull() )
       {
        icon = modIcon;
        printf( "****************************************************************\n" );
@@ -574,16 +578,18 @@ void LightApp_Application::createActions()
        printf( "****************************************************************\n" );
       }
 
-    icon.convertFromImage( icon.convertToImage().smoothScale( iconSize, iconSize, QImage::ScaleMin ) );
+      icon.convertFromImage( icon.convertToImage().smoothScale( iconSize, iconSize, QImage::ScaleMin ) );
 
-    QAction* a = createAction( -1, *it, icon, *it, tr( "PRP_MODULE" ).arg( *it ), 0, desk, true );
-    a->addTo( modTBar );
-    modGroup->add( a );
+      QAction* a = createAction( -1, *it, icon, *it, tr( "PRP_MODULE" ).arg( *it ), 0, desk, true );
+      a->addTo( modTBar );
+      modGroup->add( a );
 
-    myActions.insert( *it, a );
-  }
+      myActions.insert( *it, a );
+    }
 
-  SUIT_Tools::simplifySeparators( modTBar );
+    SUIT_Tools::simplifySeparators( modTBar );
+    connect( modGroup, SIGNAL( selected( QAction* ) ), this, SLOT( onModuleActivation( QAction* ) ) );
+  }
 
   // New window
   int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
@@ -609,8 +615,6 @@ void LightApp_Application::createActions()
                SHIFT+Key_R, desk, false, this, SLOT( onRenameWindow() ) );
   createMenu( RenameId, windowMenu, -1 );
 
-  connect( modGroup, SIGNAL( selected( QAction* ) ), this, SLOT( onModuleActivation( QAction* ) ) );
-
   int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
   createMenu( PreferencesId, fileMenu, 15, -1 );
   createMenu( separator(), fileMenu, -1, 15, -1 );
@@ -932,8 +936,13 @@ public:
     if ( !myApp.isEmpty())
       {
        aCommand.sprintf("%s %s %s",myApp.latin1(),myParams.latin1(),myHelpFile.latin1());
-       myStatus = system(aCommand);
-       if(myStatus != 0)
+
+       QProcess* proc = new QProcess();
+  proc->addArgument( aCommand );
+       //myStatus = system(aCommand);
+
+       //if(myStatus != 0)
+       if(!proc->start())
          {
            QCustomEvent* ce2000 = new QCustomEvent( 2000 );
            QString* msg = new QString( QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").arg(myApp).arg(myHelpFile) );
@@ -969,7 +978,18 @@ void LightApp_Application::onHelpContentsModule()
   
   QString helpFile = QFileInfo( homeDir + (!aComponentName.compare(QString("KERNEL")) ? aFileNameKernel : aFileName) ).absFilePath();
   SUIT_ResourceMgr* resMgr = resourceMgr();
-  QString anApp = resMgr->stringValue("ExternalBrowser", "application");
+       QString platform;
+#ifdef WIN32
+       platform = "winapplication";
+#else
+       platform = "application";
+#endif
+       QString anApp = resMgr->stringValue("ExternalBrowser", platform);
+#ifdef WIN32
+       QString quote("\""); 
+       anApp.prepend( quote ); 
+       anApp.append( quote ); 
+#endif
   QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
 
   if (!anApp.isEmpty()) {
@@ -994,7 +1014,18 @@ void LightApp_Application::onHelpContextModule(const QString& theComponentName,
 
   QString helpFile = QFileInfo( homeDir + theFileName ).absFilePath();
   SUIT_ResourceMgr* resMgr = resourceMgr();
-  QString anApp = resMgr->stringValue("ExternalBrowser", "application");
+       QString platform;
+#ifdef WIN32
+       platform = "winapplication";
+#else
+       platform = "application";
+#endif
+       QString anApp = resMgr->stringValue("ExternalBrowser", platform);
+#ifdef WIN32
+       QString quote("\""); 
+       anApp.prepend( quote ); 
+       anApp.append( quote ); 
+#endif
   QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
 
   if (!anApp.isEmpty()) {
@@ -1124,11 +1155,13 @@ void LightApp_Application::removeWindow( const int flag, const int studyId )
       sId = activeStudy()->id();
   }
 
+  bool anIsEmpty = !myWindows[flag]->isEmpty();
   QWidget* wid = myWindows[flag]->widget( sId );
   myWindows[flag]->remove( sId );
   delete wid;
 
-  setWindowShown( flag, !myWindows[flag]->isEmpty() );
+  //setWindowShown( flag, !myWindows[flag]->isEmpty() );
+  setWindowShown( flag, anIsEmpty );
 }
 
 /*!
@@ -1414,6 +1447,9 @@ void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
 
   activateModule( defaultModule() );
 
+  if ( objectBrowser() )
+    objectBrowser()->openLevels();
+
   activateWindows();
 }
 
@@ -1430,12 +1466,14 @@ void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
     //aRoot->dump();
   }
   getWindow( WT_ObjectBrowser );
-  if ( objectBrowser() != 0 ) {
+  if ( objectBrowser() )
     objectBrowser()->setRootObject( aRoot );
-  }
 
   activateModule( defaultModule() );
 
+  if ( objectBrowser() )
+    objectBrowser()->openLevels();
+
   activateWindows();
 
   emit studyOpened();
@@ -1448,16 +1486,18 @@ void LightApp_Application::onStudySaved( SUIT_Study* )
 }
 
 /*!Protected SLOT. On study closed.*/
-void LightApp_Application::onStudyClosed( SUIT_Study* )
+void LightApp_Application::onStudyClosed( SUIT_Study* )
 {
-  emit studyClosed();
-
   // Bug 10396: clear selection
   mySelMgr->clearSelected();
 
+  // Bug 12944: emit signal only after clear selection
+  emit studyClosed();
+
   activateModule( "" );
 
-  saveWindowsGeometry();
+  for ( WindowMap::ConstIterator itr = myWindows.begin(); s && itr != myWindows.end(); ++itr )
+    removeWindow( itr.key(), s->id() );
 }
 
 /*!Protected SLOT.On desktop activated.*/
@@ -1548,6 +1588,8 @@ void LightApp_Application::onPreferenceChanged( QString& modName, QString& secti
     sMod->preferencesChanged( section, param );
   else
     preferencesChanged( section, param );
+  // emit signal to allow additional preferences changing processing
+  emit preferenceChanged( modName, section, param );
 }
 
 /*!Private SLOT. On open document with name \a aName.*/
@@ -1560,9 +1602,6 @@ void LightApp_Application::onMRUActivated( QString aName )
 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
 {
   CAM_Application::beforeCloseDoc( s );
-
-  for ( WindowMap::ConstIterator itr = myWindows.begin(); s && itr != myWindows.end(); ++itr )
-    removeWindow( itr.key(), s->id() );
 }
 
 /*!Update actions.*/
@@ -1754,7 +1793,13 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
 
   int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
   pref->setItemProperty( extgroup, "columns", 1 );
-  int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", "application" );
+       QString platform;
+#ifdef WIN32
+       platform = "winapplication";
+#else
+       platform = "application";
+#endif
+  int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
   pref->setItemProperty( apppref, "existing", true );
   pref->setItemProperty( apppref, "flags", QFileInfo::ExeUser );
   pref->setItemProperty( apppref, "readOnly", false );
@@ -2095,8 +2140,15 @@ void LightApp_Application::updateWindows()
   currentWindows( winMap );
 
   if ( activeStudy() ) {
-    for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
-      getWindow( it.key() );
+    for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it ) {
+      getWindow( it.key() ); 
+      
+      Dock dock; int index, extraOffset; bool nl;
+      if ( desktop()->getLocation( myWindows[it.key()], dock, index, nl, extraOffset )
+          &&
+          dock != (Dock)it.data() )
+       desktop()->moveDockWindow( myWindows[it.key()], (Dock)it.data() );
+    }
 
     loadWindowsGeometry();
   }
@@ -2333,13 +2385,14 @@ void LightApp_Application::onRenameWindow()
   \param moduleTitle - title of module
 */
 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
-{ 
+{
   if( moduleTitle.isEmpty() )
     return false;
 
   QString lib = moduleLibrary( moduleTitle );
   
-  bool isPythonModule = lib.contains("libSalomePyQtGUI");
+  //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
+  bool isPythonModule = lib.contains("SalomePyQtGUI");
 
   QStringList paths;
 #ifdef WIN32
@@ -2407,8 +2460,7 @@ bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
        printf( "*    No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).latin1() );
       printf( "****************************************************************\n" );
       return true;
-    }
-  
+  }
   return false;
 }
 
@@ -2461,3 +2513,17 @@ bool LightApp_Application::event( QEvent* e )
   }
   return CAM_Application::event( e );
 }
+
+/*! Check data object */
+bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
+{
+  if (theObj)
+    {
+      bool isSuitable =        !theObj->entry().isEmpty() && 
+                       !theObj->componentDataType().isEmpty() && 
+                       !theObj->name().isEmpty();
+      return isSuitable;
+    }
+
+  return false;
+}
index b7131da99d959aaf112ed86ee6c97fa9d07653a0..b061966babc3ac3ce269dcc2fd442eed42d0fc49 100644 (file)
@@ -40,6 +40,7 @@ class STD_Application;
 class LightApp_WidgetContainer;
 class LightApp_Preferences;
 class LightApp_SelectionMgr;
+class LightApp_DataObject;
 class SUIT_Study;
 class SUIT_Accel;
 class CAM_Module;
@@ -128,6 +129,8 @@ public:
   SUIT_ViewManager*                   getViewManager( const QString&, const bool );
   virtual void                        addViewManager( SUIT_ViewManager* );
   virtual void                        removeViewManager( SUIT_ViewManager* );
+  virtual SUIT_ViewManager*           createViewManager( const QString& vmType );
+
   QWidget*                            getWindow( const int, const int = -1 );
   QWidget*                            window( const int, const int = -1 ) const;
   void                                addWindow( QWidget*, const int, const int = -1 );
@@ -149,11 +152,14 @@ public:
   static int                          studyId();
 
   virtual bool                        event( QEvent* );
+  
+  virtual bool                        checkDataObject( LightApp_DataObject* theObj );
 
 signals:
   void                                studyOpened();
   void                                studySaved();
   void                                studyClosed();
+  void                                preferenceChanged( const QString&, const QString&, const QString& );
 
 public slots:
   virtual void                        onHelpContentsModule();
@@ -189,7 +195,7 @@ protected:
   virtual void                        preferencesChanged( const QString&, const QString& );
   virtual void                        savePreferences();
   virtual void                        updateDesktopTitle();
-
+  
 protected slots:
   virtual void                        onDesktopActivated();
 
@@ -226,7 +232,6 @@ protected:
   QString                             defaultModule() const;
   void                                currentWindows( QMap<int, int>& ) const;
   void                                currentViewManagers( QStringList& ) const;
-  virtual SUIT_ViewManager*           createViewManager( const QString& vmType );
   void                                moduleIconNames( QMap<QString, QString>& ) const;
 
   void                                activateWindows();
index 9fe3b086adcae75c24f3cbfe3812f1e0f818b1e7..702ef7b335b767c327bee3ee850ffa897052c710 100644 (file)
@@ -110,16 +110,29 @@ void LightApp_DataModel::update( LightApp_DataObject*, LightApp_Study* )
 {
   LightApp_ModuleObject* modelRoot = dynamic_cast<LightApp_ModuleObject*>( root() );
   DataObjectList ch;
+  QMap<SUIT_DataObject*,int> aMap;
   if( modelRoot )
   {
     ch = modelRoot->children();
     for ( DataObjectListIterator it( ch ); it.current(); ++it )
       it.current()->setParent( 0 );
   }
+
   build();
+
+  modelRoot = dynamic_cast<LightApp_ModuleObject*>( root() );
+  if( modelRoot )
+  {
+    DataObjectList new_ch = modelRoot->children();
+    for ( DataObjectListIterator it1( new_ch ); it1.current(); ++it1 )
+      aMap.insert( it1.current(), 0 );
+  }
+
   updateWidgets();
+
   for( DataObjectListIterator it( ch ); it.current(); ++it )
-    delete it.current();
+    if( !aMap.contains( it.current() ) )
+      delete it.current();
 }
 
 /*!
index dea72f88c94120a8c6813d8c640264d45f8ab860..979140ad7ee78a26f323d9efaef3a94d35f91554 100644 (file)
 #include <iostream>
 
 /*!Constructor. Initialize by \a theEntry.*/
-LightApp_DataOwner
-::LightApp_DataOwner( const QString& theEntry ): 
-  myEntry( theEntry )
+LightApp_DataOwner::LightApp_DataOwner( const QString& theEntry )
+: myEntry( theEntry )
+{
+}
+
+LightApp_DataOwner::LightApp_DataOwner( const LightApp_DataObject* obj )
+: myEntry( obj ? obj->entry() : QString::null )
 {
 }
 
 #ifndef DISABLE_SALOMEOBJECT
 /*!Constructor. Initialize by \a SALOME_InteractiveObject.*/
-LightApp_DataOwner
-::LightApp_DataOwner( const Handle(SALOME_InteractiveObject)& theIO ):
-  myEntry(!theIO.IsNull()? theIO->getEntry(): ""),
-  myIO(theIO)
+LightApp_DataOwner::LightApp_DataOwner( const Handle(SALOME_InteractiveObject)& theIO )
+: myEntry( !theIO.IsNull() ? theIO->getEntry() : "" ),
+myIO( theIO )
 {
 }
 #endif
 
 /*!Destructor. Do nothing.*/
-LightApp_DataOwner
-::~LightApp_DataOwner()
+LightApp_DataOwner::~LightApp_DataOwner()
 {
 }
 
 /*!Checks: Is current data owner equal \a obj.*/
-bool
-LightApp_DataOwner
-::isEqual( const SUIT_DataOwner& obj ) const
+bool LightApp_DataOwner::isEqual( const SUIT_DataOwner& obj ) const
 {
   const LightApp_DataOwner* other = dynamic_cast<const LightApp_DataOwner*>( &obj );
-
   return other && entry() == other->entry();
 }
 
-bool LightApp_DataOwner::operator<( const SUIT_DataOwner& obj ) const
+bool LightApp_DataOwner::isLess( const SUIT_DataOwner& obj ) const
 {
   const LightApp_DataOwner* other = dynamic_cast<const LightApp_DataOwner*>( &obj );
-  return entry() < other->entry();
+  return other && entry() < other->entry();
 }
 
 /*!Gets entry.*/
index 7fd43eedceb14560da1c81f0194f6efd13f5ef07..989e30c730ca586f6e675b7f5184d861f6b006ef 100644 (file)
@@ -27,6 +27,8 @@
   #include "SALOME_InteractiveObject.hxx"
 #endif
 
+class LightApp_DataObject;
+
 /*!
   This class provide data owner objects.
 */
@@ -36,11 +38,12 @@ public:
 #ifndef DISABLE_SALOMEOBJECT
     LightApp_DataOwner( const Handle(SALOME_InteractiveObject)& theIO );
 #endif
+    LightApp_DataOwner( const LightApp_DataObject* );
     LightApp_DataOwner( const QString& );
     virtual ~LightApp_DataOwner();
 
     virtual bool isEqual( const SUIT_DataOwner& ) const;
-    virtual bool operator<( const SUIT_DataOwner& ) const;
+    virtual bool isLess( const SUIT_DataOwner& ) const;
 
 #ifndef DISABLE_SALOMEOBJECT
     const Handle(SALOME_InteractiveObject)& IO() const;
index aaf1d3613ab45707fb33cf6ce8e211b0bf98e565..80c7d13a39690578a8f54f5af3645982426b7399 100644 (file)
@@ -46,6 +46,16 @@ bool LightApp_DataSubOwner::isEqual( const SUIT_DataOwner& obj ) const
   return false;
 }
 
+/*!Checks: Is current data sub owner less \a obj.*/
+bool LightApp_DataSubOwner::isLess( const SUIT_DataOwner& obj ) const
+{
+  const LightApp_DataSubOwner* other = dynamic_cast<const LightApp_DataSubOwner*>( &obj );
+  if(other && entry() == other->entry()){
+         return index() < other->index();
+  }
+  return other && entry() < other->entry();
+}
+
 /*!Gets index.*/
 int LightApp_DataSubOwner::index() const
 {
index 0bd219c4287c5966c48155fa469891d0acf94545..9b21d18a8d8fd7d359891035d3fe92535943a4b1 100644 (file)
@@ -33,6 +33,7 @@ public:
     virtual ~LightApp_DataSubOwner();
 
     virtual bool isEqual( const SUIT_DataOwner& ) const;
+    virtual bool isLess( const SUIT_DataOwner& obj ) const;
     int          index() const;
 
 private:
index a862d63887eed5cccf10a9df7b5d2a1cdef6e32d..6e3b3b8a027f200e108857851c6116fb3d60b18d 100644 (file)
@@ -35,6 +35,10 @@ class QLabel;
 
 class SUIT_ResourceMgr;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*!
   \class LightApp_Dialog
   Base class for all LightApp dialogs.
@@ -50,7 +54,7 @@ class LIGHTAPP_EXPORT LightApp_Dialog : public QtxDialog
 public:
   typedef QValueList<int>        TypesList;
   typedef QMap<int,QStringList>  SelectedObjects;
-  
+
   enum ObjectWg
   {
     Label   = 0x00000001,
@@ -149,7 +153,7 @@ public:
 
   //! Set all object selection buttons to inactive state
   void deactivateAll();
-  
+
 signals:
   //! selection in certain widget is changed
   void selectionChanged ( int );
@@ -281,9 +285,14 @@ private:
   
 private:
   ObjectMap           myObjects;
+  
   QMap<int,QString>   myTypeNames;
   bool                myIsExclusive, myIsBusy;
   QPixmap             myPixmap;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 3f65e7bcae7a2048a6ed5196ba5348658ae04537..5b4318965931b21d727f29949daa60a5ec25b43b 100644 (file)
@@ -20,6 +20,8 @@
 #ifndef LIGHTAPP_DISPLAYER_HEADER
 #define LIGHTAPP_DISPLAYER_HEADER
 
+#include "LightApp.h"
+
 #include <SALOME_Prs.h>
 
 class QString;
@@ -29,7 +31,7 @@ class QString;
   Uniform mechanism of display/erase of objects in different views.
   Objects are specified by string entry
 */
-class LightApp_Displayer : public SALOME_Displayer
+class LIGHTAPP_EXPORT LightApp_Displayer : public SALOME_Displayer
 {
 public:
   LightApp_Displayer();
index ceebdeeb41d880fc85993ff72d6a2eba9a4f7e23..d7c14c59b186ac0d81ea0770a187c43e59932d9c 100644 (file)
@@ -19,6 +19,7 @@
 #include "LightApp_GLSelector.h"
 
 #include "LightApp_DataOwner.h"
+#include "LightApp_DataObject.h"
 
 #include <GLViewer_Context.h>
 
@@ -64,8 +65,8 @@ void LightApp_GLSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const
     GLViewer_Object* obj = cont->SelectedObject();
     if ( obj )
     {
-      LightApp_GLOwner* owner = dynamic_cast< LightApp_GLOwner* >( obj->owner() );
-      if( owner )
+      LightApp_DataOwner* owner = dynamic_cast<LightApp_DataOwner*>( obj->owner() );
+      if ( owner )
         aList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( owner->entry() ) ) );
     }
   }
@@ -81,70 +82,32 @@ void LightApp_GLSelector::setSelection( const SUIT_DataOwnerPtrList& aList )
   if ( !cont )
     return;
 
-  QMap<QString, GLViewer_Object*> aDisplayed;
-  const ObjList& displayed = cont->getObjects();
-  for ( ObjList::const_iterator it = displayed.begin(); it != displayed.end(); ++it )
-  {
-    GLViewer_Object* obj = *it;
-    if ( obj && obj->getVisible() )
-    {
-      LightApp_GLOwner* owner = dynamic_cast< LightApp_GLOwner* >( obj->owner() );
-      if ( owner )
-       aDisplayed.insert( owner->entry(), obj );
-    }
-  }
-
-  int Nb = 0;
-  cont->clearSelected( false );
+  QMap<QString, int> aSelected;
   for ( SUIT_DataOwnerPtrList::const_iterator itr = aList.begin(); itr != aList.end(); ++itr )
   {
     const LightApp_DataOwner* owner = dynamic_cast<const LightApp_DataOwner*>( (*itr).operator->() );
 
-    if ( !owner )
-      continue;
+    if ( owner )
+      aSelected.insert( owner->entry(), 0 );
+  }
 
-    if ( aDisplayed.contains( owner->entry() ) )
+  bool changed = false;
+  const ObjList& displayed = cont->getObjects();
+  for ( ObjList::const_iterator it = displayed.begin(); it != displayed.end(); ++it )
+  {
+    GLViewer_Object* obj = *it;
+    if ( obj && obj->getVisible() )
     {
-      cont->setSelected( aDisplayed[owner->entry()], false );
-      Nb++;
+      LightApp_DataOwner* owner = dynamic_cast<LightApp_DataOwner*>( obj->owner() );
+      bool sel = owner && aSelected.contains( owner->entry() );
+      changed = changed || sel != (bool)obj->isSelected();
+      if ( sel && !obj->isSelected() )
+        cont->setSelected( obj, false );
+      else if ( !sel && obj->isSelected() )
+        cont->remSelected( obj, false );
     }
   }
 
-  if ( Nb > 0 )
+  if ( changed )
     myViewer->updateAll();
 }
-
-
-/*!
-  Constructor
-  \param entry - entry of object
-*/
-LightApp_GLOwner::LightApp_GLOwner( const char* entry )
-: GLViewer_Owner()
-{
-  setEntry( entry );
-}
-
-/*!
-  Destructor
-*/
-LightApp_GLOwner::~LightApp_GLOwner()
-{
-}
-
-/*!
-  \return entry
-*/
-const char* LightApp_GLOwner::entry() const
-{
-  return myEntry.c_str();
-}
-
-/*!
-  Sets new entry
-  \param entry - entry of object
-*/
-void LightApp_GLOwner::setEntry( const char* entry )
-{
-  myEntry = entry;
-}
index 13cb191beea846b702c16c31dd6730262eb4b664..b6360160497bc134a4a0d9b0d68b7ee3567e4f66 100644 (file)
@@ -28,6 +28,8 @@
 #include <string>
 #include <GLViewer_Object.h>
 
+class LightApp_DataObject;
+
 /*!
   \class LightApp_GLSelector
   Custom selector to get/set selection from GL viewer
@@ -56,20 +58,4 @@ private:
 };
 
 
-/*!
-  This class provide data owner objects for GLViewer.
-*/
-class LIGHTAPP_EXPORT LightApp_GLOwner : public GLViewer_Owner
-{
-public:
-  LightApp_GLOwner( const char* );
-  ~LightApp_GLOwner();
-
-  const char*       entry() const;
-  void              setEntry( const char* );
-
-private:
-  std::string       myEntry;
-};
-
 #endif
index 9c1a71335ff97e3508ff2a8a8b709f7f9eee32e0..86be51db339c179e8bc852124a1ea8935b09518b 100644 (file)
@@ -138,7 +138,6 @@ void LightApp_Module::updateObjBrowser( bool theIsUpdateDataModel,
   bool upd = getApp()->objectBrowser()->isAutoUpdate();
   getApp()->objectBrowser()->setAutoUpdate( false );
 
-  SUIT_DataObject* aDataObject = theDataObject;
   if( theIsUpdateDataModel ){
     if( CAM_DataModel* aDataModel = dataModel() ){
       if ( LightApp_DataModel* aModel = dynamic_cast<LightApp_DataModel*>( aDataModel ) ) {
@@ -149,14 +148,11 @@ void LightApp_Module::updateObjBrowser( bool theIsUpdateDataModel,
        LightApp_DataObject* anObject = dynamic_cast<LightApp_DataObject*>(theDataObject);
        LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(getApp()->activeStudy());
         aModel->update( anObject, aStudy );
-
-       if(aParent && aParent->childPos(anObject) < 0)
-         aDataObject = dynamic_cast<LightApp_DataObject*>(aParent);
       }
     }
   }
   getApp()->objectBrowser()->setAutoUpdate( upd );
-  getApp()->objectBrowser()->updateTree( 0, false /*aDataObject*/ );
+  getApp()->objectBrowser()->updateTree( 0, false );
 }
 
 /*!NOT IMPLEMENTED*/
@@ -340,7 +336,7 @@ QtxPopupMgr* LightApp_Module::popupMgr()
     myPopupMgr->insert( eraseAll, -1, 0 );
     myPopupMgr->insert( separator(), -1, 0 );
 
-    QString oneAndNotActive = "( count( $component ) = 1 ) and ( component != activeModule )";
+    QString oneAndNotActive = "( count( $component ) = 1 ) and ( not( activeModule in $component ) )";
     QString uniform = "true in $canBeDisplayed and %1 and ( activeModule = '%2' )";
     uniform = uniform.arg( oneAndNotActive ).arg( name() );
     myPopupMgr->setRule( disp, /*QString( "( not isVisible ) and " ) + */ uniform, true );
index 17a95366f5dea8a5a2be19c3d728d6b85bac2372..dbfed0b70f9c7b3e194e0128c95840b9d1425c6f 100644 (file)
@@ -46,6 +46,10 @@ class QtxPopupMgr;
 class QString;
 class QVariant;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*!
   \class LightApp_Module
   Base class for all light modules
@@ -84,6 +88,7 @@ public:
   virtual void                        studyActivated() {};
 
   virtual LightApp_Displayer*         displayer();
+  virtual LightApp_Selection*         createSelection() const;
 
 public slots:
   virtual bool                        activateModule( SUIT_Study* );
@@ -107,7 +112,6 @@ protected:
   LightApp_Preferences*               preferences() const;
 
   virtual CAM_DataModel*              createDataModel();
-  virtual LightApp_Selection*         createSelection() const;
 
   int                                 addPreference( const QString& label );
   int                                 addPreference( const QString& label, const int pId, const int = -1,
@@ -140,4 +144,8 @@ protected:
   int                   myDisplay, myErase, myDisplayOnly, myEraseAll;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 0a45b8d35681566ed9b553436cf9728e882ec491..d7777bdaae4b58942a99f9a3a33c8746772f757f 100644 (file)
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-//  File   : LightApp_ModuleDlg.cxx\r
-//  Author : Michael Zorin (mzn)\r
-//  Module : LightApp\r
-\r
-#include <LightApp_ModuleDlg.h>\r
-\r
-#include <qframe.h>\r
-#include <qlabel.h>\r
-#include <qpushbutton.h>\r
-#include <qlayout.h>\r
-#include <qpixmap.h>\r
-\r
-#ifndef WIN32\r
-using namespace std;\r
-#endif\r
-\r
-/*!Default icon*/\r
-static const char* const default_icon[] = { \r
-"48 48 17 1",\r
-". c None",\r
-"# c #161e4c",\r
-"b c #1d3638",\r
-"e c #2f585b",\r
-"i c #345b5e",\r
-"c c #386266",\r
-"g c #3f7477",\r
-"d c #4d8589",\r
-"m c #519099",\r
-"o c #6abbc1",\r
-"a c #70c9d3",\r
-"f c #79ddea",\r
-"n c #7adff2",\r
-"k c #7ce2f4",\r
-"j c #993550",\r
-"h c #d84b71",\r
-"l c #ef537d",\r
-"................................................",\r
-"................................................",\r
-"................................................",\r
-"................................................",\r
-"................................................",\r
-"................########.########.########......",\r
-"...............#aaaaaa###aaaaaa###aaaaaa##......",\r
-"..............#aaaaaa#b#aaaaaa#b#aaaaaa#c#......",\r
-".............########b########b########cc#......",\r
-".............#dddddd#b#dddddd#b#dddddd#cc#......",\r
-"...........########d########d########d#cc#......",\r
-"..........#aaaaaa###aaaaaa###aaaaaa##d#cc#......",\r
-".........#aaaaaa#b#aaaaaa#b#aaaaaa#c#d#cc#......",\r
-"........########b########e########cc#d#c#.......",\r
-"........#dddddd#b#dddddd#e#ffffff#cc#d####......",\r
-"......########d########d########f#cc###g##......",\r
-".....#aaaaaa###aaaaaa###hhhhhh##f#cc#gg#c#......",\r
-"....#aaaaaa#b#aaaaaa#i#hhhhhh#j#f#cc###cc#......",\r
-"...########b########i########jj#f#c#gg#cc#......",\r
-"...#kkkkkk#b#kkkkkk#i#llllll#jj#f####g#cc#......",\r
-"...#kkkkkk#b#kkkkkk#i#llllll#jj###m##g#cc#......",\r
-"...#knnkkk#b#kkkkkk#i#llllll#jj#mm#c#g#cc#......",\r
-"...#knnkkk#b#kkkkkk#i#llllll#jj###cc#g#c#.......",\r
-"...#kkkkkk#b#kkkkkk#i#llllll#j#dd#cc#g####......",\r
-"...#kkkkkk###kkkkkk###llllll####d#cc###g##......",\r
-"...########g########g########o##d#cc#gg#c#......",\r
-"....#gggggg#b#gggggg#b#oooooo#c#d#cc###cc#......",\r
-"...########b########b########cc#d#c#gg#cc#......",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#d####g#cc#......",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc###g##g#cc#......",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#gg#c#g#cc#......",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc###cc#g#c#.......",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#c#gg#cc#g##........",\r
-"...#kkkkkk###kkkkkk###kkkkkk####g#cc###.........",\r
-"...########g########g########g##g#cc#...........",\r
-"....#gggggg#b#gggggg#b#gggggg#c#g#cc#...........",\r
-"...########b########b########cc#g#c#............",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#g##.............",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc###..............",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#................",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#................",\r
-"...#kkkkkk#b#kkkkkk#b#kkkkkk#c#.................",\r
-"...#kkkkkk###kkkkkk###kkkkkk##..................",\r
-"...########.########.########...................",\r
-"................................................",\r
-"................................................",\r
-"................................................",\r
-"................................................"};\r
-\r
-//==============================================================================================================================\r
-/*!\r
- *  LightApp_ModuleDlg::LightApp_ModuleDlg \n\r
- *\r
- *  Constructor.\r
- */\r
-//==============================================================================================================================\r
-LightApp_ModuleDlg::LightApp_ModuleDlg ( QWidget * parent, const QString& component, const QPixmap icon )\r
-     : QDialog ( parent, "ActivateModuleDlg", true,  WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )\r
-{\r
-  QPixmap defaultIcon( ( const char** ) default_icon );\r
-  setCaption( tr( "CAPTION" ) );\r
-  setSizeGripEnabled( TRUE );\r
-  \r
-  QGridLayout* ActivateModuleDlgLayout = new QGridLayout( this ); \r
-  ActivateModuleDlgLayout->setMargin( 11 ); ActivateModuleDlgLayout->setSpacing( 6 );\r
-\r
-  // Module's name and icon\r
-  myComponentFrame = new QFrame( this, "myComponentFrame" );\r
-  myComponentFrame->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ) );\r
-  myComponentFrame->setMinimumHeight( 100 );\r
-  myComponentFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );\r
-  \r
-  QGridLayout* myComponentFrameLayout = new QGridLayout( myComponentFrame ); \r
-  myComponentFrameLayout->setMargin( 11 ); myComponentFrameLayout->setSpacing( 6 );\r
-\r
-  // --> icon\r
-  myComponentIcon = new QLabel( myComponentFrame, "myComponentIcon" );\r
-  myComponentIcon->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );\r
-  myComponentIcon->setPixmap( !icon.isNull() ? icon : defaultIcon );\r
-  myComponentIcon->setScaledContents( false );\r
-  myComponentIcon->setAlignment( AlignCenter );\r
-  // --> name\r
-  myComponentLab = new QLabel( component, myComponentFrame, "myComponentLab" );\r
-  QFont fnt = myComponentLab->font(); fnt.setBold( TRUE ); myComponentLab->setFont( fnt ); \r
-  myComponentLab->setAlignment( AlignCenter );\r
-\r
-  myComponentFrameLayout->addWidget( myComponentIcon, 0, 0 );\r
-  myComponentFrameLayout->addWidget( myComponentLab,  0, 1 );\r
-\r
-  // Info\r
-  QVBoxLayout* infoLayout = new QVBoxLayout();\r
-  infoLayout->setMargin( 0 ); infoLayout->setSpacing( 6 );\r
-  \r
-  // --> top line\r
-  QFrame* myLine1 = new QFrame( this, "myLine1" );\r
-  myLine1->setFrameStyle( QFrame::HLine | QFrame::Plain );\r
-  // --> info label  \r
-  myInfoLabel = new QLabel( tr ("ActivateComponent_DESCRIPTION"), this, "myInfoLabel" );\r
-  myInfoLabel->setAlignment( AlignCenter );\r
-  // --> bottom line\r
-  QFrame*  myLine2 = new QFrame( this, "myLine2" );\r
-  myLine2->setFrameStyle( QFrame::HLine | QFrame::Plain );\r
-  \r
-  infoLayout->addStretch();\r
-  infoLayout->addWidget( myLine1 );\r
-  infoLayout->addWidget( myInfoLabel );\r
-  infoLayout->addWidget( myLine2 );\r
-  infoLayout->addStretch();\r
-  \r
-  // Buttons\r
-  QHBoxLayout* btnLayout = new QHBoxLayout(); \r
-  btnLayout->setMargin( 0 ); btnLayout->setSpacing( 6 );\r
-  \r
-  // --> New\r
-  myNewBtn = new QPushButton( tr( "NEW" ), this, "myNewBtn" );\r
-  myNewBtn->setDefault( true ); myNewBtn->setAutoDefault( true );\r
-  // --> Open\r
-  myOpenBtn = new QPushButton( tr( "OPEN" ), this, "myOpenBtn" );\r
-  myOpenBtn->setAutoDefault( true );\r
-  // --> Load\r
-  myLoadBtn = new QPushButton( tr( "LOAD" ), this, "myLoadBtn" );\r
-  myLoadBtn->setAutoDefault( true );\r
-  // --> Cancel\r
-  myCancelBtn = new QPushButton( tr( "CANCEL" ), this, "myCancelBtn" );\r
-  myCancelBtn->setAutoDefault( true );\r
-  \r
-  btnLayout->addWidget( myNewBtn );\r
-  btnLayout->addWidget( myOpenBtn );\r
-  btnLayout->addWidget( myLoadBtn );\r
-  btnLayout->addStretch();\r
-  btnLayout->addSpacing( 70 );\r
-  btnLayout->addStretch();\r
-  btnLayout->addWidget( myCancelBtn );\r
-\r
-  ActivateModuleDlgLayout->addWidget(          myComponentFrame, 0,    0    );\r
-  ActivateModuleDlgLayout->addLayout(          infoLayout,       0,    1    );\r
-  ActivateModuleDlgLayout->addMultiCellLayout( btnLayout,        1, 1, 0, 1 );\r
-\r
-  // signals and slots connections\r
-  connect( myNewBtn,    SIGNAL( clicked() ), this, SLOT( onButtonClicked() ) );\r
-  connect( myOpenBtn,   SIGNAL( clicked() ), this, SLOT( onButtonClicked() ) );\r
-  connect( myLoadBtn,   SIGNAL( clicked() ), this, SLOT( onButtonClicked() ) );\r
-  connect( myCancelBtn, SIGNAL( clicked() ), this, SLOT( reject() ) );\r
-}\r
-\r
-//==============================================================================================================================\r
-/*!\r
- *  LightApp_ModuleDlg::onButtonClicked\r
- *\r
- *  Buttons slot\r
- */\r
-//==============================================================================================================================\r
-void LightApp_ModuleDlg::onButtonClicked()\r
-{\r
-  QPushButton* btn = ( QPushButton* )sender();\r
-  if ( btn == myNewBtn )\r
-    done( 1 );\r
-  if ( btn == myOpenBtn )\r
-    done( 2 );\r
-  if ( btn == myLoadBtn )\r
-    done( 3 );\r
-}\r
+//  File   : LightApp_ModuleDlg.cxx
+//  Author : Michael Zorin (mzn)
+//  Module : LightApp
+
+#include <LightApp_ModuleDlg.h>
+
+#include <qframe.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+
+#ifndef WIN32
+using namespace std;
+#endif
+
+/*!Default icon*/
+static const char* const default_icon[] = { 
+"48 48 17 1",
+". c None",
+"# c #161e4c",
+"b c #1d3638",
+"e c #2f585b",
+"i c #345b5e",
+"c c #386266",
+"g c #3f7477",
+"d c #4d8589",
+"m c #519099",
+"o c #6abbc1",
+"a c #70c9d3",
+"f c #79ddea",
+"n c #7adff2",
+"k c #7ce2f4",
+"j c #993550",
+"h c #d84b71",
+"l c #ef537d",
+"................................................",
+"................................................",
+"................................................",
+"................................................",
+"................................................",
+"................########.########.########......",
+"...............#aaaaaa###aaaaaa###aaaaaa##......",
+"..............#aaaaaa#b#aaaaaa#b#aaaaaa#c#......",
+".............########b########b########cc#......",
+".............#dddddd#b#dddddd#b#dddddd#cc#......",
+"...........########d########d########d#cc#......",
+"..........#aaaaaa###aaaaaa###aaaaaa##d#cc#......",
+".........#aaaaaa#b#aaaaaa#b#aaaaaa#c#d#cc#......",
+"........########b########e########cc#d#c#.......",
+"........#dddddd#b#dddddd#e#ffffff#cc#d####......",
+"......########d########d########f#cc###g##......",
+".....#aaaaaa###aaaaaa###hhhhhh##f#cc#gg#c#......",
+"....#aaaaaa#b#aaaaaa#i#hhhhhh#j#f#cc###cc#......",
+"...########b########i########jj#f#c#gg#cc#......",
+"...#kkkkkk#b#kkkkkk#i#llllll#jj#f####g#cc#......",
+"...#kkkkkk#b#kkkkkk#i#llllll#jj###m##g#cc#......",
+"...#knnkkk#b#kkkkkk#i#llllll#jj#mm#c#g#cc#......",
+"...#knnkkk#b#kkkkkk#i#llllll#jj###cc#g#c#.......",
+"...#kkkkkk#b#kkkkkk#i#llllll#j#dd#cc#g####......",
+"...#kkkkkk###kkkkkk###llllll####d#cc###g##......",
+"...########g########g########o##d#cc#gg#c#......",
+"....#gggggg#b#gggggg#b#oooooo#c#d#cc###cc#......",
+"...########b########b########cc#d#c#gg#cc#......",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#d####g#cc#......",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc###g##g#cc#......",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#gg#c#g#cc#......",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc###cc#g#c#.......",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#c#gg#cc#g##........",
+"...#kkkkkk###kkkkkk###kkkkkk####g#cc###.........",
+"...########g########g########g##g#cc#...........",
+"....#gggggg#b#gggggg#b#gggggg#c#g#cc#...........",
+"...########b########b########cc#g#c#............",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#g##.............",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc###..............",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#................",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#cc#................",
+"...#kkkkkk#b#kkkkkk#b#kkkkkk#c#.................",
+"...#kkkkkk###kkkkkk###kkkkkk##..................",
+"...########.########.########...................",
+"................................................",
+"................................................",
+"................................................",
+"................................................"};
+
+//==============================================================================================================================
+/*!
+ *  LightApp_ModuleDlg::LightApp_ModuleDlg \n
+ *
+ *  Constructor.
+ */
+//==============================================================================================================================
+LightApp_ModuleDlg::LightApp_ModuleDlg ( QWidget * parent, const QString& component, const QPixmap icon )
+     : QDialog ( parent, "ActivateModuleDlg", true,  WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
+{
+  QPixmap defaultIcon( ( const char** ) default_icon );
+  setCaption( tr( "CAPTION" ) );
+  setSizeGripEnabled( TRUE );
+  
+  QGridLayout* ActivateModuleDlgLayout = new QGridLayout( this ); 
+  ActivateModuleDlgLayout->setMargin( 11 ); ActivateModuleDlgLayout->setSpacing( 6 );
+
+  // Module's name and icon
+  myComponentFrame = new QFrame( this, "myComponentFrame" );
+  myComponentFrame->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ) );
+  myComponentFrame->setMinimumHeight( 100 );
+  myComponentFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
+  
+  QGridLayout* myComponentFrameLayout = new QGridLayout( myComponentFrame ); 
+  myComponentFrameLayout->setMargin( 11 ); myComponentFrameLayout->setSpacing( 6 );
+
+  // --> icon
+  myComponentIcon = new QLabel( myComponentFrame, "myComponentIcon" );
+  myComponentIcon->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+  myComponentIcon->setPixmap( !icon.isNull() ? icon : defaultIcon );
+  myComponentIcon->setScaledContents( false );
+  myComponentIcon->setAlignment( AlignCenter );
+  // --> name
+  myComponentLab = new QLabel( component, myComponentFrame, "myComponentLab" );
+  QFont fnt = myComponentLab->font(); fnt.setBold( TRUE ); myComponentLab->setFont( fnt ); 
+  myComponentLab->setAlignment( AlignCenter );
+
+  myComponentFrameLayout->addWidget( myComponentIcon, 0, 0 );
+  myComponentFrameLayout->addWidget( myComponentLab,  0, 1 );
+
+  // Info
+  QVBoxLayout* infoLayout = new QVBoxLayout();
+  infoLayout->setMargin( 0 ); infoLayout->setSpacing( 6 );
+  
+  // --> top line
+  QFrame* myLine1 = new QFrame( this, "myLine1" );
+  myLine1->setFrameStyle( QFrame::HLine | QFrame::Plain );
+  // --> info label  
+  myInfoLabel = new QLabel( tr ("ActivateComponent_DESCRIPTION"), this, "myInfoLabel" );
+  myInfoLabel->setAlignment( AlignCenter );
+  // --> bottom line
+  QFrame*  myLine2 = new QFrame( this, "myLine2" );
+  myLine2->setFrameStyle( QFrame::HLine | QFrame::Plain );
+  
+  infoLayout->addStretch();
+  infoLayout->addWidget( myLine1 );
+  infoLayout->addWidget( myInfoLabel );
+  infoLayout->addWidget( myLine2 );
+  infoLayout->addStretch();
+  
+  // Buttons
+  QHBoxLayout* btnLayout = new QHBoxLayout(); 
+  btnLayout->setMargin( 0 ); btnLayout->setSpacing( 6 );
+  
+  // --> New
+  myNewBtn = new QPushButton( tr( "NEW" ), this, "myNewBtn" );
+  myNewBtn->setDefault( true ); myNewBtn->setAutoDefault( true );
+  // --> Open
+  myOpenBtn = new QPushButton( tr( "OPEN" ), this, "myOpenBtn" );
+  myOpenBtn->setAutoDefault( true );
+  // --> Load
+  myLoadBtn = new QPushButton( tr( "LOAD" ), this, "myLoadBtn" );
+  myLoadBtn->setAutoDefault( true );
+  // --> Cancel
+  myCancelBtn = new QPushButton( tr( "CANCEL" ), this, "myCancelBtn" );
+  myCancelBtn->setAutoDefault( true );
+  
+  btnLayout->addWidget( myNewBtn );
+  btnLayout->addWidget( myOpenBtn );
+  btnLayout->addWidget( myLoadBtn );
+  btnLayout->addStretch();
+  btnLayout->addSpacing( 70 );
+  btnLayout->addStretch();
+  btnLayout->addWidget( myCancelBtn );
+
+  ActivateModuleDlgLayout->addWidget(          myComponentFrame, 0,    0    );
+  ActivateModuleDlgLayout->addLayout(          infoLayout,       0,    1    );
+  ActivateModuleDlgLayout->addMultiCellLayout( btnLayout,        1, 1, 0, 1 );
+
+  // signals and slots connections
+  connect( myNewBtn,    SIGNAL( clicked() ), this, SLOT( onButtonClicked() ) );
+  connect( myOpenBtn,   SIGNAL( clicked() ), this, SLOT( onButtonClicked() ) );
+  connect( myLoadBtn,   SIGNAL( clicked() ), this, SLOT( onButtonClicked() ) );
+  connect( myCancelBtn, SIGNAL( clicked() ), this, SLOT( reject() ) );
+}
+
+//==============================================================================================================================
+/*!
+ *  LightApp_ModuleDlg::onButtonClicked
+ *
+ *  Buttons slot
+ */
+//==============================================================================================================================
+void LightApp_ModuleDlg::onButtonClicked()
+{
+  QPushButton* btn = ( QPushButton* )sender();
+  if ( btn == myNewBtn )
+    done( 1 );
+  if ( btn == myOpenBtn )
+    done( 2 );
+  if ( btn == myLoadBtn )
+    done( 3 );
+}
index 3db25268573532cd78cdacef42e6c17a4be096cd..175356d91055531231907238bc4a7c9d631056dd 100644 (file)
 
 #include "LightApp_DataOwner.h"
 #include "LightApp_DataObject.h"
+#include "LightApp_Application.h"
 
 #include <OB_Browser.h>
 
+#include <SUIT_Session.h>
 #include <SUIT_DataObjectIterator.h>
+
 #include <qdatetime.h>
 
+#include <time.h>
+
 /*!
   Constructor
 */
@@ -61,6 +66,12 @@ OB_Browser* LightApp_OBSelector::browser() const
 void LightApp_OBSelector::getSelection( SUIT_DataOwnerPtrList& theList ) const
 {
   if (mySelectedList.count() == 0 ) {
+    SUIT_Session* session = SUIT_Session::session();
+    SUIT_Application* sapp = session ? session->activeApplication() : 0;
+    LightApp_Application* app = dynamic_cast<LightApp_Application*>( sapp );
+    if( !app )
+      return;
+
     if ( !myBrowser )
       return;
     DataObjectList objlist;
@@ -69,7 +80,7 @@ void LightApp_OBSelector::getSelection( SUIT_DataOwnerPtrList& theList ) const
     for ( DataObjectListIterator it( objlist ); it.current(); ++it )
     {
       LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>( it.current() );
-      if ( obj )
+      if ( obj && app->checkDataObject(obj) )
       {
 #ifndef DISABLE_SALOMEOBJECT
         Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
index 446ae593bf46bdbea8381408e4d4823d1f35c556..690f8da6437838b1c59ecbadf7d6abcacd3705b1 100644 (file)
@@ -33,8 +33,10 @@ LightApp_OCCSelector::LightApp_OCCSelector( OCCViewer_Viewer* viewer, SUIT_Selec
 : SUIT_Selector( mgr, viewer ),
   myViewer( viewer )
 {
-  if ( myViewer )
+  if ( myViewer ) {
     connect( myViewer, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
+    connect( myViewer, SIGNAL( deselection() ), this, SLOT( onDeselection() ) );
+  }
 }
 
 /*!
@@ -52,12 +54,46 @@ OCCViewer_Viewer* LightApp_OCCSelector::viewer() const
   return myViewer;
 }
 
+/*!
+  Acess to external selection for reading( protected )
+*/
+const SUIT_DataOwnerPtrList& LightApp_OCCSelector::getSelectedExt() const
+{
+  return mySelectedExternals;
+}
+
+
+/*!
+  Append owner to external selection ( protected )
+*/
+void LightApp_OCCSelector::appendSelExtOwner( SUIT_DataOwner* theOwner )
+{
+  if ( theOwner )
+    mySelectedExternals.append( theOwner );
+}
+
+/*!
+  Clear external selection
+*/
+void LightApp_OCCSelector::clearSelExtOwners()
+{
+  mySelectedExternals.clear();
+}
+
+
+
 /*!On selection changed.*/
 void LightApp_OCCSelector::onSelectionChanged()
 {
   selectionChanged();
 }
 
+/*!On selection cleared.*/
+void LightApp_OCCSelector::onDeselection()
+{
+  clearSelExtOwners();
+}
+
 /*!Gets selection list.*/
 void LightApp_OCCSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const
 {
@@ -77,6 +113,11 @@ void LightApp_OCCSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const
       aList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( entry( anIt.Value() ) ) ) );
 #endif
     }
+  // add externally selected objects
+  SUIT_DataOwnerPtrList::const_iterator anExtIter;
+  for(anExtIter = getSelectedExt().begin(); anExtIter != getSelectedExt().end(); anExtIter++) {
+    aList.append(*anExtIter);
+  }
 }
 
 /*!Sets selection list.*/
@@ -99,12 +140,16 @@ void LightApp_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList )
     if ( !entryStr.isEmpty() )
       aDisplayed.insert( entryStr, it.Value() );
   }
+  
+  clearSelExtOwners();
 
   for ( SUIT_DataOwnerPtrList::const_iterator itr = aList.begin(); itr != aList.end(); ++itr )
   {
     const LightApp_DataOwner* owner = dynamic_cast<const LightApp_DataOwner*>( (*itr).operator->() );
     if ( owner && aDisplayed.contains( owner->entry() ) )
       aSelList.Append( aDisplayed[owner->entry()] );
+    else
+      appendSelExtOwner( *itr );
   }
 
   myViewer->unHighlightAll( false );
index c358efe8aa48fd387c1442201afb0a880a17783d..4a8e82f621d533f2f0842b0f556d85ba01ca0fa5 100644 (file)
@@ -22,6 +22,7 @@
 #include "LightApp.h"
 
 #include <SUIT_Selector.h>
+#include <SUIT_DataOwner.h>
 
 #include <OCCViewer_ViewModel.h>
 
@@ -45,6 +46,7 @@ public:
 
 private slots:
   virtual void      onSelectionChanged();
+  virtual void      onDeselection();
 
 protected:
   virtual void      getSelection( SUIT_DataOwnerPtrList& ) const;
@@ -52,8 +54,12 @@ protected:
 
   QString           entry( const Handle_AIS_InteractiveObject& ) const;
 
+  const SUIT_DataOwnerPtrList& getSelectedExt() const;
+  void              appendSelExtOwner( SUIT_DataOwner* );
+  void              clearSelExtOwners();
 private:
-  OCCViewer_Viewer* myViewer;
+  OCCViewer_Viewer*     myViewer;
+  SUIT_DataOwnerPtrList mySelectedExternals;
 };
 
 #endif
index 5620c41d389b82ada1e64ea751f55098b6ff5b53..fe0a15207ca64bd90a601988deb7125cde04e4fd 100644 (file)
@@ -86,7 +86,7 @@ void LightApp_Selection::init( const QString& client, LightApp_SelectionMgr* mgr
       LightApp_DataOwner* sowner = dynamic_cast<LightApp_DataOwner*>( (*anIt ).get() );
       if( sowner )
       {
-        entry = myStudy->referencedToEntry( sowner->entry() );
+        entry = referencedToEntry( sowner->entry() );
        if( entries.contains( entry ) )
          continue;
 
@@ -100,6 +100,11 @@ void LightApp_Selection::init( const QString& client, LightApp_SelectionMgr* mgr
   }
 }
 
+QString LightApp_Selection::referencedToEntry( const QString& entry ) const
+{
+  return myStudy->referencedToEntry( entry );
+}
+
 /*!
   Gets count of entries.
 */
@@ -147,6 +152,9 @@ QtxValue LightApp_Selection::param( const int ind, const QString& p ) const
   else if( p=="isReference" )
     return QtxValue( isReference( ind ), false );
 
+  else if( p=="displayer" )
+    return param( ind, "component" );
+
   else if( p=="canBeDisplayed" )
   {
     QString mod_name = app->moduleTitle( param( ind, "component" ).toString() );
index 846699f3b5c413c33be073889e17c2c5efb9665b..7756a767dac82409fb1fef835018febf4e55981f 100644 (file)
@@ -65,6 +65,7 @@ protected:
   LightApp_Study*                study() const { return myStudy; }
   QString                        activeViewType() const;
   SUIT_ViewWindow*               activeVW() const;
+  virtual QString                referencedToEntry( const QString& ) const;
 
 private:
   QString                        myPopupClient;
index a329cf88915c6f3bf88248fc10df89d986e903fb..657e30d9d16f9beef26f253f8a642b371a81f377 100644 (file)
@@ -63,17 +63,25 @@ void LightApp_ShowHideOp::startOperation()
   }
 
   LightApp_SelectionMgr* mgr = app->selectionMgr();
-  LightApp_Selection sel; sel.init( "", mgr );
-  if( sel.count()==0 && myActionType!=ERASE_ALL )
+  LightApp_Module* mod = dynamic_cast<LightApp_Module*>( app->activeModule() );
+  if( !mod )
+    return;
+
+  LightApp_Selection* sel = mod->createSelection();
+  if( !sel )
+    return;
+
+  sel->init( "", mgr );
+  if( sel->count()==0 && myActionType!=ERASE_ALL )
   {
     abort();
     return;
   }
 
   QString mod_name;
-  if( sel.count()>0 )
+  if( sel->count()>0 )
   {
-    QString aStr =  sel.param( 0, "component" ).toString();
+    QString aStr =  sel->param( 0, "displayer" ).toString();
     mod_name = app->moduleTitle( aStr );
   }
   else if( app->activeModule() )
@@ -144,4 +152,6 @@ void LightApp_ShowHideOp::startOperation()
   }
   d->UpdateViewer();
   commit();
+
+  delete sel;
 }
index d28da9faed22f01f9c422bd8777d048cf3ed6c53..99214fb9f2dbfa3e0a892ca24837bdddf67442fc 100644 (file)
 /*!
   Constructor.
 */
-LightApp_SVTKDataOwner
-::LightApp_SVTKDataOwner( const Handle(SALOME_InteractiveObject)& theIO,
-                         SUIT_Desktop* theDesktop ):
-  LightApp_DataOwner( theIO ),
-  myDesktop( theDesktop )
-{}
-#endif
-
-/*!
-  Destuctor.
-*/
-LightApp_SVTKDataOwner
-::~LightApp_SVTKDataOwner()
+LightApp_SVTKDataOwner::LightApp_SVTKDataOwner( const Handle(SALOME_InteractiveObject)& theIO,
+                                                                 SUIT_Desktop* theDesktop )
+: LightApp_DataOwner( theIO ),
+myDesktop( theDesktop )
+{
+}
+#else
+LightApp_SVTKDataOwner::LightApp_SVTKDataOwner( const QString& theEntry )
+: LightApp_DataOwner( theEntry )
 {
 }
+#endif
 
 /*!
   \return active SVTK view window
@@ -119,6 +116,14 @@ LightApp_SVTKDataOwner
 
 #endif
 
+/*!
+  Destuctor.
+*/
+/*
+LightApp_SVTKDataOwner::~LightApp_SVTKDataOwner()
+{
+}
+*/
 
 #ifndef DISABLE_VTKVIEWER
 /*!
@@ -134,14 +139,6 @@ LightApp_VTKSelector
     connect( myViewer, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
 }
 
-/*!
-  Destructor.
-*/
-LightApp_VTKSelector
-::~LightApp_VTKSelector()
-{
-}
-
 /*!
   Gets viewer.
 */
index aebf5f54a757bd65ca255a298c02af454fc81bb3..0f185cc53a6aa96fcad70337421c5d2d9c262c32 100644 (file)
@@ -43,12 +43,13 @@ class SUIT_Desktop;
 class LIGHTAPP_EXPORT LightApp_SVTKDataOwner : public LightApp_DataOwner
 {
  public:
+   virtual ~LightApp_SVTKDataOwner() {};
 #ifndef DISABLE_VTKVIEWER
    #ifndef DISABLE_SALOMEOBJECT
-    LightApp_SVTKDataOwner( const Handle(SALOME_InteractiveObject)& theIO,
-                           SUIT_Desktop* theDesktop );
+    LightApp_SVTKDataOwner( const Handle(SALOME_InteractiveObject)&, SUIT_Desktop* );
+   #else
+    LightApp_SVTKDataOwner( const QString& );
    #endif
-    virtual ~LightApp_SVTKDataOwner();
 
     /*!Gets dataowners ids list.*/
     const TColStd_IndexedMapOfInteger& GetIds() const;
@@ -64,9 +65,6 @@ class LIGHTAPP_EXPORT LightApp_SVTKDataOwner : public LightApp_DataOwner
 
     SVTK_ViewWindow* GetActiveViewWindow() const;
     SUIT_Desktop* myDesktop;
-    
-#else
-  LightApp_SVTKDataOwner( const QString& );
 #endif
 };
 
@@ -80,9 +78,9 @@ class LIGHTAPP_EXPORT LightApp_VTKSelector : public SUIT_Selector
   Q_OBJECT;
 
 public:
+  virtual ~LightApp_VTKSelector() {};
 #ifndef DISABLE_VTKVIEWER
   LightApp_VTKSelector( SVTK_ViewModelBase*, SUIT_SelectionMgr* );
-  virtual ~LightApp_VTKSelector();
 
   SVTK_ViewModelBase* viewer() const;
 
index 0bd6d185f1d6f3dfd9fe5b713084d8decee59c4b..f55c420e760cf224574ad9bcb3b92157a91b103c 100755 (executable)
@@ -32,7 +32,7 @@ VPATH=.:@srcdir@
 
 @COMMENCE@
 
-SUBDIRS = Qtx DDS QDS SUIT STD CAF CAM SUITApp LogWindow ObjBrowser Prs
+SUBDIRS = Qtx Style DDS QDS SUIT STD CAF CAM SUITApp LogWindow ObjBrowser Prs
 
 ifneq ($(DISABLE_SALOMEOBJECT),yes)
   SUBDIRS += OBJECT
@@ -66,7 +66,7 @@ endif
 ifneq ($(DISABLE_SUPERVGRAPHVIEWER),yes)
   SUBDIRS += SUPERVGraph
 endif
-SUBDIRS += LightApp Style ResExporter
+SUBDIRS += LightApp ResExporter
 
 ifneq ($(GUI_DISABLE_CORBA),yes)
   SUBDIRS +=  RegistryDisplay TOOLSGUI \
index 842759ae3b65c3968b8149c435d366e9b89c1e9d..c8e9a28d118f8f51d3c313d0db8e5ab816a23b5e 100755 (executable)
@@ -54,7 +54,8 @@ LIB_SRC= OCCViewer_AISSelector.cxx \
         OCCViewer_ViewWindow.cxx \
         OCCViewer_VService.cxx \
         OCCViewer_CreateRestoreViewDlg.cxx \
-        OCCViewer_ClippingDlg.cxx
+        OCCViewer_ClippingDlg.cxx \
+        OCCViewer_SetRotationPointDlg.cxx
 
 LIB_MOC = OCCViewer_AISSelector.h \
           OCCViewer_ViewModel.h \
@@ -63,7 +64,8 @@ LIB_MOC = OCCViewer_AISSelector.h \
          OCCViewer_ViewWindow.h \
          OCCViewer_ViewManager.h \
          OCCViewer_CreateRestoreViewDlg.h \
-         OCCViewer_ClippingDlg.h
+         OCCViewer_ClippingDlg.h \
+         OCCViewer_SetRotationPointDlg.h
 
 RESOURCES_FILES = \
 view_back.png \
index bedb9eacbe339046f627276fdf3fe2e1d936e813..106e28b8f936830b36ecdabc02cf7ed7b8e78423 100644 (file)
@@ -220,6 +220,9 @@ OCCViewer_ClippingDlg::OCCViewer_ClippingDlg( OCCViewer_ViewWindow* view, QWidge
   connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
   
   myBusy = false;
+
+  connect(view, SIGNAL(Show( QShowEvent * )), this, SLOT(onViewShow()));
+  connect(view, SIGNAL(Hide( QHideEvent * )), this, SLOT(onViewHide()));
 }
 
 /*!
@@ -559,3 +562,17 @@ void OCCViewer_ClippingDlg::ReserveClippingPlane()
        myClippingPlane = aView3d->ActivePlane();
     }
 }
+
+void OCCViewer_ClippingDlg::onViewShow()
+{
+  if(myAction->isOn())
+    show();
+  else
+    hide();
+}
+
+void OCCViewer_ClippingDlg::onViewHide()
+{
+  hide();
+}
+
index 27efa2e9049d31a2449b3fc95b15bed37dcdb043..bed795811b7b16abdb380a6c5bcc2b40b54f8300 100644 (file)
@@ -105,6 +105,9 @@ private slots:
   void onModeChanged( int mode );
   void onValueChanged();
   void onPreview( bool on );
+
+  void onViewShow();
+  void onViewHide();
 };
 
 #endif // OCCVIEWER_CLIPPINGDLG_H
index 747ee1d39a418d5a035dda7b600609bfc724286a..e97cde8b9a9bbffcf3e3eb82050dfcf37bbcfab1 100755 (executable)
@@ -118,7 +118,7 @@ void OCCViewer_CreateRestoreViewDlg::changeImage( QListBoxItem* curItem )
                int index = curItem->listBox()->index( curItem );
                if( myKeyFlag == 2 )
                {
-                       for( int i = 0; i < myListBox->count(); i++ )
+                       for( int i = 0; i < (int)myListBox->count(); i++ )
                        {
                                if( myListBox->isSelected( i ) && i != index )
                                {
@@ -172,11 +172,11 @@ void OCCViewer_CreateRestoreViewDlg::deleteSelectedItems()
        if( myListBox->count() && myListBox->isEditEnabled() )
        {
                int curIndex = -1;
-               for( int i = 0; i < myListBox->count(); i++ )
+               for( int i = 0; i < (int)myListBox->count(); i++ )
                        if( myListBox->isSelected( i ) )
                        {
                                myListBox->removeItem( i );
-                               for( int j = i; j < myParametersMap.count(); j++ )
+                               for( int j = i; j < (int)myParametersMap.count(); j++ )
                                        if( j != myParametersMap.count() - 1 )
                                                myParametersMap[ j ] = myParametersMap[ j + 1 ];
                                        else
diff --git a/src/OCCViewer/OCCViewer_SetRotationPointDlg.cxx b/src/OCCViewer/OCCViewer_SetRotationPointDlg.cxx
new file mode 100644 (file)
index 0000000..0aed2c2
--- /dev/null
@@ -0,0 +1,278 @@
+// Copyright (C) 2005  CEA/DEN, EDF R&D, OPEN CASCADE, PRINCIPIA R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#include "OCCViewer_SetRotationPointDlg.h"
+
+#include <QtxAction.h>
+
+#include "OCCViewer_ViewWindow.h"
+
+#include <qlineedit.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qvalidator.h>
+#include <qbuttongroup.h>
+#include <qobjectlist.h>
+#include <qcheckbox.h>
+#include <qhbox.h>
+
+/*!
+  Constructor
+  \param view - view window
+  \param parent - parent widget
+  \param name - dialog name
+  \param modal - is this dialog modal
+  \param fl - flags
+*/
+OCCViewer_SetRotationPointDlg::OCCViewer_SetRotationPointDlg( OCCViewer_ViewWindow* view, QWidget* parent, const char* name, bool modal, WFlags fl )
+: QDialog( parent, "OCCViewer_SetRotationPointDlg", modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
+  myView( view )
+{
+  setCaption(tr("CAPTION"));
+  setSizeGripEnabled(TRUE);
+
+  // Create layout for this dialog
+  QGridLayout* layoutDlg = new QGridLayout (this);
+  layoutDlg->setSpacing(6);
+  layoutDlg->setMargin(11);
+
+  // Create check box "Use Bounding Box Center"
+  QHBox* aCheckBox = new QHBox(this);
+
+  myIsBBCenter = new QCheckBox(tr("USE_BBCENTER"), aCheckBox);
+  myIsBBCenter->setChecked(true);
+  connect(myIsBBCenter, SIGNAL(stateChanged(int)), SLOT(onBBCenterChecked()));
+
+  // Create croup button with radio buttons
+  myGroupSelButton = new QButtonGroup(2,Qt::Vertical,"",this);
+  myGroupSelButton->setMargin(11);
+  
+  // Create "Set to Origin" button
+  myToOrigin = new QPushButton(myGroupSelButton);
+  myToOrigin->setText(tr("LBL_TOORIGIN"));
+  connect(myToOrigin, SIGNAL(clicked()), this, SLOT(onToOrigin()));
+
+  // Create "Select Point from View" button
+  mySelectPoint = new QPushButton(myGroupSelButton);
+  mySelectPoint->setText(tr("LBL_SELECTPOINT"));
+  mySelectPoint->setToggleButton(true);
+  connect(mySelectPoint, SIGNAL(clicked()), this, SLOT(onSelectPoint()));
+
+  // Create croup box with grid layout
+  myGroupBoxCoord = new QGroupBox(this, "GroupBox");
+  QHBoxLayout* aHBoxLayout = new QHBoxLayout(myGroupBoxCoord);
+  aHBoxLayout->setMargin(11);
+  aHBoxLayout->setSpacing(6);
+
+  // "X" coordinate
+  QLabel* TextLabelX = new QLabel (tr("LBL_X"), myGroupBoxCoord, "TextLabelX");
+  TextLabelX->setFixedWidth(15);
+  myX = new QLineEdit(myGroupBoxCoord);
+  myX->setValidator(new QDoubleValidator(myX));
+  myX->setText(QString::number(0.0));
+  connect(myX, SIGNAL(textChanged(const QString&)), this, SLOT(onCoordChanged()));
+
+  // "Y" coordinate
+  QLabel* TextLabelY = new QLabel (tr("LBL_Y"), myGroupBoxCoord, "TextLabelY");
+  TextLabelY->setFixedWidth(15);
+  myY = new QLineEdit(myGroupBoxCoord);
+  myY->setValidator(new QDoubleValidator(myY));
+  myY->setText(QString::number(0.0));
+  connect(myY, SIGNAL(textChanged(const QString&)), this, SLOT(onCoordChanged()));
+
+  // "Z" coordinate
+  QLabel* TextLabelZ = new QLabel (tr("LBL_Z"), myGroupBoxCoord, "TextLabelZ");
+  TextLabelZ->setFixedWidth(15);
+  myZ = new QLineEdit(myGroupBoxCoord);
+  myZ->setValidator(new QDoubleValidator(myZ));
+  myZ->setText(QString::number(0.0));
+  connect(myZ, SIGNAL(textChanged(const QString&)), this, SLOT(onCoordChanged()));
+
+  // Layout widgets in the horizontal group box
+  aHBoxLayout->addWidget(TextLabelX);
+  aHBoxLayout->addWidget(myX);
+  aHBoxLayout->addWidget(TextLabelY);
+  aHBoxLayout->addWidget(myY);
+  aHBoxLayout->addWidget(TextLabelZ);
+  aHBoxLayout->addWidget(myZ);
+
+  // "Close" button
+  QGroupBox* aGroupBox = new QGroupBox(this);
+  QHBoxLayout* aHBoxLayout2 = new QHBoxLayout(aGroupBox);
+  aHBoxLayout2->setMargin(11);
+  aHBoxLayout2->setSpacing(6);
+
+  QPushButton* m_bClose = new QPushButton(tr("&Close"), aGroupBox, "m_bClose");
+  m_bClose->setAutoDefault(TRUE);
+  m_bClose->setFixedSize(m_bClose->sizeHint());
+  connect(m_bClose, SIGNAL(clicked()), this, SLOT(onClickClose()));
+
+  // Layout buttons
+  aHBoxLayout2->addWidget(m_bClose);
+
+  // Layout top level widgets
+  layoutDlg->addWidget(aCheckBox,0,0);
+  layoutDlg->addWidget(myGroupSelButton,1,0);
+  layoutDlg->addWidget(myGroupBoxCoord,2,0);
+  layoutDlg->addWidget(aGroupBox,3,0);
+  
+  setEnabled(myGroupSelButton,!myIsBBCenter->isChecked());
+  setEnabled(myGroupBoxCoord,!myIsBBCenter->isChecked());
+
+  this->resize(400, this->sizeHint().height());
+
+  connect(view, SIGNAL(Show( QShowEvent * )), this, SLOT(onViewShow()));
+  connect(view, SIGNAL(Hide( QHideEvent * )), this, SLOT(onViewHide()));
+}
+
+/*
+ *  Destroys the object and frees any allocated resources
+ */
+OCCViewer_SetRotationPointDlg
+::~OCCViewer_SetRotationPointDlg()
+{
+  // no need to delete child widgets, Qt does it all for us
+}
+
+/*!
+  Return true if it is the first show for this dialog
+*/
+bool
+OCCViewer_SetRotationPointDlg
+::IsFirstShown()
+{
+  return myIsBBCenter->isChecked() && myX->text().toDouble() == 0.
+    && myY->text().toDouble() == 0. && myZ->text().toDouble() == 0.;
+}
+
+void 
+OCCViewer_SetRotationPointDlg
+::setEnabled(QGroupBox* theGrp, const bool theState)
+{
+  QObjectList aChildren(*theGrp->children());
+  QObject* anObj;
+  for(anObj = aChildren.first(); anObj !=0; anObj = aChildren.next())
+  {
+    if (anObj !=0 && anObj->inherits("QLineEdit"))
+      ((QLineEdit*)anObj)->setReadOnly(!theState);
+    if (anObj !=0 && anObj->inherits("QPushButton"))
+      ((QLineEdit*)anObj)->setEnabled(theState);
+  }
+  
+}
+
+void 
+OCCViewer_SetRotationPointDlg
+::onBBCenterChecked()
+{
+  setEnabled(myGroupSelButton,!myIsBBCenter->isChecked());
+  setEnabled(myGroupBoxCoord,!myIsBBCenter->isChecked());
+  
+  if ( myIsBBCenter->isChecked() )
+  {
+    if ( mySelectPoint->state() == QButton::On )
+      mySelectPoint->toggle();
+    myView->activateSetRotationGravity();
+  }
+  else
+    myView->activateSetRotationSelected(myX->text().toDouble(), 
+                                       myY->text().toDouble(), 
+                                       myZ->text().toDouble());
+}
+
+void
+OCCViewer_SetRotationPointDlg
+::onToOrigin()
+{
+  if ( mySelectPoint->state() == QButton::On )
+    mySelectPoint->toggle();
+  setCoords();
+  myView->activateSetRotationSelected(myX->text().toDouble(), 
+                                     myY->text().toDouble(), 
+                                     myZ->text().toDouble());
+}
+
+void
+OCCViewer_SetRotationPointDlg
+::onSelectPoint()
+{
+  if ( mySelectPoint->state() == QButton::On )
+    myView->activateStartPointSelection();
+  else
+    mySelectPoint->toggle();
+}
+
+void
+OCCViewer_SetRotationPointDlg
+::onCoordChanged()
+{
+  if ( !myIsBBCenter->isChecked() )
+  {
+    if ( mySelectPoint->state() == QButton::On
+        &&
+        ( myX->hasFocus() || myY->hasFocus() || myZ->hasFocus() ) )
+      mySelectPoint->toggle();
+    myView->activateSetRotationSelected(myX->text().toDouble(), 
+                                       myY->text().toDouble(), 
+                                       myZ->text().toDouble());
+  }
+}
+
+void
+OCCViewer_SetRotationPointDlg
+::setCoords(double theX, double theY, double theZ)
+{
+  myX->setText(QString::number(theX));
+  myY->setText(QString::number(theY));
+  myZ->setText(QString::number(theZ));
+}
+
+void
+OCCViewer_SetRotationPointDlg
+::toggleChange()
+{
+  if ( !myIsBBCenter->isChecked() )
+    mySelectPoint->toggle();
+}
+
+void
+OCCViewer_SetRotationPointDlg
+::onClickClose()
+{
+  myAction->setOn( false );
+  reject();
+}
+
+void 
+OCCViewer_SetRotationPointDlg
+::onViewShow()
+{
+  if(myAction->isOn())
+    show();
+  else
+    hide();
+}
+
+void 
+OCCViewer_SetRotationPointDlg
+::onViewHide()
+{
+  hide();
+}
diff --git a/src/OCCViewer/OCCViewer_SetRotationPointDlg.h b/src/OCCViewer/OCCViewer_SetRotationPointDlg.h
new file mode 100644 (file)
index 0000000..18c1f65
--- /dev/null
@@ -0,0 +1,82 @@
+// Copyright (C) 2005  CEA/DEN, EDF R&D, OPEN CASCADE, PRINCIPIA R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifndef OCCVIEWER_SETROTATIONPOINTDLG_H
+#define OCCVIEWER_SETROTATIONPOINTDLG_H
+
+#include "OCCViewer.h"
+
+#include <qdialog.h>
+
+class QtxAction;
+
+class QLineEdit;
+class QPushButton;
+class QGroupBox;
+class QButtonGroup;
+class QCheckBox;
+
+class OCCViewer_ViewWindow;
+
+class OCCVIEWER_EXPORT OCCViewer_SetRotationPointDlg : public QDialog
+{
+  Q_OBJECT
+
+public:
+  OCCViewer_SetRotationPointDlg(OCCViewer_ViewWindow* , QWidget* parent = 0, 
+                               const char* name = 0, bool modal = FALSE, WFlags fl = 0);
+  ~OCCViewer_SetRotationPointDlg();
+
+  void SetAction( QtxAction* theAction ) { myAction = theAction; }
+  bool IsFirstShown();
+
+  void setCoords(double theX=0., double theY=0., double theZ=0.);
+  void toggleChange();
+
+protected:
+  OCCViewer_ViewWindow* myView;
+  QtxAction* myAction;
+
+  QCheckBox*    myIsBBCenter;
+
+  QButtonGroup* myGroupSelButton;
+  QPushButton*  myToOrigin;
+  QPushButton*  mySelectPoint;
+
+  QGroupBox* myGroupBoxCoord;
+  QLineEdit* myX;
+  QLineEdit* myY;
+  QLineEdit* myZ;
+
+  void setEnabled(QGroupBox* theGrp, const bool theState);
+
+protected slots:
+  void onBBCenterChecked();
+  
+  void onToOrigin();
+  void onSelectPoint();
+
+  void onCoordChanged();
+
+  void onClickClose();
+
+  void onViewShow();
+  void onViewHide();
+};
+
+#endif // OCCVIEWER_SETROTATIONPOINTDLG_H
index 6436c81dec9d7d561aae5c6b5c6f5286983edd35..3d799109ff37646d6494ca4585f7c64cbfeb204d 100755 (executable)
 #include "OCCViewer_ViewWindow.h"
 #include "SUIT_Desktop.h"
 
-int OCCViewer_ViewManager::myMaxId = 0;
-
 /*!
   Constructor
 */
 OCCViewer_ViewManager::OCCViewer_ViewManager( SUIT_Study* study, SUIT_Desktop* theDesktop, bool DisplayTrihedron )
-: SUIT_ViewManager( study, theDesktop )
+: SUIT_ViewManager( study, theDesktop, new OCCViewer_Viewer( DisplayTrihedron ) )
 {
-  myId = ++myMaxId;
-  setViewModel( new OCCViewer_Viewer( DisplayTrihedron ) );
+  setTitle( tr( "OCC_VIEW_TITLE" ) );
 }
 
 /*!
@@ -39,16 +36,6 @@ OCCViewer_ViewManager::~OCCViewer_ViewManager()
 {
 }
 
-/*!
-  Sets view name
-  \param theView - view to assign name
-*/
-void OCCViewer_ViewManager::setViewName(SUIT_ViewWindow* theView)
-{
-  int aPos = myViews.find(theView);
-  theView->setCaption( tr( "OCC_VIEW_TITLE" ).arg( myId ).arg( aPos + 1 ) );
-}
-
 /*!
   Fills popup menu with custom actions
  \param popup - popup menu to be filled with
index 352e873c5932cffdd4d6ecdba1135dca419eb1a0..ea88d3577790a60217be9a48ff6883391cd1a2b6 100755 (executable)
@@ -36,13 +36,6 @@ public:
   OCCViewer_Viewer* getOCCViewer() { return (OCCViewer_Viewer*) myViewModel; }
 
   virtual void      contextMenuPopup( QPopupMenu* );
-
-protected:
-  void              setViewName(SUIT_ViewWindow* theView);
-
-protected:
-  static  int       myMaxId;
-  int               myId;
 };
 
 #endif
index 61d8ea446d5eff8e483413f4de80956c2cf94bca..a58e95624754b30669963ff04f1d12bb8d3ecde4 100755 (executable)
@@ -201,6 +201,8 @@ void OCCViewer_Viewer::onMouseRelease(SUIT_ViewWindow* theWindow, QMouseEvent* t
   myEndPnt.setX(theEvent->x()); myEndPnt.setY(theEvent->y());
   OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*) theWindow;
   bool aHasShift = (theEvent->state() & Qt::ShiftButton);
+  
+  if (!aHasShift) emit deselection();
 
   if (myStartPnt == myEndPnt)
   {
@@ -250,7 +252,7 @@ void OCCViewer_Viewer::enableSelection(bool isEnabled)
     return;
 
   QPtrVector<SUIT_ViewWindow> wins = myViewManager->getViews();
-  for ( int i = 0; i < wins.count(); i++ )
+  for ( int i = 0; i < (int)wins.count(); i++ )
   {
     OCCViewer_ViewWindow* win = ::qt_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
     if ( win )
@@ -270,7 +272,7 @@ void OCCViewer_Viewer::enableMultiselection(bool isEnable)
     return;
 
   QPtrVector<SUIT_ViewWindow> wins = myViewManager->getViews();
-  for ( int i = 0; i < wins.count(); i++ )
+  for ( int i = 0; i < (int)wins.count(); i++ )
   {
     OCCViewer_ViewWindow* win = ::qt_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
     if ( win )
@@ -337,6 +339,10 @@ void OCCViewer_Viewer::update()
 {
   if (!myV3dViewer.IsNull())
     myV3dViewer->Update();
+
+  OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*)(myViewManager->getActiveView());
+  if ( aView )
+    aView->updateGravityCoords();
 }
 
 /*!
@@ -358,7 +364,7 @@ void OCCViewer_Viewer::setObjectsSelected(const AIS_ListOfInteractive& theList)
 {
   AIS_ListIteratorOfListOfInteractive aIt;
   for (aIt.Initialize(theList); aIt.More(); aIt.Next())
-    myAISContext->SetSelected(aIt.Value(), false);
+    myAISContext->AddOrRemoveSelected(aIt.Value(), false);
   myAISContext->UpdateCurrentViewer();
 }
 
index 56ffbbfa43d3b1d7bcd99c0956cd150b4463b8cc..654dec238b0a2f1a34b32ab0734876042a3b18c4 100755 (executable)
@@ -139,6 +139,7 @@ public:
 
 signals:
   void selectionChanged();
+  void deselection();
 
 protected:
   void initView( OCCViewer_ViewWindow* view );
index 357dd8d0c0688274e3423d9f95ef21e20e83b12a..b4742b2930dcd7acfa8605f7a84e5759813478e3 100755 (executable)
@@ -35,6 +35,10 @@ class QPainter;
 class OCCViewer_ViewSketcher;
 class OCCViewer_ViewTransformer;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*!
   \class OCCViewer_ViewPort
   Visualisation canvas of SUIT-based application
@@ -111,4 +115,8 @@ private:
        static int                               nCounter;                              /* objects counter */
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 50930efbc9e676fd3a775bf42d48e005eff781da..1a83b55ea8e1be1a08c0a46ee11e6e5caf99a7cf 100755 (executable)
@@ -20,6 +20,7 @@
 #include "OCCViewer_ViewPort3d.h"
 
 #include "OCCViewer_VService.h"
+#include "OCCViewer_ViewWindow.h"
 
 #include <qrect.h>
 #include <qevent.h>
 #include <Xw_Window.hxx>
 #endif
 
+static double rx = 0.;
+static double ry = 0.;
+static int sx = 0;
+static int sy = 0;
+static Standard_Boolean zRotation = Standard_False;
+
 /*!
     Constructor
 */
@@ -314,25 +321,86 @@ void OCCViewer_ViewPort3d::pan( int dx, int dy )
 /*!
     Inits 'rotation' transformation. [ protected ]
 */
-void OCCViewer_ViewPort3d::startRotation( int x, int y )
+void OCCViewer_ViewPort3d::startRotation( int x, int y, 
+                                         int theRotationPointType,
+                                         const gp_Pnt& theSelectedPoint )
 {
-       if ( !activeView().IsNull() )
-  {
-               myDegenerated = activeView()->DegenerateModeIsOn();
-               activeView()->SetDegenerateModeOn();
-    if (myAnimate) activeView()->SetAnimationModeOn();
-               activeView()->StartRotation( x, y, 0.45 );
+  if ( !activeView().IsNull() )
+    {
+      myDegenerated = activeView()->DegenerateModeIsOn();
+      activeView()->SetDegenerateModeOn();
+      if (myAnimate) activeView()->SetAnimationModeOn();
+
+      //double gx, gy, gz;
+      //double gx = activeView()->gx;
+      //activeView()->Gravity(gx,gy,gz);
+
+      switch ( theRotationPointType ) {
+      case OCCViewer_ViewWindow::GRAVITY:
+       activeView()->StartRotation( x, y, 0.45 );
+       break;
+      case OCCViewer_ViewWindow::SELECTED:
+       sx = x; sy = y;
+       
+       double X,Y;
+       activeView()->Size(X,Y);
+       rx = Standard_Real(activeView()->Convert(X)); 
+       ry = Standard_Real(activeView()->Convert(Y)); 
+       
+       activeView()->Rotate( 0., 0., 0., 
+                             theSelectedPoint.X(),theSelectedPoint.Y(), theSelectedPoint.Z(), 
+                             Standard_True );
+       
+       Quantity_Ratio zRotationThreshold;
+       zRotation = Standard_False;
+       zRotationThreshold = 0.45;
+       if( zRotationThreshold > 0. ) {
+         Standard_Real dx = Abs(sx - rx/2.);
+         Standard_Real dy = Abs(sy - ry/2.);
+         Standard_Real dd = zRotationThreshold * (rx + ry)/2.;
+         if( dx > dd || dy > dd ) zRotation = Standard_True;
        }
+       break;
+      default:
+       break;
+      }
+    }
 }
 
 /*!
     Rotates the viewport. [ protected ]
 */
-void OCCViewer_ViewPort3d::rotate( int x, int y )
+void OCCViewer_ViewPort3d::rotate( int x, int y, 
+                                  int theRotationPointType,
+                                  const gp_Pnt& theSelectedPoint )
 {
-       if ( !activeView().IsNull() )
-           activeView()->Rotation( x, y );
-//  setZSize( getZSize() );
+  if ( !activeView().IsNull() ) {
+    switch ( theRotationPointType ) {
+    case OCCViewer_ViewWindow::GRAVITY:
+      activeView()->Rotation( x, y );
+      break;
+    case OCCViewer_ViewWindow::SELECTED:
+      double dx, dy, dz;
+      if( zRotation ) {
+       dz = atan2(Standard_Real(x)-rx/2., ry/2.-Standard_Real(y)) - 
+         atan2(sx-rx/2.,ry/2.-sy);
+       dx = dy = 0.;
+      }
+      else {
+       dx = (Standard_Real(x) - sx) * Standard_PI/rx;
+       dy = (sy - Standard_Real(y)) * Standard_PI/ry;
+       dz = 0.;
+      }
+      
+      activeView()->Rotate( dx, dy, dz, 
+                           theSelectedPoint.X(),theSelectedPoint.Y(), theSelectedPoint.Z(),
+                           Standard_False );
+      break;
+    default:
+      break;
+    }
+  }
+  //  setZSize( getZSize() );
 }
 
 /*!
@@ -340,15 +408,15 @@ void OCCViewer_ViewPort3d::rotate( int x, int y )
 */
 void OCCViewer_ViewPort3d::endRotation()
 {
-       if ( !activeView().IsNull() )
-  {
-    if (myAnimate) activeView()->SetAnimationModeOff();
-               if ( !myDegenerated )
-      activeView()->SetDegenerateModeOff();
-    activeView()->ZFitAll(1.);
-    activeView()->SetZSize(0.);
-    activeView()->Update();
-       }
+  if ( !activeView().IsNull() )
+    {
+      if (myAnimate) activeView()->SetAnimationModeOff();
+      if ( !myDegenerated )
+       activeView()->SetDegenerateModeOff();
+      activeView()->ZFitAll(1.);
+      activeView()->SetZSize(0.);
+      activeView()->Update();
+    }
 }
 
 /*!
index 204b8eb995eb6be3cb5d5052ee7f3abcd4a97b6d..4f840bd02f8a23a1759ffcfcca726078115c4a73 100755 (executable)
 
 class QRect;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 class OCCVIEWER_EXPORT OCCViewer_ViewPort3d: public OCCViewer_ViewPort
 {
        Q_OBJECT
@@ -64,8 +68,8 @@ public:
        virtual void            zoom( int, int, int, int );
   virtual void         fitAll( bool keepScale = false, bool withZ = true, bool upd = true );
 
-       void                    startRotation( int, int );
-       void                    rotate( int, int );
+       void                    startRotation( int, int, int, const gp_Pnt& );
+       void                    rotate( int, int, int, const gp_Pnt& );
        void                    endRotation();
 
 protected:
@@ -89,4 +93,8 @@ private:
        double  myScale;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index cef3b10d89cd5b8702f4d53b3e7d34c056fcdb5a..0ec1a641d213a41b57c65d1b53e070bf467d3d61 100755 (executable)
@@ -24,6 +24,7 @@
 #include "OCCViewer_ViewPort3d.h"
 #include "OCCViewer_CreateRestoreViewDlg.h"
 #include "OCCViewer_ClippingDlg.h"
+#include "OCCViewer_SetRotationPointDlg.h"
 
 #include "SUIT_Desktop.h"
 #include "SUIT_Session.h"
 #include <gp_Dir.hxx>
 #include <gp_Pln.hxx>
 
+#include <AIS_ListIteratorOfListOfInteractive.hxx>
+#include <AIS_Shape.hxx>
+
+#include <BRep_Tool.hxx>
+#include <TopoDS.hxx>
+
+#include <BRepBndLib.hxx>
+#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
+#include <Visual3d_View.hxx>
+#include <Graphic3d_MapOfStructure.hxx>
+#include <Graphic3d_Structure.hxx>
+
+
 const char* imageZoomCursor[] = { 
 "32 32 3 1",
 ". c None",
@@ -174,6 +188,7 @@ OCCViewer_ViewWindow::OCCViewer_ViewWindow(SUIT_Desktop* theDesktop, OCCViewer_V
   myEnableDrawMode = false;
   updateEnabledDrawMode();
   myClippingDlg = 0;
+  mySetRotationPointDlg = 0;
 }
 
 /*!
@@ -184,9 +199,14 @@ void OCCViewer_ViewWindow::initLayout()
   myViewPort = new OCCViewer_ViewPort3d( this, myModel->getViewer3d(), V3d_ORTHOGRAPHIC );
   myViewPort->setBackgroundColor(black);
   myViewPort->installEventFilter(this);
-       setCentralWidget(myViewPort);
+  setCentralWidget(myViewPort);
   myOperation = NOTHING;
 
+  myCurrPointType = GRAVITY;
+  myPrevPointType = GRAVITY;
+  mySelectedPoint = gp_Pnt(0.,0.,0.);
+  myRotationPointSelection = false;
+
   setTransformRequested ( NOTHING );
   setTransformInProcess ( false );
 
@@ -305,7 +325,7 @@ void OCCViewer_ViewWindow::vpMousePressEvent(QMouseEvent* theEvent)
 
   case ROTATE:
     if ( theEvent->button() == Qt::LeftButton ) {
-           myViewPort->startRotation(myStartX, myStartY);
+           myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
            emit vpTransformationStarted ( ROTATE );
          }
     break;
@@ -321,10 +341,44 @@ void OCCViewer_ViewWindow::vpMousePressEvent(QMouseEvent* theEvent)
       break;
     case ROTATE:
            activateRotation();
-           myViewPort->startRotation(myStartX, myStartY);
+           myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
       break;
     default:
-      emit mousePressed(this, theEvent);
+      if ( myRotationPointSelection )
+      {
+       if ( theEvent->button() == Qt::LeftButton )
+       {
+         Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
+         ic->Select();
+         for ( ic->InitSelected(); ic->MoreSelected(); ic->NextSelected() )
+         {
+           TopoDS_Shape aShape = ic->SelectedShape();
+           if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX )
+           {
+             gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( ic->SelectedShape() ) ); 
+             if ( mySetRotationPointDlg )
+             {
+               myRotationPointSelection = false;
+               mySetRotationPointDlg->setCoords(aPnt.X(), aPnt.Y(), aPnt.Z());
+             }
+           }    
+           else 
+           {
+             myCurrPointType = myPrevPointType;
+             break;
+           }
+         }
+         if ( ic->NbSelected() == 0 ) myCurrPointType = myPrevPointType;
+         if ( mySetRotationPointDlg ) mySetRotationPointDlg->toggleChange();
+         ic->CloseAllContexts();
+         myOperation = NOTHING; 
+         setCursor( myCursor );
+         myCursorIsHand = false;
+         myRotationPointSelection = false;
+       }
+      }
+      else
+       emit mousePressed(this, theEvent);
       break;
     }
     /* notify that we start a transformation */
@@ -384,6 +438,167 @@ void OCCViewer_ViewWindow::activateRotation()
   }
 }
 
+/*!
+  Compute the gravity center
+*/
+bool OCCViewer_ViewWindow::computeGravityCenter( double& theX, double& theY, double& theZ )
+{
+  Handle(Visual3d_View) aView = myViewPort->getView()->View();
+
+  Standard_Real Xmin,Ymin,Zmin,Xmax,Ymax,Zmax,U,V,W ;
+  Standard_Real Umin,Vmin,Umax,Vmax ;
+  Standard_Integer Nstruct,Npoint ;
+  Graphic3d_MapOfStructure MySetOfStructures;
+  
+  aView->DisplayedStructures (MySetOfStructures);
+  Nstruct = MySetOfStructures.Extent() ;
+  
+  Graphic3d_MapIteratorOfMapOfStructure MyIterator(MySetOfStructures) ;
+  aView->ViewMapping().WindowLimit(Umin,Vmin,Umax,Vmax) ;
+  Npoint = 0 ; theX = theY = theZ = 0. ;
+  for( ; MyIterator.More(); MyIterator.Next()) {
+    if (!(MyIterator.Key())->IsEmpty()) {
+      (MyIterator.Key())->MinMaxValues(Xmin,Ymin,Zmin,
+                                         Xmax,Ymax,Zmax) ;
+    
+      Standard_Real LIM = ShortRealLast() -1.;
+      if (!    (fabs(Xmin) > LIM || fabs(Ymin) > LIM || fabs(Zmin) > LIM 
+                ||  fabs(Xmax) > LIM || fabs(Ymax) > LIM || fabs(Zmax) > LIM )) {
+        
+        aView->Projects(Xmin,Ymin,Zmin,U,V,W) ;
+        if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
+          Npoint++ ; theX += Xmin ; theY += Ymin ; theZ += Zmin ;
+        }
+        aView->Projects(Xmax,Ymin,Zmin,U,V,W) ;
+        if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
+          Npoint++ ; theX += Xmax ; theY += Ymin ; theZ += Zmin ;
+        }
+        aView->Projects(Xmin,Ymax,Zmin,U,V,W) ;
+        if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
+          Npoint++ ; theX += Xmin ; theY += Ymax ; theZ += Zmin ;
+        }
+        aView->Projects(Xmax,Ymax,Zmin,U,V,W) ;
+        if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
+          Npoint++ ; theX += Xmax ; theY += Ymax ; theZ += Zmin ;
+        }
+        aView->Projects(Xmin,Ymin,Zmax,U,V,W) ;
+        if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
+          Npoint++ ; theX += Xmin ; theY += Ymin ; theZ += Zmax ;
+        }
+        aView->Projects(Xmax,Ymin,Zmax,U,V,W) ;
+        if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
+          Npoint++ ; theX += Xmax ; theY += Ymin ; theZ += Zmax ;
+        }
+        aView->Projects(Xmin,Ymax,Zmax,U,V,W) ;
+        if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
+          Npoint++ ; theX += Xmin ; theY += Ymax ; theZ += Zmax ;
+        }
+        aView->Projects(Xmax,Ymax,Zmax,U,V,W) ;
+        if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
+          Npoint++ ; theX += Xmax ; theY += Ymax ; theZ += Zmax ;
+        }
+      }
+    }
+  }
+  if( Npoint > 0 ) {
+    theX /= Npoint ; theY /= Npoint ; theZ /= Npoint ;
+  }
+  return true;
+}
+
+/*!
+  Set the gravity center as a rotation point
+*/
+void OCCViewer_ViewWindow::activateSetRotationGravity()
+{
+  if ( myRotationPointSelection )
+  {
+    Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
+    ic->CloseAllContexts();
+    myOperation = NOTHING; 
+    setCursor( myCursor );
+    myCursorIsHand = false;
+    myRotationPointSelection = false;
+  }
+
+  myPrevPointType = myCurrPointType;
+  myCurrPointType = GRAVITY;
+
+  Standard_Real Xcenter, Ycenter, Zcenter;
+  if ( computeGravityCenter( Xcenter, Ycenter, Zcenter ) )
+    mySetRotationPointDlg->setCoords( Xcenter, Ycenter, Zcenter );
+}
+
+/*!
+  Update gravity center in the SetRotationPointDlg
+*/
+void OCCViewer_ViewWindow::updateGravityCoords()
+{
+  if ( mySetRotationPointDlg && mySetRotationPointDlg->isShown() && myCurrPointType == GRAVITY )
+  {
+    Standard_Real Xcenter, Ycenter, Zcenter;
+    if ( computeGravityCenter( Xcenter, Ycenter, Zcenter ) )
+      mySetRotationPointDlg->setCoords( Xcenter, Ycenter, Zcenter );
+  }
+}
+
+/*!
+  Set the point selected by user as a rotation point
+*/
+void OCCViewer_ViewWindow::activateSetRotationSelected(double theX, double theY, double theZ)
+{
+  if ( myRotationPointSelection )
+  {
+    Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
+    ic->CloseAllContexts();
+    myOperation = NOTHING; 
+    setCursor( myCursor );
+    myCursorIsHand = false;
+    myRotationPointSelection = false;
+  }
+
+  myPrevPointType = myCurrPointType;
+  myCurrPointType = SELECTED;
+  mySelectedPoint.SetCoord(theX,theY,theZ);
+}
+
+/*!
+  Start the point selection process
+*/
+void OCCViewer_ViewWindow::activateStartPointSelection()
+{
+  myPrevPointType = myCurrPointType;
+  myCurrPointType = SELECTED;
+
+  // activate selection ------>
+  Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
+
+  ic->OpenLocalContext();
+
+  AIS_ListOfInteractive aList;
+  ic->DisplayedObjects( aList );
+  for ( AIS_ListIteratorOfListOfInteractive it( aList ); it.More(); it.Next() ) 
+  {
+    Handle(AIS_InteractiveObject) anObj = it.Value();
+    if ( !anObj.IsNull() && anObj->HasPresentation() &&
+         anObj->IsKind( STANDARD_TYPE(AIS_Shape) ) )
+    {
+      ic->Load(anObj,-1);
+      ic->Activate(anObj,AIS_Shape::SelectionMode(TopAbs_VERTEX));
+     }
+  }  
+  // activate selection <------
+
+  if ( !myCursorIsHand )
+  {
+    QCursor handCursor (Qt::PointingHandCursor);
+    myCursorIsHand = true;             
+    myCursor = cursor();
+    setCursor( handCursor );
+  }
+  myRotationPointSelection = true;
+}
+
 /*!
   Starts global panning operation, sets corresponding cursor
 */
@@ -424,7 +639,7 @@ void OCCViewer_ViewWindow::activateWindowFit()
 void OCCViewer_ViewWindow::setTransformRequested ( OperationType op )
 {    
   myOperation = op;
-  myViewPort->setMouseTracking( myOperation == NOTHING );  
+  myViewPort->setMouseTracking( myOperation == NOTHING );
 }
 
 
@@ -437,7 +652,7 @@ void OCCViewer_ViewWindow::vpMouseMoveEvent(QMouseEvent* theEvent)
   myCurrY = theEvent->y();
   switch (myOperation) {
   case ROTATE:
-    myViewPort->rotate(myCurrX, myCurrY);
+    myViewPort->rotate(myCurrX, myCurrY, myCurrPointType, mySelectedPoint);
     break;
     
   case ZOOMVIEW:
@@ -461,24 +676,29 @@ void OCCViewer_ViewWindow::vpMouseMoveEvent(QMouseEvent* theEvent)
     break;
     
   default:
-    int aState = theEvent->state();
-    //int aButton = theEvent->button();
-    if ( aState == Qt::LeftButton ||
-       aState == ( Qt::LeftButton | Qt::ShiftButton) ) {
-      myDrawRect = myEnableDrawMode;
-      if ( myDrawRect ) {
-        drawRect();
-       if ( !myCursorIsHand )  {   // we are going to sketch a rectangle
-          QCursor handCursor (Qt::PointingHandCursor);
-         myCursorIsHand = true;                
-         myCursor = cursor();
-         setCursor( handCursor );
-       }
-      }
-    } 
-    else {
+    if ( myRotationPointSelection )
       emit mouseMoving( this, theEvent ); 
-    }          
+    else
+    {
+      int aState = theEvent->state();
+      //int aButton = theEvent->button();
+      if ( aState == Qt::LeftButton ||
+          aState == ( Qt::LeftButton | Qt::ShiftButton) )      {
+       myDrawRect = myEnableDrawMode;
+       if ( myDrawRect ) {
+         drawRect();
+         if ( !myCursorIsHand )        {   // we are going to sketch a rectangle
+           QCursor handCursor (Qt::PointingHandCursor);
+           myCursorIsHand = true;              
+           myCursor = cursor();
+           setCursor( handCursor );
+         }
+       }
+      } 
+      else {
+       emit mouseMoving( this, theEvent ); 
+      }        
+    }  
   }
 }
 
@@ -552,9 +772,17 @@ void OCCViewer_ViewWindow::resetState()
   myRect.setLeft(2);
   myRect.setRight(0);
   
-  if ( transformRequested() || myCursorIsHand ) 
-    setCursor( myCursor );
-  myCursorIsHand = false;
+  if ( myRotationPointSelection )
+  {
+    QCursor handCursor (Qt::PointingHandCursor);
+    setCursor( handCursor );
+  }
+  else
+  { 
+    if ( transformRequested() || myCursorIsHand ) 
+      setCursor( myCursor );
+    myCursorIsHand = false;
+  }
   
   if ( transformRequested() ) 
     emit vpTransformationFinished (myOperation);
@@ -630,7 +858,15 @@ void OCCViewer_ViewWindow::createActions()
                            tr( "MNU_GLOBALPAN_VIEW" ), 0, this);
   aAction->setStatusTip(tr("DSC_GLOBALPAN_VIEW"));
   connect(aAction, SIGNAL(activated()), this, SLOT(activateGlobalPanning()));
-       myActionsMap[ GlobalPanId ] = aAction;
+  myActionsMap[ GlobalPanId ] = aAction;
+
+  // Rotation Point
+  mySetRotationPointAction = new QtxAction(tr("MNU_CHANGINGROTATIONPOINT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ROTATION_POINT" ) ),
+                           tr( "MNU_CHANGINGROTATIONPOINT_VIEW" ), 0, this);
+  mySetRotationPointAction->setStatusTip(tr("DSC_CHANGINGROTATIONPOINT_VIEW"));
+  mySetRotationPointAction->setToggleAction( true );
+  connect(mySetRotationPointAction, SIGNAL(toggled( bool )), this, SLOT(onSetRotationPoint( bool )));
+  myActionsMap[ ChangeRotationPointId ] = mySetRotationPointAction;
 
   // Rotation
   aAction = new QtxAction(tr("MNU_ROTATE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ROTATE" ) ),
@@ -695,7 +931,7 @@ void OCCViewer_ViewWindow::createActions()
   myClippingAction->setStatusTip(tr("DSC_CLIPPING"));
   myClippingAction->setToggleAction( true );
   connect(myClippingAction, SIGNAL(toggled( bool )), this, SLOT(onClipping( bool )));
-       myActionsMap[ ClippingId ] = myClippingAction;
+  myActionsMap[ ClippingId ] = myClippingAction;
 
   aAction = new QtxAction(tr("MNU_SHOOT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_SHOOT_VIEW" ) ),
                            tr( "MNU_SHOOT_VIEW" ), 0, this);
@@ -736,6 +972,8 @@ void OCCViewer_ViewWindow::createToolBar()
   aPanningBtn->AddAction(myActionsMap[PanId]);
   aPanningBtn->AddAction(myActionsMap[GlobalPanId]);
 
+  myActionsMap[ChangeRotationPointId]->addTo(myToolBar);
+
   myActionsMap[RotationId]->addTo(myToolBar);
 
   SUIT_ToolButton* aViewsBtn = new SUIT_ToolButton(myToolBar, "projection");
@@ -855,6 +1093,37 @@ void OCCViewer_ViewWindow::onFitAll()
   myViewPort->fitAll();
 }
 
+/*!
+  SLOT: called if change rotation point operation is activated
+*/
+void OCCViewer_ViewWindow::onSetRotationPoint( bool on )
+{
+  if ( on )
+    {
+      if ( !mySetRotationPointDlg )
+       {
+         mySetRotationPointDlg = new OCCViewer_SetRotationPointDlg( this, myDesktop );
+         mySetRotationPointDlg->SetAction( mySetRotationPointAction );
+       }
+
+      if ( !mySetRotationPointDlg->isShown() )
+      {
+       if ( mySetRotationPointDlg->IsFirstShown() )
+       { 
+         Standard_Real Xcenter, Ycenter, Zcenter;
+         if ( computeGravityCenter( Xcenter, Ycenter, Zcenter ) )
+           mySetRotationPointDlg->setCoords( Xcenter, Ycenter, Zcenter );
+       }
+       mySetRotationPointDlg->show();
+      }
+    }
+  else
+    {
+      if ( mySetRotationPointDlg->isShown() )
+       mySetRotationPointDlg->hide();
+    }
+}
+
 /*!
   Creates one more window with same content
 */
@@ -1088,3 +1357,20 @@ void OCCViewer_ViewWindow::setVisualParameters( const QString& parameters )
     performRestoring( params );
   }
 }
+
+/*!
+  Custom show event handler
+*/
+void OCCViewer_ViewWindow::showEvent( QShowEvent * theEvent ) 
+{
+  emit Show( theEvent );
+}
+
+/*!
+  Custom hide event handler
+*/
+void OCCViewer_ViewWindow::hideEvent( QHideEvent * theEvent ) 
+{
+  emit Hide( theEvent );
+}
+
index d9dafcffea161441661e9759660a25026449233e..9c384141227903d7d5837155ef5718bda16959af 100755 (executable)
@@ -32,6 +32,7 @@ class SUIT_Desktop;
 class OCCViewer_ViewPort3d;
 
 class OCCViewer_ClippingDlg;
+class OCCViewer_SetRotationPointDlg;
 
 #ifdef WIN32
 #pragma warning( disable:4251 )
@@ -42,9 +43,12 @@ class OCCVIEWER_EXPORT OCCViewer_ViewWindow : public SUIT_ViewWindow
   Q_OBJECT
 
 public:
-  enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE, PANGLOBAL, WINDOWFIT, FITALLVIEW, RESETVIEW,
+  enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE, 
+                     PANGLOBAL, WINDOWFIT, FITALLVIEW, RESETVIEW,
                       FRONTVIEW, BACKVIEW, TOPVIEW, BOTTOMVIEW, LEFTVIEW, RIGHTVIEW };
 
+  enum RotationPointType{ GRAVITY, SELECTED };
+
   OCCViewer_ViewWindow(SUIT_Desktop* theDesktop, OCCViewer_Viewer* theModel);
        virtual ~OCCViewer_ViewWindow() {};
 
@@ -83,20 +87,33 @@ public slots:
   void activateRotation();
   void activatePanning();
   void activateGlobalPanning();
+  void onSetRotationPoint( bool on );
   void onCloneView();
   void onClipping( bool on );
   void onMemorizeView();
   void onRestoreView();
   void onTrihedronShow();
   void setRestoreFlag();
-  
+
+  void activateSetRotationGravity();
+  void activateSetRotationSelected( double theX, double theY, double theZ );
+  void activateStartPointSelection();
+  void updateGravityCoords();
+   
+  virtual void showEvent( QShowEvent * );
+  virtual void hideEvent( QHideEvent * );
+
 signals:
   void vpTransformationStarted(OCCViewer_ViewWindow::OperationType type);
   void vpTransformationFinished(OCCViewer_ViewWindow::OperationType type);
   void cloneView();
 
+  void Show( QShowEvent * );
+  void Hide( QHideEvent * );
+
 protected:
-  enum { DumpId, FitAllId, FitRectId, ZoomId, PanId, GlobalPanId, RotationId,
+  enum { DumpId, FitAllId, FitRectId, ZoomId, PanId, GlobalPanId,
+        ChangeRotationPointId, RotationId,
          FrontId, BackId, TopId, BottomId, LeftId, RightId, ResetId, CloneId, ClippingId, MemId, RestoreId,
          TrihedronShowId };
 
@@ -126,10 +143,17 @@ protected:
 
   viewAspect getViewParams() const;
 
+  bool computeGravityCenter( double& theX, double& theY, double& theZ );
+
   OperationType         myOperation;
   OCCViewer_Viewer*     myModel;
   OCCViewer_ViewPort3d* myViewPort;
 
+  RotationPointType     myCurrPointType;
+  RotationPointType     myPrevPointType;
+  gp_Pnt                mySelectedPoint;
+  bool                  myRotationPointSelection;
+
   int                                  myRestoreFlag;
 
   int                                  myStartX;
@@ -154,6 +178,9 @@ protected:
 private:
   OCCViewer_ClippingDlg* myClippingDlg;
   QtxAction* myClippingAction;
+
+  OCCViewer_SetRotationPointDlg* mySetRotationPointDlg;
+  QtxAction* mySetRotationPointAction;
   
 };
 
index b75530310a5242b716589ab9944028e797ab6f6a..4ab78a38d3f3a9953f24e99107717e6470c4a535 100755 (executable)
@@ -62,6 +62,9 @@ msgstr "view_reset.png"
 msgid "ICON_OCCVIEWER_VIEW_RIGHT"
 msgstr "view_right.png"
 
+msgid "ICON_OCCVIEWER_VIEW_ROTATION_POINT"
+msgstr "view_rotation_point.png"
+
 msgid "ICON_OCCVIEWER_VIEW_ROTATE"
 msgstr "view_rotate.png"
 
index 08af365aea75053ec223743ffcacb32ac9d258ac..71689709e2598921bad867f688f6aee6749b8c4e 100755 (executable)
@@ -107,9 +107,45 @@ msgstr "Selection of a new center of the view"
 msgid "MNU_GLOBALPAN_VIEW"
 msgstr "Global Panning"
 
+msgid "DSC_CHANGINGROTATIONPOINT_VIEW"
+msgstr "Change the point, around which the rotation is performed"
+
 msgid "DSC_ROTATE_VIEW"
 msgstr "Rotation of the point of view around the scene center"
 
+msgid "OCCViewer_SetRotationPointDlg::CAPTION"
+msgstr "Set Rotation Point"
+
+msgid "OCCViewer_SetRotationPointDlg::USE_BBCENTER"
+msgstr "Use Bounding Box Center"
+
+msgid "OCCViewer_SetRotationPointDlg::LBL_TOORIGIN"
+msgstr "Set to Origin"
+
+msgid "OCCViewer_SetRotationPointDlg::LBL_SELECTPOINT"
+msgstr "Select Point from View"
+
+msgid "OCCViewer_SetRotationPointDlg::LBL_X"
+msgstr "X :"
+
+msgid "OCCViewer_SetRotationPointDlg::LBL_Y"
+msgstr "Y :"
+
+msgid "OCCViewer_SetRotationPointDlg::LBL_Z"
+msgstr "Z :"
+
+msgid "MNU_CHANGINGROTATIONPOINT_VIEW"
+msgstr "Change Rotation Point"
+
+msgid "MNU_ROTATIONPOINTGRAVITY_VIEW"
+msgstr "Rotation Point : the gravity center"
+
+msgid "MNU_ROTATIONPOINT000_VIEW"
+msgstr "Rotation Point : (0,0,0)"
+
+msgid "MNU_ROTATIONPOINTSELECTED_VIEW"
+msgstr "Rotation Point : the point selected by the user"
+
 msgid "MNU_ROTATE_VIEW"
 msgstr "Rotation"
 
@@ -171,7 +207,7 @@ msgid "OCCViewer_Viewer::MEN_CHANGE_BACKGROUD"
 msgstr "Change background..."
 
 msgid "OCCViewer_ViewManager::OCC_VIEW_TITLE"
-msgstr "OCC scene:%1 - viewer:%2"
+msgstr "OCC scene:%M - viewer:%V"
 
 
 msgid "OCCViewer_CreateRestoreViewDlg::CAPTION"
diff --git a/src/OCCViewer/resources/view_rotation_point.png b/src/OCCViewer/resources/view_rotation_point.png
new file mode 100755 (executable)
index 0000000..59f5931
Binary files /dev/null and b/src/OCCViewer/resources/view_rotation_point.png differ
index c0343a2ca5b7429c64b78a5cb6def3821dfb0215..647cac4cf3191c648f3affdc4b33008da2364049 100755 (executable)
@@ -113,7 +113,7 @@ public:
   ObjPtr   nullSrc() const;
   ItemPtr  nullTrg() const;
   ItemPtr  createItem( const ObjPtr&, const ItemPtr&, const ItemPtr&, const bool ) const;
-  void     updateItem( const ItemPtr& ) const;
+  void     updateItem( const ObjPtr& , const ItemPtr& ) const;
   void     deleteItemWithChildren( const ItemPtr& ) const;
   void     children( const ObjPtr&, QValueList<ObjPtr>& ) const;
   void     children( const ItemPtr&, QValueList<ItemPtr>& ) const;
@@ -171,13 +171,17 @@ bool OB_BrowserSync::needUpdate( const ItemPtr& item ) const
   Updates item
   \param p - item
 */
-void OB_BrowserSync::updateItem( const ItemPtr& p ) const
+void OB_BrowserSync::updateItem( const ObjPtr& o, const ItemPtr& p ) const
 {
   if ( p && needUpdate( p ) ) { 
     //    printf( "--- needUpdate for %s = true ---\n", p->text( 0 ).latin1() );
     myBrowser->updateText( p );
     p->update();
   }
+  if( o && myBrowser->getUpdater() )
+    {
+      myBrowser->getUpdater()->update( o, p );
+    }
 }
 
 /*!
@@ -288,6 +292,7 @@ OB_Browser::OB_Browser( QWidget* parent, SUIT_DataObject* root )
 
 myRoot( 0 ),
 myTooltip( 0 ),
+myUpdater( 0 ),
 myAutoOpenLevel( 0 ),
 myAutoUpdate( false ),
 myAutoDelObjs( false ),
@@ -325,6 +330,7 @@ OB_Browser::~OB_Browser()
 {
   myItems.clear();
   delete myTooltip;
+  setUpdater( 0 );
 }
 
 /*!
@@ -366,8 +372,25 @@ void OB_Browser::setAutoOpenLevel( const int level )
     return;
 
   myAutoOpenLevel = level;
+}
 
-  autoOpenBranches();
+/*!
+  Opens branches from 1 to \alevels. If parameter value negative then autoOpenLevel() value will be used.
+  \sa autoOpenLevel()
+*/
+void OB_Browser::openLevels( const int levels )
+{
+  int level = levels < 0 ? autoOpenLevel() : levels;
+  QListView* lv = listView();
+  if ( !lv || level < 1 )
+    return;
+
+  QListViewItem* item = lv->firstChild();
+  while ( item )
+  {
+    openBranch( item, level );
+    item = item->nextSibling();
+  }
 }
 
 /*!
@@ -421,6 +444,24 @@ void OB_Browser::setAutoDeleteObjects( const bool on )
   myAutoDelObjs = on;
 }
 
+/*!
+  \return updater of browser
+*/
+OB_Updater* OB_Browser::getUpdater() const
+{
+  return myUpdater;
+}
+
+/*!
+  \sets new updater of browser
+*/
+void OB_Browser::setUpdater( OB_Updater* theUpdate )
+{
+  if( myUpdater )
+    delete myUpdater;
+  myUpdater = theUpdate;
+}
+
 /*!
   \return root SUIT object of browser
 */
@@ -892,7 +933,7 @@ void OB_Browser::updateTree( SUIT_DataObject* obj, const bool autoOpen )
 
   restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
 
-  if( autoOpen )
+  if ( autoOpen )
     autoOpenBranches();
 
   setModified();
@@ -939,8 +980,6 @@ void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg )
 
   restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
 
-  autoOpenBranches();
-
   setModified();
 
   if ( selNum != numberOfSelected() )
@@ -1574,17 +1613,7 @@ void OB_Browser::removeObject( SUIT_DataObject* obj, const bool autoUpd )
 */
 void OB_Browser::autoOpenBranches()
 {
-  int level = autoOpenLevel();
-  QListView* lv = listView();
-  if ( !lv || level < 1 )
-    return;
-
-  QListViewItem* item = lv->firstChild();
-  while ( item )
-  {
-    openBranch( item, level );
-    item = item->nextSibling();
-  }
+  openLevels();
 }
 
 /*!
index 6299afd2d87a23b0ff7ee687726c61b2b33a7fa8..2edf0239cede8fbd4cf50ff14ca4dd5238bfb78c 100755 (executable)
@@ -39,6 +39,14 @@ class OB_Filter;
 class OB_ListView;
 class OB_ListItem;
 
+class OB_Updater 
+{
+public:
+  OB_Updater(){};
+  virtual ~OB_Updater(){};
+  virtual void update( SUIT_DataObject* theObj, OB_ListItem* theLI ) = 0;
+};
+
 /*!
   \class OB_Browser
   Represents object browser. Allows to get/set selection, 
@@ -77,7 +85,7 @@ public:
   bool              isAutoDeleteObjects() const;
   virtual void      setAutoDeleteObjects( const bool );
 
-  virtual void      updateTree( SUIT_DataObject* = 0, const bool autoOpen = true );
+  virtual void      updateTree( SUIT_DataObject* = 0, const bool = false );
   virtual void      replaceTree( SUIT_DataObject*, SUIT_DataObject* );
 
   bool              isShowToolTips();
@@ -95,6 +103,7 @@ public:
 
   int               autoOpenLevel() const;
   void              setAutoOpenLevel( const int );
+  void              openLevels( const int = -1 );
 
   virtual int       addColumn( const QString&, const int id = -1, const int width = -1 );
   virtual int       addColumn( const QIconSet&, const QString&, const int id = -1, const int width = -1 );
@@ -126,6 +135,9 @@ public:
 
   void              setModified();
   unsigned long     getModifiedTime() { return myModifiedTime; }
+  
+  OB_Updater*       getUpdater() const;
+  virtual void      setUpdater( OB_Updater* theUpdate = 0 );
 
 signals:
   void              selectionChanged();
@@ -188,6 +200,7 @@ private:
   SUIT_DataObject*  myRoot;
   ItemMap           myItems;
   QToolTip*         myTooltip;
+  OB_Updater*       myUpdater;
   QMap<int, int>    myColumnIds;
   bool              myAutoUpdate;
   bool              myAutoDelObjs;
index b91b92e2d769647837d49dcf35fdfb2e3ac0bbce..f5fb6cb110f252d335595661b420f5bd6b26b242 100755 (executable)
 #include <iostream>
 using namespace std;
 
+#ifdef WNT
+#define min(a, b)  (((a) < (b)) ? (a) : (b))
+#endif
+
 /*!
   Constructor
 */
@@ -124,6 +128,8 @@ void ListItemF<T>::update()
     else
       myT->setPixmap( 0, p );
   }
+  else if ( p.isNull() )
+    myT->setPixmap( 0, p );
 
   myT->setDragEnabled( obj->isDragable() );
   myT->setDropEnabled( true );
index ebcd5c87947e1f78c986700583fcccadeac4b9cc..728e12c278ca6eca8df4db1a3496cdc5b860e0b5 100755 (executable)
@@ -222,9 +222,10 @@ bool OB_ListView::isDropAccepted( QListViewItem* drag, QListViewItem* drop ) con
 void OB_ListView::setColumnWidth( int col, int width )
 {
   int max = columnMaxWidth( col );
-  if( max>0 && width>max )
+  if ( max>0 && width>max )
     width = max;
-  QListView::setColumnWidth( col, width );
+
+  QtxListView::setColumnWidth( col, width );
 }
 
 /*!
index b36d11c5f94b1d977d8105ea5644f74aa344d55d..84d530aa6b07a3061b862e502adbcad2b3322e58 100644 (file)
@@ -25,6 +25,8 @@
 #ifndef Plot2d_SetupCurveDlg_H
 #define Plot2d_SetupCurveDlg_H
 
+#include "Plot2d.h"
+
 #include <qdialog.h>
 
 /*!
@@ -37,7 +39,7 @@ class QComboBox;
 class QSpinBox;
 class QToolButton;
 
-class Plot2d_SetupCurveDlg : public QDialog
+class PLOT2D_EXPORT Plot2d_SetupCurveDlg : public QDialog
 { 
   Q_OBJECT
 
index 00ba07afae1ed218eb4ba5dc7ac3fcd45aaba617..55b805bfce768b014d076d1f43efe764735aca3c 100755 (executable)
@@ -41,6 +41,7 @@
 #include <qmap.h>
 #include <qpainter.h>
 #include <qpaintdevicemetrics.h>
+#include <qevent.h>
 
 #include <qwt_math.h>
 #include <qwt_plot_canvas.h>
@@ -54,6 +55,8 @@
 #define DEFAULT_MARKER_SIZE    9     // default marker size
 #define MIN_RECT_SIZE          11    // min sensibility area size
 
+#define FITALL_EVENT           ( QEvent::User + 9999 )
+
 const char* imageZoomCursor[] = { 
 "32 32 3 1",
 ". c None",
@@ -787,6 +790,13 @@ void Plot2d_ViewFrame::updateLegend( const Plot2d_Prs* prs )
 */
 void Plot2d_ViewFrame::fitAll()
 {
+  // Postpone fitAll operation until QwtPlot geometry
+  // has been fully defined
+  if ( !myPlot->polished() ){
+    QApplication::postEvent( this, new QCustomEvent( FITALL_EVENT ) );
+    return;
+  }
+
   QwtDiMap xMap1 = myPlot->canvasMap( QwtPlot::xBottom );
 
   myPlot->setAxisAutoScale( QwtPlot::yLeft );
@@ -1588,7 +1598,8 @@ bool Plot2d_ViewFrame::isYLogEnabled() const
   Constructor
 */
 Plot2d_Plot2d::Plot2d_Plot2d( QWidget* parent )
-     : QwtPlot( parent )
+  : QwtPlot( parent ),
+    myIsPolished( false )
 {
   // outline
   enableOutline( true );
@@ -1768,6 +1779,16 @@ bool Plot2d_Plot2d::existMarker( const QwtSymbol::Style typeMarker, const QColor
   return false;
 }
 
+/*!
+  Sets the flag saying that QwtPlot geometry has been fully defined.
+*/
+void Plot2d_Plot2d::polish()
+{
+  QwtPlot::polish();
+  myIsPolished = true;
+}
+
+
 /*!
   Creates presentation of object
   Default implementation is empty
@@ -2048,3 +2069,14 @@ void Plot2d_ViewFrame::onZoomOut()
 {
   this->incrementalZoom( -INCREMENT_FOR_OP, -INCREMENT_FOR_OP );
 }
+
+/*!
+  Schedules a FitAll operation by putting it to the application's
+  event queue. This ensures that other important events (show, resize, etc.)
+  are processed first.
+*/
+void Plot2d_ViewFrame::customEvent( QCustomEvent* ce )
+{
+  if ( ce->type() == FITALL_EVENT )
+    fitAll();
+}
index 6a6aaf1716dfb71df34ccea53ad4970e66a5dfa5..108cbd9573cf42cfce02593947365b170cfcc3c1 100755 (executable)
@@ -25,6 +25,7 @@
 
 class Plot2d_Plot2d;
 class Plot2d_Prs;
+class QCustomEvent;
 
 typedef QIntDict<Plot2d_Curve> CurveDict;
 
@@ -148,6 +149,9 @@ public slots:
   void    onZoomIn();
   void    onZoomOut();
 
+protected:
+  virtual void customEvent( QCustomEvent* );
+
 protected slots:
   void    plotMousePressed( const QMouseEvent& );
   void    plotMouseMoved( const QMouseEvent& );
@@ -183,6 +187,7 @@ protected:
 
 class Plot2d_Plot2d : public QwtPlot 
 {
+  Q_OBJECT
 public:
   Plot2d_Plot2d( QWidget* parent );
 
@@ -199,11 +204,17 @@ public:
   virtual QSizePolicy sizePolicy() const;
   virtual QSize       minimumSizeHint() const;
 
+  bool                polished() const { return myIsPolished; }
+
+public slots:
+  virtual void polish();
+
 protected:
   bool       existMarker( const QwtSymbol::Style typeMarker, const QColor& color, const Qt::PenStyle typeLine );
 
 protected:
   QValueList<QColor> myColors;
+  bool               myIsPolished;
 };
 
 #endif
index 405e90243b97dc2a9d4dac1a654657804154a787..7681bd3f2b4eeba76076ef263cb5581d7f7d6cc4 100755 (executable)
 #include "Plot2d_ViewModel.h"
 #include "Plot2d_ViewWindow.h"
 
-int Plot2d_ViewManager::myMaxId = 0;
-
 /*!
   Constructor
 */
 Plot2d_ViewManager::Plot2d_ViewManager( SUIT_Study* study, SUIT_Desktop* desk ) 
-: SUIT_ViewManager( study, desk )
+: SUIT_ViewManager( study, desk, new Plot2d_Viewer() )
 {
-  myId = ++myMaxId;
-  Plot2d_Viewer* v = new Plot2d_Viewer();
-  setViewModel( v );
+  setTitle( tr( "PLOT2D_VIEW_TITLE" ) );
 }
 
 /*!
@@ -48,16 +44,6 @@ Plot2d_Viewer* Plot2d_ViewManager::getPlot2dModel() const
   return (Plot2d_Viewer*)myViewModel;
 }
 
-/*!
-  Sets default name of view
-  \param the View - view to be renamed
-*/
-void Plot2d_ViewManager::setViewName( SUIT_ViewWindow* theView )
-{
-  int aPos = myViews.find(theView);
-  theView->setCaption( QString( "Plot2d scene:%1 - viewer:%2" ).arg(myId).arg(aPos+1));
-}
-
 /*!
   Adds new view
   \param theView - view to be added
index 051b26f193116c80090bf1cc815a87bde9a54b83..a26b01cb69406c7a2eb6582dff135c9d4e1bda7b 100755 (executable)
@@ -37,7 +37,6 @@ public:
   Plot2d_Viewer*     getPlot2dModel() const;
 
 protected:
-  void         setViewName(SUIT_ViewWindow* theView);
   bool         insertView(SUIT_ViewWindow* theView);
 
 public slots:
@@ -48,10 +47,6 @@ protected slots:
 
 signals:
   void cloneView( Plot2d_ViewFrame*, Plot2d_ViewFrame* );
-
-protected:
-  static  int  myMaxId;
-  int          myId;
 };
 
 #endif
index 0e7aa10ab33884aac78081a26ca4b0e2b87f7061..e0d764da7b31e25c828ee10071f9ab02914e0ed2 100755 (executable)
@@ -406,3 +406,6 @@ msgstr "Diagonal cross"
 
 msgid "POSTSCRIPT_FILES"
 msgstr "PostScript files (*.ps)"
+
+msgid "Plot2d_ViewManager::PLOT2D_VIEW_TITLE"
+msgstr "Plot2d scene:%M - viewer:%V"
index 1c0bd7f80abee28b9354e847686382190b428ead..af9536fd88e7e9c2caafeca55e30800b27b9dfdb 100755 (executable)
 #endif  // WNT
 
 // ========================================================
-// little trick - we do not have debug python libraries
+// little trick - if we do not have debug python libraries
 #ifdef _DEBUG
-
-#undef _DEBUG
-#include <Python.h>
-#define _DEBUG
-
-#else  // _DEBUG
+ #ifndef HAVE_DEBUG_PYTHON
+  #undef _DEBUG
+ #endif
+#endif
 
 #include <Python.h>
 
-#endif // _DEBUG
+#ifdef _DEBUG
+ #ifndef HAVE_DEBUG_PYTHON
+  #define _DEBUG
+ #endif
+#endif
 
 // ========================================================
 // avoid warning messages
index 98fa563c4c2443a748a04993a9d46c259a234c06..8e1db3946c9cf95f8f3c0111a36baeb117aa2558 100755 (executable)
 #endif  // WNT
 
 // ========================================================
-// little trick - we do not have debug python libraries
+// little trick - if we do not have debug python libraries
 #ifdef _DEBUG
-
+#ifndef HAVE_DEBUG_PYTHON
 #undef _DEBUG
-#include <Python.h>
-#define _DEBUG
-
-#else  // _DEBUG
+#endif
+#endif
 
-#include <Python.h>
+//#include <Python.h>
 
-#endif // _DEBUG
+#ifdef _DEBUG
+#ifndef HAVE_DEBUG_PYTHON
+#define _DEBUG
+#endif
+#endif
 
 // ========================================================
 // avoid warning messages
index 9eecd0f158223ef79724136f9194e4cae8a1053d..9c8f852377101f51f431e6cc293d4acc2f0f905d 100755 (executable)
@@ -16,6 +16,8 @@
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
+#include <Python.h>
 #include "PythonConsole_PyConsole.h"
 #include "PythonConsole_PyEditor.h"
 #include "PyInterp_base.h"
@@ -63,6 +65,16 @@ void PythonConsole::exec( const QString& command )
     myEditor->exec( command );
 }
 
+/*!
+  Blocks execution of main application until command is executed
+  \param command - string with command and arguments
+*/
+void PythonConsole::execAndWait( const QString& command )
+{
+  if ( myEditor )
+    myEditor->execAndWait( command );
+}
+
 /*!
   Changes font of python console
   \param f - new font
index 4978214fbf356c9351d6a95328fa6a27055c5761..b3364e597b229b74b857d896d87aa3c5dcdb4fd3 100755 (executable)
@@ -39,7 +39,7 @@ public:
   virtual void   setFont( const QFont& );
 
   void           exec( const QString& command );
-
+  void           execAndWait( const QString& command );
 protected:
   PyInterp_base*          myInterp;
   PythonConsole_PyEditor* myEditor;
index 04d13646360592688ec6ca42424b1dd9b9387e1f..30291e0c43a4eae034f44532de87e0b4bca4bb3f 100755 (executable)
@@ -52,7 +52,8 @@ enum { IdCopy, IdPaste, IdClear, IdSelectAll };
 
 static QString READY_PROMPT = ">>> ";
 static QString DOTS_PROMPT  = "... ";
-#define PROMPT_SIZE _currentPrompt.length()
+
+#define PROMPT_SIZE (int)_currentPrompt.length()
 
 class ExecCommand : public PyInterp_LockRequest
 {
@@ -104,7 +105,8 @@ private:
 */
 PythonConsole_PyEditor::PythonConsole_PyEditor(PyInterp_base* theInterp, QWidget *theParent, const char* theName): 
   QTextEdit(theParent,theName),
-  myInterp( 0 )
+  myInterp( 0 ),
+  myIsInLoop( false )
 {
   QString fntSet( "" );
   QFont aFont = SUIT_Tools::stringToFont( fntSet );
@@ -148,8 +150,10 @@ void PythonConsole_PyEditor::setText(QString s)
 void PythonConsole_PyEditor::exec( const QString& command )
 {
   // Some interactive command is being executed in this editor -> do nothing
-  if ( isReadOnly() )
+  if ( isReadOnly() ) {
+    myQueue.push_back( command );
     return;
+  }
   int para=paragraphs()-1;
   removeParagraph( para );
   _currentPrompt = READY_PROMPT;
@@ -160,6 +164,17 @@ void PythonConsole_PyEditor::exec( const QString& command )
   handleReturn();
 }
 
+void PythonConsole_PyEditor::execAndWait( const QString& command )
+{
+  if( myIsInLoop )
+    return;
+
+  myIsInLoop = true;
+  exec( command );
+  qApp->enter_loop();
+  myIsInLoop = false;
+}
+
 /*!
     Called when an handleReturn
 */
@@ -603,9 +618,9 @@ void PythonConsole_PyEditor::keyPressEvent( QKeyEvent* e )
        if ( ctrlPressed && !hasSelectedText() ) {
          QString txt = text( curLine );
          int ind = curCol;
-         while ( ind < txt.length()-1 && txt[ ind ] == ' ' ) ind++;
+         while ( ind < (int)( txt.length() - 1 ) && txt[ind] == ' ' ) ind++;
          ind = txt.find( ' ', ind );
-         while ( ind < txt.length()-1 && txt[ ind ] == ' ' ) ind++;
+         while ( ind < (int)( txt.length() - 1 ) && txt[ ind ] == ' ' ) ind++;
          if ( ind > PROMPT_SIZE-1 ) {
            setSelection( curLine, curCol, curLine, ind );
            removeSelectedText();
@@ -664,6 +679,8 @@ void PythonConsole_PyEditor::customEvent(QCustomEvent* e)
       _currentPrompt = READY_PROMPT;
       setText(_currentPrompt);
       viewport()->unsetCursor();
+      if( myIsInLoop )
+       qApp->exit_loop();
       break;
     }
   case PyInterp_Event::INCOMPLETE:
@@ -672,6 +689,8 @@ void PythonConsole_PyEditor::customEvent(QCustomEvent* e)
       _currentPrompt = DOTS_PROMPT;
       setText(_currentPrompt);
       viewport()->unsetCursor();
+      if( myIsInLoop )
+       qApp->exit_loop();
       break;
     }
   default:
@@ -680,6 +699,12 @@ void PythonConsole_PyEditor::customEvent(QCustomEvent* e)
 
   setReadOnly( false );
   _isInHistory = false;
+
+  if ( e->type() == PyInterp_Event::OK && myQueue.count() > 0 ) {
+    QString nextcmd = myQueue[0];
+    myQueue.pop_front();
+    exec( nextcmd );
+  }
 }
 
 /*!
@@ -699,6 +724,8 @@ void PythonConsole_PyEditor::onPyInterpChanged( PyInterp_base* interp )
       _isInHistory = false;
       setText(_currentPrompt);
       viewport()->unsetCursor();
+      if( myIsInLoop )
+       qApp->exit_loop();
     }
     else {
       clear();
@@ -716,7 +743,7 @@ QPopupMenu* PythonConsole_PyEditor::createPopupMenu( const QPoint& pos )
   QPopupMenu* popup = QTextEdit::createPopupMenu( pos );
 
   QValueList<int> ids;
-  for ( int i = 0; popup && i < popup->count(); i++ )
+  for ( int i = 0; popup && i < (int)popup->count(); i++ )
   {
     if ( !popup->isItemEnabled( popup->idAt( i ) ) )
       ids.append( popup->idAt( i ) );
index 004b40021a5e7874b92cd8d0f15eb1bc9764296a..b353ee4dadf5b08d83d2ef7db338aca02d0d073b 100755 (executable)
@@ -47,6 +47,7 @@ public:
   bool isCommand(const QString& str) const;
 
   virtual void exec( const QString& command );
+  void execAndWait( const QString& command );
   
 protected:
   virtual void contentsDropEvent( QDropEvent* event );
@@ -65,13 +66,14 @@ private:
   QString        _buf;
   QString        _currentCommand;
   QString        _currentPrompt;
-  bool           _isInHistory;
+  bool           _isInHistory, myIsInLoop;
 
   PyInterp_base* myInterp;
 
-  QString myBanner;
-  QString myOutput;
-  QString myError;
+  QString        myBanner;
+  QString        myOutput;
+  QString        myError;
+  QStringList    myQueue;
 };
 
 #endif
index 09ceadb27f13928cc03edefb75e4d2563b9d2d05..da23b5f045fb945f876c206feea8bce30517576e 100755 (executable)
@@ -80,21 +80,32 @@ bool PythonConsole_PyInterp::initState()
    * It is the caller responsability to release the lock if needed
    */
   PyEval_AcquireLock();
-  _tstate = Py_NewInterpreter(); // create an interpreter and save current state
-  PySys_SetArgv(PyInterp_base::_argc,PyInterp_base::_argv); // initialize sys.argv
-//  if(MYDEBUG) MESSAGE("PythonConsole_PyInterp::initState - this = "<<this<<"; _tstate = "<<_tstate);
+#ifdef WNT 
+  _tstate = PyGILState_GetThisThreadState();
+  // if no thread state defined
+  if ( _tstate )
+    PyThreadState_Swap(_tstate);
+  else
+#endif
+  {
+    _tstate = Py_NewInterpreter(); // create an interpreter and save current state
+    PySys_SetArgv(PyInterp_base::_argc,PyInterp_base::_argv); // initialize sys.argv
+    //if(MYDEBUG) MESSAGE("PythonConsole_PyInterp::initState - this = "<<this<<"; _tstate = "<<_tstate);
+  }
 
   /*
    * If builtinmodule has been initialized all the sub interpreters
    * will have the same __builtin__ module
    */
-  if(builtinmodule){ 
+  if(builtinmodule)
+    { 
     PyObject *m = PyImport_GetModuleDict();
     PyDict_SetItemString(m, "__builtin__", builtinmodule);
 //    SCRUTE(builtinmodule->ob_refcnt); // builtinmodule reference counter
     _tstate->interp->builtins = PyModule_GetDict(builtinmodule);
     Py_INCREF(_tstate->interp->builtins);
-  }
+  }    
   PyEval_ReleaseThread(_tstate);
   return true;
 }
index 7b3f984b2c77263a4031ba81f28d782c9ec33775..fb1cdae2448ec31ca1181cfee38d4c587d2517d2 100644 (file)
@@ -30,6 +30,9 @@
 
 QValueList<QDS_Datum*> QDS::_datumList;
 
+/*!
+  Convert the OpenCascade ascii string to Qt string.
+*/
 QString QDS::toQString( const TCollection_AsciiString& src )
 {
   QTextCodec* codec = QTextCodec::codecForLocale();
@@ -40,6 +43,9 @@ QString QDS::toQString( const TCollection_AsciiString& src )
   return res;
 }
 
+/*!
+  Convert the OpenCascade unicode string to Qt string.
+*/
 QString QDS::toQString( const TCollection_ExtendedString& src )
 {
   if ( src.IsAscii() )
@@ -48,6 +54,9 @@ QString QDS::toQString( const TCollection_ExtendedString& src )
     return QString( (QChar*)src.ToExtString(), src.Length() );
 }
 
+/*!
+  Convert the OpenCascade ascii string to Qt string.
+*/
 QString QDS::toQString( const Handle(TCollection_HAsciiString)& src )
 {
   if ( src.IsNull() )
@@ -56,6 +65,9 @@ QString QDS::toQString( const Handle(TCollection_HAsciiString)& src )
     return toQString( src->String() );
 }
 
+/*!
+  Convert the OpenCascade unicode string to Qt string.
+*/
 QString QDS::toQString( const Handle(TCollection_HExtendedString)& src )
 {
   if ( src.IsNull() )
@@ -64,6 +76,9 @@ QString QDS::toQString( const Handle(TCollection_HExtendedString)& src )
     return toQString( src->String() );
 }
 
+/*!
+  Convert the Qt string to OpenCascade ascii string.
+*/
 TCollection_AsciiString QDS::toAsciiString( const QString& src )
 {
   TCollection_AsciiString res;
@@ -82,11 +97,17 @@ TCollection_AsciiString QDS::toAsciiString( const QString& src )
   return res;
 }
 
+/*!
+  Convert the OpenCascade unicode string to OpenCascade ascii string.
+*/
 TCollection_AsciiString QDS::toAsciiString( const TCollection_ExtendedString& src )
 {
   return TCollection_AsciiString( src );
 }
 
+/*!
+  Convert the OpenCascade unicode string to OpenCascade ascii string.
+*/
 TCollection_AsciiString QDS::toAsciiString( const Handle(TCollection_HExtendedString)& src )
 {
   TCollection_AsciiString res;
@@ -95,6 +116,9 @@ TCollection_AsciiString QDS::toAsciiString( const Handle(TCollection_HExtendedSt
   return res;
 }
 
+/*!
+  Convert the Qt string to OpenCascade unicode string.
+*/
 TCollection_ExtendedString QDS::toExtString( const QString& src )
 {
   if ( src.isEmpty() )
@@ -112,11 +136,18 @@ TCollection_ExtendedString QDS::toExtString( const QString& src )
   return trg;
 }
 
+/*!
+  Convert the OpenCascade ascii string to OpenCascade unicode string.
+*/
 TCollection_ExtendedString QDS::toExtString( const TCollection_AsciiString& src )
 {
   return TCollection_ExtendedString( src );
 }
 
+/*!
+  Load datum definitions in the dictionary from XML file \adictPath.
+  Returns true if load successed or false otherwise.
+*/
 bool QDS::load( const QString& dictPath )
 {
   if ( dictPath.isEmpty() )
@@ -125,6 +156,11 @@ bool QDS::load( const QString& dictPath )
   return DDS_Dictionary::Load( toAsciiString( dictPath ) );
 }
 
+/*!
+  Returns the label of unit system \asys. If component \acomp specified and not empty then
+  function find the given unit system in the given component otherwise all components will be searched.
+  If unit system not found then empty string returned.
+*/
 QString QDS::unitSystemLabel( const QString& sys, const QString& comp )
 {
   QString lab;
@@ -136,6 +172,11 @@ QString QDS::unitSystemLabel( const QString& sys, const QString& comp )
   return lab;
 }
 
+/*!
+  Gets the name of active unit system from the specified component \acomp.
+  If component not specified or component is empty string then first got component will be used.
+  If component exist then active unit system name returned or empty string otherwise.
+*/
 QString QDS::activeUnitSystem( const QString& comp )
 {
   QString sys;
@@ -146,6 +187,13 @@ QString QDS::activeUnitSystem( const QString& comp )
   return sys;
 }
 
+/*!
+  Sets the active unit system named \asys. If not empty component name \acomp specified then
+  unit system will be activated in the given component otherwise all components will be processed.
+
+  After the changing of active unit system function notify about it to all registered datums
+  from processed components using method QDS_Datum::unitSystemChanged();
+*/
 void QDS::setActiveUnitSystem( const QString& sys, const QString& comp )
 {
   Handle(DDS_Dictionary) dic = DDS_Dictionary::Get();
@@ -179,6 +227,10 @@ void QDS::setActiveUnitSystem( const QString& sys, const QString& comp )
   }
 }
 
+/*!
+  Register given datum \adatum in the static list.
+  This function invoked by QDS_Datum constructor.
+*/
 void QDS::insertDatum( QDS_Datum* datum )
 {
   if ( !datum )
@@ -187,6 +239,10 @@ void QDS::insertDatum( QDS_Datum* datum )
   _datumList.append( datum );
 }
 
+/*!
+  Remove given datum \adatum from the static list.
+  This function invoked by QDS_Datum destructor.
+*/
 void QDS::removeDatum( QDS_Datum* datum )
 {
   if ( !datum )
index 257dcb292d6e299f6fa1390b73c9a73a0253b283..6f3fecd85a79ce471daa8b7c692e27e912363078 100644 (file)
@@ -48,9 +48,18 @@ class Handle(TCollection_HExtendedString);
 class QDS_EXPORT QDS
 {
 public:
-  typedef enum { None = 0x00, Label = 0x01, Control = 0x02, Units = 0x04,
-                 NotFormat = 0x08, NotAccel = 0x10, UnitsWithLabel = 0x20,
-                 All = Label | Control | Units } DatumFlags;
+   /*! Enum describes bit flags of the Qt datum view and behaviour */
+  typedef enum
+  {
+    None = 0x00,                   //!< Non specified any flags (Default behaviour)
+    Label = 0x01,                  //!< Create subwidget for datum label
+    Control = 0x02,                //!< Create subwidget for datum input control
+    Units = 0x04,                  //!< Create subwidget for datum units of measure
+    NotFormat = 0x08,              //!< Don't format initial value
+    NotAccel = 0x10,               //!< Not support accelerators in datum label
+    UnitsWithLabel = 0x20,         //!< Display units of measure in label like "<label_text> (<units_text>) instead separate text"
+    All = Label | Control | Units  //!< Create all subwidgets
+  } DatumFlags;
 
 public:
   static bool                       load( const QString& );
index dc73cda956d5c8e542b4b86c3da3850de4862c9c..9713ca5e487fb495a27c0f5a4ca19928d1c2f497 100644 (file)
 
 #include <qcheckbox.h>
 
+/*
+  \class QDS_CheckBox
+  
+  Datum with control corresponding to check box. This control can have only two states:
+  1 (on/true) or 0 (off/false). QDS_CheckBox don't take into account standard parameter
+  properties (minimum, maximum, filter, etc).
+
+  QDS_CheckBox can set and get following values for access methods (setStringValue(),
+  setIntegerValue(), setDoubleValue(), stringValue(), integerValue(), doubleValue()):
+    \li "1"  - check box state is setted as on.
+    \li "0"  - check box state is setted as off.
+    \li "-1" - check box state is setted as "NoChage" (undefined).
+
+  User can set and check a state "NoChange" using methods clear() and isEmpty() accordingly.
+*/
+
 /*!
-  Constructor. This method is protected. Object can't be directly constructed.
-  Use static method QDS_CheckBox::Create instead.
+  Constructor. Create check box datum object with datum identifier \aid under widget \aparent.
+  Parameter \aflags define behaviour of datum and set of created subwidgets. Default value of
+  this parameter is QDS::All. Parameter \acomp specify the component name which will be used
+  during search of dictionary item.
 */
 QDS_CheckBox::QDS_CheckBox( const QString& id, QWidget* parent, const int flags, const QString& comp )
 : QDS_Datum( id, parent, flags, comp )
@@ -45,7 +63,7 @@ void QDS_CheckBox::clear()
 }
 
 /*!
-  Returns string from QCheckBox widget.
+  Returns string from QCheckBox widget. If the check box state is on then 1 returned otherwise 0.
 */
 QString QDS_CheckBox::getString() const
 {
@@ -56,7 +74,9 @@ QString QDS_CheckBox::getString() const
 }
 
 /*!
-  Sets the string into QCheckBox widget.
+  Sets the string into QCheckBox widget. If argument \atxt is string with number "1" then check box
+  state is setted as on. If argument \atxt is string with number "0" then state is setted as off.
+  If argument \atxt is string with number "-1" then state is setted as "NoChage" (undefined).
 */
 void QDS_CheckBox::setString( const QString& txt )
 {
@@ -95,25 +115,35 @@ QWidget* QDS_CheckBox::createControl( QWidget* parent )
 }
 
 /*!
-  Notify about shanging of control state
+  Notify about ñhanging of control state
 */
 void QDS_CheckBox::onParamChanged()
 {
   emit paramChanged();
 }
 
+/*!
+  Notify about ñhanging of control state. Switch off check box property "tristate" when
+  state changed by user.
+*/
 void QDS_CheckBox::onStateChanged( int state )
 {
   if ( state != QButton::NoChange && checkBox() )
     checkBox()->setTristate( false );
 }
 
+/*!
+  Sets the check box state \atheState.
+*/
 void QDS_CheckBox::setChecked( const bool theState )
 {
   if ( checkBox() )
     checkBox()->setChecked( theState );
 }
 
+/*!
+  Returns current check box state.
+*/
 bool QDS_CheckBox::isChecked() const
 {
   return checkBox() ? checkBox()->isChecked() : false;
index ab97bade64aca29b6b5b57b5905bca6f50d55b91..ac068735e4edddb9660a29596bc254c5519bcaf3 100644 (file)
 
 #include <qlineedit.h>
 
+/*
+  \class QDS_ComboBox
+  
+  Datum with control corresponding to combo box. This control used for datum with enumerable values.
+  It can be used for datum which has type of value 'List'. Each item of combobox defined two properties:
+  integer identifier and string name. All operations on items performed via identifier.
+*/
+
 /*!
-  Constructor.
+  Constructor. Create combobox datum object with datum identifier \aid under widget \aparent. Parameter \aflags
+  define behaviour of datum and set of created subwidgets. Default value of this parameter is QDS::All.
+  Parameter \acomp specify the component name which will be used during search of dictionary item.
 */
 QDS_ComboBox::QDS_ComboBox( const QString& id, QWidget* parent, const int flags, const QString& comp )
 : QDS_Datum( id, parent, flags, comp )
@@ -42,7 +52,7 @@ QDS_ComboBox::~QDS_ComboBox()
 }
 
 /*!
-  Returns true if ComboBox allow to edit current Text.
+  Returns true if ComboBox allow to edit current text.
 */
 bool QDS_ComboBox::editable() const
 {
@@ -70,7 +80,7 @@ void QDS_ComboBox::setEditable( const bool on )
 }
 
 /*!
-  Returns number of items in ComboBox. If total is 'false' then only
+  Returns number of items in ComboBox. If \atotal is 'false' then only
   visible items are taken into account otherwise all items.
 */
 int QDS_ComboBox::count( bool total ) const
@@ -84,7 +94,7 @@ int QDS_ComboBox::count( bool total ) const
 }
 
 /*!
-  Returns list of ids. If total is 'false' then only visible items
+  Returns list of list item identifiers \aids. If \atotal is 'false' then only visible items
   are taken into account otherwise all items.
 */
 void QDS_ComboBox::values( QValueList<int>& ids, bool total ) const
@@ -96,7 +106,7 @@ void QDS_ComboBox::values( QValueList<int>& ids, bool total ) const
 }
 
 /*!
-  Returns the current id as integer.
+  Returns the current id as integer. Reimplemented.
 */
 int QDS_ComboBox::integerValue() const
 {
@@ -112,7 +122,7 @@ int QDS_ComboBox::integerValue() const
 }
 
 /*!
-  Returns the current id as double.
+  Returns the current id as double. Reimplemented.
 */
 double QDS_ComboBox::doubleValue() const
 {
@@ -130,7 +140,7 @@ double QDS_ComboBox::doubleValue() const
 }
 
 /*!
-  Set the current item acording to specified id.
+  Set the current item acording to specified id. Reimplemented.
 */
 void QDS_ComboBox::setIntegerValue( const int id )
 {
@@ -143,7 +153,7 @@ void QDS_ComboBox::setIntegerValue( const int id )
 }
 
 /*!
-  Get the integer part of specified value and use it as new current identifier.
+  Get the integer part of specified value and use it as new current identifier. Reimplemented.
 */
 void QDS_ComboBox::setDoubleValue( const double val )
 {
@@ -157,7 +167,7 @@ void QDS_ComboBox::setDoubleValue( const double val )
 }
 
 /*!
-  Returns visible state of identificator.
+  Returns visible state of item specified by \aid.
 */
 bool QDS_ComboBox::state( const int id ) const
 {
@@ -168,8 +178,9 @@ bool QDS_ComboBox::state( const int id ) const
 }
 
 /*!
-  Sets the visible state of identificator. If 'id' is -1 then specified
-  state will be set to all ids.
+  Sets the visible state of item specified by \aid. If \aid is -1 then specified
+  state will be set to all items. If \aappend is set then keep status for other items
+  otherwise status of other items will be cleared.
 */
 void QDS_ComboBox::setState( const bool on, const int id, const bool append )
 {
@@ -186,7 +197,9 @@ void QDS_ComboBox::setState( const bool on, const int id, const bool append )
 }
 
 /*!
-  Sets the visible state of identificator from the specified list.
+  Sets the visible state of items specified by list of identifiers \aids.
+  If \aappend is set then keep status for other items otherwise status of other
+  items will be cleared.
 */
 void QDS_ComboBox::setState( const bool on, const QValueList<int>& ids, const bool append )
 {
@@ -222,7 +235,9 @@ void QDS_ComboBox::setState( const bool on, const QValueList<int>& ids, const bo
 }
 
 /*!
-  Sets the user items into the combo box.
+  Sets the custom user items into the combo box. User items like standard dictionary
+  list items will be added into the combobox. This functionality allow to user override
+  items.
 */
 void QDS_ComboBox::setValues( const QValueList<int>& ids, const QStringList& names )
 {
@@ -238,7 +253,7 @@ void QDS_ComboBox::setValues( const QValueList<int>& ids, const QStringList& nam
 /*!
   This is an overloaded member function, provided for convenience.
   It behaves essentially like the above function. It creates
-  QValueList (0, 1, 2 ... ) and call previous method
+  QValueList (0, 1, 2 ... ) and call previous method.
 */
 void QDS_ComboBox::setValues( const QStringList& names )
 {
@@ -287,7 +302,7 @@ QString QDS_ComboBox::valueToString( const int val ) const
 }
 
 /*!
-  Returns string from QLineEdit widget.
+  Returns string from QComboBox widget. Reimplemented.
 */
 QString QDS_ComboBox::getString() const
 {
@@ -307,7 +322,7 @@ QString QDS_ComboBox::getString() const
 }
 
 /*!
-  Sets the string into QLineEdit widget.
+  Sets the string into QComboBox widget. Reimplemented.
 */
 void QDS_ComboBox::setString( const QString& txt )
 {
@@ -352,7 +367,7 @@ QtxComboBox* QDS_ComboBox::comboBox() const
 }
 
 /*!
-  Create QComboBox widget as control subwidget.
+  Create QComboBox widget as control subwidget. Reimplemented.
 */
 QWidget* QDS_ComboBox::createControl( QWidget* parent )
 {
@@ -364,6 +379,10 @@ QWidget* QDS_ComboBox::createControl( QWidget* parent )
   return cb;
 }
 
+/*!
+  Notification about active unit system changing. Reimplemented from QDS_Datum.
+  Update combobox content.
+*/
 void QDS_ComboBox::unitSystemChanged( const QString& system )
 {
   QDS_Datum::unitSystemChanged( system );
@@ -454,7 +473,7 @@ void QDS_ComboBox::onTextChanged( const QString& )
 }
 
 /*!
-  Notify about activation new item.
+  Notify about activation combobox item.
 */
 void QDS_ComboBox::onActivated( int idx )
 {
@@ -474,7 +493,7 @@ void QDS_ComboBox::onActivated( int idx )
 }
 
 /*!
-  Updates ComboBox after have change of visible state or items have been inserted / removed.
+  Updates ComboBox after have change of visible state or items have been inserted/removed.
 */
 void QDS_ComboBox::updateComboBox()
 {
index 87dc0c20291f9966960fb18364774ca8d06f843f..a542a19b40812925a21e09d4db3bea9099201eed 100644 (file)
 #include <qvalidator.h>
 #include <qmessagebox.h>
 
+#include <TColStd_SequenceOfAsciiString.hxx>
+
 /*!
-  Class: QDS_Datum::Wrapper
-  Descr: Wrapper widget for sub widgets. [internal]
+  class: QDS_Datum::Wrapper
+  descr: Wrapper widget for sub widgets. [internal]
 */
 
 class QDS_Datum::Wrapper : public QWidget
@@ -45,16 +47,13 @@ public:
   QWidget*      widget() const;
   void          setWidget( QWidget* );
 
-  virtual bool  eventFilter( QObject*, QEvent* );
-
-protected:
-  virtual void  resizeEvent( QResizeEvent* );
+  virtual void  setGeometry( int x, int y, int w, int h );
+  virtual void  setSizePolicy( QSizePolicy );
 
 private:
   QWidget*      myWid;
 };
 
-
 QDS_Datum::Wrapper::Wrapper( QWidget* parent )
 : QWidget( parent ),
 myWid( 0 )
@@ -78,9 +77,6 @@ void QDS_Datum::Wrapper::setWidget( QWidget* wid )
   if ( myWid == wid )
     return;
 
-  if ( myWid )
-    myWid->removeEventFilter( this );
-
   myWid = wid;
 
   if ( !myWid )
@@ -94,34 +90,67 @@ void QDS_Datum::Wrapper::setWidget( QWidget* wid )
 
   myWid->updateGeometry();
   updateGeometry();
-
-  myWid->installEventFilter( this );
 }
 
-bool QDS_Datum::Wrapper::eventFilter( QObject* o, QEvent* e )
+void QDS_Datum::Wrapper::setSizePolicy( QSizePolicy sp )
 {
-  if ( e->type() == QEvent::Resize && o == widget() )
-  {
-    QResizeEvent* re = (QResizeEvent*)e;
-    if ( re->size() != size() )
-      resize( re->size() );
-  }
-  return QWidget::eventFilter( o, e );
+  QWidget::setSizePolicy( sp );
+
+  if ( widget() )
+    widget()->setSizePolicy( sp );
 }
 
-void QDS_Datum::Wrapper::resizeEvent( QResizeEvent* e )
+void QDS_Datum::Wrapper::setGeometry( int x, int y, int w, int h )
 {
-  QWidget::resizeEvent( e );
+  QWidget::setGeometry( x, y, w, h );
 
   if ( widget() && widget()->size() != size() )
-    widget()->resize( size() );
+    widget()->setGeometry( 0, 0, width(), height() );
 }
 
 /*!
-  Class: QDS_Datum
-  Descr: Base class for control used data dictionary. [public]
+  \class QDS_Datum
+
+  This is a base class for control using the data dictionary. Datum is successor of QObject (not QWidget).
+  This object can have three sub widgets named as Label, Control and Units. User can skip creation of
+  some of them manipulate by parameter \aflags. Label widget display label of datum, Control widget allow
+  to input value, Units widget display units of measure in the active system.
+  
+  These widgets constructs under parent of datum. If this parent has layout which can automaticaly add child
+  widgets (see QLayout::setAutoAdd()) then these subwidgets will be placed in following order: first widget
+  is Label, second - Control, third - Unints. User can add these widgets to layout manually using methods
+  QDS_Datum::addTo() or QDS_Datum::widget(). In last case User can retrieve desired widget and place it into
+  layout.
+
+  If use QGroupBox as parent widget for datum object then all subwidgets will be arranged automatically by
+  group box according to column and orientation properties of QGroupBox.
+
+  For example:
+    QGroupBox* box = new QGroupBox( 3, Qt::Horizontal, "datum box" );
+    QDS_Datum* d1  = new QDS_Datum( "datum_1", box, All );
+    QDS_Datum* d2  = new QDS_Datum( "datum_2", box, All );
+    QDS_Datum* d3  = new QDS_Datum( "datum_3", box, All );
+
+  In this example we create the QGroupBox with 3 horizontal columns. All created datum widgets will be
+  placed automatically three widgets in a row. Each datum will be placed from up to bottom one by one.
+
+  Datum value is stored as string. User can get/set this value in different kinds:
+    \liAs string  - methods stringValue()/setStringValue().
+    \liAs integer - methods integerValue()/setIntegerValue(). Given value converted to/from SI.
+    \liAs double  - methods doubleValue()/setDoubleValue(). Given value converted to/from SI.
+    \liAs variant - methods value()/setValue().
+
+  User can perform some actions on datum subwidgets using following methods: isEnabled(),
+  setEnabled(), show(), hide(), setShown(), setFocus(), setAlignment().
 */
 
+/*!
+  Constructor. Create datum object with datum identifier \aid under widget \aparent. Parameter \aflags
+  define behaviour of datum and set of created subwidgets. Default value of this parameter is QDS::All.
+  Parameter \acomp specify the component name which will be used during search of dictionary item.
+
+  Datum register self in the static list by QDS::insertDatum().
+*/
 QDS_Datum::QDS_Datum( const QString& id, QWidget* parent, const int flags, const QString& comp )
 : QObject( parent ),
 myId( id ),
@@ -161,6 +190,10 @@ myInitialised( false )
   insertDatum( this );
 }
 
+/*!
+  Destructor. Destroy all subwidget.
+  Datum unregister self from the static list by QDS::removeDatum().
+*/
 QDS_Datum::~QDS_Datum()
 {
   removeDatum( this );
@@ -174,11 +207,17 @@ QDS_Datum::~QDS_Datum()
 */
 }
 
+/*!
+  Overloaded operator allow to retrieve main subwidget named Control.
+*/
 QDS_Datum::operator QWidget*() const
 {
   return widget( Control );
 }
 
+/*!
+  Returns the datum id.
+*/
 QString QDS_Datum::id() const
 {
   initDatum();
@@ -186,6 +225,9 @@ QString QDS_Datum::id() const
   return myId;
 }
 
+/*!
+  Returns the datum type of value.
+*/
 int QDS_Datum::type() const
 {
   initDatum();
@@ -196,6 +238,9 @@ int QDS_Datum::type() const
   return res;
 }
 
+/*!
+  Returns the datum label string.
+*/
 QString QDS_Datum::label() const
 {
   initDatum();
@@ -210,6 +255,9 @@ QString QDS_Datum::label() const
   return labStr;
 }
 
+/*!
+  Returns the datum units string.
+*/
 QString QDS_Datum::units() const
 {
   initDatum();
@@ -220,6 +268,9 @@ QString QDS_Datum::units() const
   return unitStr;
 }
 
+/*!
+  Returns the datum value filter string.
+*/
 QString QDS_Datum::filter() const
 {
   initDatum();
@@ -230,6 +281,9 @@ QString QDS_Datum::filter() const
   return fltr;
 }
 
+/*!
+  Returns the datum value format string.
+*/
 QString QDS_Datum::format() const
 {
   initDatum();
@@ -240,6 +294,9 @@ QString QDS_Datum::format() const
   return fmtStr;
 }
 
+/*!
+  Returns the datum default value string.
+*/
 QString QDS_Datum::defaultValue() const
 {
   initDatum();
@@ -261,6 +318,9 @@ QString QDS_Datum::defaultValue() const
   return aDef;
 }
 
+/*!
+  Returns the datum minimum value string.
+*/
 QString QDS_Datum::minimumValue() const
 {
   initDatum();
@@ -271,6 +331,9 @@ QString QDS_Datum::minimumValue() const
   return min;
 }
 
+/*!
+  Returns the datum maximum value string.
+*/
 QString QDS_Datum::maximumValue() const
 {
   initDatum();
@@ -281,6 +344,9 @@ QString QDS_Datum::maximumValue() const
   return max;
 }
 
+/*!
+  Returns the datum long description.
+*/
 QString QDS_Datum::longDescription() const
 {
   initDatum();
@@ -291,6 +357,9 @@ QString QDS_Datum::longDescription() const
   return ldStr;
 }
 
+/*!
+  Returns the datum short description.
+*/
 QString QDS_Datum::shortDescription() const
 {
   initDatum();
@@ -301,6 +370,75 @@ QString QDS_Datum::shortDescription() const
   return sdStr;
 }
 
+/*!
+  Returns the list of option names.
+*/
+QStringList QDS_Datum::options() const
+{
+  QStringList res;
+  if ( !dicItem().IsNull() )
+  {
+    TColStd_SequenceOfAsciiString lst;
+    dicItem()->GetOptionNames( lst );
+    for ( int i = 1; i <= lst.Length(); i++ )
+      res.append( toQString( lst.Value( i ) ) );
+  }
+  return res;
+}
+
+/*!
+  Returns the option specified by \aname as QVariant.
+  If option not exist then not valid QVariant returned.
+*/
+QVariant QDS_Datum::option( const QString& name ) const
+{
+  QVariant res;
+  if ( !dicItem().IsNull() )
+    res = QVariant( toQString( dicItem()->GetOption( toAsciiString( name ) ) ) );
+  return res;
+}
+
+/*!
+  Returns the option specified by \aname as QString.
+  If option not exist then empty string returned.
+*/
+QString QDS_Datum::optionString( const QString& name ) const
+{
+  QString res;
+  if ( !dicItem().IsNull() )
+    res = toQString( dicItem()->GetOption( toAsciiString( name ) ) );
+  return res;
+}
+
+/*!
+  Returns the option specified by \aname as double.
+  If option not exist then 0 returned.
+*/
+double QDS_Datum::optionDouble( const QString& name ) const
+{
+  double res = 0;
+  QVariant opt = option( name );
+  if ( opt.isValid() && opt.canCast( QVariant::Double ) )
+    res = opt.toDouble();
+  return res;
+}
+
+/*!
+  Returns the option specified by \aname as integer.
+  If option not exist then 0 returned.
+*/
+int QDS_Datum::optionInteger( const QString& name ) const
+{
+  int res = 0;
+  QVariant opt = option( name );
+  if ( opt.isValid() && opt.canCast( QVariant::Int ) )
+    res = opt.toInt();
+  return res;
+}
+
+/*!
+  Returns the datum value as variant (QVariant object).
+*/
 QVariant QDS_Datum::value() const
 {
   QVariant val;
@@ -309,6 +447,9 @@ QVariant QDS_Datum::value() const
   return val;
 }
 
+/*!
+  Returns the datum value as string (QString object).
+*/
 QString QDS_Datum::stringValue() const
 {
   initDatum();
@@ -319,6 +460,10 @@ QString QDS_Datum::stringValue() const
     return getString();
 }
 
+/*!
+  Returns the datum value as double. This value converted from units of measure in active unit system
+  to units of measure in unit system "SI".
+*/
 double QDS_Datum::doubleValue() const
 {
   initDatum();
@@ -336,6 +481,10 @@ double QDS_Datum::doubleValue() const
   return res;
 }
 
+/*!
+  Returns the datum value as integer. This value converted from units of measure in active unit system
+  to units of measure in unit system "SI".
+*/
 int QDS_Datum::integerValue() const
 {
   initDatum();
@@ -353,6 +502,9 @@ int QDS_Datum::integerValue() const
   return res;
 }
 
+/*!
+  Returns the text from datum. Text consist of label, string value and units.
+*/
 QString QDS_Datum::text() const
 {
   initDatum();
@@ -372,11 +524,17 @@ QString QDS_Datum::text() const
   return res;
 }
 
+/*!
+  Returns false if datum control has inputted value.
+*/
 bool QDS_Datum::isEmpty() const
 {
   return stringValue().isEmpty();
 }
 
+/*!
+  Reset datum state and set default value as current.
+*/
 void QDS_Datum::reset()
 {
   initDatum();
@@ -391,6 +549,9 @@ void QDS_Datum::reset()
   emit paramChanged( str );
 }
 
+/*!
+  Clear the control.
+*/
 void QDS_Datum::clear()
 {
   initDatum();
@@ -408,6 +569,9 @@ void QDS_Datum::clear()
   }
 }
 
+/*!
+  Set varian value (QVariant object) into datum.
+*/
 void QDS_Datum::setValue( const QVariant& val )
 {
   if ( val.isValid() && val.canCast( QVariant::String ) )
@@ -416,6 +580,9 @@ void QDS_Datum::setValue( const QVariant& val )
     clear();
 }
 
+/*!
+  Set string value (QString object) into datum.
+*/
 void QDS_Datum::setStringValue( const QString& txt )
 {
   initDatum();
@@ -431,6 +598,10 @@ void QDS_Datum::setStringValue( const QString& txt )
   emit paramChanged( str );
 }
 
+/*!
+  Set double value into datum. This value converted from units of measure in unit system "SI"
+  to units of measure in active unit system. Format the value using datum format if it required.
+*/
 void QDS_Datum::setDoubleValue( const double num )
 {
   initDatum();
@@ -450,6 +621,10 @@ void QDS_Datum::setDoubleValue( const double num )
   emit paramChanged( str );
 }
 
+/*!
+  Set integer value into datum. This value converted from units of measure in unit system "SI"
+  to units of measure in active unit system. Format the value using datum format if it required.
+*/
 void QDS_Datum::setIntegerValue( const int num )
 {
   initDatum();
@@ -470,7 +645,7 @@ void QDS_Datum::setIntegerValue( const int num )
 }
 
 /*!
-  Returns true if all subwidgets specified by 'element' enabled.
+  Returns true if all subwidgets specified by \aelement enabled.
 */
 bool QDS_Datum::isEnabled( const int element ) const
 {
@@ -487,8 +662,8 @@ bool QDS_Datum::isEnabled( const int element ) const
 }
 
 /*!
-  Enable/Disable subwidgets specified by 'element'.
-  Values: Label, Control, Units or their combinations.
+  Enable/Disable subwidgets specified by \aelement.
+  Possible values of \aelement: Label, Control, Units or their combinations.
 */
 void QDS_Datum::setEnabled( const bool on, const int element )
 {
@@ -510,49 +685,44 @@ void QDS_Datum::setEnabled( bool on )
   setEnabled( on, Control );
 }
 
+/*!
+  Show/hide subwidgets specified by \aelement.
+  Possible values of \aelement: Label, Control, Units or their combinations.
+*/
 void QDS_Datum::setShown( const bool visible, const int flags )
 {
-  if ( visible )
-    show( flags );
-  else
-    hide( flags );
+  initDatum();
+
+  uint flag = Units;
+  while ( flag )
+  {
+    if ( flags & flag && widget( flag ) )
+      widget( flag )->setShown( visible );
+    flag = flag >> 1;
+  }
 }
 
 /*!
-  Show subwidgets specified by 'element'.
-  Values: Label, Control, Units or their combinations.
+  Show subwidgets specified by \aelement.
+  Possible values of \aelement: Label, Control, Units or their combinations.
 */
 void QDS_Datum::show( const int element )
 {
-  initDatum();
-
-  if ( ( element & Label ) && labelWidget() )
-    labelWidget()->show();
-  if ( ( element & Units ) && unitsWidget() )
-    unitsWidget()->show();
-  if ( ( element & Control ) && controlWidget() )
-    controlWidget()->show();
+  setShown( true, element );
 }
 
 /*!
-  Hide subwidgets specified by 'element'.
-  Values: Label, Control, Units or their combinations.
+  Hide subwidgets specified by \aelement.
+  Possible values of \aelement: Label, Control, Units or their combinations.
 */
 void QDS_Datum::hide( const int element )
 {
-  initDatum();
-
-  if ( ( element & Label ) && labelWidget() )
-    labelWidget()->hide();
-  if ( ( element & Units ) && unitsWidget() )
-    unitsWidget()->hide();
-  if ( ( element & Control ) && controlWidget() )
-    controlWidget()->hide();
+  setShown( false, element );
 }
 
 /*!
-  Returns subwidget specified by 'element'.
-  Possible values: Label, Control, Units.
+  Returns subwidget specified by \aelement.
+  Possible values of \aelement: Label, Control, Units.
 */
 QWidget* QDS_Datum::widget( const int element ) const
 {
@@ -573,7 +743,7 @@ void QDS_Datum::setFocus()
 
 /*!
   Returns true if control contains valid value otherwise returns false
-  and display warning message box if parameter msgBox is set.
+  and display warning message box if parameter \amsgBox is set.
 */
 bool QDS_Datum::isValid( const bool msgBox, const QString& extMsg, const QString& extLabel ) const
 {
@@ -658,7 +828,7 @@ bool QDS_Datum::isValid( const bool msgBox, const QString& extMsg, const QString
 }
 
 /*!
-  Add widgets to the vertical layout.
+  Add widgets to the vertical box layout.
 */
 void QDS_Datum::addTo( QVBoxLayout* l )
 {
@@ -676,7 +846,7 @@ void QDS_Datum::addTo( QVBoxLayout* l )
 }
 
 /*!
-  Add widgets to the horizaontal layout.
+  Add widgets to the horizaontal box layout.
 */
 void QDS_Datum::addTo( QHBoxLayout* l )
 {
@@ -732,6 +902,9 @@ void QDS_Datum::setAlignment( const int align, const int type )
     unitsWidget()->setAlignment( align );
 }
 
+/*!
+  Perform delayed initialisation. Reimplemented for internal reasons.
+*/
 bool QDS_Datum::eventFilter( QObject* o, QEvent* e )
 {
   if ( o == parent() )
@@ -744,14 +917,14 @@ bool QDS_Datum::eventFilter( QObject* o, QEvent* e )
 }
 
 /*!
-  Notify about parameter changing.
+  Notify about parameter value changing.
 */
 void QDS_Datum::onParamChanged()
 {
 }
 
 /*!
-  Delayed initialization.
+  Perform delayed initialization.
 */
 void QDS_Datum::onInitDatum()
 {
@@ -767,7 +940,7 @@ void QDS_Datum::onDestroyed( QObject* obj )
 }
 
 /*!
-  Returns QLabel instance which contains data dictionary label.
+  Returns QLabel widget which contains dictionary item label.
 */
 QLabel* QDS_Datum::labelWidget() const
 {
@@ -776,7 +949,7 @@ QLabel* QDS_Datum::labelWidget() const
 }
 
 /*!
-  Returns QLabel instance which contains data dictionary units.
+  Returns QLabel widget which contains dictionary item units.
 */
 QLabel* QDS_Datum::unitsWidget() const
 {
@@ -810,7 +983,7 @@ void QDS_Datum::setDicItem( const Handle(DDS_DicItem)& item )
 }
 
 /*!
-  Creates QLabel widget for data label.
+  Creates QLabel widget for dictionary item label.
 */
 QLabel* QDS_Datum::createLabel( QWidget* parent )
 {
@@ -818,7 +991,7 @@ QLabel* QDS_Datum::createLabel( QWidget* parent )
 }
 
 /*!
-  Creates QLabel widget for data units.
+  Creates QLabel widget for dictionary item units.
 */
 QLabel* QDS_Datum::createUnits( QWidget* parent )
 {
@@ -826,7 +999,7 @@ QLabel* QDS_Datum::createUnits( QWidget* parent )
 }
 
 /*!
-  Returns validator accordance to data type.
+  Creates and returns validator accordance to datum type of value.
 */
 QValidator* QDS_Datum::validator( const bool limits ) const
 {
@@ -913,7 +1086,7 @@ bool QDS_Datum::validate( const QString& txt ) const
 }
 
 /*!
-  Retrieves information from data dictionary and create subwidgets using virtual mechanism.
+  Retrieves information from dictionary and create subwidgets using virtual mechanism.
   Virtual mechanism doesn't work in constructor and destructor, therefore this method should
   be called outside the constructor.
 */
@@ -954,6 +1127,9 @@ void QDS_Datum::initialize()
     labelWidget()->setBuddy( ctrl );
 }
 
+/*!
+  Notification about active unit system changing. Update label and units texts.
+*/
 void QDS_Datum::unitSystemChanged( const QString& unitSystem )
 {
   QString labText = label();
@@ -1011,7 +1187,7 @@ QString QDS_Datum::textToUnits( const QString& txt )
 }
 
 /*!
-  Format the specified integer as data dictionary value.
+  Format the specified integer as dictionary item value.
 */
 QString QDS_Datum::format( const int num, const QString& id, const bool convert )
 {
@@ -1038,7 +1214,7 @@ QString QDS_Datum::format( const int num, const QString& id, const bool convert
 }
 
 /*!
-  Format the specified double as data dictionary value.
+  Format the specified double as dictionary item value.
 */
 QString QDS_Datum::format( const double num, const QString& id, const bool convert )
 {
@@ -1065,7 +1241,7 @@ QString QDS_Datum::format( const double num, const QString& id, const bool conve
 }
 
 /*!
-  Format the specified string as data dictionary value.
+  Format the specified string as dictionary item value.
 */
 QString QDS_Datum::format( const QString& str, const QString& id, const bool convert )
 {
@@ -1092,7 +1268,7 @@ QString QDS_Datum::format( const QString& str, const QString& id, const bool con
 }
 
 /*!
-  Format the given string accordance to data format.
+  Format the given string accordance to dictionary item format.
 */
 QString QDS_Datum::format( const QString& aFormat, const int aType, const int aValue )
 {
@@ -1123,7 +1299,7 @@ QString QDS_Datum::format( const QString& aFormat, const int aType, const int aV
 }
 
 /*!
-  Format the given string accordance to data format.
+  Format the given string accordance to dictionary item format.
 */
 QString QDS_Datum::format( const QString& aFormat, const int aType, const double aValue )
 {
@@ -1154,7 +1330,7 @@ QString QDS_Datum::format( const QString& aFormat, const int aType, const double
 }
 
 /*!
-  Format the given string accordance to data format.
+  Format the given string accordance to dictionary item format.
 */
 QString QDS_Datum::format( const QString& aFormat, const int aType, const QString& aValue )
 {
@@ -1271,7 +1447,7 @@ QString QDS_Datum::canonicalFormat( const QString& fmt, QString& flags )
 }
 
 /*!
-  Returns displayable units string for given DD ID
+  Returns displayable units string for given dictionary item id
 */
 QString QDS_Datum::units( const QString& id )
 {
@@ -1350,6 +1526,9 @@ void QDS_Datum::invalidateCache()
   myTargetValue = QString::null;
 }
 
+/*!
+  Remove the acceleartor tags '&' from specified label string \asrc.
+*/
 QString QDS_Datum::removeAccel( const QString& src )
 {
   QString trg = src;
@@ -1366,6 +1545,9 @@ QString QDS_Datum::removeAccel( const QString& src )
   return trg;
 }
 
+/*!
+  Returns true if given format string \atheFormat has specificator for double values.
+*/
 bool QDS_Datum::isDoubleFormat( const QString& theFormat )
 {
   if ( theFormat.length() > 0 )
@@ -1377,11 +1559,17 @@ bool QDS_Datum::isDoubleFormat( const QString& theFormat )
     return false;
 }
 
+/*!
+  Returns datum flags.
+*/
 int QDS_Datum::flags() const
 {
   return myFlags;
 }
 
+/*!
+  Perform intialization if it needed. [internal]
+*/
 void QDS_Datum::initDatum() const
 {
   if ( myInitialised )
@@ -1395,6 +1583,9 @@ void QDS_Datum::initDatum() const
     parent()->removeEventFilter( this );
 }
 
+/*!
+  Return wrapper for specified subwidget. [internal]
+*/
 QDS_Datum::Wrapper* QDS_Datum::wrapper( QWidget* wid ) const
 {
   if ( !wid )
@@ -1409,6 +1600,9 @@ QDS_Datum::Wrapper* QDS_Datum::wrapper( QWidget* wid ) const
   return wrap;
 }
 
+/*!
+  Return wrapper for specified subwidget name. [internal]
+*/
 QDS_Datum::Wrapper* QDS_Datum::wrapper( const int id ) const
 {
   Wrapper* wrap = 0;
@@ -1417,6 +1611,9 @@ QDS_Datum::Wrapper* QDS_Datum::wrapper( const int id ) const
   return wrap;
 }
 
+/*!
+  Return subwidget name for specified wrapper. [internal]
+*/
 int QDS_Datum::wrapperType( QDS_Datum::Wrapper* wrap ) const
 {
   int id = -1;
index 5e65fe424136250f7ce4fbed598d8fdcd2db5b14..9ff431f66ad35eabed35f827b395458670c83bb0 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "QDS.h"
 
-#include <qobject.h>
+#include <qwidget.h>
 #include <qstring.h>
 #include <qvariant.h>
 #include <qguardedptr.h>
@@ -60,6 +60,12 @@ public:
   QString                   minimumValue() const;
   QString                   maximumValue() const;
 
+  QStringList               options() const;
+  QVariant                  option( const QString& ) const;
+  QString                   optionString( const QString& ) const;
+  double                    optionDouble( const QString& ) const;
+  int                       optionInteger( const QString& ) const;
+
   virtual QVariant          value() const;
 
   virtual QString           stringValue() const;
@@ -82,9 +88,9 @@ public:
   virtual bool              isEnabled( const int = Control ) const;
   virtual void              setEnabled( const bool, const int );
 
-  void                      show( const int = -1 );
-  void                      hide( const int = -1 );
-  void                      setShown( const bool, const int = -1 );
+  void                      show( const int = All );
+  void                      hide( const int = All );
+  virtual void              setShown( const bool, const int = All );
 
   QWidget*                  widget( const int ) const;
   void                      setFocus();
index a4b879cd36a8141f9194dcdb89d078cb0675ba5a..cb5ddf1486690e53029822e4b2e4883f4d57bb04 100644 (file)
@@ -22,8 +22,8 @@
 #include <qvalidator.h>
 
 /*
-  Class: QDS_LineEdit::Editor
-  Descr: Internal class inherited from line edit
+  class: QDS_LineEdit::Editor
+  descr: Internal class inherited from line edit
 */
 
 class QDS_LineEdit::Editor : public QLineEdit
@@ -50,12 +50,18 @@ private:
 };
 
 /*
-  Class: QDS_LineEdit
-  Descr: Data control corresponding to line edit
+  \class QDS_LineEdit
+  
+  Datum with control corresponding to line edit. User can enter parameter value in single line editor.
+  User inputted values will be checked by validator according to type if value and parameter properties
+  (minimum, maximum, filter, precision, etc). If user input not valid value then this value will be
+  displayed in red color.
 */
 
 /*!
-  Constructor.
+  Constructor. Create line edit datum object with datum identifier \aid under widget \aparent. Parameter \aflags
+  define behaviour of datum and set of created subwidgets. Default value of this parameter is QDS::All.
+  Parameter \acomp specify the component name which will be used during search of dictionary item.
 */
 QDS_LineEdit::QDS_LineEdit( const QString& id, QWidget* parent, const int flags, const QString& comp )
 : QDS_Datum( id, parent, flags, comp )
@@ -69,6 +75,10 @@ QDS_LineEdit::~QDS_LineEdit()
 {
 }
 
+/*!
+  Notification about active unit system changing. Reimplemented from QDS_Datum.
+  Update validator settings for line edit.
+*/
 void QDS_LineEdit::unitSystemChanged( const QString& system )
 {
   QDS_Datum::unitSystemChanged( system );
@@ -107,7 +117,44 @@ void QDS_LineEdit::unitSystemChanged( const QString& system )
 }
 
 /*!
-  Set the aligment of line edit.
+  Select all text in the editor.
+*/
+void QDS_LineEdit::selectAll()
+{
+  if ( lineEdit() )
+    lineEdit()->selectAll();
+}
+
+/*!
+  Deselect all text in the editor.
+*/
+void QDS_LineEdit::deselect()
+{
+  if ( lineEdit() )
+    lineEdit()->deselect();
+}
+
+/*!
+  Select or deselect all text in the editor.
+*/
+void QDS_LineEdit::setSelection( const bool on )
+{
+  if ( on )
+    selectAll();
+  else
+    deselect();
+}
+
+/*!
+  Returns true if the editor has selected text.
+*/
+bool QDS_LineEdit::hasSelection() const
+{
+  return lineEdit() ? lineEdit()->hasSelectedText() : false;
+}
+
+/*!
+  Set the aligment of line edit. Reimplemented from QDS_Datum.
 */
 void QDS_LineEdit::setAlignment( const int align, const int type )
 {
@@ -118,7 +165,7 @@ void QDS_LineEdit::setAlignment( const int align, const int type )
 }
 
 /*!
-  Returns string from QLineEdit widget.
+  Returns string value from QLineEdit widget. Reimplemented from QDS_Datum.
 */
 QString QDS_LineEdit::getString() const
 {
@@ -129,7 +176,7 @@ QString QDS_LineEdit::getString() const
 }
 
 /*!
-  Sets the string into QLineEdit widget.
+  Sets the string value into QLineEdit widget. Reimplemented from QDS_Datum.
 */
 void QDS_LineEdit::setString( const QString& txt )
 {
@@ -146,7 +193,7 @@ QLineEdit* QDS_LineEdit::lineEdit() const
 }
 
 /*!
-  Create QLineEdit widget as control subwidget.
+  Create QLineEdit widget as control subwidget. Reimplemented from QDS_Datum.
 */
 QWidget* QDS_LineEdit::createControl( QWidget* parent )
 {
@@ -170,7 +217,7 @@ void QDS_LineEdit::onTextChanged( const QString& )
 }
 
 /*!
-  Checks the current parameter value on validity.
+  Checks the current parameter value on validity. If value is not valid then set text color as red.
 */
 void QDS_LineEdit::onParamChanged()
 {
index 3362e74378885c4ce20ec028faa2b5034e5fd684..293e57eedf58b73cb0c52fac55d3b361c0f73423 100644 (file)
@@ -27,6 +27,8 @@ class QDS_EXPORT QDS_LineEdit : public QDS_Datum
 {
   Q_OBJECT
 
+  Q_PROPERTY( bool Selection READ hasSelection WRITE setSelection )
+
 protected:
   class Editor;
 
@@ -34,8 +36,13 @@ public:
   QDS_LineEdit( const QString&, QWidget* = 0, const int = All, const QString& = QString::null );
   virtual ~QDS_LineEdit();
 
+  virtual void         deselect();
+  virtual void         selectAll();
   virtual void         setAlignment( const int, const int = Label );
 
+  bool                 hasSelection() const;
+  void                 setSelection( const bool );
+
 signals:
   void                 returnPressed();
 
index f07b190bdb35894ca2c7c6eba7dbdbf29629ce8d..44771f0fc1c5b47560ed30bb4862d17ae34f95ba 100644 (file)
 #include <qbuttongroup.h>
 #include <qradiobutton.h>
 
+/*
+  \class QDS_RadioBox
+  
+  Datum with control corresponding to button group with set of exclusive radio buttons.
+  This control used for datum with enumerable values. It can be used for datum which has
+  type of value 'List'. Each radio button of combobox defined two properties:
+  integer identifier and string name. All operations on radio buttons performed via identifier.
+
+  If datum label text is specified then it displayed in group box title.
+*/
+
 /*!
-  Constructor.
+  Constructor. Create radio button box datum object with datum identifier \aid under widget \aparent.
+  Parameter \aflags define behaviour of datum and set of created subwidgets. Default value of this
+  parameter is QDS::Control. Parameter \acomp specify the component name which will be used during
+  search of dictionary item.
 */
 QDS_RadioBox::QDS_RadioBox( const QString& id, QWidget* parent, const int flags, const QString& comp )
 : QDS_Datum( id, parent, flags & ~( Label | Units ), comp )
@@ -44,8 +58,8 @@ QDS_RadioBox::~QDS_RadioBox()
 }
 
 /*!
-  Returns number of items in ComboBox. If total is 'false' then only
-  visible items are taken into account otherwise all items.
+  Returns number of buttons in radio box. If total is 'false' then only
+  visible buttons are taken into account otherwise all buttons.
 */
 int QDS_RadioBox::count( bool total ) const
 {
@@ -60,8 +74,8 @@ int QDS_RadioBox::count( bool total ) const
 }
 
 /*!
-  Returns list of ids. If total is 'false' then only visible items
-  are taken into account otherwise all items.
+  Returns list of button identifiers \aids. If \atotal is 'false' then only visible
+  buttons are taken into account otherwise all buttons.
 */
 void QDS_RadioBox::values( QValueList<int>& ids, bool total ) const
 {
@@ -72,7 +86,7 @@ void QDS_RadioBox::values( QValueList<int>& ids, bool total ) const
 }
 
 /*!
-  Returns visible state of identificator.
+  Returns visible state of button specified by \aid.
 */
 bool QDS_RadioBox::state( const int id ) const
 {
@@ -83,8 +97,9 @@ bool QDS_RadioBox::state( const int id ) const
 }
 
 /*!
-  Sets the visible state of identificator. If 'id' is -1 then specified
-  state will be set to all ids.
+  Sets the visible state of button specified by \aid. If \aid is -1 then specified
+  state will be set to all buttons. If \aappend is set then keep status for other
+  buttons otherwise status of other buttons will be cleared.
 */
 void QDS_RadioBox::setState( const bool on, const int id, const bool append )
 {
@@ -101,7 +116,9 @@ void QDS_RadioBox::setState( const bool on, const int id, const bool append )
 }
 
 /*!
-  Sets the visible state of identificator from the specified list.
+  Sets the visible state of buttons specified by list of identifiers \aids.
+  If \aappend is set then keep status for other buttons otherwise status of other
+  buttons will be cleared.
 */
 void QDS_RadioBox::setState( const bool on, const QValueList<int>& ids, const bool append )
 {
@@ -135,7 +152,9 @@ void QDS_RadioBox::setState( const bool on, const QValueList<int>& ids, const bo
 }
 
 /*!
-  Sets the user items into the combo box.
+  Sets the custom user buttons into the radio box. User buttons like standard dictionary
+  button from list will be added into the radio box. This functionality allow to user override
+  buttons.
 */
 void QDS_RadioBox::setValues( const QValueList<int>& ids, const QStringList& names )
 {
@@ -160,7 +179,8 @@ void QDS_RadioBox::setValues( const QStringList& names )
 }
 
 /*!
-  Returns string from control.
+  Returns string from radio box. Reimplemented. String which contains identifier of
+  currently selected button returned.
 */
 QString QDS_RadioBox::getString() const
 {
@@ -176,7 +196,8 @@ QString QDS_RadioBox::getString() const
 }
 
 /*!
-  Sets the string into control.
+  Sets the string into radio box. Reimplemented. Button with identifier from specified
+  string \atxt became selected in radio box.
 */
 void QDS_RadioBox::setString( const QString& txt )
 {
@@ -227,7 +248,7 @@ QButtonGroup* QDS_RadioBox::buttonGroup() const
 }
 
 /*!
-  Create QComboBox widget as control subwidget.
+  Create QButtonGroup widget as control subwidget.
 */
 QWidget* QDS_RadioBox::createControl( QWidget* parent )
 {
@@ -237,6 +258,10 @@ QWidget* QDS_RadioBox::createControl( QWidget* parent )
   return bg;
 }
 
+/*!
+  Notification about active unit system changing. Reimplemented from QDS_Datum.
+  Update radio box content.
+*/
 void QDS_RadioBox::unitSystemChanged( const QString& system )
 {
   QDS_Datum::unitSystemChanged( system );
@@ -308,7 +333,7 @@ void QDS_RadioBox::unitSystemChanged( const QString& system )
 }
 
 /*!
-  Notify about state changed in line edit of RadioBox.
+  Notify about activation radio button.
 */
 void QDS_RadioBox::onToggled( bool on )
 {
@@ -322,7 +347,7 @@ void QDS_RadioBox::onToggled( bool on )
 }
 
 /*!
-  Updates RadioBox after have change of visible state or items have been inserted / removed.
+  Updates RadioBox after have change of visible state or buttons have been inserted/removed.
 */
 void QDS_RadioBox::updateRadioBox()
 {
@@ -374,6 +399,9 @@ void QDS_RadioBox::updateRadioBox()
   }
 }
 
+/*!
+  Returns the list of the radio buttons from the button group.
+*/
 void QDS_RadioBox::buttons( QPtrList<QRadioButton>& lst ) const
 {
   lst.setAutoDelete( false );
index e7cf86618ae9cd29552228682c66935150ec083f..862b6ab4f617d71ea4f9a055bb62c25cba88c6ac 100644 (file)
@@ -39,7 +39,7 @@ class QDS_EXPORT QDS_RadioBox : public QDS_Datum
   Q_OBJECT
 
 public:
-  QDS_RadioBox( const QString&, QWidget* = 0, const int = All, const QString& = QString::null );
+  QDS_RadioBox( const QString&, QWidget* = 0, const int = Control, const QString& = QString::null );
   virtual ~QDS_RadioBox();
 
   int                        count( bool = false ) const;
index 430d7fd5ad6c394d8e11bd13bf9adec8aa25b810..71864cb51e5ad06014b1fe141a8f8a517a46535b 100644 (file)
 
 #include <qvalidator.h>
 
+/*
+  \class QDS_SpinBox
+  
+  Datum with control corresponding to spin box. This control used for integer numbers.
+  User can input data directly in spin box or can modify current value with given
+  increment.
+*/
+
 /*!
-  Constructor.
+  Constructor. Create spin box datum object with datum identifier \aid under widget \aparent. Parameter \aflags
+  define behaviour of datum and set of created subwidgets. Default value of this parameter is QDS::All.
+  Parameter \acomp specify the component name which will be used during search of dictionary item.
 */
 QDS_SpinBox::QDS_SpinBox( const QString& id, QWidget* parent, const int flags, const QString& comp )
 : QDS_Datum( id, parent, flags, comp )
@@ -38,7 +48,7 @@ QDS_SpinBox::~QDS_SpinBox()
 }
 
 /*!
-  Returns string from QSpinBox widget.
+  Returns string from QSpinBox widget. Reimplemented.
 */
 QString QDS_SpinBox::getString() const
 {
@@ -56,7 +66,7 @@ QString QDS_SpinBox::getString() const
 }
 
 /*!
-  Sets the string into QSpinBox widget.
+  Sets the string into QSpinBox widget. Reimplemented.
 */
 void QDS_SpinBox::setString( const QString& txt )
 {
@@ -77,7 +87,7 @@ QtxIntSpinBox* QDS_SpinBox::spinBox() const
 }
 
 /*!
-  Create QSpinBox widget as control subwidget.
+  Create QSpinBox widget as control subwidget. Reimplemented.
 */
 QWidget* QDS_SpinBox::createControl( QWidget* parent )
 {
@@ -88,7 +98,7 @@ QWidget* QDS_SpinBox::createControl( QWidget* parent )
 }
 
 /*!
-  Notify about text changing in spin box.
+  Notify about value changing in spin box.
 */
 void QDS_SpinBox::onValueChanged( int val )
 {
@@ -119,7 +129,8 @@ int QDS_SpinBox::step() const
 }
 
 /*!
-  This method is redefined from ancestor class to perform own initialization ( suffix, prefix, etc ).
+  Notification about active unit system changing. Reimplemented from QDS_Datum.
+  Update validator and spin box parameters: suffix, prefix, minimum, maximum.
 */
 void QDS_SpinBox::unitSystemChanged( const QString& system )
 {
index ac99303e87717f739082610f699213b5459116ca..0bd7bcf264a95da6d3850a08674c718e865e3458 100644 (file)
 
 #include <QtxDblSpinBox.h>
 
+/*
+  \class QDS_SpinBoxDbl
+  
+  Datum with control corresponding to spin box. This control used for double numbers.
+  User can input data directly in spin box or can modify current value with given
+  increment.
+*/
+
 /*!
-  Constructor.
+  Constructor. Create spin box datum object with datum identifier \aid under widget \aparent. Parameter \aflags
+  define behaviour of datum and set of created subwidgets. Default value of this parameter is QDS::All.
+  Parameter \acomp specify the component name which will be used during search of dictionary item.
 */
 QDS_SpinBoxDbl::QDS_SpinBoxDbl( const QString& id, QWidget* parent, const int flags, const QString& comp )
 : QDS_Datum( id, parent, flags, comp )
@@ -40,7 +50,7 @@ QDS_SpinBoxDbl::~QDS_SpinBoxDbl()
 }
 
 /*!
-  Returns string from QSpinBox widget.
+  Returns string from QSpinBox widget. Reimplemented.
 */
 QString QDS_SpinBoxDbl::getString() const
 {
@@ -66,7 +76,7 @@ QString QDS_SpinBoxDbl::getString() const
 }
 
 /*!
-  Sets the string into QSpinBox widget.
+  Sets the string into QSpinBox widget. Reimplemented.
 */
 void QDS_SpinBoxDbl::setString( const QString& txt )
 {
@@ -87,7 +97,7 @@ QtxDblSpinBox* QDS_SpinBoxDbl::spinBox() const
 }
 
 /*!
-  Create QSpinBox widget as control subwidget.
+  Create QSpinBox widget as control subwidget. Reimplemented.
 */
 QWidget* QDS_SpinBoxDbl::createControl( QWidget* parent )
 {
@@ -98,7 +108,7 @@ QWidget* QDS_SpinBoxDbl::createControl( QWidget* parent )
 }
 
 /*!
-  Notify about text changing in spin box.
+  Notify about value changing in spin box.
 */
 void QDS_SpinBoxDbl::onValueChanged( double )
 {
@@ -129,6 +139,10 @@ void QDS_SpinBoxDbl::setStep( const double step )
     spinBox()->setLineStep( step );
 }
 
+/*!
+  Notification about active unit system changing. Reimplemented from QDS_Datum.
+  Update validator and spin box parameters: suffix, prefix, minimum, maximum.
+*/
 void QDS_SpinBoxDbl::unitSystemChanged( const QString& system )
 {
   QDS_Datum::unitSystemChanged( system );
diff --git a/src/QDS/QDS_Table.cxx b/src/QDS/QDS_Table.cxx
new file mode 100644 (file)
index 0000000..b14e80c
--- /dev/null
@@ -0,0 +1,348 @@
+// Copyright (C) 2005  CEA/DEN, EDF R&D, OPEN CASCADE, PRINCIPIA R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QDS_Table.h"
+
+#include "QDS_LineEdit.h"
+
+class QDS_Table::DeleteFilter : public QObject
+{
+public:
+  DeleteFilter( QObject* = 0 );
+  virtual ~DeleteFilter();
+
+  virtual bool eventFilter( QObject*, QEvent* );
+};
+
+QDS_Table::DeleteFilter::DeleteFilter( QObject* parent )
+: QObject( parent )
+{
+}
+
+QDS_Table::DeleteFilter::~DeleteFilter()
+{
+}
+
+bool QDS_Table::DeleteFilter::eventFilter( QObject* o, QEvent* e )
+{
+  if ( e->type() == QEvent::DeferredDelete )
+    return true;
+  else
+    return false;
+}
+
+QDS_Table::QDS_Table( QWidget* parent, const char* name )
+: QtxTable( parent, name ),
+myHorEdit( 0 ),
+myVerEdit( 0 ),
+myTableEdit( 0 ),
+myKeepEdits( false )
+{
+}
+
+QDS_Table::QDS_Table( int r, int c, QWidget* parent, const char* name )
+: QtxTable( r, c, parent, name ),
+myHorEdit( 0 ),
+myVerEdit( 0 ),
+myTableEdit( 0 ),
+myKeepEdits( false )
+{
+  myRowEdit.resize( r );
+  myColEdit.resize( c );
+}
+
+QDS_Table::~QDS_Table()
+{
+}
+
+QDS_Datum* QDS_Table::horizontalHeaderEditor() const
+{
+  return myHorEdit;
+}
+
+QDS_Datum* QDS_Table::verticalHeaderEditor() const
+{
+  return myVerEdit;
+}
+
+QDS_Datum* QDS_Table::headerEditor( const Orientation o ) const
+{
+  return o == Horizontal ? myHorEdit : myVerEdit;
+}
+
+void QDS_Table::setVerticalHeaderEditor( QDS_Datum* dat )
+{
+  setHeaderEditor( Vertical, dat );
+}
+
+void QDS_Table::setHorizontalHeaderEditor( QDS_Datum* dat )
+{
+  setHeaderEditor( Horizontal, dat );
+}
+
+void QDS_Table::setHeaderEditor( QDS_Datum* dat )
+{
+  setHeaderEditor( Vertical, dat );
+  setHeaderEditor( Horizontal, dat );
+}
+
+void QDS_Table::setHeaderEditor( const Orientation o, QDS_Datum* dat )
+{
+  if ( headerEditor( o ) == dat )
+    return;
+
+  if ( isHeaderEditing() )
+    endEditHeader();
+
+  if ( o == Horizontal )
+    myHorEdit = dat;
+  else
+    myVerEdit = dat;
+
+  initEditor( dat );
+}
+
+QDS_Datum* QDS_Table::tableEditor() const
+{
+  return myTableEdit;
+}
+
+QDS_Datum* QDS_Table::rowEditor( const int row ) const
+{
+  if ( row < 0 || row >= (int)myRowEdit.size() )
+    return 0;
+
+  return myRowEdit.at( row );
+}
+
+QDS_Datum* QDS_Table::columnEditor( const int col ) const
+{
+  if ( col < 0 || col >= (int)myColEdit.size() )
+    return 0;
+
+  return myColEdit.at( col );
+}
+
+QDS_Datum* QDS_Table::cellEditor( const int row, const int col ) const
+{
+  if ( !myCellEdit.contains( row ) )
+    return 0;
+
+  const DatumMap& map = myCellEdit[row];
+  return map.contains( col ) ? map[col] : 0;
+}
+
+void QDS_Table::setTableEditor( QDS_Datum* dat )
+{
+  if ( tableEditor() == dat )
+    return;
+
+  if ( isEditing() && !cellEditor( currEditRow(), currEditCol() ) &&
+       !columnEditor( currEditCol() ) && !rowEditor( currEditRow() ) )
+    endEdit( currEditRow(), currEditCol(), false, false );
+
+  myTableEdit = dat;
+  initEditor( dat );
+}
+
+void QDS_Table::setRowEditor( const int row, QDS_Datum* dat )
+{
+  if ( row < 0 || row >= (int)myRowEdit.size() || rowEditor( row ) == dat )
+    return;
+
+  if ( isEditing() && row == currEditRow()&&
+       !cellEditor( currEditRow(), currEditCol() ) )
+    endEdit( currEditRow(), currEditCol(), false, false );
+
+  myRowEdit.insert( row, dat );
+  initEditor( dat );
+}
+
+void QDS_Table::setColumnEditor( const int col, QDS_Datum* dat )
+{
+  if ( col < 0 || col >= (int)myColEdit.size() || columnEditor( col ) == dat )
+    return;
+
+  if ( isEditing() && col == currEditCol()&&
+       !cellEditor( currEditRow(), currEditCol() ) )
+    endEdit( currEditRow(), currEditCol(), false, false );
+
+  myColEdit.insert( col, dat );
+  initEditor( dat );
+}
+
+void QDS_Table::setCellEditor( const int row, const int col, QDS_Datum* dat )
+{
+  if ( row < 0 || row >= numRows() || col < 0 || col >= numCols() || cellEditor( row, col ) == dat )
+    return;
+
+  if ( isEditing() && currEditRow() == row && currEditCol() == col && actualCellEditor( row, col ) != dat )
+    endEdit( currEditRow(), currEditCol(), false, false );
+
+  if ( !myCellEdit.contains( row ) )
+    myCellEdit.insert( row, DatumMap() );
+
+  myCellEdit[row].insert( col, dat );
+  initEditor( dat );
+}
+
+QDS_Datum* QDS_Table::actualCellEditor( const int row, const int col ) const
+{
+  QDS_Datum* dat = cellEditor( row, col );
+  if ( !dat )
+    dat = columnEditor( col );
+  if ( !dat )
+    dat = rowEditor( row );
+  if ( !dat )
+    dat = tableEditor();
+  return dat;
+}
+
+void QDS_Table::setNumRows( int r )
+{
+  int old = numRows();
+  QtxTable::setNumRows( r );
+
+  if ( isKeepEditors() )
+    myRowEdit.resize( QMAX( (int)myRowEdit.size(), r ) );
+  else
+  {
+    myRowEdit.resize( r );
+    for ( int i = r + 1; i <= old; i++ )
+      myCellEdit.remove( i );
+  }
+}
+
+void QDS_Table::setNumCols( int c )
+{
+  int old = numCols();
+  QtxTable::setNumCols( c );
+
+  if ( isKeepEditors() )
+    myColEdit.resize( QMAX( (int)myColEdit.size(), c ) );
+  else
+  {
+    myColEdit.resize( c );
+    for ( CellMap::Iterator it = myCellEdit.begin(); it != myCellEdit.end(); ++it )
+    {
+      DatumMap& map = it.data();
+      for ( int i = c + 1; i <= old; i++ )
+        map.remove( i );
+    }
+  }
+}
+
+void QDS_Table::clearCellWidget( int row, int col )
+{
+  QDS_Datum* dat = actualCellEditor( row, col );
+  if ( dat )
+    dat->hide();
+
+  QtxTable::clearCellWidget( row, col );
+}
+
+bool QDS_Table::isKeepEditors() const
+{
+  return myKeepEdits;
+}
+
+void QDS_Table::setKeepEditors( const bool on )
+{
+  myKeepEdits = on;
+}
+
+QWidget* QDS_Table::createHeaderEditor( QHeader* header, const int sect, const bool init )
+{
+  if ( !header )
+    return 0;
+
+  QDS_Datum* dat = headerEditor( header->orientation() );
+  QWidget* wid = dat ? dat->widget( QDS::Control ) : 0;
+  if ( wid )
+  {
+    if ( init )
+      dat->setStringValue( header->label( sect ) );
+    else
+      dat->clear();
+    dat->setProperty( "Selection", true );
+  }
+  else
+    wid = QtxTable::createHeaderEditor( header, sect, init );
+
+  return wid;
+}
+
+QWidget* QDS_Table::createEditor( int row, int col, bool init ) const
+{
+  QDS_Datum* dat = actualCellEditor( row, col );
+  QWidget* wid = dat ? dat->widget( QDS::Control ) : 0;
+  if ( wid )
+  {
+    if ( init )
+      dat->setStringValue( text( row, col ) );
+    else
+      dat->clear();
+    dat->setProperty( "Selection", true );
+  }
+  else
+    wid = QtxTable::createEditor( row, col, init );
+
+  return wid;
+}
+
+void QDS_Table::endEdit( int row, int col, bool accept, bool )
+{
+  QtxTable::endEdit( row, col, accept, true );
+}
+
+void QDS_Table::setCellContentFromEditor( int row, int col )
+{
+  QDS_Datum* dat = actualCellEditor( row, col );
+  if ( dat )
+    setText( row, col, dat->stringValue() );
+  else
+    QtxTable::setCellContentFromEditor( row, col );
+}
+
+void QDS_Table::setHeaderContentFromEditor( QHeader* header, const int sect, QWidget* editor )
+{
+  if ( !header )
+    return;
+
+  QDS_Datum* dat = headerEditor( header->orientation() );
+  if ( dat )
+    header->setLabel( sect, dat->stringValue() );
+  else
+    QtxTable::setHeaderContentFromEditor( header, sect, editor );
+}
+
+void QDS_Table::initEditor( QDS_Datum* dat )
+{
+  if ( !dat )
+    return;
+
+  dat->hide();
+
+  static QGuardedPtr<DeleteFilter> _filter = 0;
+  if ( !_filter )
+    _filter = new DeleteFilter( 0 );
+
+  if ( dat->widget( QDS::Control ) )
+    dat->widget( QDS::Control )->installEventFilter( _filter );
+}
diff --git a/src/QDS/QDS_Table.h b/src/QDS/QDS_Table.h
new file mode 100644 (file)
index 0000000..c7d33ab
--- /dev/null
@@ -0,0 +1,99 @@
+// Copyright (C) 2005  CEA/DEN, EDF R&D, OPEN CASCADE, PRINCIPIA R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifndef QDS_TABLE_H
+#define QDS_TABLE_H
+
+#include "QDS_Datum.h"
+
+#include <QtxTable.h>
+
+#include <qmap.h>
+#include <qptrvector.h>
+
+class QDS_EXPORT QDS_Table : public QtxTable
+{
+  class DeleteFilter;
+
+  Q_OBJECT
+
+  Q_PROPERTY( bool KeepEditors READ isKeepEditors WRITE setKeepEditors )
+
+public:
+  QDS_Table( QWidget* = 0, const char* = 0 );
+  QDS_Table( int, int, QWidget* = 0, const char* = 0 );
+  virtual ~QDS_Table();
+
+  QDS_Datum*       verticalHeaderEditor() const;
+  QDS_Datum*       horizontalHeaderEditor() const;
+  QDS_Datum*       headerEditor( const Orientation ) const;
+
+  void             setVerticalHeaderEditor( QDS_Datum* );
+  void             setHorizontalHeaderEditor( QDS_Datum* );
+
+  void             setHeaderEditor( QDS_Datum* );
+  virtual void     setHeaderEditor( const Orientation, QDS_Datum* );
+
+  QDS_Datum*       tableEditor() const;
+  virtual void     setTableEditor( QDS_Datum* );
+
+  QDS_Datum*       rowEditor( const int ) const;
+  QDS_Datum*       columnEditor( const int ) const;
+
+  virtual void     setRowEditor( const int, QDS_Datum* );
+  virtual void     setColumnEditor( const int, QDS_Datum* );
+
+  QDS_Datum*       cellEditor( const int, const int ) const;
+  virtual void     setCellEditor( const int, const int, QDS_Datum* );
+
+  QDS_Datum*       actualCellEditor( const int, const int ) const;
+
+  virtual void     setNumRows( int );
+  virtual void     setNumCols( int );
+  virtual void     clearCellWidget( int, int );
+
+  bool             isKeepEditors() const;
+  void             setKeepEditors( const bool );
+
+protected:
+  virtual QWidget* createHeaderEditor( QHeader*, const int, const bool = true );
+  virtual QWidget* createEditor( int, int, bool ) const;
+  virtual void     endEdit( int, int, bool, bool );
+  virtual void     setCellContentFromEditor( int, int );
+  virtual void     setHeaderContentFromEditor( QHeader*, const int, QWidget* );
+
+private:
+  void             initEditor( QDS_Datum* );
+  QDS_Datum*       datum( const QWidget* ) const;
+
+private:
+  typedef QPtrVector<QDS_Datum>       DatumVector;
+  typedef QMap<int, QDS_Datum*>       DatumMap;
+  typedef QMap<int, DatumMap>         CellMap;
+
+private:
+  QDS_Datum*       myHorEdit;
+  QDS_Datum*       myVerEdit;
+  DatumVector      myRowEdit;
+  DatumVector      myColEdit;
+  CellMap          myCellEdit;
+  QDS_Datum*       myTableEdit;
+  bool             myKeepEdits;
+};
+
+#endif 
index 17de76418528cd4bf3cc45a42292a6453eb156c0..1eb66dad9bf626390494f1b9362cb3bbd0fdaeda 100644 (file)
 
 #include <qtextedit.h>
 
+/*
+  \class QDS_TextEdit
+
+  Datum with control corresponding to text edit. User can enter parameter value in multiple line editor.
+*/
+
 /*!
-  Constructor.
+  Constructor. Create text edit datum object with datum identifier \aid under widget \aparent.
+  Parameter \aflags define behaviour of datum and set of created subwidgets. Default value of this
+  parameter is QDS::All. Parameter \acomp specify the component name which will be used during search
+  of dictionary item.
 */
 QDS_TextEdit::QDS_TextEdit( const QString& id, QWidget* parent, const int flags, const QString& comp )
 : QDS_Datum( id, parent, flags, comp )
@@ -36,7 +45,7 @@ QDS_TextEdit::~QDS_TextEdit()
 }
 
 /*!
-  Returns string from QTextEdit widget.
+  Returns string from QTextEdit widget. Reimplemented from QDS_Datum.
 */
 QString QDS_TextEdit::getString() const
 {
@@ -47,7 +56,7 @@ QString QDS_TextEdit::getString() const
 }
 
 /*!
-  Sets the string into QTextEdit widget.
+  Sets the string into QTextEdit widget. Reimplemented from QDS_Datum.
 */
 void QDS_TextEdit::setString( const QString& txt )
 {
@@ -74,7 +83,7 @@ QWidget* QDS_TextEdit::createControl( QWidget* parent )
 }
 
 /*!
-  Notify about text changing in line edit.
+  Notify about text changing in text edit.
 */
 void QDS_TextEdit::onTextChanged()
 {
index 02916c0cb090e027c536a04aad14c70156098743..37b2ea658d1c506bc27308a710b227838323ab98 100644 (file)
 #include "QDS_Validator.h"
 
 /*!
-    Class: QDS_IntegerValidator
+  \class QDS_IntegerValidator
+
+  This class to provide validation of user inputted string for datum with 'Integer'
+  value type according to datum properties: minimum value, maximum value, filter.
+
+  Inherits from QIntValidator.
 */
 
+/*!
+  Constructor. Create empty validator object.
+*/
 QDS_IntegerValidator::QDS_IntegerValidator( QObject* p )
 : QIntValidator( p )
 {
 }
 
+/*!
+  Constructor. Create validator object with filter string \af.
+*/
 QDS_IntegerValidator::QDS_IntegerValidator( const QString& f, QObject* p )
 : QIntValidator( p ),
 myFilter( f )
 {
 }
 
+/*!
+  Destructor.
+*/
 QDS_IntegerValidator::~QDS_IntegerValidator()
 {
 }
 
+/*!
+  Validate the inputed string \ainput. Reimplemented from QIntValidator. Perform
+  standard check by QIntValidator::validate(). If returned state is not Invalid and
+  filter specified then perform validation with filter by QRegExpValidator.
+
+  Returns Invalid if input is invalid according to this validator's rules,
+  Intermediate if it is likely that a little more editing will make the input acceptable
+  and Acceptable if the input is valid.
+*/
 QValidator::State QDS_IntegerValidator::validate( QString& input, int& pos ) const
 {
   State rgState = Acceptable;
@@ -50,24 +73,47 @@ QValidator::State QDS_IntegerValidator::validate( QString& input, int& pos ) con
 }
 
 /*!
-    Class: QDS_DoubleValidator
+  \class QDS_DoubleValidator
+
+  This class to provide validation of user inputted string for datum with 'Float'
+  value type according to datum properties: minimum value, maximum value, precision, filter.
+
+  Inherits from QDoubleValidator.
 */
 
+/*!
+  Constructor. Create empty validator object.
+*/
 QDS_DoubleValidator::QDS_DoubleValidator( QObject* p )
 : QDoubleValidator( p )
 {
 }
 
+/*!
+  Constructor. Create validator object with filter string \af.
+*/
 QDS_DoubleValidator::QDS_DoubleValidator( const QString& f, QObject* p )
 : QDoubleValidator( p ),
 myFilter( f )
 {
 }
 
+/*!
+  Destructor.
+*/
 QDS_DoubleValidator::~QDS_DoubleValidator()
 {
 }
 
+/*!
+  Validate the inputed string \ainput. Reimplemented from QDoubleValidator. Perform
+  standard check by QDoubleValidator::validate(). If returned state is not Invalid and
+  filter specified then perform validation with filter by QRegExpValidator.
+
+  Returns Invalid if input is invalid according to this validator's rules,
+  Intermediate if it is likely that a little more editing will make the input acceptable
+  and Acceptable if the input is valid.
+*/
 QValidator::State QDS_DoubleValidator::validate( QString& input, int& pos ) const
 {
   State rgState = Acceptable;
@@ -81,15 +127,26 @@ QValidator::State QDS_DoubleValidator::validate( QString& input, int& pos ) cons
 }
 
 /*!
-    Class: QDS_StringValidator
+  \class QDS_StringValidator
+
+  This class to provide validation of user inputted string for datum with 'String'
+  value type according to datum properties: format, filter.
+
+  Inherits from QDoubleValidator.
 */
 
+/*!
+  Constructor. Create empty validator object.
+*/
 QDS_StringValidator::QDS_StringValidator( QObject* p ) 
 : QValidator( p ), 
 myLen( -1 ) 
 {
 }
 
+/*!
+  Constructor. Create validator object with filter string \af.
+*/
 QDS_StringValidator::QDS_StringValidator( const QString& f, QObject* p ) 
 : QValidator( p ), 
 myFlags( f ), 
@@ -97,6 +154,9 @@ myLen( -1 )
 {
 }
 
+/*!
+  Constructor. Create validator object with filter string \aft and format flags \afg.
+*/
 QDS_StringValidator::QDS_StringValidator( const QString& ft, const QString& fg, QObject* p ) 
 : QValidator( p ), 
 myLen( -1 ), 
@@ -105,20 +165,40 @@ myFlags( fg )
 {
 }
 
+/*!
+  Destructor.
+*/
 QDS_StringValidator::~QDS_StringValidator() 
 {
 }
 
+/*!
+  Returns valid string length. If length not specified -1 returned.
+*/
 int QDS_StringValidator::length() const 
 { 
   return myLen; 
 }
 
-void QDS_StringValidator::setLength( const int l ) 
-{ 
-  myLen = l; 
+/*!
+  Sets the valid string length \al. If value less than zero valid string
+  length not specified.
+*/
+void QDS_StringValidator::setLength( const int l )
+{
+  myLen = l;
 }
 
+/*!
+  Validate the inputed string \ainput. Reimplemented from QValidator. Convert specified
+  string to upper/lower case if the format flags contains specificator 'u'/'l'.
+  If valid string lenght is specified then check given string length. If
+  filter specified then perform validation with filter by QRegExpValidator.
+
+  Returns Invalid if input is invalid according to this validator's rules,
+  Intermediate if it is likely that a little more editing will make the input acceptable
+  and Acceptable if the input is valid.
+*/
 QValidator::State QDS_StringValidator::validate( QString& input, int& pos ) const
 {
   if ( input.isEmpty() )
index 537d511a27945a30706ce07cf6ece694d33ad7dc..e7fed65aa7dced6d637ecf2fea1600082bc2be17 100644 (file)
@@ -24,9 +24,8 @@
 #include <qvalidator.h>
 
 /*!
-    Class: QDS_IntegerValidator
+  class QDS_IntegerValidator
 */
-
 class QDS_EXPORT QDS_IntegerValidator : public QIntValidator
 {
 public:
@@ -41,9 +40,8 @@ private:
 };
 
 /*!
-    Class: QDS_DoubleValidator
+  class QDS_DoubleValidator
 */
-
 class QDS_DoubleValidator : public QDoubleValidator
 {
 public:
@@ -58,13 +56,11 @@ private:
 };
 
 /*!
-    Class: QDS_StringValidator
+  class QDS_StringValidator
 */
-
 class QDS_EXPORT QDS_StringValidator : public QValidator
 {
 public:
-
   QDS_StringValidator( QObject* p = 0 );
   QDS_StringValidator( const QString& f, QObject* p = 0 );
   QDS_StringValidator( const QString& ft, const QString& fg, QObject* p = 0 );
index 14704e5502097eb77e05c30fb77e831c9f1ee608..6e2a31648aecf3e0ef337076bc916b49181ebb29 100755 (executable)
 #include "Qtx.h"
 
 #include <qdir.h>
+#include <qbitmap.h>
 #include <qstring.h>
 #include <qwidget.h>
 #include <qlayout.h>
+#include <qpainter.h>
 #include <qtoolbar.h>
 #include <qgroupbox.h>
 #include <qfileinfo.h>
@@ -556,3 +558,144 @@ void Qtx::scaleColors( const int num, QValueList<QColor>& lst )
   for ( int i = 0; i < num; i++ )
     lst.append( scaleColor( i, 0, num - 1 ) );
 }
+
+/*!
+       Name: grayscale [static public]
+       Desc: Convert color image to grayscale image.
+*/
+QImage Qtx::grayscale( const QImage& img )
+{
+  QImage res = img;
+
+  int colNum = res.numColors();
+  if ( colNum )
+  {
+    for ( int i = 0; i < colNum; i++ )
+      res.setColor( i, qGray( res.color( i ) ) );
+  }
+  else
+  {
+    for ( int y = 0; y < res.height(); y++ )
+    {
+      for ( int x = 0; x < res.width(); x++ )
+      {
+        QRgb pix = res.pixel( x, y );
+        res.setPixel( x, y, qRgba( qGray( pix ), qGray( pix ), qGray( pix ), qAlpha( pix ) ) );
+      }
+    }
+  }
+
+  return res;
+}
+
+/*!
+       Name: grayscale [static public]
+       Desc: Convert color pixmap to grayscale pixmap.
+*/
+QPixmap Qtx::grayscale( const QPixmap& pix )
+{
+  QPixmap res;
+  res.convertFromImage( grayscale( pix.convertToImage() ) );
+  return res;
+}
+
+/*!
+       Name: transparentImage [static public]
+       Desc: Create transparent image with specified width \aw, height \ah and color depth \ad.
+*/
+QImage Qtx::transparentImage( const int w, const int h, const int d )
+{
+  QImage img;
+  if ( img.create( w, h, d < 0 ? QPixmap::defaultDepth() : d ) )
+  {
+    img.setAlphaBuffer( true );
+    for ( int i = 0; i < img.height(); i++ )
+      for ( int j = 0; j < img.width(); j++ )
+        img.setPixel( j, i, qRgba( 0, 0, 0, 0 ) );
+  }
+  return img;
+}
+
+/*!
+       Name: transparentPixmap [static public]
+       Desc: Create transparent pixmap with specified width \aw, height \ah and color depth \ad.
+*/
+QPixmap Qtx::transparentPixmap( const int w, const int h, const int d )
+{
+  QPixmap pix;
+  QImage img = transparentImage( w, h, d );
+  if ( !img.isNull() )
+    pix.convertFromImage( img );
+  return pix;
+}
+
+/*!
+       Name: composite [static public]
+       Desc: Create composite pixmap. Pixmap 'pix' draws over pixmap 'dest' with coordinates
+        specified relative upper left corner of 'dest'. If 'dest' not given then new empty
+        pixmap with appropriate size created.
+*/
+QPixmap Qtx::composite( const QPixmap& pix, const int x, const int y, const QPixmap& dest )
+{
+  if ( pix.isNull() )
+    return dest;
+
+  int width = QMAX( pix.width() + x, dest.width() );
+  int height = QMAX( pix.height() + y, dest.height() );
+
+  QPixmap res( width, height );
+  QImage img = transparentImage( width, height, 32 );
+
+  QPainter p;
+  p.begin( &res );
+  p.fillRect( 0, 0, width, height, QBrush( white ) );
+
+  if ( !dest.isNull() )
+  {
+    p.drawPixmap( 0, 0, dest );
+    QImage temp = dest.convertToImage();
+    for ( int i = 0; i < temp.width() && i < img.width(); i++ )
+    {
+      for ( int j = 0; j < temp.height() && j < img.height(); j++ )
+      {
+        if ( temp.hasAlphaBuffer() )
+          img.setPixel( i, j, temp.pixel( i, j ) );
+        else
+        {
+          QRgb p = temp.pixel( i, j );
+          img.setPixel( i, j, qRgba( qRed( p ), qGreen( p ), qBlue( p ), 255 ) );
+        }
+      }
+    }
+  }
+
+  p.drawPixmap( x, y, pix );
+  QImage temp = pix.convertToImage();
+  for ( int c = x; c < temp.width() + x && c < img.width(); c++ )
+  {
+    for ( int r = y; r < temp.height() + y && r < img.height(); r++ )
+    {
+      if ( qAlpha( temp.pixel( c - x, r - y ) ) > 0 )
+        img.setPixel( c, r, temp.pixel( c - x, r - y ) );
+    }
+  }
+
+  p.end();
+
+  for ( int ai = 0; ai < img.width(); ai++ )
+  {
+    for ( int aj = 0; aj < img.height(); aj++ )
+    {
+      if ( qAlpha( img.pixel( ai, aj ) ) < 1 )
+        img.setPixel( ai, aj, qRgba( 255, 255, 255, 255 ) );
+      else
+        img.setPixel( ai, aj, qRgba( 0, 0, 0, 0 ) );
+    }
+  }
+
+  QBitmap bmp( width, height );
+  bmp.convertFromImage( img, Qt::ColorMode_Mask | Qt::ThresholdDither );
+  res.setMask( bmp );
+
+  return res;
+}
index 1fef63f044153889677bc3124dc895f466728600..0d5cb3a40e7a1b60e1fd1a3e3c7899551f29d897 100755 (executable)
@@ -68,6 +68,9 @@
 #endif
 #endif
 
+#include <qimage.h>
+#include <qpixmap.h>
+
 class QObject;
 class QString;
 class QWidget;
@@ -131,6 +134,12 @@ public:
 
   static QColor  scaleColor( const int, const int, const int );
   static void    scaleColors( const int, QValueList<QColor>& );
+
+  static QImage  grayscale( const QImage& );
+  static QPixmap grayscale( const QPixmap& );
+  static QImage  transparentImage( const int, const int, const int = -1 );
+  static QPixmap transparentPixmap( const int, const int, const int = -1 );
+  static QPixmap composite( const QPixmap&, const int, const int, const QPixmap& = QPixmap() );
 };
 
 #endif
index e2a3ad8786c60ead56d9c3d6174a1e7f607cfff2..dbae4819fd35b499bcd742742272fd2076f51307 100755 (executable)
@@ -112,7 +112,7 @@ bool QtxAction::addTo( QWidget* w )
                  successfully and false otherwise.
 */
 
-bool QtxAction::addTo( QWidget* w, int index )
+bool QtxAction::addTo( QWidget* w, const int index )
 {
   if ( !addTo( w ) )
     return false;
@@ -238,14 +238,17 @@ void QtxAction::setPopup( QWidget* w, const int id, QPopupMenu* subPopup ) const
   if ( !w )
     return;
 
-  if ( !w->inherits( "QPopupMenu" ) && !w->inherits( "QMenuBar" ) )
-    return;  // unsupported widget type
+  QMenuData* pmd = 0;
+
+  if ( w->inherits( "QPopupMenu" ) )
+    pmd = ::qt_cast<QPopupMenu*>( w );
+  else if ( w->inherits( "QMenuBar" ) )
+    pmd = ::qt_cast<QMenuBar*>( w );
 
-  QMenuData* md = 0;
-  QMenuData* pmd = dynamic_cast<QMenuData*>( w );
   if ( !pmd )
     return;  // bad widget
-  
+
+  QMenuData* md = 0;
   QMenuItem* item = pmd->findItem( id, &md );
   if ( !item || md != pmd )
     return;  // item is not found
index 2b17df6d8a85fcd5744da4011eb1621b8f1c1364..af0473f3ff2c89c9968946bbe024106af3118f18 100755 (executable)
 #include <qaction.h>
 #include <qmap.h>
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 class QTX_EXPORT QtxAction : public QAction
 {
     Q_OBJECT
@@ -38,7 +42,7 @@ public:
     virtual ~QtxAction();
 
     virtual bool addTo( QWidget* );
-    virtual bool addTo( QWidget*, int );
+    virtual bool addTo( QWidget*, const int );
     virtual bool removeFrom( QWidget* );
 
 protected:
@@ -48,4 +52,8 @@ private:
     QMap<QWidget*,int> myMenuIds;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index b87289a33300a8e75e9846ca95171b30555d4990..94f7050a0e2ef678e7bd1175f3ce84d659f52737 100644 (file)
@@ -48,12 +48,12 @@ namespace {
     QValueList<int> l;
     const QMenuData* md = 0;
     if ( w->inherits( "QMenuBar" ) )
-      md = dynamic_cast<const QMenuData*>( w );
+      md = ::qt_cast<QMenuBar*>( w );
     else if ( w->inherits( "QPopupMenu" ) )
-      md = dynamic_cast<const QMenuData*>( w );
+      md = ::qt_cast<QPopupMenu*>( w );
     if ( md ) {
-      for ( int i=0; i < md->count(); i++ )
-       l.append( md->idAt( i ) );
+      for ( uint i = 0; i < md->count(); i++ )
+             l.append( md->idAt( i ) );
     }
     return l;
   }
@@ -62,25 +62,38 @@ namespace {
   {
     const QMenuData* md = 0;
     if ( w->inherits( "QMenuBar" ) )
-      md = dynamic_cast<const QMenuData*>( w );
+      md = ::qt_cast<QMenuBar*>( w );
     else if ( w->inherits( "QPopupMenu" ) )
-      md = dynamic_cast<const QMenuData*>( w );
-    if ( md ) {
-      for ( int i=0, j=0; i < md->count() && j < l.count(); i++, j++ )
-       if ( md->idAt( i ) != l[ j ] ) return retId ? md->idAt( i ) : i;
-      if ( md->count() > l.count() ) return retId ? md->idAt( md->count()-1 ) : md->count()-1;
+      md = ::qt_cast<QPopupMenu*>( w );
+    if ( md )
+    {
+      for ( uint i = 0, j = 0; i < md->count() && j < l.count(); i++, j++ )
+             if ( md->idAt( i ) != l[ j ] )
+          return retId ? md->idAt( i ) : i;
+      if ( md->count() > l.count() )
+        return retId ? md->idAt( md->count()-1 ) : md->count() - 1;
     }
     return -1;
   }
 
   void dumpMenu( QWidget* w, bool before )
   {
-    QMenuData* md = dynamic_cast<QMenuData*>( w );
-    if ( !w ) return;
-    printf(">>> start dump menu (%s) >>>\n", before ? "before" : "after" );
-    for( int i = 0; i < md->count(); i++ )
-      printf("%d: %d: %s\n",i,md->idAt(i),md->text(md->idAt(i)).latin1() );
-    printf("<<< end dump menu (%s) <<<\n", before ? "before" : "after" );
+    if ( !w )
+      return;
+
+    QMenuData* md = 0;
+    if ( w->inherits( "QMenuBar" ) )
+      md = ::qt_cast<QMenuBar*>( w );
+    else if ( w->inherits( "QPopupMenu" ) )
+      md = ::qt_cast<QPopupMenu*>( w );
+
+    if ( !md )
+      return;
+
+    printf( ">>> start dump menu (%s) >>>\n", before ? "before" : "after" );
+    for ( uint i = 0; i < md->count(); i++ )
+      printf( "%d: %d: %s\n", i, md->idAt( i ), md->text( md->idAt( i ) ).latin1() );
+    printf( "<<< end dump menu (%s) <<<\n", before ? "before" : "after" );
   }
 };
 
@@ -914,7 +927,7 @@ void QtxActionMenuMgr::updateMenu( MenuNode* startNode, const bool rec, const bo
   {
     NodeList& lst = idMap[it2.current()->group];
     int idx = it2.current()->idx;
-    if ( idx < 0 || idx >= lst.count() )
+    if ( idx < 0 || idx >= (int)lst.count() )
       lst.append( it2.current() );
     else
       lst.insert( idx, it2.current() );
index 8984bb28ffdc7b43d2683f6ed47a10872f7e2270..a5b389fd1e2bb156ceae1405587d7aefeda792a0 100644 (file)
 #ifndef QTX_DOUBLE_VALIDATOR
 #define QTX_DOUBLE_VALIDATOR
 
+#include "Qtx.h"
+
 #include <qvalidator.h>
 
-class QtxDblValidator : public QDoubleValidator
+class QTX_EXPORT QtxDblValidator : public QDoubleValidator
 {
   Q_OBJECT
 
index 2554511a4675b36b29e336fbaf9da052f0fcf5fc..c52cb85fe5c4fce9f1aee386ca3c129c2ae86766 100755 (executable)
@@ -416,12 +416,13 @@ QSize QtxDialog::Border::minimumSizeHint() const
 QtxDialog::QtxDialog( QWidget* parent, const char* name,
                                          bool modal, bool allowResize, const int f, WFlags wf )
 : QDialog( parent, name, modal,
-#ifdef WIN32
            wf | WStyle_Customize | WStyle_Title | WStyle_SysMenu |
-           ( allowResize ? WStyle_NormalBorder : WStyle_NoBorderEx ) ),
+#ifdef WIN32
+           ( allowResize ? WStyle_NormalBorder : WStyle_NoBorderEx ) |
 #else
-           wf | WStyle_NormalBorder | WStyle_Customize | WStyle_Title | WStyle_SysMenu ),
+           WStyle_NormalBorder |
 #endif
+           ( allowResize ? WStyle_Maximize : 0 ) ),
 mySender( 0 ),
 myAlignment( 0 ),
 myInited( false ),
index 1a9f5d07dd84e3fd540ae15cc860f9617a13bf6c..da6f5cc55ad210853e1a3b850743888a92871349 100644 (file)
@@ -285,7 +285,16 @@ QtxDockWindow::~QtxDockWindow()
 void QtxDockWindow::setWidget( QWidget* wid )
 {
   if ( wid )
-    wid->reparent( this, QPoint( 0, 0 ), wid->isVisibleTo( wid->parentWidget() ) );
+  {
+    if ( wid->parentWidget() != this )
+      wid->reparent( this, QPoint( 0, 0 ), wid->isVisibleTo( wid->parentWidget() ) );
+    if ( myWatcher )
+    {
+      setCaption( wid->caption() );
+      if ( wid->icon() )
+        setIcon( *wid->icon() );
+    }
+  }
 
   QDockWindow::setWidget( wid );
 }
index e3c4a848445a370fa73ffc9d8f22d3035a6d1b5a..52f09303943cb6377d2a74e29a5f803634b1f108 100755 (executable)
@@ -144,8 +144,11 @@ myRaise( false )
 
 QtxListAction::~QtxListAction()
 {
-  if ( myFrame )
+  if ( myFrame ) {
     myFrame->myAction = 0;
+    delete myFrame;
+    myFrame = 0;
+  }
 }
 
 /*!
index fb61b48c2b4080f322304e06ec6f662b3b50cb1b..2a7678df4d49b2e0053f5277c3b5b7d55f2e94cd 100644 (file)
@@ -686,8 +686,8 @@ QtxListResourceEdit::SelectItem::~SelectItem()
 void QtxListResourceEdit::SelectItem::store()
 {
   int idx = myList->currentItem();
-  if ( myIndex.contains( idx ) )
-    setInteger( myIndex[idx] );
+  if ( idx >= 0 )
+    setInteger( myIndex.contains( idx ) ? myIndex[idx] : idx );
 }
 
 /*!
@@ -697,14 +697,15 @@ void QtxListResourceEdit::SelectItem::retrieve()
 {
   int id = getInteger( -1 );
 
-  int idx = -1;
-  for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end() && idx == -1; ++it )
+  for ( QMap<int, int>::ConstIterator it = myIndex.begin(); it != myIndex.end(); ++it )
   {
-    if ( it.data() == id )
-      idx = it.key();
+    if ( it.data() == id ) {
+      myList->setCurrentItem( it.key() );
+      return;
+    }
   }
-
-  myList->setCurrentItem( idx );
+  if ( id >= 0 )
+    myList->setCurrentItem( id );
 }
 
 /*!
@@ -1689,7 +1690,8 @@ void QtxListResourceEdit::FileItem::onOpenFile()
 
   if( myFileDlg->exec()==QDialog::Accepted )
   {
-    myFile->setText( myFileDlg->selectedFile() ); 
+               QString selFile = QDir::convertSeparators( myFileDlg->selectedFile() );
+    myFile->setText( selFile ); 
   }
 }
 
index fc816fe3b7b7e587e7aa3dd9263b1f2cf228d7b0..d6da330ac8fee1ed4745041d392c48a6a6098b17 100644 (file)
@@ -135,7 +135,7 @@ public:
 
   virtual void         update();
 
-  QVariant             property( const QString& ) const;
+  virtual QVariant     property( const QString& ) const;
   virtual void         setProperty( const QString&, const QVariant& );
 
   virtual void         store() = 0;
index f53df0c5583e49edd01a0ce3e5f238b82da4892b..02b3a1c656fb589da663b666a31e1df226875f74 100644 (file)
@@ -858,7 +858,7 @@ QtxResourceMgr::QtxResourceMgr( const QString& appName, const QString& resVarTem
   QString dirs;
   if ( ::getenv( envVar ) )
     dirs = ::getenv( envVar );
-#ifdef WNT
+#ifdef WIN32
   QString dirsep = ";";      // for Windows: ";" is used as directories separator
 #else
   QString dirsep = "[:|;]";  // for Linux: both ":" and ";" can be used
@@ -879,6 +879,11 @@ QtxResourceMgr::~QtxResourceMgr()
   QStringList prefList = myTranslator.keys();
   for ( QStringList::const_iterator it = prefList.begin(); it != prefList.end(); ++it )
     removeTranslators( *it );
+  for ( ResListIterator resIt( myResources ); resIt.current(); ++resIt )
+    delete resIt.current();
+  myResources.clear();
+  for ( FormatListIterator formIt( myFormats ); formIt.current(); ++formIt )
+    delete formIt.current();
 }
 
 /*!
index 0bf57831ca33874d883bdc47be511db4a96f6dc8..ff72dd3c2ba1a3a4dd0763f748566a3bd1e24342 100644 (file)
@@ -175,6 +175,8 @@ private:
   bool            myIsPixmapCached;
 
   bool            myIsIgnoreUserValues;
+
+  friend class QtxResourceMgr::Format;
 };
 
 /*!
@@ -185,7 +187,7 @@ class QTX_EXPORT QtxResourceMgr::Format
 {
 public:
   Format( const QString& );
-  ~Format();
+  virtual ~Format();
 
   QString                format() const;
 
index 63fd6de55cd35ee065ceb4db99c9ade5164ef2df..3cf22f41384375b6e1237c40fd8c6f83745555cd 100644 (file)
@@ -919,7 +919,7 @@ void QtxWorkstack::onDeactivated( QtxWorkstackArea* area )
 */
 void QtxWorkstack::onContextMenuRequested( QWidget* w, QPoint p )
 {
-  QtxWorkstackArea* anArea = dynamic_cast<QtxWorkstackArea*>( (QObject*)sender()  );
+  QtxWorkstackArea* anArea = ::qt_cast<QtxWorkstackArea*>( (QObject*)sender() );
   if ( !anArea )
     anArea = activeArea();
 
@@ -948,6 +948,8 @@ void QtxWorkstack::onContextMenuRequested( QWidget* w, QPoint p )
     myActionsMap[Rename]->addTo( pm );
   }
 
+  Qtx::simplifySeparators( pm );
+
   if ( pm->count() )
     pm->exec( p );
 
@@ -1294,7 +1296,9 @@ void QtxWorkstack::splitterInfo( QSplitter* split, QString& info ) const
 //Cuts starting '(' symbol and ending '(' symbol
 void cutBrackets( QString& parameters )
 {
-  if ( !parameters.isEmpty() && parameters[0] == '(' && parameters[parameters.length()-1] == ')' )
+  QChar c1 = parameters[0];
+  QChar c2 = parameters[int(parameters.length()-1)];
+  if ( !parameters.isEmpty() && c1 == '(' && c2 == ')' )
     parameters = parameters.mid( 1, parameters.length()-2 );
 }
 
@@ -1324,7 +1328,9 @@ bool checkFormat( const QString& parameters )
 {
   QString params( parameters );
   // 1. begins and ends with brackets
-  bool ok = ( params[0] == '(' && params[params.length()-1] == ')' );
+  QChar c1 = params[0];
+  QChar c2 = params[int(params.length()-1)];
+  bool ok = ( c1 == '(' && c2 == ')' );
   if ( !ok ) return ok;
   ::cutBrackets( params );
   // 2. has splitter word
@@ -1358,13 +1364,16 @@ QStringList getChildren( const QString& str )
   int i = 1,
   nOpen = 1, // count brackets: '(' increments nOpen, ')' decrements
   start = 0;
-  while ( i < str.length() ) {
-    if ( str[i] == '(' ) {
+  while ( i < (int)str.length() )
+  {
+    if ( str[i] == '(' )
+    {
       nOpen++;
       if ( nOpen == 1 )
        start = i;
     }
-    else if ( str[i] == ')' ) {
+    else if ( str[i] == ')' )
+    {
       nOpen--;
       if ( nOpen == 0 ) 
        lst.append( str.mid( start, i-start+1 ) );
@@ -1399,7 +1408,7 @@ QWidget* getView( const QWidget* parent, const QString& aName )
   QWidget* view = 0;
   QObjectList *l = parent->topLevelWidget()->queryList( "QWidget", aName, false, true );
   if ( !l->isEmpty() )
-    view = dynamic_cast<QWidget*>( l->first() );
+    view = ::qt_cast<QWidget*>( l->first() );
   delete l;
   return view;
 }
@@ -1420,7 +1429,8 @@ void QtxWorkstack::setSplitter( QSplitter* splitter, const QString& parameters,
   // get splitter sizes and store it in the map for future setting
   QValueList<int> sizes;
   QStringList sizesLst = QStringList::split( ':', ::getValue( params, "sizes" ) );
-  for ( QStringList::Iterator it = sizesLst.begin(); it != sizesLst.end(); ++it )
+  QStringList::Iterator it;
+  for ( it = sizesLst.begin(); it != sizesLst.end(); ++it )
     sizes.append( (*it).toInt() );
   sMap[ splitter ] = sizes;
 
@@ -1495,8 +1505,8 @@ QtxWorkstack& QtxWorkstack::operator<<( const QString& parameters )
   qApp->processEvents();
 
   // restore splitters' sizes (map of sizes is filled in setSplitters)
-  for ( QMap< QSplitter*, QValueList<int> >::Iterator it = sMap.begin(); it != sMap.end(); ++it )
-    it.key()->setSizes( it.data() );
+  for ( QMap< QSplitter*, QValueList<int> >::Iterator itm = sMap.begin(); itm != sMap.end(); ++itm )
+    itm.key()->setSizes( itm.data() );
 
   return (*this);
 }
@@ -2337,16 +2347,16 @@ void QtxWorkstackTabBar::setActive( const bool on )
 {
   QFont aFont = font();
   aFont.setUnderline( on );
-  QColorGroup* aColGrp = new QColorGroup();
+  QColorGroup aColGrp;
   QPalette aPal = palette();
   if ( !on ) {
-    aPal.setColor( QColorGroup::HighlightedText, aColGrp->foreground() );
+    aPal.setColor( QColorGroup::HighlightedText, aColGrp.foreground() );
     aPal.setColor( QColorGroup::Highlight, colorGroup().dark().light( DARK_COLOR_LIGHT ) );
     setPalette( aPal );
   }
   else {
-    aPal.setColor( QColorGroup::HighlightedText, aColGrp->highlightedText() );
-    aPal.setColor( QColorGroup::Highlight, aColGrp->highlight() );
+    aPal.setColor( QColorGroup::HighlightedText, aColGrp.highlightedText() );
+    aPal.setColor( QColorGroup::Highlight, aColGrp.highlight() );
     unsetPalette();
   }
   setFont( aFont );
index 715169279e40fbcb5a499f64ee3c1d053c2f7b14..31f6405decb4e51aa9c5e4a0e6bae1413fb6f46e 100755 (executable)
 //  Module : SALOME
 //  $Header$
 
-# ifndef __HELPWINDOW_H__
-# define __HELPWINDOW_H__
+#ifndef __HELPWINDOW_H__
+#define __HELPWINDOW_H__
 
-# include <qapplication.h>
-# include <qmainwindow.h>
+#include <qapplication.h>
+#include <qmainwindow.h>
 
 class QTextView;
 
 class HelpWindow : public QMainWindow
 {
+  Q_OBJECT
+
 public:
   HelpWindow( QWidget* parent = 0, const char* name = 0);
   ~HelpWindow();
@@ -46,6 +48,5 @@ public:
 private:
   QTextView* myTextView;
 };
-# endif         /* __HELPWINDOW_H__ */
-
 
+#endif
index 0ec1fd77adf2345097d210e7bb5ca4408c98fbe7..420ce5a0af14e3826f854a1e186fb37797ed740e 100755 (executable)
@@ -36,6 +36,8 @@ using namespace std;
 
 class IntervalWindow : public QDialog
 {
+  Q_OBJECT
+
 public:
   IntervalWindow( QWidget* parent = 0 );
   ~IntervalWindow();
index 5b44b550e668b07d6f3bc99065e3a210b4271359..3a1431777f4094cc27a492055660f68d8d4227fe 100755 (executable)
@@ -51,11 +51,10 @@ class InfoWindow;
 
 class RegWidget : public QMainWindow
 {
-  
   Q_OBJECT
 
 public:
-   RegWidget( CORBA::ORB_var &orb , QWidget *parent = 0, const char *name = 0 );
+  RegWidget( CORBA::ORB_var &orb , QWidget *parent = 0, const char *name = 0 );
   ~RegWidget();
   void       SetListe();
   void       SetListeHistory();
@@ -114,13 +113,4 @@ private:
 
 };
 
-# endif         /* # ifndef __REGWIDGET_H__ */
-
-
-
-
-
-
-
-
-
+#endif
index 87453934925f2b2343357848b70f69cea63dd1a8..7788f8b7c5ab95fcc4879bbe14f713fd54f40ceb 100644 (file)
@@ -145,7 +145,7 @@ int main( int argc, char** argv )
          QString value = resMgr->stringValue( section, param );
          QStringList valsOld = QStringList::split( separ, value );
          QStringList valsNew = QStringList::split( separ, newValue );
-         for ( int i = 0; i < valsNew.count(); i++ )
+         for ( int i = 0; i < (int)valsNew.count(); i++ )
            if ( !valsOld.contains( valsNew[i] ) )
              valsOld.append( valsNew[i] );
          resMgr->setValue( section, param, valsOld.join( separ ) );
index 30f5567186baf33bcec8248ded1766ab57b051e2..6b8b62410026810c8b94884a746a2505d07f7d7a 100755 (executable)
 
 using namespace std;
 
+#define PUBLISH_ENUM(i)                              \
+{                                                    \
+  PyObject *w;                                       \
+  int rc;                                            \
+  if ( ( w = PyInt_FromLong( i ) ) == NULL ) return; \
+  rc = PyDict_SetItemString( aModuleDict, #i, w );   \
+  Py_DECREF( w );                                    \
+  if ( rc < 0 ) return;                              \
+}
+
+// enumeration : view type
+enum {
+  ViewFront,     // fron view
+  ViewBack,      // back view
+  ViewTop,       // top view
+  ViewBottom,    // bottom view
+  ViewRight,     // right view
+  ViewLeft       // left view
+};
+
+
 /*!
   VSR : 19.04.05 : Reimplemented for new SALOME GUI (SUIT-based)
   All methods are implemented using Event mechanism:
   - getRenderer()
   - getRenderWindow()
   - getRenderWindowInteractor()
-  These methods open new VTK viewer if there is no one opened.
-  In case of error methods return None object in Python.
+  - showTrihedron()
+  These methods (except showTrihedron() ) open new VTK viewer
+  if there is no one opened.
+  In case of error all methods return None object in Python.
 */
 
 static PyObject* GetPyClass(const char* theClassName){
@@ -74,7 +97,12 @@ static PyObject* GetPyClass(const char* theClassName){
   return aPyClass;
 }
 
-static SVTK_ViewWindow* GetVTKViewWindow() {
+// internal enum: find or create VTK window
+enum { __Find,          // try to find only 
+       __FindOrCreate,  // try to find: if not found - create new 
+       __Create };      // try to find: if not found - create new 
+
+static SVTK_ViewWindow* GetVTKViewWindow( int toCreate = __FindOrCreate ) {
   SVTK_ViewWindow* aVW = NULL;
   if ( SUIT_Session::session() ) {
     // get application
@@ -84,13 +112,27 @@ static SVTK_ViewWindow* GetVTKViewWindow() {
       SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
       if ( aStudy ) {
        // find or create VTK view manager
-       SVTK_ViewManager* aVM = dynamic_cast<SVTK_ViewManager*>( anApp->getViewManager( "VTKViewer", true ) );
-       if ( aVM ) {
-         aVW = dynamic_cast<SVTK_ViewWindow*>( aVM->getActiveView() );
-         // VSR : When new view window is created it can be not active yet at this moment,
-         // so the following is a some workaround
-         if ( !aVW && !aVM->getViews().isEmpty() )
-           aVW = dynamic_cast<SVTK_ViewWindow*>( aVM->getViews()[ 0 ] );
+       if ( toCreate == __Create ) {
+         SVTK_ViewManager* aVM = dynamic_cast<SVTK_ViewManager*>( anApp->createViewManager( "VTKViewer" ) );
+         if ( aVM ) {
+           aVW = dynamic_cast<SVTK_ViewWindow*>( aVM->getActiveView() );
+           if ( !aVW )
+             aVW = dynamic_cast<SVTK_ViewWindow*>( aVM->createViewWindow() );
+           // VSR : When new view window is created it can be not active yet at this moment,
+           // so the following is a some workaround
+           if ( !aVW && !aVM->getViews().isEmpty() )
+             aVW = dynamic_cast<SVTK_ViewWindow*>( aVM->getViews()[ 0 ] );
+         }
+       }
+       else {
+         SVTK_ViewManager* aVM = dynamic_cast<SVTK_ViewManager*>( anApp->getViewManager( "VTKViewer", toCreate == __FindOrCreate ) );
+         if ( aVM ) {
+           aVW = dynamic_cast<SVTK_ViewWindow*>( aVM->getActiveView() );
+           // VSR : When new view window is created it can be not active yet at this moment,
+           // so the following is a some workaround
+           if ( !aVW && !aVM->getViews().isEmpty() )
+             aVW = dynamic_cast<SVTK_ViewWindow*>( aVM->getViews()[ 0 ] );
+         }
        }
       }
     }
@@ -99,15 +141,19 @@ static SVTK_ViewWindow* GetVTKViewWindow() {
 }
 
 /*!
-  Get VTK renderer (opens new VTK window if there is no one opened)
+  Get VTK renderer.
+  Always opens new VTK window if <toCreate> parameter is non zero.
+  Otherwise opens new VTK window only if there is no one opened.
 */
 class TGetRendererEvent: public SALOME_Event {
 public:
   typedef PyObject* TResult;
   TResult myResult;
-  TGetRendererEvent() : myResult( Py_None ) {}
+  int     myCreate;
+  TGetRendererEvent( bool toCreate )
+    : myResult( Py_None ), myCreate( toCreate )  {}
   virtual void Execute() {
-    if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow() ) {
+    if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow( myCreate ? __Create : __FindOrCreate ) ) {
       PyObject* aPyClass = GetPyClass("vtkRenderer");
       vtkRenderer* aVTKObject = aVTKViewWindow->getRenderer();
       myResult = PyVTKObject_New(aPyClass,aVTKObject);
@@ -116,24 +162,29 @@ public:
 };
 extern "C" PyObject *libSalomePy_getRenderer(PyObject *self, PyObject *args)
 {
-  //return ProcessEvent( new TGetRendererEvent() );
-  PyObject * aResult;
-  Py_BEGIN_ALLOW_THREADS // PAL12755
-  aResult = ProcessEvent( new TGetRendererEvent() );
-  Py_END_ALLOW_THREADS // PAL12755
+  PyObject* aResult = Py_None;
+  int toCreate = 0;
+  if ( !PyArg_ParseTuple(args, "|i:getRenderer", &toCreate) )
+    PyErr_Print();
+  else
+    aResult = ProcessEvent( new TGetRendererEvent( toCreate ) );
   return aResult;
 }
 
 /*!
-  Get VTK render window (opens new VTK window if there is no one opened)
+  Get VTK render window.
+  Always opens new VTK window if <toCreate> parameter is non zero.
+  Otherwise opens new VTK window only if there is no one opened.
 */
 class TGetRenderWindowEvent: public SALOME_Event {
 public:
   typedef PyObject* TResult;
   TResult myResult;
-  TGetRenderWindowEvent() : myResult( Py_None ) {}
+  int     myCreate;
+  TGetRenderWindowEvent( bool toCreate )
+    : myResult( Py_None ), myCreate( toCreate )  {}
   virtual void Execute() {
-    if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow() ) {
+    if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow( myCreate ? __Create : __FindOrCreate ) ) {
       PyObject* aPyClass = GetPyClass("vtkRenderWindow");
       vtkRenderWindow* aVTKObject = aVTKViewWindow->getRenderWindow();
       myResult = PyVTKObject_New(aPyClass,aVTKObject);
@@ -142,24 +193,29 @@ public:
 };
 extern "C" PyObject *libSalomePy_getRenderWindow(PyObject *self, PyObject *args)
 {
-  //return ProcessEvent( new TGetRenderWindowEvent() );
-  PyObject * aResult;
-  Py_BEGIN_ALLOW_THREADS // PAL12755
-  aResult = ProcessEvent( new TGetRenderWindowEvent() );
-  Py_END_ALLOW_THREADS // PAL12755
+  PyObject* aResult = Py_None;
+  int toCreate = 0;
+  if ( !PyArg_ParseTuple(args, "|i:getRenderWindow", &toCreate) )
+    PyErr_Print();
+  else
+    aResult = ProcessEvent( new TGetRenderWindowEvent( toCreate ) );
   return aResult;
 }
 
 /*!
-  Get VTK render window interactor (opens new VTK window if there is no one opened)
+  Get VTK render window interactor.
+  Always opens new VTK window if <toCreate> parameter is non zero.
+  Otherwise opens new VTK window only if there is no one opened.
 */
 class TGetRenderWindowInteractorEvent: public SALOME_Event {
 public:
   typedef PyObject* TResult;
   TResult myResult;
-  TGetRenderWindowInteractorEvent() : myResult( Py_None ) {}
+  int     myCreate;
+  TGetRenderWindowInteractorEvent( bool toCreate )
+    : myResult( Py_None ), myCreate( toCreate )  {}
   virtual void Execute() {
-    if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow() ) {
+    if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow( myCreate ? __Create : __FindOrCreate ) ) {
       PyObject* aPyClass = GetPyClass("vtkRenderWindowInteractor");
       vtkRenderWindowInteractor* aVTKObject = aVTKViewWindow->getInteractor();
       myResult = PyVTKObject_New(aPyClass,aVTKObject);
@@ -168,31 +224,157 @@ public:
 };
 extern "C" PyObject *libSalomePy_getRenderWindowInteractor(PyObject *self, PyObject *args)
 {
-  //return ProcessEvent( new TGetRenderWindowInteractorEvent() );
-  PyObject * aResult;
-  Py_BEGIN_ALLOW_THREADS // PAL12755
-  aResult = ProcessEvent( new TGetRenderWindowInteractorEvent() );
-  Py_END_ALLOW_THREADS // PAL12755
+  PyObject* aResult = Py_None;
+  int toCreate = 0;
+  if ( !PyArg_ParseTuple(args, "|i:getRenderWindowInteractor", &toCreate) )
+    PyErr_Print();
+  else
+    aResult = ProcessEvent( new TGetRenderWindowInteractorEvent( toCreate ) );
   return aResult;
 }
 
+/*!
+  Show/hide trihedron in the current VTK viewer (if there is one)
+*/
+extern "C" PyObject *libSalomePy_showTrihedron(PyObject *self, PyObject *args)
+{
+  class TEvent: public SALOME_Event {
+  public:
+    int myShow;
+    TEvent( int bShow )
+      : myShow( bShow )  {}
+    virtual void Execute() {
+      if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow( __Find ) ) {
+       if ( aVTKViewWindow->isTrihedronDisplayed() != myShow )
+         aVTKViewWindow->onViewTrihedron();
+      }
+    }
+  };
+  
+  PyObject* aResult = Py_None;
+  int bShow = 0;
+  if ( !PyArg_ParseTuple(args, "i:showTrihedron", &bShow) )
+    PyErr_Print();
+  else
+    ProcessVoidEvent( new TEvent( bShow ) );
+  return aResult;
+}
+
+/*!
+  Fit all the contents in the current VTK viewer (if there is one)
+*/
+extern "C" PyObject *libSalomePy_fitAll(PyObject *self, PyObject *args)
+{
+  class TEvent: public SALOME_Event {
+  public:
+    TEvent() {}
+    virtual void Execute() {
+      if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow( __Find ) ) {
+       aVTKViewWindow->onFitAll();
+      }
+    }
+  };
+  
+  ProcessVoidEvent( new TEvent() );
+  return Py_None;
+}
+
+/*!
+  Set view type fot the current VTK viewer (if there is one)
+*/
+extern "C" PyObject *libSalomePy_setView(PyObject *self, PyObject *args)
+{
+  class TEvent: public SALOME_Event {
+  public:
+    long myType;
+    TEvent( long type ) : myType( type) {}
+    virtual void Execute() {
+      if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow( __Find ) ) {
+       switch( myType ) {
+       case ViewFront:
+         aVTKViewWindow->onFrontView();  break;
+       case ViewBack:
+         aVTKViewWindow->onBackView();   break;
+       case ViewTop:
+         aVTKViewWindow->onTopView();    break;
+       case ViewBottom:
+         aVTKViewWindow->onBottomView(); break;
+       case ViewRight:
+         aVTKViewWindow->onRightView();  break;
+       case ViewLeft:
+         aVTKViewWindow->onLeftView();   break;
+       default:
+         PyErr_Format(PyExc_ValueError,"setView%: wrong parameter value; must be between %d and %d", ViewFront, ViewLeft );
+         break;
+       }
+      }
+    }
+  };
+  
+  long type = -1;
+  if ( !PyArg_ParseTuple(args, "l:setView", &type) )
+    PyErr_Print();
+  else {
+    ProcessVoidEvent( new TEvent( type ) );
+    if( PyErr_Occurred() )
+      PyErr_Print();
+  }
+  return Py_None;
+}
+
+/*!
+  Reset contents of the current VTK viewer (if there is one)
+  to the default state
+*/
+extern "C" PyObject *libSalomePy_resetView(PyObject *self, PyObject *args)
+{
+  class TEvent: public SALOME_Event {
+  public:
+    TEvent() {}
+    virtual void Execute() {
+      if( SVTK_ViewWindow* aVTKViewWindow = GetVTKViewWindow( __Find ) ) {
+       aVTKViewWindow->onResetView();
+      }
+    }
+  };
+  
+  ProcessVoidEvent( new TEvent() );
+  return Py_None;
+}
+
 /*!
   Library initialization
 */
 static PyMethodDef Module_Methods[] = 
 {
-  { "getRenderer",               libSalomePy_getRenderer,     METH_NOARGS },
-  { "getRenderWindow",           libSalomePy_getRenderWindow, METH_NOARGS },
-  { "getRenderWindowInteractor", libSalomePy_getRenderWindow, METH_NOARGS },
+  { "getRenderer",               libSalomePy_getRenderer,               METH_VARARGS },
+  { "getRenderWindow",           libSalomePy_getRenderWindow,           METH_VARARGS },
+  { "getRenderWindowInteractor", libSalomePy_getRenderWindowInteractor, METH_VARARGS },
+  { "showTrihedron",             libSalomePy_showTrihedron,             METH_VARARGS },
+  { "fitAll",                    libSalomePy_fitAll,                    METH_NOARGS  },
+  { "setView",                   libSalomePy_setView,                   METH_VARARGS },
+  { "resetView",                 libSalomePy_resetView,                 METH_NOARGS  },
   { NULL, NULL }
 };
 
 extern "C" void initlibSalomePy()
 {
   static char modulename[] = "libSalomePy";
-  /*PyObject* aModule = */Py_InitModule(modulename, Module_Methods);
-  if(PyErr_Occurred()){
+  // init module
+  PyObject* aModule = Py_InitModule(modulename, Module_Methods);
+  if( PyErr_Occurred() ) {
     PyErr_Print();
     return;
   }
+  // get module's dictionary
+  PyObject *aModuleDict = PyModule_GetDict( aModule );
+  if ( aModuleDict == NULL )
+    return;
+  // add View type enumeration
+  PUBLISH_ENUM( ViewFront );
+  PUBLISH_ENUM( ViewBack );
+  PUBLISH_ENUM( ViewTop );
+  PUBLISH_ENUM( ViewBottom );
+  PUBLISH_ENUM( ViewRight );
+  PUBLISH_ENUM( ViewLeft );
 }
index 41276e5dc568963d4f0c9619b5247462e3531280..942c34a4a736e0a8ad87f68efec0060f87b0a04e 100644 (file)
@@ -36,6 +36,10 @@ ifeq ($(QT_VERS),Qt_3_3_4)
 QT_VERS = Qt_3_3_0
 endif
 
+ifeq ($(QT_VERS),Qt_3_3_6)
+QT_VERS = Qt_3_3_0
+endif
+
 # Sip flags
 SIP_FLAGS = -t WS_X11 -t $(QT_VERS) $(PYQT_SIPFLAGS) -s ".cc" -c . -I $(PYQT_SIPS)
 
index 5d11cf06388be06f7bbc0fba62a0b49e18076ea9..89ba1c681db55e8d76aed0ad3060b4814470bfee 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
+#include "PyInterp_Dispatcher.h"
 #include "SALOME_PYQT_Module.h"
 
-#include "PyInterp_Dispatcher.h"
+
 #include "SUIT_ResourceMgr.h"
 #include "STD_MDIDesktop.h"
 #include "STD_TabDesktop.h"
 #include "SalomeApp_Application.h"
 #include "SalomeApp_Study.h"
+#include "LightApp_Preferences.h"
 
 #include "QtxWorkstack.h"
 #include "QtxActionMenuMgr.h"
 #include <qmenubar.h>
 #include <qpopupmenu.h>
 
+#ifndef WIN32
 #include "SALOME_PYQT_SipDefs.h"
-#if defined(SIP_VERS_v4_old) || defined(SIP_VERS_v4_new)
-#include "sipAPISalomePyQtGUI.h"
-#else
-#include "sipSalomePyQtGUIDeclSalomePyQtGUI.h"
 #endif
+#include "sipAPISalomePyQtGUI.h"
 
-#include <sipqtQWidget.h>
-#include <sipqtQPopupMenu.h>
+#include "sipqtQWidget.h"
+#include "sipqtQPopupMenu.h"
 
 #include <CORBA.h>
 
@@ -281,6 +281,8 @@ bool SALOME_PYQT_Module::activateModule( SUIT_Study* theStudy )
   if ( menuMgr() )
     connect( menuMgr(), SIGNAL( menuHighlighted( int, int ) ),
             this,      SLOT( onMenuHighlighted( int, int ) ) );
+  connect( getApp(), SIGNAL( preferenceChanged( const QString&, const QString&, const QString& ) ),
+          this,     SLOT(   preferenceChanged( const QString&, const QString&, const QString& ) ) );
 
   // create menus & toolbars from XML file if required
   if ( myXmlHandler )
@@ -324,6 +326,8 @@ bool SALOME_PYQT_Module::deactivateModule( SUIT_Study* theStudy )
   if ( menuMgr() )
     disconnect( menuMgr(), SIGNAL( menuHighlighted( int, int ) ),
                this,      SLOT( onMenuHighlighted( int, int ) ) );
+  disconnect( getApp(), SIGNAL( preferenceChanged( const QString&, const QString&, const QString& ) ),
+             this,     SLOT(   preferenceChanged( const QString&, const QString&, const QString& ) ) );
 
   // remove menus & toolbars created from XML file if required
   if ( myXmlHandler )
@@ -361,6 +365,49 @@ bool SALOME_PYQT_Module::deactivateModule( SUIT_Study* theStudy )
   return SalomeApp_Module::deactivateModule( theStudy );
 }
 
+/*!
+  Preferences changing (application) - called when preference is changed
+*/
+void SALOME_PYQT_Module::preferenceChanged( const QString& module, 
+                                           const QString& section, 
+                                           const QString& setting )
+{
+  MESSAGE( "SALOME_PYQT_Module::preferenceChanged");
+
+  // perform synchronous request to Python event dispatcher
+  class Event : public PyInterp_LockRequest
+  {
+  public:
+    Event( PyInterp_base*      _py_interp,
+          SALOME_PYQT_Module* _obj,
+          const QString&      _section,
+          const QString&      _setting )
+      : PyInterp_LockRequest( _py_interp, 0, true ), // this request should be processed synchronously (sync == true)
+        myObj    ( _obj ),
+        mySection( _section ),
+        mySetting( _setting ) {}
+
+  protected:
+    virtual void execute()
+    {
+      myObj->prefChanged( mySection, mySetting );
+    }
+
+  private:
+    SALOME_PYQT_Module* myObj;
+    QString mySection, mySetting;
+  };
+
+  if ( module != moduleName() ) {
+    // Module's preferences are processed by preferencesChanged() method
+    // ...
+    // Posting the request only if dispatcher is not busy!
+    // Executing the request synchronously
+    if ( !PyInterp_Dispatcher::Get()->IsBusy() )
+      PyInterp_Dispatcher::Get()->Exec( new Event( myInterp, this, section, setting ) );
+  }
+}
+
 /*!
  * Called when study desktop is activated.
  * Used for notifying about changing of the active study.
@@ -538,6 +585,38 @@ void SALOME_PYQT_Module::contextMenuPopup( const QString& theContext, QPopupMenu
     PyInterp_Dispatcher::Get()->Exec( new PopupMenuEvent( myInterp, this, theContext, thePopupMenu ) );
 }
 
+/*!
+ * Export preferences for the Python module.
+ * Called only once when the first instance of the module is created.
+ */
+void SALOME_PYQT_Module::createPreferences()
+{
+  MESSAGE( "SALOME_PYQT_Module::createPreferences");
+  // perform synchronous request to Python event dispatcher
+  class Event : public PyInterp_LockRequest
+  {
+  public:
+    Event( PyInterp_base*      _py_interp,
+          SALOME_PYQT_Module* _obj )
+      : PyInterp_LockRequest( _py_interp, 0, true ), // this request should be processed synchronously (sync == true)
+        myObj    ( _obj )   {}
+
+  protected:
+    virtual void execute()
+    {
+      myObj->initPreferences();
+    }
+
+  private:
+    SALOME_PYQT_Module* myObj;
+  };
+
+  // Posting the request only if dispatcher is not busy!
+  // Executing the request synchronously
+  if ( !PyInterp_Dispatcher::Get()->IsBusy() )
+    PyInterp_Dispatcher::Get()->Exec( new Event( myInterp, this ) );
+}
+
 /*!
  * Defines the dockable window associated with the module.
  * To fill the list of windows the correspondind Python module's windows()
@@ -566,6 +645,44 @@ void SALOME_PYQT_Module::viewManagers( QStringList& listik ) const
   }
 }
 
+/*!
+  Preferences changing (module) - called when the module's preferences are changed
+*/
+void SALOME_PYQT_Module::preferencesChanged( const QString& section, const QString& setting )
+{
+  MESSAGE( "SALOME_PYQT_Module::preferencesChanged");
+
+  // perform synchronous request to Python event dispatcher
+  class Event : public PyInterp_LockRequest
+  {
+  public:
+    Event( PyInterp_base*      _py_interp,
+          SALOME_PYQT_Module* _obj,
+          const QString&      _section,
+          const QString&      _setting )
+      : PyInterp_LockRequest( _py_interp, 0, true ), // this request should be processed synchronously (sync == true)
+        myObj    ( _obj ),
+        mySection( _section ),
+        mySetting( _setting ) {}
+
+  protected:
+    virtual void execute()
+    {
+      myObj->prefChanged( mySection, mySetting );
+    }
+
+  private:
+    SALOME_PYQT_Module* myObj;
+    QString mySection, mySetting;
+  };
+
+  // Posting the request only if dispatcher is not busy!
+  // Executing the request synchronously
+  if ( !PyInterp_Dispatcher::Get()->IsBusy() )
+    PyInterp_Dispatcher::Get()->Exec( new Event( myInterp, this, section, setting ) );
+}
+
+
 /*!
  * Performs internal initialization
  * - initializes/gets the Python interpreter (one per study)
@@ -618,8 +735,7 @@ void SALOME_PYQT_Module::init( CAM_Application* app )
   // ... first put default values
   myWindowsMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::DockLeft );
   myWindowsMap.insert( SalomeApp_Application::WT_PyConsole,     Qt::DockBottom );
-  // VSR: LogWindow is not yet implemented
-  // myWindowsMap.insert( SalomeApp_Application::WT_LogWindow,     Qt::DockBottom );
+  myWindowsMap.insert( SalomeApp_Application::WT_LogWindow,     Qt::DockBottom );
 
   if(PyObject_HasAttrString(myModule , "windows")){
     PyObjWrapper res1( PyObject_CallMethod( myModule, "windows", "" ) );
@@ -826,6 +942,7 @@ Engines::Component_var SALOME_PYQT_Module::getEngine() const
  */
 QString SALOME_PYQT_Module::engineIOR() const
 {
+  QString anIOR = QString::null;
   if ( !CORBA::is_nil( getEngine() ) )
     return QString( getApp()->orb()->object_to_string( getEngine() ) );
   return QString( "" );
@@ -946,6 +1063,31 @@ void SALOME_PYQT_Module::menuHighlight( const int menu, const int submenu )
   }
 }
 
+/*!
+ *  Initialises preferences for the module
+ *  - calls Python module's createPreferences() method
+ */
+void SALOME_PYQT_Module::initPreferences()
+{
+  // Python interpreter should be initialized and Python module should be
+  // import first
+  if ( !myInterp || !myModule )
+    return;
+
+  // temporary set myInitModule because createPreferences() method
+  // might be called during the module intialization process
+  myInitModule = this;
+
+  if ( PyObject_HasAttrString(myModule , "createPreferences") ) {
+    PyObjWrapper res( PyObject_CallMethod( myModule, "createPreferences", "" ) );
+    if( !res ) {
+      PyErr_Print();
+    }
+  }
+
+  myInitModule = 0;
+}
+
 /*!
  *  Initialises python subinterpreter (one per study)
  */
@@ -1067,6 +1209,29 @@ void SALOME_PYQT_Module::setWorkSpace()
   }                         //__CALL_OLD_METHODS__
 }
 
+/*!
+ *  Preference changing callback function
+ * - calls Python module's preferenceChanged(string,string,string) method
+ */
+void SALOME_PYQT_Module::prefChanged( const QString& section, const QString& setting )
+{
+  // Python interpreter should be initialized and Python module should be
+  // import first
+  if ( !myInterp || !myModule )
+    return;
+
+  if ( PyObject_HasAttrString(myModule , "preferenceChanged") ) {
+    PyObjWrapper res( PyObject_CallMethod( myModule,
+                                          "preferenceChanged", 
+                                          "ss", 
+                                          section.latin1(), 
+                                          setting.latin1() ) );
+    if( !res ) {
+      PyErr_Print();
+    }
+  }
+}
+
 /*!
  * Returns default menu group
  */
@@ -1241,6 +1406,7 @@ QAction* SALOME_PYQT_Module::createAction( const int id, const QString& text, co
   }
   return a;
 }
+
 /*! 
  * Load icon from resource file
  */
@@ -1434,6 +1600,47 @@ bool SALOME_PYQT_Module::clearMenu( const int id, const int menu, const bool rem
   return false;
 }
 
+/*!
+ * The next methods call the parent implementation.
+ * This is done to open protected methods from LightApp_Module class.
+ */
+
+int SALOME_PYQT_Module::addGlobalPreference( const QString& label )
+{
+  LightApp_Preferences* pref = preferences();
+  if ( !pref )
+    return -1;
+
+  return pref->addPreference( label, -1 );
+}
+
+int SALOME_PYQT_Module::addPreference( const QString& label )
+{
+  return SalomeApp_Module::addPreference( label );
+}
+                                      
+int SALOME_PYQT_Module::addPreference( const QString& label, 
+                                      const int pId, const int type,
+                                      const QString& section,
+                                      const QString& param )
+{
+  return SalomeApp_Module::addPreference( label, pId, type, section, param );
+}
+
+QVariant SALOME_PYQT_Module::preferenceProperty( const int id, 
+                                                const QString& prop ) const
+{
+  QVariant v = SalomeApp_Module::preferenceProperty( id, prop );
+  return v;
+}
+
+void SALOME_PYQT_Module::setPreferenceProperty( const int id, 
+                                               const QString& prop, 
+                                               const QVariant& var )
+{
+  SalomeApp_Module::setPreferenceProperty( id, prop, var );
+}
+
 // SALOME_PYQT_XmlHandler class implementation
 
 // gets an tag name for the dom element [ static ]
index 7d20a34008e7389ed54bb12f1035a97518643812..b8b9aeb90e2b74848b3fe7641dcff01d3b8cea43 100644 (file)
@@ -109,6 +109,9 @@ public:
   /* context popup menu request */
   void            contextMenuPopup( const QString&, QPopupMenu*, QString& );
 
+  /* create preferences */
+  void            createPreferences();
+
   /* get module engine IOR */
   virtual QString engineIOR() const;
 
@@ -147,16 +150,31 @@ public:
   /* load icon from resource file */
   QIconSet               loadIcon( const QString& fileName );
 
+  /* working with preferences : open protected methods */
+  int                    addGlobalPreference( const QString& );
+  int                    addPreference( const QString& );
+  int                    addPreference( const QString&, const int, const int = -1,
+                                       const QString& = QString::null,
+                                       const QString& = QString::null );
+  QVariant               preferenceProperty( const int, const QString& ) const;
+  void                   setPreferenceProperty( const int, const QString&, const QVariant& );
+
   /* Show/hide menus/toolbars */
   void                   setMenuShown( const bool );
   void                   setToolShown( const bool );
 
+  /* Preferences changing (module) */
+  void                   preferencesChanged( const QString&, const QString& );
+
 public slots:
   /* activation */
   virtual bool    activateModule( SUIT_Study* );
   /* deactivation */
   virtual bool    deactivateModule( SUIT_Study* );
 
+  /* Preferences changing (application) */
+  void            preferenceChanged( const QString&, const QString&, const QString& );
+
   /******************************
    * Internal methods
    ******************************/
@@ -194,6 +212,8 @@ private:
   void            guiEvent( const int );
   /* Menu highlight processing */
   void            menuHighlight( const int, const int );
+  /* Init preferences */
+  void            initPreferences();
 
   /* initialize a Python subinterpreter */
   void            initInterp  ( int );
@@ -202,6 +222,9 @@ private:
   /* set workspace to Python GUI module */
   void            setWorkSpace();
 
+  /* preferences changing */
+  void            prefChanged( const QString&, const QString& );
+
   friend class SALOME_PYQT_XmlHandler;
 };
 
index 31a845634062ce4b871268dd7d774db51c6dc46a..4061878909223450bf9c2d30793566b3ab2136ec 100644 (file)
@@ -35,6 +35,9 @@ endif
 ifeq ($(QT_VERS),Qt_3_3_4)
 QT_VERS = Qt_3_3_0
 endif
+ifeq ($(QT_VERS),Qt_3_3_6)
+QT_VERS = Qt_3_3_0
+endif
 
 # Sip flags
 SIP_FLAGS = -t WS_X11 -t $(QT_VERS) $(PYQT_SIPFLAGS) -s ".cc" -c . -I $(PYQT_SIPS)
index d76d0bd1d774ab015cb3ff5a7c83393f3c996bb6..15ee7c264881986af28e8d79d8f2a8f29ec06af6 100644 (file)
@@ -39,6 +39,7 @@
 #include "LightApp_SelectionMgr.h"
 #include "OB_Browser.h"
 #include "QtxAction.h"
+#include "LogWindow.h"
 
 using namespace std;
 
@@ -495,6 +496,35 @@ void SalomePyQt::addDoubleSetting( const QString& name, const double value, bool
   ProcessVoidEvent( new TEvent( name, value, autoValue ) );
 }
 
+/*!
+  SalomePyQt::addBoolSetting
+  Adds an boolean setting to the application preferences
+  <autoValue> parameter is obsolete parameter and currently not used. To be removed lately.
+  This function is obsolete. Use addSetting() instead.
+*/
+void SalomePyQt::addBoolSetting( const QString& name, const bool value, bool autoValue )
+{
+  class TEvent: public SALOME_Event {
+    QString myName;
+    bool    myValue;
+    bool    myAutoValue;
+  public:
+    TEvent( const QString& name, const bool value, bool autoValue ) 
+      : myName( name ), myValue( value ), myAutoValue( autoValue ) {}
+    virtual void Execute() {
+      if ( SUIT_Session::session() ) {
+        SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+       QStringList sl = QStringList::split( ":", myName );
+       QString _sec = sl.count() > 1 ? sl[ 0 ].stripWhiteSpace() : QString( DEFAULT_SECTION );
+       QString _nam = sl.count() > 1 ? sl[ 1 ].stripWhiteSpace() : sl.count() > 0 ? sl[ 0 ].stripWhiteSpace() : QString( "" );
+       if ( !_sec.isEmpty() && !_nam.isEmpty() )
+          resMgr->setValue( _sec, _nam, myValue );
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( name, value, autoValue ) );
+}
+
 /*!
   SalomePyQt::removeSettings
   Removes a setting from the application preferences
@@ -601,6 +631,32 @@ void SalomePyQt::addSetting( const QString& section, const QString& name, const
   ProcessVoidEvent( new TEvent( section, name, value ) );
 }
 
+/*!
+  SalomePyQt::addSetting
+  Adds a boolean setting to the application preferences
+  (note: the last "dumb" parameter is used in order to avoid
+  sip compilation error because of conflicting int and bool types)
+*/
+void SalomePyQt::addSetting( const QString& section, const QString& name, const bool value, const int )
+{
+  class TEvent: public SALOME_Event {
+    QString mySection;
+    QString myName;
+    bool    myValue;
+  public:
+    TEvent( const QString& section, const QString& name, bool value ) 
+      : mySection( section ), myName( name ), myValue( value ) {}
+    virtual void Execute() {
+      if ( SUIT_Session::session() ) {
+        SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+       if ( !mySection.isEmpty() && !myName.isEmpty() )
+          resMgr->setValue( mySection, myName, myValue );
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( section, name, value ) );
+}
+
 /*!
   SalomePyQt::addSetting
   Adds a string setting to the application preferences
@@ -702,7 +758,7 @@ public:
 /*!
   \return an double setting from the application preferences
 */
-double SalomePyQt::doubleSetting( const QString& section, const QString& name, const int def )
+double SalomePyQt::doubleSetting( const QString& section, const QString& name, const double def )
 {
   return ProcessEvent( new TGetDblSettingEvent( section, name, def ) );
 }
@@ -816,6 +872,30 @@ void SalomePyQt::removeSetting( const QString& section, const QString& name )
   ProcessVoidEvent( new TEvent( section, name ) );
 }
 
+/*!
+  SalomePyQt::hasSetting
+  Returns True if the settings exists
+*/
+class THasColorSettingEvent: public SALOME_Event {
+public:
+  typedef bool TResult;
+  TResult myResult;
+  QString mySection;
+  QString myName;
+  THasColorSettingEvent( const QString& section, const QString& name ) 
+    : mySection( section ), myName( name ) {}
+  virtual void Execute() {
+    if ( SUIT_Session::session() ) {
+      SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+      myResult = resMgr->hasValue( mySection, myName );
+    }
+  }
+};
+bool SalomePyQt::hasSetting( const QString& section, const QString& name )
+{
+  return ProcessEvent( new THasColorSettingEvent( section, name ) );
+}
+
 /*!
   SalomePyQt::getFileName
   Displays 'Open/Save file' dialog box and returns a user's choice (file name)
@@ -1364,3 +1444,250 @@ bool SalomePyQt::clearMenu( const int id, const int menu, const bool removeActio
   return ProcessEvent( new TClearMenuEvent( id, menu, removeActions ) );
 }
 
+/*!
+  SalomePyQt::addGlobalPreference
+  Adds global (not module) preferences group 
+ */
+class TAddGlobalPrefEvent: public SALOME_Event {
+public:
+  typedef int TResult;
+  TResult myResult;
+  QString myLabel;
+  TAddGlobalPrefEvent( const QString& label )
+    : myResult( -1 ), myLabel( label ) {}
+  virtual void Execute() {
+    if ( SalomeApp_Application* anApp = getApplication() ) {
+      SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+      if ( !module )
+        module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+      if ( module )
+       myResult = module->addGlobalPreference( myLabel );
+    }
+  }
+};
+int SalomePyQt::addGlobalPreference( const QString& label )
+{
+  return ProcessEvent( new TAddGlobalPrefEvent( label ) );
+}
+
+/*!
+  SalomePyQt::addPreference
+  Adds preference 
+ */
+class TAddPrefEvent: public SALOME_Event {
+public:
+  typedef int TResult;
+  TResult myResult;
+  QString myLabel;
+  TAddPrefEvent( const QString& label )
+    : myResult( -1 ), myLabel( label ) {}
+  virtual void Execute() {
+    if ( SalomeApp_Application* anApp = getApplication() ) {
+      SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+      if ( !module )
+        module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+      if ( module )
+       myResult = module->addPreference( myLabel );
+    }
+  }
+};
+int SalomePyQt::addPreference( const QString& label )
+{
+  return ProcessEvent( new TAddPrefEvent( label ) );
+}
+
+/*!
+  SalomePyQt::addPreference
+  Adds preference 
+ */
+class TAddPrefParamEvent: public SALOME_Event {
+public:
+  typedef int TResult;
+  TResult myResult;
+  QString myLabel;
+  int     myPId;
+  int     myType;
+  QString mySection;
+  QString myParam;
+  TAddPrefParamEvent( const QString& label, 
+                     const int pId, const int type,
+                     const QString& section, 
+                     const QString& param )
+    : myResult( -1 ),
+      myLabel( label ), myPId( pId ), myType( type ), 
+      mySection( section ), myParam ( param ) {}
+  virtual void Execute() {
+    if ( SalomeApp_Application* anApp = getApplication() ) {
+      SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+      if ( !module )
+        module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+      if ( module )
+       myResult = module->addPreference( myLabel, myPId, myType, mySection, myParam );
+    }
+  }
+};
+int SalomePyQt::addPreference( const QString& label, const int pId, const int type,
+                              const QString& section, const QString& param )
+{
+  return ProcessEvent( new TAddPrefParamEvent( label, pId, type, section, param ) );
+}
+
+/*!
+  SalomePyQt::preferenceProperty
+  Gets the property value for the given (by id) preference
+ */
+class TPrefPropEvent: public SALOME_Event {
+public:
+  typedef QVariant TResult;
+  TResult myResult;
+  int     myId;
+  QString myProp;
+  TPrefPropEvent( const int id, const QString& prop )
+    : myId( id ), myProp( prop )
+  { 
+    myResult = QVariant();
+  }
+  virtual void Execute() {
+    if ( SalomeApp_Application* anApp = getApplication() ) {
+      SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+      if ( !module )
+        module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+      if ( module )
+       myResult = module->preferenceProperty( myId, myProp );
+    }
+  }
+};
+QVariant SalomePyQt::preferenceProperty( const int id, const QString& prop )
+{
+  return ProcessEvent( new TPrefPropEvent( id, prop ) );
+}
+
+/*!
+  SalomePyQt::setPreferenceProperty
+  Sets the property value for the given (by id) preference
+ */
+void SalomePyQt::setPreferenceProperty( const int id, 
+                                       const QString& prop,
+                                       const QVariant& var )
+{
+  class TEvent: public SALOME_Event {
+    int      myId;
+    QString  myProp;
+    QVariant myVar;
+  public:
+    TEvent( const int id, const QString& prop, const QVariant& var ) 
+      : myId( id ), myProp( prop ), myVar( var ) {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+       if ( !module )
+         module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+       if ( module )
+         module->setPreferenceProperty( myId, myProp, myVar );
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( id, prop, var) );
+}
+
+/*!
+  SalomePyQt::addPreferenceProperty
+  Adds the property value to the list of values 
+  for the given (by id) preference
+
+  This method allows creating properties which are QValueList<QVariant>
+  - there is no way to pass such values directly to QVariant parameter
+  from Python
+ */
+void SalomePyQt::addPreferenceProperty( const int id, 
+                                       const QString& prop,
+                                       const int idx, 
+                                       const QVariant& var )
+{
+  class TEvent: public SALOME_Event {
+    int      myId;
+    QString  myProp;
+    int      myIdx;
+    QVariant myVar;
+  public:
+    TEvent( const int id, const QString& prop, const int idx, const QVariant& var ) 
+      : myId( id ), myProp( prop ), myIdx( idx), myVar( var ) {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+       if ( !module )
+         module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+       if ( module ) {
+         QVariant var =  module->preferenceProperty( myId, myProp );
+         if ( var.isValid() ) {
+           if ( var.type() == QVariant::StringList ) {
+             QStringList sl = var.asStringList();
+             if ( myIdx >= 0 && myIdx < sl.count() ) 
+               sl[myIdx] = myVar.asString();
+             else
+               sl.append( myVar.asString() );
+             module->setPreferenceProperty( myId, myProp, sl );
+           }
+           else if ( var.type() == QVariant::List ) {
+             QValueList<QVariant> vl = var.asList();
+             if ( myIdx >= 0 && myIdx < vl.count() ) 
+               vl[myIdx] = myVar;
+             else
+               vl.append( myVar );
+             module->setPreferenceProperty( myId, myProp, vl );
+           }
+         }
+         else {
+           QValueList<QVariant> vl;
+           vl.append( myVar );
+           module->setPreferenceProperty( myId, myProp, vl );
+         }
+       }
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( id, prop, idx, var) );
+}
+
+/*!
+  SalomePyQt::message
+  Puts the message to the Log output window
+ */
+void SalomePyQt::message( const QString& msg, bool addSeparator )
+{
+  class TEvent: public SALOME_Event {
+    QString  myMsg;
+    bool     myAddSep;
+  public:
+    TEvent( const QString& msg, bool addSeparator ) 
+      : myMsg( msg ), myAddSep( addSeparator ) {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       LogWindow* lw = anApp->logWindow();
+       if ( lw )
+         lw->putMessage( myMsg, myAddSep );
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( msg, addSeparator ) );
+}
+
+/*!
+  SalomePyQt::clearMessages
+  Removes all the messages from the Log output window
+ */
+void SalomePyQt::clearMessages()
+{
+  class TEvent: public SALOME_Event {
+  public:
+    TEvent() {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       LogWindow* lw = anApp->logWindow();
+       if ( lw )
+         lw->clear();
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent() );
+}
index b656cd1c0c19267b5e58ccf67e237d559075a36c..d160c193caab818567983583b48dbe3567c252bc 100644 (file)
@@ -25,6 +25,7 @@
 #include <qcolor.h>
 
 #include <LightApp_Application.h>
+#include <LightApp_Preferences.h>
 
 class LightApp_SelectionMgr;
 class SalomeApp_Application;
@@ -73,6 +74,23 @@ enum {
   WT_User          = LightApp_Application::WT_User
 };
 
+enum { 
+  PT_Space    = LightApp_Preferences::Space,
+  PT_Bool     = LightApp_Preferences::Bool, 
+  PT_Color    = LightApp_Preferences::Color,
+  PT_String   = LightApp_Preferences::String, 
+  PT_Selector = LightApp_Preferences::Selector, 
+  PT_DblSpin  = LightApp_Preferences::DblSpin, 
+  PT_IntSpin  = LightApp_Preferences::IntSpin, 
+  PT_Double   = LightApp_Preferences::Double, 
+  PT_Integer  = LightApp_Preferences::Integer, 
+  PT_GroupBox = LightApp_Preferences::GroupBox, 
+  PT_Font     = LightApp_Preferences::Font, 
+  PT_DirList  = LightApp_Preferences::DirList, 
+  PT_File     = LightApp_Preferences::File, 
+  PT_User     = LightApp_Preferences::User
+};
+
 class SalomePyQt
 {
 public:
@@ -129,20 +147,41 @@ public:
 
   static void              addSetting    ( const QString&, const QString&, const double );
   static void              addSetting    ( const QString&, const QString&, const int );
+  static void              addSetting    ( const QString&, const QString&, const bool, const int );
   static void              addSetting    ( const QString&, const QString&, const QString& );
   static void              addSetting    ( const QString&, const QString&, const QColor& );
   static int               integerSetting( const QString&, const QString&, const int = 0 );
-  static double            doubleSetting ( const QString&, const QString&, const int = 0 );
+  static double            doubleSetting ( const QString&, const QString&, const double = 0 );
   static bool              boolSetting   ( const QString&, const QString&, const bool = 0 );
   static QString           stringSetting ( const QString&, const QString&, const QString& = QString("") );
   static QColor            colorSetting  ( const QString&, const QString&, const QColor& = QColor() );
   static void              removeSetting ( const QString&, const QString& );
+  static bool              hasSetting    ( const QString&, const QString& );
   // obsolete
   static void              addStringSetting( const QString&, const QString&, bool = true );
   static void              addIntSetting   ( const QString&, const int,      bool = true );
+  static void              addBoolSetting  ( const QString&, const bool,     bool = true );
   static void              addDoubleSetting( const QString&, const double,   bool = true );
   static void              removeSettings  ( const QString& );
   static QString           getSetting      ( const QString& );
+
+  static int               addGlobalPreference( const QString& );
+  static int               addPreference( const QString& );
+  static int               addPreference( const QString&,
+                                          const int, const int = -1,
+                                          const QString& = QString::null,
+                                         const QString& = QString::null );
+  static QVariant          preferenceProperty( const int, const QString& );
+  static void              setPreferenceProperty( const int, 
+                                                  const QString&,
+                                                  const QVariant& );
+  static void              addPreferenceProperty( const int,
+                                                 const QString&,
+                                                 const int,
+                                                 const QVariant& );
+
+  static void              message( const QString&, bool = true );
+  static void              clearMessages();
 };
 
 #endif // SALOME_PYQT_H
index dcb6501786d0fec147cca9f9aa74aed89d50ccdc..f73f7b0ea0e5db98789cf3b46c528ec5d06b4d24 100644 (file)
@@ -46,6 +46,23 @@ enum WindowType {
   WT_User
 };
 
+enum PrefType { 
+  PT_Space,
+  PT_Bool, 
+  PT_Color,
+  PT_String, 
+  PT_Selector, 
+  PT_DblSpin, 
+  PT_IntSpin, 
+  PT_Double, 
+  PT_Integer, 
+  PT_GroupBox, 
+  PT_Font, 
+  PT_DirList, 
+  PT_File, 
+  PT_User
+};
+
 class QtxAction : QAction
 {
 %TypeHeaderCode
@@ -116,19 +133,39 @@ public:
 
   static void              addSetting    ( const QString&, const QString&, const double );
   static void              addSetting    ( const QString&, const QString&, const int /Constrained/ );
+  static void              addSetting    ( const QString&, const QString&, const bool, const int );
   static void              addSetting    ( const QString&, const QString&, const QString& );
   static void              addSetting    ( const QString&, const QString&, const QColor& );
   static int               integerSetting( const QString&, const QString&, int = 0 );
-  static double            doubleSetting ( const QString&, const QString&, int = 0 );
+  static double            doubleSetting ( const QString&, const QString&, double = 0 );
   static bool              boolSetting   ( const QString&, const QString&, bool = false );
   static QString           stringSetting ( const QString&, const QString&, const QString& = QString("") );
   static QColor            colorSetting  ( const QString&, const QString&, const QColor& = QColor() );
   static void              removeSetting ( const QString&, const QString& );
+  static bool              hasSetting    ( const QString&, const QString& );
 
 // obsolete
   static void              addStringSetting( const QString&, const QString&, bool = true );
   static void              addIntSetting   ( const QString&, const int,      bool = true );
   static void              addDoubleSetting( const QString&, const double,   bool = true );
+  static void              addBoolSetting  ( const QString&, const bool,     bool = true );
   static void              removeSettings  ( const QString& );
   static QString           getSetting      ( const QString& );
+
+  static int               addGlobalPreference( const QString& );
+  static int               addPreference( const QString& );
+  static int               addPreference( const QString&, const int, int = -1,
+                                         const QString& = QString::null,
+                                         const QString& = QString::null );
+  static QVariant          preferenceProperty( const int, const QString& );
+  static void              setPreferenceProperty( const int, 
+                                                  const QString&,
+                                                 const QVariant& );
+  static void              addPreferenceProperty( const int, 
+                                                  const QString&,
+                                                 const int, 
+                                                 const QVariant& );
+
+  static void              message( const QString&, bool = true );
+  static void              clearMessages();
 };
index a1a1c046aea65d1b8313fc59e60d14058a0f30aa..c550e24098967a14be5e8e206d9a90e2184af746 100644 (file)
@@ -46,6 +46,23 @@ enum WindowType {
   WT_User
 };
 
+enum PrefType { 
+  PT_Space,
+  PT_Bool, 
+  PT_Color,
+  PT_String, 
+  PT_Selector, 
+  PT_DblSpin, 
+  PT_IntSpin, 
+  PT_Double, 
+  PT_Integer, 
+  PT_GroupBox, 
+  PT_Font, 
+  PT_DirList, 
+  PT_File, 
+  PT_User
+};
+
 class QtxAction : QAction
 {
 %TypeHeaderCode
@@ -115,19 +132,40 @@ public:
 
   static void              addSetting    ( const QString&, const QString&, const double ) /ReleaseGIL/ ;
   static void              addSetting    ( const QString&, const QString&, const int /Constrained/ ) /ReleaseGIL/ ;
+  static void              addSetting    ( const QString&, const QString&, const bool, const int ) /ReleaseGIL/ ;
   static void              addSetting    ( const QString&, const QString&, const QString& ) /ReleaseGIL/ ;
   static void              addSetting    ( const QString&, const QString&, const QColor& ) /ReleaseGIL/ ;
   static int               integerSetting( const QString&, const QString&, const int = 0 ) /ReleaseGIL/ ;
-  static double            doubleSetting ( const QString&, const QString&, const int = 0 ) /ReleaseGIL/ ;
+  static double            doubleSetting ( const QString&, const QString&, const double = 0 ) /ReleaseGIL/ ;
   static bool              boolSetting   ( const QString&, const QString&, const bool = false ) /ReleaseGIL/ ;
   static QString           stringSetting ( const QString&, const QString&, const QString& = QString("") ) /ReleaseGIL/ ;
   static QColor            colorSetting  ( const QString&, const QString&, const QColor& = QColor() ) /ReleaseGIL/ ;
   static void              removeSetting ( const QString&, const QString& ) /ReleaseGIL/ ;
+  static bool              hasSetting    ( const QString&, const QString& ) /ReleaseGIL/ ;
 
 // obsolete
   static void              addStringSetting( const QString&, const QString&, bool = true ) /ReleaseGIL/ ;
   static void              addIntSetting   ( const QString&, const int,      bool = true ) /ReleaseGIL/ ;
   static void              addDoubleSetting( const QString&, const double,   bool = true ) /ReleaseGIL/ ;
+  static void              addBoolSetting  ( const QString&, const bool,     bool = true ) /ReleaseGIL/ ;
   static void              removeSettings  ( const QString& ) /ReleaseGIL/ ;
   static QString           getSetting      ( const QString& ) /ReleaseGIL/ ;
+
+  static int               addGlobalPreference( const QString& ) /ReleaseGIL/ ;
+  static int               addPreference( const QString& ) /ReleaseGIL/ ;
+  static int               addPreference( const QString&,
+                                          const int, const int = -1,
+                                          const QString& = QString::null,
+                                         const QString& = QString::null ) /ReleaseGIL/ ;
+  static QVariant          preferenceProperty( const int, const QString& ) /ReleaseGIL/ ;
+  static void              setPreferenceProperty( const int, 
+                                                  const QString&,
+                                                  const QVariant& ) /ReleaseGIL/ ;
+  static void              addPreferenceProperty( const int, 
+                                                  const QString&, 
+                                                 const int, 
+                                                 const QVariant& ) /ReleaseGIL/ ;
+
+  static void              message( const QString&, bool = true ) /ReleaseGIL/ ;
+  static void              clearMessages() /ReleaseGIL/ ;
 };
diff --git a/src/SALOME_SWIG/Help.py b/src/SALOME_SWIG/Help.py
new file mode 100755 (executable)
index 0000000..404ee4d
--- /dev/null
@@ -0,0 +1,141 @@
+#  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+# 
+#  This library is free software; you can redistribute it and/or 
+#  modify it under the terms of the GNU Lesser General Public 
+#  License as published by the Free Software Foundation; either 
+#  version 2.1 of the License. 
+# 
+#  This library is distributed in the hope that it will be useful, 
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+#  Lesser General Public License for more details. 
+# 
+#  You should have received a copy of the GNU Lesser General Public 
+#  License along with this library; if not, write to the Free Software 
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+# 
+#  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+#
+#
+#
+#  File   : Help.py
+#  Author : Paul RASCLE, EDF
+#  Module : SALOME
+#  $Header$
+
+class SalomeDoc:
+    def __init__(self, aDoc):
+        self.doc = aDoc
+    def __repr__(self):
+        print self.doc
+        return "---"
+    def salome(self):
+        doc_salome = '''
+MODULE : salome
+---------------
+module salome gives access to Salome ressources:
+variables:
+
+  salome:orb             : CORBA
+  salome.naming_service  : instance of naming Service class
+      methods:
+          Resolve(name)  : find a CORBA object (ior) by its pathname
+          Register(name) : register a CORBA object under a pathname
+  salome.lcc             : instance of lifeCycleCORBA class
+      methods:
+          FindOrLoadComponent(server,name) :
+                           obtain an Engine (CORBA object)
+                           or launch the Engine if not found,
+                           with a Server name and an Engine name
+  salome.sg
+      methods:
+         updateObjBrowser(bool):
+         getActiveStudyId():
+         getActiveStudyName():
+         
+         SelectedCount():      returns number of selected objects
+         getSelected(i):       returns entry of selected object number i
+         getAllSelected():     returns list of entry of selected objects
+         AddIObject(Entry):    select an existing Interactive object
+         RemoveIObject(Entry): remove object from selection
+         ClearIObjects():      clear selection
+         
+         Display(*Entry):
+         DisplayOnly(Entry):
+         Erase(Entry):
+         DisplayAll():
+         EraseAll():
+
+         IDToObject(Entry):    returns CORBA reference from entry
+
+  salome.myStudyName     : active Study Name
+  salome.myStudyId       : active Study Id
+  salome.myStudy         : the active Study itself (CORBA ior)
+                           methods : defined in SALOMEDS.idl
+                                                         
+methods:
+  salome.DumpStudy(study) : Dump a study, given the ior
+---
+'''
+        print doc_salome
+        
+    def geompy(self):
+        doc_geompy = '''
+MODULE : geompy
+---------------
+module geompy provides an encapsulation of GEOM Engine methods
+variables:
+  geompy.geom               : a Geometry Engine, found or loaded
+                              at first import of module geompy.
+                              methods : defined in GEOM_Gen.idl
+  geompy.myBuilder          : a study builder
+  geompy.father             : GEOM root in current study (salome.myStudy)
+
+methods:
+  addToStudy(aShape, aName) : add the shape into the current study
+  --- all methods of GEOM_Gen.idl that returns a shape are encapsulated,
+      with the same interface : shapes are named with their ior
+'''
+        print doc_geompy
+        
+    def supervision(self):
+        doc_supervision = '''
+MODULES : SALOME_SuperVisionEditor and SALOME_SuperVisionExecutor
+-----------------------------------------------------------------
+this modules provide access to Editor and Executor Engine methods
+
+See SUPERV.idl
+
+In order to run the example (supervisionexample.py)
+
+    Type : from supervisionexample import *
+           supervisionexample.py contains comments
+
+A new python example avoids references to LifeCycleCORBA
+                     avoids references to NamingService
+                     avoids references to ModuleCatalog
+                     avoids SuperVisionComponent creation
+                     allows G.Input(...) instead of AddInput(G,...)
+                     replaces Editor/Executor with Graph
+                     allows Nodes, Ports and Links CORBA objects
+                     shortens methods names
+                     ...
+
+    See /SuperVisionTest/resources/GraphExample.py
+                                   and GraphExample.xml
+---
+'''
+        print doc_supervision
+        
+    
+
+help = SalomeDoc('''
+Availables modules:
+  salome      : gives access to Salome ressources
+  geompy      : encapsulation of GEOM Engine methods
+  supervision : gives access to SuperVision Engine
+To obtain specific help on a module "truc", type: help.truc()
+To run an example, type: import example3
+''')
+  
diff --git a/src/SALOME_SWIG/PyInterp.py b/src/SALOME_SWIG/PyInterp.py
new file mode 100755 (executable)
index 0000000..3e0133d
--- /dev/null
@@ -0,0 +1,102 @@
+#  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+# 
+#  This library is free software; you can redistribute it and/or 
+#  modify it under the terms of the GNU Lesser General Public 
+#  License as published by the Free Software Foundation; either 
+#  version 2.1 of the License. 
+# 
+#  This library is distributed in the hope that it will be useful, 
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+#  Lesser General Public License for more details. 
+# 
+#  You should have received a copy of the GNU Lesser General Public 
+#  License along with this library; if not, write to the Free Software 
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+# 
+#  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+#
+#
+#
+#  File   : PyInterp.py
+#  Author : Paul RASCLE, EDF
+#  Module : SALOME
+#  $Header$
+
+import sys
+from omniORB import CORBA
+from LifeCycleCORBA import *
+from libSALOME_Swig import *
+import SALOMEDS
+from SALOME_NamingServicePy import *
+
+    #--------------------------------------------------------------------------
+
+def DumpComponent(Study, SO, offset):
+    it = Study.NewChildIterator(SO)
+    Builder = Study.NewBuilder()
+    while it.More():
+        CSO = it.Value()
+        it.Next()
+        anAttr = Builder.FindOrCreateAttribute(CSO, "AttributeName")
+        AtName = anAttr._narrow(SALOMEDS.AttributeName)
+        t_name = AtName.Value()
+        if t_name[0] == 1:
+            ofs = 1
+            a = ""
+            while ofs <= offset:
+                a = a + "--"
+                ofs = ofs +1
+            print a + ">" + CSO.GetID() + " " + t_name[1]
+        t_RefSO = CSO.ReferencedObject()
+        if t_RefSO[0] == 1:
+            RefSO = t_RefSO[1]
+            ofs = 1
+            a = ""
+            while ofs <= offset:
+                a = a + "  "
+                ofs = ofs +1
+            print a + ">" + RefSO.GetID()
+        DumpComponent(Study, CSO, offset+2)
+
+    #--------------------------------------------------------------------------
+
+def DumpStudy(Study):
+    itcomp = Study.NewComponentIterator()
+    while itcomp.More():
+        SC = itcomp.Value()
+        itcomp.Next()
+        name = SC.ComponentDataType()
+        print "-> ComponentDataType is " + name
+        DumpComponent(Study, SC, 1)
+        
+
+    #--------------------------------------------------------------------------
+
+# initialise the ORB
+orb = CORBA.ORB_init([''], CORBA.ORB_ID)
+
+# create an LifeCycleCORBA instance
+lcc = LifeCycleCORBA(orb)
+
+# create an SALOMEGUI_Swig instance
+sg = SALOMEGUI_Swig()
+
+#create an naming service instance
+naming_service = SALOME_NamingServicePy_i(orb)
+
+# get active study name and id
+myStudyName = sg.getActiveStudyName()
+print myStudyName
+
+myStudyId = sg.getActiveStudyId()
+print myStudyId
+
+# get Study Manager reference
+obj = naming_service.Resolve('myStudyManager')
+myStudyManager = obj._narrow(SALOMEDS.StudyManager)
+
+# get active study
+myStudy = myStudyManager.GetStudyByName(myStudyName)
+
index 9f8e1e20cdbe2e1de53d7c16d4b876294b6653a5..d56fafe083388b288bd2ffa72256a0b72d80d327 100644 (file)
@@ -40,6 +40,9 @@
 #include "SALOME_Prs.h"
 #include "SOCC_ViewModel.h"
 #include "SVTK_ViewModel.h"
+#include "SVTK_ViewWindow.h"
+#include "SOCC_ViewWindow.h"
+#include "SPlot2d_ViewWindow.h"
 
 #include "SALOME_Event.hxx"
 #include "SALOME_ListIO.hxx"
@@ -569,3 +572,188 @@ bool SALOMEGUI_Swig::IsInCurrentView( const char* theEntry )
 {
   return ProcessEvent( new TIsInViewerEvent( theEntry ) );
 }
+
+/*!
+  Updates (repaint) current view
+*/
+void SALOMEGUI_Swig::UpdateView()
+{
+  class TEvent: public SALOME_Event {
+  public:
+    TEvent() {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       SUIT_ViewWindow* window = anApp->desktop()->activeWindow();
+       if ( window ) {
+         SALOME_View* view = dynamic_cast<SALOME_View*>( window->getViewManager()->getViewModel() );
+         if ( view )
+           view->Repaint();
+       }
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent() );
+}
+
+/*!
+  Fit all the contents of the current view window
+ */
+void SALOMEGUI_Swig::FitAll()
+{
+  class TEvent: public SALOME_Event {
+  public:
+    TEvent() {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       SUIT_ViewWindow* window = anApp->desktop()->activeWindow();
+       if ( window ) {
+         if ( dynamic_cast<SVTK_ViewWindow*>( window ) )
+           (dynamic_cast<SVTK_ViewWindow*>( window ))->onFitAll();
+         else if ( dynamic_cast<SOCC_ViewWindow*>( window ) )
+           (dynamic_cast<SOCC_ViewWindow*>( window ))->onFitAll();
+         else if ( dynamic_cast<SPlot2d_ViewWindow*>( window ) )
+           (dynamic_cast<SPlot2d_ViewWindow*>( window ))->onFitAll();
+       }
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent() );
+}
+
+/*!
+  Reset current view window to the default state.
+ */
+void SALOMEGUI_Swig::ResetView()
+{
+  class TEvent: public SALOME_Event {
+  public:
+    TEvent() {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       SUIT_ViewWindow* window = anApp->desktop()->activeWindow();
+       if ( window ) {
+         if ( dynamic_cast<SVTK_ViewWindow*>( window ) )
+           (dynamic_cast<SVTK_ViewWindow*>( window ))->onResetView();
+         else if ( dynamic_cast<SOCC_ViewWindow*>( window ) )
+           (dynamic_cast<SOCC_ViewWindow*>( window ))->onResetView();
+         else if ( dynamic_cast<SPlot2d_ViewWindow*>( window ) )
+           (dynamic_cast<SPlot2d_ViewWindow*>( window ))->onFitAll();
+         // VSR: there is no 'ResetView' functionality for Plot2d viewer,
+         // so we use 'FitAll' instead.
+       }
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent() );
+}
+
+enum {
+  __ViewTop,
+  __ViewBottom,
+  __ViewLeft,
+  __ViewRight,
+  __ViewFront,
+  __ViewBack
+};
+
+void setView( int view )
+{
+  class TEvent: public SALOME_Event {
+  private:
+    int myView;
+  public:
+    TEvent( int view ) : myView( view ) {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       SUIT_ViewWindow* window = anApp->desktop()->activeWindow();
+       if ( window ) {
+         if ( dynamic_cast<SVTK_ViewWindow*>( window ) ) {
+           switch( myView ) {
+           case __ViewTop:
+             (dynamic_cast<SVTK_ViewWindow*>( window ))->onTopView(); break;
+           case __ViewBottom:
+             (dynamic_cast<SVTK_ViewWindow*>( window ))->onBottomView(); break;
+           case __ViewLeft:
+             (dynamic_cast<SVTK_ViewWindow*>( window ))->onLeftView(); break;
+           case __ViewRight:
+             (dynamic_cast<SVTK_ViewWindow*>( window ))->onRightView(); break;
+           case __ViewFront:
+             (dynamic_cast<SVTK_ViewWindow*>( window ))->onFrontView(); break;
+           case __ViewBack:
+             (dynamic_cast<SVTK_ViewWindow*>( window ))->onBackView(); break;
+           default:
+             break;
+           }
+         }
+         else if ( dynamic_cast<SOCC_ViewWindow*>( window ) ) {
+           switch( myView ) {
+           case __ViewTop:
+             (dynamic_cast<SOCC_ViewWindow*>( window ))->onTopView(); break;
+           case __ViewBottom:
+             (dynamic_cast<SOCC_ViewWindow*>( window ))->onBottomView(); break;
+           case __ViewLeft:
+             (dynamic_cast<SOCC_ViewWindow*>( window ))->onLeftView(); break;
+           case __ViewRight:
+             (dynamic_cast<SOCC_ViewWindow*>( window ))->onRightView(); break;
+           case __ViewFront:
+             (dynamic_cast<SOCC_ViewWindow*>( window ))->onFrontView(); break;
+           case __ViewBack:
+             (dynamic_cast<SOCC_ViewWindow*>( window ))->onBackView(); break;
+           default:
+             break;
+           }
+         }
+       }
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( view ) );
+}
+
+/*!
+  Switch current view window to show top view
+ */
+void SALOMEGUI_Swig::ViewTop()
+{
+  setView( __ViewTop );
+}
+
+/*!
+  Switch current view window to show bottom view
+ */
+void SALOMEGUI_Swig::ViewBottom()
+{
+  setView( __ViewBottom );
+}
+
+/*!
+  Switch current view window to show left view
+ */
+void SALOMEGUI_Swig::ViewLeft()
+{
+  setView( __ViewLeft );
+}
+
+/*!
+  Switch current view window to show right view
+ */
+void SALOMEGUI_Swig::ViewRight()
+{
+  setView( __ViewRight );
+}
+
+/*!
+  Switch current view window to show front view
+ */
+void SALOMEGUI_Swig::ViewFront()
+{
+  setView( __ViewFront );
+}
+
+/*!
+  Switch current view window to show back view
+ */
+void SALOMEGUI_Swig::ViewBack()
+{
+  setView( __ViewBack );
+}
index 456211227b3359593c5b8fecbd1917f524b4d8b5..97e09fa28f137062849afa7a736188f73ba31bac 100644 (file)
@@ -60,6 +60,17 @@ public:
   void             DisplayAll();
   void             EraseAll();
   bool             IsInCurrentView( const char *Entry );
+  void             UpdateView();
+
+  /* view operations */
+  void             FitAll();
+  void             ResetView();
+  void             ViewTop();
+  void             ViewBottom();
+  void             ViewLeft();
+  void             ViewRight();
+  void             ViewFront();
+  void             ViewBack();
 
   /* get component name/username */
   const char*      getComponentName( const char* ComponentUserName );
index 7820811c93600675388a1f1c83ee28034f78579f..e01c9cf1eda03141c8a1863b26f0eba6f44159cd 100644 (file)
@@ -80,6 +80,17 @@ class SALOMEGUI_Swig
   void DisplayAll();
   void EraseAll();
   bool IsInCurrentView(const char *Entry);
+  void UpdateView();
+
+/* view operations */
+  void FitAll();
+  void ResetView();
+  void ViewTop();
+  void ViewBottom();
+  void ViewLeft();
+  void ViewRight();
+  void ViewFront();
+  void ViewBack();
 
 /* get component name/username */
   const char* getComponentName( const char* ComponentUserName );
diff --git a/src/SALOME_SWIG/salome.py b/src/SALOME_SWIG/salome.py
new file mode 100755 (executable)
index 0000000..9d45865
--- /dev/null
@@ -0,0 +1,157 @@
+#  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+# 
+#  This library is free software; you can redistribute it and/or 
+#  modify it under the terms of the GNU Lesser General Public 
+#  License as published by the Free Software Foundation; either 
+#  version 2.1 of the License. 
+# 
+#  This library is distributed in the hope that it will be useful, 
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+#  Lesser General Public License for more details. 
+# 
+#  You should have received a copy of the GNU Lesser General Public 
+#  License along with this library; if not, write to the Free Software 
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+# 
+#  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+#
+#
+#
+#  File   : salome.py
+#  Author : Paul RASCLE, EDF
+#  Module : SALOME
+#  $Header$
+
+from omniORB import CORBA
+from LifeCycleCORBA import *
+from libSALOME_Swig import *
+import SALOMEDS
+from SALOME_NamingServicePy import *
+
+from SALOME_utilities import *
+
+#--------------------------------------------------------------------------
+
+def DumpComponent(Study, SO, offset):
+    it = Study.NewChildIterator(SO)
+    Builder = Study.NewBuilder()
+    while it.More():
+        CSO = it.Value()
+        it.Next()
+        anAttr = Builder.FindOrCreateAttribute(CSO, "AttributeName")
+        AtName = anAttr._narrow(SALOMEDS.AttributeName)
+        t_name = AtName.Value()
+        if t_name[0] == 1:
+            ofs = 1
+            a = ""
+            while ofs <= offset:
+                a = a + "--"
+                ofs = ofs +1
+            MESSAGE( a + ">" + str(CSO.GetID()) + " " + str(t_name[1]) )
+        t_RefSO = CSO.ReferencedObject()
+        if t_RefSO[0] == 1:
+            RefSO = t_RefSO[1]
+            ofs = 1
+            a = ""
+            while ofs <= offset:
+                a = a + "  "
+                ofs = ofs +1
+            MESSAGE( a + ">" + str(RefSO.GetID()) )
+        DumpComponent(Study, CSO, offset+2)
+
+    #--------------------------------------------------------------------------
+
+def DumpStudy(Study):
+    itcomp = Study.NewComponentIterator()
+    while itcomp.More():
+        SC = itcomp.Value()
+        itcomp.Next()
+        name = SC.ComponentDataType()
+        MESSAGE( "-> ComponentDataType is " + name )
+        DumpComponent(Study, SC, 1)
+        
+
+    #--------------------------------------------------------------------------
+
+def ImportComponentGUI(ComponentName):
+    libName = "lib" + ComponentName + "_Swig"
+    command = "from " + libName + " import *"
+    exec ( command )
+    constructor = ComponentName + "_Swig()"
+    command = "gui = " + constructor
+    exec ( command )
+    return gui
+
+    #--------------------------------------------------------------------------
+
+def SalomeGUIgetAllSelected(self):
+    selNumber = self.SelectedCount()
+    listSelected = []
+    for i in range(selNumber):
+        listSelected.append(self.getSelected(i))
+    return listSelected
+
+class SalomeGUI(SALOMEGUI_Swig):
+    getAllSelected = SalomeGUIgetAllSelected
+    
+    #--------------------------------------------------------------------------
+
+def IDToObject(id):
+    myObj = None
+    mySO = myStudy.FindObjectID(id);
+    if mySO is not None:
+        ok, anAttr = mySO.FindAttribute("AttributeIOR")
+        if ok:
+            AtIOR = anAttr._narrow(SALOMEDS.AttributeIOR)
+            if AtIOR.Value() != "":
+                myObj = orb.string_to_object(AtIOR.Value())
+    return myObj
+
+def ObjectToSObject(obj):
+    mySO = None
+    if obj is not None:
+        ior =  orb.object_to_string(obj)
+        if ior != "":
+            mySO = myStudy.FindObjectIOR(ior)
+    return mySO
+
+def ObjectToID(obj):
+    mySO = ObjectToSObject(obj)
+    if mySO:
+        return mySO.GetID()
+    return ""
+
+def IDToSObject(id):
+    mySO = myStudy.FindObjectID(id);
+    return mySO
+
+    #--------------------------------------------------------------------------
+
+# initialise the ORB
+orb = CORBA.ORB_init([''], CORBA.ORB_ID)
+
+# create an LifeCycleCORBA instance
+lcc = LifeCycleCORBA(orb)
+
+# create an SALOMEGUI_Swig instance
+sg = SalomeGUI()
+
+#create an naming service instance
+naming_service = SALOME_NamingServicePy_i(orb)
+
+# get active study name and id
+myStudyName = sg.getActiveStudyName()
+MESSAGE( myStudyName )
+
+myStudyId = sg.getActiveStudyId()
+MESSAGE( str(myStudyId) )
+
+# get Study Manager reference
+obj = naming_service.Resolve('myStudyManager')
+myStudyManager = obj._narrow(SALOMEDS.StudyManager)
+
+# get active study
+myStudy = myStudyManager.GetStudyByName(myStudyName)
+
index 44623c874b7e1dd8dd28d56c84c964dec3cccd63..eb2cb6821bdfe493c4af96a80e8084845c5ba1cc 100644 (file)
@@ -74,7 +74,7 @@ void SOCC_Prs::AddObject( const Handle(AIS_InteractiveObject)& obj )
 */
 bool SOCC_Prs::IsNull() const 
 { 
-  return myObjects.IsEmpty()
+  return myObjects.IsEmpty() == Standard_True;
 }
 
 /*!
index 8d425a47c63d9d753e5dc20e575a0bd979a22b6e..8d27c10a7f94d19a83938200a8eb4c5dba11a2b0 100755 (executable)
@@ -521,12 +521,8 @@ void SOCC_Viewer::EraseAll( const bool forced )
     //  }
     //}
   }
-
-  // display trihedron if necessary
-  if ( isTrihedronDisplayed )
-    getAISContext()->Display( getTrihedron() );
-  else
-    Repaint();
+  
+  Repaint();
 }
 
 /*!
index 2e519687b3f10c88cc49826ddebe071f7bcbbf0d..d7c4edb81916b4116943d91fffac741746760f8b 100644 (file)
@@ -79,23 +79,23 @@ SOCC_ViewWindow
     myViewPort->fitAll();
     break;
   case SUIT_Accel::RotateLeft  : 
-    myViewPort->startRotation( cx, cy );
-    myViewPort->rotate( cx - inc, cy );
+    myViewPort->startRotation( cx, cy, myCurrPointType, mySelectedPoint );
+    myViewPort->rotate( cx - inc, cy, myCurrPointType, mySelectedPoint );
     myViewPort->endRotation();
     break;
   case SUIT_Accel::RotateRight :  
-    myViewPort->startRotation( cx, cy );
-    myViewPort->rotate( cx + inc, cy );
+    myViewPort->startRotation( cx, cy, myCurrPointType, mySelectedPoint );
+    myViewPort->rotate( cx + inc, cy, myCurrPointType, mySelectedPoint );
     myViewPort->endRotation();
     break;
   case SUIT_Accel::RotateUp    :  
-    myViewPort->startRotation( cx, cy );
-    myViewPort->rotate( cx, cy - inc );
+    myViewPort->startRotation( cx, cy, myCurrPointType, mySelectedPoint );
+    myViewPort->rotate( cx, cy - inc, myCurrPointType, mySelectedPoint );
     myViewPort->endRotation();
     break;
   case SUIT_Accel::RotateDown  :  
-    myViewPort->startRotation( cx, cy );
-    myViewPort->rotate( cx, cy + inc );
+    myViewPort->startRotation( cx, cy, myCurrPointType, mySelectedPoint );
+    myViewPort->rotate( cx, cy + inc, myCurrPointType, mySelectedPoint );
     myViewPort->endRotation();
     break;
   }
index bae8303436f079cd5e61bcf3e05f07c46fa7c282..527a8a135209102df824e0c2c7442265b3444b83 100644 (file)
@@ -116,10 +116,10 @@ void SPlot2d_Viewer::rename( const Handle(SALOME_InteractiveObject)& IObject,
 void SPlot2d_Viewer::renameAll( const Handle(SALOME_InteractiveObject)& IObj, const QString& name )
 {
   SUIT_ViewManager* vm = getViewManager();
-  if( vm )
+  if ( vm )
   {
     const QPtrVector<SUIT_ViewWindow>& wnds = vm->getViews();
-    for( int i=0; i<wnds.size(); i++ )
+    for ( uint i = 0; i < wnds.size(); i++ )
     {
       Plot2d_ViewWindow* pwnd = dynamic_cast<Plot2d_ViewWindow*>( wnds.at( i ) );
       rename( IObj, name, pwnd->getViewFrame() );
index 5a74b47853b76b1eb51074c6900452c9da893a37..90690cad7c3b0e0162d3ac58cd78c3b9f5dcf2cb 100755 (executable)
@@ -64,6 +64,7 @@ myActiveViewMgr( 0 )
 /*!Destructor.*/
 STD_Application::~STD_Application()
 {
+  clearViewManagers();
 }
 
 /*! \retval QString "StdApplication"*/
@@ -186,13 +187,6 @@ void STD_Application::createActions()
                 tr( "MEN_DESK_HELP_ABOUT" ), tr( "PRP_DESK_HELP_ABOUT" ),
                 SHIFT+Key_A, desk, false, this, SLOT( onHelpAbout() ) );
 
-  //SRN: BugID IPAL9021, add an action "Load"
-  createAction( FileLoadId, tr( "TOT_DESK_FILE_LOAD" ),
-                resMgr->loadPixmap( "STD", tr( "ICON_FILE_OPEN" ) ),
-               tr( "MEN_DESK_FILE_LOAD" ), tr( "PRP_DESK_FILE_LOAD" ),
-               CTRL+Key_L, desk, false, this, SLOT( onLoadDoc() ) );
-  //SRN: BugID IPAL9021: End
-
   QtxDockAction* da = new QtxDockAction( tr( "TOT_DOCK_WINDOWS" ), tr( "MEN_DOCK_WINDOWS" ), desk );
   registerAction( ViewWindowsId, da );
   da->setAutoPlace( false );
@@ -208,7 +202,6 @@ void STD_Application::createActions()
 
   createMenu( FileNewId,    fileMenu, 0 );
   createMenu( FileOpenId,   fileMenu, 0 );
-  createMenu( FileLoadId,   fileMenu, 0 );  //SRN: BugID IPAL9021, add a menu item "Load"
   createMenu( FileCloseId,  fileMenu, 0 );
   createMenu( separator(),  fileMenu, -1, 0 );
   createMenu( FileSaveId,   fileMenu, 0 );
@@ -222,8 +215,9 @@ void STD_Application::createActions()
   createMenu( EditPasteId, editMenu );
   createMenu( separator(), editMenu );
 
-  createMenu( ViewWindowsId,   viewMenu );
-  createMenu( ViewStatusBarId, viewMenu );
+  createMenu( ViewWindowsId,   viewMenu, 0 );
+  createMenu( separator(),     viewMenu, -1, 10 );
+  createMenu( ViewStatusBarId, viewMenu, 10 );
   createMenu( separator(),     viewMenu );
 
   createMenu( HelpAboutId, helpMenu );
@@ -322,11 +316,6 @@ bool STD_Application::onOpenDoc( const QString& aName )
   return res;
 }
 
-/*! called on loading the existent study */
-void STD_Application::onLoadDoc()
-{
-}
-
 /*! \retval true, if document was loaded successful, else false.*/
 bool STD_Application::onLoadDoc( const QString& aName )
 {
@@ -678,7 +667,8 @@ void STD_Application::removeViewManager( SUIT_ViewManager* vm )
   emit viewManagerRemoved( vm );
 
   vm->disconnectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
-  vm->disconnect();
+  disconnect( vm, SIGNAL( activated( SUIT_ViewManager* ) ),
+             this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
   myViewMgrs.removeRef( vm );
 
   if ( myActiveViewMgr == vm )
@@ -691,8 +681,11 @@ void STD_Application::clearViewManagers()
   ViewManagerList lst;
   viewManagers( lst );
 
-  for ( QPtrListIterator<SUIT_ViewManager> it( lst ); it.current(); ++it )
-    removeViewManager( it.current() );
+  for ( QPtrListIterator<SUIT_ViewManager> it( lst ); it.current(); ++it ) {
+    QGuardedPtr<SUIT_ViewManager> vm = it.current();
+    removeViewManager( vm );
+    delete vm;
+  }
 }
 
 /*!\retval TRUE, if view manager \a vm, already in view manager list (\a myViewMgrs).*/
index b6ca7fc08d476827e21fbb52f836329274c0b4f9..4e766ca980d19d569de20eac03d62427f0a42d2c 100755 (executable)
@@ -101,7 +101,6 @@ public slots:
   virtual void          onOpenDoc();
   virtual bool          onOpenDoc( const QString& );
 
-  virtual void          onLoadDoc();
   virtual bool          onLoadDoc( const QString& );
 
   virtual void          onExit();
@@ -126,7 +125,7 @@ protected:
           MenuHelpId = 7
        };
 
-  enum {  FileNewId,   FileOpenId,   FileLoadId, FileCloseId,
+  enum {  FileNewId,   FileOpenId,   FileCloseId,
          FileSaveId,  FileSaveAsId, FileExitId, 
          ViewStatusBarId, ViewWindowsId, NewWindowId,
           EditCutId, EditCopyId, EditPasteId,
index a4a21d8623fb062d71e8f0c460382553fb8edbf4..bbe68030d2b757c51ddd1624e2802656960ba6fd 100755 (executable)
@@ -168,7 +168,7 @@ SUIT_ResourceMgr* SUIT_Application::resourceMgr() const
   \param msg - text of message
   \param msec - time in milliseconds, after that the status label will be cleared
 */
-void SUIT_Application::putInfo ( const QString& msg, const int msec )
+void SUIT_Application::putInfo( const QString& msg, const int msec )
 {
   if ( !desktop() )
     return;
@@ -180,9 +180,28 @@ void SUIT_Application::putInfo ( const QString& msg, const int msec )
     myStatusLabel->show();
   }
 
+  QString prev = myStatusLabel->text();
+
   myStatusLabel->setText( msg );
   if ( msec != -1 )
-    QTimer::singleShot( msec <= 0 ? DEFAULT_MESSAGE_DELAY : msec, myStatusLabel, SLOT( clear() ) );
+    QTimer::singleShot( msec <= 0 ? DEFAULT_MESSAGE_DELAY : msec, this, SLOT( onInfoClear() ) );
+
+  if ( prev != msg )
+    emit infoChanged( msg );
+}
+
+/*!
+  Clear the information label in status bar after delay.
+*/
+void SUIT_Application::onInfoClear()
+{
+  if ( !myStatusLabel )
+    return;
+
+  bool changed = !myStatusLabel->text().isEmpty();
+  myStatusLabel->clear();
+  if ( changed )
+    emit infoChanged( QString::null );
 }
 
 /*!
index 72dc89363a4efe379f4923c74c642723fcbe7a11..0bf48847e47efb99ae3aaaa7a08de43aabc794b7 100755 (executable)
 #include <qobject.h>
 #include <qwidget.h>
 
+class QLabel;
+class QString;
 class QAction;
+class QIconSet;
 class SUIT_Desktop;
 class SUIT_Convertor;
 class SUIT_ViewModel;
 class SUIT_ResourceMgr;
-class QString;
-class QIconSet;
-class QLabel;
+
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*! \class QObject
  * \brief For more information see <a href="http://doc.trolltech.com">QT documentation</a>.
  */
@@ -107,6 +112,10 @@ public:
 signals:
   void                  applicationClosed( SUIT_Application* );
   void                  activated( SUIT_Application* );
+  void                  infoChanged( QString );
+
+private slots:
+  void                  onInfoClear();
 
 protected:
   SUIT_Application*     startApplication( int, char** ) const;
@@ -171,4 +180,8 @@ extern "C"
 
 #define APP_CREATE_NAME "createApplication"
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 9f4227d488a3dae21d1535f93f4df41b2b46ccc9..053e1abe738d45f6738c7c092271b1fe4a02ce5b 100755 (executable)
@@ -29,7 +29,7 @@ class SUIT_EXPORT SUIT_DataObjectKey
 {
 public:
   SUIT_DataObjectKey();
-  ~SUIT_DataObjectKey();
+  virtual ~SUIT_DataObjectKey();
 
   virtual bool isLess( const SUIT_DataObjectKey* ) const = 0;
   virtual bool isEqual( const SUIT_DataObjectKey* ) const = 0;
index 826bd89bfa439b15b6f134fd46b1cf126cf6f862..3090afa912595ff0bc05c8f9bce1846b0ed69fa0 100755 (executable)
@@ -36,7 +36,7 @@ SUIT_DataOwner::~SUIT_DataOwner()
 {
 }
 
-/*! operator== : compares two owners*/
+/*! Operator == compares two owners*/
 bool operator==( const SUIT_DataOwnerPtr& p1, const SUIT_DataOwnerPtr& p2 )
 {
   if ( !p1.isNull() && !p2.isNull() )
@@ -44,6 +44,29 @@ bool operator==( const SUIT_DataOwnerPtr& p1, const SUIT_DataOwnerPtr& p2 )
   return p1.isNull() && p2.isNull();
 }
 
+
+/*! Operator < allows to order suit data owners for map */
+bool operator<( const SUIT_DataOwnerPtr& p1, const SUIT_DataOwnerPtr& p2 )
+{
+  if ( p1.isNull() && p2.isNull() )
+    return false;
+  else if ( p1.isNull() )
+    return true;
+  else if ( p2.isNull() )
+    return false;
+
+  //bug with acrossentry of DataOwner and DataSubOwner
+  const _typeinfo& ti1 = typeid( *(p1.operator->()) );
+  const _typeinfo& ti2 = typeid( *(p2.operator->()) );
+
+  int res = strcmp( ti1.name(), ti2.name() );
+
+  if ( !res )
+    return p1->isLess( *p2 );
+
+  return res;
+}
+
 /*!
   \class SUIT_DataOwnerPtrList 
   implements value list with unique items (uniqueness is 
@@ -126,12 +149,12 @@ SUIT_DataOwnerPtrList::SUIT_DataOwnerPtrList( const std::list<SUIT_DataOwnerPtr>
 */
 SUIT_DataOwnerPtrList::iterator SUIT_DataOwnerPtrList::append( const SUIT_DataOwnerPtr& x )
 {
-  if( mySkipEqual && myMap.contains( x ) ) //contains uses SUIT_DataOwnerPtr::operator==
+  if ( mySkipEqual && myMap.contains( x ) ) //contains uses SUIT_DataOwnerPtr::operator==
     return myMap[ x ];
 
   iterator it = QValueList<SUIT_DataOwnerPtr>::append( x );
 
-  if( mySkipEqual )
+   if ( mySkipEqual )
     myMap.insert( x, it );
 
   return it;
@@ -156,11 +179,3 @@ uint SUIT_DataOwnerPtrList::remove(const SUIT_DataOwnerPtr& x )
     myMap.remove(x);
   return QValueList<SUIT_DataOwnerPtr>::remove( x );
 }
-
-/*!
-  Operator < allows to order suit data owners for map
-*/
-bool operator<( const SUIT_DataOwnerPtr& p1, const SUIT_DataOwnerPtr& p2 )
-{
-  return p1.get()<p2.get();
-}
index bc2ef2615535a148e165754413b81e3352865bb7..2d364fd57d8baa459f40b85b3cb61901ee6f1c77 100755 (executable)
@@ -42,6 +42,7 @@ public:
   virtual ~SUIT_DataOwner();//!< destructor
   //! compare function
   virtual bool isEqual( const SUIT_DataOwner& ) const = 0;
+  virtual bool isLess( const SUIT_DataOwner& ) const = 0;
 };
 
 /*! \typedef SUIT_DataOwnerPtr
index 8d75c71740806e3794afa08c176d8866b4fede62..8b2c63202b75a2613329ee91f1939a8a535bd05a 100755 (executable)
@@ -178,3 +178,11 @@ void SUIT_Desktop::emitActivated()
 {
   emit activated();
 }
+
+/*!
+  Emits message signal
+*/
+void SUIT_Desktop::emitMessage( const QString& theMessage )
+{
+  emit message( theMessage );
+}
index a346d0ca499f0531d5db55c2a33006ee8660d1c4..e3acceb62f3621646107c89d2d8ff995614ba576 100755 (executable)
@@ -60,12 +60,14 @@ public:
   void                     logoInsert( const QString&, const QPixmap&, const int = -1 );
 
   void                     emitActivated();
+  void                     emitMessage( const QString& );
 
 signals:
   void                     activated();
   void                     deactivated();
   void                     windowActivated( SUIT_ViewWindow* );
   void                     closing( SUIT_Desktop*, QCloseEvent* );
+  void                     message( const QString& );
 
 protected:
   virtual bool             event( QEvent* );
index 7d4023f3a398b6d06ec145382f4d6bb16536e23c..f65bc9f1245c92a7ac7bb6f67ca22326b8913671 100644 (file)
@@ -36,7 +36,7 @@ public:
   class Signal;
 
   SUIT_PopupClient();
-  ~SUIT_PopupClient();
+  virtual ~SUIT_PopupClient();
 
   bool            connectPopupRequest( QObject* reciever, const char* slot );
   bool            disconnectPopupRequest( QObject* reciever, const char* slot );
index 018b6acf19da957bb2cc45500b00357f89d85e29..8a81306bb8bea25014a0171072f9934faf329fde 100755 (executable)
@@ -20,6 +20,7 @@
 
 #include <qfileinfo.h>
 #include <qdir.h>
+#include <stdlib.h>
 
 /*!
     Constructor
@@ -64,7 +65,9 @@ QString SUIT_ResourceMgr::loadDoc( const QString& prefix, const QString& id ) co
   return path( docSection, prefix, id );
 }
 
+#ifndef WIN32
 #include <unistd.h>
+#endif
 /*!
     Returns the user file name for specified application
 */
index a26510108f64487ac20a8ab43ebf74e2e395579b..bc63de032acef57d3eb9baf4e9583cc9b809f998 100644 (file)
@@ -28,7 +28,7 @@ class SUIT_EXPORT SUIT_SelectionFilter
 {
 public:
   SUIT_SelectionFilter();
-  ~SUIT_SelectionFilter();
+  virtual ~SUIT_SelectionFilter();
 
   virtual bool isOk( const SUIT_DataOwner* ) const = 0;
 };
index 0e641f236e41676d82ed75884eeaa4537c973079..7d2ac383912cb8488928028e7721f233ac8dc9ce 100755 (executable)
@@ -61,6 +61,10 @@ SUIT_Session::~SUIT_Session()
 {
   myAppList.clear();
 
+  if (myResMgr) {
+    delete myResMgr;
+    myResMgr = 0;
+  }
   mySession = 0;
 }
 
index 602a8913bf72f502dd78a25dde6c28de7bcff369..61d8fde064081ab4b271bda586b0668aaa4661bb 100644 (file)
@@ -106,7 +106,7 @@ TrgItem synchronize( const SrcItem& r1, const TrgItem& r2, const TreeData& td )
   if( td.isEqual( r1, r2 ) )
   {
     // update items themselves
-    td.updateItem( r2 );
+    td.updateItem( r1, r2 );
 
     // iterate 'siblings' (direct children) 
     QValueList< DiffItem< SrcItem, TrgItem > > d;
@@ -135,7 +135,7 @@ TrgItem synchronize( const SrcItem& r1, const TrgItem& r2, const TreeData& td )
         else
        {
          //to update
-         td.updateItem( item.myTrg );
+         td.updateItem( item.mySrc, item.myTrg );
          synchronize( item.mySrc, item.myTrg, td );
          lastItem = item.myTrg;
        }
index 619b9c488522fe9e451c8e9d01bfa7c4558c4006..9d2e7e18619cdd04f16bd00d33734716b7b91d20 100755 (executable)
 #include "SUIT_Study.h"
 
 #include <qcursor.h>
+#include <qregexp.h>
 #include <qmessagebox.h>
 
 #ifdef WNT
 #include <windows.h>
 #endif
 
+QMap<QString, int> SUIT_ViewManager::_ViewMgrId;
+
 /*!\class SUIT_ViewManager.
  * Class provide manipulation with view windows.
  */
@@ -39,17 +42,20 @@ SUIT_ViewManager::SUIT_ViewManager( SUIT_Study* theStudy,
                                     SUIT_ViewModel* theViewModel )
 : QObject( 0 ),
 myDesktop( theDesktop ),
-myTitle( "Default viewer" ),
+myTitle( "Default: %M - viewer %V" ),
 myStudy( NULL )
 {
   myViewModel = 0;
   myActiveView = 0;
-  setViewModel(theViewModel);
-  connect(theDesktop, SIGNAL(windowActivated(SUIT_ViewWindow*)), 
-          this,       SLOT(onWindowActivated(SUIT_ViewWindow*)));
+  setViewModel( theViewModel );
+
+  myId = useNewId( getType() );
+
+  connect( theDesktop, SIGNAL( windowActivated( SUIT_ViewWindow* ) ), 
+           this,       SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
 
   myStudy = theStudy;
-  if( myStudy )
+  if ( myStudy )
     connect( myStudy, SIGNAL( destroyed() ), this, SLOT( onDeleteStudy() ) );
 }
 
@@ -63,6 +69,26 @@ SUIT_ViewManager::~SUIT_ViewManager()
   }
 }
 
+int SUIT_ViewManager::useNewId( const QString& type )
+{
+  if ( !_ViewMgrId.contains( type ) )
+    _ViewMgrId.insert( type, 0 );
+
+  int id = _ViewMgrId[type];
+  _ViewMgrId[type]++;
+  return id;
+}
+
+void SUIT_ViewManager::setTitle( const QString& theTitle )
+{
+  if ( myTitle == theTitle )
+    return;
+
+  myTitle = theTitle;
+  for ( uint i = 0; i < myViews.count(); i++ )
+    setViewName( myViews[i] );
+}
+
 /*!Sets view model \a theViewModel to view manager.*/
 void SUIT_ViewManager::setViewModel(SUIT_ViewModel* theViewModel) 
 {
@@ -76,10 +102,31 @@ void SUIT_ViewManager::setViewModel(SUIT_ViewModel* theViewModel)
 }
 
 /*!Sets view name for view window \a theView.*/
-void SUIT_ViewManager::setViewName(SUIT_ViewWindow* theView)
+void SUIT_ViewManager::setViewName( SUIT_ViewWindow* theView )
 {
-  int aPos = myViews.find(theView);
-  theView->setCaption(myTitle + QString(":%1").arg(aPos+1));
+  QString title = prepareTitle( getTitle(), myId + 1, myViews.find( theView ) + 1 );
+  theView->setCaption( title );
+}
+
+QString SUIT_ViewManager::prepareTitle( const QString& title, const int mId, const int vId )
+{
+  QString res = title;
+  QRegExp re( "%[%MV]" );
+  int i = 0;
+  while ( ( i = re.search( res, i ) ) != -1 )
+  {
+    QString rplc;
+    QString str = res.mid( i, re.matchedLength() );
+    if ( str == QString( "%%" ) )
+      rplc = QString( "%" );
+    else if ( str == QString( "%M" ) )
+      rplc = QString::number( mId );
+    else if ( str == QString( "%V" ) )
+      rplc = QString::number( vId );
+    res.replace( i, re.matchedLength(), rplc );
+    i += rplc.length();
+  }
+  return res;
 }
 
 /*! Creates View, adds it into list of views and returns just created view window*/
@@ -131,7 +178,7 @@ bool SUIT_ViewManager::insertView(SUIT_ViewWindow* theView)
   }
   
   connect(theView, SIGNAL(closing(SUIT_ViewWindow*)),
-          this,    SLOT(onDeleteView(SUIT_ViewWindow*)));
+          this,    SLOT(onClosingView(SUIT_ViewWindow*)));
 
   connect(theView, SIGNAL(mousePressed(SUIT_ViewWindow*, QMouseEvent*)),
           this,    SLOT(onMousePressed(SUIT_ViewWindow*, QMouseEvent*)));
@@ -168,10 +215,31 @@ bool SUIT_ViewManager::insertView(SUIT_ViewWindow* theView)
 
 /*!Emit delete view. Remove view window \a theView from view manager.
 */
-void SUIT_ViewManager::onDeleteView(SUIT_ViewWindow* theView)
+void SUIT_ViewManager::onClosingView( SUIT_ViewWindow* theView )
 {
-  emit deleteView(theView);
-  removeView(theView);
+  closeView( theView );
+}
+
+/*!
+  Remove the view window \a theView from view manager and destroy it.
+*/
+void SUIT_ViewManager::closeView( SUIT_ViewWindow* theView )
+{
+  if ( !theView )
+    return;
+
+  QGuardedPtr<SUIT_ViewWindow> view( theView );
+
+  view->hide();
+
+  if ( !view->testWFlags( WDestructiveClose ) )
+    return;
+
+  emit deleteView( view );
+  removeView( view );
+
+  if ( view )
+    delete view;
 }
 
 /*!Remove view window \a theView from view manager.
@@ -188,6 +256,26 @@ void SUIT_ViewManager::removeView(SUIT_ViewWindow* theView)
     emit lastViewClosed(this);
 }
 
+/*!
+  Set or clear flag Qt::WDestructiveClose for all views
+*/
+void SUIT_ViewManager::setDestructiveClose( const bool on )
+{
+  for ( uint i = 0; i < myViews.count(); i++ )
+    myViews[i]->setDestructiveClose( on );
+}
+
+/*!
+  Returns 'true' if any of views (view windows) is visible.
+*/
+bool SUIT_ViewManager::isVisible() const
+{
+  bool res = false;
+  for ( uint i = 0; i < myViews.count() && !res; i++ )
+    res = myViews[i]->isVisibleTo( myViews[i]->parentWidget() );
+  return res;
+}
+
 /*!
   Show or hide all views (view windows)
 */
@@ -223,17 +311,15 @@ void SUIT_ViewManager::onWindowActivated(SUIT_ViewWindow* view)
 */
 void SUIT_ViewManager::closeAllViews()
 {
-  unsigned int aSize = myViews.size();
-  for (uint i = 0; i < aSize; i++) {
-    if (myViews[i])
-      myViews[i]->close();
-  }
+  for ( uint i = 0; i < myViews.size(); i++ )
+    delete myViews[i];
+  myViews.clear();
 }
 
 /*!
  *\retval QString - type of view model.
  */
-QString  SUIT_ViewManager::getType() const 
+QString SUIT_ViewManager::getType() const
 { 
   return (!myViewModel)? "": myViewModel->getType(); 
 }
index 8cacbe253904f5fcf4996954577088b01fd6fa43..9fdd2ecd83f2341975db38d6bac413a884386654 100755 (executable)
@@ -59,12 +59,14 @@ public:
   int              getViewsCount() { return myViews.count(); }
   QPtrVector<SUIT_ViewWindow> getViews() { return myViews; }  
 
-  QString          getTitle() const { return myTitle;}
-  void             setTitle(QString theTitle) { myTitle = theTitle; }
+  QString          getTitle() const { return myTitle; }
+  virtual void     setTitle( const QString& );
 
   SUIT_ViewWindow* createViewWindow();
 
+  bool             isVisible() const;
   virtual void     setShown( const bool );
+  virtual void     setDestructiveClose( const bool );
 
 public slots:
   void             createView();
@@ -85,8 +87,8 @@ signals:
   
 protected slots:
   void             onWindowActivated(SUIT_ViewWindow*);
-  void             onDeleteView(SUIT_ViewWindow* theView);
-  void             onMousePressed(SUIT_ViewWindow* theView, QMouseEvent* theEvent);
+  void             onClosingView( SUIT_ViewWindow* );
+  void             onMousePressed(SUIT_ViewWindow*, QMouseEvent* );
   void             onDeleteStudy();
 
 private slots:
@@ -101,8 +103,14 @@ protected:
   /*! Removes the View from internal Views Vector.*/
   virtual void     removeView(SUIT_ViewWindow* theView);
   
+  /*! Close the specified View.*/
+  virtual void     closeView(SUIT_ViewWindow* theView);
+  
   /*! Used to set unique name for the view.*/
   virtual void     setViewName(SUIT_ViewWindow* theView);
+  QString          prepareTitle( const QString&, const int, const int );
+
+  static int       useNewId( const QString& );
 
 protected:
   SUIT_Desktop*               myDesktop;
@@ -110,8 +118,11 @@ protected:
   QPtrVector<SUIT_ViewWindow> myViews;
   SUIT_ViewWindow*            myActiveView;
 
+  int                         myId;
   QString                     myTitle;
   SUIT_Study*                 myStudy;
+
+  static QMap<QString, int>   _ViewMgrId;
 };
 
 #ifdef WIN32
index 0df3081c310cbcc28b42a47069f832054d6a6b77..faf064fb51486b4cdbf093c3a33d3379263b1d38 100755 (executable)
@@ -111,11 +111,22 @@ bool SUIT_ViewWindow::dumpViewToFormat( const QString& fileName, const QString&
   return dumpViewToFormat( dumpView(), fileName, format );
 }
 
+/*!
+  Set or clear flag Qt::WDestructiveClose
+*/
+void SUIT_ViewWindow::setDestructiveClose( const bool on )
+{
+  if ( on )
+    setWFlags( WDestructiveClose );
+  else
+    clearWFlags( WDestructiveClose );
+}
+
 /*! Close event \a theEvent.
 */
 void SUIT_ViewWindow::closeEvent(QCloseEvent* theEvent)
 {
-  QMainWindow::closeEvent( theEvent );
+//  QMainWindow::closeEvent( theEvent );
   emit closing( this );
 }
 
index 2e5eb7804028577bea7157c854b2d13c04a444da..6a6a6f86920a840d25c2f6915f6b607141d9903f 100755 (executable)
@@ -54,6 +54,8 @@ public:
   virtual QString   getVisualParameters();
   virtual void      setVisualParameters( const QString& parameters );
 
+  void              setDestructiveClose( const bool );
+
 public slots:
   virtual void      onDumpView();
 
index 17601209e658de52045cac501fe9344246b22e32..4166f2312798b694a3d560215849d6238b46055e 100644 (file)
@@ -57,6 +57,18 @@ endif
 LIBS+= -lsuit -lqtx
 LIBSFORBIN+= -lsuit -lqtx
 
+PLUGINDIR = $(top_builddir)/bin/salome/styles
+MYPLUGINDIR = styles
+
+$(MYPLUGINDIR): $(PLUGINDIR)
+       -$(RM) $@
+       ln -sf $< $@
+
+$(PLUGINDIR):
+       mkdir -p $@
+
+bin: $(MYPLUGINDIR)
+
 @CONCLUDE@
 
 
index f2d336449e5fe089b82cc6f4e3be8d2db6b7485a..2a5e7f03b39dbbb410383c69ac6fb72fb6bda5fb 100755 (executable)
 
 #include <qaction.h>
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 class SUPERVGRAPH_EXPORT SUPERVGraph_View: public QWidget, public SUIT_PopupClient {
   Q_OBJECT;
  public:
@@ -127,5 +131,10 @@ class SUPERVGRAPH_EXPORT SUPERVGraph_ViewFrame : public SUIT_ViewWindow {
   QToolBar*        myToolBar;
 
   SUPERVGraph_View* myView;
-}; 
+};
+
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 038fba118736ff3732a97e0e62ea4420022560ff..50db458282a6e86810830ade6ad681c47bb3da5e 100644 (file)
Binary files a/src/SUPERVGraph/resources/view_pan.png and b/src/SUPERVGraph/resources/view_pan.png differ
index 12850643e8c561aae15dc7c2990028d57ac9d1bf..7ba93b98f8d8483609b8655b3306038cade3d9ad 100644 (file)
Binary files a/src/SUPERVGraph/resources/view_reset.png and b/src/SUPERVGraph/resources/view_reset.png differ
index f45b583aa187d138a3a2ee12bce558538703d9bd..d2e6c224d83f36eb4f2c45c9d66b3cb73da7e8a0 100755 (executable)
@@ -55,7 +55,8 @@ EXPORT_HEADERS= \
        SVTK_SelectionEvent.h \
        SVTK_SpaceMouse.h \
        SVTK_Event.h \
-       SVTK_ViewModelBase.h
+       SVTK_ViewModelBase.h \
+       SVTK_Extension.h
 
 PO_FILES = \
        SVTK_msg_en.po \
@@ -74,6 +75,7 @@ LIB_SRC= \
        SVTK_NonIsometricDlg.cxx \
        SVTK_UpdateRateDlg.cxx \
        SVTK_CubeAxesDlg.cxx \
+       SVTK_SetRotationPointDlg.cxx \
        SVTK_DialogBase.cxx \
        SVTK_FontWidget.cxx \
        SVTK_Trihedron.cxx \
@@ -87,7 +89,8 @@ LIB_SRC= \
        SVTK_RenderWindowInteractor.cxx \
        SVTK_GenericRenderWindowInteractor.cxx \
        SVTK_SpaceMouse.cxx \
-       SVTK_Selector.cxx
+       SVTK_Selector.cxx \
+       SVTK_Extension.cxx
 
 LIB_MOC = \
        SVTK_GenericRenderWindowInteractor.h \
@@ -95,6 +98,7 @@ LIB_MOC = \
        SVTK_NonIsometricDlg.h \
        SVTK_UpdateRateDlg.h \
        SVTK_CubeAxesDlg.h \
+       SVTK_SetRotationPointDlg.h \
        SVTK_FontWidget.h \
        SVTK_DialogBase.h \
        SVTK_ViewModelBase.h \
index 03c4ca7a77f169a7a17b8ed4425aca4f6b685249..a44acc9fd35a369ded98aec4110e9889dc4572a3 100644 (file)
@@ -57,6 +57,10 @@ class SVTK_InteractorStyle;
 extern int SALOME_POINT_SIZE;
 extern int SALOME_LINE_WIDTH;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 //! The class is a basic one for all SALOME VTK presentation.
 /*!
   It provide highlight and prehighlight capabilites,
@@ -227,4 +231,8 @@ class SVTK_EXPORT SALOME_Actor : public VTKViewer_Actor
   vtkSmartPointer<vtkOutlineSource> myOutline;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif // SALOME_ACTOR_H
index bb7542da36249e8c73e3f9c070f8a8b3079b48a0..e0a8afc0297e825a62145403234cce2c6dbb7512 100644 (file)
@@ -34,6 +34,10 @@ class vtkUnstructuredGrid;
 
 class SALOME_Actor;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 //! This class used for internal SVTK package purpose (highlight and prehighlight)
 class SVTK_EXPORT SVTK_Actor : public SVTK_DeviceActor
 {
@@ -82,4 +86,8 @@ public:
   ~SVTK_Actor();
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index b9583c642ba6997e0f989f7401b4271c50974b4b..445f6d71e744ab0ed2fe832a0d29c66790715dcb 100644 (file)
@@ -44,6 +44,10 @@ class VTKViewer_Transform;
 #include "SVTK.h"
 #include "VTKViewer.h"
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 #ifndef WNT
 class VTK_HYBRID_EXPORT SVTK_CubeAxesActor2D : public vtkCubeAxesActor2D
 #else
@@ -106,4 +110,8 @@ private:
   void operator=(const SVTK_CubeAxesActor2D&);  // Not implemented.
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 1d8add18ff615b089c9852301eaaf41a60cde19c..e5ab58ff906637e76d6b9889a47e1dcca564921b 100644 (file)
@@ -249,8 +249,15 @@ SVTK_DeviceActor
 {
   if ( !myIsShrinkable ) 
     return;
+  
   if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
-  {
+  {     
+    aDataSet->Update();
+    int numCells=aDataSet->GetNumberOfCells();
+    int numPts = aDataSet->GetNumberOfPoints();
+    //It's impossible to use to apply "shrink" for "empty" dataset
+    if (numCells < 1 || numPts < 1)
+           return;
     myShrinkFilter->SetInput( aDataSet );
     myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() );
     myIsShrunk = true;
@@ -293,7 +300,6 @@ SVTK_DeviceActor
   myShrinkFilter->SetShrinkFactor(theValue);
 }
 
-
 /*!
   Set representation (VTK_SURFACE, VTK_POINTS, VTK_WIREFRAME and so on)
   param theMode - new mode
@@ -307,13 +313,17 @@ SVTK_DeviceActor
     switch(myRepresentation){
     case Points : 
     case Surface : 
-      myProperty->DeepCopy(GetProperty());
+      myProperty->SetAmbient(GetProperty()->GetAmbient());
+      myProperty->SetDiffuse(GetProperty()->GetDiffuse());
+      myProperty->SetSpecular(GetProperty()->GetSpecular());
     }
     
     switch(theMode){
     case Points : 
     case Surface : 
-      GetProperty()->DeepCopy(myProperty);
+      GetProperty()->SetAmbient(myProperty->GetAmbient());
+      GetProperty()->SetDiffuse(myProperty->GetDiffuse());
+      GetProperty()->SetSpecular(myProperty->GetSpecular());
       break;
     default:
       GetProperty()->SetAmbient(1.0);
@@ -490,3 +500,8 @@ SVTK_DeviceActor
   factor = myPolygonOffsetFactor;
   units = myPolygonOffsetUnits;
 }
+
+vtkDataSetMapper* SVTK_DeviceActor::GetDataSetMapper()
+{
+  return myMapper;
+}
index c68829de92886477771cefaa1d7fee2e7e668d42..fe89fdd072d26755655be58318ffba5fc1249473 100644 (file)
@@ -59,6 +59,9 @@ namespace SVTK
   }
 }
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
 
 class SVTK_EXPORT SVTK_DeviceActor: public vtkLODActor
 {
@@ -172,6 +175,8 @@ class SVTK_EXPORT SVTK_DeviceActor: public vtkLODActor
   void
   Render(vtkRenderer *, vtkMapper *);
 
+  vtkDataSetMapper* GetDataSetMapper();
+
  protected:
   SVTK::Representation::Type myRepresentation;
   vtkProperty *myProperty;
@@ -208,5 +213,8 @@ class SVTK_EXPORT SVTK_DeviceActor: public vtkLODActor
 
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
 
 #endif //SVTK_DEVICE_ACTOR_H
index fa415ab831145c7a1df22ba3ca8ca9f8564ea92f..00a9e2c0fbb68da9c80937ebf60d3583729353cc 100644 (file)
@@ -61,6 +61,14 @@ namespace SVTK
     StartGlobalPan,
     StartFitArea,
 
+    SetRotateGravity,
+    StartPointSelection,
+    SetRotateSelected,
+    
+    BBCenterChanged,
+    RotationPointChanged,
+    ChangeRotationPoint,
+        
     LastEvent
   };
 }
diff --git a/src/SVTK/SVTK_Extension.cxx b/src/SVTK/SVTK_Extension.cxx
new file mode 100755 (executable)
index 0000000..a26dac1
--- /dev/null
@@ -0,0 +1,44 @@
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//
+//  Copyright (C) 2004  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.salome-platform.org or email : webmaster.salome@opencascade.org 
+//
+//
+//
+//  File   : SVTK_Extension.cxx
+//  Author : Sergey ANIKIN
+//  Module : SALOME
+
+#include "SVTK_Extension.h"
+
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <dlfcn.h>
+#endif
+
+void* SVTK::getOpenGLExtension( const char* theExtension )
+{
+#ifdef WIN32
+  return wglGetProcAddress( theExtension );
+#else
+  void* OpenGLLibrary = dlopen( "libGL.so", RTLD_LAZY );
+  return dlsym( OpenGLLibrary, theExtension );
+#endif
+}
diff --git a/src/SVTK/SVTK_Extension.h b/src/SVTK/SVTK_Extension.h
new file mode 100755 (executable)
index 0000000..0b39e59
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright (C) 2005  OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License.
+// 
+// This library is distributed in the hope that it will be useful 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public  
+// License along with this library; if not, write to the Free Software 
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/
+//
+#ifndef SVTK_Extension_H
+#define SVTK_Extension_H
+
+/*!
+  \file SVTK_Extension.h
+  Functions of loading OpenGL extensions.
+*/
+
+#include <SVTK.h>
+
+namespace SVTK
+{
+  SVTK_EXPORT void* getOpenGLExtension( const char* theExtension );
+}
+
+
+#endif
index ed70aa2a7acc48a0660137a36958102d34e51749..953072a9446e6bb5c4291a8285ae9c09b3888aa5 100644 (file)
@@ -27,6 +27,8 @@
 #ifndef SVTK_FontWidget_H
 #define SVTK_FontWidget_H
 
+#include "SVTK.h"
+
 #include <qhbox.h>
 
 class QToolButton;
@@ -39,7 +41,7 @@ class QColor;
  * Class       : SVTK_FontWidget
  * Description : Dialog for specifynig font
  */
-class SVTK_FontWidget : public QHBox
+class SVTK_EXPORT SVTK_FontWidget : public QHBox
 {
   Q_OBJECT
 
index b47705d503da2e8d17355552cba7957d7b29c01b..ff5b6cb713d1549aab1c9aa7e87d80c3dd40c651 100644 (file)
@@ -41,6 +41,9 @@ class QWidget;
 class SVTK_Selector;
 class SVTK_Renderer;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
 
 /*!
   \class QVTK_GenericRenderWindowInteractor
@@ -123,4 +126,8 @@ class SVTK_EXPORT SVTK_GenericRenderWindowInteractor: public QVTK_GenericRenderW
   QWidget* myRenderWidget; //!< Keeps a pointer to QWidget, where vtkRenderWindow maps to.
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 4f8dfaa60858dfd927dca36eefc5b98c17b6b831..2746a24e6426b53d51b0ec8e4a87b0874e474f62 100644 (file)
@@ -36,6 +36,7 @@
 #include "SVTK_Event.h" 
 #include "SVTK_Selector.h"
 #include "SVTK_Functor.h"
+#include "SVTK_Actor.h"
 
 #include "VTKViewer_Algorithm.h"
 #include "SVTK_Functor.h"
 #include <vtkCamera.h>
 #include <vtkRenderer.h>
 #include <vtkPicker.h>
+#include <vtkPointPicker.h>
 #include <vtkRenderWindow.h>
 #include <vtkRenderWindowInteractor.h>
 #include <vtkCallbackCommand.h>
 #include <vtkRendererCollection.h>
+#include <vtkDataSet.h>
+#include <vtkPerspectiveTransform.h> 
+#include <vtkMatrix4x4.h>
 
 #include <qapplication.h>
 #include <qpixmap.h>
@@ -62,6 +67,8 @@
 //VRV: porting on Qt 3.0.5
 #include <algorithm>
 
+#include <iostream>
+
 using namespace std;
 
 namespace
@@ -107,12 +114,17 @@ SVTK_InteractorStyle
 ::SVTK_InteractorStyle():
   mySelectionEvent(new SVTK_SelectionEvent()),
   myPicker(vtkPicker::New()),
+  myPointPicker(vtkPointPicker::New()),
   myLastHighlitedActor(NULL),
   myLastPreHighlitedActor(NULL),
   myControllerIncrement(SVTK_ControllerIncrement::New()),
-  myControllerOnKeyDown(SVTK_ControllerOnKeyDown::New())
+  myControllerOnKeyDown(SVTK_ControllerOnKeyDown::New()),
+  myHighlightRotationPointActor(SVTK_Actor::New())
 {
   myPicker->Delete();
+  myPointPicker->Delete();
+
+  myPointPicker->SetTolerance(0.025);
 
   this->MotionFactor = 10.0;
   this->State = VTK_INTERACTOR_STYLE_CAMERA_NONE;
@@ -131,6 +143,20 @@ SVTK_InteractorStyle
   //
   myControllerIncrement->Delete();
   myControllerOnKeyDown->Delete();
+
+  myCurrRotationPointType = SVTK::SetRotateGravity;
+  myPrevRotationPointType = myCurrRotationPointType;
+
+  myHighlightRotationPointActor->Delete();
+  myHighlightRotationPointActor->Initialize();
+  myHighlightRotationPointActor->PickableOff();
+  myHighlightRotationPointActor->SetVisibility( false );
+  
+  myHighlightRotationPointActor->GetProperty()->SetPointSize(SALOME_POINT_SIZE+2);
+  myHighlightRotationPointActor->GetProperty()->SetLineWidth(SALOME_LINE_WIDTH+2);
+  myHighlightRotationPointActor->GetProperty()->SetRepresentationToPoints();
+
+  myBBFirstCheck = true;
 }
 
 /*!
@@ -205,7 +231,7 @@ void
 SVTK_InteractorStyle
 ::RotateXY(int dx, int dy)
 {
-  if(GetCurrentRenderer() == NULL)
+  /*   if(GetCurrentRenderer() == NULL)
     return;
   
   int *size = GetCurrentRenderer()->GetRenderWindow()->GetSize();
@@ -222,6 +248,61 @@ SVTK_InteractorStyle
 
   GetCurrentRenderer()->ResetCameraClippingRange(); 
 
+  this->Render();*/
+
+  if(GetCurrentRenderer() == NULL)
+    return;
+  
+  vtkCamera *cam = GetCurrentRenderer()->GetActiveCamera();
+
+  double viewFP[3], viewPos[3];
+  cam->GetFocalPoint(viewFP);
+  cam->GetPosition(viewPos);
+
+  if ( myCurrRotationPointType == SVTK::SetRotateGravity )
+  {
+    vtkFloatingPointType aCenter[3];
+    if ( ComputeBBCenter(GetCurrentRenderer(),aCenter) ) 
+    {
+      myRotationPointX = aCenter[0];
+      myRotationPointY = aCenter[1];
+      myRotationPointZ = aCenter[2];
+    }
+  }
+
+  // Calculate corresponding transformation
+  vtkPerspectiveTransform* aTransform = vtkPerspectiveTransform::New();
+  aTransform->Identity();
+  aTransform->Translate(+myRotationPointX, +myRotationPointY, +myRotationPointZ);
+
+  // Azimuth transformation
+  int *size = GetCurrentRenderer()->GetRenderWindow()->GetSize();
+  double aDeltaAzimuth = -20.0 / size[0];
+  
+  double rxf = double(dx) * aDeltaAzimuth * this->MotionFactor;
+  aTransform->RotateWXYZ(rxf, cam->GetViewUp());
+
+  // Elevation transformation
+  double aDeltaElevation = -20.0 / size[1];
+
+  double ryf = double(dy) * aDeltaElevation * this->MotionFactor;
+  vtkMatrix4x4* aMatrix = cam->GetViewTransformMatrix();
+  const double anAxis[3] = {-aMatrix->GetElement(0,0), // mkr : 27.11.2006 : PAL14011 - Strange behaviour in rotation in VTK Viewer.
+                           -aMatrix->GetElement(0,1), 
+                           -aMatrix->GetElement(0,2)};
+  
+  aTransform->RotateWXYZ(ryf, anAxis);
+            
+  aTransform->Translate(-myRotationPointX, -myRotationPointY, -myRotationPointZ);
+
+  // To apply the transformation
+  cam->SetPosition(aTransform->TransformPoint(viewPos));
+  cam->SetFocalPoint(aTransform->TransformPoint(viewFP));
+
+  cam->OrthogonalizeViewUp();
+
+  GetCurrentRenderer()->ResetCameraClippingRange(); 
+
   this->Render();
 }
 
@@ -431,9 +512,54 @@ SVTK_InteractorStyle
   } else {
     if (ctrl)
       startOperation(VTK_INTERACTOR_STYLE_CAMERA_ZOOM);
+    else if ( myCurrRotationPointType == SVTK::StartPointSelection )
+    {
+      SVTK_SelectionEvent* aSelectionEvent = GetSelectionEventFlipY();
+      myPicker->Pick(aSelectionEvent->myX, 
+                    aSelectionEvent->myY, 
+                    0.0, 
+                    GetCurrentRenderer());
+      if ( SALOME_Actor* anActor = GetFirstSALOMEActor(myPicker.GetPointer()) )
+      {
+       myPointPicker->Pick( aSelectionEvent->myX,
+                            aSelectionEvent->myY, 
+                            0.0, 
+                            GetCurrentRenderer() );
+       int aVtkId = myPointPicker->GetPointId();
+       if ( aVtkId >= 0 )
+       {
+         int anObjId = anActor->GetNodeObjId( aVtkId );
+         vtkFloatingPointType* aCoords = anActor->GetNodeCoord(anObjId);
+         
+         myCurrRotationPointType = SVTK::SetRotateSelected;
+         
+         // invoke event for update coordinates in SVTK_SetRotationPointDlg
+         InvokeEvent(SVTK::RotationPointChanged,(void*)aCoords);
+       }
+       else
+       {
+         // invoke event with no data (for SVTK_SetRotationPointDlg)
+         InvokeEvent(SVTK::RotationPointChanged,0);
+         myCurrRotationPointType = myPrevRotationPointType;
+       }
+      }
+      else
+      {
+       // invoke event with no data (for SVTK_SetRotationPointDlg)
+       InvokeEvent(SVTK::RotationPointChanged,0);
+       myCurrRotationPointType = myPrevRotationPointType;
+      }
+    
+      myHighlightRotationPointActor->SetVisibility( false );
+      if(GetCurrentRenderer() != NULL)
+       GetCurrentRenderer()->RemoveActor( myHighlightRotationPointActor.GetPointer() );
+
+      GetRenderWidget()->setCursor(myDefCursor); 
+    }
     else
       startOperation(VTK_INTERACTOR_STYLE_CAMERA_SELECT);
   }
+  
   return;
 }
 
@@ -696,6 +822,26 @@ SVTK_InteractorStyle
   ForcedState = VTK_INTERACTOR_STYLE_CAMERA_ROTATE;
 }
 
+/*!
+  Set rotation point selected by user
+*/
+void 
+SVTK_InteractorStyle
+::startPointSelection()
+{
+  myCurrRotationPointType = SVTK::StartPointSelection;
+
+  if(GetCurrentRenderer() != NULL) {
+    GetCurrentRenderer()->AddActor( myHighlightRotationPointActor.GetPointer() );
+    vtkFloatingPointType aColor[3];
+    GetCurrentRenderer()->GetBackground( aColor );
+    myHighlightRotationPointActor->GetProperty()->SetColor(1. - aColor[0],
+                                                          1. - aColor[1],
+                                                          1. - aColor[2]);
+  }
+
+  setCursor(VTK_INTERACTOR_STYLE_CAMERA_NONE);
+}
 
 /*! 
   Starts Spin operation (e.g. through menu command)
@@ -863,7 +1009,10 @@ SVTK_InteractorStyle
       break;
     case VTK_INTERACTOR_STYLE_CAMERA_NONE:
     default:
-      GetRenderWidget()->setCursor(myDefCursor); 
+      if ( myCurrRotationPointType == SVTK::StartPointSelection )
+       GetRenderWidget()->setCursor(myHandCursor);
+      else
+       GetRenderWidget()->setCursor(myDefCursor); 
       myCursorState = false;
       break;
   }
@@ -942,51 +1091,58 @@ SVTK_InteractorStyle
         fitRect(x1, y1, x2, y2);
       }
       else {
-        if (myPoint == myOtherPoint) {
-         // process point selection
-          this->FindPokedRenderer(aSelectionEvent->myX, aSelectionEvent->myY);
-         Interactor->StartPickCallback();
-
-          myPicker->Pick(aSelectionEvent->myX, 
-                        aSelectionEvent->myY, 
-                        0.0, 
-                        GetCurrentRenderer());
-         //
-         SALOME_Actor* anActor = GetFirstSALOMEActor(myPicker.GetPointer());
-         aSelectionEvent->myIsRectangle = false;
-
-         if(!myShiftState)
-           GetSelector()->ClearIObjects();
-
-         if(anActor){
-           anActor->Highlight( this, aSelectionEvent, true );
-         }else{
-           if(myLastHighlitedActor.GetPointer() && myLastHighlitedActor.GetPointer() != anActor)
-             myLastHighlitedActor->Highlight( this, aSelectionEvent, false );
-         }
-         myLastHighlitedActor = anActor;
-       } 
-       else {
-          //processing rectangle selection
-         Interactor->StartPickCallback();
-         GetSelector()->StartPickCallback();
-         aSelectionEvent->myIsRectangle = true;
-
-         if(!myShiftState)
-           GetSelector()->ClearIObjects();
-
-         vtkActorCollection* aListActors = GetCurrentRenderer()->GetActors();
-         aListActors->InitTraversal();
-         while(vtkActor* aActor = aListActors->GetNextActor()){
-           if(aActor->GetVisibility()){
-             if(SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast(aActor)){
-               if(aSActor->hasIO()){
-                 aSActor->Highlight( this, aSelectionEvent, true );
-               }
+        if (myPoint == myOtherPoint)
+         {
+           // process point selection
+           this->FindPokedRenderer(aSelectionEvent->myX, aSelectionEvent->myY);
+           Interactor->StartPickCallback();
+           
+           myPicker->Pick(aSelectionEvent->myX, 
+                          aSelectionEvent->myY, 
+                          0.0, 
+                          GetCurrentRenderer());
+           //
+           SALOME_Actor* anActor = GetFirstSALOMEActor(myPicker.GetPointer());
+           aSelectionEvent->myIsRectangle = false;
+
+           if(!myShiftState)
+             GetSelector()->ClearIObjects();
+
+           if(anActor)
+             {
+               anActor->Highlight( this, aSelectionEvent, true );
+             }
+           else
+             {
+               if(myLastHighlitedActor.GetPointer() && myLastHighlitedActor.GetPointer() != anActor)
+                 myLastHighlitedActor->Highlight( this, aSelectionEvent, false );
+               myLastHighlitedActor = anActor;
+             }
+         } 
+       else 
+         {
+           //processing rectangle selection
+           Interactor->StartPickCallback();
+           GetSelector()->StartPickCallback();
+           aSelectionEvent->myIsRectangle = true;
+
+           if(!myShiftState)
+             GetSelector()->ClearIObjects();
+
+           vtkActorCollection* aListActors = GetCurrentRenderer()->GetActors();
+           aListActors->InitTraversal();
+           while(vtkActor* aActor = aListActors->GetNextActor())
+             {
+               if(aActor->GetVisibility())
+                 {
+                   if(SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast(aActor))
+                     {
+                       if(aSActor->hasIO())
+                         aSActor->Highlight( this, aSelectionEvent, true );
+                     }
+                 }
              }
-           }
          }
-       }
        Interactor->EndPickCallback();
        GetSelector()->EndPickCallback();
       } 
@@ -1089,13 +1245,43 @@ SVTK_InteractorStyle
                 GetCurrentRenderer());
   
   SALOME_Actor *anActor = GetFirstSALOMEActor(myPicker.GetPointer());
-  if (anActor){
-    anIsChanged |= anActor->PreHighlight( this, aSelectionEvent, true );
+
+  if ( myCurrRotationPointType == SVTK::StartPointSelection )
+  {
+    myHighlightRotationPointActor->SetVisibility( false );
+
+    SALOME_Actor *anCurrActor;
+    if ( anActor ) anCurrActor = anActor;
+    else if ( myLastPreHighlitedActor.GetPointer() 
+             && 
+             myLastPreHighlitedActor.GetPointer() != anActor )
+      anCurrActor = myLastPreHighlitedActor.GetPointer();
+    if ( anCurrActor )
+    {
+      myPointPicker->Pick( aSelectionEvent->myX, aSelectionEvent->myY, 0.0, GetCurrentRenderer() );
+      int aVtkId = myPointPicker->GetPointId();
+      if ( aVtkId >= 0 ) {
+       int anObjId = anActor->GetNodeObjId( aVtkId );
+
+       TColStd_IndexedMapOfInteger aMapIndex;
+       aMapIndex.Add( anObjId );
+       myHighlightRotationPointActor->MapPoints( anActor, aMapIndex );
+
+       myHighlightRotationPointActor->SetVisibility( true );
+       anIsChanged = true;
+      }
+    }
   }
+  else {
+    if (anActor){
+      anIsChanged |= anActor->PreHighlight( this, aSelectionEvent, true );
+    }
 
-  if(myLastPreHighlitedActor.GetPointer() && myLastPreHighlitedActor.GetPointer() != anActor)
-    anIsChanged |= myLastPreHighlitedActor->PreHighlight( this, aSelectionEvent, false );   
+    if(myLastPreHighlitedActor.GetPointer() && myLastPreHighlitedActor.GetPointer() != anActor)
+      anIsChanged |= myLastPreHighlitedActor->PreHighlight( this, aSelectionEvent, false );   
 
+  }
+  
   myLastPreHighlitedActor = anActor;
 
   if(anIsChanged)
@@ -1225,6 +1411,11 @@ SVTK_InteractorStyle
     theInteractor->AddObserver( SVTK::StartRotate, EventCallbackCommand, Priority );
     theInteractor->AddObserver( SVTK::StartGlobalPan, EventCallbackCommand, Priority );
     theInteractor->AddObserver( SVTK::StartFitArea, EventCallbackCommand, Priority );
+
+    theInteractor->AddObserver( SVTK::SetRotateGravity, EventCallbackCommand, Priority );
+    theInteractor->AddObserver( SVTK::StartPointSelection, EventCallbackCommand, Priority );
+
+    theInteractor->AddObserver( SVTK::ChangeRotationPoint, EventCallbackCommand, Priority );
   }
 }
 
@@ -1237,6 +1428,30 @@ SVTK_InteractorStyle
 {
   //vtkInteractorStyle::OnTimer();
   this->Interactor->Render();
+  // check if bounding box was changed
+  if ( GetCurrentRenderer() )
+  {
+    vtkFloatingPointType aCurrBBCenter[3];
+    if ( ComputeBBCenter(GetCurrentRenderer(),aCurrBBCenter) )
+    {
+      if ( !myBBFirstCheck )
+      {
+       if ( fabs(aCurrBBCenter[0]-myBBCenter[0]) > 1e-38 ||
+            fabs(aCurrBBCenter[1]-myBBCenter[1]) > 1e-38 ||
+            fabs(aCurrBBCenter[2]-myBBCenter[2]) > 1e-38 ) {
+         // bounding box was changed => send SVTK::RotationPointChanged event
+         // invoke event for update coordinates in SVTK_SetRotationPointDlg
+         InvokeEvent(SVTK::BBCenterChanged,(void*)aCurrBBCenter);
+         for ( int i =0; i < 3; i++) myBBCenter[i] = aCurrBBCenter[i];
+       }
+      }
+      else 
+      {
+       for ( int i =0; i < 3; i++) myBBCenter[i] = aCurrBBCenter[i];
+       myBBFirstCheck = false;
+      }
+    }
+  }
 }
 
 /*!
@@ -1299,6 +1514,8 @@ SVTK_InteractorStyle
     vtkObject* anObject = reinterpret_cast<vtkObject*>( clientData );
     SVTK_InteractorStyle* self = dynamic_cast<SVTK_InteractorStyle*>( anObject );
     int aSpeedIncrement=self->ControllerIncrement()->Current();
+    vtkFloatingPointType aCenter[3];
+    vtkFloatingPointType* aSelectedPoint;
     if ( self ) {
       switch ( event ) {
       case SVTK::SpaceMouseMoveEvent : 
@@ -1372,6 +1589,40 @@ SVTK_InteractorStyle
       case SVTK::StartFitArea:
        self->startFitArea();
        return;
+
+      case SVTK::SetRotateGravity:
+       if ( self->myCurrRotationPointType == SVTK::StartPointSelection )
+       {
+         self->myHighlightRotationPointActor->SetVisibility( false );
+         if( self->GetCurrentRenderer() != NULL )
+           self->GetCurrentRenderer()->RemoveActor( self->myHighlightRotationPointActor.GetPointer() );
+         self->GetRenderWidget()->setCursor(self->myDefCursor); 
+       }
+       self->myPrevRotationPointType = self->myCurrRotationPointType;
+       self->myCurrRotationPointType = SVTK::SetRotateGravity;
+       if ( ComputeBBCenter(self->GetCurrentRenderer(),aCenter) ) 
+         // invoke event for update coordinates in SVTK_SetRotationPointDlg
+         self->InvokeEvent(SVTK::BBCenterChanged,(void*)aCenter);
+       return;
+      case SVTK::StartPointSelection:
+       self->startPointSelection();
+       return;
+
+      case SVTK::ChangeRotationPoint:
+       if ( self->myCurrRotationPointType == SVTK::StartPointSelection )
+       {
+         self->myHighlightRotationPointActor->SetVisibility( false );
+         if( self->GetCurrentRenderer() != NULL )
+           self->GetCurrentRenderer()->RemoveActor( self->myHighlightRotationPointActor.GetPointer() );
+         self->GetRenderWidget()->setCursor(self->myDefCursor); 
+       }
+       self->myPrevRotationPointType = self->myCurrRotationPointType;
+       self->myCurrRotationPointType = SVTK::SetRotateSelected;
+       aSelectedPoint = (vtkFloatingPointType*)callData;
+       self->myRotationPointX = aSelectedPoint[0];
+       self->myRotationPointY = aSelectedPoint[1];
+       self->myRotationPointZ = aSelectedPoint[2];
+       return;
       }
     }
   }
index 064b6a2dedb912cca326eb45af3aa828f9235713..dec8c0a0db4e2aad479f2c9302feb33fb858ac8a 100644 (file)
 #include <map>
 
 #include <vtkObject.h>
+
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 //
 //! Control the value of increment  in SALOME way.
 /*!
   This class controls of value of increment,
   for pan/rotate/zoom operations in SALOME way
 */
-class SVTK_ControllerIncrement : public vtkObject{
+class SVTK_EXPORT SVTK_ControllerIncrement : public vtkObject{
  public:
   vtkTypeMacro(SVTK_ControllerIncrement, vtkObject);
   static SVTK_ControllerIncrement* New();
@@ -81,7 +86,7 @@ class SVTK_ControllerIncrement : public vtkObject{
   This class controls the behaviour of KeyDown event
   in SALOME way
 */
-class SVTK_ControllerOnKeyDown : public vtkObject{
+class SVTK_EXPORT SVTK_ControllerOnKeyDown : public vtkObject{
  public:
   vtkTypeMacro(SVTK_ControllerOnKeyDown, vtkObject);
   static SVTK_ControllerOnKeyDown* New();
@@ -100,11 +105,13 @@ class SVTK_ControllerOnKeyDown : public vtkObject{
 
 class vtkCell;
 class vtkPicker;
+class vtkPointPicker;
 
 class SALOME_Actor;
 
 class SVTK_Selector;
 class SVTK_GenericRenderWindowInteractor;
+class SVTK_Actor;
 
 #define VTK_INTERACTOR_STYLE_CAMERA_NONE    0
 #define VTK_INTERACTOR_STYLE_CAMERA_ROTATE  1
@@ -114,6 +121,7 @@ class SVTK_GenericRenderWindowInteractor;
 #define VTK_INTERACTOR_STYLE_CAMERA_FIT        5
 #define VTK_INTERACTOR_STYLE_CAMERA_SELECT     6
 #define VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN 7
+#define VTK_INTERACTOR_STYLE_CAMERA_SELECT_ROTATION_POINT 8
 
 //! Introduce SALOME way of user interaction
 /*!
@@ -220,7 +228,7 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   
   SVTK_Selector* GetSelector();
 
- protected:
 protected:
   SVTK_InteractorStyle();
   ~SVTK_InteractorStyle();
 
@@ -273,6 +281,8 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   void startFitArea();
   void startSpin();
 
+  void startPointSelection();
+
  protected:
   void loadCursors();
   void startOperation(int operation);
@@ -320,6 +330,23 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   PSelectionEvent mySelectionEvent;
 
   vtkSmartPointer<vtkPicker> myPicker;
+
+  unsigned long                   myCurrRotationPointType;
+  unsigned long                   myPrevRotationPointType;
+
+  double                          myRotationPointX;
+  double                          myRotationPointY;
+  double                          myRotationPointZ;
+
+  vtkSmartPointer<SVTK_Actor>     myHighlightRotationPointActor;
+  vtkSmartPointer<vtkPointPicker> myPointPicker;
+  
+  vtkFloatingPointType            myBBCenter[3];
+  bool                            myBBFirstCheck;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 8493b172163d26ce49d3e78c4a91da75000334a4..045a05453c584528882fefb33b6c06923a01eb83 100644 (file)
 #include "SVTK_NonIsometricDlg.h"
 #include "SVTK_UpdateRateDlg.h"
 #include "SVTK_CubeAxesDlg.h"
+#include "SVTK_SetRotationPointDlg.h"
 
 #include "SVTK_MainWindow.h"
 #include "SVTK_Event.h"
 #include "SVTK_Renderer.h"
 #include "SVTK_RenderWindowInteractor.h"
+#include "SVTK_InteractorStyle.h"
 
 #include "SVTK_Selector.h"
 
@@ -91,6 +93,7 @@ SVTK_MainWindow
   myUpdateRateDlg = new SVTK_UpdateRateDlg(myActionsMap[UpdateRate],this,"SVTK_UpdateRateDlg");
   myNonIsometricDlg = new SVTK_NonIsometricDlg(myActionsMap[NonIsometric],this,"SVTK_NonIsometricDlg");
   myCubeAxesDlg = new SVTK_CubeAxesDlg(myActionsMap[GraduatedAxes],this,"SVTK_CubeAxesDlg");
+  mySetRotationPointDlg = new SVTK_SetRotationPointDlg(myActionsMap[ChangeRotationPointId],this,"SVTK_SetRotationPointDlg");
 }
 
 /*!
@@ -143,6 +146,9 @@ SVTK_MainWindow
     GetRenderer()->OnAdjustTrihedron();
 
   GetInteractor()->update();
+
+  if ( (SVTK_InteractorStyle*)GetInteractorStyle() )
+    ((SVTK_InteractorStyle*)GetInteractorStyle())->OnTimer();
 }
 
 /*!
@@ -463,6 +469,15 @@ SVTK_MainWindow
   connect(anAction, SIGNAL(activated()), this, SLOT(activateGlobalPanning()));
   myActionsMap[ GlobalPanId ] = anAction;
 
+  // Change rotation point
+  anAction = new QtxAction(tr("MNU_CHANGINGROTATIONPOINT_VIEW"), 
+                          theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_ROTATION_POINT" ) ),
+                          tr( "MNU_CHANGINGROTATIONPOINT_VIEW" ), 0, this);
+  anAction->setStatusTip(tr("DSC_CHANGINGROTATIONPOINT_VIEW"));
+  anAction->setToggleAction(true);
+  connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onChangeRotationPoint(bool)));
+  myActionsMap[ ChangeRotationPointId ] = anAction;
+
   // Rotation
   anAction = new QtxAction(tr("MNU_ROTATE_VIEW"), 
                           theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_VTKVIEWER_VIEW_ROTATE" ) ),
@@ -581,6 +596,8 @@ SVTK_MainWindow
   aPanningBtn->AddAction(myActionsMap[PanId]);
   aPanningBtn->AddAction(myActionsMap[GlobalPanId]);
 
+  myActionsMap[ChangeRotationPointId]->addTo(myToolBar);
+
   myActionsMap[RotationId]->addTo(myToolBar);
 
   SUIT_ToolButton* aViewsBtn = new SUIT_ToolButton(myToolBar);
@@ -648,6 +665,52 @@ SVTK_MainWindow
   myEventDispatcher->InvokeEvent(SVTK::StartRotate,0);
 }
 
+/*!
+  Change rotation point
+*/
+void
+SVTK_MainWindow
+::onChangeRotationPoint(bool theIsActivate)
+{
+  if(theIsActivate){
+    mySetRotationPointDlg->addObserver();
+    if ( mySetRotationPointDlg->IsFirstShown() )
+      activateSetRotationGravity();
+    mySetRotationPointDlg->show();
+  }else
+    mySetRotationPointDlg->hide();
+}
+
+/*!
+  Set the gravity center as a rotation point
+*/
+void
+SVTK_MainWindow
+::activateSetRotationGravity()
+{
+  myEventDispatcher->InvokeEvent(SVTK::SetRotateGravity,0);
+}
+
+/*!
+  Set the selected point as a rotation point
+*/
+void
+SVTK_MainWindow
+::activateSetRotationSelected(void* theData)
+{
+  myEventDispatcher->InvokeEvent(SVTK::ChangeRotationPoint,theData);
+}
+
+/*!
+  Set the point selected by user as a rotation point
+*/
+void
+SVTK_MainWindow
+::activateStartPointSelection()
+{
+  myEventDispatcher->InvokeEvent(SVTK::StartPointSelection,0);
+}
+
 /*!
   Starts global panning transformation
 */
index 6533ff8cbd95862c525313c9430168814291ff33..1be95b652af5177c2d7460454729769ae9d1c819 100644 (file)
@@ -46,6 +46,7 @@ class SVTK_NonIsometricDlg;
 class SVTK_UpdateRateDlg;
 class SVTK_CubeAxesActor2D;
 class SVTK_CubeAxesDlg;
+class SVTK_SetRotationPointDlg;
 
 class VTKViewer_Trihedron;
 class VTKViewer_Transform;
@@ -207,6 +208,12 @@ public:
   void activatePanning(); 
   void activateGlobalPanning(); 
 
+  void onChangeRotationPoint(bool theIsActivate);
+
+  void activateSetRotationGravity();
+  void activateSetRotationSelected(void* theData);
+  void activateStartPointSelection();
+
   void onFrontView(); 
   void onBackView(); 
   void onTopView();
@@ -240,7 +247,8 @@ public:
   void
   SetEventDispatcher(vtkObject* theDispatcher);
 
-  enum { DumpId, FitAllId, FitRectId, ZoomId, PanId, GlobalPanId, RotationId,
+  enum { DumpId, FitAllId, FitRectId, ZoomId, PanId, GlobalPanId, 
+        ChangeRotationPointId, RotationId,
          FrontId, BackId, TopId, BottomId, LeftId, RightId, ResetId, 
         ViewTrihedronId, NonIsometric, GraduatedAxes, UpdateRate};
   typedef QMap<int, QtxAction*> TActionsMap;
@@ -250,6 +258,7 @@ public:
   SVTK_NonIsometricDlg* myNonIsometricDlg;
   SVTK_UpdateRateDlg* myUpdateRateDlg;
   SVTK_CubeAxesDlg* myCubeAxesDlg;
+  SVTK_SetRotationPointDlg* mySetRotationPointDlg;
 
   vtkSmartPointer<vtkObject> myEventDispatcher;
   TActionsMap myActionsMap;  
index d70ed0a1a2934512aefc1e82e6a3b3b8b736d1aa..3a6576edb04ec5eef0dbfbb9d3ffb230fc941978 100644 (file)
 
 class vtkRenderer;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*! \class vtkAbstractPropPicker
  * \brief For more information see <a href="http://www.vtk.org/">VTK documentation
  */
@@ -117,6 +121,10 @@ class SVTK_EXPORT SVTK_RectPicker : public vtkAbstractPropPicker
        vtkRenderer*);
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
 
 
index 920f93e9936c0d7fd22c0ca3aeeabfb89d3edea9..647fbc5548f9f6f30cba258da30982a255c21bb8 100644 (file)
@@ -88,13 +88,13 @@ void
 QVTK_RenderWindowInteractor
 ::Initialize(vtkGenericRenderWindowInteractor* theDevice)
 {
-  if(GetDevice())
-    myDevice->SetRenderWindow(NULL);
+  if ( GetDevice() )
+    myDevice->SetRenderWindow( NULL );
 
   myDevice = theDevice;
 
-  if(theDevice)
-    theDevice->SetRenderWindow(getRenderWindow());
+  if ( theDevice )
+    theDevice->SetRenderWindow( getRenderWindow() );
 }
 
 /*!
@@ -103,9 +103,11 @@ QVTK_RenderWindowInteractor
 QVTK_RenderWindowInteractor
 ::~QVTK_RenderWindowInteractor() 
 {
-  if(SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance())
-    if(aSpaceMouse->isSpaceMouseOn())
-      aSpaceMouse->close(x11Display());
+#ifndef WIN32
+  SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance();
+  if ( aSpaceMouse && aSpaceMouse->isSpaceMouseOn() )
+    aSpaceMouse->close( x11Display() );
+#endif
 }
 
 
@@ -159,7 +161,7 @@ QVTK_RenderWindowInteractor
 {
   // Final initialization just before the widget is displayed
   GetDevice()->SetSize(width(),height());
-  if(!GetDevice()->GetInitialized()){
+  if(!GetDevice()->GetInitialized() && GetDevice()->GetRenderWindow()){
     GetDevice()->Initialize();
     GetDevice()->ConfigureEvent();
   }
@@ -368,14 +370,19 @@ QVTK_RenderWindowInteractor
 {
   QWidget::focusInEvent( event );
 
+#ifndef WIN32
   // register set space mouse events receiver
-  if(SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance()){
-    if(!aSpaceMouse->isSpaceMouseOn()) {// initialize 3D space mouse driver 
-      aSpaceMouse->initialize(x11Display(),winId());
-    }else{
-      aSpaceMouse->setWindow(x11Display(),winId());
-    }
+  SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance();
+
+  if ( aSpaceMouse )
+  {
+    if ( !aSpaceMouse->isSpaceMouseOn() )
+      // initialize 3D space mouse driver 
+      aSpaceMouse->initialize( x11Display(), winId() );
+    else
+      aSpaceMouse->setWindow( x11Display(), winId() );
   }
+#endif
 }
 
 /*!
@@ -388,13 +395,27 @@ QVTK_RenderWindowInteractor
 {
   QWidget::focusOutEvent( event );
 
+#ifndef WIN32
   // unregister set space mouse events receiver
-  if(SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance()){
-    if(aSpaceMouse->isSpaceMouseOn())
-      aSpaceMouse->setWindow(x11Display(),0);
-  }
+  SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance();
+  if ( aSpaceMouse && aSpaceMouse->isSpaceMouseOn() )
+    aSpaceMouse->setWindow( x11Display(), 0 );
+#endif
+}
+
+
+#ifdef WIN32
+
+/*!
+  To handle native Win32 events (from such devices as SpaceMouse)
+*/
+bool QVTK_RenderWindowInteractor::winEvent( MSG* msg )
+{
+  // TODO: Implement event handling for SpaceMouse
+  return QWidget::winEvent( msg );
 }
 
+#else
 
 /*!
   To handle native X11 events (from such devices as SpaceMouse)
@@ -404,19 +425,22 @@ QVTK_RenderWindowInteractor
 ::x11Event( XEvent *xEvent )
 {
   // handle 3d space mouse events
-  if(SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance()){
-    if(aSpaceMouse->isSpaceMouseOn() && xEvent->type == ClientMessage){
+  if ( SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance() )
+  {
+    if ( aSpaceMouse->isSpaceMouseOn() && xEvent->type == ClientMessage )
+    {
       SVTK_SpaceMouse::MoveEvent anEvent;
       int type = aSpaceMouse->translateEvent( x11Display(), xEvent, &anEvent, 1.0, 1.0 );
-      switch( type ){
-      case SVTK_SpaceMouse::SpaceMouseMove : 
-       GetDevice()->InvokeEvent(SVTK::SpaceMouseMoveEvent, anEvent.data );
-       break;
-      case SVTK_SpaceMouse::SpaceButtonPress :
-       GetDevice()->InvokeEvent( SVTK::SpaceMouseButtonEvent, &anEvent.button );
-       break;
-      case SVTK_SpaceMouse::SpaceButtonRelease :
-       break;
+      switch ( type )
+      {
+      case SVTK_SpaceMouse::SpaceMouseMove:
+             GetDevice()->InvokeEvent( SVTK::SpaceMouseMoveEvent, anEvent.data );
+             break;
+      case SVTK_SpaceMouse::SpaceButtonPress:
+             GetDevice()->InvokeEvent( SVTK::SpaceMouseButtonEvent, &anEvent.button );
+             break;
+      case SVTK_SpaceMouse::SpaceButtonRelease:
+             break;
       }
       return true; // stop handling the event
     }
@@ -425,6 +449,8 @@ QVTK_RenderWindowInteractor
   return QWidget::x11Event( xEvent );
 }
 
+#endif
+
 /*!
   Constructor
 */
index d91db66a6d10c47fa7939966348395b677b768df..dd6a525027712eb317fbbd0035323b7a0444af83 100644 (file)
@@ -52,6 +52,10 @@ class vtkObject;
 class SVTK_Selector;
 class SVTK_Renderer;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*!
   \class QVTK_RenderWindowInteractor
   Implements Qt based vtkRenderWindowInteractor.
@@ -116,8 +120,12 @@ class SVTK_EXPORT QVTK_RenderWindowInteractor: public QWidget
   virtual void focusInEvent( QFocusEvent* );
   virtual void focusOutEvent( QFocusEvent* );
 
-  //! To handle native X11 events (from such devices as SpaceMouse)
+  //! To handle native events (from such devices as SpaceMouse)
+#ifdef WIN32
+  virtual bool winEvent( MSG* );
+#else
   virtual bool x11Event( XEvent *e );
+#endif
 
   vtkSmartPointer<vtkRenderWindow> myRenderWindow;
   vtkSmartPointer<vtkGenericRenderWindowInteractor> myDevice;
@@ -249,5 +257,8 @@ class SVTK_EXPORT SVTK_RenderWindowInteractor: public QVTK_RenderWindowInteracto
   TInteractorStyles myInteractorStyles;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
 
 #endif
index 6683cf384181aeb0ea618394609b279b31f5846d..3e44d5fe4d5f779fec6b3b8d6a2da2c5e0c84188 100644 (file)
@@ -52,6 +52,9 @@ class SVTK_CubeAxesActor2D;
 class VTKViewer_Actor;
 class SVTK_Selector;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
 
 /*! 
   \class SVTK_Renderer
@@ -248,4 +251,8 @@ class SVTK_EXPORT SVTK_Renderer : public vtkObject
   vtkFloatingPointType myBndBox[6];
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 78c94989d531f51a6a8eb21682456e7e94d828cd..d93bd4b448f7e24a1786cf20dd21bc01bdb6338f 100644 (file)
@@ -280,16 +280,13 @@ SVTK_SelectorDef
   TMapIOSubIndex::const_iterator anIter = myMapIOSubIndex.find(theIO);
   if(anIter != myMapIOSubIndex.end()){
     const TColStd_IndexedMapOfInteger& aMapIndex = anIter->second.myMap;
-    return aMapIndex.Contains(theIndex);
+    return aMapIndex.Contains( theIndex ) == Standard_True;
   }
 
   return false;
 }
 
-static 
-bool
-removeIndex(TColStd_IndexedMapOfInteger& theMapIndex,
-           const int theIndex)
+static bool removeIndex(TColStd_IndexedMapOfInteger& theMapIndex, const int theIndex)
 {
   int anId = theMapIndex.FindIndex(theIndex); // i==0 if Index is not in the MapIndex
   if(anId){
@@ -308,7 +305,7 @@ removeIndex(TColStd_IndexedMapOfInteger& theMapIndex,
       theMapIndex = aNewMap;
     }
   }
-  return anId;
+  return anId != 0;
 }
 
 /*!
@@ -402,18 +399,18 @@ SVTK_SelectorDef
   }
   TColStd_IndexedMapOfInteger& aMapIndex = anIter->second.myMap;
 
-  bool anIsConatains = aMapIndex.Contains(theIndex);
-  if(anIsConatains)
-    removeIndex(aMapIndex,theIndex);
+  bool anIsConatains = aMapIndex.Contains( theIndex ) == Standard_True;
+  if ( anIsConatains )
+    removeIndex( aMapIndex, theIndex );
   
-  if(!theIsModeShift)
+  if ( !theIsModeShift )
     aMapIndex.Clear();
   
-  if(!anIsConatains)
+  if ( !anIsConatains )
     aMapIndex.Add( theIndex );
 
-  if( aMapIndex.IsEmpty())
-    myMapIOSubIndex.erase(theIO);
+  if ( aMapIndex.IsEmpty() )
+    myMapIOSubIndex.erase( theIO );
 
   return false;
 }
index 44c1d9690bdac408d5cdad304f59d2d73b75214c..380e28b31ef2e37ccc9a0265d2be8c0499480c6b 100644 (file)
@@ -29,6 +29,7 @@
 #ifndef SVTK_SELECTOR_H
 #define SVTK_SELECTOR_H
 
+#include "SVTK.h"
 #include "SVTK_Selection.h"
 #include "SALOME_ListIO.hxx"
 #include "VTKViewer_Filter.h"
@@ -49,7 +50,7 @@ class SALOME_Actor;
   \note
   Also, for each #SALOME_InteractiveObject it tries to keep corresponding refenrence to #SALOME_Actor
  */
-class SVTK_Selector: public vtkObject
+class SVTK_EXPORT SVTK_Selector: public vtkObject
 {
 public:
   static SVTK_Selector* New();
diff --git a/src/SVTK/SVTK_SetRotationPointDlg.cxx b/src/SVTK/SVTK_SetRotationPointDlg.cxx
new file mode 100755 (executable)
index 0000000..d98efaa
--- /dev/null
@@ -0,0 +1,325 @@
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+//
+//  File   : 
+//  Author : 
+//  Module : SALOME
+//  $Header$
+
+#include "SVTK_SetRotationPointDlg.h"
+#include "SVTK_MainWindow.h"
+#include "SVTK_RenderWindowInteractor.h"
+#include "SVTK_Event.h"
+#include "SVTK_InteractorStyle.h"
+
+#include "VTKViewer_Utilities.h"
+
+#include "QtxAction.h"
+
+#include <qlineedit.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qvalidator.h>
+#include <qbuttongroup.h>
+#include <qobjectlist.h>
+#include <qcheckbox.h>
+#include <qhbox.h>
+
+#include <vtkCallbackCommand.h>
+
+using namespace std;
+
+/*!
+  Constructor
+*/
+SVTK_SetRotationPointDlg
+::SVTK_SetRotationPointDlg(QtxAction* theAction,
+                          SVTK_MainWindow* theParent,
+                          const char* theName):
+  SVTK_DialogBase(theAction,
+                 theParent, 
+                 theName),
+  myMainWindow(theParent),
+  myPriority(0.0),
+  myEventCallbackCommand(vtkCallbackCommand::New()),
+  myRWInteractor(theParent->GetInteractor())
+{
+  setCaption(tr("DLG_TITLE"));
+  setSizeGripEnabled(TRUE);
+
+  // Create layout for this dialog
+  QGridLayout* layoutDlg = new QGridLayout (this);
+  layoutDlg->setSpacing(6);
+  layoutDlg->setMargin(11);
+
+  // Create check box "Use Bounding Box Center"
+  QHBox* aCheckBox = new QHBox(this);
+
+  myIsBBCenter = new QCheckBox(tr("USE_BBCENTER"), aCheckBox);
+  myIsBBCenter->setChecked(true);
+  connect(myIsBBCenter, SIGNAL(stateChanged(int)), SLOT(onBBCenterChecked()));
+
+  // Create croup button with radio buttons
+  myGroupSelButton = new QButtonGroup(2,Qt::Vertical,"",this);
+  myGroupSelButton->setMargin(11);
+  
+  // Create "Set to Origin" button
+  myToOrigin = new QPushButton(myGroupSelButton);
+  myToOrigin->setText(tr("LBL_TOORIGIN"));
+  connect(myToOrigin, SIGNAL(clicked()), this, SLOT(onToOrigin()));
+
+  // Create "Select Point from View" button
+  mySelectPoint = new QPushButton(myGroupSelButton);
+  mySelectPoint->setText(tr("LBL_SELECTPOINT"));
+  mySelectPoint->setToggleButton(true);
+  connect(mySelectPoint, SIGNAL(clicked()), this, SLOT(onSelectPoint()));
+
+  // Create croup box with grid layout
+  myGroupBoxCoord = new QGroupBox(this, "GroupBox");
+  QHBoxLayout* aHBoxLayout = new QHBoxLayout(myGroupBoxCoord);
+  aHBoxLayout->setMargin(11);
+  aHBoxLayout->setSpacing(6);
+
+  // "X" coordinate
+  QLabel* TextLabelX = new QLabel (tr("LBL_X"), myGroupBoxCoord, "TextLabelX");
+  TextLabelX->setFixedWidth(15);
+  myX = new QLineEdit(myGroupBoxCoord);
+  myX->setValidator(new QDoubleValidator(myX));
+  myX->setText(QString::number(0.0));
+  connect(myX, SIGNAL(textChanged(const QString&)), this, SLOT(onCoordChanged()));
+
+  // "Y" coordinate
+  QLabel* TextLabelY = new QLabel (tr("LBL_Y"), myGroupBoxCoord, "TextLabelY");
+  TextLabelY->setFixedWidth(15);
+  myY = new QLineEdit(myGroupBoxCoord);
+  myY->setValidator(new QDoubleValidator(myY));
+  myY->setText(QString::number(0.0));
+  connect(myY, SIGNAL(textChanged(const QString&)), this, SLOT(onCoordChanged()));
+
+  // "Z" coordinate
+  QLabel* TextLabelZ = new QLabel (tr("LBL_Z"), myGroupBoxCoord, "TextLabelZ");
+  TextLabelZ->setFixedWidth(15);
+  myZ = new QLineEdit(myGroupBoxCoord);
+  myZ->setValidator(new QDoubleValidator(myZ));
+  myZ->setText(QString::number(0.0));
+  connect(myZ, SIGNAL(textChanged(const QString&)), this, SLOT(onCoordChanged()));
+
+  // Layout widgets in the horizontal group box
+  aHBoxLayout->addWidget(TextLabelX);
+  aHBoxLayout->addWidget(myX);
+  aHBoxLayout->addWidget(TextLabelY);
+  aHBoxLayout->addWidget(myY);
+  aHBoxLayout->addWidget(TextLabelZ);
+  aHBoxLayout->addWidget(myZ);
+
+  // "Close" button
+  QGroupBox* aGroupBox = new QGroupBox(this);
+  QHBoxLayout* aHBoxLayout2 = new QHBoxLayout(aGroupBox);
+  aHBoxLayout2->setMargin(11);
+  aHBoxLayout2->setSpacing(6);
+
+  QPushButton* m_bClose = new QPushButton(tr("&Close"), aGroupBox, "m_bClose");
+  m_bClose->setAutoDefault(TRUE);
+  m_bClose->setFixedSize(m_bClose->sizeHint());
+  connect(m_bClose, SIGNAL(clicked()), this, SLOT(onClickClose()));
+
+  // Layout buttons
+  aHBoxLayout2->addWidget(m_bClose);
+
+  // Layout top level widgets
+  layoutDlg->addWidget(aCheckBox,0,0);
+  layoutDlg->addWidget(myGroupSelButton,1,0);
+  layoutDlg->addWidget(myGroupBoxCoord,2,0);
+  layoutDlg->addWidget(aGroupBox,3,0);
+  
+  setEnabled(myGroupSelButton,!myIsBBCenter->isChecked());
+  setEnabled(myGroupBoxCoord,!myIsBBCenter->isChecked());
+
+  this->resize(400, this->sizeHint().height());
+
+  myEventCallbackCommand->Delete();
+  myEventCallbackCommand->SetClientData(this);
+  myEventCallbackCommand->SetCallback(SVTK_SetRotationPointDlg::ProcessEvents);
+  myIsObserverAdded = false;
+}
+
+/*
+ *  Destroys the object and frees any allocated resources
+ */
+SVTK_SetRotationPointDlg
+::~SVTK_SetRotationPointDlg()
+{
+  // no need to delete child widgets, Qt does it all for us
+}
+
+void
+SVTK_SetRotationPointDlg
+::addObserver()
+{
+  if ( !myIsObserverAdded ) {
+    vtkInteractorStyle* aIStyle = myRWInteractor->GetInteractorStyle();
+    aIStyle->AddObserver(SVTK::BBCenterChanged, myEventCallbackCommand.GetPointer(), myPriority);
+    aIStyle->AddObserver(SVTK::RotationPointChanged, myEventCallbackCommand.GetPointer(), myPriority);
+    myIsObserverAdded = true;
+  }
+}
+
+/*!
+  Return true if it is the first show for this dialog
+*/
+bool
+SVTK_SetRotationPointDlg
+::IsFirstShown()
+{
+  return myIsBBCenter->isChecked() && myX->text().toDouble() == 0.
+    && myY->text().toDouble() == 0. && myZ->text().toDouble() == 0.;
+}
+
+/*!
+  Processes events
+*/
+void 
+SVTK_SetRotationPointDlg
+::ProcessEvents(vtkObject* vtkNotUsed(theObject), 
+               unsigned long theEvent,
+               void* theClientData, 
+               void* theCallData)
+{
+  SVTK_SetRotationPointDlg* self = reinterpret_cast<SVTK_SetRotationPointDlg*>(theClientData);
+  vtkFloatingPointType* aCoord = (vtkFloatingPointType*)theCallData;
+  
+  switch ( theEvent ) {
+  case SVTK::BBCenterChanged:
+    if ( self->myIsBBCenter->isChecked()
+        ||
+        IsBBEmpty(self->myMainWindow->getRenderer()) )
+    {
+      if ( aCoord )
+      {
+       self->myX->setText( QString::number(aCoord[0]) );
+       self->myY->setText( QString::number(aCoord[1]) );
+       self->myZ->setText( QString::number(aCoord[2]) );
+      }
+    }
+    break;
+  case SVTK::RotationPointChanged:
+    if ( aCoord )
+    {
+      self->myX->setText( QString::number(aCoord[0]) );
+      self->myY->setText( QString::number(aCoord[1]) );
+      self->myZ->setText( QString::number(aCoord[2]) );
+    }
+    if ( !self->myIsBBCenter->isChecked() )
+      self->mySelectPoint->toggle();
+  }
+}
+
+void 
+SVTK_SetRotationPointDlg
+::setEnabled(QGroupBox* theGrp, const bool theState)
+{
+  QObjectList aChildren(*theGrp->children());
+  QObject* anObj;
+  for(anObj = aChildren.first(); anObj !=0; anObj = aChildren.next())
+  {
+    if (anObj !=0 && anObj->inherits("QLineEdit"))
+      ((QLineEdit*)anObj)->setReadOnly(!theState);
+    if (anObj !=0 && anObj->inherits("QPushButton"))
+      ((QLineEdit*)anObj)->setEnabled(theState);
+  }
+  
+}
+
+void 
+SVTK_SetRotationPointDlg
+::onBBCenterChecked()
+{
+  setEnabled(myGroupSelButton,!myIsBBCenter->isChecked());
+  setEnabled(myGroupBoxCoord,!myIsBBCenter->isChecked());
+  
+  if ( myIsBBCenter->isChecked() )
+  { 
+    if ( mySelectPoint->state() == QButton::On )
+      mySelectPoint->toggle();
+    // activate mode : the rotation point is the center of the bounding box
+    // send the data to the SVTK_InteractorStyle: set the type of the rotation point
+    //                                            calculate coordinates of the rotation point
+    myMainWindow->activateSetRotationGravity();
+  }
+  else
+  {
+    QString aX = myX->text();
+    myX->setText(QString::number(aX.toDouble()+1.));
+    myX->setText(aX);
+  }
+}
+
+void
+SVTK_SetRotationPointDlg
+::onToOrigin()
+{
+  if ( mySelectPoint->state() == QButton::On )
+    mySelectPoint->toggle();
+  myX->setText(QString::number(0.0));
+  myY->setText(QString::number(0.0));
+  myZ->setText(QString::number(0.0));
+}
+
+void
+SVTK_SetRotationPointDlg
+::onSelectPoint()
+{
+  if ( mySelectPoint->state() == QButton::On )
+    myMainWindow->activateStartPointSelection();
+  else
+    mySelectPoint->toggle();
+}
+
+void
+SVTK_SetRotationPointDlg
+::onCoordChanged()
+{
+  if ( !myIsBBCenter->isChecked() ) {
+    if ( mySelectPoint->state() == QButton::On
+        &&
+        ( myX->hasFocus() || myY->hasFocus() || myZ->hasFocus() ) )
+      mySelectPoint->toggle();
+    vtkFloatingPointType aCenter[3] = {myX->text().toDouble(), 
+                                      myY->text().toDouble(), 
+                                      myZ->text().toDouble()};
+    myMainWindow->activateSetRotationSelected((void*)aCenter);
+  }
+  else
+    myMainWindow->activateSetRotationGravity();
+}
+
+void
+SVTK_SetRotationPointDlg
+::onClickClose()
+{
+  reject();
+}
+
+
diff --git a/src/SVTK/SVTK_SetRotationPointDlg.h b/src/SVTK/SVTK_SetRotationPointDlg.h
new file mode 100755 (executable)
index 0000000..a598aff
--- /dev/null
@@ -0,0 +1,110 @@
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+//
+//  File   : 
+//  Author : 
+//  Module : SALOME
+//  $Header$
+
+#ifndef SVTK_SETROTATIONPOINTDLG_H
+#define SVTK_SETROTATIONPOINTDLG_H
+
+#include "SVTK.h"
+
+#include "SVTK_DialogBase.h"
+
+#include <vtkSmartPointer.h>
+
+class SVTK_MainWindow;
+class SVTK_RenderWindowInteractor;
+
+class QtxAction;
+
+class QLineEdit;
+class QPushButton;
+class QGroupBox;
+class QButtonGroup;
+class QCheckBox;
+
+class vtkCallbackCommand;
+class vtkObject;
+
+class SVTK_EXPORT SVTK_SetRotationPointDlg : public SVTK_DialogBase
+{
+  Q_OBJECT;
+
+public:
+  SVTK_SetRotationPointDlg(QtxAction* theAction,
+                          SVTK_MainWindow* theParent,
+                          const char* theName);
+
+  ~SVTK_SetRotationPointDlg();
+  
+  void addObserver();
+  bool IsFirstShown();
+  
+protected:
+  SVTK_MainWindow *myMainWindow;
+  SVTK_RenderWindowInteractor* myRWInteractor;
+  bool myIsObserverAdded;
+  
+  QCheckBox*    myIsBBCenter;
+
+  QButtonGroup* myGroupSelButton;
+  QPushButton*  myToOrigin;
+  QPushButton*  mySelectPoint;
+
+  QGroupBox* myGroupBoxCoord;
+  QLineEdit* myX;
+  QLineEdit* myY;
+  QLineEdit* myZ;
+
+  void setEnabled(QGroupBox* theGrp, const bool theState);
+
+  //----------------------------------------------------------------------------
+  // Priority at which events are processed
+  vtkFloatingPointType myPriority;
+
+  // Used to process events
+  vtkSmartPointer<vtkCallbackCommand> myEventCallbackCommand;
+
+  // Description:
+  // Main process event method
+  static void ProcessEvents(vtkObject* object, 
+                            unsigned long event,
+                            void* clientdata, 
+                            void* calldata);
+
+protected slots:
+  void onBBCenterChecked();
+  
+  void onToOrigin();
+  void onSelectPoint();
+
+  void onCoordChanged();
+
+  void onClickClose();
+
+};
+
+#endif // SVTK_SETROTATIONPOINTDLG_H
index c6913f7822e5e54b0b8e8c065f7c2a56e5c8c1ec..7d858a7809b2aff7fe0b5152e0f2227eb5ef3c5c 100644 (file)
 #include <math.h>
 #include <stdio.h>
 
+#ifndef WIN32
 #include <X11/X.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
 #include <X11/keysym.h>
+#endif
 
 #include "SVTK_SpaceMouse.h"
 
@@ -55,10 +57,14 @@ SVTK_SpaceMouse* SVTK_SpaceMouse::getInstance()
 */
 SVTK_SpaceMouse::SVTK_SpaceMouse()
 {
+#ifndef WIN32
   win = InputFocus;
+#endif
   spaceMouseOn = 0;
 }
 
+#ifndef WIN32
+
 /*!
   Initialization
 */
@@ -204,3 +210,4 @@ int SVTK_SpaceMouse::translateEvent( Display* display, XEvent* xEvent, MoveEvent
   return (!display);
 }
 
+#endif
index 3c675f71e081b8cfc2d142e1a15460236ba8c3b5..f920bf44a9ed4e5d273f93a60a89b5058b31595a 100644 (file)
 #ifndef SVTK_SpaceMouse_h
 #define SVTK_SpaceMouse_h
 
+#ifndef WIN32
 extern "C"
 {
 #include <X11/X.h>
 #include <X11/Xlib.h>
 }
+#endif
 
 class SVTK_SpaceMouse 
 {
@@ -54,21 +56,25 @@ class SVTK_SpaceMouse
 
   bool isSpaceMouseOn() const { return spaceMouseOn != 0; }
 
+#ifndef WIN32
   int initialize     ( Display*, Window );
   int setWindow      ( Display*, Window );
   int translateEvent ( Display*, XEvent*, MoveEvent*, double, double );
   int close          ( Display* );
+#endif
 
  private:
   SVTK_SpaceMouse();
   static SVTK_SpaceMouse* myInstance;
 
+#ifndef WIN32
   Atom XMotionEvent;
   Atom XButtonPressEvent;
   Atom XButtonReleaseEvent;
   Atom XCommandEvent;
 
   Window win;
+#endif
   int spaceMouseOn;
 };
 
index ac0bbd4d89b8dd41e7252cce952185bbca6078a8..45751cfec523a7e16a2337c203dd95a162b3e113 100644 (file)
@@ -46,9 +46,13 @@ SVTK_Trihedron
   int aCount = 0;
   while(vtkActor* aProp = aCollection->GetNextActor()) {
     if(aProp->GetVisibility())
-      if(SALOME_Actor* anActor = SALOME_Actor::SafeDownCast(aProp))
+      if(SALOME_Actor* anActor = SALOME_Actor::SafeDownCast(aProp)) {
         if(!anActor->IsInfinitive()) 
-          aCount++;
+         aCount++;
+      }
+      else if ( !OwnActor( anActor ) ) {
+       aCount++;
+      }
   }
   return aCount;
 }
index 3465d153573435e354a50f93dde8d74448084dd8..b7856fdc7e22a225621233ec698f090e9bf64451 100644 (file)
 #include "SVTK_ViewManager.h"
 #include "SVTK_ViewModel.h"
 
-int SVTK_ViewManager::_SVTKViewMgr_Id = 0;
+#include <VTKViewer_ViewManager.h>
 
 /*!
   Constructor
 */
-SVTK_ViewManager::SVTK_ViewManager( SUIT_Study* study, 
-                   SUIT_Desktop* theDesktop ) 
-: SUIT_ViewManager( study, theDesktop )
+SVTK_ViewManager::SVTK_ViewManager( SUIT_Study* study, SUIT_Desktop* theDesktop ) 
+: SUIT_ViewManager( study, theDesktop, new SVTK_Viewer() )
 {
-  myId = ++_SVTKViewMgr_Id;
-  setViewModel( new SVTK_Viewer() );
+  setTitle( VTKViewer_ViewManager::tr( "VTK_VIEW_TITLE" ) );
 }
 
 /*!
@@ -46,12 +44,3 @@ SUIT_Desktop* SVTK_ViewManager::getDesktop()
 {
   return myDesktop;
 }
-
-/*!
-  Sets default name of view
-*/
-void SVTK_ViewManager::setViewName(SUIT_ViewWindow* theView)
-{
-  int aPos = myViews.find(theView);
-  theView->setCaption( tr( "VTK_VIEW_TITLE" ).arg( myId ).arg( aPos + 1 ) );
-}
index eda0626005a9b9a8951d87476588a5ca57cccded..8ff4efcc97545af264e2e59be6a20ff9ed3990ae 100644 (file)
@@ -37,13 +37,6 @@ public:
   virtual ~SVTK_ViewManager();
 
   SUIT_Desktop* getDesktop();
-
-protected:
-  void setViewName( SUIT_ViewWindow* theView );
-
-private:
-  int               myId;
-  static  int       _SVTKViewMgr_Id;
 };
 
 #endif
index 15afb69f34526264fd0a46105abcfa89f51a722e..0624c7d47988a2cf37dd867c3874cc9916e69481 100644 (file)
@@ -152,10 +152,10 @@ void SVTK_Viewer::setTrihedronSize( const vtkFloatingPointType theSize, const bo
 
   if (SUIT_ViewManager* aViewManager = getViewManager()) {
     QPtrVector<SUIT_ViewWindow> aViews = aViewManager->getViews();
-    for (int i = 0; i < aViews.count(); i++) {
-      if (TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at(i))) {
-       aView->SetTrihedronSize(theSize, theRelative);
-      }
+    for ( uint i = 0; i < aViews.count(); i++ )
+    {
+      if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
+             aView->SetTrihedronSize( theSize, theRelative );
     }
   }
 }
index e0c21ddd7ef9c86357b40902d5791f0c9d9fc6df..667f406c3ab04473b12ad1fd5d5a5f285ef5e465 100755 (executable)
 #include "VTKViewer_Algorithm.h"
 #include "SVTK_Functor.h"
 
+
+namespace SVTK
+{
+  int convertAction( const int accelAction )
+  {
+    switch ( accelAction ) {
+    case SUIT_Accel::PanLeft     : return SVTK::PanLeftEvent;
+    case SUIT_Accel::PanRight    : return SVTK::PanRightEvent;
+    case SUIT_Accel::PanUp       : return SVTK::PanUpEvent;
+    case SUIT_Accel::PanDown     : return SVTK::PanDownEvent;
+    case SUIT_Accel::ZoomIn      : return SVTK::ZoomInEvent;
+    case SUIT_Accel::ZoomOut     : return SVTK::ZoomOutEvent;
+    case SUIT_Accel::RotateLeft  : return SVTK::RotateLeftEvent;
+    case SUIT_Accel::RotateRight : return SVTK::RotateRightEvent;
+    case SUIT_Accel::RotateUp    : return SVTK::RotateUpEvent;
+    case SUIT_Accel::RotateDown  : return SVTK::RotateDownEvent;  
+    }
+    return accelAction;
+  }
+}
+
+
+
+
+
 /*!
   Constructor
 */
@@ -738,23 +763,6 @@ SVTK_ViewWindow
   myView->SetSelectionTolerance(theTolNodes,theTolItems);
 }
 
-int convertAction( const int accelAction )
-{
-  switch ( accelAction ) {
-  case SUIT_Accel::PanLeft     : return SVTK::PanLeftEvent;
-  case SUIT_Accel::PanRight    : return SVTK::PanRightEvent;
-  case SUIT_Accel::PanUp       : return SVTK::PanUpEvent;
-  case SUIT_Accel::PanDown     : return SVTK::PanDownEvent;
-  case SUIT_Accel::ZoomIn      : return SVTK::ZoomInEvent;
-  case SUIT_Accel::ZoomOut     : return SVTK::ZoomOutEvent;
-  case SUIT_Accel::RotateLeft  : return SVTK::RotateLeftEvent;
-  case SUIT_Accel::RotateRight : return SVTK::RotateRightEvent;
-  case SUIT_Accel::RotateUp    : return SVTK::RotateUpEvent;
-  case SUIT_Accel::RotateDown  : return SVTK::RotateDownEvent;  
-  }
-  return accelAction;
-}
-
 /*!
   Performs action
   \param accelAction - action
@@ -768,7 +776,7 @@ SVTK_ViewWindow
   if ( accelAction == SUIT_Accel::ZoomFit )
     onFitAll();
   else {
-    int anEvent = convertAction( accelAction );
+    int anEvent = SVTK::convertAction( accelAction );
     myMainWindow->InvokeEvent( anEvent, 0 );
   }
   return true;
index 3031624b8077f14b747c1aa78afb1ee09e87654b..809168505d1be23beb2d4d12669bb44765f6629f 100755 (executable)
@@ -50,6 +50,12 @@ class vtkRenderer;
 class vtkRenderWindow;
 class vtkRenderWindowInteractor;
 
+namespace SVTK
+{
+  SVTK_EXPORT
+    int convertAction( const int );
+}
+
 //! Define a container for SALOME VTK view window
 class SVTK_EXPORT SVTK_ViewWindow : public SUIT_ViewWindow
 {
index 1e28bfdbd21fae8236b84b49bb99b328518f7e28..609f62c2b81337ab9f5d39c50344c0cdef857050 100755 (executable)
@@ -113,6 +113,12 @@ msgstr "Rotation of the point of view around the scene center"
 msgid "MNU_ROTATE_VIEW"
 msgstr "Rotation"
 
+msgid "DSC_CHANGINGROTATIONPOINT_VIEW"
+msgstr "Change the point, around which the rotation is performed"
+
+msgid "MNU_CHANGINGROTATIONPOINT_VIEW"
+msgstr "Change Rotation Point"
+
 msgid "DSC_DUMP_VIEW"
 msgstr "Saves the active view in the image file"
 
@@ -182,6 +188,39 @@ msgstr "Scaling"
 msgid "SVTK_MainWindow::DSC_SVTK_SCALING"
 msgstr "Scaling"
 
+msgid "SVTK_SetRotationPointDlg::DLG_TITLE"
+msgstr "Set Rotation Point"
+
+msgid "SVTK_SetRotationPointDlg::USE_BBCENTER"
+msgstr "Use Bounding Box Center"
+
+msgid "SVTK_SetRotationPointDlg::LBL_TOORIGIN"
+msgstr "Set to Origin"
+
+msgid "SVTK_SetRotationPointDlg::LBL_SELECTPOINT"
+msgstr "Select Point from View"
+
+msgid "SVTK_SetRotationPointDlg::LBL_CENTER_OF_BOUNDING_BOX"
+msgstr "Center of bounding box"
+
+msgid "SVTK_SetRotationPointDlg::LBL_ORIGIN"
+msgstr "Origin of the coordinate system"
+
+msgid "SVTK_SetRotationPointDlg::LBL_SELECTED_POINT"
+msgstr "Selected point"
+
+msgid "SVTK_SetRotationPointDlg::LBL_X"
+msgstr "X :"
+
+msgid "SVTK_SetRotationPointDlg::LBL_Y"
+msgstr "Y :"
+
+msgid "SVTK_SetRotationPointDlg::LBL_Z"
+msgstr "Z :"
+
+msgid "SVTK_SetRotationPointDlg::RBUTTONGROUP_TITLE"
+msgstr "The rotation point type"
+
 msgid "SVTK_FontWidget::ARIAL"
 msgstr "Arial"
 
index ed377dfaf377db71f9f9d7f093b5a4c20c78372b..9ffbbddfeb48ba5b9ca8030ac6a4b8ca345710bc 100755 (executable)
@@ -88,7 +88,7 @@ RESOURCES_FILES = SalomeApp.ini \
 CPPFLAGS+=$(PYTHON_INCLUDES) $(QT_INCLUDES) $(QWT_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) $(BOOST_CPPFLAGS) $(KERNEL_CXXFLAGS)
 
 LDFLAGS+=$(PYTHON_LIBS) $(QT_MT_LIBS) 
-LIBS+= -lsuit -lstd -lCAM -lObjBrowser -lSalomePrs $(KERNEL_LDFLAGS) -lOpUtil -lSALOMELocalTrace -lSalomeDSClient $(CAS_KERNEL) -lSPlot2d -lGLViewer -lOCCViewer -lVTKViewer -lSalomeObject -lSVTK -lSOCC -lPyInterp -lPythonConsole -lLogWindow -lLightApp -lSalomeContainer -lToolsGUI
+LIBS+= -lsuit -lstd -lCAM -lObjBrowser -lSalomePrs $(KERNEL_LDFLAGS) -lOpUtil -lSALOMELocalTrace -lSalomeDSClient $(CAS_KERNEL) -lSPlot2d -lGLViewer -lOCCViewer -lVTKViewer -lSalomeObject -lSVTK -lSOCC -lPyInterp -lPythonConsole -lLogWindow -lLightApp -lSalomeContainer -lToolsGUI -lTOOLSDS -lSalomeSession
 
 @CONCLUDE@
 
index 2711255342895c739fce0a05d7b23e732ffbde4b..ae624c653ce148f4375181a55c496b583cec6527 100644 (file)
 #include <SALOMEDSClient_ClientFactory.hxx>
 
 #include <vector>
+/*!Internal class that updates object browser item properties */
+class SalomeApp_Updater : public OB_Updater
+{
+public:
+  SalomeApp_Updater() : OB_Updater(){};
+  virtual ~SalomeApp_Updater(){};
+  virtual void update( SUIT_DataObject* theObj, OB_ListItem* theItem );
+};
+
+void SalomeApp_Updater::update( SUIT_DataObject* theObj, OB_ListItem* theItem )
+{
+  if( !theObj || !theItem )
+    return;
+
+  SalomeApp_DataObject* SAObj = dynamic_cast<SalomeApp_DataObject*>( theObj );
+  if( !SAObj )
+    return;
+  
+  _PTR(SObject) SObj = SAObj->object();
+  if( !SObj )
+    return;
+  _PTR( GenericAttribute ) anAttr;
+
+  // Selectable
+  if ( SObj->FindAttribute( anAttr, "AttributeSelectable" ) )
+  {
+    _PTR(AttributeSelectable) aAttrSel = anAttr;
+    theItem->setSelectable( aAttrSel->IsSelectable() );
+  }
+  // Expandable
+  if ( SObj->FindAttribute(anAttr, "AttributeExpandable") ) 
+  {
+    _PTR(AttributeExpandable) aAttrExpand = anAttr;
+    theItem->setExpandable( aAttrExpand->IsExpandable() );
+  }
+  // Opened
+  //this attribute is not supported in the version of SALOME 3.x
+  //if ( SObj->FindAttribute(anAttr, "AttributeOpened") ) 
+  //{
+  //  _PTR(AttributeOpened) aAttrOpen = anAttr;
+  //  theItem->setOpen( aAttrOpen->IsOpened() );
+  //}
+}
 
 /*!Create new instance of SalomeApp_Application.*/
 extern "C" SALOMEAPP_EXPORT SUIT_Application* createApplication()
@@ -108,6 +151,46 @@ void SalomeApp_Application::start()
   LightApp_Application::start();
 
   SalomeApp_EventFilter::Init();
+
+  static bool isFirst = true;
+  if ( isFirst ) {
+    isFirst = false;
+    QString hdffile;
+    QStringList pyfiles;
+    for (int i = 1; i < qApp->argc(); i++) {
+      QRegExp rx("--test=(.+)");
+      if ( rx.search( QString(qApp->argv()[i]) ) >= 0 && rx.capturedTexts().count() > 0 ) {
+       QStringList files = QStringList::split(",",rx.capturedTexts()[1],false);
+       for (uint j = 0; j < files.count(); j++ ) {
+         QFileInfo fi( files[j] );
+         QString extension = fi.extension( false ).lower();
+         if ( extension == "hdf" && fi.exists() )
+           hdffile = fi.absFilePath();
+         else if ( extension == "py" || extension == "" )
+           pyfiles.append( fi.baseName( true ) );
+       }
+      }
+    }
+    if ( !hdffile.isEmpty() )       // open hdf file given as parameter
+      onOpenDoc( hdffile );
+    else if ( pyfiles.count() > 0 ) // create new study
+      onNewDoc();
+    // import python scripts
+    if ( pyfiles.count() > 0 && activeStudy() ) {
+      SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( activeStudy() );
+      if ( appStudy ) {
+       _PTR(Study) aStudy = appStudy->studyDS();
+       if ( !aStudy->GetProperties()->IsLocked() ) {
+         for ( uint i = 0; i < pyfiles.count(); i++ ) {
+           QString command = QString( "import %1" ).arg( pyfiles[i] );
+           PythonConsole* pyConsole = pythonConsole();
+           if ( pyConsole )
+             pyConsole->exec( command );
+         }
+       }
+      }
+    }
+  }
 }
 
 /*!Create actions:*/
@@ -148,12 +231,22 @@ void SalomeApp_Application::createActions()
                tr( "MEN_DESK_REGISTRY_DISPLAY" ), tr( "PRP_DESK_REGISTRY_DISPLAY" ),
                /*SHIFT+Key_D*/0, desk, false, this, SLOT( onRegDisplay() ) );
 
+  //SRN: BugID IPAL9021, add an action "Load"
+  createAction( FileLoadId, tr( "TOT_DESK_FILE_LOAD" ),
+                resourceMgr()->loadPixmap( "STD", tr( "ICON_FILE_OPEN" ) ),
+               tr( "MEN_DESK_FILE_LOAD" ), tr( "PRP_DESK_FILE_LOAD" ),
+               CTRL+Key_L, desk, false, this, SLOT( onLoadDoc() ) );
+  //SRN: BugID IPAL9021: End
+
+
   int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
 
   // "Save GUI State" command is renamed to "Save VISU State" and 
   // creation of menu item is moved to VISU
   //  createMenu( SaveGUIStateId, fileMenu, 10, -1 ); 
 
+  createMenu( FileLoadId,   fileMenu, 0 );  //SRN: BugID IPAL9021, add a menu item "Load"
+
   createMenu( DumpStudyId, fileMenu, 10, -1 );
   createMenu( separator(), fileMenu, -1, 15, -1 );
   createMenu( LoadScriptId, fileMenu, 10, -1 );
@@ -299,7 +392,11 @@ void SalomeApp_Application::onLoadDoc()
     return;
 
   name = studyname;
+#ifndef WNT
+  //this code replace marker of windows drive and path become invalid therefore 
+  // defines placed there
   name.replace( QRegExp(":"), "/" );
+#endif
 
   if( LightApp_Application::onLoadDoc( name ) )
   {
@@ -652,6 +749,7 @@ QWidget* SalomeApp_Application::createWindow( const int flag )
   if ( flag == WT_ObjectBrowser )
   {
     OB_Browser* ob = (OB_Browser*)wid;
+    ob->setUpdater( new SalomeApp_Updater() );
     connect( ob->listView(), SIGNAL( doubleClicked( QListViewItem* ) ), this, SLOT( onDblClick( QListViewItem* ) ) );
     bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false ),
          autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
@@ -765,7 +863,10 @@ QString SalomeApp_Application::defaultEngineIOR()
   QString anIOR( "" );
   CORBA::Object_ptr anEngine = namingService()->Resolve( "/SalomeAppEngine" );
   if ( !CORBA::is_nil( anEngine ) )
-    anIOR = orb()->object_to_string( anEngine );
+  {
+    CORBA::String_var objStr = orb()->object_to_string( anEngine );
+    anIOR = QString( objStr.in() );
+  }
   return anIOR;
 }
 
@@ -857,7 +958,8 @@ void SalomeApp_Application::contextMenuPopup( const QString& type, QPopupMenu* t
   CAM_Module* currentModule = activeModule();
   if (currentModule && currentModule->moduleName() == aModuleTitle)
     return;
-  thePopup->insertItem( tr( "MEN_OPENWITH" ), this, SLOT( onOpenWith() ) );
+  if ( !aModuleTitle.isEmpty() )
+    thePopup->insertItem( tr( "MEN_OPENWITH" ).arg( aModuleTitle ), this, SLOT( onOpenWith() ) );
 }
 
 /*!Update obect browser:
@@ -1126,3 +1228,11 @@ void SalomeApp_Application::updateSavePointDataObjects( SalomeApp_Study* study )
     delete it.data();
 }
 
+/*! Check data object */
+bool SalomeApp_Application::checkDataObject(LightApp_DataObject* theObj)
+{
+  if (theObj)
+    return true;
+
+  return false;
+}
index d9944623c9263424f91c65528bef66b0c7feb398..507c872fffa4b0fc78fc0771a717aaff64409ab0 100644 (file)
@@ -69,7 +69,7 @@ class SALOMEAPP_EXPORT SalomeApp_Application : public LightApp_Application
 public:
   enum { MenuToolsId = 5 };
   enum { DumpStudyId = LightApp_Application::UserID, LoadScriptId, PropertiesId,
-         CatalogGenId, RegDisplayId, SaveGUIStateId, UserID };
+         CatalogGenId, RegDisplayId, SaveGUIStateId, FileLoadId, UserID };
 
 public:
   SalomeApp_Application();
@@ -83,6 +83,8 @@ public:
 
   virtual void                        contextMenuPopup( const QString&, QPopupMenu*, QString& );
 
+  virtual bool                        checkDataObject(LightApp_DataObject* theObj);
+
   static CORBA::ORB_var               orb();
   static SALOMEDSClient_StudyManager* studyMgr();
   static SALOME_NamingService*        namingService();
@@ -115,7 +117,7 @@ protected:
 
   virtual void                        createPreferences( LightApp_Preferences* );
   virtual void                        updateDesktopTitle();
-
+  
 private slots:
   void                                onDeleteInvalidReferences();
   void                                onDblClick( QListViewItem* );
index d899ad63d39e932ac6062500e48df4ba74cb3db6..742a75e3567fa9370c4c82bb757d3224b58489ed 100644 (file)
@@ -38,8 +38,6 @@
 #include <SUIT_TreeSync.h>
 #include <SUIT_DataObjectIterator.h>
 
-#include "SALOMEDS_Tool.hxx"
-
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOME_Exception)
 
@@ -64,7 +62,7 @@ public:
   void     children( const suitPtr&, QValueList<suitPtr>& ) const;
   suitPtr  parent( const suitPtr& ) const;
   bool     isCorrect( const kerPtr& ) const;
-  void     updateItem( const suitPtr& ) const;
+  void     updateItem( const kerPtr&, const suitPtr& ) const;
 
 private:
   _PTR( Study )     myStudy;
@@ -87,7 +85,14 @@ bool SalomeApp_DataModelSync::isCorrect( const kerPtr& so ) const
 {
   kerPtr refObj;
   QString name = so->GetName().c_str();
-  bool res = so && ( so->GetName().size() || so->ReferencedObject( refObj ) );
+  _PTR( GenericAttribute ) anAttr;
+  bool isDraw = true;
+  if ( so->FindAttribute(anAttr, "AttributeDrawable") ) 
+  {
+    _PTR(AttributeDrawable) aAttrDraw = anAttr;
+    isDraw = aAttrDraw->IsDrawable(); 
+  }
+  bool res = so && ( so->GetName().size() || so->ReferencedObject( refObj ) ) && isDraw;  
   return res;
 }
 
@@ -221,7 +226,7 @@ suitPtr SalomeApp_DataModelSync::parent( const suitPtr& p ) const
   Updates SUIT object
   \param p - SUIT object
 */
-void SalomeApp_DataModelSync::updateItem( const suitPtr& ) const
+void SalomeApp_DataModelSync::updateItem( const kerPtr& obj, const suitPtr& ) const
 {
 }
 
@@ -333,7 +338,7 @@ SUIT_DataObject* SalomeApp_DataModel::synchronize( const _PTR( SComponent )& sob
 {
   if( !study || !study->root() || !sobj )
     return 0;
-
+    
   DataObjectList ch; study->root()->children( ch );
   DataObjectList::const_iterator anIt = ch.begin(), aLast = ch.end();
   SUIT_DataObject* suitObj = 0;
index d3a4b5c9dd5129326be90c672953df9bfa3cb3f5..5eb3c97a9050bf0a3aa0ddd7b52ba6765899d726 100644 (file)
@@ -186,6 +186,17 @@ QColor SalomeApp_DataObject::color( const ColorRole cr ) const
        else
          clr = QColor( 200, 200, 200 );
       }
+    else if ( myObject )
+    {
+      _PTR(GenericAttribute) anAttr;
+      if( myObject->FindAttribute ( anAttr, "AttributeTextHighlightColor") )
+      {
+        _PTR(AttributeTextHighlightColor) aHighColAttr = anAttr;
+       clr = QColor( (int)(aHighColAttr->TextHighlightColor().R), 
+                     (int)(aHighColAttr->TextHighlightColor().G), 
+                     (int)(aHighColAttr->TextHighlightColor().B));
+      }
+    }
     break;
   case HighlightedText:
     if ( isReference() )
index 81cd56b04a168ade05cfac6ce3a7febb5411d03b..90de9c62d4bf2fb67744899e5af644bf11cb3b04 100644 (file)
@@ -17,6 +17,7 @@
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 #include "SalomeApp_ExceptionHandler.h"
+#include "CASCatch.hxx"
 
 #include <OSD.hxx>
 
 SalomeApp_ExceptionHandler::SalomeApp_ExceptionHandler( const bool floatSignal )
 : SUIT_ExceptionHandler()
 {
-  OSD::SetSignal( floatSignal );
+  // JFA 2006-09-28: PAL10867: suppress signal catching,
+  // if environment variable DISABLE_SIGNALS_CATCHING is set to 1.
+  // Commonly this is used with "noexcepthandler" option.
+  char* envNoCatchSignals = getenv("NOT_INTERCEPT_SIGNALS");
+  if (!envNoCatchSignals || !atoi(envNoCatchSignals))
+  {
+    OSD::SetSignal( floatSignal );
+  }
 }
 
 /*!Try to call SUIT_ExceptionHandler::internalHandle(o, e), catch if failure.*/
@@ -104,5 +112,6 @@ extern "C" SALOMEAPP_EXPORT SUIT_ExceptionHandler* getExceptionHandler()
 #else
   raiseFPE = false;
 #endif
+
   return new SalomeApp_ExceptionHandler( raiseFPE );
 }
index 07f4c0620378de6e4c20dae9a475731b86b7e52a..87ca5aad736d87de35edcc4e8a1a15278c8c3a4f 100644 (file)
@@ -59,10 +59,10 @@ public:
 
   virtual void                        storeVisualParameters(int savePoint);
   virtual void                        restoreVisualParameters(int savePoint);
+  virtual LightApp_Selection*         createSelection() const;
 
 protected:
   virtual CAM_DataModel*              createDataModel();
-  virtual LightApp_Selection*         createSelection() const;
   virtual void                        extractContainers( const SALOME_ListIO&, SALOME_ListIO& ) const;
 };
 
index 6852b26db84706816c3595318eb796c39c43c738..1fb4d0bdd078ab109a1dcf03c6f4ee78f753adc1 100644 (file)
@@ -36,7 +36,7 @@
 #include <qdict.h>
 
 #include "utilities.h"
-#include <iostream.h>
+#include <iostream>
 #include <string>
 #include <vector>
 
@@ -204,7 +204,7 @@ bool SalomeApp_Study::loadDocument( const QString& theStudyName )
 */
 bool SalomeApp_Study::saveDocumentAs( const QString& theFileName )
 {
-  bool store = application()->resourceMgr()->booleanValue( "Study", "store_visual_state", true );
+  bool store = application()->resourceMgr()->booleanValue( "Study", "store_visual_state", false );
   if ( store )
     SalomeApp_VisualState( (SalomeApp_Application*)application() ).storeState();
   
index 8f692e303e3b1d1db724a78089da6bfaa035d0ea..90327232610cea489be5ccdd311c2fe2cd4ea900 100644 (file)
     <parameter name="CAM"          value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
     <parameter name="SUPERVGraph"  value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
     <parameter name="ToolsGUI"     value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
+    <!-- NETGENPlugin and GHS3DPlugin -->
+    <!-- Here the environment variables are used in upper case, -->
+    <!-- In SMESH/resources/SalomeApp.xml case-sensitive notation is used. -->
+    <!-- As a result, both variants are acceptable. -->
     <parameter name="NETGENPlugin" value="${NETGENPLUGIN_ROOT_DIR}/share/salome/resources/netgenplugin"/>
     <parameter name="GHS3DPlugin"  value="${GHS3DPLUGIN_ROOT_DIR}/share/salome/resources/ghs3dplugin"/>
   </section>
   </section>
   <section name="ExternalBrowser" >
     <!-- External HELP browser settings -->
+    <parameter value="D:\Program Files\Internet Explorer\iexplore.exe" name="winapplication" />
     <parameter value="/usr/bin/mozilla" name="application" />
   </section>
 </document>
index 23c83e0e385221a02976b45bfb88e324a98f3a97..f6db2217130a1fa83adeccf2cf44d568cdb51596 100644 (file)
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-// File:      CATHAREGUI_msg_en.po
+// File:      SalomeApp_msg_en.po
 // Created:   10/25/2004 12:46:36 PM
 // Author:    Sergey LITONIN
-// Copyright (C) CEA 2004
 
 msgid ""
 msgstr ""
@@ -118,7 +117,7 @@ msgid "SalomeApp_Application::PREF_TAB_OBJBROWSER"
 msgstr "Object browser"
 
 msgid "SalomeApp_Application::MEN_OPENWITH"
-msgstr "Activate Module"
+msgstr "Activate %1 Module"
 
 msgid "SalomeApp_Application::MEN_DELETE_INVALID_REFERENCE"
 msgstr "Delete Invalid Reference"
index a49f2b7d9d798ce3f0daa2956fce5b0d5062bc03..2eca8fe321d61ee19a12c18b4dcbbd5ec322a603 100755 (executable)
 #include <qvbox.h> 
 #include <qguardedptr.h> 
 
-#ifdef WNT
-#include <SALOME_WNT.hxx>
-#else
-#define SALOME_WNT_EXPORT
-#endif
+#include <SALOME_Session.hxx>
 
 /*!
   \class InquireEvent
   Contains QCustomEvents for posting to InquireServersQThread
 */
-class SALOME_WNT_EXPORT InquireEvent : public QCustomEvent
+class SESSION_EXPORT InquireEvent : public QCustomEvent
 {
 public:
 
@@ -51,7 +47,7 @@ public:
 
 class InquireServersGUI;
 
-class SALOME_WNT_EXPORT InquireServersQThread : public QThread
+class SESSION_EXPORT InquireServersQThread : public QThread
 {
 public:
   InquireServersQThread( InquireServersGUI* r );
@@ -96,7 +92,7 @@ private:
 class QLabel;
 class QFrame;
 class QProgressBar;
-class SALOME_WNT_EXPORT InquireServersGUI : public QVBox
+class SESSION_EXPORT InquireServersGUI : public QVBox
 {
     Q_OBJECT
 
index a02da34946411e2336150594d7deae190af65832..44e6f5207034fc9f3314613408a4533f0e7710b3 100755 (executable)
@@ -39,7 +39,8 @@ EXPORT_HEADERS= Session_Session_i.hxx \
                Session_ServerLauncher.hxx \
                Session_ServerThread.hxx \
                Session_ServerCheck.hxx \
-               SalomeApp_Engine_i.hxx
+               SalomeApp_Engine_i.hxx \
+               SALOME_Session.hxx
 
 # Libraries targets
 LIB = libSalomeSession.la
@@ -65,5 +66,17 @@ LDFLAGS += $(QT_MT_LIBS) $(KERNEL_LDFLAGS) -lSalomeNS -lsuit -lSalomeLifeCycleCO
 
 LDFLAGSFORBIN= $(LDFLAGS) $(OMNIORB_LIBS) $(HDF5_LIBS) -lqtx -lSalomeContainer -lSalomeResourcesManager -lTOOLSDS -lSalomeHDFPersist -lSalomeDSImpl -lSalomeGenericObj -lRegistry -lSalomeNotification -lSALOMEBasics
 
+PLUGINDIR = $(top_builddir)/bin/salome/styles
+MYPLUGINDIR = styles
+
+$(MYPLUGINDIR): $(PLUGINDIR)
+       -$(RM) $@
+       ln -sf $< $@
+
+$(PLUGINDIR):
+       mkdir -p $@
+
+bin: $(MYPLUGINDIR)
+
 @CONCLUDE@
 
diff --git a/src/Session/SALOME_Session.hxx b/src/Session/SALOME_Session.hxx
new file mode 100755 (executable)
index 0000000..78c89d6
--- /dev/null
@@ -0,0 +1,47 @@
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//
+//
+//
+//  File   : SALOME_Session.hxx
+//  Author : Alexander A. BORODIN
+//  Module : GUI
+
+#ifndef _SALOME_Session_HXX_
+#define _SALOME_Session_HXX_
+
+#ifdef WNT
+ #if defined SESSION_EXPORTS
+  #if defined WIN32
+   #define SESSION_EXPORT __declspec( dllexport )
+  #else
+   #define SESSION_EXPORT
+  #endif
+ #else
+  #if defined WIN32
+   #define SESSION_EXPORT __declspec( dllimport )
+  #else
+   #define SESSION_EXPORT
+  #endif
+ #endif
+#else
+ #define SESSION_EXPORT
+#endif
+
+#endif
\ No newline at end of file
index 1a9987a544330f18f576f83a8cc8cecd9ed7801f..8ae2b1d7254b3aa57fb569ac468579b9915dbad1 100755 (executable)
@@ -165,6 +165,7 @@ public:
   {
     if ( myExtAppName.isNull() || myExtAppVersion.isNull() ) {
       SALOME_ResourceMgr resMgr( "SalomeApp", QString( "%1Config" ) );
+      resMgr.loadLanguage( "LightApp",  "en" );
       resMgr.loadLanguage( "SalomeApp", "en" );
 
       myExtAppName = QObject::tr( "APP_NAME" ).stripWhiteSpace();
@@ -189,29 +190,30 @@ protected:
 
   virtual int userFileId( const QString& _fname ) const
   {
-    QRegExp exp( "\\.SalomeApprc\\.([a-zA-Z0-9.]+)$" );
-    QRegExp vers_exp( "^([0-9]+)([A-Za-z]?)([0-9]*)$" );
-
-    QString fname = QFileInfo( _fname ).fileName();
-    if( exp.exactMatch( fname ) )
-    {
-      QStringList vers = QStringList::split( ".", exp.cap( 1 ) );
-      int major=0, minor=0;
-      major = vers[0].toInt();
-      minor = vers[1].toInt();
-      if( vers_exp.search( vers[2] )==-1 )
-       return -1;
-      int release = 0, dev1 = 0, dev2 = 0;
-      release = vers_exp.cap( 1 ).toInt();
-      dev1 = vers_exp.cap( 2 )[ 0 ].latin1();
-      dev2 = vers_exp.cap( 3 ).toInt();
-
-      int dev = dev1*100+dev2, id = major;
-      id*=100; id+=minor;
-      id*=100; id+=release;
-      id*=10000;
-      if ( dev > 0 ) id+=dev-10000;
-      return id;
+    if ( !myExtAppName.isEmpty() ) {
+      QRegExp exp( QString( "\\.%1rc\\.([a-zA-Z0-9.]+)$" ).arg( myExtAppName ) );
+      QRegExp vers_exp( "^([0-9]+)([A-Za-z]?)([0-9]*)$" );
+      
+      QString fname = QFileInfo( _fname ).fileName();
+      if( exp.exactMatch( fname ) ) {
+       QStringList vers = QStringList::split( ".", exp.cap( 1 ) );
+       int major=0, minor=0;
+       major = vers[0].toInt();
+       minor = vers[1].toInt();
+       if( vers_exp.search( vers[2] )==-1 )
+         return -1;
+       int release = 0, dev1 = 0, dev2 = 0;
+       release = vers_exp.cap( 1 ).toInt();
+       dev1 = vers_exp.cap( 2 )[ 0 ].latin1();
+       dev2 = vers_exp.cap( 3 ).toInt();
+       
+       int dev = dev1*100+dev2, id = major;
+       id*=100; id+=minor;
+       id*=100; id+=release;
+       id*=10000;
+       if ( dev > 0 ) id+=dev-10000;
+       return id;
+      }
     }
 
     return -1;
index c37689369413463b7f18ebf2903ebfac317a3fa1..abadbdd675167cb07b0c48abb1c777dac14ba299 100755 (executable)
@@ -29,6 +29,8 @@
 #ifndef _SALOMEAPP_ENGINE_I_HXX_
 #define _SALOMEAPP_ENGINE_I_HXX_
 
+#include <SALOME_Session.hxx>
+
 #include "SALOME_Component_i.hxx"
 
 #include <vector> 
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SalomeApp_Engine)
 
-#ifdef WNT
-#include <SALOME_WNT.hxx>
-#else
-#define SALOME_WNT_EXPORT
-#endif
-
-class SALOME_WNT_EXPORT SalomeApp_Engine_i: public POA_SalomeApp::Engine,
+class SESSION_EXPORT SalomeApp_Engine_i: public POA_SalomeApp::Engine,
                           public Engines_Component_i
 {
 public:
index 0f84abe18181c52d41ee1cfdada1c7fc5946979f..8de6a6d41822d0f9421241aaa1b29b8ce185b8f5 100644 (file)
 #if !defined(SESSION_SERVERCHECK_HXX)
 #define SESSION_SERVERCHECK_HXX
 
-#ifdef WNT
-#include <SALOME_WNT.hxx>
-#else
-#define SALOME_WNT_EXPORT
-#endif
+#include <SALOME_Session.hxx>
 
 #include <qthread.h> 
 #include <qapplication.h> 
@@ -37,7 +33,7 @@ class QWaitCondition;
 /*!
   Class Session_ServerCheck : check SALOME servers
 */
-class SALOME_WNT_EXPORT Session_ServerCheck : public QThread
+class SESSION_EXPORT Session_ServerCheck : public QThread
 {
 public:
   // constructor
index d4b05541603a2f89849f7704f4e7d963badcc743..0604c7731e7dda0cfb892bbff282004e61837080 100755 (executable)
@@ -190,7 +190,7 @@ void Session_ServerLauncher::ActivateAll()
     {
       for (int i=0; i<argc-1; i++)
        //argv[i+1] = _argCopy[(*itServ)._firstArg + i].c_str();
-       argv[i+1] = _argv[(*itServ)._firstArg + i];
+             argv[i+1] = _argv[(*itServ)._firstArg + i];
     }
 
     std::cout << "*** activating [" << argc << "] : " << argv[0] << std::endl;
@@ -200,6 +200,8 @@ void Session_ServerLauncher::ActivateAll()
     _serverThreads.push_front(aServerThread);
     
     aServerThread->Init();
+    free( argv[0] );
+    delete[] argv;
   }
 
   // Always launch Session Server
@@ -211,8 +213,8 @@ void Session_ServerLauncher::ActivateAll()
   Session_SessionThread* aServerThread
     = new Session_SessionThread(argc, argv, _orb,_root_poa,_SessionMutex,_SessionStarted);
   _serverThreads.push_front(aServerThread);
-
   aServerThread->Init();
+  delete[] argv;
 }
 
 /*! 
index b81534782fb602440c8268f2fff2c059f78f78db..b3773adf10f1116230dc266b3f85a6188ddd54c4 100755 (executable)
@@ -29,6 +29,8 @@
 #ifndef _SESSION_SERVERLAUNCHER_HXX_
 #define _SESSION_SERVERLAUNCHER_HXX_
 
+#include <SALOME_Session.hxx>
+
 #include "Session_ServerThread.hxx"
 
 #include <CORBA.h> 
 #include <qthread.h>
 #include <qwaitcondition.h>
 
-
-#ifdef WNT
-#include <SALOME_WNT.hxx>
-#else
-#define SALOME_WNT_EXPORT
-#endif
-
 using namespace std;
 
-class ServArg
+class SESSION_EXPORT ServArg
   {
   public:
     int _servType;
@@ -60,7 +55,7 @@ inline ServArg::ServArg(int servType, int firstArg, int lastArg):
   _servType(servType),_firstArg(firstArg),_lastArg(lastArg)
 {}
 
-class SALOME_WNT_EXPORT Session_ServerLauncher: public QThread
+class SESSION_EXPORT Session_ServerLauncher: public QThread
 {
 public:
   Session_ServerLauncher();
index d9ef4f806902ba74c26c36a56cdaf4c6bbf6aedf..1407cf4a27fd6c2e1d156bbea3f39937de94b679 100755 (executable)
@@ -80,7 +80,11 @@ Session_ServerThread::Session_ServerThread(int argc,
 {
   //MESSAGE("Session_ServerThread Constructor " << argv[0]);
   _argc = argc;
-  _argv = argv;
+  _argv = new char*[ _argc + 1 ];
+  _argv[_argc] = 0;
+  for (int i = 0; i < _argc; i++ )
+    _argv[i] = strdup( argv[i] );
+
   _orb = CORBA::ORB::_duplicate(orb);
   _root_poa = PortableServer::POA::_duplicate(poa);
   _servType =-1;
@@ -94,6 +98,10 @@ Session_ServerThread::Session_ServerThread(int argc,
 Session_ServerThread::~Session_ServerThread()
 {
   //MESSAGE("~Session_ServerThread "<< _argv[0]);
+  delete _NS;
+  for (int i = 0; i <_argc ; i++ )
+    free( _argv[i] );
+  delete[] _argv;
 }
 
 /*! 
@@ -283,10 +291,10 @@ void Session_ServerThread::ActivateRegistry(int argc,
          INFOS("RegistryService servant already existing" );
          ASSERT(0);
        }
-      catch( const ServiceUnreachable &ex )
+      catch( const ServiceUnreachable &/*ex*/ )
        {
        }
-      catch( const CORBA::Exception &exx )
+      catch( const CORBA::Exception &/*exx*/ )
        {
        }
       string absoluteName = string("/") + registryName;
@@ -422,10 +430,14 @@ void Session_ServerThread::ActivateEngine(int /*argc*/, char ** /*argv*/)
       {
        INFOS("SalomeApp_Engine thread started");
        SalomeApp_Engine_i* anEngine = new SalomeApp_Engine_i();
-       /*PortableServer::ObjectId_var id = */_root_poa->activate_object( anEngine );
+  // declare variable and get value for them to avoid compilation warning of unused variable
+  // this variable is necessary to avoid memory leak of memory allocated in corba
+  PortableServer::ObjectId_var id = 0;
+  id = _root_poa->activate_object( anEngine );
+       ///*PortableServer::ObjectId_var id = */_root_poa->activate_object( anEngine );
        INFOS("poa->activate_object( SalomeApp_Engine )");
       
-       CORBA::Object_ptr obj = anEngine->_this();
+       CORBA::Object_var obj = anEngine->_this();
        _NS->Register( obj ,"/SalomeAppEngine");
 
       }
index 8c2e417da47a7eaf8bd0058e7d529ce4a7179442..04ded4d2ead238a241f946aae311d6e68869d168 100755 (executable)
@@ -29,6 +29,8 @@
 #ifndef _SESSION_SERVERTHREAD_HXX_
 #define _SESSION_SERVERTHREAD_HXX_
 
+#include <SALOME_Session.hxx>
+
 #include <CORBA.h> 
 #include <string>
 
@@ -40,7 +42,7 @@ using namespace std;
 void WaitForServerReadiness(string serverName);
 
 
-class Session_ServerThread
+class SESSION_EXPORT Session_ServerThread
 {
 public:
   static const int NB_SRV_TYP;
@@ -71,7 +73,7 @@ protected:
 };
 
 
-class Session_SessionThread : public Session_ServerThread
+class SESSION_EXPORT Session_SessionThread : public Session_ServerThread
 {
 public:
   Session_SessionThread() {}
index ee239674ed01c6bf13f43f4d83b4e7ab6a3885fd..81787737ebef0229b9b3f129bc86a245891c16b1 100755 (executable)
@@ -35,6 +35,7 @@
 
 #include "SUIT_Session.h"
 #include "SUIT_Application.h"
+#include "SUIT_Desktop.h"
 
 #include <qapplication.h>
 
@@ -221,3 +222,30 @@ bool SALOME_Session_i::restoreVisualState(CORBA::Long theSavePoint)
  
   return false;
 }
+
+void SALOME_Session_i::emitMessage(const char* theMessage)
+{
+  class TEvent: public SALOME_Event {
+  public:
+    TEvent(const char * msg) {
+      _msg = msg;
+    }
+    virtual void Execute() {
+      SUIT_Session::session()->activeApplication()->desktop()->emitMessage(_msg);
+    }
+  private:
+    const char* _msg;
+  };
+  if ( SUIT_Session::session() ) {
+    if ( SUIT_Session::session()->activeApplication() ) {
+      if ( SUIT_Session::session()->activeApplication()->desktop() ) {
+       ProcessVoidEvent( new TEvent(theMessage) );
+      }
+    }
+  }
+}
+
+void SALOME_Session_i::emitMessageOneWay(const char* theMessage)
+{
+  emitMessage(theMessage);
+}
index 18d2caf8424e3cd602507e64595110e149d69b8f..7cbef5ef83d3ac3733c1d9543dc21d91e9a34005 100755 (executable)
@@ -29,6 +29,8 @@
 #ifndef _SESSION_SESSION_I_HXX_
 #define _SESSION_SESSION_I_HXX_
 
+#include <SALOME_Session.hxx>
+
 #include <qthread.h> 
 
 #include <SALOMEconfig.h>
@@ -36,7 +38,7 @@
 #include CORBA_SERVER_HEADER(SALOME_Session)
 class SALOME_NamingService;
 
-class SALOME_Session_i:  public virtual POA_SALOME::Session,
+class SESSION_EXPORT SALOME_Session_i:  public virtual POA_SALOME::Session,
                         public virtual PortableServer::RefCountServantBase
 {
 public:
@@ -64,12 +66,16 @@ public:
   void NSregister();
 
   CORBA::Long GetActiveStudyId();
-  
+
   void ping(){};
 
   //! Restors a visual state of the study at theSavePoint
   bool restoreVisualState(CORBA::Long theSavePoint);
 
+  //! Emit a qt signal from the session GUI desktop window.
+  void emitMessage(const char* theMessage);
+  void emitMessageOneWay(const char* theMessage);
+
 protected:
 
   //! Naming service interface
index 6de6bc78dc9ad82c4ed373b7e26e7a5cdf161d1a..445b89d3a38c1d18856ed5fbccbe11541d0c1394 100644 (file)
@@ -50,16 +50,23 @@ CPPFLAGS+=$(QT_INCLUDES)
 LDFLAGS+=$(QT_MT_LIBS)
 LIBS+=
 
-# create $(top_builddir)/src/Session/styles directory and copy libSalomeStyle.so there
-LIB_PLUGINDIR = $(top_builddir)/src/Session/styles
-LIB_PLUGINLIB = $(patsubst %.la, $(LIB_PLUGINDIR)/%.so, $(filter %.la, $(LIB)))
+# create $(top_builddir)/bin/salome/styles directory and 
+# make link to the libSalomeStyle.so there
+PLUGINDIR = $(top_builddir)/bin/salome/styles
+PLUGIN_LIB_LA = $(patsubst %.la, $(PLUGINDIR)/%.so, $(filter %.la, $(LIB)))
+PLUGIN_LIB_SO = $(patsubst %.so, $(PLUGINDIR)/%.so, $(filter %.so, $(LIB)))
 
-lib: $(LIB) $(LIB_PLUGINDIR) $(LIB_PLUGINLIB)
+lib: $(LIB) $(PLUGINDIR) $(PLUGIN_LIB_LA) $(PLUGIN_LIB_SO)
 
-$(LIB_PLUGINDIR):
+$(PLUGINDIR):
        mkdir -p $@
 
-$(LIB_PLUGINLIB): $(LIB_PLUGINDIR)/%.so: .libs/%.so
+$(PLUGIN_LIB_LA): $(PLUGINDIR)/%.so: %.la
+       -$(RM) $@
+       ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<) $@ || true
+       ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<).0 $@.0 || true
+
+$(PLUGIN_LIB_SO): $(PLUGINDIR)/%.so: %.so
        -$(RM) $@
        ln -sf $(CURDIR)/$< $@ || true
 
index d35196cf5c83a68f6d43be00787aa0aa1d50572f..371e261f42a6d210eb69a903c000d485be159486 100644 (file)
@@ -483,22 +483,25 @@ void SalomeStyle::drawPrimitive( PrimitiveElement pe, QPainter* p, const QRect&
         int textW = flags & Style_Horizontal ? rt.height() : rt.width();
         int textH = flags & Style_Horizontal ? rt.width() : rt.height();
 
-        QString title = titleText( wnd->caption(), textW, p->fontMetrics() );
-
-                   if ( wnd )
+       QFont old_font = p->font(), f = old_font;
+       
+        QString title = titleText( wnd->caption(), textW, textH, f );
+       p->setFont( f );
+       if ( wnd )
         {
-                     QColorGroup cgroup = wnd->isActiveWindow() ? wnd->palette().active() : wnd->palette().inactive();
-                     p->setPen( cgroup.highlightedText() );
+         QColorGroup cgroup = wnd->isActiveWindow() ? wnd->palette().active() : wnd->palette().inactive();
+         p->setPen( cgroup.highlightedText() );
 
-                     if ( flags & Style_Horizontal )
+         if ( flags & Style_Horizontal )
           {
-                       p->rotate( 270.0 );
-                       p->translate( -(rt.height()+rt.y()), (rt.width()-rt.x()) );
-                       p->drawText( 0, 0, title );
-                     }
+           p->rotate( 270.0 );
+           p->translate( -(rt.height()+rt.y()), (rt.width()-rt.x()) );
+           p->drawText( 0, 0, title );
+         }
           else
-                       p->drawText( 2, 2, textW, textH, AlignLeft, title );
-             }
+           p->drawText( 2, 2, textW, textH, AlignLeft, title );
+       }
+       p->setFont( old_font );
       }
       break;
     }
@@ -1279,10 +1282,17 @@ int SalomeStyle::pixelMetric( PixelMetric pm, const QWidget* widget ) const
   \param w - possible width
   \param fm - font metrics
 */
-QString SalomeStyle::titleText( const QString& txt, const int W, const QFontMetrics& fm ) const
+QString SalomeStyle::titleText( const QString& txt, const int W, const int H, QFont& f ) const
 {
   QString res = txt.stripWhiteSpace();
 
+  QFontMetrics fm( f );
+  while( fm.height() > H && f.pointSize()>1 )
+  {
+    f.setPointSize( f.pointSize()-1 );
+    fm = QFontMetrics( f );
+  }
+
   if ( fm.width( res ) > W )
   {
     QString end( "..." );
index e6cdd5807d07440e632170e2805cd7e0e4808c75..e87ebf16d714f166fce36605bf33c675642a8462 100644 (file)
@@ -92,7 +92,7 @@ protected:
   void               drawGradient( QPainter*, const QRect&, const QColor&,
                                   const QColor&, const Direction, gradient_func ) const;
 
-  QString            titleText( const QString&, const int, const QFontMetrics& ) const;
+  QString            titleText( const QString&, const int, const int, QFont& f ) const;
 
 private:
   QWidget*           myTitleParent;
index bec8e5a2b12e4977624521edfa95215f5e8e2fea..9497baf788477812d067cdf673aa9898307b5603 100755 (executable)
@@ -37,7 +37,9 @@ VPATH=.:@srcdir@:@top_srcdir@/idl:@srcdir@/resources
 # header files 
 EXPORT_HEADERS = ToolsGUI.h \
                 ToolsGUI_RegWidget.h \
-                ToolsGUI_CatalogGeneratorDlg.h
+                ToolsGUI_CatalogGeneratorDlg.h \
+                ToolsGUI_HelpWindow.h \
+                ToolsGUI_IntervalWindow.h
 
 # .po files to transform in .qm
 PO_FILES = ToolsGUI_icons.po \
@@ -53,7 +55,9 @@ LIB_SRC = ToolsGUI_CatalogGeneratorDlg.cxx \
          ToolsGUI.cxx
 
 LIB_MOC = ToolsGUI_CatalogGeneratorDlg.h \
-          ToolsGUI_RegWidget.h
+          ToolsGUI_RegWidget.h \
+         ToolsGUI_HelpWindow.h \
+         ToolsGUI_IntervalWindow.h
 
 LIB_CLIENT_IDL = SALOME_Registry.idl SALOME_Exception.idl
 
index 9888f3da9331edd18e7547d54c5ab8fcf234caf3..b4849baf0b9f3bd5e3c0ddf225edecf44b1125e2 100755 (executable)
@@ -36,6 +36,8 @@ class QTextView;
 
 class ToolsGUI_HelpWindow : public QMainWindow
 {
+  Q_OBJECT
+
 public:
   ToolsGUI_HelpWindow( QWidget* parent = 0, const char* name = 0);
   ~ToolsGUI_HelpWindow();
index 5fec1a340abac7649ec690094fe8405e365ac75f..2423736575e315d0d0e7caffd724b514954410ea 100755 (executable)
@@ -34,6 +34,8 @@ using namespace std;
 
 class ToolsGUI_IntervalWindow : public QDialog
 {
+  Q_OBJECT
+
 public:
   ToolsGUI_IntervalWindow( QWidget* parent = 0 );
   ~ToolsGUI_IntervalWindow();
index 886da08d1de81494fc447bccb464b52ea4fa1502..d9c62a9bf4b6b041d8ad828df238cb02cf76e24f 100755 (executable)
@@ -150,23 +150,23 @@ Registry::Components_var MakeRegistry( CORBA::ORB_var &orb )
   // Recuperation de la reference de l'objet
   CORBA::Object_var object = 0 ;
   try
-    {
-      SCRUTE(registryName) ;
-      object = naming.Resolve( registryName ) ;
-      if(CORBA::is_nil(object)) throw CommException( "unable to find the RegistryService" ) ;
-    }
-  catch( const ServiceUnreachable &ex )
-    {
-      MESSAGE( ex.what() )
-      exit( EXIT_FAILURE ) ;
-    }
-  catch( const CORBA::Exception &exx )
-    {
-      exit( EXIT_FAILURE ) ;
-    }
-  
+  {
+    SCRUTE(registryName) ;
+    object = naming.Resolve( registryName ) ;
+    if(CORBA::is_nil(object)) throw CommException( "unable to find the RegistryService" ) ;
+  }
+  catch( const ServiceUnreachableex )
+  {
+    MESSAGE( ex.what() )
+    exit( EXIT_FAILURE ) ;
+  }
+  catch( const CORBA::Exception& )
+  {
+    exit( EXIT_FAILURE ) ;
+  }
+
   // Specialisation de l'objet generique
-  
+
   return Registry::Components::_narrow( object ) ;
 }
 
@@ -342,6 +342,8 @@ QString ToolsGUI_RegWidget::setlongText( const Registry::Infos &c_info)
   QString a = QString( "<hr><h2>" ) + tr( "Code" ) + QString( " : " );
   a.append( QString( c_info.name ) );
   a.append( "</h1><hr><br>" );
+  a.append( "<code>" ); // ASV: 28.07.06 : added <code> tags to make the text font be 
+                        // fixed width (looks much better on Windows)
   a.append( tr( "Process Id" ) + QString( " : " ) );
   a.append( BOLD( QString::number( int( c_info.pid ) ) ) );
   a.append( QString( " " ) + tr( "on machine" ) + QString( " " ) );
@@ -400,6 +402,8 @@ QString ToolsGUI_RegWidget::setlongText( const Registry::Infos &c_info)
       a.append( BOLD( QString::number( int( c_info.difftime ) ) ) );
       a.append( QString( " " ) + tr( "seconds" ) + QString( ")<br>" ) );
     }
+  a.append( "</code>" ); // ASV: 28.07.06 : added <code> tags to make the text font be 
+                         // fixed width (looks much better on Windows)
   END_OF("setlongText");  
   return a;
   
@@ -797,29 +801,22 @@ QString findFile( QString filename )
   // Try CSF_SaloameResources env.var directory ( or directory list )
   cenv = getenv( "CSF_SalomeResources" );
   if ( cenv ) {
-    dir.sprintf( "%s", cenv );
-    if ( !dir.isEmpty() ) {
-      QStringList dirList = QStringList::split( SEPARATOR, dir, false ); // skip empty entries
-      for ( int i = 0; i < dirList.count(); i++ ) {
-       QFileInfo fileInfo( addSlash( dirList[ i ] ) + filename );
-       if ( fileInfo.isFile() && fileInfo.exists() )
-         return fileInfo.filePath();
+  dir.sprintf( "%s", cenv );
+  if ( !dir.isEmpty() )
+  {
+    QStringList dirList = QStringList::split( SEPARATOR, dir, false ); // skip empty entries
+    for ( int i = 0; i < (int)dirList.count(); i++ )
+    {
+           QFileInfo fileInfo( addSlash( dirList[ i ] ) + filename );
+           if ( fileInfo.isFile() && fileInfo.exists() )
+             return fileInfo.filePath();
       }
     }
   }
   return filename;
 }
+
 QString addSlash( const QString& path )
 {
   return Qtx::addSlash( path );
-//  if (!path.isNull()) {
-//#ifdef WNT
-//    QChar slash ('\\');
-//#else
-//    QChar slash ('/');
-//#endif
-//    if ( path.at(path.length()-1) != slash )
-//      return path + slash;
-//  }
-//  return path;
 }
index a5a3d1b96bbc1178ee00dcc42056803a9b794aab..be40bc8a245b71c9c85fa39342d5a979f7129a52 100755 (executable)
 //  Module : SALOME
 //  $Header$
 
-# ifndef __REGWIDGET_H__
-# define __REGWIDGET_H__
-# include <qapplication.h>
-# include <qmainwindow.h>
+#ifndef __REGWIDGET_H__
+#define __REGWIDGET_H__
+#include <qapplication.h>
+#include <qmainwindow.h>
 
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(SALOME_Registry)
@@ -50,7 +50,10 @@ class QPushButton;
 class ToolsGUI_HelpWindow;
 class ToolsGUI_IntervalWindow;
 
-class Standard_EXPORT  ToolsGUI_InfoWindow : public QMainWindow {
+class Standard_EXPORT  ToolsGUI_InfoWindow : public QMainWindow
+{
+  Q_OBJECT
+
 public:
   ToolsGUI_InfoWindow( QWidget* parent = 0, const char* name = 0);
 
@@ -64,9 +67,8 @@ private:
   QTextView* myTextView;
 };
 
-class Standard_EXPORT  ToolsGUI_RegWidget : public QMainWindow
+class Standard_EXPORT ToolsGUI_RegWidget : public QMainWindow
 {
-  
   Q_OBJECT
 
 public:
@@ -114,13 +116,4 @@ private:
   static     ToolsGUI_RegWidget* myRegWidgetPtr;
 };
 
-# endif         /* # ifndef __REGWIDGET_H__ */
-
-
-
-
-
-
-
-
-
+#endif
index 9fee23fb8cf06c8cf5d59e45d80b7f3e94f93e1f..020d20abe411136519c63f96113ce489d97ea18e 100755 (executable)
@@ -99,4 +99,4 @@ LDFLAGS+=$(VTK_LIBS) $(QT_MT_LIBS) $(CAS_KERNEL) -lqtx -lsuit
 
 LDFLAGSFORBIN=$(LDFLAGS)
 
-@CONCLUDE@
\ No newline at end of file
+@CONCLUDE@
index a0d9c4ba0dad34948af9a18a590da0ed89660522..28d5af787d08832451394b89d352306ad9b682cf 100755 (executable)
@@ -52,6 +52,10 @@ class VTKViewer_PassThroughFilter;
 extern int VTKViewer_POINT_SIZE;
 extern int VTKViewer_LINE_WIDTH;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*! \class vtkLODActor
  * \brief For more information see <a href="http://www.vtk.org/">VTK documentation</a>
  */
@@ -330,4 +334,8 @@ class VTKVIEWER_EXPORT VTKViewer_Actor : public vtkLODActor
   bool myIsHighlighted;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif // VTKVIEVER_ACTOR_H
index c9a756381b9b5a16d6460f29a33ba349d8764cc7..f7b1a171d6176ff46d5fd209c5d27590377d847c 100644 (file)
 
 class vtkPoints;
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*! \brief This class used same as vtkAppendFilter. See documentation on VTK for more information.
  */
 class VTKVIEWER_EXPORT VTKViewer_AppendFilter : public vtkAppendFilter 
@@ -101,4 +105,8 @@ protected:
   vtkSmartPointer<vtkPoints> myPoints;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index f50636ab2d7114597558ecdf236509beafc8d419..fde6f4dd267cdf97ccab45b5cc89d099671a2e24 100755 (executable)
@@ -46,6 +46,11 @@ typedef std::map<vtkActor*, VTKViewer_CellDataSet> VTKViewer_ActorDataMap;
 class vtkCell;
 class vtkGenericCell;
 class vtkQuad;
+
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*!Rectangular cell picker class.*/
 class VTK_EXPORT VTKViewer_CellRectPicker : public VTKViewer_RectPicker
 {
@@ -93,6 +98,10 @@ private:
   vtkQuad* Quad2;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
 
 
index b89fd4d998a52683fe5f24b77fd014ca0561b80f..6ba9ee1877769ae0c2665aa9ec14c2ba1c5b79bd 100644 (file)
 #include <set>
 #include <map>
 
+#ifdef WNT
+#include <algorithm>
+#endif
+
 #include <vtkUnstructuredGrid.h>
 #include <vtkGeometryFilter.h>
 #include <vtkDelaunay3D.h>
index 11844fb44751f1be97cbf54ff5989a194f91a524..2bf024d5e0fc1d1a7bd86b948ab215259e59e2dd 100644 (file)
@@ -197,7 +197,6 @@ class VTKVIEWER_EXPORT VTKViewer_DelaunayTriangulator : public VTKViewer_Triangu
   virtual
   vtkIdType 
   GetConnectivity(vtkIdType thePntId);
-
 };
 
 
index 6737674082d73a71a115c78492a1e36a3e72580c..5cb422e118b841dab3d87fa1942f502682e8a9d3 100755 (executable)
@@ -79,9 +79,13 @@ void VTKViewer_ExtractUnstructuredGrid::SetStoreMapping(int theStoreMapping){
   this->Modified();
 }
 
-vtkIdType VTKViewer_ExtractUnstructuredGrid::GetInputId(int theOutId) const{
-  if(myCellIds.empty() && myCellTypes.empty()) return theOutId;
-  if(myOut2InId.empty() || theOutId > myOut2InId.size()) return -1;
+vtkIdType VTKViewer_ExtractUnstructuredGrid::GetInputId(int theOutId) const
+{
+  if ( myCellIds.empty() && myCellTypes.empty() )
+    return theOutId;
+
+  if ( myOut2InId.empty() || theOutId > (int)myOut2InId.size() )
+    return -1;
 #if defined __GNUC_2__
   return myOut2InId[theOutId];
 #else
index f5251a2b2b9432b7d0ece21b094103b7074db293..7a3783a01782ebee305a785685cfc29df9095323 100755 (executable)
 #include <set>
 #include <map>
 #include <vector>
+
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*! \class vtkUnstructuredGridToUnstructuredGridFilter
  * \brief For more information see <a href="http://www.vtk.org/">VTK documentation</a>
  */
@@ -119,4 +124,8 @@ private:
   void operator=(const VTKViewer_ExtractUnstructuredGrid&);
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 389299bdace62f1423330905e8e2bc6fd5112217..420c1a1d32cd56c2580dd209980a708c140377ef 100755 (executable)
@@ -813,8 +813,10 @@ VTKViewer_GeometryFilter
 }
 
 
-vtkIdType VTKViewer_GeometryFilter::GetElemObjId(int theVtkID){
-  if(myVTK2ObjIds.empty() || theVtkID > myVTK2ObjIds.size()) return -1;
+vtkIdType VTKViewer_GeometryFilter::GetElemObjId( int theVtkID )
+{
+  if( myVTK2ObjIds.empty() || theVtkID > (int)myVTK2ObjIds.size() )
+    return -1;
 #if defined __GNUC_2__
   return myVTK2ObjIds[theVtkID];
 #else
index a74b707336daa8c344cb01dbe92506f5b63ce5d8..9c7425aa3ce4dc82b9bfb77b3913c00ee73c2f4d 100755 (executable)
 #include <vtkGeometryFilter.h>
 
 #include <vector>
+
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*! \brief This class used same as vtkGeometryFilter. See documentation on VTK for more information.
  */
 class VTKVIEWER_EXPORT VTKViewer_GeometryFilter : public vtkGeometryFilter 
@@ -106,4 +111,8 @@ private:
   int       myIsWireframeMode;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index d9eb4833fed97880d8c5998f5383d24d9ac5eb1f..b867f64b3536b95dfaf103cf16485c0e7ab38c1b 100644 (file)
@@ -56,6 +56,10 @@ class VTKViewer_RenderWindowInteractor;
 #define VTK_INTERACTOR_STYLE_CAMERA_SELECT     6
 #define VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN 7
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*! Description:\n
  * This class must be supplied with a vtkRenderWindowInteractor wrapper or\n
  * parent. This class should not normally be instantiated by application\n
@@ -185,4 +189,8 @@ class VTKVIEWER_EXPORT VTKViewer_InteractorStyle : public QObject, public vtkInt
   //@}
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index 70dcad67535450cf6c21e8c62bec78ca87fcba78..d8f883b7ac1eefa3c39c99b736ba7d74a83dd30c 100755 (executable)
@@ -76,7 +76,7 @@ int VTKViewer_RectPicker::Pick(float selectionX1, float selectionY1, float selec
   float c1[3], c2[3];
   int picked=0;
   int *winSize;
-  float x, y, t, p;
+  float x, y, t;
   float *viewport;
   float cameraPos[4], cameraFP[4];
   float *displayCoords, *worldCoords;
@@ -88,7 +88,6 @@ int VTKViewer_RectPicker::Pick(float selectionX1, float selectionY1, float selec
   float windowLowerLeft[4], windowUpperRight[4];
   float bounds[6], tol;
   float tF, tB;
-  float hitPosition[3];
   float cameraDOP[3];
   
   //  Initialize picking process
@@ -729,9 +728,9 @@ char VTKViewer_RectPicker::HitBBox (float bounds[6], float origin[4][4], float d
  * p2[4][4] is the corner points of bottom face. 
  * \retval The method returns a non-zero value, if the point is inside.
  */
-char VTKViewer_RectPicker::PointInside (float p[3], float p1[4][4], float p2[4][4], float tol)
+char VTKViewer_RectPicker::PointInside(float p[3], float p1[4][4], float p2[4][4], float tol)
 {
-  int i, j, k;
+  int j, k;
   float t, coord[3];
 
   // Fix one coordinate (x, for example) and 
index 38c64cfc49c59315929a7b3efc3e83edf924118e..b4a7fb6a27f338ccd6e8be17b62c1314299aafdd 100755 (executable)
@@ -166,7 +166,9 @@ void VTKViewer_ShrinkFilter::SetStoreMapping(int theStoreMapping){
 /*!Return node object id by vtk node id.
  *\retval -1 - if no object, else return id.
  */
-vtkIdType VTKViewer_ShrinkFilter::GetNodeObjId(int theVtkID){
-  if(myVTK2ObjIds.empty() || theVtkID > myVTK2ObjIds.size()) return -1;
+vtkIdType VTKViewer_ShrinkFilter::GetNodeObjId(int theVtkID)
+{
+  if ( myVTK2ObjIds.empty() || theVtkID > (int)myVTK2ObjIds.size() )
+    return -1;
   return myVTK2ObjIds.at(theVtkID);
 }
index 4d2a416bb546aadbf515953d45a14368a8d7deb6..336d306362ac3c7fcda29f3ac103bd9cdf241948 100755 (executable)
 
 #include <vector>
 
+#ifdef WIN32
+#pragma warning ( disable:4251 )
+#endif
+
 /*!Shrink cells composing an arbitrary data set.
  *\warning It is possible to turn cells inside out or cause self intersection in special cases.
  */
@@ -57,4 +61,8 @@ private:
   TVectorId myVTK2ObjIds;
 };
 
+#ifdef WIN32
+#pragma warning ( default:4251 )
+#endif
+
 #endif
index c426e0280d7cb5e319e9a4042a8cdbfcfe409c0c..9caa0606ad2dca02b16bc2f4692a038b17fe6cd4 100755 (executable)
@@ -259,6 +259,17 @@ void VTKViewer_Axis::SetSize(vtkFloatingPointType theSize)
   myLabelActor->AddPosition(aPosition);
 }
 
+/*! Check if actor belongs to the axis object
+ * \param theActor - vtkActor pointer
+ * \retval Return true if the actor belongs to the axis object
+ */
+bool VTKViewer_Axis::OwnActor(const vtkActor* theActor)
+{
+  return theActor == myLineActor  || 
+         theActor == myArrowActor ||
+         theActor == myLabelActor;
+}
+
 /*! \class VTKViewer_XAxis
  * \brief X Axis actor
  */
@@ -425,11 +436,31 @@ int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer)
   int aCount = 0;
   while(vtkActor* prop = aCollection->GetNextActor()) {
     if( prop->GetVisibility())
-      if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop))
+      if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop)) {
         if(!anActor->IsInfinitive()) 
-          aCount++;
+         aCount++;
+      }
+      else if ( !OwnActor( anActor ) ) {
+       aCount++;
+      }
         //int aCount = theRenderer->VisibleActorCount();
         //SetVisibility(aVis);
   }
   return aCount;
 }
+
+/*! Check if actor belongs to the axis object
+ * \param theActor - vtkActor pointer
+ * \retval Return true if the actor belongs to the axis object
+ */
+bool VTKViewer_Trihedron::OwnActor(const vtkActor* theActor)
+{
+  myPresent->InitTraversal();
+  while(vtkActor* anActor = myPresent->GetNextActor()) {
+    if ( anActor == theActor ) return true;
+  }
+  for(int i = 0; i < 3; i++) {
+    if ( myAxis[i]->OwnActor(theActor) ) return true;
+  }
+  return false;
+}
index 69b7074a343ac7a3fba48f3fa88fe80639ae87fb..01be4f77a3f2f18ec0432230a9006c1353cdcac7 100755 (executable)
@@ -112,7 +112,7 @@ protected:
 };
 
 /*!This class provide support trihedron object in vtk viewer.*/
-class VTKVIEWER_EXPORT VTKVIEWER_EXPORT VTKViewer_Trihedron : public vtkObject
+class VTKVIEWER_EXPORT VTKViewer_Trihedron : public vtkObject
 {
 protected:
   /*!Initialize fields by default values.*/
@@ -170,6 +170,12 @@ public:
    */
   virtual int         GetVisibleActorCount(vtkRenderer* theRenderer);
   
+  /*! Check if actor belongs to the trihedron object
+   * \param theActor - vtkActor pointer
+   * \retval Return true if the actor belongs to the trihedron object
+   */
+  virtual bool        OwnActor(const vtkActor* theActor);
+
 protected:
   /*! Actor collection*/
   vtkActorCollection* myPresent;
@@ -234,6 +240,12 @@ public:
    * \retval Return myArrowActor
    */
   virtual VTKViewer_UnScaledActor* GetArrow() { return myArrowActor; }
+
+  /*! Check if actor belongs to the axis object
+   * \param theActor - vtkActor pointer
+   * \retval Return true if the actor belongs to the axis object
+   */
+  virtual bool OwnActor(const vtkActor* theActor);
   
 protected:
   /*! Visibility flag.
index 5f061a64bc52ef94caacb6cac3bc00f9f4a64045..09b7642363244dcf98a10192fc24b02e18368ac6 100755 (executable)
@@ -214,3 +214,138 @@ ComputeTrihedronSize( vtkRenderer* theRenderer,
   return fabs( theNewSize - theSize) > theSize * EPS_SIZE ||
          fabs( theNewSize-theSize ) > theNewSize * EPS_SIZE;
 }
+
+bool IsBBEmpty(vtkRenderer* theRenderer)
+{
+  if(!theRenderer)
+    return false;
+
+  vtkFloatingPointType aNewBndBox[6];
+  aNewBndBox[ 0 ] = aNewBndBox[ 2 ] = aNewBndBox[ 4 ] = VTK_LARGE_FLOAT;
+  aNewBndBox[ 1 ] = aNewBndBox[ 3 ] = aNewBndBox[ 5 ] = -VTK_LARGE_FLOAT;
+  
+  // iterate through displayed objects and set size if necessary
+  vtkActorCollection* anActors = theRenderer->GetActors();
+  anActors->InitTraversal();
+  bool isAny = false;
+  while(vtkActor* anAct = anActors->GetNextActor())
+    //if(SALOME_Actor* anActor = dynamic_cast<SALOME_Actor*>(anAct))
+    if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(anAct))
+      if(anActor->GetVisibility() && !anActor->IsInfinitive())
+      {
+       vtkFloatingPointType *aBounds = anActor->GetBounds();
+       if(aBounds[0] > -VTK_LARGE_FLOAT && aBounds[1] < VTK_LARGE_FLOAT &&
+          aBounds[2] > -VTK_LARGE_FLOAT && aBounds[3] < VTK_LARGE_FLOAT &&
+          aBounds[4] > -VTK_LARGE_FLOAT && aBounds[5] < VTK_LARGE_FLOAT)
+         isAny = true;
+      }
+  
+  return !isAny;
+}
+
+bool ComputeBBCenter(vtkRenderer* theRenderer, vtkFloatingPointType theCenter[3])
+{  
+  theCenter[0] = theCenter[1] = theCenter[2] = 0.0;
+  
+  if(!theRenderer)
+    return false;
+
+  vtkFloatingPointType aNewBndBox[6];
+  aNewBndBox[ 0 ] = aNewBndBox[ 2 ] = aNewBndBox[ 4 ] = VTK_LARGE_FLOAT;
+  aNewBndBox[ 1 ] = aNewBndBox[ 3 ] = aNewBndBox[ 5 ] = -VTK_LARGE_FLOAT;
+
+  // iterate through displayed objects and set size if necessary
+  vtkActorCollection* anActors = theRenderer->GetActors();
+  anActors->InitTraversal();
+  bool isAny = false;
+  while(vtkActor* anAct = anActors->GetNextActor())
+  {
+    //if(SALOME_Actor* anActor = dynamic_cast<SALOME_Actor*>(anAct))
+    if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(anAct))
+    {
+      if(anActor->GetVisibility() && !anActor->IsInfinitive())
+      {
+       vtkFloatingPointType *aBounds = anActor->GetBounds();
+       if(aBounds[0] > -VTK_LARGE_FLOAT && aBounds[1] < VTK_LARGE_FLOAT &&
+          aBounds[2] > -VTK_LARGE_FLOAT && aBounds[3] < VTK_LARGE_FLOAT &&
+          aBounds[4] > -VTK_LARGE_FLOAT && aBounds[5] < VTK_LARGE_FLOAT)
+       {
+         for(int i = 0; i < 5; i = i + 2){
+           if(aBounds[i] < aNewBndBox[i]) 
+             aNewBndBox[i] = aBounds[i];
+           if(aBounds[i+1] > aNewBndBox[i+1]) 
+             aNewBndBox[i+1] = aBounds[i+1];
+         }
+         isAny = true;
+       }
+      }
+    }
+  }
+  
+  if ( !isAny )
+  {
+    // null bounding box => the center is (0,0,0)
+    return true;
+  }
+
+  if(aNewBndBox[0] > -VTK_LARGE_FLOAT && aNewBndBox[1] < VTK_LARGE_FLOAT &&
+     aNewBndBox[2] > -VTK_LARGE_FLOAT && aNewBndBox[3] < VTK_LARGE_FLOAT &&
+     aNewBndBox[4] > -VTK_LARGE_FLOAT && aNewBndBox[5] < VTK_LARGE_FLOAT)
+  {
+    static vtkFloatingPointType MIN_DISTANCE = 1.0 / VTK_LARGE_FLOAT;
+    
+    vtkFloatingPointType aLength = aNewBndBox[1]-aNewBndBox[0];
+    aLength = max((aNewBndBox[3]-aNewBndBox[2]),aLength);
+    aLength = max((aNewBndBox[5]-aNewBndBox[4]),aLength);
+    
+    if(aLength < MIN_DISTANCE)
+      return false;
+
+    vtkFloatingPointType aWidth = 
+      sqrt((aNewBndBox[1]-aNewBndBox[0])*(aNewBndBox[1]-aNewBndBox[0]) +
+          (aNewBndBox[3]-aNewBndBox[2])*(aNewBndBox[3]-aNewBndBox[2]) +
+          (aNewBndBox[5]-aNewBndBox[4])*(aNewBndBox[5]-aNewBndBox[4]));
+    
+    if(aWidth < MIN_DISTANCE)
+      return false;
+
+    theCenter[0] = (aNewBndBox[0] + aNewBndBox[1])/2.0;
+    theCenter[1] = (aNewBndBox[2] + aNewBndBox[3])/2.0;
+    theCenter[2] = (aNewBndBox[4] + aNewBndBox[5])/2.0;
+    return true;
+  }
+
+  return false;
+
+  /*
+  vtkFloatingPointType aBounds[6];
+  int aCount = ComputeVisiblePropBounds(theRenderer,aBounds);
+  printf("aNewBndBox[0] = %f, aNewBndBox[1] = %f,\naNewBndBox[2] = %f, aNewBndBox[3] = %f,\naNewBndBox[4] = %f, aNewBndBox[5] = %f\n",
+          aBounds[0],aBounds[1],aBounds[2],aBounds[3],aBounds[4],aBounds[5]);
+  printf("aCount = %d\n",aCount);
+
+  if(aCount){
+    static vtkFloatingPointType MIN_DISTANCE = 1.0 / VTK_LARGE_FLOAT;
+
+    vtkFloatingPointType aLength = aBounds[1]-aBounds[0];
+    aLength = max((aBounds[3]-aBounds[2]),aLength);
+    aLength = max((aBounds[5]-aBounds[4]),aLength);
+    
+    if(aLength < MIN_DISTANCE)
+      return false;
+
+    vtkFloatingPointType aWidth = 
+      sqrt((aBounds[1]-aBounds[0])*(aBounds[1]-aBounds[0]) +
+          (aBounds[3]-aBounds[2])*(aBounds[3]-aBounds[2]) +
+          (aBounds[5]-aBounds[4])*(aBounds[5]-aBounds[4]));
+    
+    if(aWidth < MIN_DISTANCE)
+      return false;
+
+    theCenter[0] = (aBounds[0] + aBounds[1])/2.0;
+    theCenter[1] = (aBounds[2] + aBounds[3])/2.0;
+    theCenter[2] = (aBounds[4] + aBounds[5])/2.0;
+    return true;
+  }
+  return false;*/
+}
index 7ef9cc550c63e20bf47310a7d1eda3b28fb76d4b..f9bd70e0f628a9ad086651a73651d5b95de749ba 100755 (executable)
@@ -47,4 +47,11 @@ ComputeTrihedronSize(vtkRenderer* theRenderer,
                     const vtkFloatingPointType theSize, 
                     const vtkFloatingPointType theSizeInPercents);
 
+VTKVIEWER_EXPORT
+extern
+bool IsBBEmpty(vtkRenderer* theRenderer);
+VTKVIEWER_EXPORT
+extern
+bool ComputeBBCenter(vtkRenderer* theRenderer, 
+                    vtkFloatingPointType theCenter[3]);
 #endif
index 5ec7a8c58335fe28a30c13dbc6281e7317bc4e30..88f4d95fbc1d7355beef2472a3c5e9b5b5f04e66 100755 (executable)
@@ -30,9 +30,8 @@
 
      This software is distributed WITHOUT ANY WARRANTY; without even 
      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
-     PURPOSE.  See the above copyright notice for more information.
+     PURPOSE.  See the above copyright notice for more information.*/
 
-=========================================================================*/
 // VTKViewer_VectorText.cxx is a copy of vtkVectorText.cxx file.
 // Purpose of copying:  to remove linking to libHybrid.so VTK library 
 
index 5838f6a1d837abb212a60ccf608dd80def0a0df2..ac328ecec5ccb1316ea38d4a70acb47b9860e77b 100755 (executable)
@@ -30,9 +30,8 @@
 
      This software is distributed WITHOUT ANY WARRANTY; without even 
      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
-     PURPOSE.  See the above copyright notice for more information.
+     PURPOSE.  See the above copyright notice for more information.*/
 
-=========================================================================*/
 // .NAME vtkVectorText - create polygonal text
 // .SECTION Description
 
index d67c92d1e8cea7b614bfceb6f212ad0999e4c7ea..a206be6ee9e95495d382ba2d3bf70ac42fd41b13 100755 (executable)
 #include "VTKViewer_ViewManager.h"
 #include "VTKViewer_ViewModel.h"
 
-int VTKViewer_ViewManager::_VTKViewMgr_Id = 0;
-
 /*!Constructor.Initialize SIUT_ViewManager by \a study and \a theDesktop.
  * Create new instance of VTKViewer_Viewer and set view model by it.
  */
 VTKViewer_ViewManager::VTKViewer_ViewManager( SUIT_Study* study, SUIT_Desktop* theDesktop ) 
-: SUIT_ViewManager( study, theDesktop )
+: SUIT_ViewManager( study, theDesktop, new VTKViewer_Viewer() )
 {
-  myId = ++_VTKViewMgr_Id;
-  setViewModel( new VTKViewer_Viewer() );
+  setTitle( tr( "VTK_VIEW_TITLE" ) );
 }
 
 /*!Destructor.*/
@@ -36,10 +33,3 @@ VTKViewer_ViewManager::~VTKViewer_ViewManager()
 {
   /*!Do nothing.*/
 }
-
-/*!Sets view window name*/
-void VTKViewer_ViewManager::setViewName(SUIT_ViewWindow* theView)
-{
-  int aPos = myViews.find(theView);
-  theView->setCaption( tr( "VTK_VIEW_TITLE" ).arg( myId ).arg( aPos + 1 ) );
-}
index 49d9a26c8b88d6c2234bc224a316da0891839ee5..38518fe06d3877eab6c8efb41ed671e974c3bf74 100755 (executable)
@@ -33,13 +33,6 @@ class VTKVIEWER_EXPORT VTKViewer_ViewManager : public SUIT_ViewManager
 public:
   VTKViewer_ViewManager( SUIT_Study* study, SUIT_Desktop* );
   virtual ~VTKViewer_ViewManager();
-
-protected:
-  void setViewName( SUIT_ViewWindow* theView );
-
-private:
-  int               myId;
-  static  int       _VTKViewMgr_Id;
 };
 
 #endif
index 9653aeacf11aa2686004790210b42f842454c0c2..f611972ae9d63f315bba8b22b4f17165c2ee63e0 100755 (executable)
 #include <qpalette.h>
 #include <qpopupmenu.h>
 
+bool _InitializeVtkWarningsCall()
+{
+  char* isOn = getenv( "VTK_WARNINGS_IS_ON" );  
+  if ( !isOn || strcmp( isOn, "1" ) )
+    vtkObject::GlobalWarningDisplayOff();
+
+  delete isOn;
+  return vtkObject::GetGlobalWarningDisplay();
+}
+static bool _InitializeVtkWarnings = _InitializeVtkWarningsCall();
+
 /*!Constructor.Sets background color to black.*/
 VTKViewer_Viewer::VTKViewer_Viewer()
 : SUIT_ViewModel(),
index 0f618ddc518502fb6aed4e1ee2600219d2ff6aab..895766a66b88557fee5d72bb1ca04f5bc1950cf4 100755 (executable)
@@ -62,6 +62,9 @@ msgstr "view_reset.png"
 msgid "ICON_VTKVIEWER_VIEW_RIGHT"
 msgstr "view_right.png"
 
+msgid "ICON_VTKVIEWER_VIEW_ROTATION_POINT"
+msgstr "view_rotation_point.png"
+
 msgid "ICON_VTKVIEWER_VIEW_ROTATE"
 msgstr "view_rotate.png"
 
index e98a1dc3cc7eee055ce8ed073e358089eff90db8..ea26f2678875ca2e535d66c477d9434b9fa0b74f 100755 (executable)
@@ -141,7 +141,7 @@ msgid "VTKViewer_Viewer::MEN_CHANGE_BACKGROUD"
 msgstr "Change background..."
 
 msgid "VTKViewer_ViewManager::VTK_VIEW_TITLE"
-msgstr "VTK scene:%1 - viewer:%2"
+msgstr "VTK scene:%M - viewer:%V"
 
 msgid "MNU_SHOW_TRIHEDRON"
 msgstr "Show/Hide trihedron"
diff --git a/src/VTKViewer/resources/view_rotation_point.png b/src/VTKViewer/resources/view_rotation_point.png
new file mode 100755 (executable)
index 0000000..59f5931
Binary files /dev/null and b/src/VTKViewer/resources/view_rotation_point.png differ