]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
PR: mergefrom_PAL_OCC_21Oct04
authorprascle <prascle>
Fri, 22 Oct 2004 12:21:09 +0000 (12:21 +0000)
committerprascle <prascle>
Fri, 22 Oct 2004 12:21:09 +0000 (12:21 +0000)
219 files changed:
INSTALL
Makefile.in
bin/VERSION
bin/launchConfigureParser.py
bin/runSalome
bin/runSalome.csh
bin/runSalome.py
bin/salome.launch
build_configure
doc/salome/gui/KERNEL/files/running_salome_pro.htm
doc/salome/tui/KERNEL/HTML/SALOMEDS.html
doc/salome/tui/KERNEL/HTML/SALOMEDS_Attributes.html
doc/salome/tui/KERNEL/HTML/SALOME_Component.html
doc/salome/tui/KERNEL/HTML/SALOME_ModuleCatalog.html
doc/salome/tui/KERNEL/HTML/SALOME_Session.html
doc/salome/tui/KERNEL/HTML/SALOME_TestComponent.html
doc/salome/tui/KERNEL/doxyfile
doc/salome/tui/KERNEL/sources/static/tree.js
examples/fedges.unv [new file with mode: 0644]
idl/Makefile.in
idl/SALOMEDS.idl
idl/SALOME_Session.idl
make_config.in [new file with mode: 0755]
salome_adm/Makefile.in
salome_adm/unix/config.h.in [new file with mode: 0755]
salome_adm/unix/config_files/check_cas.m4
salome_adm/unix/config_files/check_omniorb.m4
salome_adm/unix/config_files/check_pyqt.m4
salome_adm/unix/config_files/production.m4
salome_adm/unix/make_commence.in
salome_adm/unix/make_conclude.in
src/CASCatch/CASCatch_SignalsHandler.cxx [new file with mode: 0644]
src/CASCatch/CASCatch_SignalsHandler.h [new file with mode: 0644]
src/CASCatch/Makefile.in [new file with mode: 0644]
src/Container/Container_i.cxx
src/Container/Makefile.in
src/Container/SALOME_Component_i.hxx
src/Container/SALOME_Container.cxx
src/Container/SALOME_Container_SignalsHandler.cxx [new file with mode: 0644]
src/Container/SALOME_Container_i.hxx
src/DataTypeCatalog/SALOME_DataTypeCatalog_Handler.cxx
src/DataTypeCatalog/SALOME_DataTypeCatalog_Handler.hxx
src/DataTypeCatalog/SALOME_DataTypeCatalog_Parser.hxx
src/Event/SALOME_Event.cxx
src/Event/SALOME_Event.hxx
src/GenericObj/SALOME_GenericObj_i.cc
src/HDFPersist/HDFconvert.cc
src/HDFPersist/HDFconvert.hxx
src/HDFPersist/HDFexception.hxx
src/Loader/InquireServersQThread.cxx
src/Logger/SALOME_Trace.hxx
src/MEDWrapper/MED_Test.cxx
src/MSG2QM/LICENSE.QPL [new file with mode: 0644]
src/MSG2QM/README [new file with mode: 0644]
src/MSG2QM/msg2qm.cxx
src/Makefile.in
src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.cxx
src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.hxx
src/ModuleCatalog/SALOME_ModuleCatalog_Handler.cxx
src/ModuleCatalog/SALOME_ModuleCatalog_Handler.hxx
src/ModuleCatalog/SALOME_ModuleCatalog_Parser_IO.cxx
src/ModuleCatalog/SALOME_ModuleCatalog_impl.cxx
src/ModuleCatalog/SALOME_ModuleCatalog_impl.hxx
src/NamingService/SALOME_NamingService.cxx
src/NamingService/SALOME_NamingService.hxx
src/Notification/NOTIFICATION_Consumer.cxx
src/OBJECT/Makefile.in
src/OBJECT/SALOME_AISShape.hxx
src/OBJECT/SALOME_Actor.cxx
src/OBJECT/SALOME_Actor.h
src/OBJECT/SALOME_InteractiveObject.cxx
src/OBJECT/SALOME_InteractiveObject.hxx
src/OCCViewer/Makefile.in
src/OCCViewer/OCCViewer_AISSelector.cxx
src/OCCViewer/OCCViewer_AISSelector.h
src/OCCViewer/OCCViewer_Prs.cxx [new file with mode: 0644]
src/OCCViewer/OCCViewer_Prs.h [new file with mode: 0644]
src/OCCViewer/OCCViewer_ViewFrame.cxx
src/OCCViewer/OCCViewer_ViewFrame.h
src/OCCViewer/OCCViewer_ViewPort.cxx
src/OCCViewer/OCCViewer_Viewer3d.cxx
src/OCCViewer/OCCViewer_Viewer3d.h
src/PatchQt/LICENSE.QPL [new file with mode: 0644]
src/PatchQt/Makefile.in
src/PatchQt/README [new file with mode: 0644]
src/PatchQt/qactionP.cxx
src/PatchQt/qactionP.h
src/PatchQt/qfiledialogP.cxx [new file with mode: 0644]
src/PatchQt/qfiledialogP.h [new file with mode: 0644]
src/PatchQt/qsplitterP.cxx
src/PatchQt/qsplitterP.h
src/PatchQt/qworkspaceP.cxx
src/PatchQt/qworkspaceP.h
src/Plot2d/Makefile.in
src/Plot2d/Plot2d_CurveContainer.cxx
src/Plot2d/Plot2d_CurveContainer.h
src/Plot2d/Plot2d_Prs.cxx [new file with mode: 0644]
src/Plot2d/Plot2d_Prs.h [new file with mode: 0644]
src/Plot2d/Plot2d_SetupPlot2dDlg.cxx
src/Plot2d/Plot2d_ViewFrame.cxx
src/Plot2d/Plot2d_ViewFrame.h
src/Prs/Makefile.in [new file with mode: 0755]
src/Prs/SALOME_Prs.cxx [new file with mode: 0644]
src/Prs/SALOME_Prs.h [new file with mode: 0644]
src/RegistryDisplay/RegWidget.cxx
src/RessourcesCatalog/SALOME_RessourcesCatalog_Handler.cxx
src/RessourcesCatalog/SALOME_RessourcesCatalog_Handler.hxx
src/RessourcesCatalog/SALOME_RessourcesCatalog_Parser.hxx
src/SALOMEDS/Makefile.in
src/SALOMEDS/SALOMEDS_AttributeDrawable_i.cxx
src/SALOMEDS/SALOMEDS_AttributeExpandable_i.cxx
src/SALOMEDS/SALOMEDS_AttributeName_i.cxx
src/SALOMEDS/SALOMEDS_AttributeOpened_i.cxx
src/SALOMEDS/SALOMEDS_AttributePythonObject_i.cxx
src/SALOMEDS/SALOMEDS_AttributeReal_i.cxx
src/SALOMEDS/SALOMEDS_AttributeSelectable_i.cxx
src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.cxx
src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.cxx
src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.cxx
src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.cxx
src/SALOMEDS/SALOMEDS_GenericAttribute_i.hxx
src/SALOMEDS/SALOMEDS_SComponent_i.cxx
src/SALOMEDS/SALOMEDS_SObject_i.cxx
src/SALOMEDS/SALOMEDS_SObject_i.hxx
src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx
src/SALOMEDS/SALOMEDS_StudyManager_i.cxx
src/SALOMEDS/SALOMEDS_TableOfStringAttribute.cxx
src/SALOMEDS/SALOMEDS_TargetAttribute.cxx
src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.cxx
src/SALOMEGUI/CLIENT_msg_en.po
src/SALOMEGUI/Makefile.in
src/SALOMEGUI/PyInterp_PyQt.cxx
src/SALOMEGUI/PyInterp_base.cxx
src/SALOMEGUI/QAD_Desktop.cxx
src/SALOMEGUI/QAD_Desktop.h
src/SALOMEGUI/QAD_FileDlg.cxx
src/SALOMEGUI/QAD_FileDlg.h
src/SALOMEGUI/QAD_FileValidator.cxx
src/SALOMEGUI/QAD_ListView.cxx
src/SALOMEGUI/QAD_ObjectBrowser.cxx
src/SALOMEGUI/QAD_ObjectBrowser.h
src/SALOMEGUI/QAD_PyEditor.cxx
src/SALOMEGUI/QAD_PyInterp_mono.cxx
src/SALOMEGUI/QAD_RightFrame.cxx
src/SALOMEGUI/QAD_RightFrame.h
src/SALOMEGUI/QAD_Study.cxx
src/SALOMEGUI/QAD_Study.h
src/SALOMEGUI/QAD_StudyFrame.cxx
src/SALOMEGUI/QAD_StudyFrame.h
src/SALOMEGUI/QAD_ViewFrame.cxx
src/SALOMEGUI/QAD_ViewFrame.h
src/SALOMEGUI/QAD_msg_en.po
src/SALOMEGUI/SALOMEGUI_Application.cxx
src/SALOMEGUI/SALOMEGUI_Swig.cxx
src/SALOMEGUI/SALOMEGUI_Swig.hxx
src/SALOMEGUI/SALOMEGUI_TableDlg.cxx
src/SALOMEGUI/SALOME_DataMapIteratorOfDataMapOfIOMapOfInteger.hxx
src/SALOMEGUI/SALOME_DataMapIteratorOfDataMapOfIOMapOfInteger_0.cxx
src/SALOMEGUI/SALOME_DataMapNodeOfDataMapOfIOMapOfInteger.hxx
src/SALOMEGUI/SALOME_DataMapNodeOfDataMapOfIOMapOfInteger_0.cxx
src/SALOMEGUI/SALOME_DataMapOfIOMapOfInteger.hxx
src/SALOMEGUI/SALOME_DataMapOfIOMapOfInteger_0.cxx
src/SALOMEGUI/SALOME_Selection.cxx
src/SALOMEGUI/SALOME_Selection.h
src/SALOMELocalTrace/SALOME_Log.cxx
src/SALOMELocalTrace/SALOME_Log.hxx
src/SALOMELogger/SALOME_LoggerClient.cxx
src/SALOME_PYQT/SALOME_PYQT_GUI.cxx
src/SALOME_SWIG/batchmode_salome.py
src/SALOME_SWIG/salome_test.py
src/SUPERVGraph/SUPERVGraph_ViewFrame.h
src/Session/Makefile.in
src/Session/SALOME_Session_Server.cxx
src/Session/SALOME_Session_SignalsHandler.cxx [new file with mode: 0644]
src/Session/SALOME_Session_i.cxx
src/Session/SALOME_Session_i.hxx
src/Session/Session_ServerLauncher.cxx
src/Session/Session_ServerThread.cxx
src/Session/Session_ServerThread.hxx
src/TOOLSDS/SALOMEDS_Tool.cxx
src/TOOLSDS/SALOMEDS_Tool.hxx
src/TOOLSGUI/ToolsGUI_CatalogGeneratorDlg.cxx
src/TestContainer/TestContainer.cxx
src/Utils/Makefile.in
src/Utils/Utils_DESTRUCTEUR_GENERIQUE.cxx
src/Utils/Utils_ExceptHandlers.cxx
src/Utils/Utils_ExceptHandlers.hxx
src/Utils/Utils_Identity.cxx
src/Utils/Utils_SALOME_Exception.hxx
src/Utils/Utils_SINGLETON.hxx
src/Utils/Utils_SignalsHandler.cxx [new file with mode: 0644]
src/Utils/Utils_SignalsHandler.h [new file with mode: 0644]
src/Utils/Utils_Timer.cxx
src/Utils/duplicate.cxx
src/Utils/utilities.h
src/VTKFilter/Makefile.in
src/VTKFilter/SALOME_ExtractUnstructuredGrid.cxx
src/VTKFilter/SALOME_ExtractUnstructuredGrid.h
src/VTKFilter/SALOME_GeometryFilter.cxx
src/VTKFilter/SALOME_GeometryFilter.h
src/VTKFilter/SALOME_ShrinkFilter.cxx [new file with mode: 0644]
src/VTKFilter/SALOME_ShrinkFilter.h [new file with mode: 0644]
src/VTKViewer/Makefile.in
src/VTKViewer/VTKViewer_Actor.cxx [new file with mode: 0644]
src/VTKViewer/VTKViewer_Actor.h [new file with mode: 0644]
src/VTKViewer/VTKViewer_Algorithm.h [new file with mode: 0644]
src/VTKViewer/VTKViewer_CellRectPicker.cxx
src/VTKViewer/VTKViewer_Filter.h
src/VTKViewer/VTKViewer_Functor.h [new file with mode: 0644]
src/VTKViewer/VTKViewer_InteractorStyleSALOME.cxx
src/VTKViewer/VTKViewer_InteractorStyleSALOME.h
src/VTKViewer/VTKViewer_Prs.cxx [new file with mode: 0644]
src/VTKViewer/VTKViewer_Prs.h [new file with mode: 0644]
src/VTKViewer/VTKViewer_RenderWindowInteractor.cxx
src/VTKViewer/VTKViewer_RenderWindowInteractor.h
src/VTKViewer/VTKViewer_Trihedron.cxx
src/VTKViewer/VTKViewer_Trihedron.h
src/VTKViewer/VTKViewer_ViewFrame.cxx
src/VTKViewer/VTKViewer_ViewFrame.h

diff --git a/INSTALL b/INSTALL
index 197b45757794d32f96d3b3ab8271faeea922557c..a8d9d6266804b8a968bb3841619378c902818b66 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,7 @@
-This is the version 2.0.0 of KERNEL
+This is the version 2.1.0 of KERNEL
 
 Previous versions :
-       - 1.4.1
+        - 2.0.0
+        - 1.4.1
        - 1.3.0
        - 1.2.1
index 5ec410ee3b9d79316433d906844a5827464a4389..426130bbdc03de15b1744e4b3366b2fe55011e45 100644 (file)
@@ -100,10 +100,20 @@ salome.launch \
 showNS.py
 
 # copy header files in common directory
-ifeq ($(HAVE_SSTREAM),yes)
-  include_list=include/salome/SALOMEconfig.h
+OWN_CONFIG_H=@OWN_CONFIG_H@
+
+ifeq ($(OWN_CONFIG_H),yes)
+    ifeq ($(HAVE_SSTREAM),yes)
+       include_list=include/salome/SALOMEconfig.h include/salome/config.h
+    else
+       include_list=include/salome/SALOMEconfig.h include/salome/config.h include/salome/sstream
+    endif
 else
-  include_list=include/salome/SALOMEconfig.h include/salome/sstream
+    ifeq ($(HAVE_SSTREAM),yes)
+       include_list=include/salome/SALOMEconfig.h
+    else
+       include_list=include/salome/SALOMEconfig.h include/salome/sstream
+    endif
 endif
 
 inc: idl $(include_list)
@@ -121,6 +131,10 @@ salome_adm/unix/SALOMEconfig.ref: salome_adm/unix/SALOMEconfig.h
          cp -p $< $@;        \
        fi;                   \
 
+include/salome/config.h: salome_adm/unix/config.h
+       -$(RM) $@
+       $(LN_S) ../../$< $@
+
 include/salome/sstream: salome_adm/unix/sstream
        -$(RM) $@
        $(LN_S) ../../$< $@
@@ -168,7 +182,7 @@ distclean: distclean-other
 distclean-other:
        -$(RM) salome_adm/unix/*~ salome_adm/unix/*% salome_adm/unix/*.bak salome_adm/unix/*.new salome_adm/unix/*.old
        -$(RM) salome_adm/unix/make_* 
-       -$(RM) salome_adm/unix/depend salome_adm/unix/SALOMEconfig.h 
+       -$(RM) salome_adm/unix/depend salome_adm/unix/SALOMEconfig.h salome_adm/unix/config.h 
        -$(RM) config.cache config.log config.status 
 
 @MODULE@
index 699b2270c8f404687bf3dfc1530861b39703e9ac..f15697e352f79c739e4a4609daa6ed1e90a66ae2 100755 (executable)
@@ -1 +1 @@
-THIS IS SALOME - KERNEL VERSION: 2.0.0
+THIS IS SALOME - KERNEL VERSION: 2.1.0
index 47f120d8e01cad8d8dd62fa89789774e3d7cd9e9..b673049e990ae8787e1f92cd3ea6b97261f6315a 100755 (executable)
@@ -44,7 +44,7 @@ class xml_parser:
                 pass
         elif self.space == ["Configuration-list","modules-list","module","plugin"] and "name" in attrs.getNames():
             key = str(self.currentModuleName)+"_plugins"
-            if not self.opts.has_key("key"):
+            if not self.opts.has_key(key):
                 self.opts[key]=[]
                 pass
             self.opts[key].append(attrs.getValue("name"))
index 9577ea58ebdb5fa1206d5c39a33d9715426e3acf..7505e8b891648bfbf556c3f7719ac61327ed4b34 100755 (executable)
@@ -1,19 +1,33 @@
 #!/bin/bash
 
-NSPORT=2809
-echo -n "Searching for free port for the SALOME Naming Service: "
-while [ ${NSPORT} -lt 3000 ]; do
-    NSPORT=`expr ${NSPORT} + 1`
-    aRes=`netstat -ltn | grep -E :${NSPORT}`
-    if [ -z "$aRes" ]; then
-cat > ${OMNIORB_CONFIG} <<EOF
-ORBInitRef NameService=corbaname::`hostname`:${NSPORT}
-EOF
-        echo ${NSPORT} - Ok
-        break
-    fi
-    echo -n "${NSPORT}; "
-done
+searchFreePort() {
+    echo -n "Searching for a free port for naming service: "
+    export NSPORT=2810
+    local limit=$NSPORT
+    let limit=limit+100
+    while [ 1 ]
+    do
+        aRes=`netstat -ltn | grep -E :${NSPORT}`
+        if [ -z "$aRes" ]; then
+            echo ${NSPORT} - Ok
+           local myhost=`hostname`
+            export OMNIORB_CONFIG=${HOME}/.omniORB_${myhost}_${NSPORT}.cfg
+            local initref="NameService=corbaname::"`hostname`":$NSPORT"
+            echo "ORBInitRef $initref" > $OMNIORB_CONFIG
+            break
+        fi
+        echo -n "${NSPORT} "
+        if [[ $NSPORT -eq $limit ]] ; then
+            echo
+            echo "Can't find a free port to launch omniNames"
+            echo "Try to kill the running servers and then launch SALOME again."
+            exit
+        fi
+        let NSPORT=NSPORT+1
+    done
+}
+
+searchFreePort
 
 if [ $# -ne 0 ] ; then
     python -i ${KERNEL_ROOT_DIR}/bin/salome/runSalome.py $* 
@@ -26,15 +40,15 @@ fi
 # ---------
 #  $: ${KERNEL_ROOT_DIR}/bin/salome/runSalome
 #
-#     parameters read from $HOME/.salome/salome.launch 
-#     if the config file does not exist, it is created with default values
+#     - parameters for launching are taken from $HOME/.salome/salome.launch;
+#     - if the config file does not exist, it is created with default values.
 #
 #  
 #  $: ${KERNEL_ROOT_DIR}/bin/salome/runSalome --modules=GEOM,SMESH,VISU,SUPERV,MED --embedded=registry,study,moduleCatalog,cppContainer --standalone=pyContainer,supervContainer --xterm --killall
 #
 #     parameters from command line supersede those from $HOME/.salome/salome.launch
 #
-# Some CORBA servers could be launched in the SALOME_Session_Server
+# Some CORBA servers can be launched in the SALOME_Session_Server's process
 # (embedded = same process) or in a separate process (standalone):
 # --> registry,study,moduleCatalog,cppContainer
 # Other CORBA servers could only be launched in separate process (standalone):
index 5761b299f96d1aa6dc71ec31009eb8a5468fc6c1..73798c25c137f8ae3ae66b7f8b84e2054dd74a66 100755 (executable)
@@ -1,3 +1,3 @@
 #!/bin/csh -f
 
-runSalome --gui --modules=GEOM,SMESH,DATA,VISU,SUPERV,MED --containers=cpp,python --killall
+runSalome --gui --modules=GEOM,SMESH,VISU,SUPERV,MED --containers=cpp,python --killall
index af5d4c114f9fd937b6f52431a65999d6ff04568c..400866a1bef3363ae4388902c6b383776ac53a99 100755 (executable)
@@ -255,7 +255,10 @@ if "SMESH" in modules_list:
                 add_path(os.path.join(plugin_root,"bin",args['appname']), "PATH")
         pass
     pass
-   
+
+# set environment for SUPERV module
+os.environ["ENABLE_MACRO_NODE"]="1"
+
 import orbmodule
 
 #
@@ -330,6 +333,8 @@ def startSalome():
   if "GEOM" in modules_list:
        print "GEOM OCAF Resources"
        os.environ["CSF_GEOMDS_ResourcesDefaults"]=os.path.join(modules_root_dir["GEOM"],"share",args['appname'],"resources")
+       print "GEOM Shape Healing Resources"
+        os.environ["CSF_ShHealingDefaults"]=os.path.join(modules_root_dir["GEOM"],"share",args['appname'],"resources")
 
   if 'study' not in args['embedded']:
       SalomeDSServer().run()
index 43b8fc9f6e0cb757bfd5a10eee19d0be4b9f4da8..1b5bbdd1b579140b8b69c8f1ffbaa0ac1493ba6c 100644 (file)
@@ -10,8 +10,8 @@
                <module name="GEOM"/>
                <module name="SMESH">
                        <plugin name="NETGENPlugin"/>
+                       <plugin name="GHS3DPlugin"/>
                </module>
-               <module name="DATA"/>
                <module name="VISU"/>
                <module name="SUPERV"/>
                <module name="MED"/>
index 0cf5fc380ad1cb9c6ef1809fefdc8e7d658e694f..8ce1d16edf507dc0ed325a91bceff90b0b15b673 100755 (executable)
@@ -119,7 +119,7 @@ echo "  ./salome_adm/Makefile \\" >> configure.in_tmp1
 touch configure.in_tmp2
 find_in . configure.in_tmp2
 sed '/^...salome_adm/d' configure.in_tmp2 >  configure.in_tmp3
-sed '/configure.in/d' configure.in_tmp3 >  configure.in_tmp2
+sed '/configure.in/d;/make_config.in/d' configure.in_tmp3 >  configure.in_tmp2
 sed 's/.in / /' configure.in_tmp2 >> configure.in_tmp1
 
 echo  "])" >> configure.in_tmp1
@@ -191,6 +191,23 @@ else
        echo "failed (check file permissions and/or user quotas ...)"
 fi
 
+###############################################################
+# Creating make_config
+#
+if test -f make_config
+then
+       echo -n "Updating 'make_config' script ...  "
+else
+       echo -n "Creating 'make_config' script ...  "
+fi
+
+if autoconf -o make_config make_config.in
+then
+       echo "done"
+else
+       echo "failed (check file permissions and/or user quotas ...)"
+fi
+
 cd ${ORIG_DIR}
 
 echo
index c375593918fe54eafe67d4040ba50a51d4e152d7..358eb21ac3334254ebf50178629704b7a77ff533 100755 (executable)
@@ -1,38 +1,41 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">\r
-\r
-<html>\r
-\r
-<!--(==============================================================)-->\r
-<!--(Document created with RoboEditor. )============================-->\r
-<!--(==============================================================)-->\r
-\r
-<head>\r
-\r
-<title>Running SALOME</title>\r
-\r
-<!--(Meta)==========================================================-->\r
-\r
-<meta http-equiv=content-type content="text/html; charset=windows-1252">\r
-<meta name=generator content="RoboHELP by eHelp Corporation - www.ehelp.com">\r
-<meta name=generator-major-version content=0.1>\r
-<meta name=generator-minor-version content=1>\r
-<meta name=filetype content=kadov>\r
-<meta name=filetype-version content=1>\r
-<meta name=page-count content=1>\r
-<meta name=layout-height content=1118>\r
-<meta name=layout-width content=707>\r
-\r
-\r
-<!--(Links)=========================================================-->\r
-\r
- <link rel='stylesheet' href='../default_ns.css'>\r
-<script type="text/javascript" language="JavaScript" title="WebHelpSplitCss">\r
+<!DOCTYPE doctype PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">
+<html>
+<head>
+<!--(==============================================================)--><!--(Document created with RoboEditor. )============================--><!--(==============================================================)-->
+  <title>Running SALOME</title>
+    <!--(Meta)==========================================================--> 
+  <meta http-equiv="content-type"
+ content="text/html; charset=windows-1252">
+  <meta name="generator"
+ content="RoboHELP by eHelp Corporation - www.ehelp.com">
+  <meta name="generator-major-version" content="0.1">
+  <meta name="generator-minor-version" content="1">
+  <meta name="filetype" content="kadov">
+  <meta name="filetype-version" content="1">
+  <meta name="page-count" content="1">
+  <meta name="layout-height" content="1118">
+  <meta name="layout-width" content="707">
+   <!--(Links)=========================================================--> 
+  
+  <link rel="stylesheet" href="../default_ns.css">
+  <script type="text/javascript" language="JavaScript"
+ title="WebHelpSplitCss">\r
 <!--\r
 if (navigator.appName !="Netscape")\r
 {   document.write("<link rel='stylesheet' href='../default.css'>");}\r
 //-->\r
-</script>\r
-<style type="text/css">\r
+  </script> 
+  <style type="text/css">\r
 <!--\r
 h1.whs1 {font-family: 'Times New Roman', serif;}\r
 p.whs2 {margin-left: 0px; font-style: italic; color: #000000; font-family: 'Arial Black', sans-serif;}\r
@@ -65,8 +68,8 @@ p.whs28 {font-weight:bold; margin-left:0px; font-family:'Courier New' , monospac
 p.whs29 {font-family: 'Times New Roman', serif; margin-left: 80px;}\r
 p.whs30 {font-family: 'Courier New', monospace; margin-left: 0px;}\r
 -->\r
-</style>\r
-<script type="text/javascript" language="JavaScript">\r
+  </style> 
+  <script type="text/javascript" language="JavaScript">\r
 <!--\r
 if ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) == 4))\r
 {\r
@@ -81,8 +84,11 @@ if ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) == 4))
   document.write(strNSS);\r
 }\r
 //-->\r
-</script>\r
-<script type="text/javascript" language="JavaScript" title="BSSC Special Effects" src="../ehlpdhtm.js"></script><script type="text/javascript" language="JavaScript" title="WebHelpInlineScript">\r
+  </script> 
+  <script type="text/javascript" language="JavaScript"
+ title="BSSC Special Effects" src="../ehlpdhtm.js"></script>
+  <script type="text/javascript" language="JavaScript"
+ title="WebHelpInlineScript">\r
 <!--\r
 function reDo() {\r
   if (innerWidth != origWidth || innerHeight != origHeight)\r
@@ -95,24 +101,24 @@ if ((parseInt(navigator.appVersion) == 4) && (navigator.appName == "Netscape"))
 }\r
 onerror = null; \r
 //-->\r
-</script>\r
-<style type="text/css">\r
+  </script> 
+  <style type="text/css">\r
 <!--\r
   div.WebHelpPopupMenu {position:absolute; left:0px; top:0px; z-index:4; visibility:hidden;}\r
 -->\r
-</style>\r
-<script type="text/javascript" language="javascript1.2" src="../whmsg.js"></script>\r
-<script type="text/javascript" language="javascript" src="../whver.js"></script>\r
-<script type="text/javascript" language="javascript1.2" src="../whproxy.js"></script>\r
-<script type="text/javascript" language="javascript1.2" src="../whutils.js"></script>\r
-<script type="text/javascript" language="javascript1.2" src="../whtopic.js"></script>\r
-</head>\r
-\r
-<!--(Body)==========================================================-->\r
-\r
-\r
-<body>\r
-\r
+  </style> 
+  <script type="text/javascript" language="javascript1.2"
+ src="../whmsg.js"></script> 
+  <script type="text/javascript" language="javascript" src="../whver.js"></script> 
+  <script type="text/javascript" language="javascript1.2"
+ src="../whproxy.js"></script> 
+  <script type="text/javascript" language="javascript1.2"
+ src="../whutils.js"></script> 
+  <script type="text/javascript" language="javascript1.2"
+ src="../whtopic.js"></script><!--(Body)==========================================================-->
+</head>
+           <body>
+  
 <script type="text/javascript" language="javascript1.2">\r
 <!--\r
 if (window.gbWhTopic)\r
@@ -141,178 +147,212 @@ addButton("show",BTN_TEXT,"Show","","","","",0,0,"","","");
 else\r
        document.location.reload();\r
 //-->\r
-</script>\r
-<h1 class="whs1">Running SALOME</h1>\r
-\r
-<p class="whs2">To launch SALOME:</p>\r
-\r
-<p class="whs3">&nbsp;</p>\r
-\r
-<p class="whs4">1. Install the SALOME package into a definite \r
- directory (ex. <span style="font-weight: bold;"><B>SALOME</B></span>) on your \r
- hard disk. It is preferable if you use the <a href="installing_salome_pro.htm">special \r
- installation procedure</a> allowing to install the &nbsp;SALOME \r
- platform and all corresponding applications. </p>\r
-\r
-<p class="whs5">&nbsp;</p>\r
-\r
-<p class="whs6">2.<span style="font-family: 'Courier New', monospace;"> \r
- </span>The installation shell script will create a special file: <b>env.csh</b> \r
- (CShell file) in your <b><i><span style="font-style: normal; font-weight: bold;"><B>SALOME</B></span><span \r
- style="font-weight: normal; font-style: normal;"> </span></i></b>directory. \r
- This file contains all environment variables necessary for launching SALOME \r
- platform with other application products provided with SALOME installation \r
- package. You have a possibility to add one of them into your profile if \r
- you enter in the command console the following:</p>\r
-\r
-<p class="whs6">&nbsp;</p>\r
-\r
-<p class="whs6"><span style="font-family: 'Courier New', monospace;">source \r
- env.csh </span></p>\r
-\r
-<p class="whs6">&nbsp;</p>\r
-\r
-<p class="whs7"><img src="../tip1.gif" x-maintain-ratio="TRUE" width="35px" height="37px" border="0" class="img_whs8"> <span style="font-family: 'Times New Roman', serif;">During \r
- the installation procedure you have a possibility <a href="installing_salome_pro.htm#profile">to \r
- set your profile automatically.</a> </span>&nbsp;</p>\r
-\r
-<p class="whs9">&nbsp;</p>\r
-\r
-<p>&nbsp;</p>\r
-\r
-<p class="whs10">3. Launch SALOME platform, using the following \r
- Python script located in the <span style="font-weight: bold;"><B>SALOME/KERNEL/bin/salome</B></span> \r
- directory:</p>\r
-\r
-<p class="whs11">&nbsp;</p>\r
-\r
-<ul type="disc" class="whs12">\r
-       \r
-       <li class=kadov-p><p class="whs10"><span style="font-weight: bold;"><B>runSalome.py</B></span> \r
- [command line options]</p></li>\r
-</ul>\r
-\r
-<p class="whs10">&nbsp;</p>\r
-\r
-<!--(Table)=========================================================-->\r
-<table x-use-null-cells resizable="no" cellspacing="0" width="96.029%" class="whs13">\r
-<script language='JavaScript'><!--\r
+</script> 
+<h1 class="whs1">Running SALOME</h1>
+  
+<p class="whs2">To launch SALOME:</p>
+  
+<p class="whs3"> </p>
+  
+<p class="whs4">1. Install the SALOME package into a definite   directory
+(ex. <span style="font-weight: bold;"><b>SALOME</b></span>) on your   hard
+disk. It is preferable if you use the <a href="readme.html">special   installation
+procedure</a> allowing to install the  SALOME   platform and all corresponding
+applications. </p>
+  
+<p class="whs5"> </p>
+  
+<p class="whs6">2.<span style="font-family: 'Courier New',monospace;">  
+</span>The installation shell script will create a special file: <b>env.csh</b>
+  (CShell file) in your <b><i><span
+ style="font-style: normal; font-weight: bold;"><b>SALOME</b></span><span
+ style="font-weight: normal; font-style: normal;"> </span></i></b>directory.
+  This file contains all environment variables necessary for launching SALOME
+  platform with other application products provided with SALOME installation
+  package. You have a possibility to add one of them into your profile if
+  you enter in the command console the following:</p>
+  
+<p class="whs6"> </p>
+  
+<p class="whs6"><span style="font-family: 'Courier New',monospace;">source
+  env.csh </span></p>
+  
+<p class="whs6"> </p>
+  
+<p class="whs10">3. Launch SALOME platform, using the following   Python
+script located in the <span style="font-weight: bold;"><b>SALOME/KERNEL/bin/salome</b></span>
+  directory:</p>
+  
+<p class="whs11"> </p>
+  
+<ul type="disc" class="whs12">
+               <li class="kadov-p">
+    <p class="whs10"><span style="font-weight: bold;"><b>runSalome.py</b></span>
+  [command line options]</p>
+  </li>
+</ul>
+  
+<p class="whs10"> </p>
+  <!--(Table)=========================================================--> 
+<table x-use-null-cells="" resizable="no" cellspacing="0" width="96%"
+ class="whs13">
+  <script language="JavaScript"><!--\r
 if ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) == 4)) document.write("</table><table x-use-null-cells resizable='no' cellspacing='0' width='96.029%' border='1' bordercolor='silver' bordercolorlight='silver' bordercolordark='silver'>");\r
-//--></script>\r
-<col class="whs14">\r
-<col class="whs15">\r
-\r
-<tr valign="top" class="whs16">\r
-<td bgcolor="#400080" width="214px" class="whs17">\r
-<p class="whs18">Options</td>\r
-<td bgcolor="#400080" width="390px" class="whs19">\r
-<p class="whs18">Description</td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td width="214px" class="whs20">\r
-<p><span style="font-weight: bold;"><B>--help</B></span> <span style="font-style: italic;"><I>or</I></span> \r
- <span style="font-weight: bold;"><B>-h</B></span> &nbsp;&nbsp;</td>\r
-<td width="390px" class="whs21">\r
-<p>print this help</p>\r
-<p>&nbsp;</td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td width="214px" class="whs20">\r
-<p><span style="font-weight: bold;"><B>--gui</B></span> <span style="font-style: italic;"><I>or</I></span> \r
- <span style="font-weight: bold;"><B>-g</B></span> &nbsp;&nbsp;</td>\r
-<td width="390px" class="whs21">\r
-<p>launch with GUI</td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td width="214px" class="whs20">\r
-<p>&nbsp;<span style="font-weight: bold;"><B><a \r
- name=batchmode></a>--terminal</B></span> <span style="font-style: italic;"><I>or \r
- </I></span><span style="font-weight: bold;"><B>-t</B></span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\r
-<td width="390px" class="whs21">\r
-<p>launch without GUI in batch mode</td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td colspan="1" rowspan="1" width="214px" class="whs20">\r
-<p><span style="font-weight: bold;"><B>--logger</B></span> <span style="font-style: italic;"><I>or</I></span> \r
- <span style="font-weight: bold;"><B>-l</B></span> &nbsp;&nbsp;</td>\r
-<td colspan="1" rowspan="1" width="390px" class="whs21">\r
-<p>redirection of log messages into a definite file </td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td colspan="1" rowspan="1" width="214px" class="whs20">\r
-<p><span style="font-weight: bold;"><B>--xterm</B></span> <span style="font-style: italic;"><I>or</I></span> \r
- <span style="font-weight: bold;"><B>-x</B></span> </td>\r
-<td colspan="1" rowspan="1" width="390px" class="whs21">\r
-<p>the servers open an xterm window and log messages are displayed in this \r
- window</td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td colspan="1" rowspan="1" width="214px" class="whs20">\r
-<p><span style="font-weight: bold;"><B>--modules=module1,module2,...</B></span> \r
- <span style="font-style: italic;"><I>or</I></span> <span style="font-weight: bold;"><B>-m=module1,module2,...</B></span></td>\r
-<td colspan="1" rowspan="1" width="390px" class="whs21">\r
-<p>list of SALOME modules which will be loaded into the module catalogue</td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td colspan="1" rowspan="1" width="214px" class="whs22">\r
-<p><span style="font-weight: bold;"><B>--containers=cpp,python,superv</B></span></p>\r
-<p><span style="font-style: italic;"><I>or</I></span> <span style="font-weight: bold;"><B>-c=cpp,python,superv</B></span></td>\r
-<td colspan="1" rowspan="1" width="390px" class="whs23">\r
-<p>launch of cpp, python and supervision containers</td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td colspan="1" rowspan="1" width="214px" class="whs24">\r
-<p><span style="font-weight: bold;"><B>--portkill</B></span> <span style="font-style: italic;"><I>or</I></span> \r
- <span style="font-weight: bold;"><B>-p</B></span></td>\r
-<td colspan="1" rowspan="1" width="390px" class="whs25">\r
-<p>kill SALOME launched with the current port</td></tr>\r
-\r
-<tr valign="top" class="whs16">\r
-<td colspan="1" rowspan="1" width="214px" class="whs26">\r
-<p><span style="font-weight: bold;"><B>--killall</B></span> <span style="font-style: italic;"><I>or</I></span> \r
- <span style="font-weight: bold;"><B>-k</B></span> &nbsp;&nbsp;&nbsp;</td>\r
-<td colspan="1" rowspan="1" width="390px" class="whs27">\r
-<p>kill SALOME</td></tr>\r
-<script language='JavaScript'><!--\r
+//--></script> 
+  <col class="whs14"> <col class="whs15">  <tbody>
+    <tr valign="top" class="whs16">
+ <td bgcolor="#400080" width="214" class="whs17"> 
+      <p class="whs18">Options</p>
+      </td>
+ <td bgcolor="#400080" width="390" class="whs19"> 
+      <p class="whs18">Description</p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td width="214" class="whs20"> 
+      <p><span style="font-weight: bold;"><b>--help</b></span> <span
+ style="font-style: italic;"><i>or</i></span>   <span
+ style="font-weight: bold;"><b>-h</b></span>   </p>
+      </td>
+ <td width="390" class="whs21"> 
+      <p>print this help</p>
+      <p> </p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td width="214" class="whs20"> 
+      <p><span style="font-weight: bold;"><b>--gui</b></span> <span
+ style="font-style: italic;"><i>or</i></span>   <span
+ style="font-weight: bold;"><b>-g</b></span>   </p>
+      </td>
+ <td width="390" class="whs21"> 
+      <p>launch with GUI</p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td width="214" class="whs20"> 
+      <p> <span style="font-weight: bold;"><b><a name="batchmode"></a>--terminal</b></span>
+      <span style="font-style: italic;"><i>or   </i></span><span
+ style="font-weight: bold;"><b>-t</b></span>      </p>
+      </td>
+ <td width="390" class="whs21"> 
+      <p>launch without GUI in batch mode</p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td colspan="1" rowspan="1" width="214" class="whs20"> 
+      <p><span style="font-weight: bold;"><b>--logger</b></span> <span
+ style="font-style: italic;"><i>or</i></span>   <span
+ style="font-weight: bold;"><b>-l</b></span>   </p>
+      </td>
+ <td colspan="1" rowspan="1" width="390" class="whs21"> 
+      <p>redirection of log messages into a definite file </p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td colspan="1" rowspan="1" width="214" class="whs20"> 
+      <p><span style="font-weight: bold;"><b>--xterm</b></span> <span
+ style="font-style: italic;"><i>or</i></span>   <span
+ style="font-weight: bold;"><b>-x</b></span> </p>
+      </td>
+ <td colspan="1" rowspan="1" width="390" class="whs21"> 
+      <p>the servers open an xterm window and log messages are displayed
+in this   window</p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td colspan="1" rowspan="1" width="214" class="whs20"> 
+      <p><span style="font-weight: bold;"><b>--modules=module1,module2,...</b></span>
+  <span style="font-style: italic;"><i>or</i></span> <span
+ style="font-weight: bold;"><b>-m=module1,module2,...</b></span></p>
+      </td>
+ <td colspan="1" rowspan="1" width="390" class="whs21"> 
+      <p>list of SALOME modules which will be loaded into the module catalogue</p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td colspan="1" rowspan="1" width="214" class="whs22"> 
+      <p><span style="font-weight: bold;"><b>--containers=cpp,python,superv</b></span></p>
+      <p><span style="font-style: italic;"><i>or</i></span> <span
+ style="font-weight: bold;"><b>-c=cpp,python,superv</b></span></p>
+      </td>
+ <td colspan="1" rowspan="1" width="390" class="whs23"> 
+      <p>launch of cpp, python and supervision containers</p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td colspan="1" rowspan="1" width="214" class="whs24"> 
+      <p><span style="font-weight: bold;"><b>--portkill</b></span> <span
+ style="font-style: italic;"><i>or</i></span>   <span
+ style="font-weight: bold;"><b>-p</b></span></p>
+      </td>
+ <td colspan="1" rowspan="1" width="390" class="whs25"> 
+      <p>kill SALOME launched with the current port</p>
+      </td>
+    </tr>
+  <tr valign="top" class="whs16">
+ <td colspan="1" rowspan="1" width="214" class="whs26"> 
+      <p><span style="font-weight: bold;"><b>--killall</b></span> <span
+ style="font-style: italic;"><i>or</i></span>   <span
+ style="font-weight: bold;"><b>-k</b></span>    </p>
+      </td>
+ <td colspan="1" rowspan="1" width="390" class="whs27"> 
+      <p>kill SALOME</p>
+      </td>
+    </tr>
+    <script language="JavaScript"><!--\r
 if ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) == 4)) document.write("</table></table><table>");\r
-//--></script>\r
-</table>\r
-\r
-<p class="whs10">&nbsp;</p>\r
-\r
-<p class="whs28"><img src="../tip1.gif" x-maintain-ratio="TRUE" width="35px" height="37px" border="0" class="img_whs8"><span style="font-weight: normal; font-family: 'Times New Roman', serif;"> \r
- If the </span><span style="font-family: 'Times New Roman', serif;">runSalome.py \r
- </span><span style="font-family: 'Times New Roman', serif; font-weight: normal;">script \r
- is launched without prompting any options, they will be taken by default \r
- from the xml file </span><span style="font-family: 'Times New Roman', serif;">salome.launch</span><span \r
- style="font-family: 'Times New Roman', serif; font-weight: normal;">, \r
- which has been automatically created in your home directory: </span><span \r
- style="font-family: 'Times New Roman', serif;">HOME/.salome/</span><span \r
- style="font-family: 'Times New Roman', serif; font-weight: normal;">. \r
- </span>&nbsp;&nbsp;&nbsp;</p>\r
-\r
-<p class="whs29">&nbsp;</p>\r
-\r
-<p class="whs29">&nbsp;</p>\r
-\r
-<p class="whs30">\r
-<a href="javascript:void(0);" onClick="var e; if (parseInt(navigator.appVersion)>=4){e=event;}  if (parseInt(navigator.appVersion) >=2 && typeof(PopupMenu_Invoke) == 'function') PopupMenu_Invoke(e,'','About SALOME PRO architecture','about_salome_pro_architecture.htm','Installing SALOME PRO','installing_salome_pro.htm','Introduction to SALOME PRO','introduction_to_salome_pro.htm');return false;" title="Related Topics"><img src="../ss_btn_related_topics.gif" border=0 height=17 width=82 alt="Related Topics"></a></p>\r
-\r
-<p class="whs30">&nbsp;</p>\r
-\r
-<p class="whs30">&nbsp;</p>\r
-\r
-<p class="whs30">&nbsp;</p>\r
-\r
-<script type="text/javascript" language="JavaScript" title="WebHelpRelatedTopics"><!--\r
+//--></script> 
+  </tbody>
+</table>
+  
+<p class="whs10"> </p>
+  
+<p class="whs28"><img src="../tip1.gif" x-maintain-ratio="TRUE"
+ width="35" height="37" border="0" class="img_whs8">
+<span style="font-weight: normal; font-family: 'Times New Roman',serif;">
+  If the </span><span style="font-family: 'Times New Roman',serif;">runSalome.py
+  </span><span
+ style="font-family: 'Times New Roman',serif; font-weight: normal;">script
+  is launched without prompting any options, they will be taken by default
+  from the xml file </span><span
+ style="font-family: 'Times New Roman',serif;">salome.launch</span><span
+ style="font-family: 'Times New Roman',serif; font-weight: normal;">,   which
+has been automatically created in your home directory: </span><span
+ style="font-family: 'Times New Roman',serif;">HOME/.salome/</span><span
+ style="font-family: 'Times New Roman',serif; font-weight: normal;">.   </span>   </p>
+  
+<p class="whs29"> </p>
+  
+<p class="whs29"> </p>
+  
+<p class="whs30"> <a href="javascript:void(0);"
+ onclick="var e; if (parseInt(navigator.appVersion)>=4){e=event;}  if (parseInt(navigator.appVersion) >=2 && typeof(PopupMenu_Invoke) == 'function') PopupMenu_Invoke(e,'','About SALOME PRO architecture','about_salome_pro_architecture.htm','Installing SALOME PRO','readme.html','Introduction to SALOME PRO','introduction_to_salome_pro.htm');return false;"
+ title="Related Topics"><img src="../ss_btn_related_topics.gif"
+ border="0" height="17" width="82" alt="Related Topics">
+</a></p>
+  
+<p class="whs30"> </p>
+  
+<p class="whs30"> </p>
+  
+<p class="whs30"> </p>
+  
+<script type="text/javascript" language="JavaScript"
+ title="WebHelpRelatedTopics"><!--\r
 if (parseInt(navigator.appVersion) >= 3 && typeof (WritePopupMenuLayer) == "function")\r
   WritePopupMenuLayer();\r
-//--></script><script type="text/javascript" language="javascript1.2">\r
+//--></script>
+<script type="text/javascript" language="javascript1.2">\r
 <!--\r
 if (window.writeIntopicBar)\r
        writeIntopicBar(0);\r
 //-->\r
-</script>\r
-</body>\r
-\r
-</html>\r
+</script> <br>
+</body>
+</html>
index 52291faa393bb0770831cbf9dcfea2e55f3a2316..f9d2b559dae623ec81791fa2cd4d46926ae77696 100644 (file)
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = FindObjectID ( aObjectID )</b></div></td>
 </tr>
 <tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  CreateObjectID ( in ID aObjectID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateObjectID ( aObjectID )</b></div></td>
+</tr>
+<tr>
 <td bgcolor= "lightgreen"><div align="center"><b>SObject  FindObjectIOR ( in ID aObjectIOR )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = FindObjectIOR ( aObjectIOR )</b></div></td>
 </tr>
 <td bgcolor= "lightgreen"><div align="center"><b>void EnableUseCaseAutoFilling ( in boolean isEnabled )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>EnableUseCaseAutoFilling ( isEnabled )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddPostponed ( in string theIOR )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddPostponed ( theIOR )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddCreatedPostponed ( in string theIOR )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddCreatedPostponed ( theIOR )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void RemovePostponed ( in long theUndoLimit )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>RemovePostponed ( theUndoLimit )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void UndoPostponed ( in long theWay )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>UndoPostponed ( theWay )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
 <td bgcolor= "lightgreen"><div align="center"><b>Addreference ( anObject, theReferencedObject )</b></div></td>
 </tr>
 <tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void RemoveReference ( in SObject anObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>RemoveReference ( anObject )</b></div></td>
+</tr>
+<tr>
 <td bgcolor= "lightgreen"><div align="center"><b>void AddDirectory ( in string theName )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>AddDirectory ( theName )</b></div></td>
 </tr>
 <td bgcolor= "lightgreen"><div align="center"><b>Callback  SetOnRemoveSObject ( in Callback theCallback )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = SetOnRemoveSObject ( theCallback )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetName ( in SObject theSO, in string theValue )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetName ( theSO, theValue )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetComment ( in SObject theSO, in string theValue )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetComment ( theSO, theValue )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetIOR ( in SObject theSO, in string theValue )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetIOR ( theSO, theValue )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = Tag (  )</b></div></td>
 </tr>
 <tr>
+<td bgcolor= "lightgreen"><div align="center"><b>short  Depth (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Depth (  )</b></div></td>
+</tr>
+<tr>
 <td bgcolor= "lightgreen"><div align="center"><b>boolean  FindSubObject ( in long atag, out SObject obj )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>[ return_value,  obj ] = FindSubObject ( atag )</b></div></td>
 </tr>
 <td bgcolor= "lightgreen"><div align="center"><b>Study  GetStudy (  )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = GetStudy (  )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Object  GetObject (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetObject (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetName (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetName (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetComment (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComment (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetIOR (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetIOR (  )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
 <td bgcolor= "lightgreen"><div align="center"><b>void CheckLocked (  )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>CheckLocked (  )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Store (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Store (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Restore ( in string theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Restore ( theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Type (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Type (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  GetSObject (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetSObject (  )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
index 7dbf29d3f4e348d10042d6e3ae641755b0237927..49f848f73c631257ce07e26d636571f686f9c023 100644 (file)
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeExternalFileDef</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeFileType</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
 <td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeDrawable</i></div></b></font></td>
 </tr>
 <td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
index 0457751176c3e289cd89c6824240c1d4362b8870..2d802860c5fd9742be6fc55fc7960147b5603d7a 100644 (file)
 <td bgcolor= "lightgreen"><div align="center"><b>boolean  Kill_impl (  )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = Kill_impl (  )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  getHostName (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getHostName (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  getPID (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getPID (  )</b></div></td>
+</tr>
 </table><br>
 <table width="100%" BORDER>
 <tr bgcolor="#FFFFCC">
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = GetContainerRef (  )</b></div></td>
 </tr>
 <tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void setProperties ( in FieldsDict dico )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>setProperties ( dico )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>FieldsDict  getProperties (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getProperties (  )</b></div></td>
+</tr>
+<tr>
 <td bgcolor= "lightgreen"><div align="center"><b>void Names ( in string aGraphName, in string aNodeName )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>Names ( aGraphName, aNodeName )</b></div></td>
 </tr>
index 009c6308d1b5cd1a2b612328e30607eb3105a5d9..5f618eb1a164d8ed4bbe6c40437bd9bb47993929 100644 (file)
 <td bgcolor= "lightgreen"><div align="center"><b>Acomponent  GetComponent ( in string componentname )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComponent ( componentname )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Component  GetComponentInfo ( in string componentName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComponentInfo ( componentName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ImportXmlCatalogFile ( in string filename )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ImportXmlCatalogFile ( filename )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void shutdown (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>shutdown (  )</b></div></td>
+</tr>
 </table><br>
 </b></HTML>
index 804a067a9b435b3d158651a78fbfd473a49cc006..37b46747d0dc9be78e215d58f0b71197aa7878dd 100644 (file)
@@ -11,8 +11,8 @@
 <td bgcolor= "lightgreen"><div align="center"><b>GetInterface (  )</b></div></td>
 </tr>
 <tr>
-<td bgcolor= "lightgreen"><div align="center"><b>Component  GetVisuGen (  )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetVisuGen (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Component  GetVisuComponent (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetVisuComponent (  )</b></div></td>
 </tr>
 <tr>
 <td bgcolor= "lightgreen"><div align="center"><b>void StopSession (  )</b></div></td>
@@ -26,5 +26,9 @@
 <td bgcolor= "lightgreen"><div align="center"><b>void ping (  )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>ping (  )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetActiveStudyId (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetActiveStudyId (  )</b></div></td>
+</tr>
 </table><br>
 </b></HTML>
index 44a507fdd862c05b95f96b73eb57a3675a02476d..56348f8a1ebe685871c09e88702754ee1275f467 100644 (file)
@@ -10,5 +10,9 @@
 <td bgcolor= "lightgreen"><div align="center"><b>string  Coucou ( in long L )</b></div></td>
 <td bgcolor= "lightgreen"><div align="center"><b>return_value = Coucou ( L )</b></div></td>
 </tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Setenv (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Setenv (  )</b></div></td>
+</tr>
 </table><br>
 </b></HTML>
index 6cda60af024ae7c5c5e25e54e2bc59a96c3d4dd4..29f6496ce04435e5d8c759733de45263c162595e 100755 (executable)
@@ -3,7 +3,7 @@
 #---------------------------------------------------------------------------
 # General configuration options
 #---------------------------------------------------------------------------
-PROJECT_NAME           = "SALOME v.2.0.0"
+PROJECT_NAME           = "SALOME v.2.1.0"
 PROJECT_NUMBER         = id#1.1
 OUTPUT_DIRECTORY       = ../
 OUTPUT_LANGUAGE        = English
index c765904909d28fd61e05a31706278b4f29377d43..18cf7f25f2104a7b810bd93871eeaad0a47908bb 100755 (executable)
@@ -1,4 +1,4 @@
-foldersTree = gFld("<b>SALOME v.2.0.0 </b>", "", "")
+foldersTree = gFld("<b>SALOME v.2.1.0 </b>", "", "")
      insDoc(foldersTree, gLnk("Main Page", "", "main.html"))
 
 aux1 = insFld(foldersTree, gFld("TUI Reference Guide", ""))
diff --git a/examples/fedges.unv b/examples/fedges.unv
new file mode 100644 (file)
index 0000000..d2c47a3
--- /dev/null
@@ -0,0 +1,2926 @@
+    -1
+  2411
+         1         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   0.0000000000000000E+00
+         2         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   0.0000000000000000E+00
+         3         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   0.0000000000000000E+00
+         4         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   0.0000000000000000E+00
+         5         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   0.0000000000000000E+00
+         6         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   0.0000000000000000E+00
+         7         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   0.0000000000000000E+00
+         8         0         0         0
+   0.0000000000000000E+00  -1.4350000000000000E+01   0.0000000000000000E+00
+         9         0         0         0
+   0.0000000000000000E+00  -1.5500000000000000E+01   5.0000000000000000E-01
+        10         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   1.7000000000000000E+00
+        11         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   3.3500000000000001E+00
+        12         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   4.9500000000000002E+00
+        13         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   7.1550000000000002E+00
+        14         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   9.3599999999999994E+00
+        15         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   1.2359999999999999E+01
+        16         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   1.5359999999999999E+01
+        17         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   1.7609999999999999E+01
+        18         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   1.8969999999999999E+01
+        19         0         0         0
+   0.0000000000000000E+00  -1.6129999999999999E+01   2.0800000000000001E+01
+        20         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   2.1449999999999999E+01
+        21         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   2.1449999999999999E+01
+        22         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   2.1366000000000000E+01
+        23         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   2.1239000000000001E+01
+        24         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   2.1111999999999998E+01
+        25         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   2.1027999999999999E+01
+        26         0         0         0
+   0.0000000000000000E+00  -1.4130000000000001E+01   2.0916000000000000E+01
+        27         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   2.0000000000000000E+00
+        28         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   1.8969999999999999E+01
+        29         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   2.0000000000000000E+00
+        30         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   2.0000000000000000E+00
+        31         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   2.0000000000000000E+00
+        32         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   2.0000000000000000E+00
+        33         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   2.0000000000000000E+00
+        34         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   2.0000000000000000E+00
+        35         0         0         0
+   0.0000000000000000E+00  -1.2877000000000001E+01   3.2160000000000002E+00
+        36         0         0         0
+   0.0000000000000000E+00  -1.4130000000000001E+01   4.9500000000000002E+00
+        37         0         0         0
+   0.0000000000000000E+00  -1.4130000000000001E+01   7.1550000000000002E+00
+        38         0         0         0
+   0.0000000000000000E+00  -1.4130000000000001E+01   9.3599999999999994E+00
+        39         0         0         0
+   0.0000000000000000E+00  -1.4130000000000001E+01   1.2359999999999999E+01
+        40         0         0         0
+   0.0000000000000000E+00  -1.4130000000000001E+01   1.5359999999999999E+01
+        41         0         0         0
+   0.0000000000000000E+00  -1.4130000000000001E+01   1.7609999999999999E+01
+        42         0         0         0
+   0.0000000000000000E+00  -1.4130000000000001E+01   1.8969999999999999E+01
+        43         0         0         0
+   0.0000000000000000E+00  -1.3600000000000000E+01   2.0000000000000000E+00
+        44         0         0         0
+   0.0000000000000000E+00  -1.5199999999999999E+01   3.8500000000000001E+00
+        45         0         0         0
+   0.0000000000000000E+00  -1.4500000000000000E+01   3.8500000000000001E+00
+        46         0         0         0
+   0.0000000000000000E+00  -1.4150000000000000E+01   3.1040000000000001E+00
+        47         0         0         0
+   0.0000000000000000E+00  -1.5199999999999999E+01   2.0000000000000000E+00
+        48         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   3.6600000000000001E+00
+        49         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   4.9500000000000002E+00
+        50         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   3.0000000000000000E+00
+        51         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   2.7999999999999998E+00
+        52         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   1.7609999999999999E+01
+        53         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   0.0000000000000000E+00
+        54         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   0.0000000000000000E+00
+        55         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   0.0000000000000000E+00
+        56         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   0.0000000000000000E+00
+        57         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   0.0000000000000000E+00
+        58         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   0.0000000000000000E+00
+        59         0         0         0
+   0.0000000000000000E+00   1.4350000000000000E+01   0.0000000000000000E+00
+        60         0         0         0
+   0.0000000000000000E+00   1.5500000000000000E+01   5.0000000000000000E-01
+        61         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   1.7000000000000000E+00
+        62         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   3.3500000000000001E+00
+        63         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   4.9500000000000002E+00
+        64         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   7.1550000000000002E+00
+        65         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   9.3599999999999994E+00
+        66         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   1.2359999999999999E+01
+        67         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   1.5359999999999999E+01
+        68         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   1.7609999999999999E+01
+        69         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   1.8969999999999999E+01
+        70         0         0         0
+   0.0000000000000000E+00   1.6129999999999999E+01   2.0800000000000001E+01
+        71         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   2.1449999999999999E+01
+        72         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   2.1449999999999999E+01
+        73         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   2.1449999999999999E+01
+        74         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   2.1366000000000000E+01
+        75         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   2.1239000000000001E+01
+        76         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   2.1111999999999998E+01
+        77         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   2.1027999999999999E+01
+        78         0         0         0
+   0.0000000000000000E+00   1.4130000000000001E+01   2.0916000000000000E+01
+        79         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   2.0000000000000000E+00
+        80         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   2.0000000000000000E+00
+        81         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   2.0000000000000000E+00
+        82         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   2.0000000000000000E+00
+        83         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   2.0000000000000000E+00
+        84         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   2.0000000000000000E+00
+        85         0         0         0
+   0.0000000000000000E+00   1.2877000000000001E+01   3.2160000000000002E+00
+        86         0         0         0
+   0.0000000000000000E+00   1.4130000000000001E+01   4.9500000000000002E+00
+        87         0         0         0
+   0.0000000000000000E+00   1.4130000000000001E+01   7.1550000000000002E+00
+        88         0         0         0
+   0.0000000000000000E+00   1.4130000000000001E+01   9.3599999999999994E+00
+        89         0         0         0
+   0.0000000000000000E+00   1.4130000000000001E+01   1.2359999999999999E+01
+        90         0         0         0
+   0.0000000000000000E+00   1.4130000000000001E+01   1.5359999999999999E+01
+        91         0         0         0
+   0.0000000000000000E+00   1.4130000000000001E+01   1.7609999999999999E+01
+        92         0         0         0
+   0.0000000000000000E+00   1.4130000000000001E+01   1.8969999999999999E+01
+        93         0         0         0
+   0.0000000000000000E+00   1.3600000000000000E+01   2.0000000000000000E+00
+        94         0         0         0
+   0.0000000000000000E+00   1.5199999999999999E+01   3.8500000000000001E+00
+        95         0         0         0
+   0.0000000000000000E+00   1.4500000000000000E+01   3.8500000000000001E+00
+        96         0         0         0
+   0.0000000000000000E+00   1.4150000000000000E+01   3.1040000000000001E+00
+        97         0         0         0
+   0.0000000000000000E+00   1.5199999999999999E+01   2.0000000000000000E+00
+        98         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   3.6600000000000001E+00
+        99         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   4.9500000000000002E+00
+       100         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   3.0000000000000000E+00
+       101         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   7.1550000000000002E+00
+       102         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   9.3599999999999994E+00
+       103         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   1.2359999999999999E+01
+       104         0         0         0
+   0.0000000000000000E+00   0.0000000000000000E+00   1.5359999999999999E+01
+       105         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   7.1550000000000002E+00
+       106         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   9.3599999999999994E+00
+       107         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   1.2359999999999999E+01
+       108         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   1.5359999999999999E+01
+       109         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   1.7609999999999999E+01
+       110         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   3.2149999999999999E+00
+       111         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   3.2149999999999999E+00
+       112         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   3.2149999999999999E+00
+       113         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   3.2149999999999999E+00
+       114         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   3.2149999999999999E+00
+       115         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   3.2149999999999999E+00
+       116         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   3.2149999999999999E+00
+       117         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   3.2149999999999999E+00
+       118         0         0         0
+   0.0000000000000000E+00   2.3999999999999999E+00   1.8969999999999999E+01
+       119         0         0         0
+   0.0000000000000000E+00  -1.2877000000000001E+01   4.9500000000000002E+00
+       120         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   4.9500000000000002E+00
+       121         0         0         0
+   0.0000000000000000E+00   1.2877000000000001E+01   4.9500000000000002E+00
+       122         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   4.9500000000000002E+00
+       123         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   4.9500000000000002E+00
+       124         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   7.1550000000000002E+00
+       125         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   1.7609999999999999E+01
+       126         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   1.7609999999999999E+01
+       127         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   7.1550000000000002E+00
+       128         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   1.7609999999999999E+01
+       129         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   4.9500000000000002E+00
+       130         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   1.7609999999999999E+01
+       131         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   7.1550000000000002E+00
+       132         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   7.1550000000000002E+00
+       133         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   4.9500000000000002E+00
+       134         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   4.9500000000000002E+00
+       135         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   4.9500000000000002E+00
+       136         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   9.3599999999999994E+00
+       137         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   1.2359999999999999E+01
+       138         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   1.5359999999999999E+01
+       139         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   4.9500000000000002E+00
+       140         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   4.9500000000000002E+00
+       141         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   1.5359999999999999E+01
+       142         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   1.2359999999999999E+01
+       143         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   9.3599999999999994E+00
+       144         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   9.3599999999999994E+00
+       145         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   1.2359999999999999E+01
+       146         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   1.5359999999999999E+01
+       147         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   1.5359999999999999E+01
+       148         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   1.2359999999999999E+01
+       149         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   9.3599999999999994E+00
+       150         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   4.9500000000000002E+00
+       151         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   4.9500000000000002E+00
+       152         0         0         0
+   0.0000000000000000E+00   4.0000000000000000E+00   1.8969999999999999E+01
+       153         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   1.8969999999999999E+01
+       154         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   1.8969999999999999E+01
+       155         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   1.8969999999999999E+01
+       156         0         0         0
+   0.0000000000000000E+00   1.2000000000000000E+01   1.8969999999999999E+01
+       157         0         0         0
+   0.0000000000000000E+00  -2.3999999999999999E+00   1.8969999999999999E+01
+       158         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   1.8969999999999999E+01
+       159         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   1.8969999999999999E+01
+       160         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   1.8969999999999999E+01
+       161         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   1.8969999999999999E+01
+       162         0         0         0
+   0.0000000000000000E+00  -1.2000000000000000E+01   1.8969999999999999E+01
+       163         0         0         0
+   3.3999999999999999E+00  -4.0000000000000000E+00   0.0000000000000000E+00
+       164         0         0         0
+   3.3999999999999999E+00  -2.3999999999999999E+00   0.0000000000000000E+00
+       165         0         0         0
+   3.3999999999999999E+00   4.0000000000000000E+00   0.0000000000000000E+00
+       166         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   0.0000000000000000E+00
+       167         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   0.0000000000000000E+00
+       168         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   3.6600000000000001E+00
+       169         0         0         0
+   3.3999999999999999E+00  -5.5999999999999996E+00   0.0000000000000000E+00
+       170         0         0         0
+   3.3999999999999999E+00  -8.0000000000000000E+00   0.0000000000000000E+00
+       171         0         0         0
+   3.3999999999999999E+00  -1.0400000000000000E+01   0.0000000000000000E+00
+       172         0         0         0
+   3.3999999999999999E+00  -4.0000000000000000E+00   2.0000000000000000E+00
+       173         0         0         0
+   3.3999999999999999E+00  -2.3999999999999999E+00   2.0000000000000000E+00
+       174         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   2.0000000000000000E+00
+       175         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   2.0000000000000000E+00
+       176         0         0         0
+   3.3999999999999999E+00   4.0000000000000000E+00   2.0000000000000000E+00
+       177         0         0         0
+   3.3999999999999999E+00   5.5999999999999996E+00   0.0000000000000000E+00
+       178         0         0         0
+   3.3999999999999999E+00   8.0000000000000000E+00   0.0000000000000000E+00
+       179         0         0         0
+   3.3999999999999999E+00   1.0400000000000000E+01   0.0000000000000000E+00
+       180         0         0         0
+   3.3999999999999999E+00  -2.3999999999999999E+00   3.0000000000000000E+00
+       181         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   7.1550000000000002E+00
+       182         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   7.1550000000000002E+00
+       183         0         0         0
+   3.3999999999999999E+00  -8.0000000000000000E+00   2.0000000000000000E+00
+       184         0         0         0
+   3.3999999999999999E+00  -1.0400000000000000E+01   2.0000000000000000E+00
+       185         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   3.6600000000000001E+00
+       186         0         0         0
+   3.3999999999999999E+00  -1.2000000000000000E+01   0.0000000000000000E+00
+       187         0         0         0
+   3.3999999999999999E+00  -1.2000000000000000E+01   2.0000000000000000E+00
+       188         0         0         0
+   3.3999999999999999E+00  -1.4350000000000000E+01   0.0000000000000000E+00
+       189         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   1.7609999999999999E+01
+       190         0         0         0
+   3.3999999999999999E+00  -1.2877000000000001E+01   3.2160000000000002E+00
+       191         0         0         0
+   3.3999999999999999E+00  -1.5500000000000000E+01   5.0000000000000000E-01
+       192         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   1.7609999999999999E+01
+       193         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   1.9800000000000001E+01
+       194         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   1.7000000000000000E+00
+       195         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   3.3500000000000001E+00
+       196         0         0         0
+   3.3999999999999999E+00   8.0000000000000000E+00   2.0000000000000000E+00
+       197         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   7.1550000000000002E+00
+       198         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   7.1550000000000002E+00
+       199         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   7.1550000000000002E+00
+       200         0         0         0
+   3.3999999999999999E+00   1.2000000000000000E+01   0.0000000000000000E+00
+       201         0         0         0
+   3.3999999999999999E+00   1.0400000000000000E+01   2.0000000000000000E+00
+       202         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   1.7609999999999999E+01
+       203         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   1.7609999999999999E+01
+       204         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   1.7609999999999999E+01
+       205         0         0         0
+   3.3999999999999999E+00   1.4350000000000000E+01   0.0000000000000000E+00
+       206         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   4.9500000000000002E+00
+       207         0         0         0
+   3.3999999999999999E+00   1.2000000000000000E+01   2.0000000000000000E+00
+       208         0         0         0
+   3.3999999999999999E+00   1.5500000000000000E+01   5.0000000000000000E-01
+       209         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   7.1550000000000002E+00
+       210         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   1.2359999999999999E+01
+       211         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   7.1550000000000002E+00
+       212         0         0         0
+   3.3999999999999999E+00   1.2877000000000001E+01   3.2160000000000002E+00
+       213         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   1.7000000000000000E+00
+       214         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   3.3500000000000001E+00
+       215         0         0         0
+   3.3999999999999999E+00  -1.4130000000000001E+01   7.1550000000000002E+00
+       216         0         0         0
+   3.3999999999999999E+00  -1.4130000000000001E+01   4.9500000000000002E+00
+       217         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   9.3599999999999994E+00
+       218         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   1.2359999999999999E+01
+       219         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   4.9500000000000002E+00
+       220         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   7.1550000000000002E+00
+       221         0         0         0
+   3.3999999999999999E+00   1.4130000000000001E+01   7.1550000000000002E+00
+       222         0         0         0
+   3.3999999999999999E+00   1.4130000000000001E+01   4.9500000000000002E+00
+       223         0         0         0
+   3.3999999999999999E+00  -1.4130000000000001E+01   1.2359999999999999E+01
+       224         0         0         0
+   3.3999999999999999E+00  -1.4130000000000001E+01   9.3599999999999994E+00
+       225         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   1.5359999999999999E+01
+       226         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   1.7609999999999999E+01
+       227         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   1.8969999999999999E+01
+       228         0         0         0
+   3.3999999999999999E+00  -1.6129999999999999E+01   2.0800000000000001E+01
+       229         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   9.3599999999999994E+00
+       230         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   1.2359999999999999E+01
+       231         0         0         0
+   3.3999999999999999E+00   1.4130000000000001E+01   1.2359999999999999E+01
+       232         0         0         0
+   3.3999999999999999E+00   1.4130000000000001E+01   9.3599999999999994E+00
+       233         0         0         0
+   3.3999999999999999E+00  -1.4130000000000001E+01   1.5359999999999999E+01
+       234         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   1.5359999999999999E+01
+       235         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   1.7609999999999999E+01
+       236         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   1.8969999999999999E+01
+       237         0         0         0
+   3.3999999999999999E+00   1.6129999999999999E+01   2.0800000000000001E+01
+       238         0         0         0
+   3.3999999999999999E+00  -1.4130000000000001E+01   2.0916000000000000E+01
+       239         0         0         0
+   3.3999999999999999E+00  -1.4130000000000001E+01   1.8969999999999999E+01
+       240         0         0         0
+   3.3999999999999999E+00  -1.2000000000000000E+01   2.1027999999999999E+01
+       241         0         0         0
+   3.3999999999999999E+00  -1.0400000000000000E+01   2.1111999999999998E+01
+       242         0         0         0
+   3.3999999999999999E+00  -8.0000000000000000E+00   2.1239000000000001E+01
+       243         0         0         0
+   3.3999999999999999E+00  -5.5999999999999996E+00   2.1366000000000000E+01
+       244         0         0         0
+   3.3999999999999999E+00  -4.0000000000000000E+00   2.1449999999999999E+01
+       245         0         0         0
+   3.3999999999999999E+00  -2.3999999999999999E+00   2.1449999999999999E+01
+       246         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   2.1449999999999999E+01
+       247         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   2.1449999999999999E+01
+       248         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   1.7609999999999999E+01
+       249         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   1.7609999999999999E+01
+       250         0         0         0
+   3.3999999999999999E+00   4.0000000000000000E+00   2.1449999999999999E+01
+       251         0         0         0
+   3.3999999999999999E+00   5.5999999999999996E+00   2.1366000000000000E+01
+       252         0         0         0
+   3.3999999999999999E+00   8.0000000000000000E+00   2.1239000000000001E+01
+       253         0         0         0
+   3.3999999999999999E+00   1.0400000000000000E+01   2.1111999999999998E+01
+       254         0         0         0
+   3.3999999999999999E+00   1.2000000000000000E+01   2.1027999999999999E+01
+       255         0         0         0
+   3.3999999999999999E+00   1.4130000000000001E+01   2.0916000000000000E+01
+       256         0         0         0
+   3.3999999999999999E+00   1.4130000000000001E+01   1.8969999999999999E+01
+       257         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   7.1550000000000002E+00
+       258         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   7.1550000000000002E+00
+       259         0         0         0
+   3.3999999999999999E+00   1.4130000000000001E+01   1.5359999999999999E+01
+       260         0         0         0
+   2.2000000000000002E+00   2.3999999999999999E+00   4.9500000000000002E+00
+       261         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   9.3599999999999994E+00
+       262         0         0         0
+   2.2000000000000002E+00   2.3999999999999999E+00   9.3599999999999994E+00
+       263         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   1.5359999999999999E+01
+       264         0         0         0
+   2.2000000000000002E+00   2.3999999999999999E+00   1.5359999999999999E+01
+       265         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   1.7609999999999999E+01
+       266         0         0         0
+   3.3999999999999999E+00  -1.4130000000000001E+01   1.7609999999999999E+01
+       267         0         0         0
+   3.3999999999999999E+00   1.4130000000000001E+01   1.7609999999999999E+01
+       268         0         0         0
+   2.2000000000000002E+00  -1.2877000000000001E+01   4.9500000000000002E+00
+       269         0         0         0
+   2.2000000000000002E+00  -2.3999999999999999E+00   4.9500000000000002E+00
+       270         0         0         0
+   2.2000000000000002E+00   1.2877000000000001E+01   4.9500000000000002E+00
+       271         0         0         0
+   2.2000000000000002E+00   4.0000000000000000E+00   4.9500000000000002E+00
+       272         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   9.3599999999999994E+00
+       273         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   1.2359999999999999E+01
+       274         0         0         0
+   0.0000000000000000E+00  -4.0000000000000000E+00   1.5359999999999999E+01
+       275         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   1.5359999999999999E+01
+       276         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   1.2359999999999999E+01
+       277         0         0         0
+   3.3999999999999999E+00  -5.5999999999999996E+00   2.0000000000000000E+00
+       278         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   4.9500000000000002E+00
+       279         0         0         0
+   0.0000000000000000E+00  -1.0400000000000000E+01   9.3599999999999994E+00
+       280         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   9.3599999999999994E+00
+       281         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   1.2359999999999999E+01
+       282         0         0         0
+   0.0000000000000000E+00   5.5999999999999996E+00   1.5359999999999999E+01
+       283         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   1.2359999999999999E+01
+       284         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   1.2359999999999999E+01
+       285         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   1.5359999999999999E+01
+       286         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   1.5359999999999999E+01
+       287         0         0         0
+   0.0000000000000000E+00   1.0400000000000000E+01   9.3599999999999994E+00
+       288         0         0         0
+   0.0000000000000000E+00   8.0000000000000000E+00   9.3599999999999994E+00
+       289         0         0         0
+   3.3999999999999999E+00   5.5999999999999996E+00   2.0000000000000000E+00
+       290         0         0         0
+   2.2000000000000002E+00  -2.3999999999999999E+00   9.3599999999999994E+00
+       291         0         0         0
+   2.2000000000000002E+00  -2.3999999999999999E+00   1.5359999999999999E+01
+       292         0         0         0
+   2.2000000000000002E+00  -1.2000000000000000E+01   4.9500000000000002E+00
+       293         0         0         0
+   2.2000000000000002E+00  -1.2000000000000000E+01   1.5359999999999999E+01
+       294         0         0         0
+   3.3999999999999999E+00  -2.3999999999999999E+00   1.9800000000000001E+01
+       295         0         0         0
+   2.2000000000000002E+00  -1.2000000000000000E+01   9.3599999999999994E+00
+       296         0         0         0
+   2.2000000000000002E+00   4.0000000000000000E+00   9.3599999999999994E+00
+       297         0         0         0
+   3.3999999999999999E+00  -1.2000000000000000E+01   1.9527999999999999E+01
+       298         0         0         0
+   2.2000000000000002E+00   4.0000000000000000E+00   1.5359999999999999E+01
+       299         0         0         0
+   2.2000000000000002E+00   1.2000000000000000E+01   1.5359999999999999E+01
+       300         0         0         0
+   2.2000000000000002E+00   1.2000000000000000E+01   4.9500000000000002E+00
+       301         0         0         0
+   2.2000000000000002E+00   1.2000000000000000E+01   9.3599999999999994E+00
+       302         0         0         0
+   3.3999999999999999E+00  -1.3600000000000000E+01   2.0000000000000000E+00
+       303         0         0         0
+   3.3999999999999999E+00   1.2000000000000000E+01   1.9527999999999999E+01
+       304         0         0         0
+   3.3999999999999999E+00  -4.0000000000000000E+00   2.7999999999999998E+00
+       305         0         0         0
+   3.3999999999999999E+00  -2.3999999999999999E+00   3.6600000000000001E+00
+       306         0         0         0
+   2.2000000000000002E+00  -4.0000000000000000E+00   4.9500000000000002E+00
+       307         0         0         0
+   3.3999999999999999E+00   1.3600000000000000E+01   2.0000000000000000E+00
+       308         0         0         0
+   2.2000000000000002E+00   5.5999999999999996E+00   4.9500000000000002E+00
+       309         0         0         0
+   2.2000000000000002E+00   1.0400000000000000E+01   4.9500000000000002E+00
+       310         0         0         0
+   2.2000000000000002E+00   8.0000000000000000E+00   4.9500000000000002E+00
+       311         0         0         0
+   2.2000000000000002E+00  -1.0400000000000000E+01   4.9500000000000002E+00
+       312         0         0         0
+   3.3999999999999999E+00   4.0000000000000000E+00   3.0000000000000000E+00
+       313         0         0         0
+   2.2000000000000002E+00  -8.0000000000000000E+00   4.9500000000000002E+00
+       314         0         0         0
+   2.2000000000000002E+00  -5.5999999999999996E+00   4.9500000000000002E+00
+       315         0         0         0
+   3.3999999999999999E+00  -1.5199999999999999E+01   2.0000000000000000E+00
+       316         0         0         0
+   3.3999999999999999E+00  -1.4150000000000000E+01   3.1040000000000001E+00
+       317         0         0         0
+   3.3999999999999999E+00  -4.0000000000000000E+00   1.9949999999999999E+01
+       318         0         0         0
+   3.3999999999999999E+00  -1.0400000000000000E+01   1.9611999999999998E+01
+       319         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   4.9500000000000002E+00
+       320         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   1.7609999999999999E+01
+       321         0         0         0
+   3.3999999999999999E+00   4.0000000000000000E+00   1.9949999999999999E+01
+       322         0         0         0
+   3.3999999999999999E+00   1.5199999999999999E+01   2.0000000000000000E+00
+       323         0         0         0
+   3.3999999999999999E+00   1.4150000000000000E+01   3.1040000000000001E+00
+       324         0         0         0
+   3.3999999999999999E+00   1.0400000000000000E+01   1.9611999999999998E+01
+       325         0         0         0
+   3.3999999999999999E+00  -1.5199999999999999E+01   3.8500000000000001E+00
+       326         0         0         0
+   3.3999999999999999E+00  -1.4500000000000000E+01   3.8500000000000001E+00
+       327         0         0         0
+   3.3999999999999999E+00  -8.0000000000000000E+00   1.9739000000000001E+01
+       328         0         0         0
+   3.3999999999999999E+00  -5.5999999999999996E+00   1.9866000000000000E+01
+       329         0         0         0
+   3.3999999999999999E+00   8.0000000000000000E+00   1.9739000000000001E+01
+       330         0         0         0
+   3.3999999999999999E+00   5.5999999999999996E+00   1.9866000000000000E+01
+       331         0         0         0
+   3.3999999999999999E+00   1.5199999999999999E+01   3.8500000000000001E+00
+       332         0         0         0
+   3.3999999999999999E+00   1.4500000000000000E+01   3.8500000000000001E+00
+       333         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   1.5359999999999999E+01
+       334         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   1.5359999999999999E+01
+       335         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   1.2359999999999999E+01
+       336         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   1.2359999999999999E+01
+       337         0         0         0
+   0.0000000000000000E+00  -8.0000000000000000E+00   9.3599999999999994E+00
+       338         0         0         0
+   0.0000000000000000E+00  -5.5999999999999996E+00   9.3599999999999994E+00
+       339         0         0         0
+   3.3999999999999999E+00   0.0000000000000000E+00   1.8969999999999999E+01
+       340         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   7.1550000000000002E+00
+       341         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   1.5359999999999999E+01
+       342         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   9.3599999999999994E+00
+       343         0         0         0
+   3.3999999999999999E+00   2.3999999999999999E+00   1.2359999999999999E+01
+       344         0         0         0
+   6.7999999999999998E+00  -2.3999999999999999E+00   0.0000000000000000E+00
+       345         0         0         0
+   6.7999999999999998E+00  -4.0000000000000000E+00   0.0000000000000000E+00
+       346         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   0.0000000000000000E+00
+       347         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   0.0000000000000000E+00
+       348         0         0         0
+   6.7999999999999998E+00   4.0000000000000000E+00   0.0000000000000000E+00
+       349         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   2.0000000000000000E+00
+       350         0         0         0
+   6.7999999999999998E+00  -2.3999999999999999E+00   2.0000000000000000E+00
+       351         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   3.6600000000000001E+00
+       352         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   2.0000000000000000E+00
+       353         0         0         0
+   6.7999999999999998E+00  -5.5999999999999996E+00   0.0000000000000000E+00
+       354         0         0         0
+   6.7999999999999998E+00  -4.0000000000000000E+00   2.0000000000000000E+00
+       355         0         0         0
+   6.7999999999999998E+00  -8.0000000000000000E+00   0.0000000000000000E+00
+       356         0         0         0
+   6.7999999999999998E+00  -1.0400000000000000E+01   0.0000000000000000E+00
+       357         0         0         0
+   6.7999999999999998E+00   5.5999999999999996E+00   0.0000000000000000E+00
+       358         0         0         0
+   6.7999999999999998E+00   4.0000000000000000E+00   2.0000000000000000E+00
+       359         0         0         0
+   6.7999999999999998E+00   8.0000000000000000E+00   0.0000000000000000E+00
+       360         0         0         0
+   6.7999999999999998E+00   1.0400000000000000E+01   0.0000000000000000E+00
+       361         0         0         0
+   6.7999999999999998E+00  -1.2000000000000000E+01   0.0000000000000000E+00
+       362         0         0         0
+   6.7999999999999998E+00  -8.0000000000000000E+00   2.0000000000000000E+00
+       363         0         0         0
+   6.7999999999999998E+00  -1.0400000000000000E+01   2.0000000000000000E+00
+       364         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   7.1550000000000002E+00
+       365         0         0         0
+   6.7999999999999998E+00  -1.2000000000000000E+01   2.0000000000000000E+00
+       366         0         0         0
+   6.7999999999999998E+00  -1.4350000000000000E+01   0.0000000000000000E+00
+       367         0         0         0
+   6.7999999999999998E+00  -1.2877000000000001E+01   3.2160000000000002E+00
+       368         0         0         0
+   6.7999999999999998E+00  -1.5500000000000000E+01   5.0000000000000000E-01
+       369         0         0         0
+   6.7999999999999998E+00   1.2000000000000000E+01   0.0000000000000000E+00
+       370         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   1.7000000000000000E+00
+       371         0         0         0
+   6.7999999999999998E+00   8.0000000000000000E+00   2.0000000000000000E+00
+       372         0         0         0
+   2.2000000000000002E+00  -4.0000000000000000E+00   9.3599999999999994E+00
+       373         0         0         0
+   6.7999999999999998E+00   1.0400000000000000E+01   2.0000000000000000E+00
+       374         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   9.3599999999999994E+00
+       375         0         0         0
+   2.2000000000000002E+00  -4.0000000000000000E+00   1.5359999999999999E+01
+       376         0         0         0
+   6.7999999999999998E+00  -1.4130000000000001E+01   4.9500000000000002E+00
+       377         0         0         0
+   6.7999999999999998E+00   1.4350000000000000E+01   0.0000000000000000E+00
+       378         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   3.3500000000000001E+00
+       379         0         0         0
+   6.7999999999999998E+00   1.2000000000000000E+01   2.0000000000000000E+00
+       380         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   4.9500000000000002E+00
+       381         0         0         0
+   2.2000000000000002E+00  -1.0400000000000000E+01   1.5359999999999999E+01
+       382         0         0         0
+   6.7999999999999998E+00   1.5500000000000000E+01   5.0000000000000000E-01
+       383         0         0         0
+   2.2000000000000002E+00  -1.0400000000000000E+01   9.3599999999999994E+00
+       384         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   7.1550000000000002E+00
+       385         0         0         0
+   2.2000000000000002E+00   5.5999999999999996E+00   9.3599999999999994E+00
+       386         0         0         0
+   2.2000000000000002E+00   1.0400000000000000E+01   9.3599999999999994E+00
+       387         0         0         0
+   2.2000000000000002E+00   8.0000000000000000E+00   9.3599999999999994E+00
+       388         0         0         0
+   6.7999999999999998E+00   1.2877000000000001E+01   3.2160000000000002E+00
+       389         0         0         0
+   2.2000000000000002E+00   5.5999999999999996E+00   1.5359999999999999E+01
+       390         0         0         0
+   2.2000000000000002E+00   1.0400000000000000E+01   1.5359999999999999E+01
+       391         0         0         0
+   2.2000000000000002E+00   8.0000000000000000E+00   1.5359999999999999E+01
+       392         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   1.7000000000000000E+00
+       393         0         0         0
+   6.7999999999999998E+00  -1.4130000000000001E+01   7.1550000000000002E+00
+       394         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   1.2359999999999999E+01
+       395         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   9.3599999999999994E+00
+       396         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   3.3500000000000001E+00
+       397         0         0         0
+   6.7999999999999998E+00   1.4130000000000001E+01   4.9500000000000002E+00
+       398         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   1.2359999999999999E+01
+       399         0         0         0
+   6.7999999999999998E+00  -1.4130000000000001E+01   9.3599999999999994E+00
+       400         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   4.9500000000000002E+00
+       401         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   1.5359999999999999E+01
+       402         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   7.1550000000000002E+00
+       403         0         0         0
+   6.7999999999999998E+00   1.4130000000000001E+01   7.1550000000000002E+00
+       404         0         0         0
+   6.7999999999999998E+00  -1.4130000000000001E+01   1.2359999999999999E+01
+       405         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   1.5359999999999999E+01
+       406         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   9.3599999999999994E+00
+       407         0         0         0
+   6.7999999999999998E+00   1.4130000000000001E+01   9.3599999999999994E+00
+       408         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   1.7609999999999999E+01
+       409         0         0         0
+   6.7999999999999998E+00  -1.4130000000000001E+01   1.5359999999999999E+01
+       410         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   1.8969999999999999E+01
+       411         0         0         0
+   6.7999999999999998E+00  -1.6129999999999999E+01   2.0800000000000001E+01
+       412         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   1.2359999999999999E+01
+       413         0         0         0
+   6.7999999999999998E+00   1.4130000000000001E+01   1.2359999999999999E+01
+       414         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   1.5359999999999999E+01
+       415         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   1.7609999999999999E+01
+       416         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   1.8969999999999999E+01
+       417         0         0         0
+   6.7999999999999998E+00  -1.4130000000000001E+01   2.0916000000000000E+01
+       418         0         0         0
+   6.7999999999999998E+00  -1.4130000000000001E+01   1.8969999999999999E+01
+       419         0         0         0
+   6.7999999999999998E+00   1.6129999999999999E+01   2.0800000000000001E+01
+       420         0         0         0
+   6.7999999999999998E+00   1.4130000000000001E+01   1.5359999999999999E+01
+       421         0         0         0
+   6.7999999999999998E+00  -1.2000000000000000E+01   2.1027999999999999E+01
+       422         0         0         0
+   6.7999999999999998E+00  -1.0400000000000000E+01   2.1111999999999998E+01
+       423         0         0         0
+   6.7999999999999998E+00  -8.0000000000000000E+00   2.1239000000000001E+01
+       424         0         0         0
+   6.7999999999999998E+00  -5.5999999999999996E+00   2.1366000000000000E+01
+       425         0         0         0
+   6.7999999999999998E+00  -4.0000000000000000E+00   2.1449999999999999E+01
+       426         0         0         0
+   6.7999999999999998E+00  -2.3999999999999999E+00   2.1449999999999999E+01
+       427         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   2.1449999999999999E+01
+       428         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   2.1449999999999999E+01
+       429         0         0         0
+   6.7999999999999998E+00   1.4130000000000001E+01   2.0916000000000000E+01
+       430         0         0         0
+   6.7999999999999998E+00   1.4130000000000001E+01   1.8969999999999999E+01
+       431         0         0         0
+   6.7999999999999998E+00   4.0000000000000000E+00   2.1449999999999999E+01
+       432         0         0         0
+   6.7999999999999998E+00   1.2000000000000000E+01   2.1027999999999999E+01
+       433         0         0         0
+   6.7999999999999998E+00   1.0400000000000000E+01   2.1111999999999998E+01
+       434         0         0         0
+   6.7999999999999998E+00   5.5999999999999996E+00   2.1366000000000000E+01
+       435         0         0         0
+   6.7999999999999998E+00   8.0000000000000000E+00   2.1239000000000001E+01
+       436         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   4.9500000000000002E+00
+       437         0         0         0
+   6.7999999999999998E+00  -5.5999999999999996E+00   2.0000000000000000E+00
+       438         0         0         0
+   6.7999999999999998E+00  -2.3999999999999999E+00   3.0000000000000000E+00
+       439         0         0         0
+   6.7999999999999998E+00   5.5999999999999996E+00   2.0000000000000000E+00
+       440         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   3.6600000000000001E+00
+       441         0         0         0
+   2.2000000000000002E+00  -8.0000000000000000E+00   1.5359999999999999E+01
+       442         0         0         0
+   2.2000000000000002E+00  -5.5999999999999996E+00   1.5359999999999999E+01
+       443         0         0         0
+   2.2000000000000002E+00  -8.0000000000000000E+00   9.3599999999999994E+00
+       444         0         0         0
+   2.2000000000000002E+00  -5.5999999999999996E+00   9.3599999999999994E+00
+       445         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   1.7609999999999999E+01
+       446         0         0         0
+   6.7999999999999998E+00  -1.4130000000000001E+01   1.7609999999999999E+01
+       447         0         0         0
+   6.7999999999999998E+00   1.4130000000000001E+01   1.7609999999999999E+01
+       448         0         0         0
+   6.7999999999999998E+00   0.0000000000000000E+00   1.8969999999999999E+01
+       449         0         0         0
+   6.7999999999999998E+00  -4.0000000000000000E+00   2.7999999999999998E+00
+       450         0         0         0
+   6.7999999999999998E+00  -2.3999999999999999E+00   3.6600000000000001E+00
+       451         0         0         0
+   6.7999999999999998E+00   4.0000000000000000E+00   3.0000000000000000E+00
+       452         0         0         0
+   6.7999999999999998E+00  -1.3600000000000000E+01   2.0000000000000000E+00
+       453         0         0         0
+   1.0199999999999999E+01  -2.3999999999999999E+00   0.0000000000000000E+00
+       454         0         0         0
+   1.0199999999999999E+01  -4.0000000000000000E+00   0.0000000000000000E+00
+       455         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   0.0000000000000000E+00
+       456         0         0         0
+   1.0199999999999999E+01   2.3999999999999999E+00   0.0000000000000000E+00
+       457         0         0         0
+   1.0199999999999999E+01   4.0000000000000000E+00   0.0000000000000000E+00
+       458         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   4.9500000000000002E+00
+       459         0         0         0
+   1.0199999999999999E+01  -2.3999999999999999E+00   2.0000000000000000E+00
+       460         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   2.0000000000000000E+00
+       461         0         0         0
+   1.0199999999999999E+01   2.3999999999999999E+00   2.0000000000000000E+00
+       462         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   3.6600000000000001E+00
+       463         0         0         0
+   1.0199999999999999E+01  -5.5999999999999996E+00   0.0000000000000000E+00
+       464         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   1.9800000000000001E+01
+       465         0         0         0
+   1.0199999999999999E+01  -4.0000000000000000E+00   2.0000000000000000E+00
+       466         0         0         0
+   1.0199999999999999E+01  -8.0000000000000000E+00   0.0000000000000000E+00
+       467         0         0         0
+   1.0199999999999999E+01   5.5999999999999996E+00   0.0000000000000000E+00
+       468         0         0         0
+   6.7999999999999998E+00   1.3600000000000000E+01   2.0000000000000000E+00
+       469         0         0         0
+   1.0199999999999999E+01  -1.0400000000000000E+01   0.0000000000000000E+00
+       470         0         0         0
+   1.0199999999999999E+01   4.0000000000000000E+00   2.0000000000000000E+00
+       471         0         0         0
+   1.0199999999999999E+01   8.0000000000000000E+00   0.0000000000000000E+00
+       472         0         0         0
+   1.0199999999999999E+01   1.0400000000000000E+01   0.0000000000000000E+00
+       473         0         0         0
+   1.0199999999999999E+01  -1.2000000000000000E+01   0.0000000000000000E+00
+       474         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   7.1550000000000002E+00
+       475         0         0         0
+   1.0199999999999999E+01  -8.0000000000000000E+00   2.0000000000000000E+00
+       476         0         0         0
+   1.0199999999999999E+01  -1.0400000000000000E+01   2.0000000000000000E+00
+       477         0         0         0
+   6.7999999999999998E+00  -1.4150000000000000E+01   3.1040000000000001E+00
+       478         0         0         0
+   1.0199999999999999E+01  -1.2000000000000000E+01   2.0000000000000000E+00
+       479         0         0         0
+   1.0199999999999999E+01  -1.4350000000000000E+01   0.0000000000000000E+00
+       480         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   7.1550000000000002E+00
+       481         0         0         0
+   6.7999999999999998E+00  -1.5199999999999999E+01   2.0000000000000000E+00
+       482         0         0         0
+   6.7999999999999998E+00  -1.5199999999999999E+01   3.8500000000000001E+00
+       483         0         0         0
+   6.7999999999999998E+00  -1.4500000000000000E+01   3.8500000000000001E+00
+       484         0         0         0
+   1.0199999999999999E+01   1.2000000000000000E+01   0.0000000000000000E+00
+       485         0         0         0
+   1.0199999999999999E+01  -1.2877000000000001E+01   3.2160000000000002E+00
+       486         0         0         0
+   1.0199999999999999E+01   8.0000000000000000E+00   2.0000000000000000E+00
+       487         0         0         0
+   1.0199999999999999E+01  -1.5500000000000000E+01   5.0000000000000000E-01
+       488         0         0         0
+   1.0199999999999999E+01   1.0400000000000000E+01   2.0000000000000000E+00
+       489         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   9.3599999999999994E+00
+       490         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   1.7000000000000000E+00
+       491         0         0         0
+   1.0199999999999999E+01   1.4350000000000000E+01   0.0000000000000000E+00
+       492         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   9.3599999999999994E+00
+       493         0         0         0
+   1.0199999999999999E+01   1.2000000000000000E+01   2.0000000000000000E+00
+       494         0         0         0
+   6.7999999999999998E+00   1.5199999999999999E+01   2.0000000000000000E+00
+       495         0         0         0
+   1.0199999999999999E+01  -1.4130000000000001E+01   4.9500000000000002E+00
+       496         0         0         0
+   6.7999999999999998E+00   1.4150000000000000E+01   3.1040000000000001E+00
+       497         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   3.3500000000000001E+00
+       498         0         0         0
+   1.0199999999999999E+01   1.5500000000000000E+01   5.0000000000000000E-01
+       499         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   4.9500000000000002E+00
+       500         0         0         0
+   6.7999999999999998E+00   1.5199999999999999E+01   3.8500000000000001E+00
+       501         0         0         0
+   6.7999999999999998E+00   1.4500000000000000E+01   3.8500000000000001E+00
+       502         0         0         0
+   6.7999999999999998E+00  -1.2000000000000000E+01   1.9527999999999999E+01
+       503         0         0         0
+   1.0199999999999999E+01   1.2877000000000001E+01   3.2160000000000002E+00
+       504         0         0         0
+   1.0199999999999999E+01  -1.4130000000000001E+01   7.1550000000000002E+00
+       505         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   7.1550000000000002E+00
+       506         0         0         0
+   6.7999999999999998E+00  -2.3999999999999999E+00   1.9800000000000001E+01
+       507         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   1.7000000000000000E+00
+       508         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   1.2359999999999999E+01
+       509         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   1.2359999999999999E+01
+       510         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   9.3599999999999994E+00
+       511         0         0         0
+   6.7999999999999998E+00   1.2000000000000000E+01   1.9527999999999999E+01
+       512         0         0         0
+   1.0199999999999999E+01  -1.4130000000000001E+01   9.3599999999999994E+00
+       513         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   1.5359999999999999E+01
+       514         0         0         0
+   1.0199999999999999E+01   1.4130000000000001E+01   4.9500000000000002E+00
+       515         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   1.2359999999999999E+01
+       516         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   3.3500000000000001E+00
+       517         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   4.9500000000000002E+00
+       518         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   1.5359999999999999E+01
+       519         0         0         0
+   1.0199999999999999E+01   1.4130000000000001E+01   7.1550000000000002E+00
+       520         0         0         0
+   1.0199999999999999E+01  -1.4130000000000001E+01   1.2359999999999999E+01
+       521         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   7.1550000000000002E+00
+       522         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   1.5359999999999999E+01
+       523         0         0         0
+   6.7999999999999998E+00   2.3999999999999999E+00   1.7609999999999999E+01
+       524         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   9.3599999999999994E+00
+       525         0         0         0
+   1.0199999999999999E+01   1.4130000000000001E+01   9.3599999999999994E+00
+       526         0         0         0
+   1.0199999999999999E+01  -1.4130000000000001E+01   1.5359999999999999E+01
+       527         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   1.7609999999999999E+01
+       528         0         0         0
+   1.0199999999999999E+01  -5.5999999999999996E+00   2.0000000000000000E+00
+       529         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   1.2359999999999999E+01
+       530         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   4.9500000000000002E+00
+       531         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   1.8969999999999999E+01
+       532         0         0         0
+   1.0199999999999999E+01   1.4130000000000001E+01   1.2359999999999999E+01
+       533         0         0         0
+   1.0199999999999999E+01  -1.6129999999999999E+01   2.0800000000000001E+01
+       534         0         0         0
+   1.0199999999999999E+01   5.5999999999999996E+00   2.0000000000000000E+00
+       536         0         0         0
+   6.7999999999999998E+00  -1.0400000000000000E+01   1.9611999999999998E+01
+       538         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   1.5359999999999999E+01
+       539         0         0         0
+   1.0199999999999999E+01   1.4130000000000001E+01   1.5359999999999999E+01
+       540         0         0         0
+   1.0199999999999999E+01  -1.4130000000000001E+01   1.8969999999999999E+01
+       541         0         0         0
+   1.0199999999999999E+01  -1.4130000000000001E+01   2.0916000000000000E+01
+       542         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   1.7609999999999999E+01
+       543         0         0         0
+   6.7999999999999998E+00  -4.0000000000000000E+00   1.9949999999999999E+01
+       544         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   1.8969999999999999E+01
+       545         0         0         0
+   6.7999999999999998E+00  -8.0000000000000000E+00   1.9739000000000001E+01
+       546         0         0         0
+   6.7999999999999998E+00  -5.5999999999999996E+00   1.9866000000000000E+01
+       547         0         0         0
+   1.0199999999999999E+01  -1.2000000000000000E+01   2.1027999999999999E+01
+       548         0         0         0
+   1.0199999999999999E+01   1.6129999999999999E+01   2.0800000000000001E+01
+       549         0         0         0
+   6.7999999999999998E+00   4.0000000000000000E+00   1.9949999999999999E+01
+       550         0         0         0
+   1.0199999999999999E+01  -1.0400000000000000E+01   2.1111999999999998E+01
+       551         0         0         0
+   6.7999999999999998E+00   1.0400000000000000E+01   1.9611999999999998E+01
+       552         0         0         0
+   6.7999999999999998E+00   8.0000000000000000E+00   1.9739000000000001E+01
+       553         0         0         0
+   6.7999999999999998E+00   5.5999999999999996E+00   1.9866000000000000E+01
+       554         0         0         0
+   1.0199999999999999E+01   1.4130000000000001E+01   1.8969999999999999E+01
+       555         0         0         0
+   1.0199999999999999E+01   1.4130000000000001E+01   2.0916000000000000E+01
+       556         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   2.1449999999999999E+01
+       557         0         0         0
+   1.0199999999999999E+01  -8.0000000000000000E+00   2.1239000000000001E+01
+       558         0         0         0
+   1.0199999999999999E+01  -2.3999999999999999E+00   2.1449999999999999E+01
+       559         0         0         0
+   1.0199999999999999E+01  -4.0000000000000000E+00   2.1449999999999999E+01
+       560         0         0         0
+   1.0199999999999999E+01  -5.5999999999999996E+00   2.1366000000000000E+01
+       561         0         0         0
+   1.0199999999999999E+01   2.3999999999999999E+00   2.1449999999999999E+01
+       562         0         0         0
+   1.0199999999999999E+01   1.2000000000000000E+01   2.1027999999999999E+01
+       563         0         0         0
+   1.0199999999999999E+01   4.0000000000000000E+00   2.1449999999999999E+01
+       564         0         0         0
+   1.0199999999999999E+01   1.0400000000000000E+01   2.1111999999999998E+01
+       565         0         0         0
+   1.0199999999999999E+01   5.5999999999999996E+00   2.1366000000000000E+01
+       566         0         0         0
+   1.0199999999999999E+01   8.0000000000000000E+00   2.1239000000000001E+01
+       569         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   1.7609999999999999E+01
+       570         0         0         0
+   1.0199999999999999E+01  -1.4130000000000001E+01   1.7609999999999999E+01
+       583         0         0         0
+   1.0199999999999999E+01   1.4130000000000001E+01   1.7609999999999999E+01
+       591         0         0         0
+   1.0199999999999999E+01   0.0000000000000000E+00   1.8969999999999999E+01
+       592         0         0         0
+   1.0199999999999999E+01  -3.2556229999999999E-02   9.5263449999999992E+00
+    -1
+    -1
+  2412
+         1        44         2         1         7         4
+         1       167       164         2
+         2        44         2         1         7         4
+       167       346       344       164
+         3        44         2         1         7         4
+       346       455       453       344
+         9        44         2         1         7         4
+         2       164       163         3
+        10        44         2         1         7         4
+       164       344       345       163
+        11        44         2         1         7         4
+       344       453       454       345
+        17        44         2         1         7         4
+         3       163       169         4
+        18        44         2         1         7         4
+       163       345       353       169
+        19        44         2         1         7         4
+       345       454       463       353
+        25        44         2         1         7         4
+         4       169       170         5
+        26        44         2         1         7         4
+       169       353       355       170
+        27        44         2         1         7         4
+       353       463       466       355
+        33        44         2         1         7         4
+         5       170       171         6
+        34        44         2         1         7         4
+       170       355       356       171
+        35        44         2         1         7         4
+       355       466       469       356
+        41        44         2         1         7         4
+         6       171       186         7
+        42        44         2         1         7         4
+       171       356       361       186
+        43        44         2         1         7         4
+       356       469       473       361
+        49        44         2         1         7         4
+         7       186       188         8
+        50        44         2         1         7         4
+       186       361       366       188
+        51        44         2         1         7         4
+       361       473       479       366
+        57        44         2         1         7         4
+         8       188       191         9
+        58        44         2         1         7         4
+       188       366       368       191
+        59        44         2         1         7         4
+       366       479       487       368
+        65        44         2         1         7         4
+         9       191       194        10
+        66        44         2         1         7         4
+       191       368       370       194
+        67        44         2         1         7         4
+       368       487       490       370
+        73        44         2         1         7         4
+        10       194       195        11
+        74        44         2         1         7         4
+       194       370       378       195
+        75        44         2         1         7         4
+       370       490       497       378
+        81        44         2         1         7         4
+        11       195       206        12
+        82        44         2         1         7         4
+       195       378       380       206
+        83        44         2         1         7         4
+       378       497       499       380
+        89        44         2         1         7         4
+        12       206       209        13
+        90        44         2         1         7         4
+       206       380       384       209
+        91        44         2         1         7         4
+       380       499       505       384
+        97        44         2         1         7         4
+        13       209       217        14
+        98        44         2         1         7         4
+       209       384       395       217
+        99        44         2         1         7         4
+       384       505       510       395
+       105        44         2         1         7         4
+        14       217       218        15
+       106        44         2         1         7         4
+       217       395       398       218
+       107        44         2         1         7         4
+       395       510       515       398
+       113        44         2         1         7         4
+        15       218       225        16
+       114        44         2         1         7         4
+       218       398       405       225
+       115        44         2         1         7         4
+       398       515       522       405
+       121        44         2         1         7         4
+        16       225       226        17
+       122        44         2         1         7         4
+       225       405       408       226
+       123        44         2         1         7         4
+       405       522       527       408
+       129        44         2         1         7         4
+        17       226       227        18
+       130        44         2         1         7         4
+       226       408       410       227
+       131        44         2         1         7         4
+       408       527       531       410
+       137        44         2         1         7         4
+        18       227       228        19
+       138        44         2         1         7         4
+       227       410       411       228
+       139        44         2         1         7         4
+       410       531       533       411
+       145        44         2         1         7         4
+        20       245       244        21
+       146        44         2         1         7         4
+       245       426       425       244
+       147        44         2         1         7         4
+       426       558       559       425
+       153        44         2         1         7         4
+        21       244       243        22
+       154        44         2         1         7         4
+       244       425       424       243
+       155        44         2         1         7         4
+       425       559       560       424
+       161        44         2         1         7         4
+        22       243       242        23
+       162        44         2         1         7         4
+       243       424       423       242
+       163        44         2         1         7         4
+       424       560       557       423
+       169        44         2         1         7         4
+        23       242       241        24
+       170        44         2         1         7         4
+       242       423       422       241
+       171        44         2         1         7         4
+       423       557       550       422
+       177        44         2         1         7         4
+        24       241       240        25
+       178        44         2         1         7         4
+       241       422       421       240
+       179        44         2         1         7         4
+       422       550       547       421
+       185        44         2         1         7         4
+        25       240       238        26
+       186        44         2         1         7         4
+       240       421       417       238
+       187        44         2         1         7         4
+       421       547       541       417
+       193        44         2         1         7         4
+        26       238       228        19
+       194        44         2         1         7         4
+       238       417       411       228
+       195        44         2         1         7         4
+       417       541       533       411
+       201        44         2         1         7         4
+        27       174       173        29
+       202        44         2         1         7         4
+       174       349       350       173
+       203        44         2         1         7         4
+       349       460       459       350
+       209        44         2         1         7         4
+        29       173       172        30
+       210        44         2         1         7         4
+       173       350       354       172
+       211        44         2         1         7         4
+       350       459       465       354
+       217        44         2         1         7         4
+        30       172       277        31
+       218        44         2         1         7         4
+       172       354       437       277
+       219        44         2         1         7         4
+       354       465       528       437
+       225        44         2         1         7         4
+        31       277       183        32
+       226        44         2         1         7         4
+       277       437       362       183
+       227        44         2         1         7         4
+       437       528       475       362
+       233        44         2         1         7         4
+        32       183       184        33
+       234        44         2         1         7         4
+       183       362       363       184
+       235        44         2         1         7         4
+       362       475       476       363
+       241        44         2         1         7         4
+        33       184       187        34
+       242        44         2         1         7         4
+       184       363       365       187
+       243        44         2         1         7         4
+       363       476       478       365
+       249        44         2         1         7         4
+        34       187       190        35
+       250        44         2         1         7         4
+       187       365       367       190
+       251        44         2         1         7         4
+       365       478       485       367
+       257        44         2         1         7         4
+        36       216       215        37
+       258        44         2         1         7         4
+       216       376       393       215
+       259        44         2         1         7         4
+       376       495       504       393
+       265        44         2         1         7         4
+        37       215       224        38
+       266        44         2         1         7         4
+       215       393       399       224
+       267        44         2         1         7         4
+       393       504       512       399
+       273        44         2         1         7         4
+        38       224       223        39
+       274        44         2         1         7         4
+       224       399       404       223
+       275        44         2         1         7         4
+       399       512       520       404
+       281        44         2         1         7         4
+        39       223       233        40
+       282        44         2         1         7         4
+       223       404       409       233
+       283        44         2         1         7         4
+       404       520       526       409
+       289        44         2         1         7         4
+        40       233       266        41
+       290        44         2         1         7         4
+       233       409       446       266
+       291        44         2         1         7         4
+       409       526       570       446
+       297        44         2         1         7         4
+        41       266       239        42
+       298        44         2         1         7         4
+       266       446       418       239
+       299        44         2         1         7         4
+       446       570       540       418
+       305        44         2         1         7         4
+        42       239       238        26
+       306        44         2         1         7         4
+       239       418       417       238
+       307        44         2         1         7         4
+       418       540       541       417
+       313        44         2         1         7         4
+         2       164       173        29
+       314        44         2         1         7         4
+       164       344       350       173
+       315        44         2         1         7         4
+       344       453       459       350
+       321        44         2         1         7         4
+         4       169       277        31
+       322        44         2         1         7         4
+       169       353       437       277
+       323        44         2         1         7         4
+       353       463       528       437
+       329        44         2         1         7         4
+         7       186       187        34
+       330        44         2         1         7         4
+       186       361       365       187
+       331        44         2         1         7         4
+       361       473       478       365
+       337        44         2         1         7         4
+        36       216       206        12
+       338        44         2         1         7         4
+       216       376       380       206
+       339        44         2         1         7         4
+       376       495       499       380
+       345        44         2         1         7         4
+        38       224       217        14
+       346        44         2         1         7         4
+       224       399       395       217
+       347        44         2         1         7         4
+       399       512       510       395
+       353        44         2         1         7         4
+        40       233       225        16
+       354        44         2         1         7         4
+       233       409       405       225
+       355        44         2         1         7         4
+       409       526       522       405
+       361        44         2         1         7         4
+        35       190       216        36
+       362        44         2         1         7         4
+       190       367       376       216
+       363        44         2         1         7         4
+       367       485       495       376
+       369        44         2         1         7         4
+         1       167       166        53
+       370        44         2         1         7         4
+       167       346       347       166
+       371        44         2         1         7         4
+       346       455       456       347
+       377        44         2         1         7         4
+        53       166       165        54
+       378        44         2         1         7         4
+       166       347       348       165
+       379        44         2         1         7         4
+       347       456       457       348
+       385        44         2         1         7         4
+        54       165       177        55
+       386        44         2         1         7         4
+       165       348       357       177
+       387        44         2         1         7         4
+       348       457       467       357
+       393        44         2         1         7         4
+        55       177       178        56
+       394        44         2         1         7         4
+       177       357       359       178
+       395        44         2         1         7         4
+       357       467       471       359
+       401        44         2         1         7         4
+        56       178       179        57
+       402        44         2         1         7         4
+       178       359       360       179
+       403        44         2         1         7         4
+       359       471       472       360
+       409        44         2         1         7         4
+        57       179       200        58
+       410        44         2         1         7         4
+       179       360       369       200
+       411        44         2         1         7         4
+       360       472       484       369
+       417        44         2         1         7         4
+        58       200       205        59
+       418        44         2         1         7         4
+       200       369       377       205
+       419        44         2         1         7         4
+       369       484       491       377
+       425        44         2         1         7         4
+        59       205       208        60
+       426        44         2         1         7         4
+       205       377       382       208
+       427        44         2         1         7         4
+       377       491       498       382
+       433        44         2         1         7         4
+        60       208       213        61
+       434        44         2         1         7         4
+       208       382       392       213
+       435        44         2         1         7         4
+       382       498       507       392
+       441        44         2         1         7         4
+        61       213       214        62
+       442        44         2         1         7         4
+       213       392       396       214
+       443        44         2         1         7         4
+       392       507       516       396
+       449        44         2         1         7         4
+        62       214       219        63
+       450        44         2         1         7         4
+       214       396       400       219
+       451        44         2         1         7         4
+       396       516       517       400
+       457        44         2         1         7         4
+        63       219       220        64
+       458        44         2         1         7         4
+       219       400       402       220
+       459        44         2         1         7         4
+       400       517       521       402
+       465        44         2         1         7         4
+        64       220       229        65
+       466        44         2         1         7         4
+       220       402       406       229
+       467        44         2         1         7         4
+       402       521       524       406
+       473        44         2         1         7         4
+        65       229       230        66
+       474        44         2         1         7         4
+       229       406       412       230
+       475        44         2         1         7         4
+       406       524       529       412
+       481        44         2         1         7         4
+        66       230       234        67
+       482        44         2         1         7         4
+       230       412       414       234
+       483        44         2         1         7         4
+       412       529       538       414
+       489        44         2         1         7         4
+        67       234       235        68
+       490        44         2         1         7         4
+       234       414       415       235
+       491        44         2         1         7         4
+       414       538       542       415
+       497        44         2         1         7         4
+        68       235       236        69
+       498        44         2         1         7         4
+       235       415       416       236
+       499        44         2         1         7         4
+       415       542       544       416
+       505        44         2         1         7         4
+        69       236       237        70
+       506        44         2         1         7         4
+       236       416       419       237
+       507        44         2         1         7         4
+       416       544       548       419
+       513        44         2         1         7         4
+        71       246       247        72
+       514        44         2         1         7         4
+       246       427       428       247
+       515        44         2         1         7         4
+       427       556       561       428
+       521        44         2         1         7         4
+        72       247       250        73
+       522        44         2         1         7         4
+       247       428       431       250
+       523        44         2         1         7         4
+       428       561       563       431
+       529        44         2         1         7         4
+        73       250       251        74
+       530        44         2         1         7         4
+       250       431       434       251
+       531        44         2         1         7         4
+       431       563       565       434
+       537        44         2         1         7         4
+        74       251       252        75
+       538        44         2         1         7         4
+       251       434       435       252
+       539        44         2         1         7         4
+       434       565       566       435
+       545        44         2         1         7         4
+        75       252       253        76
+       546        44         2         1         7         4
+       252       435       433       253
+       547        44         2         1         7         4
+       435       566       564       433
+       553        44         2         1         7         4
+        76       253       254        77
+       554        44         2         1         7         4
+       253       433       432       254
+       555        44         2         1         7         4
+       433       564       562       432
+       561        44         2         1         7         4
+        77       254       255        78
+       562        44         2         1         7         4
+       254       432       429       255
+       563        44         2         1         7         4
+       432       562       555       429
+       569        44         2         1         7         4
+        78       255       237        70
+       570        44         2         1         7         4
+       255       429       419       237
+       571        44         2         1         7         4
+       429       555       548       419
+       577        44         2         1         7         4
+        27       174       175        79
+       578        44         2         1         7         4
+       174       349       352       175
+       579        44         2         1         7         4
+       349       460       461       352
+       585        44         2         1         7         4
+        79       175       176        80
+       586        44         2         1         7         4
+       175       352       358       176
+       587        44         2         1         7         4
+       352       461       470       358
+       593        44         2         1         7         4
+        80       176       289        81
+       594        44         2         1         7         4
+       176       358       439       289
+       595        44         2         1         7         4
+       358       470       534       439
+       601        44         2         1         7         4
+        81       289       196        82
+       602        44         2         1         7         4
+       289       439       371       196
+       603        44         2         1         7         4
+       439       534       486       371
+       609        44         2         1         7         4
+        82       196       201        83
+       610        44         2         1         7         4
+       196       371       373       201
+       611        44         2         1         7         4
+       371       486       488       373
+       617        44         2         1         7         4
+        83       201       207        84
+       618        44         2         1         7         4
+       201       373       379       207
+       619        44         2         1         7         4
+       373       488       493       379
+       625        44         2         1         7         4
+        84       207       212        85
+       626        44         2         1         7         4
+       207       379       388       212
+       627        44         2         1         7         4
+       379       493       503       388
+       633        44         2         1         7         4
+        86       222       221        87
+       634        44         2         1         7         4
+       222       397       403       221
+       635        44         2         1         7         4
+       397       514       519       403
+       641        44         2         1         7         4
+        87       221       232        88
+       642        44         2         1         7         4
+       221       403       407       232
+       643        44         2         1         7         4
+       403       519       525       407
+       649        44         2         1         7         4
+        88       232       231        89
+       650        44         2         1         7         4
+       232       407       413       231
+       651        44         2         1         7         4
+       407       525       532       413
+       657        44         2         1         7         4
+        89       231       259        90
+       658        44         2         1         7         4
+       231       413       420       259
+       659        44         2         1         7         4
+       413       532       539       420
+       665        44         2         1         7         4
+        90       259       267        91
+       666        44         2         1         7         4
+       259       420       447       267
+       667        44         2         1         7         4
+       420       539       583       447
+       673        44         2         1         7         4
+        91       267       256        92
+       674        44         2         1         7         4
+       267       447       430       256
+       675        44         2         1         7         4
+       447       583       554       430
+       681        44         2         1         7         4
+        92       256       255        78
+       682        44         2         1         7         4
+       256       430       429       255
+       683        44         2         1         7         4
+       430       554       555       429
+       689        44         2         1         7         4
+        53       166       175        79
+       690        44         2         1         7         4
+       166       347       352       175
+       691        44         2         1         7         4
+       347       456       461       352
+       697        44         2         1         7         4
+        55       177       289        81
+       698        44         2         1         7         4
+       177       357       439       289
+       699        44         2         1         7         4
+       357       467       534       439
+       705        44         2         1         7         4
+        58       200       207        84
+       706        44         2         1         7         4
+       200       369       379       207
+       707        44         2         1         7         4
+       369       484       493       379
+       713        44         2         1         7         4
+        86       222       219        63
+       714        44         2         1         7         4
+       222       397       400       219
+       715        44         2         1         7         4
+       397       514       517       400
+       721        44         2         1         7         4
+        88       232       229        65
+       722        44         2         1         7         4
+       232       407       406       229
+       723        44         2         1         7         4
+       407       525       524       406
+       729        44         2         1         7         4
+        90       259       234        67
+       730        44         2         1         7         4
+       259       420       414       234
+       731        44         2         1         7         4
+       420       539       538       414
+       737        44         2         1         7         4
+        85       212       222        86
+       738        44         2         1         7         4
+       212       388       397       222
+       739        44         2         1         7         4
+       388       503       514       397
+       745        44         2         1         7         4
+         1       167       174        27
+       746        44         2         1         7         4
+       167       346       349       174
+       747        44         2         1         7         4
+       346       455       460       349
+       753        44         2         1         7         4
+        27       174       168        48
+       754        44         2         1         7         4
+       174       349       351       168
+       755        44         2         1         7         4
+       349       460       462       351
+       761        44         2         1         7         4
+        48       168       278        49
+       762        44         2         1         7         4
+       168       351       436       278
+       763        44         2         1         7         4
+       351       462       530       436
+       769        44         2         1         7         4
+        49       278       182       101
+       770        44         2         1         7         4
+       278       436       364       182
+       771        44         2         1         7         4
+       436       530       480       364
+       777        44         2         1         7         4
+       101       182       261       102
+       778        44         2         1         7         4
+       182       364       374       261
+       779        44         2         1         7         4
+       364       480       492       374
+       785        44         2         1         7         4
+       102       261       210       103
+       786        44         2         1         7         4
+       261       374       394       210
+       787        44         2         1         7         4
+       374       492       508       394
+       793        44         2         1         7         4
+       103       210       263       104
+       794        44         2         1         7         4
+       210       394       401       263
+       795        44         2         1         7         4
+       394       508       518       401
+       801        44         2         1         7         4
+       104       263       265        52
+       802        44         2         1         7         4
+       263       401       445       265
+       803        44         2         1         7         4
+       401       518       569       445
+       809        44         2         1         7         4
+        52       265       339        28
+       810        44         2         1         7         4
+       265       445       448       339
+       811        44         2         1         7         4
+       445       569       591       448
+       817        44         2         1         7         4
+        71       246       339        28
+       818        44         2         1         7         4
+       246       427       448       339
+       819        44         2         1         7         4
+       427       556       591       448
+       825        44         2         1         7         4
+        71       246       245        20
+       826        44         2         1         7         4
+       246       427       426       245
+       827        44         2         1         7         4
+       427       556       558       426
+       838        11         2         1         7         2
+         0         0         0
+       450       436
+       839        11         2         1         7         2
+         0         0         0
+       305       278
+       845        11         2         1         7         2
+         0         0         0
+       449       450
+       846        11         2         1         7         2
+         0         0         0
+       304       305
+       852        11         2         1         7         2
+         0         0         0
+       437       449
+       853        11         2         1         7         2
+         0         0         0
+       277       304
+       859        11         2         1         7         2
+         0         0         0
+       350       349
+       860        11         2         1         7         2
+         0         0         0
+       173       174
+       861        11         2         1         7         2
+         0         0         0
+        29        27
+       867        11         2         1         7         2
+         0         0         0
+       346       344
+       868        11         2         1         7         2
+         0         0         0
+       167       164
+       869        11         2         1         7         2
+         0         0         0
+         1         2
+       875        11         2         1         7         2
+         0         0         0
+       477       452
+       876        11         2         1         7         2
+         0         0         0
+       316       302
+       882        11         2         1         7         2
+         0         0         0
+       483       477
+       883        11         2         1         7         2
+         0         0         0
+       326       316
+       889        11         2         1         7         2
+         0         0         0
+       482       483
+       890        11         2         1         7         2
+         0         0         0
+       325       326
+       896        11         2         1         7         2
+         0         0         0
+       481       482
+       897        11         2         1         7         2
+         0         0         0
+       315       325
+       903        11         2         1         7         2
+         0         0         0
+       452       481
+       904        11         2         1         7         2
+         0         0         0
+       302       315
+       910        11         2         1         7         2
+         0         0         0
+       446       502
+       911        11         2         1         7         2
+         0         0         0
+       266       297
+       917        11         2         1         7         2
+         0         0         0
+       502       536
+       918        11         2         1         7         2
+         0         0         0
+       297       318
+       924        11         2         1         7         2
+         0         0         0
+       536       545
+       925        11         2         1         7         2
+         0         0         0
+       318       327
+       931        11         2         1         7         2
+         0         0         0
+       545       546
+       932        11         2         1         7         2
+         0         0         0
+       327       328
+       938        11         2         1         7         2
+         0         0         0
+       546       543
+       939        11         2         1         7         2
+         0         0         0
+       328       317
+       945        11         2         1         7         2
+         0         0         0
+       543       506
+       946        11         2         1         7         2
+         0         0         0
+       317       294
+       952        11         2         1         7         2
+         0         0         0
+       506       445
+       953        11         2         1         7         2
+         0         0         0
+       294       265
+       954        11         2         1         7         2
+         0         0         0
+       216       268
+       955        11         2         1         7         2
+         0         0         0
+       268       292
+       956        11         2         1         7         2
+         0         0         0
+       292       311
+       957        11         2         1         7         2
+         0         0         0
+       311       313
+       958        11         2         1         7         2
+         0         0         0
+       313       314
+       959        11         2         1         7         2
+         0         0         0
+       314       306
+       960        11         2         1         7         2
+         0         0         0
+       306       269
+       961        11         2         1         7         2
+         0         0         0
+       224       295
+       962        11         2         1         7         2
+         0         0         0
+       295       383
+       963        11         2         1         7         2
+         0         0         0
+       383       443
+       964        11         2         1         7         2
+         0         0         0
+       443       444
+       965        11         2         1         7         2
+         0         0         0
+       444       372
+       966        11         2         1         7         2
+         0         0         0
+       372       290
+       967        11         2         1         7         2
+         0         0         0
+       233       293
+       968        11         2         1         7         2
+         0         0         0
+       293       381
+       969        11         2         1         7         2
+         0         0         0
+       381       441
+       970        11         2         1         7         2
+         0         0         0
+       441       442
+       971        11         2         1         7         2
+         0         0         0
+       442       375
+       972        11         2         1         7         2
+         0         0         0
+       375       291
+       978        11         2         1         7         2
+         0         0         0
+       451       458
+       979        11         2         1         7         2
+         0         0         0
+       312       319
+       985        11         2         1         7         2
+         0         0         0
+       439       451
+       986        11         2         1         7         2
+         0         0         0
+       289       312
+       992        11         2         1         7         2
+         0         0         0
+       352       349
+       993        11         2         1         7         2
+         0         0         0
+       175       174
+       994        11         2         1         7         2
+         0         0         0
+        79        27
+      1000        11         2         1         7         2
+         0         0         0
+       346       347
+      1001        11         2         1         7         2
+         0         0         0
+       167       166
+      1002        11         2         1         7         2
+         0         0         0
+         1        53
+      1008        11         2         1         7         2
+         0         0         0
+       496       468
+      1009        11         2         1         7         2
+         0         0         0
+       323       307
+      1015        11         2         1         7         2
+         0         0         0
+       501       496
+      1016        11         2         1         7         2
+         0         0         0
+       332       323
+      1022        11         2         1         7         2
+         0         0         0
+       500       501
+      1023        11         2         1         7         2
+         0         0         0
+       331       332
+      1029        11         2         1         7         2
+         0         0         0
+       494       500
+      1030        11         2         1         7         2
+         0         0         0
+       322       331
+      1036        11         2         1         7         2
+         0         0         0
+       468       494
+      1037        11         2         1         7         2
+         0         0         0
+       307       322
+      1043        11         2         1         7         2
+         0         0         0
+       447       511
+      1044        11         2         1         7         2
+         0         0         0
+       267       303
+      1050        11         2         1         7         2
+         0         0         0
+       511       551
+      1051        11         2         1         7         2
+         0         0         0
+       303       324
+      1057        11         2         1         7         2
+         0         0         0
+       551       552
+      1058        11         2         1         7         2
+         0         0         0
+       324       329
+      1064        11         2         1         7         2
+         0         0         0
+       552       553
+      1065        11         2         1         7         2
+         0         0         0
+       329       330
+      1071        11         2         1         7         2
+         0         0         0
+       553       549
+      1072        11         2         1         7         2
+         0         0         0
+       330       321
+      1073        11         2         1         7         2
+         0         0         0
+       222       270
+      1074        11         2         1         7         2
+         0         0         0
+       270       300
+      1075        11         2         1         7         2
+         0         0         0
+       300       309
+      1076        11         2         1         7         2
+         0         0         0
+       309       310
+      1077        11         2         1         7         2
+         0         0         0
+       310       308
+      1078        11         2         1         7         2
+         0         0         0
+       308       271
+      1079        11         2         1         7         2
+         0         0         0
+       271       260
+      1080        11         2         1         7         2
+         0         0         0
+       232       301
+      1081        11         2         1         7         2
+         0         0         0
+       301       386
+      1082        11         2         1         7         2
+         0         0         0
+       386       387
+      1083        11         2         1         7         2
+         0         0         0
+       387       385
+      1084        11         2         1         7         2
+         0         0         0
+       385       296
+      1085        11         2         1         7         2
+         0         0         0
+       296       262
+      1086        11         2         1         7         2
+         0         0         0
+       259       299
+      1087        11         2         1         7         2
+         0         0         0
+       299       390
+      1088        11         2         1         7         2
+         0         0         0
+       390       391
+      1089        11         2         1         7         2
+         0         0         0
+       391       389
+      1090        11         2         1         7         2
+         0         0         0
+       389       298
+      1091        11         2         1         7         2
+         0         0         0
+       298       264
+      1097        11         2         1         7         2
+         0         0         0
+       346       349
+      1098        11         2         1         7         2
+         0         0         0
+       167       174
+      1099        11         2         1         7         2
+         0         0         0
+         1        27
+      1100        11         2         1         7         2
+         0         0         0
+       291       263
+      1101        11         2         1         7         2
+         0         0         0
+       290       261
+      1102        11         2         1         7         2
+         0         0         0
+       269       278
+      1103        11         2         1         7         2
+         0         0         0
+       263       264
+      1104        11         2         1         7         2
+         0         0         0
+       261       262
+      1105        11         2         1         7         2
+         0         0         0
+       278       260
+      1106        11         2         1         7         2
+         0         0         0
+       319       340
+      1107        11         2         1         7         2
+         0         0         0
+       340       342
+      1108        11         2         1         7         2
+         0         0         0
+       342       343
+      1109        11         2         1         7         2
+         0         0         0
+       343       341
+      1110        11         2         1         7         2
+         0         0         0
+       341       320
+      1111        11         2         1         7         2
+         0         0         0
+       320       321
+      1112        11         2         1         7         2
+         0         0         0
+       458       474
+      1118        11         2         1         7         2
+         0         0         0
+       474       489
+      1124        11         2         1         7         2
+         0         0         0
+       489       509
+      1130        11         2         1         7         2
+         0         0         0
+       509       513
+      1136        11         2         1         7         2
+         0         0         0
+       513       523
+      1142        11         2         1         7         2
+         0         0         0
+       523       549
+      1153        11         2         1         7         2
+         0         0         0
+       448       591
+      1154        11         2         1         7         2
+         0         0         0
+       339       448
+      1155        11         2         1         7         2
+         0         0         0
+        28       339
+      1156        11         2         1         7         2
+         0         0         0
+        28       118
+      1157        11         2         1         7         2
+         0         0         0
+       118       152
+      1158        11         2         1         7         2
+         0         0         0
+       152       153
+      1159        11         2         1         7         2
+         0         0         0
+       153       154
+      1160        11         2         1         7         2
+         0         0         0
+       154       155
+      1161        11         2         1         7         2
+         0         0         0
+        28       157
+      1162        11         2         1         7         2
+         0         0         0
+       157       158
+      1163        11         2         1         7         2
+         0         0         0
+       158       159
+      1164        11         2         1         7         2
+         0         0         0
+       159       160
+      1165        11         2         1         7         2
+         0         0         0
+       155       156
+      1166        11         2         1         7         2
+         0         0         0
+       156        92
+      1167        11         2         1         7         2
+         0         0         0
+       160       161
+      1168        11         2         1         7         2
+         0         0         0
+       161       162
+      1169        11         2         1         7         2
+         0         0         0
+       162        42
+      1175        44         2         1         7         4
+       438       351       349       350
+      1176        44         2         1         7         4
+       180       168       174       173
+      1177        44         2         1         7         4
+        50        48        27        29
+      1183        44         2         1         7         4
+       450       436       351       438
+      1184        44         2         1         7         4
+       305       278       168       180
+      1190        44         2         1         7         4
+       449       438       350       354
+      1191        44         2         1         7         4
+       304       180       173       172
+      1197        44         2         1         7         4
+       354       350       344       345
+      1198        44         2         1         7         4
+       172       173       164       163
+      1199        44         2         1         7         4
+        30        29         2         3
+      1205        44         2         1         7         4
+       437       354       345       353
+      1206        44         2         1         7         4
+       277       172       163       169
+      1207        44         2         1         7         4
+        31        30         3         4
+      1213        44         2         1         7         4
+       362       437       353       355
+      1214        44         2         1         7         4
+       183       277       169       170
+      1215        44         2         1         7         4
+        32        31         4         5
+      1221        44         2         1         7         4
+       363       362       355       356
+      1222        44         2         1         7         4
+       184       183       170       171
+      1223        44         2         1         7         4
+        33        32         5         6
+      1229        44         2         1         7         4
+       365       363       356       361
+      1230        44         2         1         7         4
+       187       184       171       186
+      1236        44         2         1         7         4
+       452       365       361       366
+      1237        44         2         1         7         4
+       302       187       186       188
+      1238        44         2         1         7         4
+        43        34         7         8
+      1244        44         2         1         7         4
+       481       452       366       368
+      1245        44         2         1         7         4
+       315       302       188       191
+      1246        44         2         1         7         4
+        47        43         8         9
+      1252        44         2         1         7         4
+       477       367       365       452
+      1253        44         2         1         7         4
+       316       190       187       302
+      1254        44         2         1         7         4
+        46        35        34        43
+      1260        44         2         1         7         4
+       483       376       367       477
+      1261        44         2         1         7         4
+       326       216       190       316
+      1262        44         2         1         7         4
+        45        36        35        46
+      1268        44         2         1         7         4
+       378       482       481       370
+      1269        44         2         1         7         4
+       195       325       315       194
+      1270        44         2         1         7         4
+        11        44        47        10
+      1276        44         2         1         7         4
+       380       376       483       482
+      1277        44         2         1         7         4
+       206       216       326       325
+      1278        44         2         1         7         4
+        12        36        45        44
+      1284        44         2         1         7         4
+       384       393       376       380
+      1285        44         2         1         7         4
+       209       215       216       206
+      1286        44         2         1         7         4
+        13        37        36        12
+      1292        44         2         1         7         4
+       395       399       393       384
+      1293        44         2         1         7         4
+       217       224       215       209
+      1294        44         2         1         7         4
+        14        38        37        13
+      1300        44         2         1         7         4
+       398       404       399       395
+      1301        44         2         1         7         4
+       218       223       224       217
+      1302        44         2         1         7         4
+        15        39        38        14
+      1308        44         2         1         7         4
+       405       409       404       398
+      1309        44         2         1         7         4
+       225       233       223       218
+      1310        44         2         1         7         4
+        16        40        39        15
+      1316        44         2         1         7         4
+       408       446       409       405
+      1317        44         2         1         7         4
+       226       266       233       225
+      1318        44         2         1         7         4
+        17        41        40        16
+      1324        44         2         1         7         4
+       410       418       446       408
+      1325        44         2         1         7         4
+       227       239       266       226
+      1326        44         2         1         7         4
+        18        42        41        17
+      1332        44         2         1         7         4
+       411       417       418       410
+      1333        44         2         1         7         4
+       228       238       239       227
+      1334        44         2         1         7         4
+        19        26        42        18
+      1340        44         2         1         7         4
+       417       421       502       418
+      1341        44         2         1         7         4
+       238       240       297       239
+      1342        44         2         1         7         4
+        26        25       162        42
+      1348        44         2         1         7         4
+       421       422       536       502
+      1349        44         2         1         7         4
+       240       241       318       297
+      1350        44         2         1         7         4
+        25        24       161       162
+      1356        44         2         1         7         4
+       422       423       545       536
+      1357        44         2         1         7         4
+       241       242       327       318
+      1358        44         2         1         7         4
+        24        23       160       161
+      1364        44         2         1         7         4
+       423       424       546       545
+      1365        44         2         1         7         4
+       242       243       328       327
+      1366        44         2         1         7         4
+        23        22       159       160
+      1372        44         2         1         7         4
+       424       425       543       546
+      1373        44         2         1         7         4
+       243       244       317       328
+      1374        44         2         1         7         4
+        22        21       158       159
+      1380        44         2         1         7         4
+       425       426       506       543
+      1381        44         2         1         7         4
+       244       245       294       317
+      1382        44         2         1         7         4
+        21        20       157       158
+      1383        44         2         1         7         4
+        44        45        46        47
+      1384        44         2         1         7         4
+       110       113        33        34
+      1385        44         2         1         7         4
+       113       112        32        33
+      1386        44         2         1         7         4
+       112       111        31        32
+      1387        44         2         1         7         4
+       111        51        30        31
+      1388        44         2         1         7         4
+        51        50        29        30
+      1389        44         2         1         7         4
+       119       123       110        35
+      1390        44         2         1         7         4
+       123       135       113       110
+      1391        44         2         1         7         4
+       135       150       112       113
+      1392        44         2         1         7         4
+       150       151       111       112
+      1393        44         2         1         7         4
+       151       133        51       111
+      1394        44         2         1         7         4
+       133       120        50        51
+      1395        44         2         1         7         4
+       120        49        48        50
+      1396        44         2         1         7         4
+        37       131       119        36
+      1397        44         2         1         7         4
+       131       211       135       123
+      1398        44         2         1         7         4
+       211       258       150       135
+      1399        44         2         1         7         4
+       258       257       151       150
+      1400        44         2         1         7         4
+       257       181       133       151
+      1401        44         2         1         7         4
+       181       124       120       133
+      1402        44         2         1         7         4
+        38       143       131        37
+      1403        44         2         1         7         4
+       143       279       211       131
+      1404        44         2         1         7         4
+       279       337       258       211
+      1405        44         2         1         7         4
+       337       338       257       258
+      1406        44         2         1         7         4
+       338       272       181       257
+      1407        44         2         1         7         4
+       272       136       124       181
+      1408        44         2         1         7         4
+        39       142       143        38
+      1409        44         2         1         7         4
+       142       276       279       143
+      1410        44         2         1         7         4
+       276       335       337       279
+      1411        44         2         1         7         4
+       335       336       338       337
+      1412        44         2         1         7         4
+       336       273       272       338
+      1413        44         2         1         7         4
+       273       137       136       272
+      1414        44         2         1         7         4
+        40       141       142        39
+      1415        44         2         1         7         4
+       141       275       276       142
+      1416        44         2         1         7         4
+       275       333       335       276
+      1417        44         2         1         7         4
+       333       334       336       335
+      1418        44         2         1         7         4
+       334       274       273       336
+      1419        44         2         1         7         4
+       274       138       137       273
+      1420        44         2         1         7         4
+        41       125       141        40
+      1421        44         2         1         7         4
+       125       189       275       141
+      1422        44         2         1         7         4
+       189       248       333       275
+      1423        44         2         1         7         4
+       248       249       334       333
+      1424        44         2         1         7         4
+       249       192       274       334
+      1425        44         2         1         7         4
+       192       126       138       274
+      1426        44         2         1         7         4
+        42       162       125        41
+      1427        44         2         1         7         4
+       162       161       189       125
+      1428        44         2         1         7         4
+       161       160       248       189
+      1429        44         2         1         7         4
+       160       159       249       248
+      1430        44         2         1         7         4
+       159       158       192       249
+      1431        44         2         1         7         4
+       158       157       126       192
+      1432        44         2         1         7         4
+       268       119       123       292
+      1433        44         2         1         7         4
+       292       123       135       311
+      1434        44         2         1         7         4
+       311       135       150       313
+      1435        44         2         1         7         4
+       313       150       151       314
+      1436        44         2         1         7         4
+       314       151       133       306
+      1437        44         2         1         7         4
+       306       133       120       269
+      1438        44         2         1         7         4
+       216        36       119       268
+      1439        44         2         1         7         4
+       224        38       143       295
+      1440        44         2         1         7         4
+       295       143       279       383
+      1441        44         2         1         7         4
+       383       279       337       443
+      1442        44         2         1         7         4
+       443       337       338       444
+      1443        44         2         1         7         4
+       444       338       272       372
+      1444        44         2         1         7         4
+       372       272       136       290
+      1445        44         2         1         7         4
+       233        40       141       293
+      1446        44         2         1         7         4
+       293       141       275       381
+      1447        44         2         1         7         4
+       381       275       333       441
+      1448        44         2         1         7         4
+       441       333       334       442
+      1449        44         2         1         7         4
+       442       334       274       375
+      1450        44         2         1         7         4
+       375       274       138       291
+      1456        44         2         1         7         4
+       440       351       349       352
+      1457        44         2         1         7         4
+       185       168       174       175
+      1458        44         2         1         7         4
+        98        48        27        79
+      1464        44         2         1         7         4
+       458       436       351       440
+      1465        44         2         1         7         4
+       319       278       168       185
+      1471        44         2         1         7         4
+       451       440       352       358
+      1472        44         2         1         7         4
+       312       185       175       176
+      1478        44         2         1         7         4
+       358       352       347       348
+      1479        44         2         1         7         4
+       176       175       166       165
+      1480        44         2         1         7         4
+        80        79        53        54
+      1486        44         2         1         7         4
+       439       358       348       357
+      1487        44         2         1         7         4
+       289       176       165       177
+      1488        44         2         1         7         4
+        81        80        54        55
+      1494        44         2         1         7         4
+       371       439       357       359
+      1495        44         2         1         7         4
+       196       289       177       178
+      1496        44         2         1         7         4
+        82        81        55        56
+      1502        44         2         1         7         4
+       373       371       359       360
+      1503        44         2         1         7         4
+       201       196       178       179
+      1504        44         2         1         7         4
+        83        82        56        57
+      1510        44         2         1         7         4
+       379       373       360       369
+      1511        44         2         1         7         4
+       207       201       179       200
+      1512        44         2         1         7         4
+        84        83        57        58
+      1518        44         2         1         7         4
+       468       379       369       377
+      1519        44         2         1         7         4
+       307       207       200       205
+      1520        44         2         1         7         4
+        93        84        58        59
+      1526        44         2         1         7         4
+       494       468       377       382
+      1527        44         2         1         7         4
+       322       307       205       208
+      1528        44         2         1         7         4
+        97        93        59        60
+      1534        44         2         1         7         4
+       496       388       379       468
+      1535        44         2         1         7         4
+       323       212       207       307
+      1536        44         2         1         7         4
+        96        85        84        93
+      1542        44         2         1         7         4
+       501       397       388       496
+      1543        44         2         1         7         4
+       332       222       212       323
+      1544        44         2         1         7         4
+        95        86        85        96
+      1550        44         2         1         7         4
+       396       500       494       392
+      1551        44         2         1         7         4
+       214       331       322       213
+      1552        44         2         1         7         4
+        62        94        97        61
+      1558        44         2         1         7         4
+       400       397       501       500
+      1559        44         2         1         7         4
+       219       222       332       331
+      1560        44         2         1         7         4
+        63        86        95        94
+      1566        44         2         1         7         4
+       402       403       397       400
+      1567        44         2         1         7         4
+       220       221       222       219
+      1568        44         2         1         7         4
+        64        87        86        63
+      1574        44         2         1         7         4
+       406       407       403       402
+      1575        44         2         1         7         4
+       229       232       221       220
+      1576        44         2         1         7         4
+        65        88        87        64
+      1582        44         2         1         7         4
+       412       413       407       406
+      1583        44         2         1         7         4
+       230       231       232       229
+      1584        44         2         1         7         4
+        66        89        88        65
+      1590        44         2         1         7         4
+       414       420       413       412
+      1591        44         2         1         7         4
+       234       259       231       230
+      1592        44         2         1         7         4
+        67        90        89        66
+      1598        44         2         1         7         4
+       415       447       420       414
+      1599        44         2         1         7         4
+       235       267       259       234
+      1600        44         2         1         7         4
+        68        91        90        67
+      1606        44         2         1         7         4
+       416       430       447       415
+      1607        44         2         1         7         4
+       236       256       267       235
+      1608        44         2         1         7         4
+        69        92        91        68
+      1614        44         2         1         7         4
+       419       429       430       416
+      1615        44         2         1         7         4
+       237       255       256       236
+      1616        44         2         1         7         4
+        70        78        92        69
+      1622        44         2         1         7         4
+       429       432       511       430
+      1623        44         2         1         7         4
+       255       254       303       256
+      1624        44         2         1         7         4
+        78        77       156        92
+      1630        44         2         1         7         4
+       432       433       551       511
+      1631        44         2         1         7         4
+       254       253       324       303
+      1632        44         2         1         7         4
+        77        76       155       156
+      1638        44         2         1         7         4
+       433       435       552       551
+      1639        44         2         1         7         4
+       253       252       329       324
+      1640        44         2         1         7         4
+        76        75       154       155
+      1646        44         2         1         7         4
+       435       434       553       552
+      1647        44         2         1         7         4
+       252       251       330       329
+      1648        44         2         1         7         4
+        75        74       153       154
+      1654        44         2         1         7         4
+       434       431       549       553
+      1655        44         2         1         7         4
+       251       250       321       330
+      1656        44         2         1         7         4
+        74        73       152       153
+      1662        44         2         1         7         4
+       431       428       464       549
+      1663        44         2         1         7         4
+       250       247       193       321
+      1664        44         2         1         7         4
+        73        72       118       152
+      1670        44         2         1         7         4
+       428       427       448       464
+      1671        44         2         1         7         4
+       247       246       339       193
+      1672        44         2         1         7         4
+        72        71        28       118
+      1673        44         2         1         7         4
+        94        95        96        97
+      1674        44         2         1         7         4
+       114       117        83        84
+      1675        44         2         1         7         4
+       117       116        82        83
+      1676        44         2         1         7         4
+       116       115        81        82
+      1677        44         2         1         7         4
+       115       100        80        81
+      1678        44         2         1         7         4
+       100        98        79        80
+      1679        44         2         1         7         4
+       121       129       114        85
+      1680        44         2         1         7         4
+       129       139       117       114
+      1681        44         2         1         7         4
+       139       140       116       117
+      1682        44         2         1         7         4
+       140       134       115       116
+      1683        44         2         1         7         4
+       134       122       100       115
+      1684        44         2         1         7         4
+       122        99        98       100
+      1685        44         2         1         7         4
+        99        49        48        98
+      1686        44         2         1         7         4
+        87       132       121        86
+      1687        44         2         1         7         4
+       132       199       139       129
+      1688        44         2         1         7         4
+       199       198       140       139
+      1689        44         2         1         7         4
+       198       197       134       140
+      1690        44         2         1         7         4
+       197       127       122       134
+      1691        44         2         1         7         4
+        88       149       132        87
+      1692        44         2         1         7         4
+       149       287       199       132
+      1693        44         2         1         7         4
+       287       288       198       199
+      1694        44         2         1         7         4
+       288       280       197       198
+      1695        44         2         1         7         4
+       280       144       127       197
+      1696        44         2         1         7         4
+        89       148       149        88
+      1697        44         2         1         7         4
+       148       283       287       149
+      1698        44         2         1         7         4
+       283       284       288       287
+      1699        44         2         1         7         4
+       284       281       280       288
+      1700        44         2         1         7         4
+       281       145       144       280
+      1701        44         2         1         7         4
+        90       147       148        89
+      1702        44         2         1         7         4
+       147       285       283       148
+      1703        44         2         1         7         4
+       285       286       284       283
+      1704        44         2         1         7         4
+       286       282       281       284
+      1705        44         2         1         7         4
+       282       146       145       281
+      1706        44         2         1         7         4
+        91       128       147        90
+      1707        44         2         1         7         4
+       128       202       285       147
+      1708        44         2         1         7         4
+       202       203       286       285
+      1709        44         2         1         7         4
+       203       204       282       286
+      1710        44         2         1         7         4
+       204       130       146       282
+      1711        44         2         1         7         4
+        92       156       128        91
+      1712        44         2         1         7         4
+       156       155       202       128
+      1713        44         2         1         7         4
+       155       154       203       202
+      1714        44         2         1         7         4
+       154       153       204       203
+      1715        44         2         1         7         4
+       153       152       130       204
+      1716        44         2         1         7         4
+       270       121       129       300
+      1717        44         2         1         7         4
+       300       129       139       309
+      1718        44         2         1         7         4
+       309       139       140       310
+      1719        44         2         1         7         4
+       310       140       134       308
+      1720        44         2         1         7         4
+       308       134       122       271
+      1721        44         2         1         7         4
+       271       122        99       260
+      1722        44         2         1         7         4
+       222        86       121       270
+      1723        44         2         1         7         4
+       232        88       149       301
+      1724        44         2         1         7         4
+       301       149       287       386
+      1725        44         2         1         7         4
+       386       287       288       387
+      1726        44         2         1         7         4
+       387       288       280       385
+      1727        44         2         1         7         4
+       385       280       144       296
+      1728        44         2         1         7         4
+       259        90       147       299
+      1729        44         2         1         7         4
+       299       147       285       390
+      1730        44         2         1         7         4
+       390       285       286       391
+      1731        44         2         1         7         4
+       391       286       282       389
+      1732        44         2         1         7         4
+       389       282       146       298
+      1733        44         2         1         7         4
+       136       102       101       124
+      1734        44         2         1         7         4
+       137       103       102       136
+      1735        44         2         1         7         4
+       138       104       103       137
+      1736        44         2         1         7         4
+       124       101        49       120
+      1737        44         2         1         7         4
+       126        52       104       138
+      1738        44         2         1         7         4
+       157        28        52       126
+      1739        44         2         1         7         4
+       269       120        49       278
+      1740        44         2         1         7         4
+       290       136       102       261
+      1741        44         2         1         7         4
+       291       138       104       263
+      1742        44         2         1         7         4
+       278        49        99       260
+      1743        44         2         1         7         4
+       127       105        99       122
+      1744        44         2         1         7         4
+       105       101        49        99
+      1745        44         2         1         7         4
+       144       106       105       127
+      1746        44         2         1         7         4
+       106       102       101       105
+      1747        44         2         1         7         4
+       145       107       106       144
+      1748        44         2         1         7         4
+       107       103       102       106
+      1749        44         2         1         7         4
+       146       108       107       145
+      1750        44         2         1         7         4
+       108       104       103       107
+      1751        44         2         1         7         4
+       296       144       106       262
+      1752        44         2         1         7         4
+       262       106       102       261
+      1753        44         2         1         7         4
+       298       146       108       264
+      1754        44         2         1         7         4
+       264       108       104       263
+      1755        44         2         1         7         4
+       130       109       108       146
+      1756        44         2         1         7         4
+       109        52       104       108
+      1757        44         2         1         7         4
+       152       118       109       130
+      1758        44         2         1         7         4
+       118        28        52       109
+      1759        44         2         1         7         4
+       340       182       278       319
+      1760        44         2         1         7         4
+       342       261       182       340
+      1761        44         2         1         7         4
+       343       210       261       342
+      1762        44         2         1         7         4
+       341       263       210       343
+      1763        44         2         1         7         4
+       320       265       263       341
+      1764        44         2         1         7         4
+       193       339       265       320
+      1765        44         2         1         7         4
+       474       364       436       458
+      1771        44         2         1         7         4
+       489       374       364       474
+      1777        44         2         1         7         4
+       509       394       374       489
+      1783        44         2         1         7         4
+       513       401       394       509
+      1789        44         2         1         7         4
+       523       445       401       513
+      1795        44         2         1         7         4
+       464       448       445       523
+      1801        44         2         1         7         4
+        71        20       157        28
+      1802        44         2         1         7         4
+       246       245       294       339
+      1803        44         2         1         7         4
+       427       426       506       448
+      1809        44         2         1         7         4
+        34        33         6         7
+      1815        41         2         1         7         3
+       506       448       445
+      1816        41         2         1         7         3
+       294       339       265
+      1822        41         2         1         7         3
+       449       450       438
+      1823        41         2         1         7         3
+       304       305       180
+      1829        41         2         1         7         3
+       437       449       354
+      1830        41         2         1         7         3
+       277       304       172
+      1836        41         2         1         7         3
+       380       482       378
+      1837        41         2         1         7         3
+       206       325       195
+      1838        41         2         1         7         3
+        12        44        11
+      1843        41         2         1         7         3
+       370       481       368
+      1844        41         2         1         7         3
+       194       315       191
+      1845        41         2         1         7         3
+        10        47         9
+      1846        41         2         1         7         3
+        43        46        47
+      1847        41         2         1         7         3
+        35       110        34
+      1849        41         2         1         7         3
+        36       119        35
+      1850        41         2         1         7         3
+       131       123       119
+      1851        41         2         1         7         3
+       239       297       266
+      1852        41         2         1         7         3
+       418       502       446
+      1863        41         2         1         7         3
+       451       458       440
+      1864        41         2         1         7         3
+       312       319       185
+      1870        41         2         1         7         3
+       439       451       358
+      1871        41         2         1         7         3
+       289       312       176
+      1877        41         2         1         7         3
+       400       500       396
+      1878        41         2         1         7         3
+       219       331       214
+      1879        41         2         1         7         3
+        63        94        62
+      1884        41         2         1         7         3
+       392       494       382
+      1885        41         2         1         7         3
+       213       322       208
+      1886        41         2         1         7         3
+        61        97        60
+      1887        41         2         1         7         3
+        93        96        97
+      1888        41         2         1         7         3
+        85       114        84
+      1890        41         2         1         7         3
+        86       121        85
+      1891        41         2         1         7         3
+       132       129       121
+      1892        41         2         1         7         3
+       256       303       267
+      1893        41         2         1         7         3
+       430       511       447
+      1899        41         2         1         7         3
+       193       321       320
+      1900        41         2         1         7         3
+       464       549       523
+    -1
index 2c96c9b5fd4940c32ed445fb8e564f4d08d165b9..4dee4634d1d23cfcbf57868f4c73bd39883ddbb4 100644 (file)
@@ -34,7 +34,7 @@ PY_CLIENT_IDL = $(IDL_FILES)
 inc: $(top_builddir)/idl/salome $(IDL_FILES:%=$(top_builddir)/idl/salome/%)
 
 $(top_builddir)/idl/salome:
-       mkdir $@
+       mkdir -p $@
 
 $(IDL_FILES:%=$(top_builddir)/idl/salome/%):$(IDL_FILES:%=$(top_srcdir)/idl/%)
 #      $(CP) $< $@
@@ -55,7 +55,7 @@ $(PYTHON_BUILD_SITE)/%_idl.py: $(top_builddir)/idl/salome/%.idl
 
 
 # install python client (generated from idl file
-install: install-pyidl install-idl
+install: $(top_builddir)/idl/salome install-pyidl install-idl
 
 # create directory $(idldir) and copy idl files into it
 install-idl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%)
index f019faf3110c27845f360b1ebf2c8479fc22e5e4..15e6511642f67b5d8504422b921208160f70e544 100644 (file)
@@ -820,6 +820,11 @@ Gets the list of open studies
     \return the %tag of a %SObject.
 */
     short      Tag();
+/*! Gets the depth of a %SObject
+
+    \return the depth of a %SObject.
+*/
+    short      Depth();
 /*! Looks for subobjects of a given %SObject.
 
     \param atag Tag of the given %SObject
index f42ccde7ef4b37f1abcaab1db364ca19127109c2..ae28b4472be00b983be4aba9d0ede18131a9f731 100644 (file)
@@ -101,6 +101,10 @@ module SALOME
     Determines whether the server has already been loaded or not.
 */ 
     void ping();
+/*!
+    Get Active study ID
+*/
+    long GetActiveStudyId();
   } ;
 
 } ;
diff --git a/make_config.in b/make_config.in
new file mode 100755 (executable)
index 0000000..64b47c3
--- /dev/null
@@ -0,0 +1,75 @@
+# make_config.in: template for make_config script
+# make_config is used by check_cas.m4 to generate 
+# config.h file in case it cannot be found in OCC
+# and SALOME include paths
+#=================================================
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(salome_adm/unix)
+AC_CONFIG_SRCDIR(salome_adm/unix/config.h.in)
+AC_CONFIG_AUX_DIR(salome_adm/unix/config_files)
+AC_CANONICAL_HOST
+
+AC_CONFIG_HEADERS(./salome_adm/unix/config.h)
+
+AC_ISC_POSIX
+AC_C_BIGENDIAN
+
+dnl Checks for programs.
+AC_PROG_CXX
+AC_PROG_CC_C_O
+
+AC_PROG_AWK
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_YACC
+AC_PROG_MAKE_SET
+
+dnl Replace `main' with a function in -le:
+AC_CHECK_LIB(e, main)
+
+dnl Replace `main' with a function in -links:
+AC_CHECK_LIB(inks, main)
+
+dnl Checks for X window system directories.
+AC_PATH_X
+if test "x$ac_x_includes" = "x"; then
+  X_INCLUDE=""
+else
+  X_INCLUDE="-I$ac_x_includes"
+fi
+if test "x$ac_x_libraries" = "x"; then
+  X_LIBS="-lXt -lX11"
+else
+  X_LIBS="-L$ac_x_libraries -lXt -lX11"
+fi
+
+dnl Checks for header files.
+
+AC_HEADER_STDC
+AC_LANG([C])
+AC_MSG_CHECKING([ for C header files ])
+AC_CHECK_HEADERS(dlfcn.h dl.h ieeefp.h time.h sys/time.h pwd.h)
+AC_CHECK_HEADERS(sys/statvfs.h sys/vfs.h sys/param.h osfcn.h netdb.h)
+AC_CHECK_HEADERS(sys/ioctl.h net/if.h sys/systeminfo.h sys/utsname.h)
+AC_CHECK_HEADERS(sysent.h unistd.h sys/unistd.h sys/socket.h)
+AC_CHECK_HEADERS(ndir.h sys/ndir.h sys/dir.h signal.h sys/signal.h)
+AC_CHECK_HEADERS(sigfpe.h floatingpoint.h sys/machsig.h sys/siginfo.h)
+AC_CHECK_HEADERS(malloc.h strings.h sys/stat.h sys/sem.h sys/ipc.h)
+AC_CHECK_HEADERS(sys/times.h dirent.h getopt.h sys/vnode.h)
+
+
+AC_LANG([C++])
+AC_MSG_CHECKING([ for C++ header files ])
+AC_CHECK_HEADERS(istream ostream istream fstream ios iomanip iostream )
+AC_CHECK_HEADERS(stream.h strstream.h istream.h ostream.h fstream.h stdlib.h ios.h iostream.h)
+AC_CHECK_HEADERS(iomanip.h limits.h values.h float.h)
+AC_CHECK_HEADERS(siginfo.h bits/sigset.h bstring.h sys/types.h sys/select.h)
+AC_CHECK_HEADERS(X11/extensions/transovl.h X11/extensions/readdisplay.h)
+AC_CHECK_HEADERS(X11/extensions/multibuf.h)
+AC_CHECK_HEADERS(sys/filio.h sys/mman.h libc.h)
+
+dnl Checks for library functions.
+AC_TYPE_SIGNAL
+
+AC_OUTPUT()
index d170972f1ec634a5b412555d95128ceb35b719ae..2982ad06c7b72d28330a5d07054d545dae4afc79 100644 (file)
@@ -21,6 +21,8 @@ lib:
 
 include/salome/SALOMEconfig.h:
 
+include/salome/config.h:
+
 include/salome/sstream:
 
 depend:
diff --git a/salome_adm/unix/config.h.in b/salome_adm/unix/config.h.in
new file mode 100755 (executable)
index 0000000..19d2851
--- /dev/null
@@ -0,0 +1,350 @@
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* define if the compiler allows redefinition of stream input and output */
+#undef DEF_IOS_OK
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <bits/sigset.h> header file. */
+#undef HAVE_BITS_SIGSET_H
+
+/* Define to 1 if you have the <bstring.h> header file. */
+#undef HAVE_BSTRING_H
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <dl.h> header file. */
+#undef HAVE_DL_H
+
+/* Define to 1 if you have the <DPS/dpsXclient.h> header file. */
+#undef HAVE_DPS_DPSXCLIENT_H
+
+/* Define if we have a function called "finite" in -lm. */
+#undef HAVE_FINITE
+
+/* Define to 1 if you have the <floatingpoint.h> header file. */
+#undef HAVE_FLOATINGPOINT_H
+
+/* Define to 1 if you have the <float.h> header file. */
+#undef HAVE_FLOAT_H
+
+/* Define to 1 if you have the <fstream> header file. */
+#undef HAVE_FSTREAM
+
+/* Define to 1 if you have the <fstream.h> header file. */
+#undef HAVE_FSTREAM_H
+
+/* Define to 1 if you have the `gethostname' function. */
+#undef HAVE_GETHOSTNAME
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+#undef HAVE_IEEEFP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <iomanip> header file. */
+#undef HAVE_IOMANIP
+
+/* Define to 1 if you have the <iomanip.h> header file. */
+#undef HAVE_IOMANIP_H
+
+/* Define to 1 if you have the <ios> header file. */
+#undef HAVE_IOS
+
+/* Define to 1 if you have the <iostream> header file. */
+#undef HAVE_IOSTREAM
+
+/* Define to 1 if you have the <iostream.h> header file. */
+#undef HAVE_IOSTREAM_H
+
+/* Define to 1 if you have the <ios.h> header file. */
+#undef HAVE_IOS_H
+
+/* Define to 1 if you have the <istream> header file. */
+#undef HAVE_ISTREAM
+
+/* Define to 1 if you have the <istream.h> header file. */
+#undef HAVE_ISTREAM_H
+
+/* Define to 1 if you have the <libc.h> header file. */
+#undef HAVE_LIBC_H
+
+/* Define to 1 if you have the `e' library (-le). */
+#undef HAVE_LIBE
+
+/* Define to 1 if you have the `inks' library (-links). */
+#undef HAVE_LIBINKS
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define if we have a function called "mallinfo" in -lmalloc. */
+#undef HAVE_MALLINFO
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <ndir.h> header file. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <net/if.h> header file. */
+#undef HAVE_NET_IF_H
+
+/* Define to 1 if you have the <osfcn.h> header file. */
+#undef HAVE_OSFCN_H
+
+/* Define to 1 if you have the <ostream> header file. */
+#undef HAVE_OSTREAM
+
+/* Define to 1 if you have the <ostream.h> header file. */
+#undef HAVE_OSTREAM_H
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the `regcomp' function. */
+#undef HAVE_REGCOMP
+
+/* Define to 1 if you have the `re_comp' function. */
+#undef HAVE_RE_COMP
+
+/* Define to 1 if you have the <sigfpe.h> header file. */
+#undef HAVE_SIGFPE_H
+
+/* Define to 1 if you have the <siginfo.h> header file. */
+#undef HAVE_SIGINFO_H
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if you have the `statfs' function. */
+#undef HAVE_STATFS
+
+/* Define to 1 if you have the `statvfs' function. */
+#undef HAVE_STATVFS
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcspn' function. */
+#undef HAVE_STRCSPN
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the <stream.h> header file. */
+#undef HAVE_STREAM_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <strstream.h> header file. */
+#undef HAVE_STRSTREAM_H
+
+/* Define to 1 if you have the `strtol' function. */
+#undef HAVE_STRTOL
+
+/* Define if we have a function called "ieee_handler" in -lsunmath. */
+#undef HAVE_SUNMATH
+
+/* Define to 1 if you have the <sysent.h> header file. */
+#undef HAVE_SYSENT_H
+
+/* Define to 1 if you have the <sys/dir.h> header file. */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/filio.h> header file. */
+#undef HAVE_SYS_FILIO_H
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/ipc.h> header file. */
+#undef HAVE_SYS_IPC_H
+
+/* Define to 1 if you have the <sys/machsig.h> header file. */
+#undef HAVE_SYS_MACHSIG_H
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file. */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/sem.h> header file. */
+#undef HAVE_SYS_SEM_H
+
+/* Define to 1 if you have the <sys/siginfo.h> header file. */
+#undef HAVE_SYS_SIGINFO_H
+
+/* Define to 1 if you have the <sys/signal.h> header file. */
+#undef HAVE_SYS_SIGNAL_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/statvfs.h> header file. */
+#undef HAVE_SYS_STATVFS_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/systeminfo.h> header file. */
+#undef HAVE_SYS_SYSTEMINFO_H
+
+/* Define to 1 if you have the <sys/times.h> header file. */
+#undef HAVE_SYS_TIMES_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/unistd.h> header file. */
+#undef HAVE_SYS_UNISTD_H
+
+/* Define to 1 if you have the <sys/utsname.h> header file. */
+#undef HAVE_SYS_UTSNAME_H
+
+/* Define to 1 if you have the <sys/vfs.h> header file. */
+#undef HAVE_SYS_VFS_H
+
+/* Define to 1 if you have the <sys/vnode.h> header file. */
+#undef HAVE_SYS_VNODE_H
+
+/* Define to 1 if you have the <time.h> header file. */
+#undef HAVE_TIME_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <values.h> header file. */
+#undef HAVE_VALUES_H
+
+/* Define to 1 if you have the <X11/extensions/multibuf.h> header file. */
+#undef HAVE_X11_EXTENSIONS_MULTIBUF_H
+
+/* Define to 1 if you have the <X11/extensions/readdisplay.h> header file. */
+#undef HAVE_X11_EXTENSIONS_READDISPLAY_H
+
+/* Define to 1 if you have the <X11/extensions/transovl.h> header file. */
+#undef HAVE_X11_EXTENSIONS_TRANSOVL_H
+
+/* Define to 1 if you have the <Xmu/Editres.h> header file. */
+#undef HAVE_XMU_EDITRES_H
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
+/* define if the class ostream has member function form */
+#undef OSTREAM_FORM_OK
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define if compiler has function prototypes */
+#undef PROTOTYPES
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* define if the function semctl takes a value */
+#undef SEMCTL_NO_REFERENCE
+
+/* define if the function semop takes a value */
+#undef SEMOP_NO_REFERENCE
+
+/* define if semun has member __buf */
+#undef SEMUN_BUF_DEFINED
+
+/* define if the union semun is in sys/sem.h */
+#undef SEMUN_DEFINED
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+        STACK_DIRECTION > 0 => grows toward higher addresses
+        STACK_DIRECTION < 0 => grows toward lower addresses
+        STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+#undef TM_IN_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if your processor stores words with the most significant byte
+   first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Define to 1 if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+#undef size_t
index 2b20480438cd30d151609152677d6336a3c158cf..85d8f0c73e3b111c8b5c375b19daa9e226d19499 100644 (file)
@@ -39,10 +39,14 @@ AC_SUBST(CAS_LDFLAGS)
 
 AC_SUBST(CAS_LDPATH)
 
+OWN_CONFIG_H=no
+
 CAS_CPPFLAGS=""
 CAS_CXXFLAGS=""
 CAS_LDFLAGS=""
 occ_ok=no
+own_config_h=no
+
 
 dnl libraries directory location
 case $host_os in
@@ -89,16 +93,48 @@ if test "x$occ_ok" = "xyes"; then
 dnl cascade headers
 
   CPPFLAGS_old="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS -DLIN -DLINTEL -DCSFDB -DNO_CXX_EXCEPTION -DNo_exception -DHAVE_CONFIG_H -DHAVE_LIMITS_H -I$CASROOT/inc -I$CASROOT -Wno-deprecated -DHAVE_WOK_CONFIG_H"
+  CPPFLAGS="$CPPFLAGS -DLIN -DLINTEL -DCSFDB -DNO_CXX_EXCEPTION -DNo_exception -DHAVE_CONFIG_H -DHAVE_LIMITS_H -I$CASROOT/inc -I$CASROOT -I$KERNEL_ROOT_DIR/include/salome -Wno-deprecated -DHAVE_WOK_CONFIG_H"
   CXXFLAGS_old="$CXXFLAGS"
   CXXFLAGS="$CXXFLAGS -funsigned-char"
 
+
+  echo
+  echo
+  echo testing config.h
+  echo
+  echo
+
+  AC_CHECK_HEADER(config.h, own_config_h=no, [
+       echo
+       echo
+       echo "config.h file not found! Generating it..."
+       echo
+       echo
+       mv confdefs.h backup_confdefs.h
+       ${ROOT_SRCDIR}/make_config
+       rm -rf ${ROOT_BUILDDIR}/*.log
+       rm -rf ${ROOT_BUILDDIR}/*.status
+       mv backup_confdefs.h confdefs.h
+       rm -f backup_confdefs.h
+       own_config_h=yes
+       echo
+       echo
+  ])
+
+  if test "x$own_config_h" = xyes ; then
+    OWN_CONFIG_H=yes
+  fi
+
+  CPPFLAGS="$CPPFLAGS -I$ROOT_BUILDDIR/salome_adm/unix"
+  
   AC_CHECK_HEADER(Standard_Type.hxx,occ_ok=yes ,occ_ok=no)
 
   CPPFLAGS="$CPPFLAGS_old"
   CXXFLAGS="$CXXFLAGS_old"
 fi
 
+AC_SUBST(OWN_CONFIG_H)
+
 if test "x$occ_ok" = xyes ; then
 
   CAS_CPPFLAGS="-DOCC_VERSION_MAJOR=$OCC_VERSION_MAJOR -DLIN -DLINTEL -DCSFDB -DNO_CXX_EXCEPTION -DNo_exception -DHAVE_CONFIG_H -DHAVE_LIMITS_H -I$CASROOT/inc -I$CASROOT -DHAVE_WOK_CONFIG_H"
@@ -107,7 +143,7 @@ if test "x$occ_ok" = xyes ; then
   AC_MSG_CHECKING(for OpenCascade libraries)
 
   CPPFLAGS_old="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS $CAS_CPPFLAGS -Wno-deprecated"
+  CPPFLAGS="$CPPFLAGS $CAS_CPPFLAGS -I$KERNEL_ROOT_DIR/include/salome -I$ROOT_BUILDDIR/salome_adm/unix -Wno-deprecated"
   CXXFLAGS_old="$CXXFLAGS"
   CXXFLAGS="$CXXFLAGS $CAS_CXXFLAGS"
   LIBS_old="$LIBS"
index c7a9699e31edaaa1ce5d3f3fa64a4834873999e1..af5b5f8fa108fd63ef42ff376d95721df015cb5a 100644 (file)
@@ -176,7 +176,7 @@ fi
 if test "x$omniORB_ok" = "xyes" 
 then
 
-  OMNIORB_IDLCXXFLAGS="-I$OMNIORB_ROOT/idl"
+  OMNIORB_IDLCXXFLAGS="-nf -I$OMNIORB_ROOT/idl"
   OMNIORB_IDLPYFLAGS="-bpython -I$OMNIORB_ROOT/idl"
   AC_SUBST(OMNIORB_IDLCXXFLAGS)
   AC_SUBST(OMNIORB_IDLPYFLAGS)
index 6764c325aac17b6ae050ecfd1a678ec4c2626d87..cb99775f81b4482d491e14cbe65d13fe126f0069 100644 (file)
@@ -29,7 +29,7 @@ pyqt_ok=no
 if test "x$PYQTDIR" = x; then
   PYQTDIR="/usr"
 fi
-
+  
 if test "x$PYQT_SIPS" = x; then
   PYQT_SIPS="/usr/share/sip/qt"
 fi
@@ -50,7 +50,11 @@ else
   PYQTBIN=$PYQTDIR
 fi
 
-AC_CHECK_FILE("$PYQTBIN/pyuic",pyqt_ok=yes,pyqt_ok=no)
+if test "x$PYUIC" = x; then
+  PYUIC="$PYQTBIN/pyuic"
+fi
+  
+AC_CHECK_FILE("$PYUIC",pyqt_ok=yes,pyqt_ok=no)
 
 if test "x$pyqt_ok" = xyes ; then
   AC_CHECK_FILES("$PYQTLIB/qt.py",pyqt_ok=yes,pyqt_ok=no)
index aa161181a33df8bd695dca94c96a9cb278457517..b115b8aab84c79fdddd6c6c918b9f398c7b763d9 100644 (file)
@@ -53,9 +53,16 @@ no) enable_production=no ;;
 esac],
 enable_production=AC_ENABLE_PRODUCTION_DEFAULT)dnl
 
+CXXFLAGS="$CXXFLAGS -Wno-deprecated -Wparentheses -Wreturn-type -Wmissing-declarations -Wunused "
+
+CXXVERSION=`$CXX --version`
+if test "X$CXXVERSION" != "X2.95.3"; then
+  CXXFLAGS="${CXXFLAGS} -fmessage-length=0 "
+fi
+
 if test "X$enable_production" = "Xyes"; then
   CFLAGS="$CFLAGS -O"
-  CXXFLAGS="$CXXFLAGS -O -Wno-deprecated "
+  CXXFLAGS="$CXXFLAGS -O -Wuninitialized "
 fi
 ])
 
@@ -89,7 +96,7 @@ enable_debug=AC_ENABLE_DEBUG_DEFAULT)dnl
 
 if test "X$enable_debug" = "Xyes"; then
   CFLAGS="$CFLAGS -g -D_DEBUG_ "
-  CXXFLAGS="$CXXFLAGS -g -D_DEBUG_ -Wno-deprecated "
+  CXXFLAGS="$CXXFLAGS -g -D_DEBUG_ "
 fi
 ])
 
index 72033bdcd7dd38181d5b963ba5013099e98d65f1..3c50e1685b30747a2288a924057318b74fe58f01 100644 (file)
@@ -31,7 +31,7 @@ C_DEPEND_FLAG = @C_DEPEND_FLAG@
 # C++
 
 CXX = @CXX@
-CXXFLAGS = @CXXFLAGS@ 
+CXXFLAGS = @CXXFLAGS@
 CXX_DEPEND_FLAG = @CXX_DEPEND_FLAG@
 
 # BOOST Library
@@ -78,6 +78,8 @@ SIP_LIBS = @SIP_LIBS@
 # PYQT
 PYQT_SIPS = @PYQT_SIPS@
 PYQT_LIBS = @PYQT_LIBS@
+PYQT_INCLUDES = @PYQT_INCLUDES@
+PYUIC = @PYUIC@
 
 # openGL
 OGL_INCLUDES=@OGL_INCLUDES@
index b791f484d28cbc6af3e46c0752c957c7cc341270..4ad410361db070076e7201f87ebdf090f4918ac0 100644 (file)
@@ -99,11 +99,27 @@ $(BIN) $(TEST_PROGS): %: %.lo $(BIN_OBJ)
 
 # copy python scripts in $(top_builddir)/bin/salome
 #
+
+UI_FILES = $(notdir $(wildcard $(srcdir)/*.ui))
+UI_PY_FILES_PY = $(patsubst %.ui, %.py, $(UI_FILES))
+UI_PY_FILES = $(filter-out $(EXPORT_PYSCRIPTS) ,$(UI_PY_FILES_PY))
+
 DEST_PYSCRIPTS = $(EXPORT_PYSCRIPTS:%=$(top_builddir)/bin/salome/%)
-pyscripts: $(DEST_PYSCRIPTS)
+DEST_UI_PY_FILES = $(UI_PY_FILES:%=$(top_builddir)/bin/salome/%)
+pyscripts: $(DEST_PYSCRIPTS) $(UI_PY_FILES) $(DEST_UI_PY_FILES)
 $(DEST_PYSCRIPTS): $(top_builddir)/bin/salome/%: %
        cp -f $< $@
 
+# generate generic python scripts from *.ui files
+#
+$(UI_PY_FILES): %.py: %.ui
+       $(PYUIC) $< -o $@
+
+# copy ui-generated python scripts in $(top_builddir)/bin
+#
+$(DEST_UI_PY_FILES): $(top_builddir)/bin/salome/%: %
+       cp -f $< $@
+
 # copy pyqt files in $(PYTHON_SHARED_SITE)
 #
 PYTHON_SHARED_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/salome/shared_modules
@@ -166,7 +182,10 @@ install: $(LIB) $(BIN) $(TEST_PROGS) $(libdir) $(includedir) $(bindir) $(datadir
        done
 
 # Install python script in $(bindir)
-install-python: $(bindir) $(EXPORT_PYSCRIPTS:%=install-%)
+install-python: $(bindir) $(EXPORT_PYSCRIPTS:%=install-%) $(UI_PY_FILES:%=install-%)
+
+$(UI_PY_FILES:%=install-%): install-%: %
+       $(INSTALL_PROGRAM) $< $(bindir)/.
 
 $(EXPORT_PYSCRIPTS:%=install-%): install-%: %
        $(INSTALL_PROGRAM) $< $(bindir)/.
@@ -224,6 +243,13 @@ uninstall:
           fi;                                                                \
        done
 
+# Uninstall python script in $(bindir)
+       @for f in X $(UI_PY_FILES); do                                        \
+          if test $$f != X; then                                             \
+            $(LT_UNINSTALL) $(bindir)/$$f ;                  \
+          fi;                                                                \
+       done
+
 # Uninstall pyqt script in $(sharedpydir)
        @for f in X $(EXPORT_SHAREDPYSCRIPTS); do                                     \
           if test $$f != X; then                                             \
diff --git a/src/CASCatch/CASCatch_SignalsHandler.cxx b/src/CASCatch/CASCatch_SignalsHandler.cxx
new file mode 100644 (file)
index 0000000..fd8cb5a
--- /dev/null
@@ -0,0 +1,29 @@
+//  KERNEL Utils : common utils for KERNEL
+//  Copyright (C) 2003  CEA
+//
+//  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
+
+
+#include "CASCatch_SignalsHandler.h"
+#include <OSD.hxx>
+
+
+CASCatch_SignalsHandler::CASCatch_SignalsHandler(bool theFloatingSignal)
+{
+  OSD::SetSignal(theFloatingSignal);
+}
diff --git a/src/CASCatch/CASCatch_SignalsHandler.h b/src/CASCatch/CASCatch_SignalsHandler.h
new file mode 100644 (file)
index 0000000..24078c4
--- /dev/null
@@ -0,0 +1,34 @@
+//  KERNEL Utils : common utils for KERNEL
+//  Copyright (C) 2003  CEA
+//
+//  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
+
+#ifndef _CASCATCH_SIGNALSHANDLER_H_
+#define _CASCATCH_SIGNALSHANDLER_H_
+
+
+#include "Utils_SignalsHandler.h"
+#include <Standard_ErrorHandler.hxx>
+
+class CASCatch_SignalsHandler: private Utils_SignalsHandler{
+ public:
+  CASCatch_SignalsHandler(bool theFloatingSignal = true);
+};
+
+
+#endif
diff --git a/src/CASCatch/Makefile.in b/src/CASCatch/Makefile.in
new file mode 100644 (file)
index 0000000..838e3e0
--- /dev/null
@@ -0,0 +1,50 @@
+#  SALOME Utils : general SALOME's definitions and tools
+#
+#  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   : Makefile.in
+#  Author : Marc Tajchman (CEA)
+#  Module : SALOME
+#  $Header$
+
+top_srcdir=@top_srcdir@
+top_builddir=../..
+srcdir=@srcdir@
+VPATH=.:@srcdir@:@top_srcdir@/idl
+
+
+@COMMENCE@
+
+# header files  
+EXPORT_HEADERS= CASCatch_SignalsHandler.h
+
+# Libraries targets
+LIB = libCASCatch.la 
+LIB_SRC = CASCatch_SignalsHandler.cxx
+
+CPPFLAGS += $(OCC_INCLUDES)
+CXXFLAGS += $(OCC_CXXFLAGS)
+LDFLAGS+= $(CAS_KERNEL)
+
+@CONCLUDE@
+
+
index 9c68bb2a15727077b007ef14fa59eb64e625bf33..b753a67079b5a6d1b6bdb0902e982cd722c35f13 100644 (file)
@@ -449,7 +449,7 @@ void SigIntHandler(int what , siginfo_t * siginfo ,
 // Get the PID of the Container
 
 long Engines_Container_i::getPID() {
-    return(_pid);
+    return (long)getpid();
 }
 
 // Get the hostName of the Container
index 87f372867be63617a21151acb89a7a8d3f1cc5c9..db16def90f7490f683747838a05b6859468a63d0 100644 (file)
@@ -48,13 +48,14 @@ LIB_SERVER_IDL = SALOME_Registry.idl SALOME_Component.idl
 
 # Executables targets
 BIN = SALOME_Container
-BIN_SRC =
+BIN_SRC = SALOME_Container_SignalsHandler.cxx
 BIN_SERVER_IDL = SALOME_Component.idl
 
-CPPFLAGS+= $(PYTHON_INCLUDES)
+CPPFLAGS+= $(PYTHON_INCLUDES) $(OCC_INCLUDES)
+CXXFLAGS+=$(OCC_CXXFLAGS)
 
 LDFLAGS+= -lSalomeNS -lRegistry -lOpUtil -lSalomeNotification -lSALOMELocalTrace
 
-LIBS += -Xlinker -export-dynamic $(PYTHON_LIBS)
+LIBS += -Xlinker -export-dynamic $(PYTHON_LIBS) -lCASCatch
 
 @CONCLUDE@
index 4b93ef5b526dd6a2e642a14003ed9b22ba22f133..16a135dc2cd8deac57f6feb85d239e7f63e9a673 100644 (file)
@@ -93,11 +93,11 @@ public:
   long CpuUsed_impl() ;
 
 protected:
-  string _instanceName ;
-  string _interfaceName ;
-  string _serviceName ;
-  string _graphName ;
-  string _nodeName ;
+  std::string _instanceName ;
+  std::string _interfaceName ;
+  std::string _serviceName ;
+  std::string _graphName ;
+  std::string _nodeName ;
   CORBA::ORB_ptr _orb;
   PortableServer::POA_ptr _poa;
   PortableServer::ObjectId * _id;
@@ -105,7 +105,7 @@ protected:
   Engines_Component_i * _thisObj ;
   RegistryConnexion *_myConnexionToRegistry;
   NOTIFICATION_Supplier* _notifSupplier;
-  map<std::string,CORBA::Any>_fieldsDict;
+  std::map<std::string,CORBA::Any>_fieldsDict;
 
 private:
   pthread_t _ThreadId ;
index 921c3ce26c2d3cb362e0164a3a6980dfc17d7299..d8cd500a3994ab7d42aa09b50e1e1c9c962f8290 100644 (file)
 //  Module : SALOME
 //  $Header$
 
+#include <iostream>
+#include <string>
 #include <stdio.h>
 
 #include "Utils_ORB_INIT.hxx"
 #include "Utils_SINGLETON.hxx"
 #include "SALOME_NamingService.hxx"
 #include "SALOME_Container_i.hxx"
-#include <iostream>
-#include <string>
 #include "utilities.h"
-#include "Utils_CatchSignals.h"
-using namespace std;
 
 #ifdef CHECKTIME
 #include <Utils_Timer.hxx>
@@ -44,189 +42,163 @@ using namespace std;
 
 #include <Python.h>
 
-static PyMethodDef MethodPyVoidMethod[] =
-  {
-    { NULL, NULL }
-  };
+extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB);
+
+using namespace std;
+
+static PyMethodDef MethodPyVoidMethod[] = {{ NULL, NULL }};
 
 int main(int argc, char* argv[])
 {
   INFOS_COMPILATION;
-  BEGIN_OF(argv[0])
-
-    Py_Initialize() ;
+  BEGIN_OF(argv[0]);
+    
+  Py_Initialize() ;
   PySys_SetArgv( argc , argv ) ;
   Py_InitModule( "InitPyRunMethod" , MethodPyVoidMethod ) ;
-
-  try
-    {
-    
-      // Initialise the ORB.
-      ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
-      ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
-      CORBA::ORB_var &orb = init( argc , argv ) ;
-      // Obtain a reference to the root POA.
-      // obtain the root poa manager
-      //
-      long TIMESleep = 250000000;
-      int NumberOfTries = 40;
-      int a;
-      timespec ts_req;
-      ts_req.tv_nsec=TIMESleep;
-      ts_req.tv_sec=0;
-      timespec ts_rem;
-      ts_rem.tv_nsec=0;
-      ts_rem.tv_sec=0;
-      CosNaming::NamingContext_var inc;
-      PortableServer::POA_var root_poa;
-      CORBA::Object_var theObj;
-      CORBA::Object_var obj;
-      CORBA::Object_var object;
-      SALOME_NamingService &naming = *SINGLETON_<SALOME_NamingService>::Instance() ;
-      int CONTAINER=0;
-      const char * Env = getenv("USE_LOGGER");
-      int EnvL =0;
-      if ((Env!=NULL) && (strlen(Env)))
-       EnvL=1;
-
-      CosNaming::Name name;
-      name.length(1);
-      name[0].id=CORBA::string_dup("Logger");    
-      PortableServer::POAManager_var pman; 
-      for (int i = 1; i<=NumberOfTries; i++)
-       {
-         if (i!=1) 
-           a=nanosleep(&ts_req,&ts_rem);
-         try
-           { 
-             obj = orb->resolve_initial_references("RootPOA");
-             if(!CORBA::is_nil(obj))
-               root_poa = PortableServer::POA::_narrow(obj);
-             if(!CORBA::is_nil(root_poa))
-               pman = root_poa->the_POAManager();
-             if(!CORBA::is_nil(orb)) 
-               theObj = orb->resolve_initial_references("NameService");
-             if (!CORBA::is_nil(theObj))
-               inc = CosNaming::NamingContext::_narrow(theObj);
-           }
-         catch( CORBA::COMM_FAILURE& )
-           {
-             MESSAGE( "Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" );
+  
+  try{
+    // Initialise the ORB.
+    ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
+    ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
+    CORBA::ORB_var &orb = init( argc , argv ) ;
+    
+    // Obtain a reference to the root POA.
+    // obtain the root poa manager
+    //
+    long TIMESleep = 250000000;
+    int NumberOfTries = 40;
+    int a;
+    timespec ts_req;
+    ts_req.tv_nsec=TIMESleep;
+    ts_req.tv_sec=0;
+    timespec ts_rem;
+    ts_rem.tv_nsec=0;
+    ts_rem.tv_sec=0;
+    CosNaming::NamingContext_var inc;
+    PortableServer::POA_var root_poa;
+    CORBA::Object_var theObj;
+    CORBA::Object_var obj;
+    CORBA::Object_var object;
+    SALOME_NamingService &naming = *SINGLETON_<SALOME_NamingService>::Instance() ;
+    int CONTAINER=0;
+    const char * Env = getenv("USE_LOGGER");
+    int EnvL =0;
+    if(Env != NULL && strlen(Env))
+      EnvL=1;
+    
+    CosNaming::Name name;
+    name.length(1);
+    name[0].id=CORBA::string_dup("Logger");    
+    PortableServer::POAManager_var pman; 
+    for(int i = 1; i <= NumberOfTries; i++){
+      if(i != 1) 
+       a=nanosleep(&ts_req,&ts_rem);
+      try{ 
+       obj = orb->resolve_initial_references("RootPOA");
+       if(!CORBA::is_nil(obj))
+         root_poa = PortableServer::POA::_narrow(obj);
+       if(!CORBA::is_nil(root_poa))
+         pman = root_poa->the_POAManager();
+       if(!CORBA::is_nil(orb)) 
+         theObj = orb->resolve_initial_references("NameService");
+       if (!CORBA::is_nil(theObj))
+         inc = CosNaming::NamingContext::_narrow(theObj);
+      }catch(CORBA::COMM_FAILURE&){
+       MESSAGE( "Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" );
+      }
+      if(!CORBA::is_nil(inc)){
+       MESSAGE( "Container: Naming Service was found" );
+       if(EnvL == 1){
+         for(int j = 1; j <= NumberOfTries; j++){
+           if(j != 1) 
+             a=nanosleep(&ts_req, &ts_rem);
+           try{
+             object = inc->resolve(name);
+           }catch(CosNaming::NamingContext::NotFound){
+             MESSAGE( "Container: Logger Server wasn't found" );
+           }catch(...){
+             MESSAGE( "Container: Unknown exception" );
            }
-         if(!CORBA::is_nil(inc)) 
-           {
-             MESSAGE( "Container: Naming Service was found" );
-             if(EnvL==1)
-               {
-                 for(int j=1; j<=NumberOfTries; j++)
-                   {
-                     if (j!=1) 
-                       a=nanosleep(&ts_req, &ts_rem);
-                     try
-                       {
-                         object = inc->resolve(name);
-                       }
-                     catch(CosNaming::NamingContext::NotFound)
-                       {
-                         MESSAGE( "Container: Logger Server wasn't found" );
-                       }
-                     catch(...)
-                       {
-                         MESSAGE( "Container: Unknown exception" );
-                       }
-                     if (!CORBA::is_nil(object))
-                       {
-                         MESSAGE( "Container: Logger Server was found" );
-                         CONTAINER=1;
-                         break;
-                       }
-                   }
-               }
+           if(!CORBA::is_nil(object)){
+             MESSAGE( "Container: Logger Server was found" );
+             CONTAINER = 1;
+             break;
            }
-         if ((CONTAINER==1)||((EnvL==0)&&(!CORBA::is_nil(inc))))
-            break;
-       }    
-
-      // define policy objects     
-      PortableServer::ImplicitActivationPolicy_var implicitActivation =
-       root_poa->create_implicit_activation_policy(PortableServer::NO_IMPLICIT_ACTIVATION) ;
-
-      // default = NO_IMPLICIT_ACTIVATION
-      PortableServer::ThreadPolicy_var threadPolicy =
-       root_poa->create_thread_policy(PortableServer::ORB_CTRL_MODEL) ;
-      // default = ORB_CTRL_MODEL, other choice SINGLE_THREAD_MODEL
-    
-      // create policy list
-      CORBA::PolicyList policyList;
-      policyList.length(2);
-      policyList[0] = PortableServer::ImplicitActivationPolicy::_duplicate(implicitActivation) ;
-      policyList[1] = PortableServer::ThreadPolicy::_duplicate(threadPolicy) ;
-
-      // create the child POA
-      PortableServer::POAManager_var nil_mgr = PortableServer::POAManager::_nil() ;
-      PortableServer::POA_var factory_poa =
-       root_poa->create_POA("factory_poa", pman, policyList) ;
-      //with nil_mgr instead of pman, a new POA manager is created with the new POA
-    
-      // destroy policy objects
-      implicitActivation->destroy() ;
-      threadPolicy->destroy() ;
-
-      char *containerName = "";
-      if (argc >1) 
-       {
-         containerName = argv[1] ;
+         }
        }
+      }
+      if(CONTAINER == 1 || (EnvL == 0 && !CORBA::is_nil(inc)))
+       break;
+    }
     
-      Engines_Container_i * myContainer 
-       = new Engines_Container_i(orb, factory_poa, containerName , argc , argv );
-
-      //     Engines_Container_i * myContainer 
-      //      = new Engines_Container_i(string(argv[1]),string(argv[2]), orb, factory_poa);
-
-      // use naming service
-      //     myContainer->_NS.init_orb(orb);
-      //     Engines::Container_ptr pCont = Engines::Container::_narrow(myContainer->_this());
-      //     myContainer->_NS.Register(pCont, argv[2]); 
+    // define policy objects     
+    PortableServer::ImplicitActivationPolicy_var implicitActivation =
+      root_poa->create_implicit_activation_policy(PortableServer::NO_IMPLICIT_ACTIVATION) ;
+    
+    // default = NO_IMPLICIT_ACTIVATION
+    PortableServer::ThreadPolicy_var threadPolicy =
+      root_poa->create_thread_policy(PortableServer::ORB_CTRL_MODEL);
+    // default = ORB_CTRL_MODEL, other choice SINGLE_THREAD_MODEL
+    
+    // create policy list
+    CORBA::PolicyList policyList;
+    policyList.length(2);
+    policyList[0] = PortableServer::ImplicitActivationPolicy::_duplicate(implicitActivation) ;
+    policyList[1] = PortableServer::ThreadPolicy::_duplicate(threadPolicy) ;
+    
+    // create the child POA
+    PortableServer::POAManager_var nil_mgr = PortableServer::POAManager::_nil() ;
+    PortableServer::POA_var factory_poa =
+      root_poa->create_POA("factory_poa", pman, policyList) ;
+    //with nil_mgr instead of pman, a new POA manager is created with the new POA
+    
+    // destroy policy objects
+    implicitActivation->destroy() ;
+    threadPolicy->destroy() ;
+    
+    char *containerName = "";
+    if(argc > 1){
+      containerName = argv[1] ;
+    }
+    
+    Engines_Container_i * myContainer 
+      = new Engines_Container_i(orb, factory_poa, containerName , argc , argv );
+    
+    //     Engines_Container_i * myContainer 
+    //      = new Engines_Container_i(string(argv[1]),string(argv[2]), orb, factory_poa);
+    
+    // use naming service
+    //     myContainer->_NS.init_orb(orb);
+    //     Engines::Container_ptr pCont = Engines::Container::_narrow(myContainer->_this());
+    //     myContainer->_NS.Register(pCont, argv[2]); 
+    
+    pman->activate();
     
-      pman->activate();
-
 #ifdef CHECKTIME
-      Utils_Timer timer;
-      timer.Start();
-      timer.Stop();
-      MESSAGE("SALOME_Registry_Server.cxx - orb->run()");
-      timer.ShowAbsolute();
+    Utils_Timer timer;
+    timer.Start();
+    timer.Stop();
+    MESSAGE("SALOME_Registry_Server.cxx - orb->run()");
+    timer.ShowAbsolute();
 #endif
-      Utils_CatchSignals aCatch;
-      aCatch.Activate();
-
-      orb->run();
-
-      aCatch.Deactivate();
-      orb->destroy();
-    }
-  catch(CORBA::SystemException&)
-    {
-      INFOS("Caught CORBA::SystemException.")
-       }
-  catch(PortableServer::POA::WrongPolicy&)
-    {
-      INFOS("Caught CORBA::WrongPolicyException.")
-       }
-  catch(PortableServer::POA::ServantAlreadyActive&)
-    {
-      INFOS("Caught CORBA::ServantAlreadyActiveException")
-       }
-  catch(CORBA::Exception&)
-    {
-      INFOS("Caught CORBA::Exception.")
-       }
-  catch(...)
-    {
-      INFOS("Caught unknown exception.")
-       }
+    
+    HandleServerSideSignals(orb);
+    
+    orb->destroy();
+  }catch(CORBA::SystemException&){
+    INFOS("Caught CORBA::SystemException.");
+  }catch(PortableServer::POA::WrongPolicy&){
+    INFOS("Caught CORBA::WrongPolicyException.");
+  }catch(PortableServer::POA::ServantAlreadyActive&){
+    INFOS("Caught CORBA::ServantAlreadyActiveException");
+  }catch(CORBA::Exception&){
+    INFOS("Caught CORBA::Exception.");
+  }catch(std::exception& exc){
+    INFOS("Caught std::exception - "<<exc.what()); 
+  }catch(...){
+    INFOS("Caught unknown exception.");
+  }
   END_OF(argv[0]);
 }
 
diff --git a/src/Container/SALOME_Container_SignalsHandler.cxx b/src/Container/SALOME_Container_SignalsHandler.cxx
new file mode 100644 (file)
index 0000000..268de2f
--- /dev/null
@@ -0,0 +1,36 @@
+//  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 
+
+
+#include <stdexcept>
+#include <CORBA.h>
+
+#include "CASCatch_SignalsHandler.h" // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
+
+
+extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB)
+{
+  CASCatch_SignalsHandler aSignalsHandler;
+  try {
+    theORB->run();
+  }catch(Standard_Failure){
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+    throw std::runtime_error(aFail->GetMessageString());
+  }
+}
index 4e83c867ba7f08ad26ece40fd92f23f4f0bd63b6..e960a3b830b902cb7b437d5fa31a694c6cf9cdf0 100644 (file)
 #ifndef _SALOME_CONTAINER_I_HXX_
 #define _SALOME_CONTAINER_I_HXX_
 
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SALOME_Component)
+
 #include <iostream>
 #include <signal.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/types.h>
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SALOME_Component)
 #include <omnithread.h>
 #include <map>
 #include <string>
 
 class SALOME_NamingService;
 
-class Engines_Container_i: public POA_Engines::Container,
-                public PortableServer::RefCountServantBase
+class Engines_Container_i: public virtual POA_Engines::Container,
+                          public virtual PortableServer::RefCountServantBase
 {
 public:
   Engines_Container_i();
index 55217510a8a1d278b7d40409b665d7fef2f212bf..47f8fb92dee049c515b2b9b0b68baf561bf84023 100644 (file)
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
-#define WRITE_CATA_DATA_TYPE
 #include "SALOME_DataTypeCatalog_Handler.hxx"
 
+#include "utilities.h"
+
+using namespace std;
+
+// contains all the data types defined in the catalog
+ListOfParserDataType _datatypelist; 
+
 //----------------------------------------------------------------------
 // Function : SALOME_DataTypeCatalog_Handler
 // Purpose  : Constructor
index 7e76f636ce2031a58e6bae6f25ac7bfd7af7ffe2..78d08de307cfade863cd541fdcb14247b92deee6 100644 (file)
@@ -29,7 +29,6 @@
 #ifndef SALOME_DATA_CATALOG_HANDLER_H
 #define SALOME_DATA_CATALOG_HANDLER_H
 
-#include "utilities.h"
 #include "SALOME_DataTypeCatalog_Parser.hxx"
 #include <qxml.h>
 #include <string>
@@ -104,7 +103,7 @@ public:
 private:
   QString errorProt ;
 
-  string content;
+  std::string content;
 
   const char* test_data_type_name ;
   const char* test_data_type_interf_read ;
index ed65a0c59348a14457922278ffba6ab51652a21b..fc867bed3ac0d89cb6b02e4771d17fd25d3c1a2a 100644 (file)
 #include <vector>
 
 // Type Definitions
-typedef  vector<string> ListOfParserDataTypeName;
+typedef  std::vector<std::string> ListOfParserDataTypeName;
 
 struct ParserDataType{
-  string                               Parserdata_name ;       
-  string                        Parserdata_interface_read;
-  string                        Parserdata_interface_write;
+  std::string                          Parserdata_name ;       
+  std::string                   Parserdata_interface_read;
+  std::string                   Parserdata_interface_write;
   ListOfParserDataTypeName     Parserdata_parents ;
 };
 
-typedef vector<ParserDataType> ListOfParserDataType;
+typedef std::vector<ParserDataType> ListOfParserDataType;
 
-#ifdef WRITE_CATA_DATA_TYPE
 // contains all the data types defined in the catalog
-ListOfParserDataType _datatypelist; 
-#else
 extern ListOfParserDataType _datatypelist;
-#endif
+
 
 #endif // SALOME_DATA_CATALOG_PARSER_H
index dfebd7b02f751dbe9c8e6181150566b3d28a68b9..e12fc070f61af8241fedbdeeb93423fdb35b508f 100644 (file)
@@ -33,6 +33,7 @@
 #include <qsemaphore.h>
 #include <qapplication.h>
 #include <qthread.h>
+#include <pthread.h>
 
 #ifdef _DEBUG_
 static int MYDEBUG = 0;
@@ -40,22 +41,31 @@ static int MYDEBUG = 0;
 static int MYDEBUG = 0;
 #endif
 
+
+static pthread_t myThread;
+
+void SALOME_Event::GetSessionThread(){
+  myThread = pthread_self();
+}
+
+bool SALOME_Event::IsSessionThread(){
+  bool aResult = myThread == pthread_self();
+  if(MYDEBUG) INFOS("IsSessionThread() - "<<aResult);
+  return aResult;
+}
+
+
 //===========================================================
 /*!
  *  SALOME_Event::SALOME_Event
  *  Constructor
  */
 //===========================================================
-SALOME_Event::SALOME_Event(): 
-  myWait( true ),
-  myAutoRelease( false )
-{
-  if(MYDEBUG) MESSAGE( "SALOME_Event::SALOME_Event(): this = "<<this<<", myWait = "<<myWait );
-  if ( myWait ) {
-    // Prepare the semaphore 
-    mySemaphore = new QSemaphore( 2 );
-    mySemaphore->operator+=( 2 );
-  }
+SALOME_Event::SALOME_Event(){
+  if(MYDEBUG) MESSAGE( "SALOME_Event::SALOME_Event(): this = "<<this );
+  // Prepare the semaphore 
+  mySemaphore = new QSemaphore( 2 );
+  *mySemaphore += 2;
 }
 
 //===========================================================
@@ -64,14 +74,11 @@ SALOME_Event::SALOME_Event():
  *  Destructor
  */
 //===========================================================
-SALOME_Event::~SALOME_Event()
-{
-  if(MYDEBUG) MESSAGE( "SALOME_Event::~SALOME_Event(): this = "<<this<<", myWait = "<<myWait );
-  if ( myWait ) {
-    if ( mySemaphore->available() < mySemaphore->total() )
-      mySemaphore->operator-=( mySemaphore->total() - mySemaphore->available() );
-    delete mySemaphore;
-  }
+SALOME_Event::~SALOME_Event(){
+  if(MYDEBUG) MESSAGE( "SALOME_Event::~SALOME_Event(): this = "<<this );
+  if ( mySemaphore->available() < mySemaphore->total() )
+    *mySemaphore -= mySemaphore->total() - mySemaphore->available();
+  delete mySemaphore;
 }
 
 //===========================================================
@@ -82,17 +89,10 @@ SALOME_Event::~SALOME_Event()
 //===========================================================
 void SALOME_Event::process()
 {
-  if(MYDEBUG) MESSAGE( "SALOME_Event::process(): this = "<<this<<", myWait = "<<myWait );
   QThread::postEvent( qApp, new QCustomEvent( SALOME_EVENT, (void*)this ) );
-  if ( myWait ) {
-    if(MYDEBUG) MESSAGE( "SALOME_Event::process(): available = " << mySemaphore->available() );
-    if ( !mySemaphore->available() )
-      mySemaphore->operator+=( 1 );
-
-    if(MYDEBUG) MESSAGE( "SALOME_Event::process() COMPLETED: this = "<<this<<", myWait = "<<myWait );
-  }
-  if ( myAutoRelease )
-    release();
+  if(MYDEBUG) MESSAGE( "SALOME_Event::process(): this = "<<this<<", *mySemaphore += 1 " );
+  *mySemaphore += 1;
+  if(MYDEBUG) MESSAGE( "SALOME_Event::process(): this = "<<this<<" - COMPLETED" );
 }
 
 //===========================================================
@@ -103,38 +103,7 @@ void SALOME_Event::process()
 //===========================================================
 void SALOME_Event::processed()
 {
-  if(MYDEBUG) MESSAGE( "SALOME_Event::processed(): this = "<<this<<", myWait = "<<myWait );
-  if ( myWait ) {
-    if(MYDEBUG) MESSAGE( "SALOME_Event::processed(): available = " << mySemaphore->available() );
-    if ( !mySemaphore->available() ) {
-      // process() takes control over mySemaphore after the next line is executed
-      mySemaphore->operator-=( 1 );
-
-      if(MYDEBUG) MESSAGE( "SALOME_Event::processed(): semaphore DECREMENTED" );
-
-      // Current thread will block here until process() completes
-      mySemaphore->operator+=( mySemaphore->total() );
-    }
-  }
-  if(MYDEBUG) MESSAGE( "SALOME_Event::processed() COMPLETED: this = "<<this<<", myWait = "<<myWait );
+  if(MYDEBUG) MESSAGE( "SALOME_Event::processed(): this = "<<this );
+  // process() takes control over mySemaphore after the next line is executed
+  *mySemaphore -= 1;
 }
-
-//===========================================================
-/*!
- *  SALOME_Event::release
- *  Wakes up the desktop
- */
-//===========================================================
-void SALOME_Event::release()
-{
-  if(MYDEBUG) MESSAGE( "SALOME_Event::release(): this = "<<this<<", myWait = "<<myWait );
-  if ( myWait ) {
-    if(MYDEBUG) MESSAGE( "SALOME_Event::release(): available = " << mySemaphore->available() );
-    mySemaphore->operator-=( mySemaphore->total() - mySemaphore->available() );
-  }
-  if(MYDEBUG) MESSAGE( "SALOME_Event::release() COMPLETED: this = "<<this<<", myWait = "<<myWait );
-}
-
-
-
-
index 2467912d904ee9345081cc3f60262fe0c8eca2dd..9414e5b3a0e598a1a73b8287d4a1ef930c75f47a 100644 (file)
@@ -51,39 +51,25 @@ class QSemaphore;
  *  no need to protect such fields with a mutex, for only one thread working with
  *  a SALOME_Event object is active at any moment.
  *
- *  It is possible to make the thread that creates SALOME_Event
- *  wait until the event is processed by the component GUI, SALOME_Event
- *  should be constructed with <wait> == TRUE in such a case.
- *
- *  SALOME_Event objects should be created on the heap. QAD_Desktop deletes
- *  these objects as soon as they have been processed.
- *
  *  Usage:
- *  - create SALOME_Event object on the heap with proper <type> and <wait> parameters
+ *  - create SALOME_Event. 
  *    Components can derive their own event class from SALOME_Event
  *    in order to pass custom data to the event handler.
- *  - call process() method to post the event. Between process() and release()
+ *  - call process() method to post the event. After process() execution
  *    it is possible to examine fields of your custom event object.
- *  - call release() method to wake up the desktop (you can also set <autoRelease>
+ *  - perform delete operator on the event to wake up the desktop (you can also set <autoRelease>
  *    parameter to TRUE to automatically wake up desktop after process()
  * 
  *  processed() method is used by the desktop to signal that event processing 
  *  has been completed.
  *  
  *  Caveats: 
- *  1. Never create SALOME_Event with <wait> == TRUE in code that is 
- *     supposed to be called within main GUI thread, for this will result
- *     in GUI process deadlock.
- *  2. Always call release() method after process() if you use <wait> parameters as TRUE,
- *     otherwise processed() method will never return and main GUI thread will be blocked!
- *  3. Never use pointers to the event after it has been released (either by calling release()
- *     or automatically by process() if <autoRelease> == TRUE) to avoid application crashes!
+ *    There is no.
  */
 //===========================================================
 
 
-class SALOME_Event
-{
+class SALOME_Event{
 public:
   SALOME_Event();
   virtual ~SALOME_Event();
@@ -91,14 +77,17 @@ public:
   // To do real work
   virtual void Execute() = 0;
 
+  static bool IsSessionThread();
   void process();
+
+protected:
   void processed();
+  friend class QAD_Desktop;
 
-  void release();
+  static void GetSessionThread();
+  friend int main(int, char **);
 
 private:
-  bool        myWait;
-  bool        myAutoRelease;
   QSemaphore* mySemaphore;
 };
 
@@ -242,17 +231,27 @@ private:
 
 // Template function for processing events with result returing
 template<class TEvent> inline typename TEvent::TResult ProcessEvent(TEvent* theEvent){
-  theEvent->process();
-  typename TEvent::TResult aResult = theEvent->myResult;
-  theEvent->release();
+  typename TEvent::TResult aResult;
+  if(SALOME_Event::IsSessionThread()){
+    theEvent->Execute();
+    aResult = theEvent->myResult;
+  }else{
+    theEvent->process();
+    aResult = theEvent->myResult;
+  }
+  delete theEvent;
   return aResult;
 }
 
 
 // Template function for processing events without result
 inline void ProcessVoidEvent(SALOME_Event* theEvent){
-  theEvent->process();
-  theEvent->release();
+  if(SALOME_Event::IsSessionThread()){
+    theEvent->Execute();
+  }else{
+    theEvent->process();
+  }
+  delete theEvent;
 }
 
 
index f0fdad6e0b22160b0431fa2671e536d27a9c2f1f..e5281e72b77a5fb4d4a210b9bdad789df3e660b8 100644 (file)
 #include "SALOME_GenericObj_i.hh"
 #include "utilities.h"
 
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
 using namespace SALOME;
+using namespace std;
 
 GenericObj_i::GenericObj_i(PortableServer::POA_ptr thePOA): myRefCounter(1){
-  MESSAGE("GenericObj_i::GenericObj_i() - this = "<<this<<
-       "; CORBA::is_nil(thePOA) = "<<CORBA::is_nil(thePOA));
+  if(MYDEBUG) 
+    MESSAGE("GenericObj_i::GenericObj_i() - this = "<<this<<
+           "; CORBA::is_nil(thePOA) = "<<CORBA::is_nil(thePOA));
   if(CORBA::is_nil(thePOA))
     myPOA = PortableServer::RefCountServantBase::_default_POA();
   else
@@ -40,19 +48,20 @@ GenericObj_i::GenericObj_i(PortableServer::POA_ptr thePOA): myRefCounter(1){
 
 
 PortableServer::POA_ptr GenericObj_i::_default_POA(){
-  //return PortableServer::RefCountServantBase::_default_POA();
   return PortableServer::POA::_duplicate(myPOA);
 }
 
 
 void GenericObj_i::Register(){
-  MESSAGE("GenericObj_i::Register "<<this<<"; myRefCounter = "<<myRefCounter)
+  if(MYDEBUG)
+    MESSAGE("GenericObj_i::Register "<<this<<"; myRefCounter = "<<myRefCounter)
   ++myRefCounter;
 }
 
 
 void GenericObj_i::Destroy(){
-  MESSAGE("GenericObj_i::Destroy "<<this<<"; myRefCounter = "<<myRefCounter)
+  if(MYDEBUG)
+    MESSAGE("GenericObj_i::Destroy "<<this<<"; myRefCounter = "<<myRefCounter)
   if(--myRefCounter <= 0){
     PortableServer::ObjectId_var anObjectId = myPOA->servant_to_id(this);
     myPOA->deactivate_object(anObjectId.in());
index 2a6fe9b760a19a62fc65ef8ce57dd7d8cd2fb9ef..31c19c95353c6c22fc827acc0c441d3e318cd870 100644 (file)
@@ -99,4 +99,6 @@ int HDFConvert::FromAscii(const string& file, const HDFcontainerObject & hdf_con
     return -1;
   };
     
+
+  return length;    
 };
index c19e679654ca0c6656cfe6733629ee644778d400..42628a1c8bf43d07772bcf865cc0a4a10db61bfa 100644 (file)
@@ -43,7 +43,6 @@ extern "C"
 #include "HDFfile.hxx"
 #include <string>
 
-using namespace std;
 
 class HDFConvert 
 {
@@ -54,7 +53,7 @@ private:
 
 public:
 
-static int FromAscii(const string& file, const  HDFcontainerObject& hdf_container, const string& nomdataset);
+static int FromAscii(const std::string& file, const  HDFcontainerObject& hdf_container, const std::string& nomdataset);
 
 };
 
index 5395341a82345dc2d24013dc38625bdc377035a6..c62f6a18f02fc830c0f7b8900de1fce50b42b13f 100644 (file)
 /* Exception */
 #include <iostream>
 
-using namespace std;
 
 class HDFexception
 {
 public :
   HDFexception(const char *message) { 
-    cerr << message << endl;
+    std::cerr << message << std::endl;
   }
 };
index ed5d276cdb82587c8d135e3df3431e25c2d430c8..c5cf7037771cb1d36949cf293df2d0a54189d9df 100644 (file)
@@ -192,7 +192,7 @@ void InquireServersGUI::customEvent( QCustomEvent* pe )
 
 int InquireServersGUI::getExitStatus()
 {
-  myThread->getExitStatus();
+  return myThread->getExitStatus();
 }
 
 InquireServersQThread::InquireServersQThread( InquireServersGUI* r )
index 90fbfd06fd441aa2e4a81594c52c4cc2e3754c61..e0019a1f5c57023376268c5bc35e99e692743b30 100644 (file)
@@ -11,6 +11,9 @@
 #if !defined(AFX_LOGGER_H__96F2A3AB_F6F8_11D6_BFA6_000476A0958C__INCLUDED_)
 #define AFX_LOGGER_H__96F2A3AB_F6F8_11D6_BFA6_000476A0958C__INCLUDED_
 
+#include <strstream.h>
+#include "Logger.hh"
+
 //these declarations for files don't using OCC includes (for example HDF)
 # ifdef WNT
 
 
 # endif  /* WNT */
 
-using namespace std;
-
-#include <strstream.h>
-#include "Logger.hh"
-
-class SALOME_Trace : public ostrstream  
+class SALOME_Trace : public std::ostrstream  
 {
 public:
        virtual ~SALOME_Trace();
index b227bc1106a4aac4491f7b75f8e538cb5eb63607..adc7477d1917b5044c99ad7b9d408f461e1ebe86 100644 (file)
@@ -45,7 +45,7 @@ void ReadMed(const char* theFileName){
   TWrapper aMedW(aFileName);
 
   int aNbMeshes = aMed.GetNbMeshes();
-  cout<<"GetNbMeshes() = "<<aNbMeshes<<endl;
+  MESSAGE("GetNbMeshes() = "<<aNbMeshes);
 
   string aName;
   for(int iMesh = 0; iMesh < aNbMeshes; iMesh++){
@@ -54,7 +54,7 @@ void ReadMed(const char* theFileName){
     aMed.GetMeshInfo(iMesh+1,*aMeshInfo);
     int aDim = aMeshInfo->myDim;
     aName = aMeshInfo->GetName();
-    cout<<"GetMeshInfo - aName = '"<<aName<<"'; aDim = "<<aDim<<endl;
+    MESSAGE("GetMeshInfo - aName = '"<<aName<<"'; aDim = "<<aDim);
     *aNewMeshInfo = *aMeshInfo;
     aName[0] += 1;
     aNewMeshInfo->SetName(aName);
@@ -63,18 +63,18 @@ void ReadMed(const char* theFileName){
     TEntityInfo aEntityInfo = aMed.GetEntityInfo(*aMeshInfo);
 
     med_int aNbFields = aMed.GetNbFields(); 
-    cout<<"GetNbFields() = "<<aNbFields<<endl;
+    MESSAGE("GetNbFields() = "<<aNbFields);
     for(int iField = 0; iField < aNbFields; iField++){
       med_int aNbComp = aMed.GetNbComp(iField+1);
       PFieldInfo aFieldInfo(new TFieldInfo(aMeshInfo,aNbComp));
       aMed.GetFieldInfo(iField+1,*aFieldInfo);
-      cout<<"\taName = '"<<aFieldInfo->GetName()<<"'; aNbComp = "<<aNbComp<<"; ";
+      MESSAGE("\taName = '"<<aFieldInfo->GetName()<<"'; aNbComp = "<<aNbComp<<"; ");
       aMedW.SetFieldInfo(*aFieldInfo);
       med_entite_maillage anEntity;
       TGeom aTGeom;
       med_int aNbTimeStamps = aMed.GetNbTimeStamps(*aFieldInfo,aEntityInfo,
                                                   anEntity,aTGeom);
-      cout<<"GetNbTimeStamps = "<<aNbTimeStamps<<endl;
+      MESSAGE("GetNbTimeStamps = "<<aNbTimeStamps);
       PTimeStampInfo aTimeStampInfo(new TTimeStampInfo(aFieldInfo,anEntity,aTGeom));
       for(int iTimeStamp = 0; iTimeStamp < aNbTimeStamps; iTimeStamp++){
        aMed.GetTimeStampInfo(iTimeStamp+1, *aTimeStampInfo);
@@ -88,34 +88,34 @@ void ReadMed(const char* theFileName){
        for(; aMeshValueIter != aMeshValue.end(); aMeshValueIter++){
          med_geometrie_element aGeom = aMeshValueIter->first;
          TValue aValue = aMeshValueIter->second;
-         cout<<"\t\taGeom = "<<aGeom<<"; aValue = "<<aValue.size()<<": ";
+         MESSAGE("\t\taGeom = "<<aGeom<<"; aValue = "<<aValue.size()<<": ");
          for(int i = 0, iEnd = aValue.size()/aNbComp; i < iEnd; i++){
            for(int j = 0, ij = i*aNbComp; j < aNbComp; j++, ij++){
-             //cout<<aValue[ij]<<",";
+             //MESSAGE(aValue[ij]<<",");
            }
-           //cout<<" ";
+           //MESSAGE(" ");
          }
-         cout<<"\n";
+         MESSAGE("\n");
        }
       }
     }
 
     int aNbFam = aMed.GetNbFamilies(*aMeshInfo);
-    cout<<"GetNbFamilies() = "<<aNbFam<<endl;
+    MESSAGE("GetNbFamilies() = "<<aNbFam);
     for(int iFam = 0; iFam < aNbFam; iFam++){
       int aNbAttr = aMed.GetNbFamAttr(iFam+1,*aMeshInfo);
       int aNbGroup = aMed.GetNbFamGroup(iFam+1,*aMeshInfo);
       PFamilyInfo aFamilyInfo(new TFamilyInfo(aMeshInfo,aNbGroup,aNbAttr));
       aMed.GetFamilyInfo(iFam+1,*aFamilyInfo);
       aName = aFamilyInfo->GetName();
-      cout<<"\taName = '"<<aName<<"'; aNbAttr = "<<aNbAttr<<"; aNbGroup = "<<aNbGroup<<endl;
+      MESSAGE("\taName = '"<<aName<<"'; aNbAttr = "<<aNbAttr<<"; aNbGroup = "<<aNbGroup);
       aName[0] += 1;
       aFamilyInfo->SetName(aName);
       aFamilyInfo->myMeshInfo = aNewMeshInfo;
       aName = aFamilyInfo->GetName();
       for(int iGroup = 0; iGroup < aNbGroup; iGroup++){
        aName = aFamilyInfo->GetGroupName(iGroup);
-       cout<<"\t\taGroupName = '"<<aName<<"'\n";
+       MESSAGE("\t\taGroupName = '"<<aName<<"'");
        aName[0] += 1;
        aFamilyInfo->SetGroupName(iGroup,aName);
       }
@@ -123,25 +123,25 @@ void ReadMed(const char* theFileName){
       aMedW.SetFamilyInfo(*aFamilyInfo);
     }
 
-    cout<<"GetEntityInfo - aNbEntities = "<<aEntityInfo.size()<<endl;
+    MESSAGE("GetEntityInfo - aNbEntities = "<<aEntityInfo.size());
     TEntityInfo::iterator anEntityInfoIter = aEntityInfo.begin();
     for(; anEntityInfoIter != aEntityInfo.end(); anEntityInfoIter++){
       const med_entite_maillage& anEntity = anEntityInfoIter->first;
-      cout<<"\tanEntity = "<<anEntity<<endl;
+      MESSAGE("\tanEntity = "<<anEntity);
       if(anEntity == MED_NOEUD){
        int aNbNodes = aMed.GetNbNodes(*aMeshInfo);
        PNodeInfo aNodeInfo(new TNodeInfo(aMeshInfo,aNbNodes));
        aMed.GetNodeInfo(*aNodeInfo);
-       cout<<"\tGetNodeInfo - aNbNodes = "<<aNbNodes<<": ";
+       MESSAGE("\tGetNodeInfo - aNbNodes = "<<aNbNodes<<": ");
        TNodeCoord& aCoord = aNodeInfo->myCoord;
        for(int iNode = 0; iNode < aNbNodes; iNode++){
          for(int iDim = 0, anId = iNode*aDim; iDim < aDim; iDim++, anId++){
-           //cout<<aCoord[anId]<<",";
+           //MESSAGE(aCoord[anId]<<",");
            aCoord[anId] += 1.0;
          }
-         //cout<<" ";
+         //MESSAGE(" ");
        }
-       cout<<endl;
+       MESSAGE(endl);
        aNodeInfo->myMeshInfo = aNewMeshInfo;
        aMedW.SetNodeInfo(*aNodeInfo);
        continue;
@@ -151,24 +151,24 @@ void ReadMed(const char* theFileName){
       for(; anTGeomIter != aTGeom.end(); anTGeomIter++){
        const med_geometrie_element& aGeom = anTGeomIter->first;
        med_int& aNbElem = anTGeomIter->second;
-       cout<<"\t\taGeom = "<<aGeom<<"; aNbElem = "<<aNbElem<<": ";
+       MESSAGE("\t\taGeom = "<<aGeom<<"; aNbElem = "<<aNbElem<<": ");
        PCellInfo aCellInfo(new TCellInfo(aMeshInfo,aNbElem,anEntity,aGeom));
        aMed.GetCellInfo(*aCellInfo);
        for(int iElem = 0; iElem < aCellInfo->myNbElem; iElem++){
          int i = iElem*aCellInfo->myConnDim;
          for(int iConn = 0; iConn < aCellInfo->myConnDim; iConn++, i++){
-           //cout<<aCellInfo->myConn[i]<<",";
+           //MESSAGE(aCellInfo->myConn[i]<<",");
          }
-         //cout<<" ";
+         //MESSAGE(" ");
        }
-       cout<<endl;
+       MESSAGE(endl);
        aCellInfo->myMeshInfo = aNewMeshInfo;
        aMedW.SetCellInfo(*aCellInfo);
       }
     }
     
   }
-  cout<<"OK"<<endl;
+  MESSAGE("OK");
 }
 
 
@@ -178,9 +178,9 @@ int main(int argc, char** argv){
       ReadMed(argv[1]);
     return 0;
   }catch(std::exception& exc){
-    cout<<"Follow exception was accured :\n"<<exc.what()<<endl;
+    MESSAGE("Follow exception was accured :\n"<<exc.what());
   }catch(...){
-    cout<<"Unknown exception was accured in VISU_Convertor_impl"<<endl;
+    MESSAGE("Unknown exception was accured in VISU_Convertor_impl");
   } 
   return 1;
 }
diff --git a/src/MSG2QM/LICENSE.QPL b/src/MSG2QM/LICENSE.QPL
new file mode 100644 (file)
index 0000000..ecdad6e
--- /dev/null
@@ -0,0 +1,103 @@
+                            THE Q PUBLIC LICENSE
+                                 version 1.0
+
+                  Copyright (C) 1999-2000 Trolltech AS, Norway.
+                      Everyone is permitted to copy and
+                      distribute this license document.
+
+The intent of this license is to establish freedom to share and change the
+software regulated by this license under the open source model.
+
+This license applies to any software containing a notice placed by the
+copyright holder saying that it may be distributed under the terms of
+the Q Public License version 1.0.  Such software is herein referred to as
+the Software.  This license covers modification and distribution of the
+Software, use of third-party application programs based on the Software,
+and development of free software which uses the Software.
+
+                                Granted Rights
+
+1. You are granted the non-exclusive rights set forth in this license
+   provided you agree to and comply with any and all conditions in this
+   license.  Whole or partial distribution of the Software, or software
+   items that link with the Software, in any form signifies acceptance of
+   this license.
+
+2. You may copy and distribute the Software in unmodified form provided
+   that the entire package, including - but not restricted to - copyright,
+   trademark notices and disclaimers, as released by the initial developer
+   of the Software, is distributed.
+
+3. You may make modifications to the Software and distribute your
+   modifications, in a form that is separate from the Software, such as
+   patches. The following restrictions apply to modifications:
+
+     a. Modifications must not alter or remove any copyright notices in
+        the Software.
+
+     b. When modifications to the Software are released under this
+        license, a non-exclusive royalty-free right is granted to the
+        initial developer of the Software to distribute your modification
+        in future versions of the Software provided such versions remain
+        available under these terms in addition to any other license(s) of
+        the initial developer.
+
+4. You may distribute machine-executable forms of the Software or
+   machine-executable forms of modified versions of the Software, provided
+   that you meet these restrictions:
+
+     a. You must include this license document in the distribution.
+
+     b. You must ensure that all recipients of the machine-executable forms
+        are also able to receive the complete machine-readable source code
+        to the distributed Software, including all modifications, without
+        any charge beyond the costs of data transfer, and place prominent
+        notices in the distribution explaining this.
+
+     c. You must ensure that all modifications included in the
+        machine-executable forms are available under the terms of this
+        license.
+
+5. You may use the original or modified versions of the Software to
+   compile, link and run application programs legally developed by you
+   or by others.
+
+6. You may develop application programs, reusable components and other
+   software items that link with the original or modified versions of the
+   Software.  These items, when distributed, are subject to the following
+   requirements:
+
+     a. You must ensure that all recipients of machine-executable forms of
+        these items are also able to receive and use the complete
+        machine-readable source code to the items without any charge
+        beyond the costs of data transfer.
+
+     b. You must explicitly license all recipients of your items to use
+        and re-distribute original and modified versions of the items in
+        both machine-executable and source code forms. The recipients must
+        be able to do so without any charges whatsoever, and they must be
+        able to re-distribute to anyone they choose.
+
+
+     c. If the items are not available to the general public, and the
+        initial developer of the Software requests a copy of the items,
+        then you must supply one.
+
+                           Limitations of Liability
+
+In no event shall the initial developers or copyright holders be liable
+for any damages whatsoever, including - but not restricted to - lost
+revenue or profits or other direct, indirect, special, incidental or
+consequential damages, even if they have been advised of the possibility
+of such damages, except to the extent invariable law, if any, provides
+otherwise.
+
+                                 No Warranty
+
+The Software and this license document are provided AS IS with NO WARRANTY
+OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE.
+                                 Choice of Law
+
+This license is governed by the Laws of Norway. Disputes shall be settled
+by Oslo City Court.
diff --git a/src/MSG2QM/README b/src/MSG2QM/README
new file mode 100644 (file)
index 0000000..e53a155
--- /dev/null
@@ -0,0 +1,3 @@
+This package includes the msg2qm tool for resources compiling.
+It is a part of Qt 3.0.5 toolkit.
+The files in this package are distributed under conditions of the Q Public License.
\ No newline at end of file
index 097947db2d6068d7859d54bf8353286d123329c4..a7838c30d422cb2c0a748a5b0bdb1616061c840a 100644 (file)
@@ -1,30 +1,9 @@
-//  SALOME MSG2QM : duplication of Qt tool
-//
-//  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   : msg2qm.cxx
-//  Module : SALOME
+/////////////////////////////////////////////////////////////////////////////
+// Module      : MSG2QM
+// File        : msg2qm.cxx
+// Description : This is a duplication of Qt tool for resources compiling 
+/////////////////////////////////////////////////////////////////////////////
 
-using namespace std;
 /****************************************************************************
 ** $Id$
 **
@@ -35,6 +14,8 @@ using namespace std;
 ** Copyright (C) 1998 by Trolltech AS.  All rights reserved.
 **
 *****************************************************************************/
+
+using namespace std;
 #include <qfile.h>
 #include <qtextstream.h>
 #include <qtextcodec.h>
@@ -61,7 +42,8 @@ QString extractContents( const QString& line )
        pos++;
     pos++;
     while ( pos < int(line.length()) && line[pos] != '\"' ) {
-       if ( line[pos] == '\\') {
+       // 0xa5: the yen sign is the Japanese backslash
+       if ( line[pos] == '\\' || line[pos] == QChar(0xa5) ) {
            pos++;
            switch (char(line[pos]) ) {
            case 'n':
index 5c3530e4bfbacd6ed1ab5cab3941a3955a83124b..d803f264f1318f3caa6b877c48b33672887b5de1 100644 (file)
@@ -32,11 +32,11 @@ VPATH=.:@srcdir@
 
 @COMMENCE@
 
-SUBDIRS = MSG2QM SALOMELocalTrace Logger SALOMELogger Utils PatchQt \
+SUBDIRS = MSG2QM SALOMELocalTrace Logger Utils SALOMELogger CASCatch PatchQt \
           GenericObj MEDWrapper NamingService Registry \
          ModuleCatalog DataTypeCatalog RessourcesCatalog \
           Notification  NOTIFICATION_SWIG \
-         Container TestContainer LifeCycleCORBA HDFPersist \
+         Container TestContainer LifeCycleCORBA HDFPersist Prs \
          VTKFilter OBJECT \
           TOOLSDS SALOMEDS Event \
           SALOMEGUI Plot2d VTKViewer OCCViewer \
index 4cf8e579a929064a1bbd95d957798df105361f6c..ad1c341694a121db358bf5b88dec0dd8580e8f2e 100644 (file)
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include "SALOME_ModuleCatalog_Acomponent_impl.hxx"
 
 #include "Utils_ExceptHandlers.hxx"
 UNEXPECT_CATCH(MC_NotFound, SALOME_ModuleCatalog::NotFound);
 
+#include "utilities.h"
+
+using namespace std;
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
 //----------------------------------------------------------------------
 // Function : SALOME_ModuleCatalog_AcomponentImpl
 // Purpose  : Constructor
@@ -43,9 +52,9 @@ UNEXPECT_CATCH(MC_NotFound, SALOME_ModuleCatalog::NotFound);
 SALOME_ModuleCatalog_AcomponentImpl::SALOME_ModuleCatalog_AcomponentImpl
 (SALOME_ModuleCatalog::Component &C) : _Component(C)
 {
-  BEGIN_OF("SALOME_ModuleCatalog_AcomponentImpl");
+  if(MYDEBUG) BEGIN_OF("SALOME_ModuleCatalog_AcomponentImpl");
 
-  END_OF("SALOME_ModuleCatalog_AcomponentImpl");
+  if(MYDEBUG) END_OF("SALOME_ModuleCatalog_AcomponentImpl");
 }
 
 //----------------------------------------------------------------------
@@ -54,10 +63,10 @@ SALOME_ModuleCatalog_AcomponentImpl::SALOME_ModuleCatalog_AcomponentImpl
 //----------------------------------------------------------------------
 SALOME_ModuleCatalog_AcomponentImpl::~SALOME_ModuleCatalog_AcomponentImpl()
 {
-  BEGIN_OF("~SALOME_ModuleCatalog_AcomponentImpl");
+  if(MYDEBUG) BEGIN_OF("~SALOME_ModuleCatalog_AcomponentImpl");
 
 
-  END_OF("~SALOME_ModuleCatalog_AcomponentImpl");
+  if(MYDEBUG) END_OF("~SALOME_ModuleCatalog_AcomponentImpl");
 }
 
 //----------------------------------------------------------------------
@@ -67,7 +76,7 @@ SALOME_ModuleCatalog_AcomponentImpl::~SALOME_ModuleCatalog_AcomponentImpl()
 SALOME_ModuleCatalog::ListOfInterfaces* 
 SALOME_ModuleCatalog_AcomponentImpl::GetInterfaceList() 
 {
-  BEGIN_OF("GetInterfaceList");
+  if(MYDEBUG) BEGIN_OF("GetInterfaceList");
 
   SALOME_ModuleCatalog::ListOfInterfaces_var _list 
     = new SALOME_ModuleCatalog::ListOfInterfaces;
@@ -82,11 +91,11 @@ SALOME_ModuleCatalog_AcomponentImpl::GetInterfaceList()
   for (unsigned int ind = 0; ind < _length_interfaces; ind++)
     {
       _list[ind] = CORBA::string_dup(_Component.interfaces[ind].interfacename);
-      MESSAGE("The component " << _Component.name 
-             << " contains " << _list[ind] << " as interface");
+      if(MYDEBUG) MESSAGE("The component " << _Component.name 
+                         << " contains " << _list[ind] << " as interface");
     }
   
-  END_OF("GetInterfaceList");
+  if(MYDEBUG) END_OF("GetInterfaceList");
   return _list._retn();
 }
 
@@ -98,8 +107,8 @@ SALOME_ModuleCatalog::DefinitionInterface*
 SALOME_ModuleCatalog_AcomponentImpl::GetInterface(const char* interfacename)
                                      throw(SALOME_ModuleCatalog::NotFound)
 {
-  BEGIN_OF("GetInterface");
-  SCRUTE(interfacename);
+  if(MYDEBUG) BEGIN_OF("GetInterface");
+  if(MYDEBUG) SCRUTE(interfacename);
 
   SALOME_ModuleCatalog::DefinitionInterface *_interface =
          new SALOME_ModuleCatalog::DefinitionInterface;
@@ -120,7 +129,7 @@ SALOME_ModuleCatalog_AcomponentImpl::GetInterface(const char* interfacename)
        }
     }
 
-  SCRUTE(_find);
+  if(MYDEBUG) SCRUTE(_find);
   if (!_find)
     {
       // The interface was not found, the exception should be thrown
@@ -129,11 +138,11 @@ SALOME_ModuleCatalog_AcomponentImpl::GetInterface(const char* interfacename)
       message += " of the component ";
       message += _Component.name;
       message += " was not found"; 
-      MESSAGE(message)
-       throw SALOME_ModuleCatalog::NotFound(message.c_str());
+      if(MYDEBUG) MESSAGE(message);
+      throw SALOME_ModuleCatalog::NotFound(message.c_str());
     }
 
-  END_OF("GetInterface");
+  if(MYDEBUG) END_OF("GetInterface");
 
   return _interface;
 }
@@ -149,8 +158,8 @@ SALOME_ModuleCatalog::ListOfServices*
 SALOME_ModuleCatalog_AcomponentImpl::GetServiceList(const char* interfacename)
                                      throw(SALOME_ModuleCatalog::NotFound)
 {
-  BEGIN_OF("GetServiceList");
-  SCRUTE(interfacename);
+  if(MYDEBUG) BEGIN_OF("GetServiceList");
+  if(MYDEBUG) SCRUTE(interfacename);
 
   SALOME_ModuleCatalog::ListOfServices_var _list 
     = new SALOME_ModuleCatalog::ListOfServices;
@@ -173,8 +182,8 @@ SALOME_ModuleCatalog_AcomponentImpl::GetServiceList(const char* interfacename)
          for (unsigned int ind1 = 0; ind1 < _length_services ; ind1++)
            {
              _list[ind1] = CORBA::string_dup(I.interfaceservicelist[ind1].ServiceName);
-             MESSAGE("The interface " << interfacename << " of the component " 
-                     << _Component.name << " contains " << _list[ind1] << " as a service") 
+             if(MYDEBUG) MESSAGE("The interface " << interfacename << " of the component " 
+                                 << _Component.name << " contains " << _list[ind1] << " as a service") 
            }
        }
     }
@@ -187,11 +196,11 @@ SALOME_ModuleCatalog_AcomponentImpl::GetServiceList(const char* interfacename)
       message += " of the component ";
       message += _Component.name;
       message += " was not found"; 
-      MESSAGE(message)
-       throw SALOME_ModuleCatalog::NotFound(message.c_str());
+      if(MYDEBUG) MESSAGE(message);
+      throw SALOME_ModuleCatalog::NotFound(message.c_str());
     }
 
-  END_OF("GetServiceList");
+  if(MYDEBUG) END_OF("GetServiceList");
   return _list._retn();
 }
 
@@ -205,9 +214,9 @@ SALOME_ModuleCatalog_AcomponentImpl::GetService(const char* interfacename,
                                                const char* servicename) 
                                      throw(SALOME_ModuleCatalog::NotFound)
 {
-  BEGIN_OF("GetService");
-  SCRUTE(interfacename);
-  SCRUTE(servicename);
+  if(MYDEBUG) BEGIN_OF("GetService");
+  if(MYDEBUG) SCRUTE(interfacename);
+  if(MYDEBUG) SCRUTE(servicename);
 
   Unexpect aCatch( MC_NotFound );
   SALOME_ModuleCatalog::Service *service = new SALOME_ModuleCatalog::Service;
@@ -219,8 +228,8 @@ SALOME_ModuleCatalog_AcomponentImpl::GetService(const char* interfacename,
   // looking for the specified interface
   for (unsigned int ind = 0; ind < _Component.interfaces.length(); ind++)
     {
-      SCRUTE(ind);
-      SCRUTE(_Component.interfaces[ind].interfacename);
+      if(MYDEBUG) SCRUTE(ind);
+      if(MYDEBUG) SCRUTE(_Component.interfaces[ind].interfacename);
 
       SALOME_ModuleCatalog::DefinitionInterface &I = _Component.interfaces[ind];
       if (strcmp(interfacename, I.interfacename) == 0)
@@ -230,8 +239,8 @@ SALOME_ModuleCatalog_AcomponentImpl::GetService(const char* interfacename,
          for (unsigned int ind1 = 0; ind1 <  I.interfaceservicelist.length() ; ind1++)
            {
              SALOME_ModuleCatalog::Service &S = I.interfaceservicelist[ind1];
-             SCRUTE(ind1);
-             SCRUTE(S.ServiceName);
+             if(MYDEBUG) SCRUTE(ind1);
+             if(MYDEBUG) SCRUTE(S.ServiceName);
 
              if (strcmp(servicename, S.ServiceName) == 0)
              {
@@ -245,7 +254,7 @@ SALOME_ModuleCatalog_AcomponentImpl::GetService(const char* interfacename,
        }
     }
   
-  SCRUTE(_find);
+  if(MYDEBUG) SCRUTE(_find);
   if (!_find)
     {
       // The interface was not found, the exception should be thrown
@@ -256,11 +265,11 @@ SALOME_ModuleCatalog_AcomponentImpl::GetService(const char* interfacename,
       message += " of the component ";
       message += _Component.name;
       message += " was not found"; 
-      MESSAGE(message)
-       throw SALOME_ModuleCatalog::NotFound(message.c_str());
+      if(MYDEBUG) MESSAGE(message);
+      throw SALOME_ModuleCatalog::NotFound(message.c_str());
     }
 
-  END_OF("GetService");
+  if(MYDEBUG) END_OF("GetService");
   return service;
 }
 
@@ -272,8 +281,8 @@ SALOME_ModuleCatalog::Service*
 SALOME_ModuleCatalog_AcomponentImpl::GetDefaultService(const char* interfacename) 
                                      throw(SALOME_ModuleCatalog::NotFound)
 {
-  BEGIN_OF("GetDefaultService");
-  SCRUTE(interfacename);
+  if(MYDEBUG) BEGIN_OF("GetDefaultService");
+  if(MYDEBUG) SCRUTE(interfacename);
 
   Unexpect aCatch( MC_NotFound );
   SALOME_ModuleCatalog::Service *_service = new  SALOME_ModuleCatalog::Service;
@@ -310,11 +319,11 @@ SALOME_ModuleCatalog_AcomponentImpl::GetDefaultService(const char* interfacename
       message += " of the component ";
       message += _Component.name;
       message += " was not found";
-      MESSAGE(message)
-       throw SALOME_ModuleCatalog::NotFound(message.c_str());
+      if(MYDEBUG) MESSAGE(message);
+      throw SALOME_ModuleCatalog::NotFound(message.c_str());
     }
 
-  END_OF("GetDefaultService");
+  if(MYDEBUG) END_OF("GetDefaultService");
   return _service;
 }
 
@@ -326,8 +335,8 @@ char*
 SALOME_ModuleCatalog_AcomponentImpl::GetPathPrefix(const char* machinename) 
                                      throw(SALOME_ModuleCatalog::NotFound)
 {
-  BEGIN_OF("GetPathPrefix");
-  SCRUTE(machinename);
+  if(MYDEBUG) BEGIN_OF("GetPathPrefix");
+  if(MYDEBUG) SCRUTE(machinename);
   Unexpect aCatch( MC_NotFound );
 
  // Variables initialisation
@@ -349,7 +358,7 @@ SALOME_ModuleCatalog_AcomponentImpl::GetPathPrefix(const char* machinename)
            }
      }
 
-   SCRUTE(_find);
+   if(MYDEBUG) SCRUTE(_find);
    if (!_find)
      {
        // The computer was not found, the exception should be thrown
@@ -357,11 +366,11 @@ SALOME_ModuleCatalog_AcomponentImpl::GetPathPrefix(const char* machinename)
        message += machinename;
        message += " was not found in the catalog associated to the component ";
        message += _Component.name;
-       MESSAGE(message)
+       if(MYDEBUG) MESSAGE(message);
        throw SALOME_ModuleCatalog::NotFound(message.c_str());
      }
 
-  END_OF("GetPathPrefix");
+  if(MYDEBUG) END_OF("GetPathPrefix");
   return _path;
 }
 
@@ -499,7 +508,7 @@ void SALOME_ModuleCatalog_AcomponentImpl::duplicate
   
   // duplicate out DataStreamParameters
   _length = S_in.ServiceoutDataStreamParameter.length();
-  SCRUTE(_length);
+  if(MYDEBUG) SCRUTE(_length);
   S_out.ServiceoutDataStreamParameter.length(_length);
   
   for (unsigned int ind2 = 0; ind2 < _length ; ind2 ++)
@@ -517,7 +526,7 @@ void SALOME_ModuleCatalog_AcomponentImpl::duplicate
   
   // duplicate service list
   unsigned int _length = I_in.interfaceservicelist.length();
-  SCRUTE(_length);
+  if(MYDEBUG) SCRUTE(_length);
   I_out.interfaceservicelist.length(_length);
   
   for (unsigned int ind1 = 0; ind1 < _length ; ind1 ++)
index b7718b1694321ef71167ab5aeb26818e014ffe6a..4580350ae1e14baaa06a2f90c9349e5cff9cf64c 100644 (file)
@@ -29,7 +29,6 @@
 #ifndef ACOMPONENT_IMPL_H
 #define ACOMPONENT_IMPL_H
 
-#include "utilities.h"
 #include "SALOME_ModuleCatalog_Parser.hxx"
 #include <SALOMEconfig.h>
 
index da1ce33ceb654cba42939cf7624306b4fd96a0dc..19275eec58bed30a1e24959ca66b44faaaf88dd8 100644 (file)
 //  $Header$ 
 
 #define WRITE_CATA_COMPONENT
+
 #include "SALOME_ModuleCatalog_Handler.hxx"
 #include "SALOME_ModuleCatalog_Parser_IO.hxx"
-using namespace std;
+#include "utilities.h"
+
 #include <sstream>
 
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
 //----------------------------------------------------------------------
 // Function : SALOME_ModuleCatalog_Handler
 // Purpose  : Constructor
 //----------------------------------------------------------------------
 SALOME_ModuleCatalog_Handler::SALOME_ModuleCatalog_Handler()
 {
-  BEGIN_OF("SALOME_ModuleCatalog_Handler");
+  if(MYDEBUG) BEGIN_OF("SALOME_ModuleCatalog_Handler");
 
   // XML Tags initialisation
   // Used in the function endElement
@@ -90,7 +98,7 @@ SALOME_ModuleCatalog_Handler::SALOME_ModuleCatalog_Handler()
 
   test_component="component";
 
-  END_OF("SALOME_ModuleCatalog_Handler");
+  if(MYDEBUG) END_OF("SALOME_ModuleCatalog_Handler");
 }
 
 //----------------------------------------------------------------------
@@ -99,8 +107,8 @@ SALOME_ModuleCatalog_Handler::SALOME_ModuleCatalog_Handler()
 //----------------------------------------------------------------------
 SALOME_ModuleCatalog_Handler::~SALOME_ModuleCatalog_Handler()
 {
-  BEGIN_OF("~SALOME_ModuleCatalog_Handler()")
-  END_OF("~SALOME_ModuleCatalog_Handler()")
+  if(MYDEBUG) BEGIN_OF("~SALOME_ModuleCatalog_Handler()")
+  if(MYDEBUG) END_OF("~SALOME_ModuleCatalog_Handler()")
 }
 
 //----------------------------------------------------------------------
@@ -109,7 +117,7 @@ SALOME_ModuleCatalog_Handler::~SALOME_ModuleCatalog_Handler()
 //----------------------------------------------------------------------
 bool SALOME_ModuleCatalog_Handler::startDocument()
 {
-  MESSAGE("Begin parse document")
+  if(MYDEBUG) MESSAGE("Begin parse document");
   // Empty the private elements
   _pathList.resize(0);
   _pathPrefix.listOfComputer.resize(0);
@@ -304,8 +312,8 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
 
    //tag test_inParameter_name
    if ((qName.compare(test_inParameter_name)==0)) {
-     SCRUTE(parent);
-     SCRUTE(grandparent);
+     if(MYDEBUG) SCRUTE(parent);
+     if(MYDEBUG) SCRUTE(grandparent);
      if (grandparent.compare(test_inDataStreamParameter_list) == 0)
        _inDataStreamParam.name = content ;
      else 
@@ -324,7 +332,7 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
     {
       if (parent.compare(test_inParameter_list)==0) {
        
-       MESSAGE("add inParameter : " << _inParam.name);
+       if(MYDEBUG) MESSAGE("add inParameter : " << _inParam.name);
        _inParamList.push_back(_inParam) ; 
        
        // Empty temporary structures
@@ -333,7 +341,7 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
       }
       else if ((qName.compare(test_inDataStreamParameter)==0)) {
        
-       MESSAGE("add inDataStreamParameter : " << _inDataStreamParam.name);
+       if(MYDEBUG) MESSAGE("add inDataStreamParameter : " << _inDataStreamParam.name);
        _inDataStreamParamList.push_back(_inDataStreamParam) ; 
        
        // Empty temporary structures
@@ -347,7 +355,7 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
    //tag test_inParameter_list
    if((qName.compare(test_inParameter_list)==0))
      {
-       SCRUTE(_inParamList.size());
+       if(MYDEBUG) SCRUTE(_inParamList.size());
        _aService.inParameters = _inParamList;
        _inParamList.resize(0);
        return true;
@@ -356,22 +364,23 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
    //tag test_inDataStreamParameter_list
    if((qName.compare(test_inDataStreamParameter_list)==0))
      {
-       SCRUTE(_inDataStreamParamList.size());
+       if(MYDEBUG) SCRUTE(_inDataStreamParamList.size());
        _aService.inDataStreamParameters = _inDataStreamParamList;
        _inDataStreamParamList.resize(0);
      }
    //tag test_outDataStreamParameter_list
    if((qName.compare(test_outDataStreamParameter_list)==0))
      {
-       SCRUTE(_outDataStreamParamList.size());
+       if(MYDEBUG) SCRUTE(_outDataStreamParamList.size());
        _aService.outDataStreamParameters = _outDataStreamParamList;
        _outDataStreamParamList.resize(0);
        return true;
      }
 
 
+
    // Parameter out
-   SCRUTE(qName);
+   if(MYDEBUG) SCRUTE(qName);
 
    // tag test_outParameter_type
    if ((qName.compare(test_outParameter_type)==0)) {
@@ -402,8 +411,8 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
         
    //tag test_outDataStreamParameter_name
    if ((qName.compare(test_outDataStreamParameter_name)==0)) {
-     SCRUTE(grandparent);
-     SCRUTE(test_outDataStreamParameter_list);
+     if(MYDEBUG) SCRUTE(grandparent);
+     if(MYDEBUG) SCRUTE(test_outDataStreamParameter_list);
      if (grandparent.compare(test_outDataStreamParameter_list) == 0)
        _outDataStreamParam.name = content ;
      else 
@@ -422,7 +431,7 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
     {
       if (parent.compare(test_outParameter_list)==0) {
        
-       MESSAGE("add outParameter : " << _outParam.name);
+       if(MYDEBUG) MESSAGE("add outParameter : " << _outParam.name);
        _outParamList.push_back(_outParam) ; 
        
        // Empty temporary structures
@@ -431,7 +440,7 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
       }
       else if ((qName.compare(test_outDataStreamParameter)==0)) {
        
-       MESSAGE("add outDataStreamParameter : " << _outDataStreamParam.name);
+       if(MYDEBUG) MESSAGE("add outDataStreamParameter : " << _outDataStreamParam.name);
        _outDataStreamParamList.push_back(_outDataStreamParam) ; 
        
        // Empty temporary structures
@@ -445,7 +454,7 @@ bool SALOME_ModuleCatalog_Handler::endElement(const QString&,
    //tag test_outParameter_list
    if((qName.compare(test_outParameter_list)==0))
      {
-       SCRUTE(_outParamList.size());
+       if(MYDEBUG) SCRUTE(_outParamList.size());
        _aService.outParameters = _outParamList;
        _outParamList.resize(0);
        return true;
@@ -525,24 +534,24 @@ bool SALOME_ModuleCatalog_Handler::endDocument()
 {
 //  ofstream f("/tmp/logs/xxx.log", std::ofstream::app);
 //  f << "---------------------------------------------------------" << std::endl;
-  BEGIN_OF("endDocument");
+  if(MYDEBUG) BEGIN_OF("endDocument");
   //_pathlist
   for (unsigned int ind = 0; ind < _pathList.size(); ind++)
     {
-      MESSAGE("Path :"<<_pathList[ind].path)
+      if(MYDEBUG) MESSAGE("Path :"<<_pathList[ind].path);
       for (unsigned int i = 0; i < _pathList[ind].listOfComputer.size(); i++)
-         MESSAGE("Computer name :" << _pathList[ind].listOfComputer[i])
+       if(MYDEBUG) MESSAGE("Computer name :" << _pathList[ind].listOfComputer[i]);
     }
 
    // _moduleList
-//  SCRUTE(_moduleList.size());
+//  if(MYDEBUG) SCRUTE(_moduleList.size());
 //  for (unsigned int ind = 0; ind < _moduleList.size(); ind++)
 //    {
 //      f << _moduleList[ind] << std::endl;
 //    }
 
-  MESSAGE("Document parsed");
-  END_OF("endDocument");
+  if(MYDEBUG) MESSAGE("Document parsed");
+  if(MYDEBUG) END_OF("endDocument");
   return true;
 }
  
index 3509d14232326a13360394d1be29140137056a8f..775966ae7b59f4969f2027c5422434b4cc938302 100644 (file)
@@ -29,7 +29,6 @@
 #ifndef SALOME_CATALOG_HANDLER_H
 #define SALOME_CATALOG_HANDLER_H
 
-#include "utilities.h"
 #include "SALOME_ModuleCatalog_Parser.hxx"
 #include <qxml.h>
 #include <string>
@@ -105,7 +104,7 @@ public:
 private:
   QString errorProt ;
 
-  string content;
+  std::string content;
 
   QString test_path_prefix_name ;
   QString test_computer_name ;
index 4864f32a451ca8acf5cc713840ae91c1e9e022c8..98ac7336ffb17ca417b84c825d544434d4bc0bb2 100644 (file)
 
 #include "SALOME_ModuleCatalog_Parser_IO.hxx"
 #include <string>
+#include <iostream>
 #include "utilities.h"
 
+using namespace std;
+
 std::ostream & operator<< (std::ostream & f, const ParserParameter & P)
 {
   f << "          name :       " << P.name << std::endl;
index 7ba1b29f9539881e57c8e1b65380afcdcdce7c0f..7018c1cacb2a7a5a04bc093864c428796133113d 100644 (file)
 #include <qfileinfo.h>
 using namespace std;
 
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
 static const char* SEPARATOR    = ":";
 
 //----------------------------------------------------------------------
@@ -43,7 +49,7 @@ static const char* SEPARATOR    = ":";
 //----------------------------------------------------------------------
 SALOME_ModuleCatalogImpl::SALOME_ModuleCatalogImpl(int argc, char** argv, CORBA::ORB_ptr orb) : _orb(orb)
 {
-  MESSAGE("Catalog creation");
+  if(MYDEBUG) MESSAGE("Catalog creation");
 
   // Conversion rules for component types
   ComponentTypeConvert[GEOM]
@@ -93,57 +99,56 @@ SALOME_ModuleCatalogImpl::SALOME_ModuleCatalogImpl(int argc, char** argv, CORBA:
 
   // Parse the arguments given at server run
   if (!_parseArguments(argc, argv,&_general_path,&_personal_path))
-    MESSAGE( "Error while argument parsing" );
+    if(MYDEBUG) MESSAGE( "Error while argument parsing" );
 
   // Test existency of files
-  if (_general_path == NULL)
-    MESSAGE( "Error the general catalog should be indicated" )
-  else
-    {
-      // Affect the _general_module_list and _general_path_list members
-      // with the common catalog
-      
-      QStringList dirList 
-       = QStringList::split( SEPARATOR, _general_path, 
-                             false ); // skip empty entries
-
-      for ( int i = 0; i < dirList.count(); i++ ) {
-       QFileInfo fileInfo( dirList[ i ] );
-       if ( fileInfo.isFile() && fileInfo.exists() ) {
-         _parse_xml_file(fileInfo.filePath(), 
-                         _general_module_list, 
-                         _general_path_list);
-       }
+  if (_general_path == NULL){
+    if(MYDEBUG) MESSAGE( "Error the general catalog should be indicated" );
+  }else{
+    // Affect the _general_module_list and _general_path_list members
+    // with the common catalog
+    
+    QStringList dirList 
+      = QStringList::split( SEPARATOR, _general_path, 
+                           false ); // skip empty entries
+    
+    for ( int i = 0; i < dirList.count(); i++ ) {
+      QFileInfo fileInfo( dirList[ i ] );
+      if ( fileInfo.isFile() && fileInfo.exists() ) {
+       _parse_xml_file(fileInfo.filePath(), 
+                       _general_module_list, 
+                       _general_path_list);
       }
-
-      // Verification of _general_path_list content
-      if(!_verify_path_prefix(_general_path_list))
-       MESSAGE( "Error while parsing the general path list, "
-                "differents paths are associated to the same computer," 
-                "the first one will be choosen")
-      else 
-       MESSAGE("General path list OK");
+    }
     
-      if(_personal_path != NULL)
-       {
-         // Initialize the _personal_module_list and 
-         // _personal_path_list members with the personal catalog files
-         _parse_xml_file(_personal_path,
-                         _personal_module_list, 
-                         _personal_path_list);
-         
-         // Verification of _general_path_list content
-         if(!_verify_path_prefix(_personal_path_list))
-           MESSAGE("Error while parsing the personal path list, "
-                   "differents paths are associated to the same computer, "
-                   "the first one will be choosen" )
-         else 
-           MESSAGE("Personal path list OK");
-       }
-      else 
-       MESSAGE("No personal catalog indicated or error while "
-               "opening the personal catalog");
+    // Verification of _general_path_list content
+    if(!_verify_path_prefix(_general_path_list)){
+      if(MYDEBUG) MESSAGE( "Error while parsing the general path list, "
+                          "differents paths are associated to the same computer," 
+                          "the first one will be choosen");
+    }else{
+      if(MYDEBUG) MESSAGE("General path list OK");
     }
+    
+    if(_personal_path != NULL){
+      // Initialize the _personal_module_list and 
+      // _personal_path_list members with the personal catalog files
+      _parse_xml_file(_personal_path,
+                     _personal_module_list, 
+                     _personal_path_list);
+      
+      // Verification of _general_path_list content
+      if(!_verify_path_prefix(_personal_path_list)){
+       if(MYDEBUG) MESSAGE("Error while parsing the personal path list, "
+                           "differents paths are associated to the same computer, "
+                           "the first one will be choosen" );
+      }else {
+       if(MYDEBUG) MESSAGE("Personal path list OK");
+      }
+    }else 
+      if(MYDEBUG) MESSAGE("No personal catalog indicated or error while "
+                         "opening the personal catalog");
+  }
 }
 
 //----------------------------------------------------------------------
@@ -152,7 +157,7 @@ SALOME_ModuleCatalogImpl::SALOME_ModuleCatalogImpl(int argc, char** argv, CORBA:
 //----------------------------------------------------------------------
 SALOME_ModuleCatalogImpl::~SALOME_ModuleCatalogImpl()
 {
-  MESSAGE("Catalog Destruction");
+  if(MYDEBUG) MESSAGE("Catalog Destruction");
 }
 
 
@@ -174,7 +179,7 @@ SALOME_ModuleCatalogImpl::GetComputerList()
 //----------------------------------------------------------------------
 char * 
 SALOME_ModuleCatalogImpl::GetPathPrefix(const char* machinename) {
-  MESSAGE("Begin of GetPathPrefix")
+  if(MYDEBUG) MESSAGE("Begin of GetPathPrefix");
   // Variables initialisation
   char* _path = NULL;
   bool _find = false ;
@@ -229,51 +234,47 @@ SALOME_ModuleCatalogImpl::GetPathPrefix(const char* machinename) {
 SALOME_ModuleCatalog::ListOfComponents* 
 SALOME_ModuleCatalogImpl::GetComponentList()
 {
-  MESSAGE("Begin of GetComponentList");
+  if(MYDEBUG) MESSAGE("Begin of GetComponentList");
   SALOME_ModuleCatalog::ListOfComponents_var _list_components = 
     new SALOME_ModuleCatalog::ListOfComponents;
 
   _list_components->length(_personal_module_list.size());
 
   // All the components defined in the personal catalog are taken
-  for (unsigned int ind=0; ind < _personal_module_list.size();ind++)
-    {
-       _list_components[ind]=(_personal_module_list[ind].name).c_str();
-       SCRUTE(_list_components[ind]) ;
-    }
+  for(unsigned int ind=0; ind < _personal_module_list.size();ind++){
+    _list_components[ind]=(_personal_module_list[ind].name).c_str();
+    if(MYDEBUG) SCRUTE(_list_components[ind]) ;
+  }
 
   int indice = _personal_module_list.size() ;
   bool _find = false;
   
   // The components in the general catalog are taken only if they're
   // not defined in the personal catalog
-  for (unsigned int ind=0; ind < _general_module_list.size();ind++)
-    {
-      _find = false;
-      for (unsigned int ind1=0; ind1 < _personal_module_list.size();ind1++)
-       {
-         // searching if the component is already defined in 
-         // the personal catalog
-         if ((_general_module_list[ind].name.compare(_personal_module_list[ind1].name)) == 0)
-           _find = true;
-       }
-      if (!_find)
-       {
-         MESSAGE("A new component " << _general_module_list[ind].name 
-                 << " has to be to added in the list");
-          _list_components->length(indice+1);
-         // The component is not already defined => has to be taken
-         _list_components[indice]=(_general_module_list[ind].name).c_str();   
-         SCRUTE(_list_components[indice]) ;
-
-         indice++;
-       }
-      else 
-       MESSAGE("The component " <<_general_module_list[ind].name 
-               << " was already defined in the personal catalog") ;
-     }
-
-  MESSAGE ( "End of GetComponentList" )
+  for(unsigned int ind=0; ind < _general_module_list.size();ind++){
+    _find = false;
+    for(unsigned int ind1=0; ind1 < _personal_module_list.size();ind1++){
+      // searching if the component is already defined in 
+      // the personal catalog
+      if ((_general_module_list[ind].name.compare(_personal_module_list[ind1].name)) == 0)
+       _find = true;
+    }
+    if(!_find){
+      if(MYDEBUG) MESSAGE("A new component " << _general_module_list[ind].name 
+                         << " has to be to added in the list");
+      _list_components->length(indice+1);
+      // The component is not already defined => has to be taken
+      _list_components[indice]=(_general_module_list[ind].name).c_str();   
+      if(MYDEBUG) SCRUTE(_list_components[indice]) ;
+      
+      indice++;
+    }else{
+      if(MYDEBUG) MESSAGE("The component " <<_general_module_list[ind].name 
+                         << " was already defined in the personal catalog") ;
+    }
+  }
+  
+  if(MYDEBUG) MESSAGE ( "End of GetComponentList" );
   return _list_components._retn();
 }
 
@@ -288,7 +289,7 @@ SALOME_ModuleCatalogImpl::GetComponentList()
 SALOME_ModuleCatalog::ListOfIAPP_Affich* 
 SALOME_ModuleCatalogImpl::GetComponentIconeList()
 {
-  MESSAGE("Begin of GetComponentIconeList");
+  if(MYDEBUG) MESSAGE("Begin of GetComponentIconeList");
 
   SALOME_ModuleCatalog::ListOfIAPP_Affich_var _list_components_icone = 
     new SALOME_ModuleCatalog::ListOfIAPP_Affich;
@@ -296,47 +297,43 @@ SALOME_ModuleCatalogImpl::GetComponentIconeList()
   _list_components_icone->length(_personal_module_list.size());
 
   // All the components defined in the personal catalog are taken
-  for (unsigned int ind=0; ind < _personal_module_list.size();ind++)
-    {
-       _list_components_icone[ind].modulename=(_personal_module_list[ind].name).c_str();
-       _list_components_icone[ind].moduleusername=(_personal_module_list[ind].username).c_str();
-       _list_components_icone[ind].moduleicone=(_personal_module_list[ind].icon).c_str();
-       //SCRUTE(_list_components_icone[ind].modulename); 
-       //SCRUTE(_list_components_icone[ind].moduleicone);
-    }
-
+  for(unsigned int ind=0; ind < _personal_module_list.size();ind++){
+    _list_components_icone[ind].modulename=(_personal_module_list[ind].name).c_str();
+    _list_components_icone[ind].moduleusername=(_personal_module_list[ind].username).c_str();
+    _list_components_icone[ind].moduleicone=(_personal_module_list[ind].icon).c_str();
+    //if(MYDEBUG) SCRUTE(_list_components_icone[ind].modulename); 
+    //if(MYDEBUG) SCRUTE(_list_components_icone[ind].moduleicone);
+  }
+  
   int indice = _personal_module_list.size() ;
   bool _find = false;
   
   // The components in the general catalog are taken only if they're
   // not defined in the personal catalog
-  for (unsigned int ind=0; ind < _general_module_list.size();ind++)
-    {
-      _find = false;
-      for (unsigned int ind1=0; ind1 < _personal_module_list.size();ind1++)
-       {
-         // searching if the component is aleready defined in 
-         // the personal catalog
-         if ((_general_module_list[ind].name.compare(_personal_module_list[ind1].name)) == 0)
-           _find = true;
-       }
-      if (!_find)
-       {
-         //      MESSAGE("A new component " << _general_module_list[ind].name << " has to be to added in the list");
-          _list_components_icone->length(indice+1);
-         // The component is not already defined => has to be taken
-         _list_components_icone[indice].modulename=_general_module_list[ind].name.c_str();  
-         _list_components_icone[indice].moduleusername=_general_module_list[ind].username.c_str();  
-         _list_components_icone[indice].moduleicone=_general_module_list[ind].icon.c_str(); 
-         //SCRUTE(_list_components_icone[indice].modulename) ;
-         //SCRUTE(_list_components_icone[indice].moduleicone);
-
-         indice++;
-       }
-      // else 
-       //MESSAGE("The component " <<_general_module_list[ind].name << " was already defined in the personal catalog"); 
-     }
-
+  for(unsigned int ind=0; ind < _general_module_list.size();ind++){
+    _find = false;
+    for(unsigned int ind1=0; ind1 < _personal_module_list.size();ind1++){
+      // searching if the component is aleready defined in 
+      // the personal catalog
+      if((_general_module_list[ind].name.compare(_personal_module_list[ind1].name)) == 0)
+       _find = true;
+    }
+    if(!_find){
+      //         if(MYDEBUG) MESSAGE("A new component " << _general_module_list[ind].name << " has to be to added in the list");
+      _list_components_icone->length(indice+1);
+      // The component is not already defined => has to be taken
+      _list_components_icone[indice].modulename=_general_module_list[ind].name.c_str();  
+      _list_components_icone[indice].moduleusername=_general_module_list[ind].username.c_str();  
+      _list_components_icone[indice].moduleicone=_general_module_list[ind].icon.c_str(); 
+      //if(MYDEBUG) SCRUTE(_list_components_icone[indice].modulename) ;
+      //if(MYDEBUG) SCRUTE(_list_components_icone[indice].moduleicone);
+      
+      indice++;
+    }
+    // else 
+    //if(MYDEBUG) MESSAGE("The component " <<_general_module_list[ind].name << " was already defined in the personal catalog"); 
+  }
+  
   return _list_components_icone._retn() ;
 }
 
@@ -350,7 +347,7 @@ SALOME_ModuleCatalogImpl::GetComponentIconeList()
 SALOME_ModuleCatalog::ListOfComponents* 
 SALOME_ModuleCatalogImpl::GetTypedComponentList(SALOME_ModuleCatalog::ComponentType component_type)
 {
-  MESSAGE("Begin of GetTypedComponentList");
+  if(MYDEBUG) MESSAGE("Begin of GetTypedComponentList");
   SALOME_ModuleCatalog::ListOfComponents_var _list_typed_component = 
     new SALOME_ModuleCatalog::ListOfComponents;
   int _j = 0;
@@ -392,7 +389,7 @@ SALOME_ModuleCatalogImpl::GetTypedComponentList(SALOME_ModuleCatalog::ComponentT
        {
          _list_typed_component->length(_j + 1); 
          _list_typed_component[_j] = (_moduleList[ind].name).c_str();
-         //SCRUTE(_list_typed_component[_j])
+         //if(MYDEBUG) SCRUTE(_list_typed_component[_j]);
          _j++;
        }
     }
@@ -417,16 +414,16 @@ SALOME_ModuleCatalogImpl::GetTypedComponentList(SALOME_ModuleCatalog::ComponentT
            }
          if (!_find)
            {
-             //MESSAGE("A new component " << _general_module_list[ind].name << " has to be to added in the list");
+             //if(MYDEBUG) MESSAGE("A new component " << _general_module_list[ind].name << " has to be to added in the list");
               _list_typed_component->length(indice+1);
              // The component is not already defined => has to be taken
              _list_typed_component[indice]=(_general_module_list[ind].name).c_str();   
-             //SCRUTE(_list_typed_component[indice]) ;
+             //if(MYDEBUG) SCRUTE(_list_typed_component[indice]) ;
 
              indice++;
            }
          //else 
-           //MESSAGE("The component " <<_general_module_list[ind].name << " was already defined in the personal catalog") ;
+           //if(MYDEBUG) MESSAGE("The component " <<_general_module_list[ind].name << " was already defined in the personal catalog") ;
         }
     }
 
@@ -474,8 +471,8 @@ SALOME_ModuleCatalogImpl::GetComponent(const char* name)
   else {
     // Not found in the personal catalog and in the general catalog
     // return NULL object
-    MESSAGE("Component with name  " << name 
-           << " not found in catalog");
+    if(MYDEBUG) MESSAGE("Component with name  " << name 
+                       << " not found in catalog");
     compo = NULL;
   }
   
@@ -509,8 +506,8 @@ SALOME_ModuleCatalogImpl::findComponent(const string & name)
     for (unsigned int ind=0; ind < _personal_module_list.size();ind++)
       if (name.compare(_personal_module_list[ind].name) == 0)
         {
-          MESSAGE("Component named " << name 
-                 << " found in the personal catalog");
+          if(MYDEBUG) MESSAGE("Component named " << name 
+                             << " found in the personal catalog");
          C_parser = &(_personal_module_list[ind]);
          break;
        }
@@ -520,8 +517,8 @@ SALOME_ModuleCatalogImpl::findComponent(const string & name)
       {
        if (name.compare(_general_module_list[ind].name) == 0)
          {
-           MESSAGE("Component named " << name 
-                   << " found in the general catalog");
+           if(MYDEBUG) MESSAGE("Component named " << name 
+                               << " found in the general catalog");
            C_parser = &(_general_module_list[ind]);
            break;
          }
@@ -539,8 +536,8 @@ SALOME_ModuleCatalogImpl::_parse_xml_file(const char* file,
                                          ParserComponents& modulelist, 
                                          ParserPathPrefixes& pathList)
 {
-  BEGIN_OF("_parse_xml_file");
-  SCRUTE(file);
+  if(MYDEBUG) BEGIN_OF("_parse_xml_file");
+  if(MYDEBUG) SCRUTE(file);
 
   SALOME_ModuleCatalog_Handler* handler = new SALOME_ModuleCatalog_Handler();
   QFile xmlFile(file);
@@ -622,7 +619,7 @@ void SALOME_ModuleCatalogImpl::duplicate
   
   // duplicate service list
   unsigned int _length = I_parser.services.size();
-  SCRUTE(_length);
+  if(MYDEBUG) SCRUTE(_length);
   //  I_corba.interfaceservicelist 
   //  = new SALOME_ModuleCatalog::ListOfInterfaceService;
   I_corba.interfaceservicelist.length(_length);
@@ -676,7 +673,7 @@ void SALOME_ModuleCatalogImpl::duplicate
   
   // duplicate out DataStreamParameters
   _length = S_parser.outDataStreamParameters.size();
-  SCRUTE(_length);
+  if(MYDEBUG) SCRUTE(_length);
   S_corba.ServiceoutDataStreamParameter.length(_length);
   
   for (unsigned int ind2 = 0; ind2 < _length ; ind2 ++)
@@ -723,7 +720,7 @@ void SALOME_ModuleCatalogImpl::duplicate
   //     = (it_type == DataStreamTypeConvert.end()) 
   //     ? it_type->second : SALOME_ModuleCatalog::DATASTREAM_UNKNOWN;
 
-  SCRUTE(P_parser.type);
+  if(MYDEBUG) SCRUTE(P_parser.type);
   P_corba.Parametertype = SALOME_ModuleCatalog::DATASTREAM_UNKNOWN;
   for (it_type = DataStreamTypeConvert.begin(); 
        it_type != DataStreamTypeConvert.end(); 
@@ -732,7 +729,7 @@ void SALOME_ModuleCatalogImpl::duplicate
       P_corba.Parametertype = it_type->second;
       break;
     }
-  SCRUTE(P_corba.Parametertype);
+  if(MYDEBUG) SCRUTE(P_corba.Parametertype);
 
   // duplicate parameter type
 
@@ -742,7 +739,7 @@ void SALOME_ModuleCatalogImpl::duplicate
   //     = (it_type == DataStreamTypeConvert.end()) 
   //     ? it_type->second : SALOME_ModuleCatalog::DATASTREAM_UNKNOWN;
   
-  SCRUTE(P_parser.dependency);
+  if(MYDEBUG) SCRUTE(P_parser.dependency);
   P_corba.Parameterdependency = SALOME_ModuleCatalog::DATASTREAM_UNDEFINED;
   for (it_dep = DataStreamDepConvert.begin(); 
        it_dep != DataStreamDepConvert.end(); 
@@ -752,7 +749,7 @@ void SALOME_ModuleCatalogImpl::duplicate
       break;
     }
 
-  SCRUTE(P_corba.Parameterdependency);
+  if(MYDEBUG) SCRUTE(P_corba.Parameterdependency);
 }
 
 //----------------------------------------------------------------------
@@ -795,7 +792,7 @@ SALOME_ModuleCatalogImpl::_verify_path_prefix(ParserPathPrefixes & pathList)
        {
         if(_machine_list[ind].compare(_machine_list[ind1]) == 0)
           {
-            MESSAGE( "The computer " << _machine_list[ind] << " is indicated more than once in the path list")
+            if(MYDEBUG) MESSAGE( "The computer " << _machine_list[ind] << " is indicated more than once in the path list");
             _return_value = false; 
           }
        }
index a878c2f495d3cf0e2206fa858d3b4be8b6eef5e1..71209115140ec966680c191caa6fa9636bcee353 100644 (file)
@@ -123,7 +123,7 @@ private:
     \param name  string argument
     \return pointer on a component, NULL if not found
   */
-  ParserComponent *findComponent(const string & name);
+  ParserComponent *findComponent(const std::string & name);
 
   //! method to create a CORBA component description from parser
   /*!
index 6fe58e93c9f4aaae868976edb10da92ae7409646..07b0e93423de3be5914a2aa34133d8f965a79dae 100644 (file)
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include "SALOME_NamingService.hxx"
 #include "ServiceUnreachable.hxx"
+
+#include "utilities.h"
+
 #include <iostream>
 #include <cstring>
 
+using namespace std;
+
 //----------------------------------------------------------------------
 /*! Function : SALOME_NamingService
  *  Purpose  : Constructor and Initialisation of _root_context
index cd4683155d47e5370eee6b0702dc21a64ec21672..4504e6ec7bdd71d58d59a3a446d7e0757d791a7e 100644 (file)
@@ -82,7 +82,7 @@ public:
 
   //!method to get all the contexts contained in the current direcotry
   // Get only objects, isn't iterative
-  vector<string> list_directory()
+  std::vector<std::string> list_directory()
     throw(ServiceUnreachable);
  
   //! method to destroy an association Path-Object Reference
index 809d328eca5e8f4e3899f0b603229a6b357b4246..f7bc0d67dc7be5b5cf9c5d09430cde16f74da6eb 100644 (file)
@@ -109,13 +109,13 @@ bool NOTIFICATION_Consumer::Receive(char** graph, char** node, char** type, char
             event->filterable_data[5].value >>= Anode;
             event->filterable_data[6].value >>= Astamp;
             event->remainder_of_body        >>= Amessage;
-            *graph   = strdup(Agraph);
-            *node    = strdup(Anode);
-            *type    = strdup(Atype);
-            *message = strdup(Amessage);
-            *sender  = strdup(Asender);
+            *graph   = CORBA::string_dup(Agraph);
+            *node    = CORBA::string_dup(Anode);
+            *type    = CORBA::string_dup(Atype);
+            *message = CORBA::string_dup(Amessage);
+            *sender  = CORBA::string_dup(Asender);
             *counter = (long)Acounter;
-            *date    = strdup(Adate);
+            *date    = CORBA::string_dup(Adate);
             *stamp   = (long)Astamp;
         };
     };
index d15092cab254769df7030e6a828c67c070bbaa65..6d1a55859bbbef3d35d9151e3fbe2e08a7251bcc 100644 (file)
@@ -14,8 +14,6 @@ EXPORT_HEADERS = SALOME_InteractiveObject.hxx \
                 Handle_SALOME_AISShape.hxx \
                 SALOME_AISObject.hxx \
                 Handle_SALOME_AISObject.hxx \
-                VTKViewer_Common.h
-
 
 # Libraries targets
 
@@ -23,7 +21,7 @@ LIB = libSalomeObject.la
 LIB_SRC =       SALOME_InteractiveObject.cxx \
                 SALOME_Actor.cxx \
                 SALOME_AISShape.cxx\
-                SALOME_AISObject.cxx
+                SALOME_AISObject.cxx\
 
 LIB_CLIENT_IDL = 
 
index 137e0d9b9e0bd1e289cc05196e897da769c62993..6cc5077df087b5e87b15801bd31a559a284284b7 100644 (file)
@@ -48,6 +48,7 @@
 #endif
 class SALOME_InteractiveObject;
 class TopoDS_Shape;
+class TColStd_IndexedMapOfInteger;
 
 
 class SALOME_AISShape : public AIS_Shape {
@@ -77,6 +78,7 @@ Standard_EXPORT virtual  Handle_SALOME_InteractiveObject getIO() = 0;
 Standard_EXPORT virtual  Standard_Boolean hasIO() = 0;
 Standard_EXPORT virtual  Standard_CString getName() = 0;
 Standard_EXPORT virtual  void setName(Standard_CString aName) = 0;
+Standard_EXPORT virtual  void highlightSubShapes(const TColStd_IndexedMapOfInteger& aIndexMap, const Standard_Boolean aHighlight ) = 0;
 Standard_EXPORT ~SALOME_AISShape();
 
 
index 43a88b90175110f0b4bf4a7faedd8b3a95688ebb..b2040b2a3ef5f4c16fbdd48edffb0bdd307f0278 100644 (file)
@@ -41,6 +41,9 @@
 #include "utilities.h"
 
 // VTK Includes
+#include <vtkCell.h>
+#include <vtkRenderer.h>
+#include <vtkPolyData.h>
 #include <vtkObjectFactory.h>
 #include <vtkDataSetMapper.h>
 #include <vtkPolyDataMapper.h>
@@ -60,14 +63,20 @@ vtkStandardNewMacro(SALOME_Actor);
 
 
 SALOME_Actor::SALOME_Actor(){
-  PreviewProperty = NULL;
-  ispreselected = Standard_False;
-  myProperty = vtkProperty::New();
+  myIsHighlighted = myIsPreselected = false;
 
-  myRepresentation = 2;
+  myRepresentation = 1;
+  myDisplayMode = myRepresentation - 1;
+
+  myProperty = vtkProperty::New();
+  PreviewProperty = NULL;
 
   myIsInfinite = false;
 
+  myIsResolveCoincidentTopology = true;
+
+  vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
+                                                                myPolygonOffsetUnits);
   myStoreMapping = false;
   myGeomFilter = SALOME_GeometryFilter::New();
 
@@ -111,73 +120,79 @@ void SALOME_Actor::SetTransform(SALOME_Transform* theTransform){
   myTransformFilter->SetTransform(theTransform);
 }
 
+
 void SALOME_Actor::SetMapper(vtkMapper* theMapper){
+  InitPipeLine(theMapper);
+}
+
+void SALOME_Actor::InitPipeLine(vtkMapper* theMapper){
   if(theMapper){
     int anId = 0;
-#if defined __GNUC_2__
-    myPassFilter[anId]->SetInput(theMapper->GetInput());
-#else
-    myPassFilter.at(anId)->SetInput(theMapper->GetInput());
-#endif
-    myGeomFilter->SetStoreMapping(myStoreMapping);
-#if defined __GNUC_2__
-    myGeomFilter->SetInput(myPassFilter[anId]->GetOutput());
-#else
-    myGeomFilter->SetInput(myPassFilter.at(anId)->GetOutput());
-#endif
-
-    anId++;
-
-#if defined __GNUC_2__
-    myPassFilter[anId]->SetInput(myGeomFilter->GetOutput());
-    myPassFilter[anId+1]->SetInput(myPassFilter[anId]->GetOutput());
-#else
-    myPassFilter.at(anId)->SetInput(myGeomFilter->GetOutput());
-    myPassFilter.at(anId+1)->SetInput(myPassFilter.at(anId)->GetOutput());
-#endif
+    myPassFilter[ anId ]->SetInput( theMapper->GetInput() );
+    myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() );
+    
+    anId++; // 1
+    myGeomFilter->SetStoreMapping( myStoreMapping );
+    myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() );
 
-    anId++;
-#if defined __GNUC_2__
-    myPassFilter[anId+1]->SetInput(myPassFilter[anId]->GetOutput());
-#else
-    myPassFilter.at(anId+1)->SetInput(myPassFilter.at(anId)->GetOutput());
-#endif
+    anId++; // 2
+    myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() ); 
+    myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
 
-    anId++;
-#if defined __GNUC_2__
-    myTransformFilter->SetInput(myPassFilter[anId]->GetPolyDataOutput());
-#else
-    myTransformFilter->SetInput(myPassFilter.at(anId)->GetPolyDataOutput());
-#endif
+    anId++; // 3
+    myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
 
-    anId++;
-#if defined __GNUC_2__
-    myPassFilter[anId]->SetInput(myTransformFilter->GetOutput());
-    myPassFilter[anId+1]->SetInput(myPassFilter[anId]->GetOutput());
-#else
-    myPassFilter.at(anId)->SetInput(myTransformFilter->GetOutput());
-    myPassFilter.at(anId+1)->SetInput(myPassFilter.at(anId)->GetOutput());
-#endif
+    anId++; // 4
+    myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
+    myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
 
-    anId++;
-    if(vtkDataSetMapper* aMapper = dynamic_cast<vtkDataSetMapper*>(theMapper))
-#if defined __GNUC_2__
+    anId++; // 5
+    if(vtkDataSetMapper* aMapper = dynamic_cast<vtkDataSetMapper*>(theMapper)){
       aMapper->SetInput(myPassFilter[anId]->GetOutput());
-#else
-      aMapper->SetInput(myPassFilter.at(anId)->GetOutput());
-#endif
-    else if(vtkPolyDataMapper* aMapper = dynamic_cast<vtkPolyDataMapper*>(theMapper))
-#if defined __GNUC_2__
+    }else if(vtkPolyDataMapper* aMapper = dynamic_cast<vtkPolyDataMapper*>(theMapper)){
       aMapper->SetInput(myPassFilter[anId]->GetPolyDataOutput());
-#else
-      aMapper->SetInput(myPassFilter.at(anId)->GetPolyDataOutput());
-#endif
+    }
   }
   vtkLODActor::SetMapper(theMapper);
 }
 
-vtkPolyData* SALOME_Actor::GetPolyDataInput(){
-  return myPassFilter.back()->GetPolyDataOutput();
+
+void SALOME_Actor::Render(vtkRenderer *ren, vtkMapper* m){
+  if(myIsResolveCoincidentTopology){
+    int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
+    float aFactor, aUnit; 
+    vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnit);
+    
+    vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
+    vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
+                                                                  myPolygonOffsetUnits);
+    vtkLODActor::Render(ren,m);
+    
+    vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnit);
+    vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
+  }else{
+    vtkLODActor::Render(ren,m);
+  }
+}
+
+
+void SALOME_Actor::SetResolveCoincidentTopology(bool theIsResolve) {
+  myIsResolveCoincidentTopology = theIsResolve;
+}
+
+void SALOME_Actor::SetPolygonOffsetParameters(float factor, float units){
+  myPolygonOffsetFactor = factor;
+  myPolygonOffsetUnits = units;
+}
+
+void SALOME_Actor::GetPolygonOffsetParameters(float& factor, float& units){
+  factor = myPolygonOffsetFactor;
+  units = myPolygonOffsetUnits;
+}
+
+
+vtkDataSet* SALOME_Actor::GetInput(){
+  return myPassFilter.front()->GetOutput();
 }
 
 
@@ -195,17 +210,16 @@ unsigned long int SALOME_Actor::GetMTime(){
 
 void SALOME_Actor::SetRepresentation(int theMode) { 
   switch(myRepresentation){
-  case 0 : 
-  case 2 : 
+  case VTK_POINTS : 
+  case VTK_SURFACE : 
     myProperty->DeepCopy(GetProperty());
   }    
   switch(theMode){
-  case 0 : 
-  case 2 : 
+  case VTK_POINTS : 
+  case VTK_SURFACE : 
     GetProperty()->DeepCopy(myProperty);
     break;
   default:
-    break;
     GetProperty()->SetAmbient(1.0);
     GetProperty()->SetDiffuse(0.0);
     GetProperty()->SetSpecular(0.0);
@@ -215,7 +229,7 @@ void SALOME_Actor::SetRepresentation(int theMode) {
     myGeomFilter->SetInside(true);
     GetProperty()->SetRepresentation(1);
     break;
-  case 0 : 
+  case VTK_POINTS : 
     GetProperty()->SetPointSize(SALOME_POINT_SIZE);  
   default :
     GetProperty()->SetRepresentation(theMode);
@@ -228,6 +242,17 @@ int SALOME_Actor::GetRepresentation(){
   return myRepresentation;
 }
 
+
+vtkCell* SALOME_Actor::GetElemCell(int theObjID){
+  return GetInput()->GetCell(theObjID);
+}
+
+
+float* SALOME_Actor::GetNodeCoord(int theObjID){
+  return GetInput()->GetPoint(theObjID);
+}
+
+
 //=================================================================================
 // function : GetObjDimension
 // purpose  : Return object dimension.
@@ -235,41 +260,45 @@ int SALOME_Actor::GetRepresentation(){
 //=================================================================================
 int SALOME_Actor::GetObjDimension( const int theObjId )
 {
-  if ( theObjId < 0 )
-    return 0;
-    
-  std::vector<int> aVtkList = GetVtkId( theObjId );
-  int nbVtk = aVtkList.size();
-  
-  if ( nbVtk == 0 )
-    return 0;
-  else if ( nbVtk > 1 )
-    return 3;
-  else //  nbVtk = 1
-  {
-    if ( vtkDataSet* aGrid = GetMapper()->GetInput() )
-    {
-      if ( vtkCell* aCell = aGrid->GetCell( aVtkList.front() ) )
-        return aCell->GetCellDimension();
-    }
-  }
+  if ( vtkCell* aCell = GetElemCell(theObjId) )
+    return aCell->GetCellDimension();
   return 0;
 }
 
 
+bool SALOME_Actor::IsInfinitive(){ 
+  return myIsInfinite; 
+}
 
 
+void SALOME_Actor::SetOpacity(float theOpacity){ 
+  myOpacity = theOpacity;
+  GetProperty()->SetOpacity(theOpacity);
+}
 
+float SALOME_Actor::GetOpacity(){
+  return myOpacity;
+}
 
 
+void SALOME_Actor::SetColor(float r,float g,float b){
+  GetProperty()->SetColor(r,g,b);
+}
 
+void SALOME_Actor::GetColor(float& r,float& g,float& b){
+  float aColor[3];
+  GetProperty()->GetColor(aColor);
+  r = aColor[0];
+  g = aColor[1];
+  b = aColor[2];
+}
 
 
+int SALOME_Actor::getDisplayMode(){ 
+  return myDisplayMode; 
+}
 
-
-
-
-
-
-
-
+void SALOME_Actor::setDisplayMode(int theMode){ 
+  SetRepresentation(theMode+1); 
+  myDisplayMode = GetRepresentation() - 1;
+}
index 08a15bd4e17394cf44d8a34a0d420083d6dd0e1f..6b57f9ca81cd125459e701441a826a78a490fabb 100644 (file)
 #ifndef SALOME_ACTOR_H
 #define SALOME_ACTOR_H
 
-// SALOME Includes
-#include "VTKViewer_Common.h"
-#include "SALOME_InteractiveObject.hxx"
-
 #include <vector>
 
+#include <vtkLODActor.h>
+#include <vtkProperty.h>
+
+class vtkCell;
+class vtkDataSet;
+class vtkPolyData;
+class vtkCamera;
+
+#include "SALOME_InteractiveObject.hxx"
+
 class SALOME_Transform;
 class SALOME_GeometryFilter;
 class SALOME_TransformFilter;
@@ -43,42 +49,39 @@ class SALOME_PassThroughFilter;
 extern int SALOME_POINT_SIZE;
 
 class SALOME_Actor : public vtkLODActor{
- protected:
-  //constructor should be protected due to first implementation of this class
-  //it was abstract class
-  SALOME_Actor();
-  ~SALOME_Actor();
  public:
   static SALOME_Actor* New();
 
   vtkTypeMacro(SALOME_Actor,vtkLODActor);
 
   virtual Standard_Boolean hasIO() { return !myIO.IsNull(); }
-  virtual Handle_SALOME_InteractiveObject getIO() { return myIO; } 
+  virtual const Handle(SALOME_InteractiveObject)& getIO() { return myIO; } 
   virtual void setIO(const Handle(SALOME_InteractiveObject)& io) { myIO = io; }
 
-  virtual Standard_CString getName()     { return myName; }
-  virtual void setName(Standard_CString aName){
-    myName = aName;
-    if(hasIO())        myIO->setName(aName);
+  virtual const char* getName() { return myName.c_str(); }
+  virtual void setName(const char* theName){
+    if(hasIO())        myIO->setName(theName);
+    myName = theName;
   }
 
-  virtual int getDisplayMode() { return myDisplayMode; }
-  virtual void setDisplayMode(int mode) { myDisplayMode = mode; }
-
-  virtual bool hasHighlight() { return false; }  
-  virtual void highlight(Standard_Boolean highlight) { ishighlighted = highlight; }  
-  virtual Standard_Boolean isHighlighted() { return ishighlighted; }
+  // To generate highlight automaticaly
+  virtual bool hasHighlight() { return false; } 
+  virtual void highlight(bool theHighlight) { myIsHighlighted = theHighlight; }  
+  virtual bool isHighlighted() { return myIsHighlighted; }
 
-  virtual void SetOpacity(float opa) { m_opacity = opa; }
-  virtual float GetOpacity() { return m_opacity; }
+  virtual void SetOpacity(float theOpacity);
+  virtual float GetOpacity();
 
-  virtual void SetColor(float r,float g,float b) {};
-  virtual void GetColor(float& r,float& g,float& b) {};
+  virtual void SetColor(float r,float g,float b);
+  virtual void GetColor(float& r,float& g,float& b);
+  void SetColor(const float theRGB[3]){ 
+    SetColor(theRGB[0],theRGB[1],theRGB[2]);
+  }
 
   vtkSetObjectMacro(PreviewProperty,vtkProperty);
 
-  virtual void SetPreSelected(Standard_Boolean presel = Standard_False)   { ispreselected = presel; }
+  virtual void SetPreSelected(bool thePreselect = false) { myIsPreselected = thePreselect;}
+
 
   // Used to obtain all dependent actors
   virtual void GetChildActors(vtkActorCollection*) {};
@@ -86,14 +89,19 @@ class SALOME_Actor : public vtkLODActor{
   virtual void AddToRender(vtkRenderer* theRenderer); 
   virtual void RemoveFromRender(vtkRenderer* theRenderer);
 
-  typedef std::vector<int> TVectorId;
-  virtual int GetObjId(int theVtkID) { return -1;}
-  virtual TVectorId GetVtkId(int theObjID) { return TVectorId();}
+
+  // For selection mapping purpose
+  virtual int GetNodeObjId(int theVtkID) { return theVtkID;}
+  virtual float* GetNodeCoord(int theObjID);
+
+  virtual int GetElemObjId(int theVtkID) { return theVtkID;}
+  virtual vtkCell* GetElemCell(int theObjID);
 
   virtual int GetObjDimension( const int theObjId );
 
   virtual void SetMapper(vtkMapper* theMapper); 
-  virtual vtkPolyData* GetPolyDataInput(); 
+  virtual vtkDataSet* GetInput(); 
+
 
   virtual void SetTransform(SALOME_Transform* theTransform); 
   virtual unsigned long int GetMTime();
@@ -101,19 +109,46 @@ class SALOME_Actor : public vtkLODActor{
   virtual void SetRepresentation(int theMode);
   virtual int GetRepresentation();
 
-  // Infinitive means actor without size (point for example
+  virtual int getDisplayMode();
+  virtual void setDisplayMode(int theMode);
+
+  // Infinitive means actor without size (point for example),
   // which is not taken into account in calculation of boundaries of the scene
-  virtual bool IsInfinitive() { return myIsInfinite; }
+  void SetInfinitive(bool theIsInfinite) { myIsInfinite = theIsInfinite; }
+  virtual bool IsInfinitive();
     
+  void SetResolveCoincidentTopology(bool theIsResolve);
+  void SetPolygonOffsetParameters(float factor, float units);
+  void GetPolygonOffsetParameters(float& factor, float& units);
+
+  virtual void Render(vtkRenderer *, vtkMapper *);
+
+  virtual float GetShrinkFactor() { return 1.0;}
+
+  virtual bool IsShrunkable() { return false;}
+  virtual bool IsShrunk() { return false;}
+
+  virtual void SetShrink() {} 
+  virtual void UnShrink() {}
+
+  virtual bool IsSetCamera() const { return false; }
+  virtual bool IsResizable() const { return false; }
+  virtual void SetSize( const float ) {}
+  virtual void SetCamera( vtkCamera* ) {}
+
  protected:
-  vtkProperty         *PreviewProperty;
-  Standard_Boolean    ispreselected;
+  bool myIsResolveCoincidentTopology;
+  float myPolygonOffsetFactor;
+  float myPolygonOffsetUnits;
 
   Handle(SALOME_InteractiveObject) myIO;
-  Standard_CString myName;
+  std::string myName;
 
-  float   m_opacity;
-  Standard_Boolean    ishighlighted;
+  vtkProperty *PreviewProperty;
+  bool myIsPreselected;
+
+  float myOpacity;
+  bool myIsHighlighted;
   int myDisplayMode;
   bool myIsInfinite;
 
@@ -124,6 +159,13 @@ class SALOME_Actor : public vtkLODActor{
 
   int myRepresentation;
   vtkProperty *myProperty;
+
+  void InitPipeLine(vtkMapper* theMapper); 
+
+  SALOME_Actor();
+  ~SALOME_Actor();
 };
 
+
 #endif // SALOME_ACTOR_H
+
index 36a977af643c4f24f0f3435dac86f915884c30db..4f07e3b88cbf04dd5b186b4a667659ff0598712a 100644 (file)
@@ -42,65 +42,54 @@ SALOME_InteractiveObject::SALOME_InteractiveObject()
   myReference = "";
 }
 
-SALOME_InteractiveObject::SALOME_InteractiveObject(const Standard_CString anEntry, 
-                                                  const Standard_CString aComponentDataType,
-                                                  const Standard_CString aName)
-{
-  myEntry = new char [strlen(anEntry)+1];
-  strcpy( myEntry, anEntry);
-
-  myName = new char [strlen(aName)+1];
-  strcpy( myName, aName);
-
-  myComponentDataType = new char [strlen(aComponentDataType)+1];
-  strcpy( myComponentDataType, aComponentDataType);
-
-  myReference = new char [strlen("")+1];
-  strcpy( myReference, "");
-}
-
-void SALOME_InteractiveObject::setEntry(const Standard_CString anEntry){
-  myEntry = new char [strlen(anEntry)+1];
-  strcpy( myEntry, anEntry);
+SALOME_InteractiveObject::SALOME_InteractiveObject(const char* anEntry, 
+                                                  const char* aComponentDataType,
+                                                  const char* aName):
+  myEntry(anEntry), 
+  myName(aName), 
+  myComponentDataType(aComponentDataType), 
+  myReference("")
+{}
+
+void SALOME_InteractiveObject::setEntry(const char* anEntry){
+  myEntry = anEntry;
 }
 
-Standard_CString SALOME_InteractiveObject::getEntry(){
-  return myEntry;
+const char* SALOME_InteractiveObject::getEntry(){
+  return myEntry.c_str();
 }
 
-void SALOME_InteractiveObject::setComponentDataType(const Standard_CString aComponentDataType){
-  myComponentDataType = new char [strlen(aComponentDataType)+1];
-  strcpy( myComponentDataType, aComponentDataType);
+void SALOME_InteractiveObject::setComponentDataType(const char* aComponentDataType){
+  myComponentDataType = aComponentDataType; 
 }
 
-Standard_CString SALOME_InteractiveObject::getComponentDataType(){
-  return myComponentDataType;
+const char* SALOME_InteractiveObject::getComponentDataType(){
+  return myComponentDataType.c_str();
 }
 
-void SALOME_InteractiveObject::setName(const Standard_CString aName){
-  myName = new char [strlen(aName)+1];
-  strcpy( myName, aName);
+void SALOME_InteractiveObject::setName(const char* aName){
+  myName = aName;
 }
 
-Standard_CString SALOME_InteractiveObject::getName(){
-  return myName;
+const char* SALOME_InteractiveObject::getName(){
+  return myName.c_str();
 }
 
 Standard_Boolean SALOME_InteractiveObject::hasEntry(){
-  return !( strcmp(myEntry, "" ) == 0 );
+  return myEntry != "";
 }
 
 Standard_Boolean SALOME_InteractiveObject::isSame(const Handle(SALOME_InteractiveObject)& anIO ){
   if ( anIO->hasEntry() && this->hasEntry() ) {
-    if ( strcmp(myEntry, anIO->getEntry() ) == 0 )
+    if ( myEntry == anIO->getEntry() )
       return Standard_True;
   }
   
   return Standard_False;
 }
 
-Standard_Boolean SALOME_InteractiveObject::isComponentType(const Standard_CString ComponentDataType){
-  if ( strcmp( myComponentDataType, ComponentDataType) == 0 )
+Standard_Boolean SALOME_InteractiveObject::isComponentType(const char* ComponentDataType){
+  if ( myComponentDataType == ComponentDataType )
     return Standard_True;
   else
     return Standard_False;
@@ -108,16 +97,15 @@ Standard_Boolean SALOME_InteractiveObject::isComponentType(const Standard_CStrin
 
 Standard_Boolean SALOME_InteractiveObject::hasReference()
 {
-  return !( strcmp(myReference, "" ) == 0 );
+  return myReference != "";
 }
 
-Standard_CString SALOME_InteractiveObject::getReference()
+const char* SALOME_InteractiveObject::getReference()
 {
-  return myReference;
+  return myReference.c_str();
 }
 
-void SALOME_InteractiveObject::setReference(const Standard_CString aReference)
+void SALOME_InteractiveObject::setReference(const char* aReference)
 {
-  myReference = new char [strlen(aReference)+1];
-  strcpy( myReference, aReference);
+  myReference = aReference;
 }
index 4c22120c31de15e1054e8d74ccb602d51f8336af..91d1e5af221cab18ef1213368ddb3b081e55fb91 100644 (file)
@@ -44,6 +44,7 @@
 #include <Standard_Boolean.hxx>
 #endif
 
+#include <string>
 
 class SALOME_InteractiveObject : public MMgt_TShared {
 
@@ -64,25 +65,31 @@ public:
  // Methods PUBLIC
  // 
 Standard_EXPORT   SALOME_InteractiveObject();
-Standard_EXPORT   SALOME_InteractiveObject(const Standard_CString anEntry, 
-                                          const Standard_CString aComponentDataType,
-                                          const Standard_CString aName = "");
-Standard_EXPORT   void setEntry(const Standard_CString anEntry) ;
-Standard_EXPORT   Standard_CString getEntry() ;
-Standard_EXPORT   void setName(const Standard_CString aName) ;
-Standard_EXPORT   Standard_CString getName() ;
+Standard_EXPORT   SALOME_InteractiveObject(const char* anEntry, 
+                                          const char* aComponentDataType,
+                                          const char* aName = "");
+Standard_EXPORT   void setEntry(const char* anEntry) ;
+Standard_EXPORT   const char* getEntry() ;
+Standard_EXPORT   void setName(const char* aName) ;
+Standard_EXPORT   const char* getName() ;
 Standard_EXPORT   Standard_Boolean hasEntry() ;
 Standard_EXPORT   virtual  Standard_Boolean isSame(const Handle(SALOME_InteractiveObject)& anIO) ;
 
 Standard_EXPORT   Standard_Boolean hasReference() ;
-Standard_EXPORT   Standard_CString getReference() ;
-Standard_EXPORT   void setReference(const Standard_CString aReference) ;
+Standard_EXPORT   const char* getReference() ;
+Standard_EXPORT   void setReference(const char* aReference) ;
 
-Standard_EXPORT   void setComponentDataType(const Standard_CString ComponentDataType) ;
-Standard_EXPORT   Standard_CString getComponentDataType() ;
-Standard_EXPORT   Standard_Boolean isComponentType(const Standard_CString ComponentDataType) ;
+Standard_EXPORT   void setComponentDataType(const char* ComponentDataType) ;
+Standard_EXPORT   const char* getComponentDataType() ;
+Standard_EXPORT   Standard_Boolean isComponentType(const char* ComponentDataType) ; 
+  //Standard_EXPORT   Standard_Boolean isComponentType(std::string  ComponentDataType) ; 
+Standard_EXPORT   virtual ~SALOME_InteractiveObject();
+
+// Must be defined for using by NCollection for ceratin of data map
+friend Standard_Boolean IsEqual(const Handle(SALOME_InteractiveObject)& anIO1,
+                                const Handle(SALOME_InteractiveObject)& anIO2)
+{ return anIO1->isSame( anIO2 ); }
 
-Standard_EXPORT   ~SALOME_InteractiveObject();
 
 
 
@@ -101,10 +108,10 @@ protected:
 
  // Fields PROTECTED
  //
-Standard_CString myReference;
-Standard_CString myEntry;
-Standard_CString myName;
-Standard_CString myComponentDataType;
+  std::string myReference;
+  std::string myEntry;
+  std::string myName;
+  std::string myComponentDataType;
 
 private: 
 
index 5f466d4af9dfb3aeb3d675170777b4fbe70a1399..d42b49280640b0dc20ff93f4b75f90cab236e565 100644 (file)
@@ -9,33 +9,32 @@ VPATH=.:@srcdir@:@top_srcdir@/idl
 
 EXPORT_HEADERS = \
                  OCCViewer_AISSelector.h \
-                 OCCViewer_Selector.h \
                  OCCViewer_Viewer3d.h \
                  OCCViewer_ViewFrame.h \
                  OCCViewer_ViewPort.h \
                  OCCViewer_ViewPort3d.h \
-                 OCCViewer_VService.h 
+                 OCCViewer_VService.h \
+                 OCCViewer_Prs.h
 
 # Libraries targets
 
 LIB = libOCCViewer.la
 LIB_SRC =        OCCViewer.cxx \
-                 OCCViewer_Selector.cxx \
                  OCCViewer_Viewer3d.cxx \
                  OCCViewer_ViewFrame.cxx \
                  OCCViewer_ViewPort.cxx \
                  OCCViewer_ViewPort3d.cxx \
                  OCCViewer_AISSelector.cxx \
-                 OCCViewer_VService.cxx
+                 OCCViewer_VService.cxx \
+                  OCCViewer_Prs.cxx
 
 LIB_MOC = \
                  OCCViewer.h \
                  OCCViewer_AISSelector.h \
-                 OCCViewer_Selector.h \
                  OCCViewer_Viewer3d.h \
                  OCCViewer_ViewFrame.h \
                  OCCViewer_ViewPort.h \
-                 OCCViewer_ViewPort3d.h \
+                 OCCViewer_ViewPort3d.h
 
 LIB_CLIENT_IDL = SALOMEDS.idl \
                 SALOME_ModuleCatalog.idl \
@@ -44,7 +43,7 @@ LIB_CLIENT_IDL = SALOMEDS.idl \
 
 
 CPPFLAGS+=$(QT_INCLUDES) $(OCC_INCLUDES) $(OGL_INCLUDES) $(PYTHON_INCLUDES)
-LDFLAGS+=$(QT_MT_LIBS) $(OGL_LIBS) -lSalomeGUI
+LDFLAGS+=$(QT_MT_LIBS) $(OGL_LIBS) -lSalomePrs -lSalomeGUI
 
 
 @CONCLUDE@
index 6310f51c6c919748a3b3b0285d33296f2e49fe02..826b8d28506f8942f94c3ef8fdbf6da8f15afa9d 100644 (file)
@@ -40,7 +40,9 @@ using namespace std;
     Constructor
 */
 OCCViewer_AISSelector::OCCViewer_AISSelector( const Handle (AIS_InteractiveContext)& aisContext) :
-myAISContext ( aisContext )
+       myAISContext ( aisContext ),
+       myEnableSelection( true ),
+       myEnableMultipleSelection( true )
 {
   initialize();
 }
@@ -61,7 +63,7 @@ void OCCViewer_AISSelector::initialize()
   QAD_ASSERT_DEBUG_ONLY ( !myAISContext.IsNull() );
 
   myHilightColor = Quantity_NOC_CYAN1;
-  mySelectColor = Quantity_NOC_GRAY80;
+  mySelectColor = Quantity_NOC_WHITE;
 
   myAISContext->SetHilightColor( myHilightColor );
   myAISContext->SelectionColor( mySelectColor );
@@ -105,25 +107,13 @@ void OCCViewer_AISSelector::setContext ( const Handle (AIS_InteractiveContext)&
     'selSelectionCancel'.
     Returns 'true' if no error, 'false' otherwise.
 */
-bool OCCViewer_AISSelector::checkSelection ( AIS_StatusOfPick status, bool hadSelection, bool addTo )
+void OCCViewer_AISSelector::checkSelection ( int numSelBefore )
 {
-  myNumSelected = myAISContext->NbCurrents(); /* update after the last selection */
-
-  if ( status == AIS_SOP_NothingSelected && !hadSelection ) {
-    emit selSelectionCancel( addTo );
-  }
-  else if ( status == AIS_SOP_NothingSelected && hadSelection ) {
-    emit selSelectionCancel( addTo ); /* unselected now */
-  }
-  else if ( status == AIS_SOP_OneSelected || status == AIS_SOP_SeveralSelected )
-    {
-      //      if ( !hadSelection || status != AIS_SOP_SeveralSelected )
-      //       addTo = false;
-      //      MESSAGE (" AIS_StatusOfPick : " << AIS_SOP_OneSelected )
-
-      emit selSelectionDone( addTo ); /* selected ( the same object, may be ) */
-    }
-  return ( status != AIS_SOP_Error && status != AIS_SOP_NothingSelected );
+  int numSelAfter = numSelected();
+  if ( numSelAfter < 1 && numSelBefore > 0 )
+    emit selSelectionCancel( false );
+  else if ( numSelAfter > 0 )
+    emit selSelectionDone( numSelAfter > 1 );
 }
 
 
@@ -131,32 +121,31 @@ bool OCCViewer_AISSelector::checkSelection ( AIS_StatusOfPick status, bool hadSe
     Detects the interactive objects at position (x,y).
     Returns 'true' if no error, 'false' otherwise.
 */
-bool OCCViewer_AISSelector::moveTo ( int x, int y, const Handle (V3d_View)& view )
+void OCCViewer_AISSelector::moveTo ( int x, int y, const Handle (V3d_View)& view )
 {
   if ( !myEnableSelection )
-    return false;
+    return;
 
   QAD_ASSERT_DEBUG_ONLY ( !myAISContext.IsNull() );
-  AIS_StatusOfDetection status = AIS_SOD_Error;
-  status = myAISContext->MoveTo (x, y, view);
-
-  return ( status != AIS_SOD_Error && status != AIS_SOD_AllBad );
+  myAISContext->MoveTo (x, y, view);
 }
 
 /*!
     Selects the detected interactive objects.
     Calls checkSelection() for checking the status.
 */
-bool OCCViewer_AISSelector::select ()
+void OCCViewer_AISSelector::select ()
 {
   if ( !myEnableSelection )
-    return false;
+    return;
 
   QAD_ASSERT_DEBUG_ONLY ( !myAISContext.IsNull() );
-  bool hadSelection = ( myNumSelected > 0 );
+  int numBefore = numSelected();
 
-  /* select and send notifications */
-  return checkSelection ( myAISContext->Select(), hadSelection, false );
+  myAISContext->Select();
+
+  /* send notifications */
+  checkSelection ( numBefore );
 }
 
 /*!
@@ -164,18 +153,19 @@ bool OCCViewer_AISSelector::select ()
     Multiple selection must be enabled to get use of this function.
     Calls checkSelection() for checking the status.
 */
-bool OCCViewer_AISSelector::select ( int left, int top, int right, int bottom,
+void OCCViewer_AISSelector::select ( int left, int top, int right, int bottom,
                               const Handle (V3d_View)& view )
 {
   if ( !myEnableSelection || !myEnableMultipleSelection )
-    return false;      /* selection with rectangle is considered as multiple selection */
+    return;    /* selection with rectangle is considered as multiple selection */
 
   QAD_ASSERT_DEBUG_ONLY ( !myAISContext.IsNull() );
-  bool hadSelection = ( myNumSelected > 0 );
+  int numBefore = numSelected();
+
+  myAISContext->Select(left, top, right, bottom, view);
 
-  /* select and send notifications */
-  return checkSelection ( myAISContext->Select(left, top, right, bottom, view),
-                         hadSelection, false );
+  /* send notifications */
+  checkSelection ( numBefore );
 }
 
 /*!
@@ -183,18 +173,21 @@ bool OCCViewer_AISSelector::select ( int left, int top, int right, int bottom,
     Multiple selection must be enabled to get use of this function.
     Calls checkSelection() for checking the status.
 */
-bool OCCViewer_AISSelector::shiftSelect ()
+void OCCViewer_AISSelector::shiftSelect ()
 {
   if ( !myEnableSelection )
-    return false;
+    return;
 
   QAD_ASSERT_DEBUG_ONLY ( !myAISContext.IsNull() );
-  bool hadSelection = ( myNumSelected > 0 ); /* something was selected */
-  if ( hadSelection && !myEnableMultipleSelection)
-    return false;
+  int numBefore = numSelected();
+
+  if ( numBefore && !myEnableMultipleSelection)
+    myAISContext->Select();
+  else
+    myAISContext->ShiftSelect();
 
-  /* select and send notifications */
-  return checkSelection ( myAISContext->ShiftSelect(), hadSelection, true );
+  /* send notifications */
+  checkSelection ( numBefore );
 }
 
 /*!
@@ -203,19 +196,50 @@ bool OCCViewer_AISSelector::shiftSelect ()
     Multiple selection must be enabled to get use of this function.
     Calls checkSelection() for checking the status.
 */
-bool OCCViewer_AISSelector::shiftSelect ( int left, int top, int right, int bottom,
+void OCCViewer_AISSelector::shiftSelect ( int left, int top, int right, int bottom,
                                    const Handle (V3d_View)& view )
 
 {
   if ( !myEnableSelection || !myEnableMultipleSelection )
-    return false;      /* selection with rectangle is considered as multiple selection */
+    return;    /* selection with rectangle is considered as multiple selection */
 
   QAD_ASSERT_DEBUG_ONLY ( !myAISContext.IsNull() );
-  bool hadSelection = ( myNumSelected > 0 );                   /* something was selected */
-  if ( hadSelection && !myEnableMultipleSelection)
-    return false;
+  int numBefore = numSelected();
+
+  myAISContext->ShiftSelect(left,top,right,bottom, view);
+
+  /* send notifications */
+  checkSelection ( numBefore );
+}
+
+/*!
+    Enables/disables selection
+*/
+void OCCViewer_AISSelector::enableSelection( bool bEnable )
+{
+  myEnableSelection = bEnable;
+}
+
+/*!
+    Enables/disables multiple selection i.e
+    selection of several objects at the same time.
+    If enabled, non-multiple selection is enabled as well.
+*/
+void OCCViewer_AISSelector::enableMultipleSelection( bool bEnable )
+{
+  myEnableMultipleSelection = bEnable;
+  if ( bEnable ) myEnableSelection = bEnable;
+}
+
+/*!
+    Returns the number of selected objects.
+*/
+int OCCViewer_AISSelector::numSelected() const
+{
+  if ( myAISContext.IsNull() )
+    return 0;
 
-  /* select and send notifications */
-  return checkSelection ( myAISContext->ShiftSelect(left,top,right,bottom, view),
-                         hadSelection, true );
+  if ( myAISContext->HasOpenedContext() )
+    return myAISContext->NbSelected();
+  return myAISContext->NbCurrents();
 }
index e51a7bca5bed79962389e809443eb8be090dabf6..8a7bd6524810ab460fa48a2080f8c368e103498e 100644 (file)
 #define OCCViewer_AISSELECTOR_H
 
 #include "QAD.h"
-#include "OCCViewer_Selector.h"
+
+// QT Include
+#include <qobject.h>
 
 // Open CASCADE Includes
 #include <Quantity_NameOfColor.hxx>
 #include <AIS_InteractiveContext.hxx>
 
-class QAD_EXPORT OCCViewer_AISSelector : public OCCViewer_Selector
+class QAD_EXPORT OCCViewer_AISSelector : public QObject
 {
   Q_OBJECT
 
@@ -48,24 +50,35 @@ public:
   ~OCCViewer_AISSelector();
 
 public:
-  bool moveTo ( int, int, const Handle (V3d_View)& );
-  bool select ( int, int, int, int, const Handle (V3d_View)& );
-  bool shiftSelect ( int, int, int, int, const Handle (V3d_View)& );
-  bool select ();
-  bool shiftSelect ();
+  void moveTo ( int, int, const Handle (V3d_View)& );
+  void select ( int, int, int, int, const Handle (V3d_View)& );
+  void shiftSelect ( int, int, int, int, const Handle (V3d_View)& );
+  void select ();
+  void shiftSelect ();
 
   void setContext ( const Handle (AIS_InteractiveContext)& );
   void setHilightColor ( Quantity_NameOfColor color );
   void setSelectColor ( Quantity_NameOfColor color );
 
-protected:
-  bool checkSelection ( AIS_StatusOfPick status, bool hadSelection, bool addTo );
+  void enableSelection( bool );
+  void enableMultipleSelection( bool );
+
+signals:
+  void selSelectionDone( bool bAdded );
+  void selSelectionCancel( bool bAdded );
 
 protected:
+  void checkSelection ( int numBefore );
+  int   numSelected() const;
+
+private:
   Handle (AIS_InteractiveContext) myAISContext;          // graphic context
   Quantity_NameOfColor           myHilightColor; // color for hilight object
   Quantity_NameOfColor           mySelectColor; // color for selected object
 
+  bool                           myEnableSelection;
+  bool                           myEnableMultipleSelection;
+
 };
 
 #endif
diff --git a/src/OCCViewer/OCCViewer_Prs.cxx b/src/OCCViewer/OCCViewer_Prs.cxx
new file mode 100644 (file)
index 0000000..133bd4b
--- /dev/null
@@ -0,0 +1,112 @@
+//  SALOME OCCViewer : build OCC 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   : OCCViewer_Prs.cxx
+//  Author : Sergey ANIKIN
+//  Module : SALOME
+//  $Header$
+
+#include "OCCViewer_Prs.h"
+
+//==========================================================
+/*!
+ *  OCCViewer_Prs::OCCViewer_Prs
+ *  Default constructor
+ */
+//==========================================================
+OCCViewer_Prs::OCCViewer_Prs() 
+{
+  myToActivate = true;
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_Prs::OCCViewer_Prs
+ *  Standard constructor
+ */
+//==========================================================
+OCCViewer_Prs::OCCViewer_Prs( const Handle(AIS_InteractiveObject)& obj ) 
+{  
+  AddObject( obj ); 
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_Prs::~OCCViewer_Prs
+ *  Destructor
+ */
+//==========================================================
+OCCViewer_Prs::~OCCViewer_Prs()
+{ 
+  myObjects.Clear(); 
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_Prs::GetObjects
+ *  Get interactive objects list
+ */
+//==========================================================
+void OCCViewer_Prs::GetObjects( AIS_ListOfInteractive& list ) const 
+{ 
+  list = myObjects; 
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_Prs::AddObject
+ *  Add interactive object
+ */
+//==========================================================
+void OCCViewer_Prs::AddObject( const Handle(AIS_InteractiveObject)& obj ) 
+{ 
+  myObjects.Append( obj ); 
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_Prs::IsNull
+ *  Return 0 if list of the interactive objects is empty
+ *  [ Reimplemented from SALOME_Prs ]
+ */
+//==========================================================
+bool OCCViewer_Prs::IsNull() const 
+{ 
+  return myObjects.IsEmpty(); 
+}
+
+//=================================================================
+/*!
+ *  GEOM_Displayer::SetToActivate
+ *  This method is used for activisation/deactivisation of
+ *  objects in the moment of displaying
+*/   
+//=================================================================
+void OCCViewer_Prs::SetToActivate( const bool toActivate )
+{
+  myToActivate = toActivate;
+}
+bool OCCViewer_Prs::ToActivate() const
+{
+  return myToActivate;
+}
diff --git a/src/OCCViewer/OCCViewer_Prs.h b/src/OCCViewer/OCCViewer_Prs.h
new file mode 100644 (file)
index 0000000..c79e59e
--- /dev/null
@@ -0,0 +1,69 @@
+//  SALOME OCCViewer : build OCC 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   : OCCViewer_Prs.h
+//  Author : Sergey ANIKIN
+//  Module : SALOME
+//  $Header$
+
+#ifndef OCCVIEWER_PRS_H
+#define OCCVIEWER_PRS_H
+
+#include "SALOME_Prs.h"
+
+#include <AIS_InteractiveObject.hxx>
+#include <AIS_ListOfInteractive.hxx>
+
+class OCCViewer_Prs : public SALOME_OCCPrs
+{
+public:
+  OCCViewer_Prs();
+  // Default constructor
+  OCCViewer_Prs( const Handle(AIS_InteractiveObject)& obj );
+  // Standard constructor
+  ~OCCViewer_Prs();
+  // Destructor
+
+  void GetObjects( AIS_ListOfInteractive& list ) const;
+  // Get interactive objects list
+  void AddObject( const Handle(AIS_InteractiveObject)& obj );
+  // Add interactive object
+
+  bool IsNull() const;
+  // Reimplemented from SALOME_Prs
+
+  /* This method is used for activisation/deactivisation of
+     objects in the moment of displaying */
+  void         SetToActivate( const bool );
+  bool         ToActivate() const;
+
+private:
+  AIS_ListOfInteractive myObjects;   // list of interactive objects
+  bool                  myToActivate;
+};
+
+#endif
+
+
+
+
index 2ddc4325fc1abc068ffe48db69a951229cc378d5..b43955be1e17d8a77c95e14bf2e0dfab893cf6c9 100644 (file)
@@ -31,6 +31,7 @@ using namespace std;
 #include "OCCViewer_Viewer3d.h"
 #include "OCCViewer_ViewPort.h"
 #include "OCCViewer_ViewPort3d.h"
+#include "OCCViewer_Prs.h"
 
 #include "QAD.h"
 #include "QAD_Tools.h"
@@ -339,7 +340,8 @@ void OCCViewer_ViewFrame::onViewBack()
 void OCCViewer_ViewFrame::onViewRight()
 {
   Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
-  if ( !view3d.IsNull() ) view3d->SetProj (V3d_Yneg);
+  if ( !view3d.IsNull() )
+    view3d->SetProj( V3d_Ypos );
   onViewFitAll();
 }
 
@@ -349,7 +351,8 @@ void OCCViewer_ViewFrame::onViewRight()
 void OCCViewer_ViewFrame::onViewLeft()
 {
   Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
-  if ( !view3d.IsNull() ) view3d->SetProj (V3d_Ypos);
+  if ( !view3d.IsNull() )
+    view3d->SetProj( V3d_Yneg );
   onViewFitAll();
 }
 
@@ -415,97 +418,85 @@ void OCCViewer_ViewFrame::setPopupServer( QAD_Application* App )
   myViewer->setPopupServer( App );
 }
 
-void OCCViewer_ViewFrame::undo(SALOMEDS::Study_var aStudy,
-                                 const char* StudyFrameEntry)
+void OCCViewer_ViewFrame::undo(QAD_Study* theStudy, const char* StudyFrameEntry)
 {
+  SALOMEDS::Study_var aStudy = theStudy->getStudyDocument();
   AIS_ListOfInteractive List1;
   myViewer->getAISContext()->ObjectsInCollector(List1);
   AIS_ListIteratorOfListOfInteractive ite1(List1);
-  while (ite1.More()) {
-    if (ite1.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite1.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->hasEntry() ) { 
-         if (!QAD_ViewFrame::isInViewer(aStudy, IO->getEntry(), StudyFrameEntry))
-           myViewer->getAISContext()->Display(aSh);
-       }
-      }
+  for( ; ite1.More(); ite1.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite1.Value()->GetOwner() );
+      
+    if ( !anObj.IsNull() &&
+          anObj->hasEntry() &&
+          theStudy->isInViewer( anObj->getEntry(), StudyFrameEntry) )
+    {
+      myViewer->getAISContext()->Display( ite1.Value() );
     }
-    ite1.Next();
   }
   
   AIS_ListOfInteractive List;
   myViewer->getAISContext()->DisplayedObjects(List);
   AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->hasEntry() ) { 
-         if (!QAD_ViewFrame::isInViewer(aStudy, IO->getEntry(), StudyFrameEntry ))
-           myViewer->getAISContext()->Erase(aSh,true,true);
-       }
-      }
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() &&
+          anObj->hasEntry() &&
+          theStudy->isInViewer( anObj->getEntry(), StudyFrameEntry) )
+    {
+      myViewer->getAISContext()->Erase( ite.Value(), true, true ); 
     }
-    ite.Next();
   }
 }
 
-void OCCViewer_ViewFrame::redo(SALOMEDS::Study_var aStudy,
-                                 const char* StudyFrameEntry)
+void OCCViewer_ViewFrame::redo(QAD_Study* theStudy, const char* StudyFrameEntry)
 {
+  SALOMEDS::Study_var aStudy = theStudy->getStudyDocument();
   SALOMEDS::SObject_var RefSO;
   SALOMEDS::SObject_var SO = aStudy->FindObjectID( StudyFrameEntry );
   SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(SO);
   for (; it->More();it->Next()){
     SALOMEDS::SObject_var CSO= it->Value();
-    if (CSO->ReferencedObject(RefSO)) {
-      
+    if (CSO->ReferencedObject(RefSO))
+    {
       AIS_ListOfInteractive List;
       myViewer->getAISContext()->ObjectsInCollector(List);
+      
       AIS_ListIteratorOfListOfInteractive ite(List);
-      while (ite.More()) {
-       if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-         Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite.Value());
-         if ( aSh->hasIO() ) {
-           Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-           if ( IO->hasEntry() ) { 
-             if ( strcmp(IO->getEntry(),RefSO->GetID()) == 0 )
-               myViewer->getAISContext()->Display(aSh, false);
-           }
-         }
-       }
-       ite.Next();
+      for ( ; ite.More(); ite.Next() )
+      {
+        Handle(SALOME_InteractiveObject) anObj =
+          Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+          
+        if ( !anObj.IsNull() && anObj->hasEntry() && strcmp( anObj->getEntry(), RefSO->GetID() ) == 0 )
+          myViewer->getAISContext()->Display( ite.Value(), false );
       }
-      
     }
   }
   
   AIS_ListOfInteractive List1;
   myViewer->getAISContext()->DisplayedObjects(List1);
   AIS_ListIteratorOfListOfInteractive ite1(List1);
-  while (ite1.More()) {
-    if (ite1.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite1.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->hasEntry() ) { 
-         if (!QAD_ViewFrame::isInViewer(aStudy, IO->getEntry(), StudyFrameEntry ))
-           myViewer->getAISContext()->Erase(aSh,false,true);
-       }
-      }
-    }
-    ite1.Next();
+  for ( ; ite1.More(); ite1.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite1.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && !theStudy->isInViewer( anObj->getEntry(), StudyFrameEntry ) )
+      myViewer->getAISContext()->Erase( ite1.Value(), false, true );
   }
+  
   Repaint();
 }
 
 /* selection */
 Handle(SALOME_InteractiveObject) OCCViewer_ViewFrame::FindIObject(const char* Entry)
 {
-  Handle(SALOME_InteractiveObject) IO;
   Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
       
   AIS_ListOfInteractive List;
@@ -515,24 +506,19 @@ Handle(SALOME_InteractiveObject) OCCViewer_ViewFrame::FindIObject(const char* En
   List.Append(List1);
 
   AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh
-       = Handle(SALOME_AISShape)::DownCast(ite.Value());
-      if ( aSh->hasIO() ) {
-       IO = aSh->getIO();
-       if ( IO->hasEntry() ) {
-         if ( strcmp( IO->getEntry(), Entry ) == 0 ) {
-           MESSAGE ( "IO found")
-           return IO;
-         }
-       }
-      }
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && strcmp( anObj->getEntry(), Entry ) == 0 )
+    {
+      MESSAGE ( "IO found")
+      return anObj;
     }
-    ite.Next();
   }
   MESSAGE ( "IO not found")
-  return IO;
+  return Handle(SALOME_InteractiveObject)();
 }
 
 /* display */          
@@ -550,24 +536,21 @@ void OCCViewer_ViewFrame::Display(const Handle(SALOME_InteractiveObject)& IObjec
   ic->ObjectsInCollector(List1);
   List.Append(List1);
   
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh
-       = Handle(SALOME_AISShape)::DownCast(ite.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->isSame( IObject ) ) {
-         ic->Display(aSh, false);
-         //      ic->AddOrRemoveCurrentObject(aSh, false); repeated in Viewer3d after next statement
-         Sel->AddIObject(IO, false);
-         break;
-       }
-      }
+  AIS_ListIteratorOfListOfInteractive ite( List );
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( IObject ) )
+    {
+      ic->Display( ite.Value(), false );
+      Sel->AddIObject( anObj, false );
+      break;
     }
-    ite.Next();
   }
-  if (update)
+  
+  if ( update )
     Repaint();
 }
 
@@ -585,24 +568,27 @@ void OCCViewer_ViewFrame::DisplayOnly(const Handle(SALOME_InteractiveObject)& IO
   ic->ObjectsInCollector(List1);
   List.Append(List1);
   
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh
-       = Handle(SALOME_AISShape)::DownCast(ite.Value());
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( !IO->isSame( IObject ) ) {
-         ic->Erase(aSh, false);
-         Sel->RemoveIObject(IO, false);
-       } else {
-         ic->Display(aSh, false);
-         Sel->AddIObject(IO, false);
-       }
+  AIS_ListIteratorOfListOfInteractive ite( List );
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() )
+    {
+      if ( !anObj->isSame( IObject ) )
+      {
+        ic->Erase( ite.Value(), false );
+        Sel->RemoveIObject( anObj, false );
+      }
+      else
+      {
+        ic->Display( ite.Value(), false );
+        Sel->AddIObject( anObj, false );
       }
     }
-    ite.Next();
   }
+  
   Repaint();
 }
 void OCCViewer_ViewFrame::Erase(const Handle(SALOME_InteractiveObject)& IObject, bool update)
@@ -615,27 +601,25 @@ void OCCViewer_ViewFrame::Erase(const Handle(SALOME_InteractiveObject)& IObject,
   
   AIS_ListOfInteractive List;
   ic->DisplayedObjects(List);
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) 
+  
+  AIS_ListIteratorOfListOfInteractive ite( List );
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() )
     {
-      if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape)))
-       {
-         Handle(SALOME_AISShape) aSh
-           = Handle(SALOME_AISShape)::DownCast(ite.Value());
-         if ( aSh->hasIO() )
-           {
-             Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-             if ( IO->isSame( IObject ) )
-               {
-                 ic->Erase(aSh, false);
-                 Sel->RemoveIObject(IO, false);
-                 break;
-               }
-           }
-       }
-      ite.Next();
+      if ( anObj->isSame( IObject ) )
+      {
+        ic->Erase( ite.Value(), false );
+        Sel->RemoveIObject( anObj, false );
+        break;
+      }
     }
-  if (update)
+  }
+  
+  if ( update )
     Repaint();
 }
 
@@ -662,52 +646,308 @@ void OCCViewer_ViewFrame::Repaint()
   myViewer->getViewer3d()->Update();
 }
 
-void OCCViewer_ViewFrame::onAdjustTrihedron()
+//==========================================================
+/*!
+ *  OCCViewer_ViewFrame::getTrihedronSize
+ *  Get new an current trihedron size
+ */
+//==========================================================
+bool OCCViewer_ViewFrame::getTrihedronSize( double& theNewSize, double& theSize )
+{
+  theNewSize = 100;
+  theSize = 100;
+
+  Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
+
+  if ( view3d.IsNull() )
+    return false;
+    
+  double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0;
+  double aMaxSide;
+  double aPercents;
+
+  view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax );
+
+  if ( Xmin == RealFirst() || Ymin == RealFirst() || Zmin == RealFirst() ||
+       Xmax == RealLast()  || Ymax == RealLast()  || Zmax == RealLast() )
+    return false;
+
+  aMaxSide = Xmax - Xmin;
+  if ( aMaxSide < Ymax -Ymin ) aMaxSide = Ymax -Ymin;
+  if ( aMaxSide < Zmax -Zmin ) aMaxSide = Zmax -Zmin;
+
+  static float aSizeInPercents = 105;
+  QString aSetting = QAD_CONFIG->getSetting("Viewer:TrihedronSize");
+  if (!aSetting.isEmpty())
+    aSizeInPercents = aSetting.toFloat();
+
+  static float EPS = 5.0E-3;
+  theSize = myViewer->getTrihedron()->Size();
+  theNewSize = aMaxSide*aSizeInPercents / 100.0;
+
+  return fabs( theNewSize - theSize ) > theSize * EPS ||
+         fabs( theNewSize - theSize) > theNewSize * EPS;
+}
+
+void OCCViewer_ViewFrame::AdjustTrihedrons( const bool forced )
 {
   Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
-  
-  if (!ic->IsDisplayed(myViewer->getTrihedron())) 
+
+  if ( !myViewer->isTrihedronDisplayed() )
     return;
-  else 
+  else
+  {
+    AIS_ListOfInteractive List;
+    ic->DisplayedObjects(List);
+    if ( List.First() == List.Last() && List.First() == myViewer->getTrihedron() )
     {
-      AIS_ListOfInteractive List;
-      ic->Erase( myViewer->getTrihedron() );
-      ic->DisplayedObjects(List);
-      ic->Display( myViewer->getTrihedron() ); 
-      if (List.IsEmpty())
-       {
-         myViewer->setTrihedronSize(100);
-         return;
+      myViewer->setTrihedronSize( 100 );
+      return;
+    }
+  }
+
+  double aNewSize = 100, aSize = 100;
+  if ( getTrihedronSize( aNewSize, aSize ) || forced )
+    myViewer->setTrihedronSize( aNewSize );
+}
+
+void OCCViewer_ViewFrame::onAdjustTrihedron()
+{
+  AdjustTrihedrons( false );
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_ViewFrame::Display
+ *  Display presentation
+ */
+//==========================================================
+void OCCViewer_ViewFrame::Display( const SALOME_OCCPrs* prs )
+{
+  // try do downcast object
+  const OCCViewer_Prs* anOCCPrs = dynamic_cast<const OCCViewer_Prs*>( prs );
+  if ( !anOCCPrs || anOCCPrs->IsNull() )
+    return;
+
+  // get context
+  Handle (AIS_InteractiveContext) ic = myViewer->getAISContext();
+  // get all displayed objects
+  AIS_ListOfInteractive List;
+  ic->DisplayedObjects( List );
+  // get objects in he collector
+  AIS_ListOfInteractive ListCollector;
+  ic->ObjectsInCollector( ListCollector );
+
+  // get objects to be displayed
+  AIS_ListOfInteractive anAISObjects;
+  anOCCPrs->GetObjects( anAISObjects );
+
+  AIS_ListIteratorOfListOfInteractive aIter( anAISObjects );
+  for ( ; aIter.More(); aIter.Next() ) {
+    Handle(AIS_InteractiveObject) anAIS = aIter.Value();
+    if ( !anAIS.IsNull() ) {
+      // try to find presentation in the viewer
+      bool bDisplayed = false;
+      AIS_ListIteratorOfListOfInteractive ite( List );
+      while ( ite.More() ) {
+       // compare presentations by handles
+       // if the object is already displayed - nothing to do more
+       if ( ite.Value() == anAIS ) {
+    
+    // Deactivate object if necessary
+    if ( !anOCCPrs->ToActivate() )
+      ic->Deactivate( anAIS );
+         bDisplayed = true;
+         break;
        }
+       ite.Next();
+      }
+      if ( bDisplayed )
+       continue;
+      // then try to find presentation in the collector
+      bDisplayed = false;
+      ite.Initialize( ListCollector );
+      while ( ite.More() ) {
+       // compare presentations by handles
+       // if the object is in collector - display it
+       if ( ite.Value() == anAIS ) {
+         ic->DisplayFromCollector( anAIS, false );
+
+  // Deactivate object if necessary
+  if ( !anOCCPrs->ToActivate() )
+      ic->Deactivate( anAIS );
+         bDisplayed = true;
+         break;
+       }
+       ite.Next();
+      }
+      if ( bDisplayed )
+       continue;
+      // if object is not displayed and not found in the collector - display it
+      if ( anAIS->IsKind( STANDARD_TYPE(AIS_Trihedron) ) )
+      {
+        Handle(AIS_Trihedron) aTrh = Handle(AIS_Trihedron)::DownCast( anAIS );
+        double aNewSize = 100, aSize = 100;
+        getTrihedronSize( aNewSize, aSize );
+        aTrh->SetSize( aTrh == myViewer->getTrihedron() ? aNewSize : 0.5 * aNewSize );
+      }
+      
+      ic->Display( anAIS, false );
+
+      // Deactivate object if necessary
+      if ( !anOCCPrs->ToActivate() )
+        ic->Deactivate( anAIS );
+    }
+  }
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_ViewFrame::Erase
+ *  Erase presentation
+ */
+//==========================================================
+void OCCViewer_ViewFrame::Erase( const SALOME_OCCPrs* prs, const bool forced )
+{
+  // try do downcast object
+  const OCCViewer_Prs* anOCCPrs = dynamic_cast<const OCCViewer_Prs*>( prs );
+  if ( !anOCCPrs || anOCCPrs->IsNull() )
+    return;
+
+  // get context
+  Handle(AIS_InteractiveContext) ic = myViewer->getAISContext();
+
+  // get objects to be erased
+  AIS_ListOfInteractive anAISObjects;
+  anOCCPrs->GetObjects( anAISObjects );
+
+  AIS_ListIteratorOfListOfInteractive aIter( anAISObjects );
+  for ( ; aIter.More(); aIter.Next() ) {
+    Handle(AIS_InteractiveObject) anAIS = aIter.Value();
+    if ( !anAIS.IsNull() ) {
+      // erase the object from context : move it to collector
+      ic->Erase( anAIS, false, forced ? false : true );
+    }
+  }
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_ViewFrame::CreatePrs
+ *  Create presentation by entry
+ */
+//==========================================================
+SALOME_Prs* OCCViewer_ViewFrame::CreatePrs( const char* entry )
+{
+  OCCViewer_Prs* prs = new OCCViewer_Prs();
+  if ( entry )
+  {
+    // get context
+    Handle(AIS_InteractiveContext) ic = myViewer->getAISContext();
+
+    // get displayed objects
+    AIS_ListOfInteractive List;
+    ic->DisplayedObjects( List );
+    // get objects in the collector
+    AIS_ListOfInteractive ListCollector;
+    ic->ObjectsInCollector( ListCollector );
+    List.Append( ListCollector );
+
+    AIS_ListIteratorOfListOfInteractive ite( List );
+    for ( ; ite.More(); ite.Next() )
+    {
+      Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+      if ( !anObj.IsNull() && anObj->hasEntry() && strcmp( anObj->getEntry(), entry ) == 0 )
+        prs->AddObject( ite.Value() );
     }
+  }
+  return prs;
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_ViewFrame::LocalSelection
+ *  Activates selection of sub shapes
+ */
+//==========================================================
+void OCCViewer_ViewFrame::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode )
+{
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
   
-  Handle( V3d_View) view3d = ((OCCViewer_ViewPort3d*)myViewPort)->getView();
+  const OCCViewer_Prs* anOCCPrs = dynamic_cast<const OCCViewer_Prs*>( thePrs );
+  if ( anIC.IsNull() )
+    return;
   
-  if (!view3d.IsNull())
+  // Open local context if there is no one
+  bool allObjects = thePrs == 0 || thePrs->IsNull();
+  if ( !anIC->HasOpenedContext() ) {
+    anIC->ClearCurrents( false );
+    anIC->OpenLocalContext( allObjects, true, true );
+  }
+
+  AIS_ListOfInteractive anObjs;
+  // Get objects to be activated
+  if ( allObjects ) 
+    anIC->DisplayedObjects( anObjs );
+  else
+    anOCCPrs->GetObjects( anObjs );
+
+  // Activate selection of objects from prs
+  AIS_ListIteratorOfListOfInteractive aIter( anObjs );
+  for ( ; aIter.More(); aIter.Next() ) {
+    Handle(AIS_InteractiveObject) anAIS = aIter.Value();
+    if ( !anAIS.IsNull() )
     {
-      double Xmin=0, Ymin=0, Zmin=0, Xmax=0, Ymax=0, Zmax=0;
-      double aMaxSide; 
-      double aPercents;
-     
-      view3d->View()->MinMaxValues(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax);
-
-      if (Xmin==RealFirst() || Ymin==RealFirst() || Zmin==RealFirst() ||
-         Xmax==RealLast()  || Ymax==RealLast()  || Zmax==RealLast())
-       return;
-           
-      aMaxSide = Xmax - Xmin;
-      if (aMaxSide < Ymax -Ymin) aMaxSide = Ymax -Ymin;
-      if (aMaxSide < Zmax -Zmin) aMaxSide = Zmax -Zmin;
-      
-      static float aSizeInPercents = 105;
-      QString aSetting = QAD_CONFIG->getSetting("Viewer:TrihedronSize");
-      if (!aSetting.isEmpty()) aSizeInPercents = aSetting.toFloat();
-
-      static float EPS = 5.0E-3;
-      float aSize = myViewer->getTrihedron()->Size();
-      float aNewSize = aMaxSide*aSizeInPercents/100.0;
-      // if the new trihedron size have sufficient difference, then apply the value
-      if(fabs(aNewSize-aSize) > aSize*EPS || fabs(aNewSize-aSize) > aNewSize*EPS)
-       myViewer->setTrihedronSize(aNewSize);
+      if ( anAIS->IsKind( STANDARD_TYPE( AIS_Shape ) ) )
+      {
+        anIC->Load( anAIS, -1, false );
+        anIC->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)theMode ) );
+      }
+      else if ( anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron) )
+      {
+        anIC->Load( anAIS, -1, false );
+        anIC->Activate( anAIS, theMode );
+      }
     }
+  }
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_ViewFrame::GlobalSelection
+ *  Deactivates selection of sub shapes
+ */
+//==========================================================
+void OCCViewer_ViewFrame::GlobalSelection( const bool update ) const
+{
+  Handle(AIS_InteractiveContext) anIC = myViewer->getAISContext();
+  if ( !anIC.IsNull() )
+    anIC->CloseAllContexts( false );
+  if ( update )
+    anIC->CurrentViewer()->Redraw();
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_ViewFrame::BeforeDisplay
+ *  Axiluary method called before displaying of objects
+ */
+//==========================================================
+void  OCCViewer_ViewFrame::BeforeDisplay( SALOME_Displayer* d )
+{
+  d->BeforeDisplay( this, SALOME_OCCViewType() );
+}
+
+//==========================================================
+/*!
+ *  OCCViewer_ViewFrame::AfterDisplay
+ *  Axiluary method called after displaying of objects
+ */
+//==========================================================
+void  OCCViewer_ViewFrame::AfterDisplay( SALOME_Displayer* d )
+{
+  d->AfterDisplay( this, SALOME_OCCViewType() );
 }
+
index 46bdb4af754170a0601ebb7fb42302778c05d17e..4d29bcc441b1e4bbb6c1cad11267e21f81398ffe 100644 (file)
@@ -24,7 +24,7 @@
 //  File   : OCCViewer_ViewFrame.h
 //  Author : Nicolas REJNERI
 //  Module : SALOME
-//  $Header$
+//  $Header$           
 
 #ifndef OCCViewer_ViewFrame_H
 #define OCCViewer_ViewFrame_H
@@ -81,10 +81,8 @@ class QAD_EXPORT OCCViewer_ViewFrame : public QAD_ViewFrame
   bool              isVisible( const Handle(SALOME_InteractiveObject)& IObject );
 
   /*  undo/redo management */
-  void              undo(SALOMEDS::Study_var aStudy,
-                        const char* StudyFrameEntry);
-  void              redo(SALOMEDS::Study_var aStudy,
-                        const char* StudyFrameEntry);
+  void              undo(QAD_Study* aStudy, const char* StudyFrameEntry);
+  void              redo(QAD_Study* aStudy, const char* StudyFrameEntry);
 
   /* selection */
   Handle(SALOME_InteractiveObject) FindIObject(const char* Entry);
@@ -97,6 +95,21 @@ class QAD_EXPORT OCCViewer_ViewFrame : public QAD_ViewFrame
   void           EraseAll();
   void           Repaint();
 
+  /* Reimplemented from SALOME_View */
+  void          Display( const SALOME_OCCPrs* );
+  void          Erase( const SALOME_OCCPrs*, const bool = false );
+  SALOME_Prs*   CreatePrs( const char* entry = 0 );
+  virtual void  BeforeDisplay( SALOME_Displayer* d );
+  virtual void  AfterDisplay ( SALOME_Displayer* d );
+  virtual void  LocalSelection( const SALOME_OCCPrs*, const int );
+  virtual void  GlobalSelection( const bool = false ) const;
+
+
+  void          AdjustTrihedrons( const bool forced  = false );
+
+  // Method for activation of sub-shapes selection
+
+
  protected:    
   void              closeEvent(QCloseEvent* e);
   void              resizeEvent(QResizeEvent* e);
@@ -134,6 +147,9 @@ class QAD_EXPORT OCCViewer_ViewFrame : public QAD_ViewFrame
   void           onViewTop();
   void           onViewTrihedron(); 
   void           onAdjustTrihedron();
+
+private:
+  bool           getTrihedronSize( double& theNewSize, double& theSize ); 
  
  protected:
   OCCViewer_Viewer3d*      myViewer;    // my owner
index 1d6d410baba945ae175913993824eed26d61cfbc..695d4269226a75c43f2d8729190dd4f489fc4127 100644 (file)
@@ -26,7 +26,6 @@
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include <stdlib.h>
 
 #if !defined WNT
@@ -53,6 +52,10 @@ using namespace std;
 #include <qpixmap.h>
 #include <qintdict.h>
 
+#include "utilities.h"
+
+using namespace std;
+
 /* XPM */
 const char* imageZoomCursor[] = { 
 "32 32 3 1",
index 8d4a1331aef7589de27f25b87b090713a99df4f6..cd97a6e902f581d7894798548d19130fe64a3416 100644 (file)
@@ -56,6 +56,18 @@ using namespace std;
 #include <Geom_Axis2Placement.hxx>
 #include <AIS_ListOfInteractive.hxx>
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopExp.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+#include <NCollection_DefineBaseCollection.hxx>
+#include <NCollection_DefineDataMap.hxx>
+
+DEFINE_BASECOLLECTION( OCCViewer_CollectionOfIndexedMapOfShapes, TopTools_IndexedMapOfShape )
+DEFINE_DATAMAP( OCCViewer_MapOfIOIndexedMapOfShape, OCCViewer_CollectionOfIndexedMapOfShapes, Handle_SALOME_InteractiveObject, TopTools_IndexedMapOfShape)
+
+DEFINE_BASECOLLECTION( OCCViewer_CollectionOfMapOfInteger, TColStd_MapOfInteger )
+DEFINE_DATAMAP( OCCViewer_MapOfIOMapOfInteger, OCCViewer_CollectionOfMapOfInteger, Handle_SALOME_InteractiveObject, TColStd_MapOfInteger )
 
 /*!
     Constructor
@@ -169,9 +181,20 @@ Handle(AIS_Trihedron) OCCViewer_Viewer3d::getTrihedron() const
   return myTrihedron;
 }
 
-void OCCViewer_Viewer3d::setTrihedronSize(float size)
+void OCCViewer_Viewer3d::setTrihedronSize( float size )
 {
-  myTrihedron->SetSize(size);
+  AIS_ListOfInteractive aList;
+  myAISContext->DisplayedObjects( aList );
+  myAISContext->ObjectsInCollector( aList );
+
+  AIS_ListIteratorOfListOfInteractive anIter( aList );
+  for ( ; anIter.More(); anIter.Next() )
+  {
+    Handle(AIS_Trihedron) aTrh = Handle(AIS_Trihedron)::DownCast( anIter.Value() );
+    if ( !aTrh.IsNull() )
+      aTrh->SetSize( aTrh == myTrihedron ? size : 0.5 *size );
+  }
+
   myAISContext->UpdateCurrentViewer();
 }
 
@@ -187,21 +210,27 @@ void OCCViewer_Viewer3d::rename( const Handle(SALOME_InteractiveObject)& IObject
   myAISContext->DisplayedObjects(List);
   
   AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh =
-       Handle(SALOME_AISShape)::DownCast(ite.Value());
+  while (ite.More())
+  {
+    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape)))
+    {
+      Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast(ite.Value());
       
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->isSame( IObject ) ) {
-         aSh->setName( strdup(newName.latin1()) );
-         break;
-       }
+      if ( aSh->hasIO() )
+      {
+        Handle(SALOME_InteractiveObject) IO = aSh->getIO();
+        if ( IO->isSame( IObject ) )
+        {
+          char* aCopyName = CORBA::string_dup(newName.latin1());
+          aSh->setName( aCopyName );
+          delete( aCopyName );
+          break;
+        }
       }
-    } else if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-      Handle(SALOME_AISObject) aSh =
-       Handle(SALOME_AISObject)::DownCast(ite.Value());
+    }
+    else if ( ite.Value()->IsKind( STANDARD_TYPE( SALOME_AISObject ) ) )
+    {
+      Handle(SALOME_AISObject) aSh = Handle(SALOME_AISObject)::DownCast( ite.Value() );
 
       // Add code here, if someone create a MODULE_AISObject.
     }
@@ -216,87 +245,63 @@ void OCCViewer_Viewer3d::SetColor(const Handle(SALOME_InteractiveObject)& IObjec
   myAISContext->DisplayedObjects(List);
   
   AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh =
-       Handle(SALOME_AISShape)::DownCast(ite.Value());
-      
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->isSame( IObject ) ) {
-         Quantity_Color CSFColor = Quantity_Color ( thecolor.red()/255., thecolor.green()/255., thecolor.blue()/255., Quantity_TOC_RGB );
-         aSh->SetColor ( CSFColor );
-         //      aSh->SetShadingColor ( CSFColor );
-         break;
-       }
-      }
-    } else if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-      Handle(SALOME_AISObject) aSh =
-       Handle(SALOME_AISObject)::DownCast(ite.Value());
-      
-      // Add code here, if someone create a MODULE_AISObject.
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( IObject ) )
+    {
+      Quantity_Color CSFColor = Quantity_Color ( thecolor.red() / 255.,
+                                                 thecolor.green() / 255.,
+                                                 thecolor.blue() / 255.,
+                                                 Quantity_TOC_RGB );
+      ite.Value()->SetColor( CSFColor );
+      break;
     }
-    ite.Next();
   }
+
   myV3dViewer->Update();
 }
 
-void OCCViewer_Viewer3d::SwitchRepresentation(const Handle(SALOME_InteractiveObject)& IObject,
-                                             int mode)
+void OCCViewer_Viewer3d::SwitchRepresentation( const Handle(SALOME_InteractiveObject)& IObject,
+                                               int mode )
 {  
   AIS_ListOfInteractive List;
   myAISContext->DisplayedObjects(List);
   
   AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh =
-       Handle(SALOME_AISShape)::DownCast(ite.Value());
-      
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->isSame( IObject ) ) {
-         myAISContext->SetDisplayMode(aSh,Standard_Integer(mode),true);
-       }
-      }
-    } else if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-      Handle(SALOME_AISObject) aSh =
-       Handle(SALOME_AISObject)::DownCast(ite.Value());
-      
-      // Add code here, if someone create a MODULE_AISObject.
-    }
-    ite.Next();
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( IObject ) )
+      myAISContext->SetDisplayMode( ite.Value(), (Standard_Integer)mode ,true );
   }
+
   myV3dViewer->Update();
 }
 
-void OCCViewer_Viewer3d::SetTransparency(const Handle(SALOME_InteractiveObject)& IObject,
-                                        float transp)
+void OCCViewer_Viewer3d::SetTransparency( const Handle(SALOME_InteractiveObject)& IObject,
+                                          float transp )
 {
   AIS_ListOfInteractive List;
-  myAISContext->DisplayedObjects(List);
+  myAISContext->DisplayedObjects( List );
   
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh =
-       Handle(SALOME_AISShape)::DownCast(ite.Value());
-      
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->isSame( IObject ) ) {
-         myAISContext->SetTransparency( aSh, transp, false );
-         myAISContext->Redisplay( aSh, Standard_False, Standard_True );
-       }
-      }
-    } else if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-      Handle(SALOME_AISObject) aSh =
-       Handle(SALOME_AISObject)::DownCast(ite.Value());
-      
-      // Add code here, if someone create a MODULE_AISObject.
+  AIS_ListIteratorOfListOfInteractive ite( List );
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( IObject ) )
+    {
+      myAISContext->SetTransparency( ite.Value(), transp, false );
+      myAISContext->Redisplay( ite.Value(), Standard_False, Standard_True );
     }
-    ite.Next();
   }
+  
   myV3dViewer->Update();  
 }
 
@@ -305,38 +310,46 @@ void OCCViewer_Viewer3d::SetTransparency(const Handle(SALOME_InteractiveObject)&
 */
 bool OCCViewer_Viewer3d::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight, bool update )
 {
+  bool isInLocal = myAISContext->HasOpenedContext();
+  QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
+  SALOME_Selection* Sel = SALOME_Selection::Selection( ActiveStudy->getSelection() );
+
   AIS_ListOfInteractive List;
   myAISContext->DisplayedObjects(List);
   
   AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh =
-       Handle(SALOME_AISShape)::DownCast(ite.Value());
-      
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IO->isSame( IObject ) ) {
-         if ( highlight ) {
-           if ( !myAISContext->IsSelected(aSh) ) 
-             myAISContext->AddOrRemoveCurrentObject(aSh, false);
-         } else {
-           if ( myAISContext->IsSelected(aSh) ) 
-             myAISContext->AddOrRemoveCurrentObject(aSh, false);       
-         }      
-         break;
-       }
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
+
+    if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( IObject ) )
+    {
+      if ( !isInLocal )
+      {
+        if ( highlight && !myAISContext->IsSelected( ite.Value() ) )
+          myAISContext->AddOrRemoveCurrentObject( ite.Value(), false );
+        else if ( !highlight && myAISContext->IsSelected( ite.Value() ) )
+          myAISContext->AddOrRemoveCurrentObject( ite.Value(), false );
       }
-    } else if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-      Handle(SALOME_AISObject) aSh =
-       Handle(SALOME_AISObject)::DownCast(ite.Value());
-      
-      // Add code here, if someone create a MODULE_AISObject.
+      // highlight subshapes only when local selection is active
+      else
+      {
+        if ( ite.Value()->IsKind( STANDARD_TYPE( SALOME_AISShape ) ) )
+        {
+          Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast( ite.Value() );
+          TColStd_IndexedMapOfInteger MapIndex;
+          Sel->GetIndex( IObject, MapIndex );
+          aSh->highlightSubShapes( MapIndex, highlight );
+        }
+      }
+      break;
     }
-    ite.Next();
   }
-  if (update)
-    myV3dViewer->Update();
+    
+  if ( update )
+    myV3dViewer->Redraw();
+    
   return false;
 }
 
@@ -345,7 +358,10 @@ bool OCCViewer_Viewer3d::highlight( const Handle(SALOME_InteractiveObject)& IObj
 */
 bool OCCViewer_Viewer3d::unHighlightAll()
 {
-  myAISContext->ClearCurrents();
+  if ( myAISContext->HasOpenedContext() )
+    myAISContext->ClearSelected();
+  else
+    myAISContext->ClearCurrents();
   return false;
 }
 
@@ -364,24 +380,13 @@ bool OCCViewer_Viewer3d::isInViewer( const Handle(SALOME_InteractiveObject)& IOb
   }
 
   AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh =
-       Handle(SALOME_AISShape)::DownCast(ite.Value());
-      
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IObject->isSame( IO ) ) {
-         return true;
-       }
-      }
-    } else if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-      Handle(SALOME_AISObject) aSh =
-       Handle(SALOME_AISObject)::DownCast(ite.Value());
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
 
-      // Add code here, if someone create a MODULE_AISObject.
-    }
-    ite.Next();
+    if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( IObject ) )
+      return true;
   }
   return false;
 }
@@ -389,28 +394,18 @@ bool OCCViewer_Viewer3d::isInViewer( const Handle(SALOME_InteractiveObject)& IOb
 bool OCCViewer_Viewer3d::isVisible( const Handle(SALOME_InteractiveObject)& IObject )
 {
   AIS_ListOfInteractive List;
-  myAISContext->DisplayedObjects(List);
+  myAISContext->DisplayedObjects( List );
 
-  AIS_ListIteratorOfListOfInteractive ite(List);
-  while (ite.More()) {
-    if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-      Handle(SALOME_AISShape) aSh =
-       Handle(SALOME_AISShape)::DownCast(ite.Value());
-      
-      if ( aSh->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = aSh->getIO();
-       if ( IObject->isSame( IO ) ) {
-         return myAISContext->IsDisplayed(aSh);
-       }
-      }
-    } else if (ite.Value()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-      Handle(SALOME_AISObject) aSh =
-       Handle(SALOME_AISObject)::DownCast(ite.Value());
+  AIS_ListIteratorOfListOfInteractive ite( List );
+  for ( ; ite.More(); ite.Next() )
+  {
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
 
-      // Add code here, if someone create a MODULE_AISObject.
-    }
-    ite.Next();
+    if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( IObject ) )
+      return myAISContext->IsDisplayed( ite.Value() );
   }
+  
   return false;
 }
 
@@ -498,13 +493,11 @@ void OCCViewer_Viewer3d::onMousePress( QMouseEvent* pe )
 void OCCViewer_Viewer3d::onMouseMove( QMouseEvent* pe )
 {
   /* activate hilighting only if no MB pressed */
-  if ( pe->state() == Qt::NoButton ) 
-    {
-      QAD_Application::getDesktop()->onMouseMove( pe );
-      
-      OCCViewer_ViewPort* vp = myViewFrame->getViewPort();
-      myAISSelector->moveTo ( pe->x(), pe->y(), ((OCCViewer_ViewPort3d*)vp)->getView() );
-    }
+  if ( ! ( pe->state() & ( Qt::LeftButton | Qt::MidButton | Qt::RightButton ) ) ) {
+    QAD_Application::getDesktop()->onMouseMove( pe );
+    OCCViewer_ViewPort* vp = myViewFrame->getViewPort();
+    myAISSelector->moveTo ( pe->x(), pe->y(), ((OCCViewer_ViewPort3d*)vp)->getView() );
+  }
 }
 
 /*!
@@ -582,138 +575,247 @@ void OCCViewer_Viewer3d::onSelectionDone( bool bAdded )
 {
   emit vw3dSelectionDone( bAdded );
 
-  QAD_Study*     myActiveStudy  = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_StudyFrame* myActiveSFrame = myActiveStudy->getActiveStudyFrame();
 SALOME_Selection*        Sel  = SALOME_Selection::Selection( myActiveStudy->getSelection() );
-  MESSAGE ( "OCCViewer_Viewer3d - NB SELECTED INTERACTIVE OBJECT : " << Sel->IObjectCount() )
+//  QAD_Study*   myActiveStudy  = QAD_Application::getDesktop()->getActiveStudy();
+//  QAD_StudyFrame* myActiveSFrame = myActiveStudy->getActiveStudyFrame();
// SALOME_Selection*      Sel  = SALOME_Selection::Selection( myActiveStudy->getSelection() );
+//  MESSAGE ( "OCCViewer_Viewer3d - NB SELECTED INTERACTIVE OBJECT : " << Sel->IObjectCount() )
 
-    QString             ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
+  QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
 
-  if ( ActiveComp.isEmpty() ) {
+  if ( ActiveComp.isEmpty() )
+  {
     unHighlightAll();
     return;
   }
 
+  if ( myAISContext->IndexOfCurrentLocal() <= 0 )
+    globalSelectionDone( bAdded );
+  else
+    localSelectionDone( bAdded );
+  
+  myV3dViewer->Update();
+}
+
+/*!
+  Called when an object is selected and there is no opened local context
+*/
+void OCCViewer_Viewer3d::globalSelectionDone( const bool bAdded )
+{
+  SALOME_Selection* Sel = SALOME_Selection::Selection(
+    QAD_Application::getDesktop()->getActiveStudy()->getSelection() );
+
+  MESSAGE ( "OCCViewer_Viewer3d - NB SELECTED INTERACTIVE OBJECT : " << Sel->IObjectCount() )
+  
   SALOME_ListIO DeltaPos;
   DeltaPos.Clear();
   SALOME_ListIO DeltaNeg;
   DeltaNeg.Clear();
 
-  if ( !bAdded ) { /* select */
-    myAISContext->InitCurrent();
-    while (myAISContext->MoreCurrent()) {
-      if (myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-       Handle(SALOME_AISShape) aSh =
-         Handle(SALOME_AISShape)::DownCast(myAISContext->Current());
-       
-       if ( aSh->hasIO() ) {
-         Handle( SALOME_InteractiveObject) IO = aSh->getIO();
-       
-         bool itemAllreadySelected = false;
-         int nbSel = Sel->IObjectCount();
-         if ( nbSel == 0 ) {
-           DeltaPos.Append( IO );
-         } else {
-           SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
-           for(;It.More();It.Next()) {
-             Handle( SALOME_InteractiveObject) IO1 = It.Value();
-             if ( IO->isSame( IO1 ) ) {
-               itemAllreadySelected = true;
-               break;
-             }
-           }
-           if (!itemAllreadySelected) 
-             DeltaPos.Append( IO );
-         }
+  if ( !bAdded )
+  { 
+    for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent() )
+    {
+      Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( myAISContext->Current()->GetOwner() );
+
+      if ( !anObj.IsNull() )
+      {
+        bool itemAllreadySelected = false;
+        int nbSel = Sel->IObjectCount();
+        if ( nbSel == 0 )
+          DeltaPos.Append( anObj );
+        else
+        {
+          SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
+          for( ; It.More(); It.Next() )
+          {
+            Handle( SALOME_InteractiveObject) IO1 = It.Value();
+            if ( anObj->isSame( IO1 ) )
+            {
+              itemAllreadySelected = true;
+              break;
+            }
+          }
+          if ( !itemAllreadySelected )
+            DeltaPos.Append( anObj );
         }
-      } else if (myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-       Handle(SALOME_AISObject) aSh =
-         Handle(SALOME_AISObject)::DownCast(myAISContext->Current());
-       
-       // Add code here, if someone create a MODULE_AISObject.
       }
-      myAISContext->NextCurrent();
+      else if ( myAISContext->Current()->IsKind( STANDARD_TYPE( SALOME_AISObject ) ) )
+      {
+        //Handle(SALOME_AISObject) aSh =
+        //  Handle(SALOME_AISObject)::DownCast( myAISContext->Current() );
+        // Add code here, if someone create a MODULE_AISObject.
+      }
     }
 
     if ( DeltaPos.Extent() > 0 )
       Sel->ClearIObjects();
-    
-  } else { /* shift select */
+
+  }
+  else
+  { /* shift select */
     SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
-    for(;It.More();It.Next()) {
+    for ( ;It.More(); It.Next() )
+    {
       Handle( SALOME_InteractiveObject) IO1 = It.Value();
 
       bool itemAllreadySelected = false;
-      myAISContext->InitCurrent();
-      while (myAISContext->MoreCurrent()) {
-       if (myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-         Handle(SALOME_AISShape) aSh =
-           Handle(SALOME_AISShape)::DownCast(myAISContext->Current());
-         if ( aSh->hasIO() ) {
-           Handle( SALOME_InteractiveObject) IO = aSh->getIO();
-       
-           if ( IO->isSame( IO1 ) ) {
-             itemAllreadySelected = true;
-             break;
-           }
-         }
-       } else if (myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-         Handle(SALOME_AISObject) aSh =
-           Handle(SALOME_AISObject)::DownCast(myAISContext->Current());
-         
-         // Add code here, if someone create a MODULE_AISObject.
-       }
-       myAISContext->NextCurrent();
+      for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent() )
+      {
+        Handle(SALOME_InteractiveObject) anObj =
+          Handle(SALOME_InteractiveObject)::DownCast( myAISContext->Current()->GetOwner() );
+
+        if ( !anObj.IsNull() && anObj->isSame( IO1 ) )
+        {
+          itemAllreadySelected = true;
+          break;
+        }
+        else if ( myAISContext->Current()->IsKind( STANDARD_TYPE( SALOME_AISObject ) ) )
+        {
+          //Handle(SALOME_AISObject) aSh =
+          //  Handle(SALOME_AISObject)::DownCast(myAISContext->Current());
+          // Add code here, if someone create a MODULE_AISObject.
+        }
       }
 
-      if (!itemAllreadySelected)
-       DeltaNeg.Append( IO1 );
+      if ( !itemAllreadySelected )
+        DeltaNeg.Append( IO1 );
     }
 
     myAISContext->InitCurrent();
-    while (myAISContext->MoreCurrent()) {
-      if (myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-       Handle(SALOME_AISShape) aSh =
-         Handle(SALOME_AISShape)::DownCast(myAISContext->Current());
-       if ( aSh->hasIO() ) {
-         Handle( SALOME_InteractiveObject) IO = aSh->getIO();  
-       
-         bool itemAllreadySelected = false;
-         SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
-         for(;It.More();It.Next()) {
-           Handle( SALOME_InteractiveObject) IO1 = It.Value();
-           
-           if ( IO->isSame( IO1 ) ) {
-             itemAllreadySelected = true;
-             break;
-           }
-         }
-       
-         if (!itemAllreadySelected )
-           DeltaPos.Append( IO );
-       }
-      } else if ( myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-       Handle(SALOME_AISObject) aSh =
-         Handle(SALOME_AISObject)::DownCast(myAISContext->Current());
-
-       // Add code here, if someone create a MODULE_AISObject.
+    for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent() )
+    {
+      Handle(SALOME_InteractiveObject) anObj =
+        Handle(SALOME_InteractiveObject)::DownCast( myAISContext->Current()->GetOwner() );
+
+      if ( !anObj.IsNull() )
+      {
+        bool itemAllreadySelected = false;
+        SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
+        for ( ;It.More(); It.Next() )
+        {
+          Handle( SALOME_InteractiveObject) IO1 = It.Value();
+
+          if ( anObj->isSame( IO1 ) )
+          {
+            itemAllreadySelected = true;
+            break;
+          }
+        }
+
+        if ( !itemAllreadySelected )
+          DeltaPos.Append( anObj );
+      }
+      else if ( myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISObject)))
+      {
+        //Handle(SALOME_AISObject) aSh =
+        //  Handle(SALOME_AISObject)::DownCast(myAISContext->Current());
+        // Add code here, if someone create a MODULE_AISObject.
       }
-      myAISContext->NextCurrent();
     }
   }
-  
+
   //  MESSAGE ( "VIEWER onSelectionDone DeltaNeg.count() == " << DeltaNeg.count() )
   SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
-  for(;ItNeg.More();ItNeg.Next()) {
+  for( ;ItNeg.More();ItNeg.Next() )
+  {
     Sel->RemoveIObject( ItNeg.Value(), false );
   }
-  
+
   //  MESSAGE ( "VIEWER onSelectionDone DeltaPos.count() == " << DeltaPos.Extent() )
   SALOME_ListIteratorOfListIO ItPos( DeltaPos );
-  for(;ItPos.More();ItPos.Next()) {
+  for ( ;ItPos.More();ItPos.Next() )
+  {
     Sel->AddIObject( ItPos.Value(), false );
-  }  
-  myV3dViewer->Update();
+  }
+}
+
+/*!
+  Called when an object is selected and there is opened local context
+*/
+void OCCViewer_Viewer3d::localSelectionDone( const bool /*bAdded*/ )
+{
+  SALOME_Selection* aSelection = SALOME_Selection::Selection(
+    QAD_Application::getDesktop()->getActiveStudy()->getSelection() );
+
+  aSelection->BlockSignals( true );
+
+  OCCViewer_MapOfIOIndexedMapOfShape aMapsOfShapes;   // SALOME_InteractiveObject <--> TopTools_IndexedMapOfShape
+  OCCViewer_MapOfIOMapOfInteger      aMapsOfIndexes; // SALOME_InteractiveObject <--> TColStd_MapOfInteger
+
+
+  // Iterate through selected objects and add them to selection
+  for( myAISContext->InitSelected(); myAISContext->MoreSelected(); myAISContext->NextSelected() )
+  {
+    // Retrive selected shape and subshape
+    Handle(SelectMgr_EntityOwner) anOwner = myAISContext->SelectedOwner();
+    if ( anOwner.IsNull() )
+      continue;
+      
+    Handle(AIS_InteractiveObject) anIO =
+      Handle(AIS_InteractiveObject)::DownCast( myAISContext->SelectedInteractive() );
+    if ( anIO.IsNull() )
+      continue;
+
+    Handle(SALOME_InteractiveObject) anObj =
+      Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() );
+    if ( anObj.IsNull() )
+      continue;
+    
+    if ( anIO->IsKind( STANDARD_TYPE( AIS_Shape ) ) )
+    {
+      Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast( anIO );
+      TopoDS_Shape aShape = anAISShape->Shape();
+      TopoDS_Shape aSubShape = anOwner->Shape();
+      if ( aShape.IsNull() || aSubShape.IsNull() )
+        continue;
+
+      // Get index of selected shape
+      if ( aMapsOfShapes.IsBound( anObj ) )
+      {
+        const TopTools_IndexedMapOfShape& aShapes = aMapsOfShapes( anObj );
+        int anIndex = aShapes.FindIndex( aSubShape );
+
+        aMapsOfIndexes( anObj ).Add( anIndex );
+      }
+      else
+      {
+        TopTools_IndexedMapOfShape aShapes;
+        TopExp::MapShapes( aShape, aShapes );
+        int anIndex = aShapes.FindIndex( aSubShape );
+
+        TColStd_MapOfInteger anIndexes;
+        anIndexes.Add( anIndex );
+
+        aMapsOfShapes.Bind( anObj, aShapes );
+        aMapsOfIndexes.Bind( anObj, anIndexes );
+      }
+    }
+    else
+    {
+      aMapsOfShapes.Bind( anObj, TopTools_IndexedMapOfShape() );
+      aMapsOfIndexes.Bind( anObj, TColStd_MapOfInteger() );
+    }
+  }
+
+  // Clear selection
+  aSelection->ClearIObjects();
+
+  // Add object in selection
+  OCCViewer_MapOfIOMapOfInteger::Iterator anIter( aMapsOfIndexes );
+  for ( ; anIter.More(); anIter.Next() )
+  {
+    if ( anIter.Value().IsEmpty() )
+      aSelection->AddIObject( anIter.Key(), false );
+    else
+    {
+      aSelection->AddIObject( anIter.Key(), false );
+      aSelection->AddOrRemoveIndex( anIter.Key(), anIter.Value(), false, false );
+    }
+  }
+
+  aSelection->BlockSignals( false );
+  aSelection->SelectionChanged();
 }
 
 /*!
@@ -723,56 +825,56 @@ void OCCViewer_Viewer3d::onSelectionCancel( bool bAdded )
 {
   emit vw3dSelectionCancel();
 
-  QAD_Study*     myActiveStudy  = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_StudyFrame* myActiveSFrame = myActiveStudy->getActiveStudyFrame();
-  SALOME_Selection*        Sel  = SALOME_Selection::Selection( myActiveStudy->getSelection() );
-
-  //  MESSAGE ( "OCCViewer_Viewer3d - NB SELECTED INTERACTIVE OBJECT : " << Sel->IObjectCount() )
+  QAD_Study*  myActiveStudy     = QAD_Application::getDesktop()->getActiveStudy();
+  SALOME_Selection*  Sel        = SALOME_Selection::Selection( myActiveStudy->getSelection() );
 
   SALOME_ListIO DeltaPos;
   DeltaPos.Clear();
   SALOME_ListIO DeltaNeg;
   DeltaNeg.Clear();
-  if (!bAdded) { /* select */
+  
+  if ( !bAdded )
+  { /* select */
     Sel->ClearIObjects();
-  } else { /* shiftselect */
+  }
+  else
+  { /* shiftselect */
     SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
-    for(;It.More();It.Next()) {
+    for ( ; It.More(); It.Next() )
+    {
       Handle( SALOME_InteractiveObject) IO1 = It.Value();
 
       bool itemAllreadySelected = false;
       myAISContext->InitCurrent();
-      while (myAISContext->MoreCurrent()) {
-       if (myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISShape))) {
-         Handle(SALOME_AISShape) aSh =
-           Handle(SALOME_AISShape)::DownCast(myAISContext->Current());
-         if ( aSh->hasIO() ) {
-           Handle( SALOME_InteractiveObject) IO = aSh->getIO();        
-           if ( IO->isSame(IO1) ) {
-             itemAllreadySelected = true;
-             break;
-           }
-         }
-       } else if (myAISContext->Current()->IsKind(STANDARD_TYPE(SALOME_AISObject))) {
-         Handle(SALOME_AISObject) aSh =
-           Handle(SALOME_AISObject)::DownCast(myAISContext->Current());
-         
-         // Add code here, if someone create a MODULE_AISObject.
-       }
-       myAISContext->NextCurrent();
+      for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent() )
+      {
+        Handle(SALOME_InteractiveObject) anObj =
+          Handle(SALOME_InteractiveObject)::DownCast( myAISContext->Current()->GetOwner() );
+          
+        if ( !anObj.IsNull() && anObj->isSame( IO1 ) )
+        {
+          itemAllreadySelected = true;
+          break;
+        }
+        else if ( myAISContext->Current()->IsKind( STANDARD_TYPE( SALOME_AISObject ) ) )
+        {
+          Handle(SALOME_AISObject) aSh =
+            Handle(SALOME_AISObject)::DownCast(myAISContext->Current());
+          // Add code here, if someone create a MODULE_AISObject.
+        }
       }
       
       // only if isknown
-      if (!itemAllreadySelected)
-       DeltaNeg.Append( IO1 );
+      if ( !itemAllreadySelected )
+        DeltaNeg.Append( IO1 );
     }
   }
 
   //  MESSAGE ( "VIEWER onSelectionCancel DeltaNeg.count() == " << DeltaNeg.Extent() )
   SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
-  for(;ItNeg.More();ItNeg.Next()) {
+  for ( ; ItNeg.More(); ItNeg.Next() ) 
     Sel->RemoveIObject( ItNeg.Value(), false);
-  }
+
   myV3dViewer->Update();
 }
 
index 9cfed35a2aff35b4246000b29cb230516819adc6..dab77ab2aaf0323c4c8e86bf179a065cfce41a0d 100644 (file)
@@ -124,6 +124,11 @@ protected:
 protected:
  OCCViewer_ViewFrame*           myViewFrame;
 
+private:
+
+  void                   globalSelectionDone( const bool );
+  void                   localSelectionDone ( const bool );
+
  Handle (AIS_InteractiveContext) myAISContext;
  OCCViewer_AISSelector*                 myAISSelector;
  bool                           myEnableSelection;
diff --git a/src/PatchQt/LICENSE.QPL b/src/PatchQt/LICENSE.QPL
new file mode 100644 (file)
index 0000000..ecdad6e
--- /dev/null
@@ -0,0 +1,103 @@
+                            THE Q PUBLIC LICENSE
+                                 version 1.0
+
+                  Copyright (C) 1999-2000 Trolltech AS, Norway.
+                      Everyone is permitted to copy and
+                      distribute this license document.
+
+The intent of this license is to establish freedom to share and change the
+software regulated by this license under the open source model.
+
+This license applies to any software containing a notice placed by the
+copyright holder saying that it may be distributed under the terms of
+the Q Public License version 1.0.  Such software is herein referred to as
+the Software.  This license covers modification and distribution of the
+Software, use of third-party application programs based on the Software,
+and development of free software which uses the Software.
+
+                                Granted Rights
+
+1. You are granted the non-exclusive rights set forth in this license
+   provided you agree to and comply with any and all conditions in this
+   license.  Whole or partial distribution of the Software, or software
+   items that link with the Software, in any form signifies acceptance of
+   this license.
+
+2. You may copy and distribute the Software in unmodified form provided
+   that the entire package, including - but not restricted to - copyright,
+   trademark notices and disclaimers, as released by the initial developer
+   of the Software, is distributed.
+
+3. You may make modifications to the Software and distribute your
+   modifications, in a form that is separate from the Software, such as
+   patches. The following restrictions apply to modifications:
+
+     a. Modifications must not alter or remove any copyright notices in
+        the Software.
+
+     b. When modifications to the Software are released under this
+        license, a non-exclusive royalty-free right is granted to the
+        initial developer of the Software to distribute your modification
+        in future versions of the Software provided such versions remain
+        available under these terms in addition to any other license(s) of
+        the initial developer.
+
+4. You may distribute machine-executable forms of the Software or
+   machine-executable forms of modified versions of the Software, provided
+   that you meet these restrictions:
+
+     a. You must include this license document in the distribution.
+
+     b. You must ensure that all recipients of the machine-executable forms
+        are also able to receive the complete machine-readable source code
+        to the distributed Software, including all modifications, without
+        any charge beyond the costs of data transfer, and place prominent
+        notices in the distribution explaining this.
+
+     c. You must ensure that all modifications included in the
+        machine-executable forms are available under the terms of this
+        license.
+
+5. You may use the original or modified versions of the Software to
+   compile, link and run application programs legally developed by you
+   or by others.
+
+6. You may develop application programs, reusable components and other
+   software items that link with the original or modified versions of the
+   Software.  These items, when distributed, are subject to the following
+   requirements:
+
+     a. You must ensure that all recipients of machine-executable forms of
+        these items are also able to receive and use the complete
+        machine-readable source code to the items without any charge
+        beyond the costs of data transfer.
+
+     b. You must explicitly license all recipients of your items to use
+        and re-distribute original and modified versions of the items in
+        both machine-executable and source code forms. The recipients must
+        be able to do so without any charges whatsoever, and they must be
+        able to re-distribute to anyone they choose.
+
+
+     c. If the items are not available to the general public, and the
+        initial developer of the Software requests a copy of the items,
+        then you must supply one.
+
+                           Limitations of Liability
+
+In no event shall the initial developers or copyright holders be liable
+for any damages whatsoever, including - but not restricted to - lost
+revenue or profits or other direct, indirect, special, incidental or
+consequential damages, even if they have been advised of the possibility
+of such damages, except to the extent invariable law, if any, provides
+otherwise.
+
+                                 No Warranty
+
+The Software and this license document are provided AS IS with NO WARRANTY
+OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE.
+                                 Choice of Law
+
+This license is governed by the Laws of Norway. Disputes shall be settled
+by Oslo City Court.
index 81078aa9fdc09be431d5033965952a2cb6a7539d..d916a9a7acb7e6ceb608f175f409cf92e761afd8 100644 (file)
@@ -34,12 +34,13 @@ VPATH=.:@srcdir@:@top_srcdir@/idl
 EXPORT_HEADERS = \
        qsplitterP.h \
        qworkspaceP.h \
-       qactionP.h
+       qactionP.h \
+       qfiledialogP.h
 
 # Libraries targets
 
 LIB = libqsplitterP.la 
-LIB_SRC = qsplitterP.cxx qsplitterP_moc.cxx qworkspaceP.cxx qworkspaceP_moc.cxx qactionP.cxx qactionP_moc.cxx
+LIB_SRC = qsplitterP.cxx qsplitterP_moc.cxx qworkspaceP.cxx qworkspaceP_moc.cxx qactionP.cxx qactionP_moc.cxx qfiledialogP.cxx qfiledialogP_moc.cxx
 qsplitterP_moc.cxx: $(inc_builddir)/qsplitterP.h
        $(MOC) $(inc_builddir)/qsplitterP.h -o qsplitterP_moc.cxx
 
@@ -49,6 +50,9 @@ qworkspaceP_moc.cxx: $(inc_builddir)/qworkspaceP.h
 qactionP_moc.cxx: $(inc_builddir)/qactionP.h
        $(MOC) $(inc_builddir)/qactionP.h -o qactionP_moc.cxx
 
+qfiledialogP_moc.cxx: $(inc_builddir)/qfiledialogP.h
+       $(MOC) $(inc_builddir)/qfiledialogP.h -o qfiledialogP_moc.cxx
+
 CPPFLAGS+=$(QT_INCLUDES) -I${QTDIR}/src/kernel -I$(QTDIR)/mkspecs/linux-g++
 CXXFLAGS+=
 LDFLAGS+=$(QT_MT_LIBS) 
diff --git a/src/PatchQt/README b/src/PatchQt/README
new file mode 100644 (file)
index 0000000..4a1c1a3
--- /dev/null
@@ -0,0 +1,2 @@
+This package includes the patch for Qt toolkit.
+The files in this package are distributed under conditions of the Q Public License.
\ No newline at end of file
index 4779d3762e09b1e69349056bdf894d0a5331e49c..0d1269dac9abb0f3daf1d526c88c1e68e45899d8 100644 (file)
@@ -1,13 +1,45 @@
-//  SALOME PatchQt : patch for Qt
-//
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
-//
-//
-//
-//  File   : qactionP.cxx
-//  Author : Vadim SANDLER
-//  Module : SALOME
-//  $Header$
+/////////////////////////////////////////////////////////////////////////////
+// Module      : PatchQt
+// File        : qactionP.cxx
+// Description : the patch for Qt's QAction class (qaction.cpp)
+/////////////////////////////////////////////////////////////////////////////
+
+/****************************************************************************
+** $Id$
+**
+** Implementation of QAction class
+**
+** Created : 000000
+**
+** Copyright (C) 2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
 
 #include "qactionP.h"
 
index ecca035c7b321179531ebb4e8e51dbfc5b2b35e0..1fcf05053e73ddee4f6b18884d96bc9f06e7076b 100644 (file)
@@ -1,13 +1,45 @@
-//  SALOME PatchQt : patch for Qt
-//
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
-//
-//
-//
-//  File   : qactionP.h
-//  Author : Vadim SANDLER
-//  Module : SALOME
-//  $Header$
+/////////////////////////////////////////////////////////////////////////////
+// Module      : PatchQt
+// File        : qactionP.h
+// Description : the patch for Qt's QAction class (qaction.h)
+/////////////////////////////////////////////////////////////////////////////
+
+/****************************************************************************
+** $Id$
+**
+** Definition of QAction class
+**
+** Created : 000000
+**
+** Copyright (C) 2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
 
 #ifndef QACTIONP_H
 #define QACTIONP_H
diff --git a/src/PatchQt/qfiledialogP.cxx b/src/PatchQt/qfiledialogP.cxx
new file mode 100644 (file)
index 0000000..0b3ca63
--- /dev/null
@@ -0,0 +1,5978 @@
+/////////////////////////////////////////////////////////////////////////////
+// Module      : PatchQt
+// File        : qfiledialogP.cxx
+// Description : the patch for Qt's QFileDialog class (qfiledialog.cpp)
+/////////////////////////////////////////////////////////////////////////////
+
+/****************************************************************************
+** $Id$
+**
+** Implementation of QFileDialog class
+**
+** Created : 950429
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the dialogs module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qplatformdefs.h"
+
+// Solaris redefines connect -> __xnet_connect with _XOPEN_SOURCE_EXTENDED.
+#if defined(connect)
+#undef connect
+#endif
+
+#include "qfiledialogP.h"
+
+#ifndef QT_NO_FILEDIALOG
+
+#include "qlineedit.h"
+#include "qcombobox.h"
+#include "qlistview.h"
+#include "qlistbox.h"
+#include "qlabel.h"
+#include "qpushbutton.h"
+#include "qtoolbutton.h"
+#include "qmessagebox.h"
+#include "qapplication.h"
+#include "private/qapplication_p.h"
+#include "qlayout.h"
+#include "qbitmap.h"
+#include "qpopupmenu.h"
+#include "qwidgetstack.h"
+#include "qbuttongroup.h"
+#include "qptrvector.h"
+#include "qregexp.h"
+#include "qstrlist.h"
+#include "qtimer.h"
+#include "qvbox.h"
+#include "qhbox.h"
+#include "qtooltip.h"
+#include "qheader.h"
+#include "qdragobject.h"
+#include "qmime.h"
+#include "qprogressbar.h"
+#include "qfile.h"
+#include "qcstring.h"
+#include "qobjectlist.h"
+#include "qcheckbox.h"
+#include "qsplitter.h"
+#include "qmap.h"
+#include "qnetworkprotocol.h"
+#include "qsemimodal.h"
+#include "qpainter.h"
+#include "qcleanuphandler.h"
+#include "qstyle.h"
+#include "qcursor.h"
+
+#ifndef Q_OS_TEMP
+#include <time.h>
+#endif
+#include <ctype.h>
+#include <stdlib.h>
+
+#ifdef Q_WS_MAC
+#include "qt_mac.h"
+#undef check
+#endif
+
+#ifdef Q_WS_WIN
+#include "qt_windows.h"
+#endif
+
+/* XPM */
+static const char * const start_xpm[]={
+    "16 15 8 1",
+    "a c #cec6bd",
+    "# c #000000",
+    "e c #ffff00",
+    "b c #999999",
+    "f c #cccccc",
+    "d c #dcdcdc",
+    "c c #ffffff",
+    ". c None",
+    ".....######aaaaa",
+    "...bb#cccc##aaaa",
+    "..bcc#cccc#d#aaa",
+    ".bcef#cccc#dd#aa",
+    ".bcfe#cccc#####a",
+    ".bcef#ccccccccc#",
+    "bbbbbbbbbbbbccc#",
+    "bccccccccccbbcc#",
+    "bcefefefefee#bc#",
+    ".bcefefefefef#c#",
+    ".bcfefefefefe#c#",
+    "..bcfefefefeeb##",
+    "..bbbbbbbbbbbbb#",
+    "...#############",
+    "................"};
+
+/* XPM */
+static const char * const end_xpm[]={
+    "16 15 9 1",
+    "d c #a0a0a0",
+    "c c #c3c3c3",
+    "# c #cec6bd",
+    ". c #000000",
+    "f c #ffff00",
+    "e c #999999",
+    "g c #cccccc",
+    "b c #ffffff",
+    "a c None",
+    "......####aaaaaa",
+    ".bbbb..###aaaaaa",
+    ".bbbb.c.##aaaaaa",
+    ".bbbb....ddeeeea",
+    ".bbbbbbb.bbbbbe.",
+    ".bbbbbbb.bcfgfe.",
+    "eeeeeeeeeeeeefe.",
+    "ebbbbbbbbbbeege.",
+    "ebfgfgfgfgff.ee.",
+    "aebfgfgfgfgfg.e.",
+    "aebgfgfgfgfgf.e.",
+    "aaebgfgfgfgffe..",
+    "aaeeeeeeeeeeeee.",
+    "aaa.............",
+    "aaaaaaaaaaaaaaaa"};
+
+/* XPM */
+static const char* const open_xpm[]={
+    "16 16 6 1",
+    ". c None",
+    "b c #ffff00",
+    "d c #000000",
+    "* c #999999",
+    "c c #cccccc",
+    "a c #ffffff",
+    "................",
+    "................",
+    "...*****........",
+    "..*aaaaa*.......",
+    ".*abcbcba******.",
+    ".*acbcbcaaaaaa*d",
+    ".*abcbcbcbcbcb*d",
+    "*************b*d",
+    "*aaaaaaaaaa**c*d",
+    "*abcbcbcbcbbd**d",
+    ".*abcbcbcbcbcd*d",
+    ".*acbcbcbcbcbd*d",
+    "..*acbcbcbcbb*dd",
+    "..*************d",
+    "...ddddddddddddd",
+    "................"};
+
+/* XPM */
+static const char * const link_dir_xpm[]={
+    "16 16 10 1",
+    "h c #808080",
+    "g c #a0a0a0",
+    "d c #000000",
+    "b c #ffff00",
+    "f c #303030",
+    "# c #999999",
+    "a c #cccccc",
+    "e c #585858",
+    "c c #ffffff",
+    ". c None",
+    "................",
+    "................",
+    "..#####.........",
+    ".#ababa#........",
+    "#abababa######..",
+    "#cccccccccccc#d.",
+    "#cbababababab#d.",
+    "#cabababababa#d.",
+    "#cbababdddddddd.",
+    "#cababadccccccd.",
+    "#cbababdcececcd.",
+    "#cababadcefdfcd.",
+    "#cbababdccgdhcd.",
+    "#######dccchccd.",
+    ".dddddddddddddd.",
+    "................"};
+
+/* XPM */
+static const char * const link_file_xpm[]={
+    "16 16 10 1",
+    "h c #808080",
+    "g c #a0a0a0",
+    "d c #c3c3c3",
+    ". c #7f7f7f",
+    "c c #000000",
+    "b c #bfbfbf",
+    "f c #303030",
+    "e c #585858",
+    "a c #ffffff",
+    "# c None",
+    "################",
+    "..........######",
+    ".aaaaaaaab.#####",
+    ".aaaaaaaaba.####",
+    ".aaaaaaaacccc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaadc###",
+    ".aaaaaaaaaadc###",
+    ".aaaacccccccc###",
+    ".aaaacaaaaaac###",
+    ".aaaacaeaeaac###",
+    ".aaaacaefcfac###",
+    ".aaaacaagchac###",
+    ".ddddcaaahaac###",
+    "ccccccccccccc###"};
+
+/* XPM */
+static const char* const file_xpm[]={
+    "16 16 5 1",
+    ". c #7f7f7f",
+    "# c None",
+    "c c #000000",
+    "b c #bfbfbf",
+    "a c #ffffff",
+    "################",
+    "..........######",
+    ".aaaaaaaab.#####",
+    ".aaaaaaaaba.####",
+    ".aaaaaaaacccc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".aaaaaaaaaabc###",
+    ".bbbbbbbbbbbc###",
+    "ccccccccccccc###"};
+
+/* XPM */
+static const char * const closed_xpm[]={
+    "16 16 6 1",
+    ". c None",
+    "b c #ffff00",
+    "d c #000000",
+    "* c #999999",
+    "a c #cccccc",
+    "c c #ffffff",
+    "................",
+    "................",
+    "..*****.........",
+    ".*ababa*........",
+    "*abababa******..",
+    "*cccccccccccc*d.",
+    "*cbababababab*d.",
+    "*cabababababa*d.",
+    "*cbababababab*d.",
+    "*cabababababa*d.",
+    "*cbababababab*d.",
+    "*cabababababa*d.",
+    "*cbababababab*d.",
+    "**************d.",
+    ".dddddddddddddd.",
+    "................"};
+
+
+/* XPM */
+static const char* const cdtoparent_xpm[]={
+    "15 13 3 1",
+    ". c None",
+    "* c #000000",
+    "a c #ffff99",
+    "..*****........",
+    ".*aaaaa*.......",
+    "***************",
+    "*aaaaaaaaaaaaa*",
+    "*aaaa*aaaaaaaa*",
+    "*aaa***aaaaaaa*",
+    "*aa*****aaaaaa*",
+    "*aaaa*aaaaaaaa*",
+    "*aaaa*aaaaaaaa*",
+    "*aaaa******aaa*",
+    "*aaaaaaaaaaaaa*",
+    "*aaaaaaaaaaaaa*",
+    "***************"};
+
+
+/* XPM */
+static const char* const newfolder_xpm[] = {
+    "15 14 4 1",
+    "  c None",
+    ". c #000000",
+    "+ c #FFFF00",
+    "@ c #FFFFFF",
+    "          .    ",
+    "               ",
+    "          .    ",
+    "       .     . ",
+    "  ....  . . .  ",
+    " .+@+@.  . .   ",
+    "..........  . .",
+    ".@+@+@+@+@..   ",
+    ".+@+@+@+@+. .  ",
+    ".@+@+@+@+@.  . ",
+    ".+@+@+@+@+.    ",
+    ".@+@+@+@+@.    ",
+    ".+@+@+@+@+.    ",
+    "...........    "};
+
+/* XPM */
+static const char* const detailedview_xpm[]={
+    "14 11 3 1",
+    ". c None",
+    "* c #000000",
+    "a c #000099",
+    ".****.***.***.",
+    "..............",
+    "aaaaaaaaaaaaaa",
+    "..............",
+    ".****.***.***.",
+    "..............",
+    ".****.***.***.",
+    "..............",
+    ".****.***.***.",
+    "..............",
+    ".****.***.***."};
+
+/* XPM */
+static const char* const previewinfoview_xpm[]={
+    "13 13 4 1",
+    ". c #00007f",
+    "a c black",
+    "# c #cec6bd",
+    "b c #000000",
+    "..#####aaaaaa",
+    ".#.#bb#a#####",
+    "...####a#bbb#",
+    "#######a#####",
+    "#######a#bb##",
+    "..#####a#####",
+    ".#.#bb#a#bbb#",
+    "...####a#####",
+    "#######a#bb##",
+    "#######a#####",
+    "..#####a#bbb#",
+    ".#.#bb#a#####",
+    "...####aaaaaa"};
+
+/* XPM */
+static const char* const previewcontentsview_xpm[]={
+    "14 13 5 1",
+    ". c #00007f",
+    "a c black",
+    "c c #7f007f",
+    "# c #cec6bd",
+    "b c #000000",
+    "..#####aaaaaaa",
+    ".#.#bb#a#####a",
+    "...####a#ccc#a",
+    "#######a#ccc#a",
+    "#######a#####a",
+    "..#####a#bbb#a",
+    ".#.#bb#a#####a",
+    "...####a#bbb#a",
+    "#######a#####a",
+    "#######a#bbb#a",
+    "..#####a#####a",
+    ".#.#bb#a#####a",
+    "...####aaaaaaa"};
+
+/* XPM */
+static const char* const mclistview_xpm[]={
+    "15 11 4 1",
+    "* c None",
+    "b c #000000",
+    ". c #000099",
+    "a c #ffffff",
+    "...*****...****",
+    ".a.*bbb*.a.*bbb",
+    "...*****...****",
+    "***************",
+    "...*****...****",
+    ".a.*bbb*.a.*bbb",
+    "...*****...****",
+    "***************",
+    "...*****...****",
+    ".a.*bbb*.a.*bbb",
+    "...*****...****"};
+
+/* XPM */
+static const char * const back_xpm [] = {
+    "13 11 3 1",
+    "a c #00ffff",
+    "# c #000000",
+    ". c None",
+    ".....#.......",
+    "....##.......",
+    "...#a#.......",
+    "..#aa########",
+    ".#aaaaaaaaaa#",
+    "#aaaaaaaaaaa#",
+    ".#aaaaaaaaaa#",
+    "..#aa########",
+    "...#a#.......",
+    "....##.......",
+    ".....#......."};
+
+static QPixmap * openFolderIcon = 0;
+static QPixmap * closedFolderIcon = 0;
+static QPixmap * detailViewIcon = 0;
+static QPixmap * multiColumnListViewIcon = 0;
+static QPixmap * cdToParentIcon = 0;
+static QPixmap * newFolderIcon = 0;
+static QPixmap * fifteenTransparentPixels = 0;
+static QPixmap * symLinkDirIcon = 0;
+static QPixmap * symLinkFileIcon = 0;
+static QPixmap * fileIcon = 0;
+static QPixmap * startCopyIcon = 0;
+static QPixmap * endCopyIcon = 0;
+static QPixmap * previewContentsViewIcon = 0;
+static QPixmap * previewInfoViewIcon = 0;
+static QPixmap *goBackIcon = 0;
+static QFileIconProviderP * fileIconProvider = 0;
+static QSize *lastSize = 0;
+static QString * workingDirectory = 0;
+
+static bool bShowHiddenFiles = FALSE;
+static int sortFilesBy = (int)QDir::Name;
+static bool sortAscending = TRUE;
+static bool detailViewMode = FALSE;
+
+static QCleanupHandler<QPixmap> qfd_cleanup_pixmap;
+static QCleanupHandler<QSize> qfd_cleanup_size;
+static QCleanupHandler<QString> qfd_cleanup_string;
+
+static bool isDirectoryMode( int m )
+{
+    return m == QFileDialogP::Directory || m == QFileDialogP::DirectoryOnly;
+}
+
+#if defined(Q_WS_WIN)
+
+class QWindowsIconProvider : public QFileIconProviderP
+{
+public:
+    QWindowsIconProvider( QObject *parent=0, const char *name=0 );
+    ~QWindowsIconProvider();
+
+    const QPixmap * pixmap( const QFileInfo &fi );
+
+private:
+    QPixmap defaultFolder;
+    QPixmap defaultFile;
+    QPixmap defaultExe;
+    QPixmap pix;
+    int pixw, pixh;
+    QMap< QString, QPixmap > cache;
+};
+#endif
+
+static void makeVariables() {
+    if ( !openFolderIcon ) {
+       workingDirectory = new QString( QDir::currentDirPath() );
+       qfd_cleanup_string.add( &workingDirectory );
+
+       openFolderIcon = new QPixmap( (const char **)open_xpm);
+       qfd_cleanup_pixmap.add( &openFolderIcon );
+       symLinkDirIcon = new QPixmap( (const char **)link_dir_xpm);
+       qfd_cleanup_pixmap.add( &symLinkDirIcon );
+       symLinkFileIcon = new QPixmap( (const char **)link_file_xpm);
+       qfd_cleanup_pixmap.add( &symLinkFileIcon );
+       fileIcon = new QPixmap( (const char **)file_xpm);
+       qfd_cleanup_pixmap.add( &fileIcon );
+       closedFolderIcon = new QPixmap( (const char **)closed_xpm);
+       qfd_cleanup_pixmap.add( &closedFolderIcon );
+       detailViewIcon = new QPixmap( (const char **)detailedview_xpm);
+       qfd_cleanup_pixmap.add( &detailViewIcon );
+       multiColumnListViewIcon = new QPixmap( (const char **)mclistview_xpm);
+       qfd_cleanup_pixmap.add( &multiColumnListViewIcon );
+       cdToParentIcon = new QPixmap( (const char **)cdtoparent_xpm);
+       qfd_cleanup_pixmap.add( &cdToParentIcon );
+       newFolderIcon = new QPixmap( (const char **)newfolder_xpm);
+       qfd_cleanup_pixmap.add( &newFolderIcon );
+       previewInfoViewIcon
+           = new QPixmap( (const char **)previewinfoview_xpm );
+       qfd_cleanup_pixmap.add( &previewInfoViewIcon );
+       previewContentsViewIcon
+           = new QPixmap( (const char **)previewcontentsview_xpm );
+       qfd_cleanup_pixmap.add( &previewContentsViewIcon );
+       startCopyIcon = new QPixmap( (const char **)start_xpm );
+       qfd_cleanup_pixmap.add( &startCopyIcon );
+       endCopyIcon = new QPixmap( (const char **)end_xpm );
+       qfd_cleanup_pixmap.add( &endCopyIcon );
+       goBackIcon = new QPixmap( (const char **)back_xpm );
+       qfd_cleanup_pixmap.add( &goBackIcon );
+       fifteenTransparentPixels = new QPixmap( closedFolderIcon->width(), 1 );
+       qfd_cleanup_pixmap.add( &fifteenTransparentPixels );
+       QBitmap m( fifteenTransparentPixels->width(), 1 );
+       m.fill( Qt::color0 );
+       fifteenTransparentPixels->setMask( m );
+       bShowHiddenFiles = FALSE;
+       sortFilesBy = (int)QDir::Name;
+       detailViewMode = FALSE;
+#if defined(Q_WS_WIN)
+       if ( !fileIconProvider )
+           fileIconProvider = new QWindowsIconProvider( qApp );
+#endif
+    }
+}
+
+QFDProgressAnimation::QFDProgressAnimation( QWidget *parent )
+    : QWidget( parent, "qt_progressanimation" )
+{
+    setFixedSize( 300, 50 );
+    step = -1;
+    next();
+    timer = new QTimer( this );
+    connect( timer, SIGNAL( timeout() ),
+            this, SLOT( next() ) );
+}
+
+void QFDProgressAnimation::start()
+{
+    timer->start( 150, FALSE );
+}
+
+void QFDProgressAnimation::next()
+{
+    ++step;
+    if ( step > 10 )
+       step = 0;
+    repaint();
+}
+
+void QFDProgressAnimation::paintEvent( QPaintEvent * )
+{
+    erase();
+
+    QPainter p;
+    p.begin( this );
+    if ( step == 0 ) {
+       p.drawPixmap( 5, ( height() - startCopyIcon->height() ) / 2,
+                     *startCopyIcon );
+       p.drawPixmap( width() - 5 - openFolderIcon->width(),
+                     ( height() - openFolderIcon->height() ) / 2 , *openFolderIcon );
+    } else if ( step == 10 ) {
+       p.drawPixmap( 5, ( height() - openFolderIcon->height() ) / 2,
+                     *openFolderIcon );
+       p.drawPixmap( width() - 5 - endCopyIcon->width(),
+                     ( height() - endCopyIcon->height() ) / 2 , *endCopyIcon );
+    } else {
+       p.drawPixmap( 5, ( height() - openFolderIcon->height() ) / 2,
+                     *openFolderIcon );
+       p.drawPixmap( width() - 5 - openFolderIcon->width(),
+                     ( height() - openFolderIcon->height() ) / 2 , *openFolderIcon );
+       int x = 10 + openFolderIcon->width();
+       int w = width() - 2 * x;
+       int s = w / 9;
+       p.drawPixmap( x + s * step, ( height() - fileIcon->height() ) / 2 - fileIcon->height(),
+                     *fileIcon );
+    }
+}
+
+QFDProgressDialog::QFDProgressDialog( QWidget *parent, const QString &fn, int steps )
+    : QDialog( parent, "", TRUE )
+{
+#ifndef QT_NO_WIDGET_TOPEXTRA
+    setCaption( QFileDialogP::tr( "Copy or Move a File" ) );
+#endif
+    QVBoxLayout *layout = new QVBoxLayout( this );
+    layout->setSpacing( 5 );
+    layout->setMargin( 5 );
+
+    animation = new QFDProgressAnimation( this );
+    layout->addWidget( animation );
+
+    layout->addWidget( new QLabel( QFileDialogP::tr( "Read: %1" ).arg( fn ),
+                      this, "qt_read_lbl" ) );
+    readBar = new QProgressBar( steps, this, "qt_readbar" );
+    readBar->reset();
+    readBar->setProgress( 0 );
+    layout->addWidget( readBar );
+    writeLabel = new QLabel( QFileDialogP::tr( "Write: %1" ).arg( QString::null ),
+                            this, "qt_write_lbl" );
+    layout->addWidget( writeLabel );
+    writeBar = new QProgressBar( steps, this, "qt_writebar" );
+    writeBar->reset();
+    writeBar->setProgress( 0 );
+    layout->addWidget( writeBar );
+
+    QPushButton *b = new QPushButton( QFileDialogP::tr( "Cancel" ), this,
+                                     "qt_cancel_btn" );
+    b->setFixedSize( b->sizeHint() );
+    layout->addWidget( b );
+    connect( b, SIGNAL( clicked() ),
+            this, SIGNAL( cancelled() ) );
+
+    animation->start();
+}
+
+void QFDProgressDialog::setReadProgress( int p )
+{
+    readBar->setProgress( p );
+}
+
+void QFDProgressDialog::setWriteProgress( int p )
+{
+    writeBar->setProgress( p );
+}
+
+void QFDProgressDialog::setWriteLabel( const QString &s )
+{
+    writeLabel->setText( QFileDialogP::tr( "Write: %1" ).arg( s ) );
+}
+
+/************************************************************************
+ *
+ * Private QFileDialogP members
+ *
+ ************************************************************************/
+
+class QFileDialogPrivate {
+public:
+    ~QFileDialogPrivate();
+
+    QStringList history;
+
+    bool geometryDirty;
+    QComboBox * paths;
+    QComboBox * types;
+    QLabel * pathL;
+    QLabel * fileL;
+    QLabel * typeL;
+
+    QVBoxLayout * topLevelLayout;
+    QHBoxLayout *buttonLayout, *leftLayout, *rightLayout;
+    QPtrList<QHBoxLayout> extraWidgetsLayouts;
+    QPtrList<QLabel> extraLabels;
+    QPtrList<QWidget> extraWidgets;
+    QPtrList<QWidget> extraButtons;
+    QPtrList<QButton> toolButtons;
+
+    QWidgetStack * stack;
+
+    QToolButton * cdToParent, *newFolder, * detailView, * mcView,
+       *previewInfo, *previewContents, *goBack;
+    QButtonGroup * modeButtons;
+
+    QString currentFileName;
+    QListViewItem *last;
+
+    struct File: public QListViewItem {
+       File( QFileDialogPrivate * dlgp,
+             const QUrlInfo * fi, QListViewItem * parent )
+           : QListViewItem( parent, dlgp->last ), info( *fi ), d(dlgp), i( 0 ), hasMimePixmap( FALSE )
+       { setup(); dlgp->last = this; }
+       File( QFileDialogPrivate * dlgp,
+             const QUrlInfo * fi, QListView * parent )
+           : QListViewItem( parent, dlgp->last ), info( *fi ), d(dlgp), i( 0 ), hasMimePixmap( FALSE )
+       { setup(); dlgp->last = this; }
+       File( QFileDialogPrivate * dlgp,
+             const QUrlInfo * fi, QListView * parent, QListViewItem * after )
+           : QListViewItem( parent, after ), info( *fi ), d(dlgp), i( 0 ), hasMimePixmap( FALSE )
+       { setup(); if ( !nextSibling() ) dlgp->last = this; }
+       ~File();
+
+       QString text( int column ) const;
+       const QPixmap * pixmap( int ) const;
+
+       QUrlInfo info;
+       QFileDialogPrivate * d;
+       QListBoxItem *i;
+       bool hasMimePixmap;
+    };
+
+    class MCItem: public QListBoxItem {
+    public:
+       MCItem( QListBox *, QListViewItem * item );
+       MCItem( QListBox *, QListViewItem * item, QListBoxItem *after );
+       QString text() const;
+       const QPixmap *pixmap() const;
+       int height( const QListBox * ) const;
+       int width( const QListBox * ) const;
+       void paint( QPainter * );
+       QListViewItem * i;
+    };
+
+    class UrlInfoList : public QPtrList<QUrlInfo> {
+    public:
+       UrlInfoList() { setAutoDelete( TRUE ); }
+       int compareItems( QPtrCollection::Item n1, QPtrCollection::Item n2 ) {
+           if ( !n1 || !n2 )
+               return 0;
+
+           QUrlInfo *i1 = ( QUrlInfo *)n1;
+           QUrlInfo *i2 = ( QUrlInfo *)n2;
+
+           if ( i1->isDir() && !i2->isDir() )
+               return -1;
+           if ( !i1->isDir() && i2->isDir() )
+               return 1;
+
+           if ( i1->name() == ".." )
+               return -1;
+           if ( i2->name() == ".." )
+               return 1;
+
+#if defined(Q_OS_WIN32)
+           if ( sortFilesBy == QDir::Name ) {
+               QString name1 = i1->name().lower();
+               QString name2 = i2->name().lower();
+               return name1.compare( name2 );
+           }
+#endif
+           if ( QUrlInfo::equal( *i1, *i2, sortFilesBy ) )
+               return 0;
+           else if ( QUrlInfo::greaterThan( *i1, *i2, sortFilesBy ) )
+               return 1;
+           else if ( QUrlInfo::lessThan( *i1, *i2, sortFilesBy ) )
+               return -1;
+           // can't happen...
+           return 0;
+       }
+       QUrlInfo *operator[]( int i ) {
+           return at( i );
+       }
+    };
+
+    UrlInfoList sortedList;
+    QPtrList<File> pendingItems;
+
+    QFileListBox * moreFiles;
+
+    QFileDialogP::Mode mode;
+
+    QString rw;
+    QString ro;
+    QString wo;
+    QString inaccessible;
+
+    QString symLinkToFile;
+    QString file;
+    QString symLinkToDir;
+    QString dir;
+    QString symLinkToSpecial;
+    QString special;
+    QWidgetStack *preview;
+    bool infoPreview, contentsPreview;
+    QSplitter *splitter;
+    QUrlOperator url, oldUrl;
+    QWidget *infoPreviewWidget, *contentsPreviewWidget;
+    QFilePreviewP *infoPreviewer, *contentsPreviewer;
+    bool hadDotDot;
+
+    bool ignoreNextKeyPress;
+    // ignores the next refresh operation in case the user forced a selection
+    bool ignoreNextRefresh;
+    QFDProgressDialog *progressDia;
+    bool checkForFilter;
+    bool ignoreReturn;
+    bool ignoreStop;
+
+    QTimer *mimeTypeTimer;
+    const QNetworkOperation *currListChildren;
+
+    // this is similar to QUrl::encode but does encode "*" and
+    // doesn't encode whitespaces
+    static QString encodeFileName( const QString& fName ) {
+
+       QString newStr;
+       QCString cName = fName.utf8();
+       const QCString sChars(
+#ifdef Q_WS_WIN
+           "#%"
+#else
+           "<>#@\"&%$:,;?={}|^~[]\'`\\*"
+#endif
+           );
+
+       int len = cName.length();
+       if ( !len )
+           return QString::null;
+       for ( int i = 0; i < len ;++i ) {
+           uchar inCh = (uchar)cName[ i ];
+           if ( inCh >= 128 || sChars.contains(inCh) )
+           {
+               newStr += QChar( '%' );
+               ushort c = inCh / 16;
+               c += c > 9 ? 'A' - 10 : '0';
+               newStr += c;
+               c = inCh % 16;
+               c += c > 9 ? 'A' - 10 : '0';
+               newStr += c;
+           } else {
+               newStr += inCh;
+           }
+       }
+       return newStr;
+    }
+
+};
+
+QFileDialogPrivate::~QFileDialogPrivate()
+{
+    delete modeButtons;
+}
+
+
+
+/************************************************************************
+ *
+ * Internal class QRenameEdit
+ *
+ ************************************************************************/
+
+void QRenameEdit::keyPressEvent( QKeyEvent *e )
+{
+    if ( e->key() == Key_Escape )
+       emit escapePressed();
+    else
+       QLineEdit::keyPressEvent( e );
+    e->accept();
+}
+
+void QRenameEdit::focusOutEvent( QFocusEvent * )
+{
+    emit escapePressed();
+}
+
+/************************************************************************
+ *
+ * Internal class QFileListBox
+ *
+ ************************************************************************/
+
+QFileListBox::QFileListBox( QWidget *parent, QFileDialogP *dlg )
+    : QListBox( parent, "filelistbox" ), filedialog( dlg ),
+      renaming( FALSE ), renameItem( 0 ), mousePressed( FALSE ),
+      firstMousePressEvent( TRUE )
+{
+    changeDirTimer = new QTimer( this );
+    QVBox *box = new QVBox( viewport(), "qt_vbox" );
+    box->setFrameStyle( QFrame::Box | QFrame::Plain );
+    lined = new QRenameEdit( box );
+    lined->setFixedHeight( lined->sizeHint().height() );
+    box->hide();
+    box->setBackgroundMode( PaletteBase );
+    renameTimer = new QTimer( this );
+    connect( lined, SIGNAL( returnPressed() ),
+            this, SLOT (rename() ) );
+    connect( lined, SIGNAL( escapePressed() ),
+            this, SLOT( cancelRename() ) );
+    connect( renameTimer, SIGNAL( timeout() ),
+            this, SLOT( doubleClickTimeout() ) );
+    connect( changeDirTimer, SIGNAL( timeout() ),
+            this, SLOT( changeDirDuringDrag() ) );
+    connect( this, SIGNAL( contentsMoving( int, int ) ),
+            this, SLOT( contentsMoved( int, int ) ) );
+    viewport()->setAcceptDrops( TRUE );
+    dragItem = 0;
+}
+
+void QFileListBox::show()
+{
+    setBackgroundMode( PaletteBase );
+    viewport()->setBackgroundMode( PaletteBase );
+    QListBox::show();
+}
+
+void QFileListBox::keyPressEvent( QKeyEvent *e )
+{
+    if ( ( e->key() == Key_Enter ||
+          e->key() == Key_Return ) &&
+        renaming )
+       return;
+
+    QString keyPressed = ((QKeyEvent *)e)->text().lower();
+    QChar keyChar = keyPressed[0];
+    if ( keyChar.isLetterOrNumber() ) {
+       QListBoxItem * i = 0;
+       if ( currentItem() )
+       i = item( currentItem() );
+       else
+       i = firstItem();
+       if ( i->next() )
+       i = i->next();
+       else
+       i = firstItem();
+       while ( i != item( currentItem() ) ) {
+           QString it = text( index( i ) );
+           if ( it[0].lower() == keyChar ) {
+           clearSelection();
+           setCurrentItem( i );
+           } else {
+           if ( i->next() )
+           i = i->next();
+           else
+           i = firstItem();
+           }
+       }
+    }
+    cancelRename();
+    QListBox::keyPressEvent( e );
+}
+
+void QFileListBox::viewportMousePressEvent( QMouseEvent *e )
+{
+    pressPos = e->pos();
+    mousePressed = FALSE;
+
+    bool didRename = renaming;
+
+    cancelRename();
+    if ( !hasFocus() && !viewport()->hasFocus() )
+       setFocus();
+
+    if ( e->button() != LeftButton ) {
+       QListBox::viewportMousePressEvent( e );
+       firstMousePressEvent = FALSE;
+       return;
+    }
+
+    int i = currentItem();
+    bool wasSelected = FALSE;
+    if ( i != -1 )
+       wasSelected = item( i )->isSelected();
+    QListBox::viewportMousePressEvent( e );
+
+    QFileDialogPrivate::MCItem *i1 = (QFileDialogPrivate::MCItem*)item( currentItem() );
+    if ( i1 )
+       mousePressed = !( (QFileDialogPrivate::File*)i1->i )->info.isDir();
+
+    if ( itemAt( e->pos() ) != item( i ) ) {
+       firstMousePressEvent = FALSE;
+       return;
+    }
+
+     if ( !firstMousePressEvent && !didRename && i == currentItem() && currentItem() != -1 &&
+        wasSelected && filedialog->mode() != QFileDialogP::ExistingFiles &&
+        QUrlInfo( filedialog->d->url, "." ).isWritable() && item( currentItem() )->text() != ".." ) {
+       renameTimer->start( QApplication::doubleClickInterval(), TRUE );
+       renameItem = item( i );
+    }
+
+    firstMousePressEvent = FALSE;
+}
+
+void QFileListBox::viewportMouseReleaseEvent( QMouseEvent *e )
+{
+    dragItem = 0;
+    QListBox::viewportMouseReleaseEvent( e );
+    mousePressed = FALSE;
+}
+
+void QFileListBox::viewportMouseDoubleClickEvent( QMouseEvent *e )
+{
+    renameTimer->stop();
+    QListBox::viewportMouseDoubleClickEvent( e );
+}
+
+void QFileListBox::viewportMouseMoveEvent( QMouseEvent *e )
+{
+    if ( !dragItem )
+       dragItem = itemAt( e->pos() );
+    renameTimer->stop();
+#ifndef QT_NO_DRAGANDDROP
+    if (  ( pressPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() && mousePressed ) {
+       QListBoxItem *item = dragItem;
+       dragItem = 0;
+       if ( item ) {
+           if ( !itemRect( item ).contains( e->pos() ) )
+               return;
+           QUriDrag* drag = new QUriDrag( viewport() );
+           drag->setUnicodeUris( filedialog->selectedFiles() );
+
+           if ( lined->parentWidget()->isVisible() )
+               cancelRename();
+
+           connect( drag, SIGNAL( destroyed() ),
+                    this, SLOT( dragObjDestroyed() ) );
+           drag->drag();
+
+           mousePressed = FALSE;
+       }
+    } else
+#endif
+    {
+       QListBox::viewportMouseMoveEvent( e );
+    }
+
+}
+
+void QFileListBox::dragObjDestroyed()
+{
+#ifndef QT_NO_DRAGANDDROP
+    //#######
+    //filedialog->rereadDir();
+#endif
+}
+
+#ifndef QT_NO_DRAGANDDROP
+void QFileListBox::viewportDragEnterEvent( QDragEnterEvent *e )
+{
+    startDragUrl = filedialog->d->url;
+    startDragDir = filedialog->dirPath();
+    currDropItem = 0;
+
+    if ( !QUriDrag::canDecode( e ) ) {
+       e->ignore();
+       return;
+    }
+
+    QStringList l;
+    QUriDrag::decodeLocalFiles( e, l );
+    urls = (int)l.count();
+
+    if ( acceptDrop( e->pos(), e->source() ) ) {
+       e->accept();
+       setCurrentDropItem( e->pos() );
+    } else {
+       e->ignore();
+       setCurrentDropItem( QPoint( -1, -1 ) );
+    }
+
+    oldDragPos = e->pos();
+}
+
+void QFileListBox::viewportDragMoveEvent( QDragMoveEvent *e )
+{
+    if ( acceptDrop( e->pos(), e->source() ) ) {
+       switch ( e->action() ) {
+       case QDropEvent::Copy:
+           e->acceptAction();
+           break;
+       case QDropEvent::Move:
+           e->acceptAction();
+           break;
+       case QDropEvent::Link:
+           break;
+       default:
+           break;
+       }
+       if ( oldDragPos != e->pos() )
+           setCurrentDropItem( e->pos() );
+    } else {
+       changeDirTimer->stop();
+       e->ignore();
+       setCurrentDropItem( QPoint( -1, -1 ) );
+    }
+
+    oldDragPos = e->pos();
+}
+
+void QFileListBox::viewportDragLeaveEvent( QDragLeaveEvent * )
+{
+    changeDirTimer->stop();
+    setCurrentDropItem( QPoint( -1, -1 ) );
+//########
+//     if ( startDragDir != filedialog->d->url )
+//     filedialog->setUrl( startDragUrl );
+}
+
+void QFileListBox::viewportDropEvent( QDropEvent *e )
+{
+    changeDirTimer->stop();
+
+    if ( !QUriDrag::canDecode( e ) ) {
+       e->ignore();
+       return;
+    }
+
+    QStrList l;
+    QUriDrag::decode( e, l );
+
+    bool move = e->action() == QDropEvent::Move;
+//     bool supportAction = move || e->action() == QDropEvent::Copy;
+
+    QUrlOperator dest;
+    if ( currDropItem )
+       dest = QUrlOperator( filedialog->d->url, QFileDialogPrivate::encodeFileName( currDropItem->text() ) );
+    else
+       dest = filedialog->d->url;
+    QStringList lst;
+    for ( uint i = 0; i < l.count(); ++i ) {
+       lst << l.at( i );
+    }
+
+    filedialog->d->url.copy( lst, dest, move );
+
+    // ##### what is supportAction for?
+    e->acceptAction();
+    currDropItem = 0;
+}
+
+bool QFileListBox::acceptDrop( const QPoint &pnt, QWidget *source )
+{
+    QListBoxItem *item = itemAt( pnt );
+    if ( !item || item && !itemRect( item ).contains( pnt ) ) {
+       if ( source == viewport() && startDragDir == filedialog->dirPath() )
+           return FALSE;
+       return TRUE;
+    }
+
+    QUrlInfo fi( filedialog->d->url, item->text() );
+
+    if ( fi.isDir() && itemRect( item ).contains( pnt ) )
+       return TRUE;
+    return FALSE;
+}
+
+void QFileListBox::setCurrentDropItem( const QPoint &pnt )
+{
+    changeDirTimer->stop();
+
+    QListBoxItem *item = 0;
+    if ( pnt != QPoint( -1, -1 ) )
+       item = itemAt( pnt );
+    if ( item && !QUrlInfo( filedialog->d->url, item->text() ).isDir() )
+       item = 0;
+    if ( item && !itemRect( item ).contains( pnt ) )
+       item = 0;
+
+    currDropItem = item;
+    if ( currDropItem )
+       setCurrentItem( currDropItem );
+    changeDirTimer->start( 750 );
+}
+#endif // QT_NO_DRAGANDDROP
+
+void QFileListBox::changeDirDuringDrag()
+{
+#ifndef QT_NO_DRAGANDDROP
+    if ( !currDropItem )
+       return;
+    changeDirTimer->stop();
+    QUrl u( filedialog->d->url, QFileDialogPrivate::encodeFileName(currDropItem->text()) );
+    filedialog->setDir( u );
+    currDropItem = 0;
+#endif
+}
+
+void QFileListBox::doubleClickTimeout()
+{
+    startRename();
+    renameTimer->stop();
+}
+
+void QFileListBox::startRename( bool check )
+{
+    if ( check && ( !renameItem || renameItem != item( currentItem() ) ) )
+       return;
+
+    int i = currentItem();
+    setSelected( i, TRUE );
+    QRect r = itemRect( item( i ) );
+    int bdr = item( i )->pixmap() ?
+             item( i )->pixmap()->width() : 16;
+    int x = r.x() + bdr;
+    int y = r.y();
+    int w = item( i )->width( this ) - bdr;
+    int h = QMAX( lined->height() + 2, r.height() );
+    y = y + r.height() / 2 - h / 2;
+
+    lined->parentWidget()->setGeometry( x, y, w + 6, h );
+    lined->setFocus();
+    lined->setText( item( i )->text() );
+    lined->selectAll();
+    lined->setFrame( FALSE );
+    lined->parentWidget()->show();
+    viewport()->setFocusProxy( lined );
+    renaming = TRUE;
+}
+
+void QFileListBox::clear()
+{
+    cancelRename();
+    QListBox::clear();
+}
+
+void QFileListBox::rename()
+{
+    if ( !lined->text().isEmpty() ) {
+       QString file = currentText();
+
+       if ( lined->text() != file )
+           filedialog->d->url.rename( file, lined->text() );
+    }
+    cancelRename();
+}
+
+void QFileListBox::cancelRename()
+{
+    renameItem = 0;
+    lined->parentWidget()->hide();
+    viewport()->setFocusProxy( this );
+    renaming = FALSE;
+    updateItem( currentItem() );
+    if ( lined->hasFocus() )
+       viewport()->setFocus();
+}
+
+void QFileListBox::contentsMoved( int, int )
+{
+    changeDirTimer->stop();
+#ifndef QT_NO_DRAGANDDROP
+    setCurrentDropItem( QPoint( -1, -1 ) );
+#endif
+}
+
+/************************************************************************
+ *
+ * Internal class QFileListView
+ *
+ ************************************************************************/
+
+QFileDialogQFileListView::QFileDialogQFileListView( QWidget *parent, QFileDialogP *dlg )
+    : QListView( parent, "qt_filedlg_listview" ), renaming( FALSE ), renameItem( 0 ),
+    filedialog( dlg ), mousePressed( FALSE ),
+    firstMousePressEvent( TRUE )
+{
+    changeDirTimer = new QTimer( this );
+    QVBox *box = new QVBox( viewport(), "qt_vbox" );
+    box->setFrameStyle( QFrame::Box | QFrame::Plain );
+    lined = new QRenameEdit( box );
+    lined->setFixedHeight( lined->sizeHint().height() );
+    box->hide();
+    box->setBackgroundMode( PaletteBase );
+    renameTimer = new QTimer( this );
+    connect( lined, SIGNAL( returnPressed() ),
+            this, SLOT (rename() ) );
+    connect( lined, SIGNAL( escapePressed() ),
+            this, SLOT( cancelRename() ) );
+    header()->setMovingEnabled( FALSE );
+    connect( renameTimer, SIGNAL( timeout() ),
+            this, SLOT( doubleClickTimeout() ) );
+    connect( changeDirTimer, SIGNAL( timeout() ),
+            this, SLOT( changeDirDuringDrag() ) );
+    disconnect( header(), SIGNAL( sectionClicked( int ) ),
+               this, SLOT( changeSortColumn( int ) ) );
+    connect( header(), SIGNAL( sectionClicked( int ) ),
+            this, SLOT( changeSortColumn2( int ) ) );
+    connect( this, SIGNAL( contentsMoving( int, int ) ),
+            this, SLOT( contentsMoved( int, int ) ) );
+
+    viewport()->setAcceptDrops( TRUE );
+    sortcolumn = 0;
+    ascending = TRUE;
+    dragItem = 0;
+}
+
+void QFileDialogQFileListView::setSorting( int column, bool increasing )
+{
+    if ( column == -1 ) {
+       QListView::setSorting( column, increasing );
+       return;
+    }
+
+    sortAscending = ascending = increasing;
+    sortcolumn = column;
+    switch ( column ) {
+    case 0:
+       sortFilesBy = QDir::Name;
+       break;
+    case 1:
+       sortFilesBy = QDir::Size;
+       break;
+    case 3:
+       sortFilesBy = QDir::Time;
+       break;
+    default:
+       sortFilesBy = QDir::Name; // #### ???
+       break;
+    }
+
+    filedialog->resortDir();
+}
+
+void QFileDialogQFileListView::changeSortColumn2( int column )
+{
+    int lcol = header()->mapToLogical( column );
+    setSorting( lcol, sortcolumn == lcol ? !ascending : TRUE );
+}
+
+void QFileDialogQFileListView::keyPressEvent( QKeyEvent *e )
+{
+    if ( ( e->key() == Key_Enter ||
+          e->key() == Key_Return ) &&
+        renaming )
+       return;
+
+    QString keyPressed = e->text().lower();
+    QChar keyChar = keyPressed[0];
+    if ( keyChar.isLetterOrNumber() ) {
+       QListViewItem * i = 0;
+       if ( currentItem() )
+       i = currentItem();
+       else
+       i = firstChild();
+       if ( i->nextSibling() )
+       i = i->nextSibling();
+       else
+       i = firstChild();
+       while ( i != currentItem() ) {
+           QString it = i->text(0);
+           if ( it[0].lower() == keyChar ) {
+           clearSelection();
+           ensureItemVisible( i );
+           setCurrentItem( i );
+           } else {
+           if ( i->nextSibling() )
+           i = i->nextSibling();
+           else
+           i = firstChild();
+           }
+       }
+       return;
+    }
+
+    cancelRename();
+    QListView::keyPressEvent( e );
+}
+
+void QFileDialogQFileListView::viewportMousePressEvent( QMouseEvent *e )
+{
+    pressPos = e->pos();
+    mousePressed = FALSE;
+
+    bool didRename = renaming;
+    cancelRename();
+    if ( !hasFocus() && !viewport()->hasFocus() )
+       setFocus();
+
+    if ( e->button() != LeftButton ) {
+       QListView::viewportMousePressEvent( e );
+       firstMousePressEvent = FALSE;
+       return;
+    }
+
+    QListViewItem *i = currentItem();
+    QListView::viewportMousePressEvent( e );
+
+    QFileDialogPrivate::File *i1 = (QFileDialogPrivate::File*)currentItem();
+    if ( i1 )
+       mousePressed = !i1->info.isDir();
+
+    if ( itemAt( e->pos() ) != i ||
+        e->x() + contentsX() > columnWidth( 0 ) ) {
+       firstMousePressEvent = FALSE;
+       return;
+    }
+
+    if ( !firstMousePressEvent && !didRename && i == currentItem() && currentItem() &&
+        filedialog->mode() != QFileDialogP::ExistingFiles &&
+        QUrlInfo( filedialog->d->url, "." ).isWritable() && currentItem()->text( 0 ) != ".." ) {
+       renameTimer->start( QApplication::doubleClickInterval(), TRUE );
+       renameItem = currentItem();
+    }
+
+    firstMousePressEvent = FALSE;
+}
+
+void QFileDialogQFileListView::viewportMouseDoubleClickEvent( QMouseEvent *e )
+{
+    renameTimer->stop();
+    QListView::viewportMouseDoubleClickEvent( e );
+}
+
+void QFileDialogQFileListView::viewportMouseReleaseEvent( QMouseEvent *e )
+{
+    QListView::viewportMouseReleaseEvent( e );
+    mousePressed = FALSE;
+    dragItem = 0;
+}
+
+void QFileDialogQFileListView::viewportMouseMoveEvent( QMouseEvent *e )
+{
+    renameTimer->stop();
+    if ( !dragItem )
+       dragItem = itemAt( e->pos() );
+#ifndef QT_NO_DRAGANDDROP
+    if (  ( pressPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() && mousePressed ) {
+       QListViewItem *item = dragItem;
+       dragItem = 0;
+       if ( item ) {
+           QUriDrag* drag = new QUriDrag( viewport() );
+           drag->setUnicodeUris( filedialog->selectedFiles() );
+
+           if ( lined->isVisible() )
+               cancelRename();
+
+           connect( drag, SIGNAL( destroyed() ),
+                    this, SLOT( dragObjDestroyed() ) );
+           drag->drag();
+
+           mousePressed = FALSE;
+       }
+    }
+#endif
+}
+
+void QFileDialogQFileListView::dragObjDestroyed()
+{
+#ifndef QT_NO_DRAGANDDROP
+    //######
+    //filedialog->rereadDir();
+#endif
+}
+
+#ifndef QT_NO_DRAGANDDROP
+void QFileDialogQFileListView::viewportDragEnterEvent( QDragEnterEvent *e )
+{
+    startDragUrl = filedialog->d->url;
+    startDragDir = filedialog->dirPath();
+    currDropItem = 0;
+
+    if ( !QUriDrag::canDecode( e ) ) {
+       e->ignore();
+       return;
+    }
+
+    QStringList l;
+    QUriDrag::decodeLocalFiles( e, l );
+    urls = (int)l.count();
+
+    if ( acceptDrop( e->pos(), e->source() ) ) {
+       e->accept();
+       setCurrentDropItem( e->pos() );
+    } else {
+       e->ignore();
+       setCurrentDropItem( QPoint( -1, -1 ) );
+    }
+
+    oldDragPos = e->pos();
+}
+
+void QFileDialogQFileListView::viewportDragMoveEvent( QDragMoveEvent *e )
+{
+    if ( acceptDrop( e->pos(), e->source() ) ) {
+       if ( oldDragPos != e->pos() )
+           setCurrentDropItem( e->pos() );
+       switch ( e->action() ) {
+       case QDropEvent::Copy:
+           e->acceptAction();
+           break;
+       case QDropEvent::Move:
+           e->acceptAction();
+           break;
+       case QDropEvent::Link:
+           break;
+       default:
+           break;
+       }
+    } else {
+       changeDirTimer->stop();
+       e->ignore();
+       setCurrentDropItem( QPoint( -1, -1 ) );
+    }
+
+    oldDragPos = e->pos();
+}
+
+void QFileDialogQFileListView::viewportDragLeaveEvent( QDragLeaveEvent * )
+{
+    changeDirTimer->stop();
+    setCurrentDropItem( QPoint( -1, -1 ) );
+//########
+//     if ( startDragDir != filedialog->d->url )
+//     filedialog->setUrl( startDragUrl );
+}
+
+void QFileDialogQFileListView::viewportDropEvent( QDropEvent *e )
+{
+    changeDirTimer->stop();
+
+    if ( !QUriDrag::canDecode( e ) ) {
+       e->ignore();
+       return;
+    }
+
+    QStringList l;
+    QUriDrag::decodeToUnicodeUris( e, l );
+
+    bool move = e->action() == QDropEvent::Move;
+//     bool supportAction = move || e->action() == QDropEvent::Copy;
+
+    QUrlOperator dest;
+    if ( currDropItem )
+       dest = QUrlOperator( filedialog->d->url, QFileDialogPrivate::encodeFileName( currDropItem->text( 0 ) ) );
+    else
+       dest = filedialog->d->url;
+    filedialog->d->url.copy( l, dest, move );
+
+    // ##### what is supportAction for?
+    e->acceptAction();
+    currDropItem = 0;
+}
+
+bool QFileDialogQFileListView::acceptDrop( const QPoint &pnt, QWidget *source )
+{
+    QListViewItem *item = itemAt( pnt );
+    if ( !item || item && !itemRect( item ).contains( pnt ) ) {
+       if ( source == viewport() && startDragDir == filedialog->dirPath() )
+           return FALSE;
+       return TRUE;
+    }
+
+    QUrlInfo fi( filedialog->d->url, item->text( 0 ) );
+
+    if ( fi.isDir() && itemRect( item ).contains( pnt ) )
+       return TRUE;
+    return FALSE;
+}
+
+void QFileDialogQFileListView::setCurrentDropItem( const QPoint &pnt )
+{
+    changeDirTimer->stop();
+
+    QListViewItem *item = itemAt( pnt );
+    if ( pnt == QPoint( -1, -1 ) )
+       item = 0;
+    if ( item && !QUrlInfo( filedialog->d->url, item->text( 0 ) ).isDir() )
+       item = 0;
+
+    if ( item && !itemRect( item ).contains( pnt ) )
+       item = 0;
+
+    currDropItem = item;
+
+    if ( currDropItem )
+       setCurrentItem( currDropItem );
+
+    changeDirTimer->start( 750 );
+}
+#endif // QT_NO_DRAGANDDROP
+
+void QFileDialogQFileListView::changeDirDuringDrag()
+{
+#ifndef QT_NO_DRAGANDDROP
+    if ( !currDropItem )
+       return;
+    changeDirTimer->stop();
+    QUrl u( filedialog->d->url, QFileDialogPrivate::encodeFileName(currDropItem->text( 0 ) ) );
+    filedialog->setDir( u );
+    currDropItem = 0;
+#endif // QT_NO_DRAGANDDROP
+}
+
+
+void QFileDialogQFileListView::doubleClickTimeout()
+{
+    startRename();
+    renameTimer->stop();
+}
+
+void QFileDialogQFileListView::startRename( bool check )
+{
+    if ( check && ( !renameItem || renameItem != currentItem() ) )
+       return;
+
+    QListViewItem *i = currentItem();
+    setSelected( i, TRUE );
+
+    QRect r = itemRect( i );
+    int bdr = i->pixmap( 0 ) ?
+             i->pixmap( 0 )->width() : 16;
+    int x = r.x() + bdr;
+    int y = r.y();
+    int w = columnWidth( 0 ) - bdr;
+    int h = QMAX( lined->height() + 2, r.height() );
+    y = y + r.height() / 2 - h / 2;
+
+    lined->parentWidget()->setGeometry( x, y, w + 6, h );
+    lined->setFocus();
+    lined->setText( i->text( 0 ) );
+    lined->selectAll();
+    lined->setFrame( FALSE );
+    lined->parentWidget()->show();
+    viewport()->setFocusProxy( lined );
+    renaming = TRUE;
+}
+
+void QFileDialogQFileListView::clear()
+{
+    cancelRename();
+    QListView::clear();
+}
+
+void QFileDialogQFileListView::rename()
+{
+    if ( !lined->text().isEmpty() ) {
+       QString file = currentItem()->text( 0 );
+
+       if ( lined->text() != file )
+           filedialog->d->url.rename( file, lined->text() );
+    }
+    cancelRename();
+}
+
+void QFileDialogQFileListView::cancelRename()
+{
+    renameItem = 0;
+    lined->parentWidget()->hide();
+    viewport()->setFocusProxy( this );
+    renaming = FALSE;
+    if ( currentItem() )
+       currentItem()->repaint();
+    if ( lined->hasFocus() )
+       viewport()->setFocus();
+}
+
+void QFileDialogQFileListView::contentsMoved( int, int )
+{
+    changeDirTimer->stop();
+#ifndef QT_NO_DRAGANDDROP
+    setCurrentDropItem( QPoint( -1, -1 ) );
+#endif
+}
+
+
+QFileDialogPrivate::File::~File()
+{
+    if ( d->pendingItems.findRef( this ) )
+       d->pendingItems.removeRef( this );
+}
+
+QString QFileDialogPrivate::File::text( int column ) const
+{
+    makeVariables();
+
+    switch( column ) {
+    case 0:
+       return info.name();
+    case 1:
+       if ( info.isFile() )
+           return QString::number(info.size());
+       else
+           return QString::fromLatin1("");
+    case 2:
+       if ( info.isFile() && info.isSymLink() ) {
+           return d->symLinkToFile;
+       } else if ( info.isFile() ) {
+           return d->file;
+       } else if ( info.isDir() && info.isSymLink() ) {
+           return d->symLinkToDir;
+       } else if ( info.isDir() ) {
+           return d->dir;
+       } else if ( info.isSymLink() ) {
+           return d->symLinkToSpecial;
+       } else {
+           return d->special;
+       }
+    case 3: {
+       return info.lastModified().toString( Qt::LocalDate );
+    }
+    case 4:
+       if ( info.isReadable() )
+           return info.isWritable() ? d->rw : d->ro;
+       else
+           return info.isWritable() ? d->wo : d->inaccessible;
+    }
+
+    return QString::fromLatin1("<--->");
+}
+
+const QPixmap * QFileDialogPrivate::File::pixmap( int column ) const
+{
+    if ( column ) {
+       return 0;
+    } else if ( QListViewItem::pixmap( column ) ) {
+       return QListViewItem::pixmap( column );
+    } else if ( info.isSymLink() ) {
+       if ( info.isFile() )
+           return symLinkFileIcon;
+       else
+           return symLinkDirIcon;
+    } else if ( info.isDir() ) {
+       return closedFolderIcon;
+    } else if ( info.isFile() ) {
+       return fileIcon;
+    } else {
+       return fifteenTransparentPixels;
+    }
+}
+
+QFileDialogPrivate::MCItem::MCItem( QListBox * lb, QListViewItem * item )
+    : QListBoxItem()
+{
+    i = item;
+    if ( lb )
+       lb->insertItem( this );
+}
+
+QFileDialogPrivate::MCItem::MCItem( QListBox * lb, QListViewItem * item, QListBoxItem *after )
+    : QListBoxItem()
+{
+    i = item;
+    if ( lb )
+       lb->insertItem( this, after );
+}
+
+QString QFileDialogPrivate::MCItem::text() const
+{
+    return i->text( 0 );
+}
+
+
+const QPixmap *QFileDialogPrivate::MCItem::pixmap() const
+{
+    return i->pixmap( 0 );
+}
+
+
+int QFileDialogPrivate::MCItem::height( const QListBox * lb ) const
+{
+    if ( pixmap() )
+       return QMAX( lb->fontMetrics().height(), pixmap()->height()) + 2;
+
+    return lb->fontMetrics().height() + 2;
+}
+
+
+int QFileDialogPrivate::MCItem::width( const QListBox * lb ) const
+{
+    QFontMetrics fm = lb->fontMetrics();
+    int w = 2;
+    if ( pixmap() )
+       w += pixmap()->width() + 4;
+    else
+       w += 18;
+    w += fm.width( text() );
+    w += -fm.minLeftBearing();
+    w += -fm.minRightBearing();
+    w += 6;
+    return w;
+}
+
+
+void QFileDialogPrivate::MCItem::paint( QPainter * ptr )
+{
+    QFontMetrics fm = ptr->fontMetrics();
+
+    int h;
+
+    if ( pixmap() )
+       h = QMAX( fm.height(), pixmap()->height()) + 2;
+    else
+       h = fm.height() + 2;
+
+    const QPixmap * pm = pixmap();
+    if ( pm )
+       ptr->drawPixmap( 2, 1, *pm );
+
+    ptr->drawText( pm ? pm->width() + 4 : 22, h - fm.descent() - 2,
+                  text() );
+}
+
+static QStringList makeFiltersList( const QString &filter )
+{
+    if ( filter.isEmpty() )
+       return QStringList();
+
+    int i = filter.find( ";;", 0 );
+    QString sep( ";;" );
+    if ( i == -1 ) {
+       if ( filter.find( "\n", 0 ) != -1 ) {
+           sep = "\n";
+           i = filter.find( sep, 0 );
+       }
+    }
+
+    return QStringList::split( sep, filter );
+}
+
+/*!
+  \class QFileDialogP qfiledialog.h
+  \brief The QFileDialogP class provides dialogs that allow users to select files or directories.
+  \ingroup dialogs
+  \mainclass
+
+  The QFileDialogP class enables a user to traverse their file system in
+  order to select one or many files or a directory.
+
+  The easiest way to create a QFileDialogP is to use the static
+  functions. On Windows, these static functions will call the native
+  Windows file dialog and on Mac OS X, these static function will call
+  the native Mac OS X file dialog.
+
+  \code
+    QString s = QFileDialogP::getOpenFileName(
+                   "/home",
+                   "Images (*.png *.xpm *.jpg)",
+                   this,
+                   "open file dialog"
+                   "Choose a file" );
+  \endcode
+
+  In the above example, a modal QFileDialogP is created using a static
+  function. The startup directory is set to "/home". The file filter
+  is set to "Images (*.png *.xpm *.jpg)". The parent of the file dialog
+  is set to \e this and it is given the identification name - "open file
+  dialog". The caption at the top of file dialog is set to "Choose a
+  file".
+
+  You can create your own QFileDialogP without using the static
+  functions. By calling setMode(), you can set what can be returned by
+  the QFileDialogP.
+
+  \code
+    QFileDialogP* fd = new QFileDialogP( this, "file dialog", TRUE );
+    fd->setMode( QFileDialogP::AnyFile );
+  \endcode
+
+  In the above example, the mode of the file dialog is set to \c
+  AnyFile, meaning that the user can select any file, or even specify a
+  file that doesn't exist. This mode is useful for creating a "File Save
+  As" file dialog. Use \c ExistingFile if the user must select an
+  existing file or \c Directory if only a directory may be selected.
+  (See the \l QFileDialogP::Mode enum for the complete list of modes.)
+
+  You can retrieve the dialog's mode with mode(). Use setFilter() to set
+  the dialog's file filter, e.g.
+
+  \code
+    fd->setFilter( "Images (*.png *.xpm *.jpg)" );
+  \endcode
+
+  In the above example, the filter is set to "Images (*.png *.xpm
+  *.jpg)", this means that only files with the extension \c png, \c xpm
+  or \c jpg will be shown in the QFileDialogP. You can apply
+  several filters by using setFilters() and add additional filters with
+  addFilter(). Use setSelectedFilter() to select one of the filters
+  you've given as the file dialog's default filter. Whenever the user
+  changes the filter the filterSelected() signal is emitted.
+
+  The file dialog has two view modes, QFileDialogP::List which simply
+  lists file and directory names and QFileDialogP::Detail which
+  displays additional information alongside each name, e.g. file size,
+  modification date, etc. Set the mode with setViewMode().
+
+  \code
+    fd->setViewMode( QFileDialogP::Detail );
+  \endcode
+
+  The last important function you will need to use when creating your
+  own file dialog is selectedFile().
+
+  \code
+    QString fileName;
+    if ( fd->exec() == QDialog::Accepted )
+       fileName = fd->selectedFile();
+  \endcode
+
+  In the above example, a modal file dialog is created and shown. If
+  the user clicked OK, then the file they selected is put in \c
+  fileName.
+
+  If you are using the \c ExistingFiles mode then you will need to use
+  selectedFiles() which will return the selected files in a QStringList.
+
+  The dialog's working directory can be set with setDir(). The display
+  of hidden files is controlled with setShowHiddenFiles(). The dialog
+  can be forced to re-read the directory with rereadDir() and re-sort
+  the directory with resortDir(). All the files in the current directory
+  can be selected with selectAll().
+
+  \section1 Creating and using preview widgets
+
+  There are two kinds of preview widgets that can be used with
+  QFileDialogPs: \e content preview widgets and \e information preview
+  widgets. They are created and used in the same way except that the
+  function names differ, e.g. setContentsPreview() and setInfoPreview().
+
+  A preview widget is a widget that is placed inside a QFileDialogP so
+  that the user can see either the contents of the file, or information
+  about the file.
+
+  \code
+    class Preview : public QLabel, public QFilePreviewP
+    {
+    public:
+       Preview( QWidget *parent=0 ) : QLabel( parent ) {}
+
+       void previewUrl( const QUrl &u )
+       {
+           QString path = u.path();
+           QPixmap pix( path );
+           if ( pix.isNull() )
+               setText( "This is not a pixmap" );
+           else
+               setPixmap( pix );
+       }
+    };
+  \endcode
+
+  In the above snippet, we create a preview widget which inherits from
+  QLabel and QFilePreviewP. File preview widgets \e must inherit from
+  QFilePreviewP.
+
+  Inside the class we reimplement QFilePreviewP::previewUrl(), this is
+  where we determine what happens when a file is selected. In the
+  above example we only show a preview of the file if it is a valid
+  pixmap. Here's how to make a file dialog use a preview widget:
+
+  \code
+    Preview* p = new Preview;
+
+    QFileDialogP* fd = new QFileDialogP( this );
+    fd->setContentsPreviewEnabled( TRUE );
+    fd->setContentsPreview( p, p );
+    fd->setPreviewMode( QFileDialogP::Contents );
+    fd->show();
+  \endcode
+
+  The first line creates an instance of our preview widget. We then
+  create our file dialog and call setContentsPreviewEnabled( TRUE ),
+  this tell the file dialog to preview the contents of the currently
+  selected file. We then call setContentsPreview() -- note that we pass
+  the same preview widget twice. Finally, before showing the file
+  dialog, we call setPreviewMode() setting the mode to \e Contents which
+  will show the contents preview of the file that the user has selected.
+
+  If you create another preview widget that is used for displaying
+  information about a file, create it in the same way as the contents
+  preview widget and call setInfoPreviewEnabled(), and
+  setInfoPreview(). Then the user will be able to switch between the
+  two preview modes.
+
+  For more information about creating a QFilePreviewP widget see
+  \l{QFilePreviewP}.
+
+  <img src=qfiledlg-m.png> <img src=qfiledlg-w.png>
+
+*/
+
+
+/*! \enum QFileDialogP::Mode
+
+  This enum is used to indicate what the user may select in the file
+  dialog, i.e. what the dialog will return if the user clicks OK.
+
+  \value AnyFile  The name of a file, whether it exists or not.
+  \value ExistingFile  The name of a single existing file.
+  \value Directory  The name of a directory. Both files and directories
+  are displayed.
+  \value DirectoryOnly  The name of a directory. The file dialog will only display directories.
+  \value ExistingFiles  The names of zero or more existing files.
+
+  See setMode().
+*/
+
+/*!
+  \enum QFileDialogP::ViewMode
+
+  This enum describes the view mode of the file dialog, i.e. what
+  information about each file will be displayed.
+
+  \value List  Display file and directory names with icons.
+  \value Detail  Display file and directory names with icons plus
+  additional information, such as file size and modification date.
+
+  See setViewMode().
+*/
+
+/*!
+  \enum QFileDialogP::PreviewMode
+
+  This enum describes the preview mode of the file dialog.
+
+  \value NoPreview  No preview is shown at all.
+  \value Contents  Show a preview of the contents of the current file
+  using the contents preview widget.
+  \value Info  Show information about the current file using the
+  info preview widget.
+
+  See setPreviewMode(), setContentsPreview() and setInfoPreview().
+*/
+
+/*!
+  \fn void QFileDialogP::detailViewSelectionChanged()
+  \internal
+*/
+
+/*!
+  \fn void QFileDialogP::listBoxSelectionChanged()
+  \internal
+*/
+
+extern const char qt_file_dialog_filter_reg_exp[] =
+       "([a-zA-Z0-9 ]*)\\(([a-zA-Z0-9_.*? +;#\\[\\]]*)\\)$";
+
+/*!
+  Constructs a file dialog called \a name, with the parent, \a parent.
+  If \a modal is TRUE then the file dialog is modal; otherwise it is
+  modeless.
+*/
+
+QFileDialogP::QFileDialogP( QWidget *parent, const char *name, bool modal )
+    : QDialog( parent, name, modal,
+              (modal ?
+               (WStyle_Customize | WStyle_DialogBorder | WStyle_Title | WStyle_SysMenu) : 0) )
+{
+    init();
+    d->mode = ExistingFile;
+    d->types->insertItem( tr( "All Files (*)" ) );
+    emit dirEntered( d->url.dirPath() );
+    rereadDir();
+}
+
+
+/*!
+  Constructs a file dialog called \a name with the parent, \a parent.
+  If \a modal is TRUE then the file dialog is modal; otherwise it is
+  modeless.
+
+  If \a dirName is specified then it will be used as the dialog's
+  working directory, i.e. it will be the directory that is shown when
+  the dialog appears. If \a filter is specified it will be used as the
+  dialog's file filter.
+
+*/
+
+QFileDialogP::QFileDialogP( const QString& dirName, const QString & filter,
+                         QWidget *parent, const char *name, bool modal )
+    : QDialog( parent, name, modal,
+              (modal ?
+               (WStyle_Customize | WStyle_DialogBorder | WStyle_Title | WStyle_SysMenu) : 0) )
+{
+    init();
+    d->mode = ExistingFile;
+    rereadDir();
+    if ( !dirName.isEmpty() )
+       setSelection( dirName );
+    else if ( workingDirectory && !workingDirectory->isEmpty() )
+       setDir( *workingDirectory );
+
+    if ( !filter.isEmpty() ) {
+       setFilters( filter );
+       if ( !dirName.isEmpty() ) {
+           int dotpos = dirName.find( QChar('.'), 0, FALSE );
+           if ( dotpos != -1 ) {
+               for ( int b=0 ; b<d->types->count() ; b++ ) {
+                   if ( d->types->text(b).contains( dirName.right( dirName.length() - dotpos ) ) ) {
+                       d->types->setCurrentItem( b );
+                       setFilter( d->types->text( b ) );
+                       return;
+                   }
+               }
+           }
+       }
+    } else {
+       d->types->insertItem( tr( "All Files (*)" ) );
+    }
+}
+
+
+/*!
+  \internal
+  Initializes the file dialog.
+*/
+
+void QFileDialogP::init()
+{
+    setSizeGripEnabled( TRUE );
+    d = new QFileDialogPrivate();
+    d->mode = AnyFile;
+    d->last = 0;
+    d->moreFiles = 0;
+    d->infoPreview = FALSE;
+    d->contentsPreview = FALSE;
+    d->hadDotDot = FALSE;
+    d->ignoreNextKeyPress = FALSE;
+    d->progressDia = 0;
+    d->checkForFilter = FALSE;
+    d->ignoreReturn = FALSE;
+    d->ignoreNextRefresh = FALSE;
+    d->ignoreStop = FALSE;
+    d->pendingItems.setAutoDelete( FALSE );
+    d->mimeTypeTimer = new QTimer( this );
+    connect( d->mimeTypeTimer, SIGNAL( timeout() ),
+            this, SLOT( doMimeTypeLookup() ) );
+
+    d->url = QUrlOperator( QDir::currentDirPath() );
+    d->oldUrl = d->url;
+    d->currListChildren = 0;
+
+    connect( &d->url, SIGNAL( start( QNetworkOperation * ) ),
+            this, SLOT( urlStart( QNetworkOperation * ) ) );
+    connect( &d->url, SIGNAL( finished( QNetworkOperation * ) ),
+            this, SLOT( urlFinished( QNetworkOperation * ) ) );
+    connect( &d->url, SIGNAL( newChildren( const QValueList<QUrlInfo> &, QNetworkOperation * ) ),
+            this, SLOT( insertEntry( const QValueList<QUrlInfo> &, QNetworkOperation * ) ) );
+    connect( &d->url, SIGNAL( removed( QNetworkOperation * ) ),
+            this, SLOT( removeEntry( QNetworkOperation * ) ) );
+    connect( &d->url, SIGNAL( createdDirectory( const QUrlInfo &, QNetworkOperation * ) ),
+            this, SLOT( createdDirectory( const QUrlInfo &, QNetworkOperation * ) ) );
+    connect( &d->url, SIGNAL( itemChanged( QNetworkOperation * ) ),
+            this, SLOT( itemChanged( QNetworkOperation * ) ) );
+    connect( &d->url, SIGNAL( dataTransferProgress( int, int, QNetworkOperation * ) ),
+            this, SLOT( dataTransferProgress( int, int, QNetworkOperation * ) ) );
+
+    nameEdit = new QLineEdit( this, "name/filter editor" );
+    nameEdit->setMaxLength( 255 ); //_POSIX_MAX_PATH
+    connect( nameEdit, SIGNAL(textChanged(const QString&)),
+            this,  SLOT(fileNameEditDone()) );
+    nameEdit->installEventFilter( this );
+
+    d->splitter = new QSplitter( this, "qt_splitter" );
+
+    d->stack = new QWidgetStack( d->splitter, "files and more files" );
+
+    d->splitter->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
+
+    files = new QFileDialogQFileListView( d->stack, this );
+    QFontMetrics fm = fontMetrics();
+    files->addColumn( tr("Name") );
+    files->addColumn( tr("Size") );
+    files->setColumnAlignment( 1, AlignRight );
+    files->addColumn( tr("Type") );
+    files->addColumn( tr("Date") );
+    files->addColumn( tr("Attributes") );
+    files->header()->setStretchEnabled( TRUE, 0 );
+
+    files->setMinimumSize( 50, 25 + 2*fm.lineSpacing() );
+
+    connect( files, SIGNAL( selectionChanged() ),
+            this, SLOT( detailViewSelectionChanged() ) );
+    connect( files, SIGNAL(currentChanged(QListViewItem *)),
+            this, SLOT(updateFileNameEdit(QListViewItem *)) );
+    connect( files, SIGNAL(doubleClicked(QListViewItem *)),
+            this, SLOT(selectDirectoryOrFile(QListViewItem *)) );
+    connect( files, SIGNAL(returnPressed(QListViewItem *)),
+            this, SLOT(selectDirectoryOrFile(QListViewItem *)) );
+    connect( files, SIGNAL(rightButtonPressed(QListViewItem *,
+                                             const QPoint &, int)),
+            this, SLOT(popupContextMenu(QListViewItem *,
+                                        const QPoint &, int)) );
+
+    files->installEventFilter( this );
+    files->viewport()->installEventFilter( this );
+
+    d->moreFiles = new QFileListBox( d->stack, this );
+    d->moreFiles->setRowMode( QListBox::FitToHeight );
+    d->moreFiles->setVariableWidth( TRUE );
+
+    connect( d->moreFiles, SIGNAL(selected(QListBoxItem *)),
+            this, SLOT(selectDirectoryOrFile(QListBoxItem *)) );
+    connect( d->moreFiles, SIGNAL( selectionChanged() ),
+            this, SLOT( listBoxSelectionChanged() ) );
+    connect( d->moreFiles, SIGNAL(highlighted(QListBoxItem *)),
+            this, SLOT(updateFileNameEdit(QListBoxItem *)) );
+    connect( d->moreFiles, SIGNAL( rightButtonPressed( QListBoxItem *, const QPoint & ) ),
+            this, SLOT( popupContextMenu( QListBoxItem *, const QPoint & ) ) );
+
+    d->moreFiles->installEventFilter( this );
+    d->moreFiles->viewport()->installEventFilter( this );
+
+    okB = new QPushButton( tr("OK"), this, "OK" ); //### Or "Save (see other "OK")
+    okB->setDefault( TRUE );
+    okB->setEnabled( FALSE );
+    connect( okB, SIGNAL(clicked()), this, SLOT(okClicked()) );
+    cancelB = new QPushButton( tr("Cancel") , this, "Cancel" );
+    connect( cancelB, SIGNAL(clicked()), this, SLOT(cancelClicked()) );
+
+    d->paths = new QComboBox( TRUE, this, "directory history/editor" );
+    d->paths->setDuplicatesEnabled( FALSE );
+    d->paths->setInsertionPolicy( QComboBox::NoInsertion );
+    const QFileInfoList * rootDrives = QDir::drives();
+    QFileInfoListIterator it( *rootDrives );
+    QFileInfo *fi;
+    makeVariables();
+
+    while ( (fi = it.current()) != 0 ) {
+       ++it;
+       d->paths->insertItem( *openFolderIcon, fi->absFilePath() );
+    }
+
+    if ( !!QDir::homeDirPath() ) {
+       if ( !d->paths->listBox()->findItem( QDir::homeDirPath() ) )
+           d->paths->insertItem( *openFolderIcon, QDir::homeDirPath() );
+    }
+
+    connect( d->paths, SIGNAL(activated(const QString&)),
+            this, SLOT(setDir(const QString&)) );
+
+    d->paths->installEventFilter( this );
+    QObjectList *ol = d->paths->queryList( "QLineEdit" );
+    if ( ol && ol->first() )
+       ( (QLineEdit*)ol->first() )->installEventFilter( this );
+    delete ol;
+
+    d->geometryDirty = TRUE;
+    d->types = new QComboBox( TRUE, this, "file types" );
+    d->types->setDuplicatesEnabled( FALSE );
+    d->types->setEditable( FALSE );
+    connect( d->types, SIGNAL(activated(const QString&)),
+            this, SLOT(setFilter(const QString&)) );
+    connect( d->types, SIGNAL(activated(const QString&)),
+            this, SIGNAL(filterSelected(const QString&)) );
+
+    d->pathL = new QLabel( d->paths, tr("Look &in:"), this, "qt_looin_lbl" );
+    d->fileL = new QLabel( nameEdit, tr("File &name:"), this, "qt_filename_lbl" );
+    d->typeL = new QLabel( d->types, tr("File &type:"), this, "qt_filetype_lbl" );
+
+#if defined(Q_WS_WIN)
+    if ( qt_winver == Qt::WV_2000 || qt_winver == Qt::WV_XP ) {
+       d->goBack = new QToolButton( this, "go back" );
+       d->goBack->setAutoRaise( TRUE );
+       d->goBack->setEnabled( FALSE );
+       d->goBack->setFocusPolicy( TabFocus );
+       connect( d->goBack, SIGNAL( clicked() ),
+                this, SLOT( goBack() ) );
+       QToolTip::add( d->goBack, tr( "Back" ) );
+       d->goBack->setIconSet( *goBackIcon );
+    } else {
+       d->goBack = 0;
+    }
+#else
+    d->goBack = 0;
+#endif
+
+    d->cdToParent = new QToolButton( this, "cd to parent" );
+#if defined(Q_WS_WIN)
+    if ( qt_winver == Qt::WV_2000 || qt_winver == Qt::WV_XP  )
+       d->cdToParent->setAutoRaise( TRUE );
+#endif
+    d->cdToParent->setFocusPolicy( TabFocus );
+#ifndef QT_NO_TOOLTIP
+    QToolTip::add( d->cdToParent, tr( "One directory up" ) );
+#endif
+    d->cdToParent->setIconSet( *cdToParentIcon );
+    connect( d->cdToParent, SIGNAL(clicked()),
+            this, SLOT(cdUpClicked()) );
+
+    d->newFolder = new QToolButton( this, "new folder" );
+#if defined(Q_WS_WIN)
+    if ( qt_winver == Qt::WV_2000 || qt_winver == Qt::WV_XP  )
+       d->newFolder->setAutoRaise( TRUE );
+#endif
+    d->newFolder->setFocusPolicy( TabFocus );
+#ifndef QT_NO_TOOLTIP
+    QToolTip::add( d->newFolder, tr( "Create New Folder" ) );
+#endif
+    d->newFolder->setIconSet( *newFolderIcon );
+    connect( d->newFolder, SIGNAL(clicked()),
+            this, SLOT(newFolderClicked()) );
+
+    d->modeButtons = new QButtonGroup( 0, "invisible group" );
+    connect( d->modeButtons, SIGNAL(destroyed()),
+            this, SLOT(modeButtonsDestroyed()) );
+    d->modeButtons->setExclusive( TRUE );
+    connect( d->modeButtons, SIGNAL(clicked(int)),
+            d->stack, SLOT(raiseWidget(int)) );
+    connect( d->modeButtons, SIGNAL(clicked(int)),
+            this, SLOT(changeMode(int)) );
+
+    d->mcView = new QToolButton( this, "mclistbox view" );
+#if defined(Q_WS_WIN)
+    if ( qt_winver == Qt::WV_2000 || qt_winver == Qt::WV_XP  )
+       d->mcView->setAutoRaise( TRUE );
+#endif
+    d->mcView->setFocusPolicy( TabFocus );
+#ifndef QT_NO_TOOLTIP
+    QToolTip::add( d->mcView, tr( "List View" ) );
+#endif
+    d->mcView->setIconSet( *multiColumnListViewIcon );
+    d->mcView->setToggleButton( TRUE );
+    d->stack->addWidget( d->moreFiles, d->modeButtons->insert( d->mcView ) );
+    d->detailView = new QToolButton( this, "list view" );
+#if defined(Q_WS_WIN)
+    if ( qt_winver == Qt::WV_2000 || qt_winver == Qt::WV_XP  )
+       d->detailView->setAutoRaise( TRUE );
+#endif
+    d->detailView->setFocusPolicy( TabFocus );
+#ifndef QT_NO_TOOLTIP
+    QToolTip::add( d->detailView, tr( "Detail View" ) );
+#endif
+    d->detailView->setIconSet( *detailViewIcon );
+    d->detailView->setToggleButton( TRUE );
+    d->stack->addWidget( files, d->modeButtons->insert( d->detailView ) );
+
+    d->previewInfo = new QToolButton( this, "preview info view" );
+#if defined(Q_WS_WIN)
+    if ( qt_winver == Qt::WV_2000 || qt_winver == Qt::WV_XP  )
+       d->previewInfo->setAutoRaise( TRUE );
+#endif
+    d->previewInfo->setFocusPolicy( TabFocus );
+#ifndef QT_NO_TOOLTIP
+    QToolTip::add( d->previewInfo, tr( "Preview File Info" ) );
+#endif
+    d->previewInfo->setIconSet( *previewInfoViewIcon );
+    d->previewInfo->setToggleButton( TRUE );
+    d->modeButtons->insert( d->previewInfo );
+
+    d->previewContents = new QToolButton( this, "preview info view" );
+#if defined(Q_WS_WIN)
+    if ( qt_winver == Qt::WV_2000 || qt_winver == Qt::WV_XP  )
+       d->previewContents->setAutoRaise( TRUE );
+#endif
+    d->previewContents->setFocusPolicy( TabFocus );
+#ifndef QT_NO_TOOLTIP
+    QToolTip::add( d->previewContents, tr( "Preview File Contents" ) );
+#endif
+    d->previewContents->setIconSet( *previewContentsViewIcon );
+    d->previewContents->setToggleButton( TRUE );
+    d->modeButtons->insert( d->previewContents );
+
+    connect( d->detailView, SIGNAL( clicked() ),
+            d->moreFiles, SLOT( cancelRename() ) );
+    connect( d->detailView, SIGNAL( clicked() ),
+            files, SLOT( cancelRename() ) );
+    connect( d->mcView, SIGNAL( clicked() ),
+            d->moreFiles, SLOT( cancelRename() ) );
+    connect( d->mcView, SIGNAL( clicked() ),
+            files, SLOT( cancelRename() ) );
+
+    d->stack->raiseWidget( d->moreFiles );
+    d->mcView->setOn( TRUE );
+
+    QHBoxLayout *lay = new QHBoxLayout( this );
+    lay->setMargin( 6 );
+    d->leftLayout = new QHBoxLayout( lay, 5 );
+    d->topLevelLayout = new QVBoxLayout( (QWidget*)0, 5 );
+    lay->addLayout( d->topLevelLayout, 1 );
+    d->extraWidgetsLayouts.setAutoDelete( FALSE );
+    d->extraLabels.setAutoDelete( FALSE );
+    d->extraWidgets.setAutoDelete( FALSE );
+    d->extraButtons.setAutoDelete( FALSE );
+    d->toolButtons.setAutoDelete( FALSE );
+
+    QHBoxLayout * h;
+
+    d->preview = new QWidgetStack( d->splitter, "qt_preview" );
+
+    d->infoPreviewWidget = new QWidget( d->preview, "qt_preview_info" );
+    d->contentsPreviewWidget = new QWidget( d->preview, "qt_preview_contents" );
+    d->infoPreviewer = d->contentsPreviewer = 0;
+
+    h = new QHBoxLayout( 0 );
+    d->buttonLayout = h;
+    d->topLevelLayout->addLayout( h );
+    h->addWidget( d->pathL );
+    h->addSpacing( 8 );
+    h->addWidget( d->paths );
+    h->addSpacing( 8 );
+    if ( d->goBack )
+       h->addWidget( d->goBack );
+    h->addWidget( d->cdToParent );
+    h->addSpacing( 2 );
+    h->addWidget( d->newFolder );
+    h->addSpacing( 4 );
+    h->addWidget( d->mcView );
+    h->addWidget( d->detailView );
+    h->addWidget( d->previewInfo );
+    h->addWidget( d->previewContents );
+
+    d->topLevelLayout->addWidget( d->splitter );
+
+    h = new QHBoxLayout();
+    d->topLevelLayout->addLayout( h );
+    h->addWidget( d->fileL );
+    h->addWidget( nameEdit );
+    h->addSpacing( 15 );
+    h->addWidget( okB );
+
+    h = new QHBoxLayout();
+    d->topLevelLayout->addLayout( h );
+    h->addWidget( d->typeL );
+    h->addWidget( d->types );
+    h->addSpacing( 15 );
+    h->addWidget( cancelB );
+
+    d->rightLayout = new QHBoxLayout( lay, 5 );
+    d->topLevelLayout->setStretchFactor( d->mcView, 1 );
+    d->topLevelLayout->setStretchFactor( files, 1 );
+
+    updateGeometries();
+
+    if ( d->goBack ) {
+       setTabOrder( d->paths, d->goBack );
+       setTabOrder( d->goBack, d->cdToParent );
+    } else {
+       setTabOrder( d->paths, d->cdToParent );
+    }
+    setTabOrder( d->cdToParent, d->newFolder );
+    setTabOrder( d->newFolder, d->mcView );
+    setTabOrder( d->mcView, d->detailView );
+    setTabOrder( d->detailView, d->moreFiles );
+    setTabOrder( d->moreFiles, files );
+    setTabOrder( files, nameEdit );
+    setTabOrder( nameEdit, d->types );
+    setTabOrder( d->types, okB );
+    setTabOrder( okB, cancelB );
+
+    d->rw = tr( "Read-write" );
+    d->ro = tr( "Read-only" );
+    d->wo = tr( "Write-only" );
+    d->inaccessible = tr( "Inaccessible" );
+
+    d->symLinkToFile = tr( "Symlink to File" );
+    d->symLinkToDir = tr( "Symlink to Directory" );
+    d->symLinkToSpecial = tr( "Symlink to Special" );
+    d->file = tr( "File" );
+    d->dir = tr( "Dir" );
+    d->special = tr( "Special" );
+
+    if ( !lastSize ) {
+       QRect screen = QApplication::desktop()->screenGeometry( QApplication::desktop()->screenNumber( pos() ) );
+       if ( screen.width() < 1024 ||
+            screen.height() < 768 ) {
+           resize( QMIN(screen.width(),420),
+                   QMIN(screen.height(),236) );
+       } else {
+           QSize s( files->sizeHint() );
+           s = QSize( s.width() + 300, s.height() + 82 );
+
+           if ( s.width() * 3 > screen.width() * 2 )
+               s.setWidth( screen.width() * 2 / 3 );
+
+           if ( s.height() * 3 > screen.height() * 2 )
+               s.setHeight( screen.height() * 2 / 3 );
+           else if ( s.height() * 3 < screen.height() )
+               s.setHeight( screen.height() / 3 );
+
+           resize( s );
+       }
+       lastSize = new QSize;
+       qfd_cleanup_size.add( &lastSize );
+       *lastSize = size();
+    } else
+       resize( *lastSize );
+
+    if ( detailViewMode ) {
+       d->stack->raiseWidget( files );
+       d->mcView->setOn( FALSE );
+       d->detailView->setOn( TRUE );
+    }
+
+    d->preview->hide();
+    nameEdit->setFocus();
+
+    connect( nameEdit, SIGNAL( returnPressed() ),
+            this, SLOT( fileNameEditReturnPressed() ) );
+}
+
+/*!
+  \internal
+*/
+
+void QFileDialogP::fileNameEditReturnPressed()
+{
+    d->oldUrl = d->url;
+    if ( !isDirectoryMode( d->mode ) ) {
+       okClicked();
+    } else {
+       d->currentFileName = QString::null;
+       if ( nameEdit->text().isEmpty() ) {
+           emit fileSelected( selectedFile() );
+           accept();
+       } else {
+           QUrlInfo f;
+           QFileDialogPrivate::File * c
+               = (QFileDialogPrivate::File *)files->currentItem();
+           if ( c && files->isSelected(c) )
+               f = c->info;
+           else
+               f = QUrlInfo( d->url, nameEdit->text() );
+           if ( f.isDir() ) {
+               setUrl( QUrlOperator( d->url, QFileDialogPrivate::encodeFileName(nameEdit->text() + "/" ) ) );
+               d->checkForFilter = TRUE;
+               trySetSelection( TRUE, d->url, TRUE );
+               d->checkForFilter = FALSE;
+           }
+       }
+       nameEdit->setText( QString::null );
+       d->ignoreReturn = TRUE;
+    }
+}
+
+/*!
+  \internal
+  Changes the preview mode to the mode specified at \a id.
+*/
+
+void QFileDialogP::changeMode( int id )
+{
+    if ( !d->infoPreview && !d->contentsPreview )
+       return;
+
+    QButton *btn = (QButton*)d->modeButtons->find( id );
+    if ( !btn )
+       return;
+
+    if ( btn == d->previewContents && !d->contentsPreview )
+       return;
+    if ( btn == d->previewInfo && !d->infoPreview )
+       return;
+
+    if ( btn != d->previewContents && btn != d->previewInfo ) {
+       d->preview->hide();
+    } else {
+       if ( files->currentItem() ) {
+           if ( d->infoPreviewer )
+               d->infoPreviewer->previewUrl( QUrl( d->url, files->currentItem()->text( 0 ) ) );
+           if ( d->contentsPreviewer )
+               d->contentsPreviewer->previewUrl( QUrl( d->url, files->currentItem()->text( 0 ) ) );
+       }
+       if ( btn == d->previewInfo )
+           d->preview->raiseWidget( d->infoPreviewWidget );
+       else
+           d->preview->raiseWidget( d->contentsPreviewWidget );
+       d->preview->show();
+    }
+}
+
+/*!
+  Destroys the file dialog.
+*/
+
+QFileDialogP::~QFileDialogP()
+{
+    // since clear might call setContentsPos which would emit
+    // a signal and thus cause a recompute of sizes...
+    files->blockSignals( TRUE );
+    d->moreFiles->blockSignals( TRUE );
+    files->clear();
+    d->moreFiles->clear();
+    d->moreFiles->blockSignals( FALSE );
+    files->blockSignals( FALSE );
+    if ( QApplication::overrideCursor() )
+       QApplication::restoreOverrideCursor();
+    delete d;
+    d = 0;
+}
+
+
+/*!
+  \property QFileDialogP::selectedFile
+
+  \brief the name of the selected file
+
+  If a file was selected selectedFile contains the file's name including
+  its absolute path; otherwise selectedFile is empty.
+
+  \sa QString::isEmpty(), selectedFiles, selectedFilter
+*/
+
+QString QFileDialogP::selectedFile() const
+{
+    QString s = d->currentFileName;
+    // remove the protocol because we do not want to encode it...
+    QString prot = QUrl( s ).protocol();
+    if ( !prot.isEmpty() ) {
+        prot += ":";
+       s.remove( 0, prot.length() );
+    }
+    QUrl u( prot + QFileDialogPrivate::encodeFileName( s ) );
+    if ( u.isLocalFile() ) {
+       QString s = u.toString();
+       if ( s.left( 5 ) == "file:" )
+           s.remove( 0, 5 );
+       return s;
+    }
+    return d->currentFileName;
+}
+
+/*!
+  \property QFileDialogP::selectedFilter
+
+  \brief the filter which the user has selected in the file dialog
+
+  \sa filterSelected(), selectedFiles, selectedFile
+*/
+
+QString QFileDialogP::selectedFilter() const
+{
+    return d->types->currentText();
+}
+
+/*! \overload
+
+  Sets the current filter selected in the file dialog to the
+  \a{n}-th filter in the filter list.
+
+  \sa filterSelected(), selectedFilter(), selectedFiles(), selectedFile()
+*/
+
+void QFileDialogP::setSelectedFilter( int n )
+{
+    d->types->setCurrentItem( n );
+    QString f = d->types->currentText();
+    QRegExp r( QString::fromLatin1(qt_file_dialog_filter_reg_exp) );
+    int index = r.search( f );
+    if ( index >= 0 )
+       f = r.cap( 2 );
+    d->url.setNameFilter( f );
+    rereadDir();
+}
+
+/*!
+  Sets the current filter selected in the file dialog to the first
+  one that contains the text \a mask.
+*/
+
+void QFileDialogP::setSelectedFilter( const QString& mask )
+{
+    int n;
+
+    for ( n = 0; n < d->types->count(); n++ ) {
+       if ( d->types->text( n ).contains( mask, FALSE ) ) {
+           d->types->setCurrentItem( n );
+           QString f = mask;
+           QRegExp r( QString::fromLatin1(qt_file_dialog_filter_reg_exp) );
+           int index = r.search( f );
+           if ( index >= 0 )
+               f = r.cap( 2 );
+           d->url.setNameFilter( f );
+           rereadDir();
+           return;
+       }
+    }
+}
+
+/*!
+  \property QFileDialogP::selectedFiles
+
+  \brief the list of selected files
+
+  If one or more files are selected, selectedFiles contains their
+  names including their absolute paths. If no files are selected or
+  the mode isn't ExistingFiles selectedFiles is an empty list.
+
+  It is more convenient to use selectedFile() if the mode is
+  \c ExistingFile, \c Directory or \c DirectoryOnly.
+
+  Note that if you want to iterate over the list, you should
+  iterate over a copy, e.g.
+    \code
+    QStringList list = myFileDialog.selectedFiles();
+    QStringList::Iterator it = list.begin();
+    while( it != list.end() ) {
+       myProcessing( *it );
+       ++it;
+    }
+    \endcode
+
+  \sa selectedFile, selectedFilter, QValueList::empty()
+*/
+
+QStringList QFileDialogP::selectedFiles() const
+{
+    QStringList lst;
+
+    if ( mode() == ExistingFiles ) {
+       QStringList selectedLst;
+       QString selectedFiles = nameEdit->text();
+       selectedFiles.truncate( selectedFiles.findRev( '\"' ) );
+       selectedLst = selectedLst.split( QString("\" "), selectedFiles );
+       for ( QStringList::Iterator it = selectedLst.begin(); it != selectedLst.end(); ++it ) {
+           QUrl u;
+           if ( (*it)[0] == '\"' ) {
+               u = QUrl( d->url, QFileDialogPrivate::encodeFileName( (*it).mid(1) ) );
+           } else {
+               u = QUrl( d->url, QFileDialogPrivate::encodeFileName( (*it) ) );
+           }
+           if ( u.isLocalFile() ) {
+               QString s = u.toString();
+               if ( s.left( 5 ) == "file:" )
+                   s.remove( 0, 5 );
+               lst << s;
+           } else {
+               lst << u.toString();
+           }
+       }
+    }
+
+    return lst;
+}
+
+/*!
+  Sets the default selection to \a filename. If \a filename is
+  absolute, setDir() is also called to set the file dialog's working
+  directory to the filename's directory.
+
+  \omit
+  Only for external use. Not useful inside QFileDialogP.
+  \endomit
+*/
+
+void QFileDialogP::setSelection( const QString & filename )
+{
+    d->oldUrl = d->url;
+    QString nf = d->url.nameFilter();
+    if ( QUrl::isRelativeUrl( filename ) )
+       d->url = QUrlOperator( d->url, QFileDialogPrivate::encodeFileName( filename ) );
+    else
+       d->url = QUrlOperator( filename );
+    d->url.setNameFilter( nf );
+    d->checkForFilter = TRUE;
+    bool isDirOk;
+    bool isDir = d->url.isDir( &isDirOk );
+    if ( !isDirOk )
+       isDir = d->url.path().right( 1 ) == "/";
+    if ( !isDir ) {
+       QUrlOperator u( d->url );
+       d->url.setPath( d->url.dirPath() );
+       trySetSelection( FALSE, u, TRUE );
+       d->ignoreNextRefresh = TRUE;
+       nameEdit->selectAll();
+       rereadDir();
+       emit dirEntered( d->url.dirPath() );
+    } else {
+       if ( !d->url.path().isEmpty() &&
+            d->url.path().right( 1 ) != "/" ) {
+           QString p = d->url.path();
+           p += "/";
+           d->url.setPath( p );
+       }
+       trySetSelection( TRUE, d->url, FALSE );
+       rereadDir();
+       emit dirEntered( d->url.dirPath() );
+       nameEdit->setText( QString::fromLatin1("") );
+    }
+    d->checkForFilter = FALSE;
+}
+
+/*!
+  \property QFileDialogP::dirPath
+
+  \brief the file dialog's working directory
+
+  \sa dir(), setDir()
+*/
+
+QString QFileDialogP::dirPath() const
+{
+    return d->url.dirPath();
+}
+
+
+/*!
+
+  Sets the filter used in the file dialog to \a newFilter.
+
+  If \a newFilter contains a pair of parentheses containing one or more
+  of <em><b>anything*something</b></em> separated by spaces or by
+  semi-colons then only the text contained in the parentheses is used as
+  the filter. This means that these calls are all equivalent:
+
+  \code
+     fd->setFilter( "All C++ files (*.cpp *.cc *.C *.cxx *.c++)" );
+     fd->setFilter( "*.cpp *.cc *.C *.cxx *.c++" );
+     fd->setFilter( "All C++ files (*.cpp;*.cc;*.C;*.cxx;*.c++)" );
+     fd->setFilter( "*.cpp;*.cc;*.C;*.cxx;*.c++" );
+  \endcode
+
+  \sa setFilters()
+*/
+
+void QFileDialogP::setFilter( const QString & newFilter )
+{
+    if ( newFilter.isEmpty() )
+       return;
+    QString f = newFilter;
+    QRegExp r( QString::fromLatin1(qt_file_dialog_filter_reg_exp) );
+    int index = r.search( f );
+    if ( index >= 0 )
+       f = r.cap( 2 );
+    d->url.setNameFilter( f );
+    if ( d->types->count() == 1 )  {
+       d->types->clear();
+       d->types->insertItem( newFilter );
+    } else {
+       for ( int i = 0; i < d->types->count(); ++i ) {
+           if ( d->types->text( i ).left( newFilter.length() ) == newFilter ) {
+               d->types->setCurrentItem( i );
+               break;
+           }
+       }
+    }
+    rereadDir();
+}
+
+
+/*! \overload
+  Sets the file dialog's working directory to \a pathstr.
+
+  \sa dir()
+*/
+
+void QFileDialogP::setDir( const QString & pathstr )
+{
+    QString dr = pathstr;
+    if ( dr.isEmpty() )
+       return;
+
+#if defined(Q_OS_UNIX)
+    if ( dr.length() && dr[0] == '~' ) {
+       struct passwd *pw;
+       int i;
+
+       i = 0;
+       while( i < (int)dr.length() && dr[i] != '/' )
+           i++;
+       QCString user;
+       if ( i == 1 ) {
+           user = ::getlogin();
+           if ( !user )
+               user = getenv( "LOGNAME" );
+       } else
+           user = dr.mid( 1, i-1 ).local8Bit();
+       dr = dr.mid( i, dr.length() );
+       pw = ::getpwnam( user );
+       if ( pw )
+           dr.prepend( QString::fromLocal8Bit(pw->pw_dir) );
+    }
+#endif
+
+    setUrl( dr );
+}
+
+/*!
+  Returns the current directory shown in the file dialog.
+
+  The ownership of the QDir pointer is transferred to the caller, so
+  it must be deleted by the caller when no longer required.
+
+  \sa setDir()
+*/
+
+const QDir *QFileDialogP::dir() const
+{
+    if ( d->url.isLocalFile() )
+       return  new QDir( d->url.path() );
+    else
+       return 0;
+}
+
+/*!
+  Sets the file dialog's working directory to \a dir.
+  \sa dir()
+*/
+
+void QFileDialogP::setDir( const QDir &dir )
+{
+    d->oldUrl = d->url;
+    QString nf( d->url.nameFilter() );
+    d->url = dir.canonicalPath();
+    d->url.setNameFilter( nf );
+    QUrlInfo i( d->url, nameEdit->text() );
+    d->checkForFilter = TRUE;
+    trySetSelection( i.isDir(), QUrlOperator( d->url, QFileDialogPrivate::encodeFileName(nameEdit->text() ) ), FALSE );
+    d->checkForFilter = FALSE;
+    rereadDir();
+    emit dirEntered( d->url.path() );
+}
+
+/*!
+  Sets the file dialog's working directory to the directory specified at \a url.
+
+  \sa url()
+*/
+
+void QFileDialogP::setUrl( const QUrlOperator &url )
+{
+    QString nf = d->url.nameFilter();
+
+    d->url = QUrl( d->url, url.toString( FALSE, FALSE ) );
+    d->url.setNameFilter( nf );
+
+    d->checkForFilter = TRUE;
+    if ( !d->url.isDir() ) {
+       QUrlOperator u = d->url;
+       d->url.setPath( d->url.dirPath() );
+       trySetSelection( FALSE, u, FALSE );
+       rereadDir();
+       emit dirEntered( d->url.dirPath() );
+       QString fn = u.fileName();
+       nameEdit->setText( fn );
+    } else {
+       trySetSelection( TRUE, d->url, FALSE );
+       rereadDir();
+       emit dirEntered( d->url.dirPath() );
+    }
+    d->checkForFilter = FALSE;
+}
+
+/*!
+  \property QFileDialogP::showHiddenFiles
+
+  \brief whether hidden files are shown in the file dialog
+
+  The default is FALSE, i.e. don't show hidden files.
+*/
+
+void QFileDialogP::setShowHiddenFiles( bool s )
+{
+    if ( s == bShowHiddenFiles )
+       return;
+
+    bShowHiddenFiles = s;
+    rereadDir();
+}
+
+bool QFileDialogP::showHiddenFiles() const
+{
+    return bShowHiddenFiles;
+}
+
+/*!
+  Rereads the current directory shown in the file dialog.
+
+  The only time you will need to call this function is if the contents of
+  the directory change and you wish to refresh the file dialog to reflect
+  the change.
+
+  \sa resortDir()
+*/
+
+void QFileDialogP::rereadDir()
+{
+    if ( !QApplication::overrideCursor() )
+       QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
+    d->pendingItems.clear();
+    if ( d->mimeTypeTimer->isActive() )
+       d->mimeTypeTimer->stop();
+    d->currListChildren = d->url.listChildren();
+}
+
+
+/*!
+  \fn void QFileDialogP::fileHighlighted( const QString& )
+
+  This signal is emitted when the user highlights a file.
+
+  \sa fileSelected(), filesSelected()
+*/
+
+/*!
+  \fn void QFileDialogP::fileSelected( const QString& )
+
+  This signal is emitted when the user selects a file.
+
+  \sa filesSelected(), fileHighlighted(), selectedFile()
+*/
+
+/*!
+  \fn void QFileDialogP::filesSelected( const QStringList& )
+
+  This signal is emitted when the user selects one or more files in \e
+  ExistingFiles mode.
+
+  \sa fileSelected(), fileHighlighted(), selectedFiles()
+*/
+
+/*!
+  \fn void QFileDialogP::dirEntered( const QString& )
+
+  This signal is emitted when the user enters a directory.
+
+  \sa dir()
+*/
+
+/*!
+  \fn void QFileDialogP::filterSelected( const QString& )
+
+  This signal is emitted when the user selects a filter.
+
+  \sa selectedFilter()
+*/
+
+extern bool qt_resolve_symlinks; // defined in qapplication.cpp
+
+/*!
+  This is a convenience static function that returns an existing file
+  selected by the user. If the user pressed Cancel, it returns a null
+  string.
+
+  \code
+    QString s = QFileDialogP::getOpenFileName(
+                    "/home",
+                   "Images (*.png *.xpm *.jpg)",
+                   this,
+                   "open file dialog",
+                   "Choose a file to open" );
+  \endcode
+
+  The function creates a modal file dialog called \a name, with
+  parent, \a parent. If a parent is not 0, the dialog will be shown
+  centered over the parent.
+
+  The file dialog's working directory will be set to \a startWith. If \a
+  startWith includes a file name, the file will be selected. The filter
+  is set to \a filter so that only those files which match the filter
+  are shown. The filter selected is set to \a selectedFilter. The parameters
+  \a startWith, \a selectedFilter and \a filter may be QString::null.
+
+  The dialog's caption is set to \a caption. If \a caption is not
+  specified then a default caption will be used.
+
+  Under Windows and Mac OS X, this static function will use the native
+  file dialog and not a QFileDialogP, unless the style of the application
+  is set to something other than the native style.
+
+  Under Unix/X11, the normal behavior of the file dialog is to resolve
+  and follow symlinks. For example, if /usr/tmp is a symlink to /var/tmp,
+  the file dialog will change to /var/tmp after entering /usr/tmp.
+  If \a resolveSymlinks is FALSE, the file dialog will treat
+  symlinks as regular directories.
+
+  \sa getOpenFileNames(), getSaveFileName(), getExistingDirectory()
+*/
+
+QString QFileDialogP::getOpenFileName( const QString & startWith,
+                                     const QString& filter,
+                                     QWidget *parent, const char* name,
+                                     const QString& caption,
+                                     QString *selectedFilter,
+                                     bool resolveSymlinks )
+{
+    bool save_qt_resolve_symlinks = qt_resolve_symlinks;
+    qt_resolve_symlinks = resolveSymlinks;
+
+    QStringList filters;
+    if ( !filter.isEmpty() )
+       filters = makeFiltersList( filter );
+
+    makeVariables();
+    QString initialSelection;
+    //### Problem with the logic here: If a startWith is given and a file
+    // with that name exists in D->URL, the box will be opened at D->URL instead of
+    // the last directory used ('workingDirectory').
+    //
+    // hm... isn't that problem exactly the documented behaviour? the
+    // documented behaviour sounds meaningful.
+    if ( !startWith.isEmpty() ) {
+       QUrlOperator u( startWith );
+       if ( u.isLocalFile() && QFileInfo( u.path() ).isDir() ) {
+           *workingDirectory = startWith;
+       } else {
+           if ( u.isLocalFile() ) {
+               QFileInfo fi( u.dirPath() );
+               if ( fi.exists() ) {
+                   *workingDirectory = u.dirPath();
+                   initialSelection = u.fileName();
+               }
+           } else {
+               *workingDirectory = u.toString();
+               initialSelection = QString::null;//u.fileName();
+           }
+       }
+    }
+
+    if ( workingDirectory->isNull() )
+       *workingDirectory = QDir::currentDirPath();
+
+#if defined(Q_WS_WIN)
+    if ( qApp->style().styleHint( QStyle::SH_GUIStyle ) == WindowsStyle )
+       return winGetOpenFileName( initialSelection, filter, workingDirectory,
+                                  parent, name, caption, selectedFilter );
+#elif defined(Q_WS_MAC)
+    if( ( qApp->style().inherits(QMAC_DEFAULT_STYLE) ) ) {
+       QString f = macGetOpenFileNames(filter, workingDirectory,
+                                       parent, name, caption, FALSE).first();
+       return f;
+    }
+#endif
+
+    QFileDialogP *dlg = new QFileDialogP( *workingDirectory, QString::null, parent, name ? name : "qt_filedlg_gofn", TRUE );
+
+#ifndef QT_NO_WIDGET_TOPEXTRA
+    if ( parent && parent->icon() && !parent->icon()->isNull() )
+       dlg->setIcon( *parent->icon() );
+    else if ( qApp->mainWidget() && qApp->mainWidget()->icon() && !qApp->mainWidget()->icon()->isNull() )
+       dlg->setIcon( *qApp->mainWidget()->icon() );
+
+    if ( !caption.isNull() )
+       dlg->setCaption( caption );
+    else
+       dlg->setCaption( QFileDialogP::tr( "Open" ) );
+#endif
+
+    dlg->setFilters( filters );
+    if ( selectedFilter )
+       dlg->setFilter( *selectedFilter );
+    dlg->setMode( QFileDialogP::ExistingFile );
+    QString result;
+    if ( !initialSelection.isEmpty() )
+       dlg->setSelection( initialSelection );
+    if ( dlg->exec() == QDialog::Accepted ) {
+       result = dlg->selectedFile();
+       *workingDirectory = dlg->d->url;
+       if ( selectedFilter )
+           *selectedFilter = dlg->selectedFilter();
+    }
+    delete dlg;
+
+    qt_resolve_symlinks = save_qt_resolve_symlinks;
+
+    return result;
+}
+
+/*!
+  This is a convenience static function that will return a file name
+  selected by the user. The file does not have to exist.
+
+  It creates a modal file dialog called \a name, with parent, \a parent.
+  If a parent is not 0, the dialog will be shown centered over the
+  parent.
+
+  \code
+    QString s = QFileDialogP::getSaveFileName(
+                    "/home",
+                   "Images (*.png *.xpm *.jpg)",
+                   this,
+                   "save file dialog"
+                   "Choose a filename to save under" );
+  \endcode
+
+  The file dialog's working directory will be set to \a startWith. If \a
+  startWith includes a file name, the file will be selected. The filter
+  is set to \a filter so that only those files which match the filter
+  are shown. The filter selected is set to \a selectedFilter. The parameters
+  \a startWith, \a selectedFilter and \a filter may be QString::null.
+
+  The dialog's caption is set to \a caption. If \a caption is not
+  specified then a default caption will be used.
+
+  Under Windows and Mac OS X, this static function will use the native
+  file dialog and not a QFileDialogP, unless the style of the application
+  is set to something other than the native style.
+
+  Under Unix/X11, the normal behavior of the file dialog is to resolve
+  and follow symlinks. For example, if /usr/tmp is a symlink to /var/tmp,
+  the file dialog will change to /var/tmp after entering /usr/tmp.
+  If \a resolveSymlinks is FALSE, the file dialog will treat
+  symlinks as regular directories.
+
+  \sa getOpenFileName(), getOpenFileNames(), getExistingDirectory()
+*/
+
+QString QFileDialogP::getSaveFileName( const QString & startWith,
+                                     const QString& filter,
+                                     QWidget *parent, const char* name,
+                                     const QString& caption,
+                                     QString *selectedFilter,
+                                     bool resolveSymlinks)
+{
+    bool save_qt_resolve_symlinks = qt_resolve_symlinks;
+    qt_resolve_symlinks = resolveSymlinks;
+
+    QStringList filters;
+    if ( !filter.isEmpty() )
+       filters = makeFiltersList( filter );
+
+    makeVariables();
+    QString initialSelection;
+    if ( !startWith.isEmpty() ) {
+       QUrlOperator u( startWith );
+       if ( u.isLocalFile() && QFileInfo( u.path() ).isDir() ) {
+           *workingDirectory = startWith;
+       } else {
+           if ( u.isLocalFile() ) {
+               QFileInfo fi( u.dirPath() );
+               if ( fi.exists() ) {
+                   *workingDirectory = u.dirPath();
+                   initialSelection = u.fileName();
+               }
+           } else {
+               *workingDirectory = u.toString();
+               initialSelection = QString::null;//u.fileName();
+           }
+       }
+    }
+
+    if ( workingDirectory->isNull() )
+       *workingDirectory = QDir::currentDirPath();
+
+#if defined(Q_WS_WIN)
+    if ( qApp->style().styleHint( QStyle::SH_GUIStyle ) == WindowsStyle )
+       return winGetSaveFileName( initialSelection, filter, workingDirectory,
+                                  parent, name, caption, selectedFilter );
+#elif defined(Q_WS_MAC)
+    if( ( qApp->style().inherits(QMAC_DEFAULT_STYLE) ) )
+       return macGetSaveFileName( initialSelection, filter, workingDirectory,
+                                  parent, name, caption );
+#endif
+
+    QFileDialogP *dlg = new QFileDialogP( *workingDirectory, QString::null, parent, name ? name : "qt_filedlg_gsfn", TRUE );
+
+    Q_CHECK_PTR( dlg );
+#ifndef QT_NO_WIDGET_TOPEXTRA
+    if ( parent && parent->icon() && !parent->icon()->isNull() )
+       dlg->setIcon( *parent->icon() );
+    else if ( qApp->mainWidget() && qApp->mainWidget()->icon() && !qApp->mainWidget()->icon()->isNull() )
+       dlg->setIcon( *qApp->mainWidget()->icon() );
+
+    if ( !caption.isNull() )
+       dlg->setCaption( caption );
+    else
+       dlg->setCaption( QFileDialogP::tr( "Save As" ) );
+#endif
+
+    QString result;
+    dlg->setFilters( filters );
+    if ( selectedFilter )
+       dlg->setFilter( *selectedFilter );
+    dlg->setMode( QFileDialogP::AnyFile );
+    if ( !initialSelection.isEmpty() )
+       dlg->setSelection( initialSelection );
+    if ( dlg->exec() == QDialog::Accepted ) {
+       result = dlg->selectedFile();
+       *workingDirectory = dlg->d->url;
+       if ( selectedFilter )
+           *selectedFilter = dlg->selectedFilter();
+    }
+    delete dlg;
+
+    qt_resolve_symlinks = save_qt_resolve_symlinks;
+
+    return result;
+}
+
+/*!
+  \internal
+  Activated when the "OK" button is clicked.
+*/
+
+void QFileDialogP::okClicked()
+{
+    QString fn( nameEdit->text() );
+
+#if defined(Q_WS_WIN)
+    QFileInfo fi( d->url.path() + fn );
+    if ( fi.isSymLink() ) {
+       nameEdit->setText( fi.readLink() );
+    }
+#endif
+
+    if ( fn.contains("*") ) {
+       addFilter( fn );
+       nameEdit->blockSignals( TRUE );
+       nameEdit->setText( QString::fromLatin1("") );
+       nameEdit->blockSignals( FALSE );
+       return;
+    }
+
+    *workingDirectory = d->url;
+    detailViewMode = files->isVisible();
+    *lastSize = size();
+
+    if ( isDirectoryMode( d->mode ) ) {
+       if ( d->ignoreReturn ) {
+           d->ignoreReturn = FALSE;
+           return;
+       }
+       QUrlInfo f( d->url, nameEdit->text() );
+       if ( f.isDir() ) {
+           d->currentFileName = d->url;
+           if ( d->currentFileName.right(1) != "/" )
+               d->currentFileName += '/';
+           if ( f.name() != "." )
+               d->currentFileName += f.name();
+           accept();
+           return;
+       }
+    }
+
+    // if we're in multi-selection mode and something is selected,
+    // accept it and be done.
+    if ( mode() == ExistingFiles ) {
+       if ( ! nameEdit->text().isEmpty() ) {
+           QStringList sf = selectedFiles();
+           bool isdir = FALSE;
+           if ( sf.count() == 1 ) {
+               QUrlOperator u( d->url, sf[0] );
+               bool ok;
+               isdir = u.isDir(&ok) && ok;
+           }
+           if ( !isdir ) {
+               emit filesSelected( sf );
+               accept();
+               return;
+           }
+       }
+    }
+
+    if ( mode() == AnyFile ) {
+       QUrlOperator u( d->url, QFileDialogPrivate::encodeFileName(nameEdit->text()) );
+       if ( !u.isDir() ) {
+           d->currentFileName = u;
+           emit fileSelected( selectedFile() );
+           accept();
+           return;
+       }
+    }
+
+    if ( mode() == ExistingFile ) {
+       QUrl u( d->url, QFileDialogPrivate::encodeFileName(nameEdit->text()) );
+       if ( u.isLocalFile() ) {
+           QFileInfo f( u.path() );
+           if ( !f.exists() )
+               return;
+       } else {
+           QNetworkProtocol *p = QNetworkProtocol::getNetworkProtocol( d->url.protocol() );
+           if ( p && (p->supportedOperations()&QNetworkProtocol::OpListChildren) ) {
+               QUrlInfo ui( d->url, nameEdit->text() );
+               if ( !ui.isValid() )
+                   return;
+           }
+       }
+    }
+
+    // If selection is valid, return it, else try
+    // using selection as a directory to change to.
+    if ( !d->currentFileName.isNull() && !d->currentFileName.contains( "*" ) ) {
+       emit fileSelected( selectedFile() );
+       accept();
+    } else {
+       QUrlInfo f;
+       QFileDialogPrivate::File * c
+           = (QFileDialogPrivate::File *)files->currentItem();
+       QFileDialogPrivate::MCItem * m
+           = (QFileDialogPrivate::MCItem *)d->moreFiles->item( d->moreFiles->currentItem() );
+       if ( c && files->isVisible() && files->hasFocus() ||
+            m && d->moreFiles->isVisible() && d->moreFiles->hasFocus() ) {
+           if ( c && files->isVisible() )
+               f = c->info;
+           else
+               f = ( (QFileDialogPrivate::File*)m->i )->info;
+       } else {
+           f = QUrlInfo( d->url, nameEdit->text() );
+       }
+       if ( f.isDir() ) {
+           setUrl( QUrlOperator( d->url, QFileDialogPrivate::encodeFileName(f.name() + "/" ) ) );
+           d->checkForFilter = TRUE;
+           trySetSelection( TRUE, d->url, TRUE );
+           d->checkForFilter = FALSE;
+       } else {
+           if ( !nameEdit->text().contains( "/" ) &&
+                !nameEdit->text().contains( "\\" )
+#if defined(Q_OS_WIN32)
+                && nameEdit->text()[ 1 ] != ':'
+#endif
+                )
+               addFilter( nameEdit->text() );
+           else if ( nameEdit->text()[ 0 ] == '/' ||
+                     nameEdit->text()[ 0 ] == '\\'
+#if defined(Q_OS_WIN32)
+                     || nameEdit->text()[ 1 ] == ':'
+#endif
+                     )
+               setDir( nameEdit->text() );
+           else if ( nameEdit->text().left( 3 ) == "../" || nameEdit->text().left( 3 ) == "..\\" )
+               setDir( QUrl( d->url.toString(), QFileDialogPrivate::encodeFileName(nameEdit->text() ) ).toString() );
+       }
+       nameEdit->setText( "" );
+    }
+}
+
+/*!
+  \internal
+  Activated when the "Filter" button is clicked.
+*/
+
+void QFileDialogP::filterClicked()
+{
+    // unused
+}
+
+/*!
+  \internal
+  Activated when the "Cancel" button is clicked.
+*/
+
+void QFileDialogP::cancelClicked()
+{
+    *workingDirectory = d->url;
+    detailViewMode = files->isVisible();
+    *lastSize = size();
+    reject();
+}
+
+
+/*!\reimp
+*/
+
+void QFileDialogP::resizeEvent( QResizeEvent * e )
+{
+    QDialog::resizeEvent( e );
+    updateGeometries();
+}
+
+/*
+  \internal
+  The only correct way to try to set currentFileName
+*/
+bool QFileDialogP::trySetSelection( bool isDir, const QUrlOperator &u, bool updatelined )
+{
+    if ( !isDir && !u.path().isEmpty() && u.path().right( 1 ) == "/" )
+       isDir = TRUE;
+    if ( u.fileName().contains( "*") && d->checkForFilter ) {
+       QString fn( u.fileName() );
+       if ( fn.contains( "*" ) ) {
+           addFilter( fn );
+           d->currentFileName = QString::null;
+           d->url.setFileName( QString::null );
+           nameEdit->setText( QString::fromLatin1("") );
+           return FALSE;
+       }
+    }
+
+    if ( isDir ) {
+       if ( d->preview && d->preview->isVisible() ) {
+           if ( d->infoPreviewer )
+               d->infoPreviewer->previewUrl( u );
+           if ( d->contentsPreviewer )
+               d->contentsPreviewer->previewUrl( u );
+       }
+    }
+
+    QString old = d->currentFileName;
+
+    if ( isDirectoryMode( mode() ) ) {
+       if ( isDir )
+           d->currentFileName = u;
+       else
+           d->currentFileName = QString::null;
+    } else if ( !isDir && mode() == ExistingFiles ) {
+       d->currentFileName = u;
+    } else if ( !isDir || ( mode() == AnyFile && !isDir ) ) {
+       d->currentFileName = u;
+    } else {
+       d->currentFileName = QString::null;
+    }
+    if ( updatelined && !d->currentFileName.isEmpty() ) {
+       // If the selection is valid, or if its a directory, allow OK.
+       if ( !d->currentFileName.isNull() || isDir ) {
+           if ( u.fileName() != ".." ) {
+               QString fn = u.fileName();
+               nameEdit->setText( fn );
+           } else {
+               nameEdit->setText("");
+           }
+       } else
+           nameEdit->setText( QString::fromLatin1("") );
+    }
+
+    if ( !d->currentFileName.isNull() || isDir ) {
+       okB->setEnabled( TRUE );
+    } else if ( !isDirectoryMode( d->mode ) ) {
+       okB->setEnabled( FALSE );
+    }
+
+    if ( d->currentFileName.length() && old != d->currentFileName )
+       emit fileHighlighted( selectedFile() );
+
+    return !d->currentFileName.isNull();
+}
+
+
+/*!  Make sure the minimum and maximum sizes of everything are sane.
+*/
+
+void QFileDialogP::updateGeometries()
+{
+    if ( !d || !d->geometryDirty )
+       return;
+
+    d->geometryDirty = FALSE;
+
+    QSize r, t;
+
+    // we really should have a QSize::unite()
+#define RM r.setWidth( QMAX(r.width(),t.width()) ); \
+r.setHeight( QMAX(r.height(),t.height()) )
+
+    // labels first
+    r = d->pathL->sizeHint();
+    t = d->fileL->sizeHint();
+    RM;
+    t = d->typeL->sizeHint();
+    RM;
+    d->pathL->setFixedSize( d->pathL->sizeHint() );
+    d->fileL->setFixedSize( r );
+    d->typeL->setFixedSize( r );
+
+    // single-line input areas
+    r = d->paths->sizeHint();
+    t = nameEdit->sizeHint();
+    RM;
+    t = d->types->sizeHint();
+    RM;
+    r.setWidth( t.width() * 2 / 3 );
+    t.setWidth( QWIDGETSIZE_MAX );
+    t.setHeight( r.height() );
+    d->paths->setMinimumSize( r );
+    d->paths->setMaximumSize( t );
+    nameEdit->setMinimumSize( r );
+    nameEdit->setMaximumSize( t );
+    d->types->setMinimumSize( r );
+    d->types->setMaximumSize( t );
+
+    // buttons on top row
+    r = QSize( 0, d->paths->minimumSize().height() );
+    t = QSize( 21, 20 );
+    RM;
+    if ( r.height()+1 > r.width() )
+       r.setWidth( r.height()+1 );
+    if ( d->goBack )
+       d->goBack->setFixedSize( r );
+    d->cdToParent->setFixedSize( r );
+    d->newFolder->setFixedSize( r );
+    d->mcView->setFixedSize( r );
+    d->detailView->setFixedSize( r );
+
+    QButton *b = 0;
+    if ( !d->toolButtons.isEmpty() ) {
+       for ( b = d->toolButtons.first(); b; b = d->toolButtons.next() )
+           b->setFixedSize( b->sizeHint().width(), r.height() );
+    }
+
+    if ( d->infoPreview ) {
+       d->previewInfo->show();
+       d->previewInfo->setFixedSize( r );
+    } else {
+       d->previewInfo->hide();
+       d->previewInfo->setFixedSize( QSize( 0, 0 ) );
+    }
+
+    if ( d->contentsPreview ) {
+       d->previewContents->show();
+       d->previewContents->setFixedSize( r );
+    } else {
+       d->previewContents->hide();
+       d->previewContents->setFixedSize( QSize( 0, 0 ) );
+    }
+
+    // open/save, cancel
+    r = QSize( 75, 20 );
+    t = okB->sizeHint();
+    RM;
+    t = cancelB->sizeHint();
+    RM;
+
+    okB->setFixedSize( r );
+    cancelB->setFixedSize( r );
+
+    d->topLevelLayout->activate();
+
+#undef RM
+}
+
+
+/*! Updates the file name edit box to \a newItem in the file dialog
+ when the cursor moves in the listview.
+*/
+
+void QFileDialogP::updateFileNameEdit( QListViewItem * newItem )
+{
+    if ( !newItem )
+       return;
+
+    if ( mode() == ExistingFiles ) {
+       detailViewSelectionChanged();
+        QUrl u = QUrl( d->url, QFileDialogPrivate::encodeFileName( ((QFileDialogPrivate::File*)files->currentItem())->info.name() ) );
+       QFileInfo fi( u.toString( FALSE, FALSE ) );
+       if ( !fi.isDir() )
+           emit fileHighlighted( u.toString( FALSE, FALSE ) );
+    } else if ( files->isSelected( newItem ) ) {
+       QFileDialogPrivate::File * i = (QFileDialogPrivate::File *)newItem;
+       if ( i && i->i && !i->i->isSelected() ) {
+           d->moreFiles->blockSignals( TRUE );
+           d->moreFiles->setSelected( i->i, TRUE );
+           d->moreFiles->blockSignals( FALSE );
+       }
+       // Encode the filename in case it had any special characters in it
+       QString encFile = QFileDialogPrivate::encodeFileName( newItem->text( 0 ) );
+       trySetSelection( i->info.isDir(), QUrlOperator( d->url, encFile ), TRUE );
+    }
+}
+
+void QFileDialogP::detailViewSelectionChanged()
+{
+    if ( d->mode != ExistingFiles )
+       return;
+
+    nameEdit->clear();
+    QString str;
+    QListViewItem * i = files->firstChild();
+    d->moreFiles->blockSignals( TRUE );
+    while( i ) {
+       if ( d->moreFiles && isVisible() ) {
+           if ( ( (QFileDialogPrivate::File *)i )->i->isSelected() != i->isSelected() )
+               d->moreFiles->setSelected( ( (QFileDialogPrivate::File *)i )->i, i->isSelected() );
+       }
+       if ( i->isSelected() && !( (QFileDialogPrivate::File *)i )->info.isDir() )
+           str += QString( "\"%1\" " ).arg( i->text( 0 ) );
+       i = i->nextSibling();
+    }
+    d->moreFiles->blockSignals( FALSE );
+    nameEdit->setText( str );
+    nameEdit->setCursorPosition( str.length() );
+    okB->setEnabled( TRUE );
+    if ( d->preview && d->preview->isVisible() && files->currentItem() ) {
+       QUrl u = QUrl( d->url, QFileDialogPrivate::encodeFileName( ((QFileDialogPrivate::File*)files->currentItem())->info.name() ) );
+       if ( d->infoPreviewer )
+           d->infoPreviewer->previewUrl( u );
+       if ( d->contentsPreviewer )
+           d->contentsPreviewer->previewUrl( u );
+    }
+}
+
+void QFileDialogP::listBoxSelectionChanged()
+{
+    if ( d->mode != ExistingFiles )
+       return;
+
+    if ( d->ignoreNextRefresh ) {
+       d->ignoreNextRefresh = FALSE;
+       return;
+    }
+
+    nameEdit->clear();
+    QString str;
+    QListBoxItem * i = d->moreFiles->item( 0 );
+    QListBoxItem * j = 0;
+    int index = 0;
+    files->blockSignals( TRUE );
+    while( i ) {
+       if ( files && isVisible() ) {
+           if ( ( (QFileDialogPrivate::MCItem *)i )->i->isSelected() != i->isSelected() )
+               files->setSelected( ( (QFileDialogPrivate::MCItem *)i )->i, i->isSelected() );
+       }
+       if ( d->moreFiles->isSelected( i )
+       && !( (QFileDialogPrivate::File*)( (QFileDialogPrivate::MCItem *)i )->i )->info.isDir() )
+       {
+           str += QString( "\"%1\" " ).arg( i->text() );
+           if ( j == 0 )
+               j = i;
+       }
+       i = d->moreFiles->item( ++index );
+    }
+    files->blockSignals( FALSE );
+    nameEdit->setText( str );
+    nameEdit->setCursorPosition( str.length() );
+    okB->setEnabled( TRUE );
+    if ( d->preview && d->preview->isVisible() && j ) {
+       QUrl u = QUrl( d->url,
+                      QFileDialogPrivate::encodeFileName( ( (QFileDialogPrivate::File*)( (QFileDialogPrivate::MCItem*)j )->i )->info.name() ) );
+       if ( d->infoPreviewer )
+           d->infoPreviewer->previewUrl( u );
+       if ( d->contentsPreviewer )
+           d->contentsPreviewer->previewUrl( u );
+    }
+}
+
+/*! \overload */
+
+void QFileDialogP::updateFileNameEdit( QListBoxItem * newItem )
+{
+    if ( !newItem )
+       return;
+    QFileDialogPrivate::MCItem * i = (QFileDialogPrivate::MCItem *)newItem;
+    if ( d->mode != ExistingFiles && i->i ) {
+       i->i->listView()->setSelected( i->i, i->isSelected() );
+       updateFileNameEdit( i->i );
+    }
+}
+
+
+/*!  Updates the dialog when the file name edit changes. */
+
+void QFileDialogP::fileNameEditDone()
+{
+    QUrlInfo f( d->url, nameEdit->text() );
+    if ( mode() != QFileDialogP::ExistingFiles ) {
+       QUrlOperator u( d->url, QFileDialogPrivate::encodeFileName( nameEdit->text() ) );
+       trySetSelection( f.isDir(), u, FALSE );
+       if ( d->preview && d->preview->isVisible() ) {
+           if ( d->infoPreviewer )
+               d->infoPreviewer->previewUrl( u );
+           if ( d->contentsPreviewer )
+               d->contentsPreviewer->previewUrl( u );
+       }
+    }
+}
+
+
+
+/*! This private slot reacts to double-clicks in the list view. The item that
+was double-clicked is specified in \a newItem */
+
+void QFileDialogP::selectDirectoryOrFile( QListViewItem * newItem )
+{
+
+    *workingDirectory = d->url;
+    detailViewMode = files->isVisible();
+    *lastSize = size();
+
+    if ( !newItem )
+       return;
+
+#if defined(Q_WS_WIN)
+    QFileInfo fi( d->url.path() + newItem->text(0) );
+    if ( fi.isSymLink() ) {
+       nameEdit->setText( fi.readLink() );
+       okClicked();
+       return;
+    }
+#endif
+
+    QFileDialogPrivate::File * i = (QFileDialogPrivate::File *)newItem;
+
+    QString oldName = nameEdit->text();
+    if ( i->info.isDir() ) {
+       setUrl( QUrlOperator( d->url, QFileDialogPrivate::encodeFileName( i->info.name() ) + "/" ) );
+       if ( isDirectoryMode( mode() ) ) {
+           QUrlInfo f ( d->url, QString::fromLatin1( "." ) );
+           trySetSelection( f.isDir(), d->url, TRUE );
+       }
+    } else if ( newItem->isSelectable() &&
+               trySetSelection( i->info.isDir(), QUrlOperator( d->url, QFileDialogPrivate::encodeFileName( i->info.name() ) ), TRUE ) ) {
+       if ( !isDirectoryMode( mode() ) ) {
+           emit fileSelected( selectedFile() );
+           accept();
+       }
+    } else if ( isDirectoryMode( d->mode ) ) {
+       d->currentFileName = d->url;
+       accept();
+    }
+    if ( !oldName.isEmpty() && !isDirectoryMode( mode() ) )
+       nameEdit->setText( oldName );
+}
+
+
+void QFileDialogP::selectDirectoryOrFile( QListBoxItem * newItem )
+{
+    if ( !newItem )
+       return;
+
+    QFileDialogPrivate::MCItem * i = (QFileDialogPrivate::MCItem *)newItem;
+    if ( i->i ) {
+       i->i->listView()->setSelected( i->i, i->isSelected() );
+       selectDirectoryOrFile( i->i );
+    }
+}
+
+
+void QFileDialogP::popupContextMenu( QListViewItem *item, const QPoint &p,
+                                   int )
+{
+    if ( item && d->mode == ExistingFiles )
+       return;
+    if ( item ) {
+       files->setCurrentItem( item );
+       files->setSelected( item, TRUE );
+    }
+
+    PopupAction action;
+    popupContextMenu( item ? item->text( 0 ) : QString::null, TRUE, action, p );
+
+    if ( action == PA_Open )
+       selectDirectoryOrFile( item );
+    else if ( action == PA_Rename )
+       files->startRename( FALSE );
+    else if ( action == PA_Delete )
+       deleteFile( item ? item->text( 0 ) : QString::null );
+    else if ( action == PA_Reload )
+       rereadDir();
+    else if ( action == PA_Hidden ) {
+       bShowHiddenFiles = !bShowHiddenFiles;
+       rereadDir();
+    } else if ( action == PA_SortName ) {
+       sortFilesBy = (int)QDir::Name;
+       sortAscending = TRUE;
+       resortDir();
+    } else if ( action == PA_SortSize ) {
+       sortFilesBy = (int)QDir::Size;
+       sortAscending = TRUE;
+       resortDir();
+    } else if ( action == PA_SortDate ) {
+       sortFilesBy = (int)QDir::Time;
+       sortAscending = TRUE;
+       resortDir();
+    } else if ( action == PA_SortUnsorted ) {
+       sortFilesBy = (int)QDir::Unsorted;
+       sortAscending = TRUE;
+       resortDir();
+    }
+
+}
+
+void QFileDialogP::popupContextMenu( QListBoxItem *item, const QPoint & p )
+{
+    if ( item && d->mode == ExistingFiles )
+       return;
+
+    PopupAction action;
+    popupContextMenu( item ? item->text() : QString::null, FALSE, action, p );
+
+    if ( action == PA_Open )
+       selectDirectoryOrFile( item );
+    else if ( action == PA_Rename )
+       d->moreFiles->startRename( FALSE );
+    else if ( action == PA_Delete )
+       deleteFile( item->text() );
+    else if ( action == PA_Reload )
+       rereadDir();
+    else if ( action == PA_Hidden ) {
+       bShowHiddenFiles = !bShowHiddenFiles;
+       rereadDir();
+    } else if ( action == PA_SortName ) {
+       sortFilesBy = (int)QDir::Name;
+       sortAscending = TRUE;
+       resortDir();
+    } else if ( action == PA_SortSize ) {
+       sortFilesBy = (int)QDir::Size;
+       sortAscending = TRUE;
+       resortDir();
+    } else if ( action == PA_SortDate ) {
+       sortFilesBy = (int)QDir::Time;
+       sortAscending = TRUE;
+       resortDir();
+    } else if ( action == PA_SortUnsorted ) {
+       sortFilesBy = (int)QDir::Unsorted;
+       sortAscending = TRUE;
+       resortDir();
+    }
+}
+
+void QFileDialogP::popupContextMenu( const QString &filename, bool,
+                                   PopupAction &action, const QPoint &p )
+{
+    action = PA_Cancel;
+
+    bool glob = filename.isEmpty();
+
+    QPopupMenu m( 0, "file dialog context menu" );
+    m.setCheckable( TRUE );
+
+    if ( !glob ) {
+       QString okt;
+       if ( QUrlInfo( d->url, filename ).isDir() ) {
+           okt = tr( "&Open" );
+       } else {
+           if ( mode() == AnyFile )
+               okt = tr( "&Save" );
+           else
+               okt = tr( "&Open" );
+       }
+       int ok = m.insertItem( okt );
+
+       m.insertSeparator();
+       int rename = m.insertItem( tr( "&Rename" ) );
+       int del = m.insertItem( tr( "&Delete" ) );
+
+       if ( filename.isEmpty() || !QUrlInfo( d->url, filename ).isWritable() ||
+            filename == ".." ) {
+           if ( filename.isEmpty() || !QUrlInfo( d->url, filename ).isReadable() )
+               m.setItemEnabled( ok, FALSE );
+           m.setItemEnabled( rename, FALSE );
+           m.setItemEnabled( del, FALSE );
+       }
+
+       if ( mode() == QFileDialogP::ExistingFiles )
+           m.setItemEnabled( rename, FALSE );
+
+       m.move( p );
+       int res = m.exec();
+
+       if ( res == ok )
+           action = PA_Open;
+       else if ( res == rename )
+           action = PA_Rename;
+       else if ( res == del )
+           action = PA_Delete;
+    } else {
+       int reload = m.insertItem( tr( "R&eload" ) );
+
+       QPopupMenu m2( 0, "sort menu" );
+
+       int sname = m2.insertItem( tr( "Sort by &Name" ) );
+       //int stype = m2.insertItem( tr( "Sort by &Type" ) );
+       int ssize = m2.insertItem( tr( "Sort by &Size" ) );
+       int sdate = m2.insertItem( tr( "Sort by &Date" ) );
+       m2.insertSeparator();
+       int sunsorted = m2.insertItem( tr( "&Unsorted" ) );
+
+       //m2.setItemEnabled( stype, FALSE );
+
+       if ( sortFilesBy == (int)QDir::Name )
+           m2.setItemChecked( sname, TRUE );
+       else if ( sortFilesBy == (int)QDir::Size )
+           m2.setItemChecked( ssize, TRUE );
+//     else if ( sortFilesBy == 0x16 )
+//         m2.setItemChecked( stype, TRUE );
+       else if ( sortFilesBy == (int)QDir::Time )
+           m2.setItemChecked( sdate, TRUE );
+       else if ( sortFilesBy == (int)QDir::Unsorted )
+           m2.setItemChecked( sunsorted, TRUE );
+
+       m.insertItem( tr( "Sort" ), &m2 );
+
+       m.insertSeparator();
+
+       int hidden = m.insertItem( tr( "Show &hidden files" ) );
+       m.setItemChecked( hidden, bShowHiddenFiles );
+
+       m.move( p );
+       int res = m.exec();
+
+       if ( res == reload )
+           action = PA_Reload;
+       else if ( res == hidden )
+           action = PA_Hidden;
+       else if ( res == sname )
+           action = PA_SortName;
+//     else if ( res == stype )
+//         action = PA_SortType;
+       else if ( res == sdate )
+           action = PA_SortDate;
+       else if ( res == ssize )
+           action = PA_SortSize;
+       else if ( res == sunsorted )
+           action = PA_SortUnsorted;
+    }
+
+}
+
+void QFileDialogP::deleteFile( const QString &filename )
+{
+    if ( filename.isEmpty() )
+       return;
+
+    QUrlInfo fi( d->url, QFileDialogPrivate::encodeFileName( filename ) );
+    QString t = tr( "the file" );
+    if ( fi.isDir() )
+       t = tr( "the directory" );
+    if ( fi.isSymLink() )
+       t = tr( "the symlink" );
+
+    if ( QMessageBox::warning( this,
+                              tr( "Delete %1" ).arg( t ),
+                              tr( "<qt>Are you sure you wish to delete %1 \"%2\"?</qt>" )
+                              .arg( t ).arg(filename),
+                              tr( "&Yes" ), tr( "&No" ), QString::null, 1 ) == 0 )
+       d->url.remove( QFileDialogPrivate::encodeFileName( filename ) );
+
+}
+
+void QFileDialogP::fileSelected( int  )
+{
+    // unused
+}
+
+void QFileDialogP::fileHighlighted( int )
+{
+    // unused
+}
+
+void QFileDialogP::dirSelected( int )
+{
+    // unused
+}
+
+void QFileDialogP::pathSelected( int )
+{
+    // unused
+}
+
+
+void QFileDialogP::cdUpClicked()
+{
+    QString oldName = nameEdit->text();
+    setUrl( QUrlOperator( d->url, ".." ) );
+    if ( !oldName.isEmpty() )
+       nameEdit->setText( oldName );
+}
+
+void QFileDialogP::newFolderClicked()
+{
+    QString foldername( tr( "New Folder 1" ) );
+    int i = 0;
+    QStringList lst;
+    QListViewItemIterator it( files );
+    for ( ; it.current(); ++it )
+       if ( it.current()->text( 0 ).contains( tr( "New Folder" ) ) )
+           lst.append( it.current()->text( 0 ) );
+
+    if ( !lst.count() == 0 )
+       while ( lst.contains( foldername ) )
+           foldername = tr( "New Folder %1" ).arg( ++i );
+
+    d->url.mkdir( foldername );
+}
+
+void QFileDialogP::createdDirectory( const QUrlInfo &info, QNetworkOperation * )
+{
+    resortDir();
+    if ( d->moreFiles->isVisible() ) {
+       for ( uint i = 0; i < d->moreFiles->count(); ++i ) {
+           if ( d->moreFiles->text( i ) == info.name() ) {
+               d->moreFiles->setCurrentItem( i );
+               d->moreFiles->startRename( FALSE );
+               break;
+           }
+       }
+    } else {
+       QListViewItem *item = files->firstChild();
+       while ( item ) {
+           if ( item->text( 0 ) == info.name() ) {
+               files->setSelected( item, TRUE );
+               files->setCurrentItem( item );
+               files->startRename( FALSE );
+               break;
+           }
+           item = item->nextSibling();
+       }
+    }
+}
+
+
+/*!
+  This is a convenience static function that will return an existing directory
+  selected by the user.
+
+  \code
+    QString s = QFileDialogP::getExistingDirectory(
+                    "/home",
+                   this,
+                   "get existing directory"
+                   "Choose a directory",
+                   TRUE );
+  \endcode
+
+  This function creates a modal file dialog called \a name, with
+  parent, \a parent. If parent is not 0, the dialog will be shown
+  centered over the parent.
+
+  The dialog's working directory is set to \a dir, and the caption is
+  set to \a caption. Either of these may be QString::null in which case
+  the current directory and a default caption will be used respectively.
+
+  If \a dirOnly is TRUE, then only directories will be shown in
+  the file dialog; otherwise both directories and files will be shown.
+
+  Under Unix/X11, the normal behavior of the file dialog is to resolve
+  and follow symlinks. For example, if /usr/tmp is a symlink to /var/tmp,
+  the file dialog will change to /var/tmp after entering /usr/tmp.
+  If \a resolveSymlinks is FALSE, the file dialog will treat
+  symlinks as regular directories.
+
+  \sa getOpenFileName(), getOpenFileNames(), getSaveFileName()
+*/
+
+QString QFileDialogP::getExistingDirectory( const QString & dir,
+                                          QWidget *parent,
+                                          const char* name,
+                                          const QString& caption,
+                                          bool dirOnly,
+                                          bool resolveSymlinks)
+{
+    bool save_qt_resolve_symlinks = qt_resolve_symlinks;
+    qt_resolve_symlinks = resolveSymlinks;
+
+    makeVariables();
+    QString wd;
+    if ( workingDirectory )
+       wd = *workingDirectory;
+
+#if defined(Q_WS_WIN)
+    QString initialDir;
+    if ( !dir.isEmpty() ) {
+       QUrlOperator u( dir );
+       if ( QFileInfo( u.path() ).isDir() )
+           initialDir = dir;
+    } else
+       initialDir = QString::null;
+    if ( qApp->style().styleHint( QStyle::SH_GUIStyle ) == WindowsStyle && dirOnly )
+        return winGetExistingDirectory( initialDir, parent, name, caption );
+#endif
+#if defined(Q_WS_MAC)
+    if( ( qApp->style().inherits(QMAC_DEFAULT_STYLE) ) )
+       return macGetOpenFileNames("", 0,
+                                  parent, name, caption, FALSE, TRUE).first();
+#endif
+
+    QFileDialogP *dialog = new QFileDialogP( parent, name ? name : "qt_filedlg_ged", TRUE );
+#ifndef QT_NO_WIDGET_TOPEXTRA
+    if ( !caption.isNull() )
+       dialog->setCaption( caption );
+    else
+       dialog->setCaption( QFileDialogP::tr("Find Directory") );
+#endif
+
+    dialog->setMode( dirOnly ? DirectoryOnly : Directory );
+
+    dialog->d->types->clear();
+    dialog->d->types->insertItem( QFileDialogP::tr("Directories") );
+    dialog->d->types->setEnabled( FALSE );
+
+    QString dir_( dir );
+    dir_ = dir_.simplifyWhiteSpace();
+    if ( dir_.isEmpty() && !wd.isEmpty() )
+       dir_ = wd;
+    QUrlOperator u( dir_ );
+    if ( u.isLocalFile() ) {
+       if ( !dir_.isEmpty() ) {
+           QFileInfo f( u.path() );
+       if ( f.exists() )
+       if ( f.isDir() ) {
+               dialog->setDir( dir_ );
+               wd = dir_;
+           }
+       } else if ( !wd.isEmpty() ) {
+           QUrl tempUrl( wd );
+           QFileInfo f( tempUrl.path() );
+           if ( f.isDir() ) {
+               dialog->setDir( wd );
+           }
+       } else {
+           QString theDir = dir_;
+           if ( theDir.isEmpty() ) {
+               theDir = QDir::currentDirPath();
+           } if ( !theDir.isEmpty() ) {
+               QUrl tempUrl( theDir );
+               QFileInfo f( tempUrl.path() );
+               if ( f.isDir() ) {
+                   wd = theDir;
+                   dialog->setDir( theDir );
+               }
+           }
+       }
+    } else {
+       dialog->setUrl( dir_ );
+    }
+
+    QString result;
+    dialog->setSelection( dialog->d->url.toString() );
+
+    if ( dialog->exec() == QDialog::Accepted ) {
+       result = dialog->selectedFile();
+       wd = result;
+    }
+    delete dialog;
+
+    if ( !result.isEmpty() && result.right( 1 ) != "/" )
+       result += "/";
+
+    qt_resolve_symlinks = save_qt_resolve_symlinks;
+
+    return result;
+}
+
+
+/*!
+  \property QFileDialogP::mode
+  \brief the file dialog's mode
+
+  The default mode is \c ExistingFile.
+*/
+
+void QFileDialogP::setMode( Mode newMode )
+{
+    if ( d->mode != newMode ) {
+       d->mode = newMode;
+       QString sel = d->currentFileName;
+       if ( isDirectoryMode( newMode ) ) {
+           files->setMultiSelection( FALSE );
+           d->moreFiles->setMultiSelection( FALSE );
+           if ( sel.isNull() )
+               sel = QString::fromLatin1(".");
+           d->types->setEnabled( FALSE );
+       } else if ( newMode == ExistingFiles ) {
+           files->setSelectionMode( QListView::Extended );
+           d->moreFiles->setSelectionMode( QListBox::Extended );
+           d->types->setEnabled( TRUE );
+       } else {
+           files->setMultiSelection( FALSE );
+           d->moreFiles->setMultiSelection( FALSE );
+           d->types->setEnabled( TRUE );
+       }
+       rereadDir();
+       QUrlInfo f( d->url, "." );
+       trySetSelection( f.isDir(), d->url, FALSE );
+    }
+
+    QString okt;
+    bool changeFilters = FALSE;
+    if ( mode() == AnyFile ) {
+       okt = tr("Save");
+       d->fileL->setText( tr("File &name:") );
+       if ( d->types->count() == 1 ) {
+           d->types->setCurrentItem( 0 );
+           if ( d->types->currentText() == "Directories" ) {
+               changeFilters = TRUE;
+           }
+       }
+    }
+    else if ( mode() == Directory || mode() == DirectoryOnly ) {
+       okt = tr("OK");
+       d->fileL->setText( tr("Directory:") );
+       d->types->clear();
+       d->types->insertItem( tr("Directories") );
+    }
+    else {
+       okt = tr("Open");
+       d->fileL->setText( tr("File &name:") );
+       if ( d->types->count() == 1 ) {
+           d->types->setCurrentItem( 0 );
+           if ( d->types->currentText() == "Directories" ) {
+               changeFilters = TRUE;
+           }
+       }
+    }
+
+    if ( changeFilters ) {
+       d->types->clear();
+       d->types->insertItem( tr("All Files (*)") );
+    }
+
+    okB->setText( okt );
+}
+
+QFileDialogP::Mode QFileDialogP::mode() const
+{
+    return d->mode;
+}
+
+/*! \reimp
+*/
+
+void QFileDialogP::done( int i )
+{
+    if ( i == QDialog::Accepted && (d->mode == ExistingFile || d->mode == ExistingFiles) ) {
+       QStringList selection = selectedFiles();
+       for ( uint f = 0; f < selection.count(); f++ ) {
+           QString file = selection[f];
+           if ( file.isNull() )
+               continue;
+           if ( d->url.isLocalFile() && !QFile::exists( file ) ) {
+               QMessageBox::information( this, tr("Error"), tr("%1\nFile not found.\nCheck path and filename.").arg( file ) );
+               return;
+           }
+       }
+    }
+    QDialog::done( i );
+}
+
+/*!
+  \property QFileDialogP::viewMode
+
+  \brief the file dialog's view mode
+
+  If you set the view mode to be \e Detail (the default), then you
+  will see the file's details, such as the size of the file and the
+  date the file was last modified in addition to the file's name.
+
+  If you set the view mode to be \e List, then you will just
+  see a list of the files and folders.
+
+  See \l QFileDialogP::ViewMode
+*/
+
+
+QFileDialogP::ViewMode QFileDialogP::viewMode() const
+{
+    if ( detailViewMode )
+       return Detail;
+    else
+       return List;
+}
+
+void QFileDialogP::setViewMode( ViewMode m )
+{
+    if ( m == Detail ) {
+       detailViewMode = TRUE;
+       d->stack->raiseWidget( files );
+       d->detailView->setOn( TRUE );
+       d->mcView->setOn( FALSE );
+    } else if ( m == List ) {
+       detailViewMode = FALSE;
+       d->stack->raiseWidget( d->moreFiles );
+       d->detailView->setOn( FALSE );
+       d->mcView->setOn( TRUE );
+    }
+}
+
+
+/*!
+  \property QFileDialogP::previewMode
+
+  \brief the preview mode for the file dialog
+
+  If you set the mode to be a mode other than \e NoPreview, you must
+  use setInfoPreview() or setContentsPreview() to set the dialog's
+  preview widget to your preview widget and enable the preview
+  widget(s) with setInfoPreviewEnabled() or
+  setContentsPreviewEnabled().
+
+  \sa infoPreview, contentsPreview, viewMode
+*/
+
+void QFileDialogP::setPreviewMode( PreviewMode m )
+{
+    if ( m == NoPreview ) {
+       d->previewInfo->setOn( FALSE );
+       d->previewContents->setOn( FALSE );
+    } else if ( m == Info && d->infoPreview ) {
+       d->previewInfo->setOn( TRUE );
+       d->previewContents->setOn( FALSE );
+       changeMode( d->modeButtons->id( d->previewInfo ) );
+    } else if ( m == Contents && d->contentsPreview ) {
+       d->previewInfo->setOn( FALSE );
+       d->previewContents->setOn( TRUE );
+       changeMode( d->modeButtons->id( d->previewContents ) );
+    }
+}
+QFileDialogP::PreviewMode QFileDialogP::previewMode() const
+{
+    if ( d->infoPreview && d->previewInfo->isVisible() )
+       return Info;
+    else if ( d->contentsPreview && d->previewContents->isVisible() )
+       return Contents;
+
+    return NoPreview;
+}
+
+
+/*!
+  Adds the specified widgets to the bottom of the file dialog. The
+  label \a l is placed underneath the "file name" and the "file types"
+  labels. The widget \a w is placed underneath the file types combobox.
+  The button \a b is placed underneath the Cancel pushbutton.
+
+  \code
+    MyFileDialog::MyFileDialog( QWidget* parent, const char* name ) :
+       QFileDialogP( parent, name )
+    {
+       QLabel* label = new QLabel( "Added widgets", this );
+       QLineEdit* lineedit = new QLineEdit( this );
+       QToolButton* toolbutton = new QToolButton( this );
+
+       addWidgets( label, lineedit, toolbutton );
+    }
+  \endcode
+
+  If you don't want to have one of the widgets added, pass 0 in that
+  widget's position.
+
+  Every time you call this function, a new row of widgets will be added
+  to the bottom of the file dialog.
+
+  \sa addToolButton(), addLeftWidget(), addRightWidget()
+*/
+
+void QFileDialogP::addWidgets( QLabel * l, QWidget * w, QPushButton * b )
+{
+    if ( !l && !w && !b )
+       return;
+
+    d->geometryDirty = TRUE;
+
+    QHBoxLayout *lay = new QHBoxLayout();
+    d->extraWidgetsLayouts.append( lay );
+    d->topLevelLayout->addLayout( lay );
+
+    if ( !l )
+       l = new QLabel( this, "qt_intern_lbl" );
+    d->extraLabels.append( l );
+    lay->addWidget( l );
+
+    if ( !w )
+       w = new QWidget( this, "qt_intern_widget" );
+    d->extraWidgets.append( w );
+    lay->addWidget( w );
+    lay->addSpacing( 15 );
+
+    if ( b ) {
+       d->extraButtons.append( b );
+       lay->addWidget( b );
+    } else {
+       QWidget *wid = new QWidget( this, "qt_extrabuttons_widget" );
+       d->extraButtons.append( wid );
+       lay->addWidget( wid );
+    }
+
+    updateGeometries();
+}
+
+/*!
+  Adds the tool button \a b to the row of tool buttons at the top of the
+  file dialog. The button is appended to the right of
+  this row. If \a separator is TRUE, a small space is inserted between the
+  last button of the row and the new button \a b.
+
+  \sa addWidgets(), addLeftWidget(), addRightWidget()
+*/
+
+void QFileDialogP::addToolButton( QButton *b, bool separator )
+{
+    if ( !b || !d->buttonLayout )
+       return;
+
+    d->geometryDirty = TRUE;
+
+    d->toolButtons.append( b );
+    if ( separator )
+       d->buttonLayout->addSpacing( 8 );
+    d->buttonLayout->addWidget( b );
+
+    updateGeometries();
+}
+
+/*!
+  Adds the widget \a w to the left-hand side of the file dialog.
+
+  \sa addRightWidget(), addWidgets(), addToolButton()
+*/
+
+void QFileDialogP::addLeftWidget( QWidget *w )
+{
+    if ( !w )
+       return;
+    d->geometryDirty = TRUE;
+
+    d->leftLayout->addWidget( w );
+    d->leftLayout->addSpacing( 5 );
+
+    updateGeometries();
+}
+
+/*!
+  Adds the widget \a w to the right-hand side of the file dialog.
+
+  \sa addLeftWidget(), addWidgets(), addToolButton()
+*/
+
+void QFileDialogP::addRightWidget( QWidget *w )
+{
+    if ( !w )
+       return;
+    d->geometryDirty = TRUE;
+
+    d->rightLayout->addSpacing( 5 );
+    d->rightLayout->addWidget( w );
+
+    updateGeometries();
+}
+
+/*! \reimp */
+
+void QFileDialogP::keyPressEvent( QKeyEvent * ke )
+{
+    if ( !d->ignoreNextKeyPress &&
+        ke && ( ke->key() == Key_Enter ||
+                ke->key() == Key_Return ) ) {
+       ke->ignore();
+       if ( d->paths->hasFocus() ) {
+           ke->accept();
+           if ( d->url == QUrl(d->paths->currentText()) )
+               nameEdit->setFocus();
+       } else if ( d->types->hasFocus() ) {
+           ke->accept();
+           // ### is there a suitable condition for this?  only valid
+           // wildcards?
+           nameEdit->setFocus();
+       } else if ( nameEdit->hasFocus() ) {
+           if ( d->currentFileName.isNull() ) {
+               // maybe change directory
+               QUrlInfo i( d->url, nameEdit->text() );
+               if ( i.isDir() ) {
+                   nameEdit->setText( QString::fromLatin1("") );
+                   setDir( QUrlOperator( d->url, QFileDialogPrivate::encodeFileName(i.name()) ) );
+               }
+               ke->accept();
+           } else if ( mode() == ExistingFiles ) {
+               QUrlInfo i( d->url, nameEdit->text() );
+               if ( i.isFile() ) {
+                   QListViewItem * i = files->firstChild();
+                   while ( i && nameEdit->text() != i->text( 0 ) )
+                       i = i->nextSibling();
+                   if ( i )
+                       files->setSelected( i, TRUE );
+                   else
+                       ke->accept(); // strangely, means to ignore that event
+               }
+           }
+       } else if ( files->hasFocus() || d->moreFiles->hasFocus() ) {
+           ke->accept();
+       }
+    } else if ( ke->key() == Key_Escape ) {
+       ke->ignore();
+    }
+
+    d->ignoreNextKeyPress = FALSE;
+
+    if ( !ke->isAccepted() ) {
+       QDialog::keyPressEvent( ke );
+    }
+}
+
+
+/*! \class QFileIconProviderP qfiledialog.h
+
+  \brief The QFileIconProviderP class provides icons for QFileDialogP to
+  use.
+
+  \ingroup misc
+
+  By default QFileIconProviderP is not used, but any application or
+  library can subclass it, reimplement pixmap() to return a suitable
+  icon, and make all QFileDialogP objects use it by calling the static
+  function QFileDialogP::setIconProvider().
+
+  It is advisable to make all the icons that QFileIconProviderP returns be
+  the same size or at least the same width. This makes the list view
+  look much better.
+
+  \sa QFileDialogP
+*/
+
+
+/*! Constructs an empty file icon provider called \a name, with the
+  parent \a parent.
+*/
+
+QFileIconProviderP::QFileIconProviderP( QObject * parent, const char* name )
+    : QObject( parent, name )
+{
+    // nothing necessary
+}
+
+
+/*!
+  Returns a pointer to a pixmap that should be used to
+  signify the file with the information \a info.
+
+  If pixmap() returns 0, QFileDialogP draws the default pixmap.
+
+  The default implementation returns particular icons for files, directories,
+  link-files and link-directories. It returns a blank "icon" for other types.
+
+  If you return a pixmap here, it should measure 16x16 pixels.
+*/
+
+const QPixmap * QFileIconProviderP::pixmap( const QFileInfo & info )
+{
+    if ( info.isSymLink() ) {
+       if ( info.isFile() )
+           return symLinkFileIcon;
+       else
+           return symLinkDirIcon;
+    } else if ( info.isDir() ) {
+       return closedFolderIcon;
+    } else if ( info.isFile() ) {
+       return fileIcon;
+    } else {
+       return fifteenTransparentPixels;
+    }
+}
+
+/*!
+  Sets the QFileIconProviderP used by the file dialog to \a provider.
+
+  The default is that there is no QFileIconProviderP and QFileDialogP
+  just draws a folder icon next to each directory and nothing next
+  to files.
+
+  \sa QFileIconProviderP, iconProvider()
+*/
+
+void QFileDialogP::setIconProvider( QFileIconProviderP * provider )
+{
+    fileIconProvider = provider;
+}
+
+
+/*!
+  Returns a pointer to the icon provider currently set on the file dialog.
+  By default there is no icon provider, and this function returns 0.
+
+  \sa setIconProvider(), QFileIconProviderP
+*/
+
+QFileIconProviderP * QFileDialogP::iconProvider()
+{
+    return fileIconProvider;
+}
+
+
+#if defined(Q_WS_WIN)
+
+static QString getWindowsRegString( HKEY key, const char *subKey )
+{
+    QString s;
+    char  buf[512];
+    DWORD bsz = sizeof(buf);
+#ifdef Q_OS_TEMP
+    int r = RegQueryValueEx( key, (LPCTSTR)qt_winTchar(subKey, TRUE), 0, 0, (LPBYTE)buf, &bsz );
+#else
+    int r = RegQueryValueExA( key, subKey, 0, 0, (LPBYTE)buf, &bsz );
+#endif
+    if ( r == ERROR_SUCCESS ) {
+       s = buf;
+    } else if ( r == ERROR_MORE_DATA ) {
+       char *ptr = new char[bsz+1];
+#ifdef Q_OS_TEMP
+       r = RegQueryValueEx( key, (LPCTSTR)qt_winTchar(subKey, TRUE), 0, 0, (LPBYTE)ptr, &bsz );
+#else
+       r = RegQueryValueExA( key, subKey, 0, 0, (LPBYTE)ptr, &bsz );
+#endif
+       if ( r == ERROR_SUCCESS )
+           s = ptr;
+       delete [] ptr;
+    }
+    return s;
+}
+
+static void initPixmap( QPixmap &pm )
+{
+    pm.fill( Qt::white );
+}
+
+QWindowsIconProvider::QWindowsIconProvider( QObject *parent, const char *name )
+    : QFileIconProviderP( parent, name )
+{
+    pixw = GetSystemMetrics( SM_CXSMICON );
+    pixh = GetSystemMetrics( SM_CYSMICON );
+
+    HKEY k;
+    HICON si;
+    int r;
+    QString s;
+    UINT res;
+
+#ifdef Q_OS_TEMP
+    // ---------- get default folder pixmap
+    r = RegOpenKeyEx( HKEY_CLASSES_ROOT,
+                      L"folder\\DefaultIcon",
+                      0, KEY_READ, &k );
+#else
+    // ---------- get default folder pixmap
+    r = RegOpenKeyExA( HKEY_CLASSES_ROOT,
+                      "folder\\DefaultIcon",
+                      0, KEY_READ, &k );
+#endif
+    if ( r == ERROR_SUCCESS ) {
+       s = getWindowsRegString( k, 0 );
+       RegCloseKey( k );
+
+       QStringList lst = QStringList::split( ",", s );
+
+#ifdef Q_OS_TEMP
+       res = (UINT)ExtractIconEx( (LPCTSTR)qt_winTchar( lst[ 0 ].simplifyWhiteSpace(), TRUE ),
+                             lst[ 1 ].simplifyWhiteSpace().toInt(),
+                             0, &si, 1 );
+#else
+       res = ExtractIconExA( lst[ 0 ].simplifyWhiteSpace().latin1(),
+                             lst[ 1 ].simplifyWhiteSpace().toInt(),
+                             0, &si, 1 );
+#endif
+
+       if ( res ) {
+           defaultFolder.resize( pixw, pixh );
+           initPixmap( defaultFolder );
+           QPainter p( &defaultFolder );
+           DrawIconEx( p.handle(), 0, 0, si, pixw, pixh, 0, NULL,  DI_NORMAL );
+           p.end();
+           defaultFolder.setMask( defaultFolder.createHeuristicMask() );
+           *closedFolderIcon = defaultFolder;
+           DestroyIcon( si );
+       } else {
+           defaultFolder = *closedFolderIcon;
+       }
+    } else {
+       RegCloseKey( k );
+    }
+
+#ifdef Q_OS_TEMP
+    //------------------------------- get default file pixmap
+    res = (UINT)ExtractIconEx( L"shell32.dll",
+                            0, 0, &si, 1 );
+#else
+    //------------------------------- get default file pixmap
+    res = ExtractIconExA( "shell32.dll",
+                            0, 0, &si, 1 );
+#endif
+
+    if ( res ) {
+       defaultFile.resize( pixw, pixh );
+       initPixmap( defaultFile );
+       QPainter p( &defaultFile );
+       DrawIconEx( p.handle(), 0, 0, si, pixw, pixh, 0, NULL,  DI_NORMAL );
+       p.end();
+       defaultFile.setMask( defaultFile.createHeuristicMask() );
+       *fileIcon = defaultFile;
+       DestroyIcon( si );
+    } else {
+       defaultFile = *fileIcon;
+    }
+
+#ifdef Q_OS_TEMP
+    //------------------------------- get default exe pixmap
+    res = (UINT)ExtractIconEx( L"shell32.dll",
+                         2, 0, &si, 1 );
+#else
+    //------------------------------- get default exe pixmap
+    res = ExtractIconExA( "shell32.dll",
+                         2, 0, &si, 1 );
+#endif
+
+    if ( res ) {
+       defaultExe.resize( pixw, pixh );
+       initPixmap( defaultExe );
+       QPainter p( &defaultExe );
+       DrawIconEx( p.handle(), 0, 0, si, pixw, pixh, 0, NULL,  DI_NORMAL );
+       p.end();
+       defaultExe.setMask( defaultExe.createHeuristicMask() );
+       DestroyIcon( si );
+    } else {
+       defaultExe = *fileIcon;
+    }
+}
+
+QWindowsIconProvider::~QWindowsIconProvider()
+{
+    if ( this == fileIconProvider )
+       fileIconProvider = 0;
+}
+
+const QPixmap * QWindowsIconProvider::pixmap( const QFileInfo &fi )
+{
+    QString ext = fi.extension().upper();
+    QString key = ext;
+    ext.prepend( "." );
+    QMap< QString, QPixmap >::Iterator it;
+
+    if ( fi.isDir() ) {
+       return &defaultFolder;
+    } else if ( ext.lower() != ".exe" ) {
+       it = cache.find( key );
+       if ( it != cache.end() )
+           return &( *it );
+
+       HKEY k, k2;
+#ifdef Q_OS_TEMP
+       int r = RegOpenKeyEx( HKEY_CLASSES_ROOT,
+                              (LPCTSTR)qt_winTchar(ext, TRUE),
+                              0, KEY_READ, &k );
+#else
+       int r = RegOpenKeyExA( HKEY_CLASSES_ROOT,
+                              ext.latin1(),
+                              0, KEY_READ, &k );
+#endif
+       QString s;
+       if ( r == ERROR_SUCCESS ) {
+           s = getWindowsRegString( k, 0 );
+       } else {
+           cache[ key ] = defaultFile;
+           RegCloseKey( k );
+           return &defaultFile;
+       }
+       RegCloseKey( k );
+
+#ifdef Q_OS_TEMP
+       r = RegOpenKeyEx( HKEY_CLASSES_ROOT,
+                          (LPCTSTR)qt_winTchar( s + "\\DefaultIcon", TRUE ),
+                          0, KEY_READ, &k2 );
+#else
+       r = RegOpenKeyExA( HKEY_CLASSES_ROOT,
+                          QString( s + "\\DefaultIcon" ).latin1() ,
+                          0, KEY_READ, &k2 );
+#endif
+       if ( r == ERROR_SUCCESS ) {
+           s = getWindowsRegString( k2, 0 );
+       } else {
+           cache[ key ] = defaultFile;
+           RegCloseKey( k2 );
+           return &defaultFile;
+       }
+       RegCloseKey( k2 );
+
+       QStringList lst = QStringList::split( ",", s );
+
+       HICON si;
+       UINT res;
+       QString filepath = lst[ 0 ].stripWhiteSpace();
+       if ( filepath.find("%1") != -1 ) {
+           filepath = filepath.arg( fi.filePath() );
+           if ( ext.lower() == ".dll" ) {
+               pix = defaultFile;
+               return &pix;
+           }
+       }
+
+#ifdef Q_OS_TEMP
+       res = (UINT)ExtractIconEx( (LPCTSTR)qt_winTchar(filepath, TRUE),
+                             lst[ 1 ].stripWhiteSpace().toInt(),
+                             NULL, &si, 1 );
+#else
+       res = ExtractIconExA( filepath.latin1(),
+                             lst[ 1 ].stripWhiteSpace().toInt(),
+                             NULL, &si, 1 );
+#endif
+
+       if ( res ) {
+           pix.resize( pixw, pixh );
+           initPixmap( pix );
+           QPainter p( &pix );
+           DrawIconEx( p.handle(), 0, 0, si, pixw, pixh, 0, NULL,  DI_NORMAL );
+           p.end();
+           pix.setMask( pix.createHeuristicMask() );
+           DestroyIcon( si );
+       } else {
+           pix = defaultFile;
+       }
+
+       cache[ key ] = pix;
+       return &pix;
+    } else {
+       HICON si;
+       UINT res;
+#ifdef Q_OS_TEMP
+       res = (UINT)ExtractIconEx( (LPCTSTR)qt_winTchar(fi.absFilePath(), TRUE),
+                             -1,
+                             0, 0, 1 );
+#else
+       res = ExtractIconExA( fi.absFilePath().latin1(),
+                             -1,
+                             0, 0, 1 );
+#endif
+
+       if ( res == 0 ) {
+           return &defaultExe;
+       } else {
+#ifdef Q_OS_TEMP
+           res = (UINT)ExtractIconEx( (LPCTSTR)qt_winTchar(fi.absFilePath(), TRUE),
+                                 res - 1,
+                                 0, &si, 1 );
+#else
+           res = ExtractIconExA( fi.absFilePath().latin1(),
+                                 res - 1,
+                                 0, &si, 1 );
+#endif
+       }
+
+       if ( res ) {
+           pix.resize( pixw, pixh );
+           initPixmap( pix );
+           QPainter p( &pix );
+           DrawIconEx( p.handle(), 0, 0, si, pixw, pixh, 0, NULL,  DI_NORMAL );
+           p.end();
+           pix.setMask( pix.createHeuristicMask() );
+           DestroyIcon( si );
+       } else {
+           pix = defaultExe;
+       }
+
+       return &pix;
+    }
+
+    // can't happen!
+    return 0;
+}
+#endif
+
+
+
+/*!
+  \reimp
+*/
+bool QFileDialogP::eventFilter( QObject * o, QEvent * e )
+{
+    if ( e->type() == QEvent::KeyPress && ( (QKeyEvent*)e )->key() == Key_F5 ) {
+       rereadDir();
+       ((QKeyEvent *)e)->accept();
+       return TRUE;
+    } else if ( e->type() == QEvent::KeyPress && ( (QKeyEvent*)e )->key() == Key_F2 &&
+               ( o == files || o == files->viewport() ) ) {
+       if ( files->isVisible() && files->currentItem() ) {
+           if ( mode() != QFileDialogP::ExistingFiles &&
+                QUrlInfo( d->url, "." ).isWritable() && files->currentItem()->text( 0 ) != ".." ) {
+               files->renameItem = files->currentItem();
+               files->startRename( TRUE );
+           }
+       }
+       ((QKeyEvent *)e)->accept();
+       return TRUE;
+    } else if ( e->type() == QEvent::KeyPress && ( (QKeyEvent*)e )->key() == Key_F2 &&
+               ( o == d->moreFiles || o == d->moreFiles->viewport() ) ) {
+       if ( d->moreFiles->isVisible() && d->moreFiles->currentItem() != -1 ) {
+           if ( mode() != QFileDialogP::ExistingFiles &&
+                QUrlInfo( d->url, "." ).isWritable() &&
+                d->moreFiles->item( d->moreFiles->currentItem() )->text() != ".." ) {
+               d->moreFiles->renameItem = d->moreFiles->item( d->moreFiles->currentItem() );
+               d->moreFiles->startRename( TRUE );
+           }
+       }
+       ((QKeyEvent *)e)->accept();
+       return TRUE;
+    } else if ( e->type() == QEvent::KeyPress && d->moreFiles->renaming ) {
+       d->moreFiles->lined->setFocus();
+       QApplication::sendEvent( d->moreFiles->lined, e );
+       ((QKeyEvent *)e)->accept();
+       return TRUE;
+    } else if ( e->type() == QEvent::KeyPress && files->renaming ) {
+       files->lined->setFocus();
+       QApplication::sendEvent( files->lined, e );
+       ((QKeyEvent *)e)->accept();
+       return TRUE;
+    } else if ( e->type() == QEvent::KeyPress &&
+               ((QKeyEvent *)e)->key() == Key_Backspace &&
+               ( o == files ||
+                 o == d->moreFiles ||
+                 o == files->viewport() ||
+                 o == d->moreFiles->viewport() ) ) {
+       cdUpClicked();
+       ((QKeyEvent *)e)->accept();
+       return TRUE;
+    } else if ( e->type() == QEvent::KeyPress &&
+               ((QKeyEvent *)e)->key() == Key_Delete &&
+               ( o == files ||
+                 o == files->viewport() ) ) {
+       if ( files->currentItem() )
+           deleteFile( files->currentItem()->text( 0 ) );
+       ((QKeyEvent *)e)->accept();
+       return TRUE;
+    } else if ( e->type() == QEvent::KeyPress &&
+               ((QKeyEvent *)e)->key() == Key_Delete &&
+               ( o == d->moreFiles ||
+                 o == d->moreFiles->viewport() ) ) {
+       int c = d->moreFiles->currentItem();
+       if ( c >= 0 )
+           deleteFile( d->moreFiles->item( c )->text() );
+       ((QKeyEvent *)e)->accept();
+       return TRUE;
+    } else if ( o == files && e->type() == QEvent::FocusOut &&
+               files->currentItem() && mode() != ExistingFiles ) {
+    } else if ( o == files && e->type() == QEvent::KeyPress ) {
+       QTimer::singleShot( 0, this, SLOT(fixupNameEdit()) );
+    } else if ( o == nameEdit && e->type() == QEvent::KeyPress ) {
+       if ( ( nameEdit->cursorPosition() == (int)nameEdit->text().length() || nameEdit->hasSelectedText() ) &&
+            isprint(((QKeyEvent *)e)->ascii()) ) {
+#if defined(_WS_WIN_)
+           QString nt( nameEdit->text().lower() );
+#else
+           QString nt( nameEdit->text() );
+#endif
+           nt.truncate( nameEdit->cursorPosition() );
+           nt += (char)(((QKeyEvent *)e)->ascii());
+           QListViewItem * i = files->firstChild();
+#if defined(_WS_WIN_)
+           while( i && i->text( 0 ).left(nt.length()).lower() != nt )
+#else
+           while( i && i->text( 0 ).left(nt.length()) != nt )
+#endif
+               i = i->nextSibling();
+           if ( i ) {
+               nt = i->text( 0 );
+               int cp = nameEdit->cursorPosition()+1;
+               nameEdit->validateAndSet( nt, cp, cp, nt.length() );
+               return TRUE;
+           }
+       }
+    } else if ( o == nameEdit && e->type() == QEvent::FocusIn ) {
+       fileNameEditDone();
+    } else if ( d->moreFiles->renaming && o != d->moreFiles->lined && e->type() == QEvent::FocusIn ) {
+       d->moreFiles->lined->setFocus();
+       return TRUE;
+    } else if ( files->renaming && o != files->lined && e->type() == QEvent::FocusIn ) {
+       files->lined->setFocus();
+       return TRUE;
+    } else if ( ( o == d->moreFiles || o == d->moreFiles->viewport() ) &&
+               e->type() == QEvent::FocusIn ) {
+       if ( o == d->moreFiles->viewport() && !d->moreFiles->viewport()->hasFocus() ||
+            o == d->moreFiles && !d->moreFiles->hasFocus() )
+           ((QWidget*)o)->setFocus();
+       return FALSE;
+    }
+
+    return QDialog::eventFilter( o, e );
+}
+
+/*!
+  Sets the filters used in the file dialog to \a filters. Each group
+  of filters must be separated by \c{;;} (\e two semi-colons).
+
+  \code
+    QString types("*.png;;*.xpm;;*.jpg");
+    QFileDialogP fd = new QFileDialogP( this );
+    fd->setFilters( types );
+    fd->show();
+  \endcode
+
+*/
+
+void QFileDialogP::setFilters( const QString &filters )
+{
+    QStringList lst = makeFiltersList( filters );
+    setFilters( lst );
+}
+
+/*!
+  \overload
+
+  \a types must be a null-terminated list of strings.
+
+*/
+
+void QFileDialogP::setFilters( const char ** types )
+{
+    if ( !types || !*types )
+       return;
+
+    d->types->clear();
+    while( types && *types ) {
+       d->types->insertItem( QString::fromLatin1(*types) );
+       types++;
+    }
+    d->types->setCurrentItem( 0 );
+    setFilter( d->types->text( 0 ) );
+}
+
+
+/*! \overload void QFileDialogP::setFilters( const QStringList & )
+*/
+
+void QFileDialogP::setFilters( const QStringList & types )
+{
+    if ( types.count() < 1 )
+       return;
+
+    d->types->clear();
+    for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it )
+       d->types->insertItem( *it );
+    d->types->setCurrentItem( 0 );
+    setFilter( d->types->text( 0 ) );
+}
+
+/*!
+  Adds the filter \a filter to the list of filters and makes it the
+  current filter.
+
+  \code
+    QFileDialogP* fd = new QFileDialogP( this );
+    fd->addFilter( "Images (*.png *.jpg *.xpm)" );
+    fd->show();
+  \endcode
+
+  In the above example, a file dialog is created, and the file filter "Images
+  (*.png *.jpg *.xpm)" is added and is set as the current filter. The original
+  filter, "All Files (*)", is still available.
+
+  \sa setFilter(), setFilters()
+*/
+
+void QFileDialogP::addFilter( const QString &filter )
+{
+    if ( filter.isEmpty() )
+       return;
+    QString f = filter;
+    QRegExp r( QString::fromLatin1(qt_file_dialog_filter_reg_exp) );
+    int index = r.search( f );
+    if ( index >= 0 )
+       f = r.cap( 2 );
+    for ( int i = 0; i < d->types->count(); ++i ) {
+       QString f2( d->types->text( i ) );
+       int index = r.search( f2 );
+       if ( index >= 0 )
+           f2 = r.cap( 1 );
+       if ( f2 == f ) {
+           d->types->setCurrentItem( i );
+           setFilter( f2 );
+           return;
+       }
+    }
+
+    d->types->insertItem( filter );
+    d->types->setCurrentItem( d->types->count() - 1 );
+    setFilter( d->types->text( d->types->count() - 1 ) );
+}
+
+/*!
+  Since modeButtons is a top-level widget, it may be destroyed by the
+  kernel at application exit. Notice if this happens to
+  avoid double deletion.
+*/
+
+void QFileDialogP::modeButtonsDestroyed()
+{
+    if ( d )
+       d->modeButtons = 0;
+}
+
+
+/*!
+  This is a convenience static function that will return one or more
+  existing files selected by the user.
+
+  \code
+    QStringList files = QFileDialogP::getOpenFileNames(
+                           "Images (*.png *.xpm *.jpg)",
+                           "/home",
+                           this,
+                           "open files dialog"
+                           "Select one or more files to open" );
+  \endcode
+
+  This function creates a modal file dialog called \a name, with
+  parent \a parent. If \a parent is not 0, the dialog will be shown
+  centered over the parent.
+
+  The file dialog's working directory will be set to \a dir. If \a
+  dir includes a file name, the file will be selected. The filter
+  is set to \a filter so that only those files which match the filter
+  are shown. The filter selected is set to \a selectedFilter. The parameters
+  \a dir, \a selectedFilter and \a filter may be QString::null.
+
+  The dialog's caption is set to \a caption. If \a caption is not
+  specified then a default caption will be used.
+
+  Under Windows and Mac OS X, this static function will use the native
+  file dialog and not a QFileDialogP, unless the style of the application
+  is set to something other than the native style.
+
+  Under Unix/X11, the normal behavior of the file dialog is to resolve
+  and follow symlinks. For example, if /usr/tmp is a symlink to /var/tmp,
+  the file dialog will change to /var/tmp after entering /usr/tmp.
+  If \a resolveSymlinks is FALSE, the file dialog will treat
+  symlinks as regular directories.
+
+  Note that if you want to iterate over the list of files, you should
+  iterate over a copy, e.g.
+    \code
+    QStringList list = files;
+    QStringList::Iterator it = list.begin();
+    while( it != list.end() ) {
+       myProcessing( *it );
+       ++it;
+    }
+    \endcode
+
+  \sa getOpenFileName(), getSaveFileName(), getExistingDirectory()
+*/
+
+QStringList QFileDialogP::getOpenFileNames( const QString & filter,
+                                          const QString& dir,
+                                          QWidget *parent,
+                                          const char* name,
+                                          const QString& caption,
+                                          QString *selectedFilter,
+                                          bool resolveSymlinks )
+{
+    bool save_qt_resolve_symlinks = qt_resolve_symlinks;
+    qt_resolve_symlinks = resolveSymlinks;
+
+    QStringList filters;
+    if ( !filter.isEmpty() )
+       filters = makeFiltersList( filter );
+
+    makeVariables();
+
+    if ( workingDirectory->isNull() )
+       *workingDirectory = QDir::currentDirPath();
+
+    if ( !dir.isEmpty() ) {
+       // #### works only correct for local files
+       QUrlOperator u( dir );
+       if ( u.isLocalFile() && QFileInfo( u ).isDir() ) {
+           *workingDirectory = dir;
+       } else {
+           *workingDirectory = u.toString();
+       }
+    }
+
+#if defined(Q_WS_WIN)
+    if ( qApp->style().styleHint( QStyle::SH_GUIStyle ) == WindowsStyle )
+       return winGetOpenFileNames( filter, workingDirectory, parent, name, caption, selectedFilter );
+#elif defined(Q_WS_MAC)
+    if( ( qApp->style().inherits(QMAC_DEFAULT_STYLE) ) )
+       return macGetOpenFileNames(filter, workingDirectory, parent, name, caption );
+#endif
+
+    QFileDialogP *dlg = new QFileDialogP( *workingDirectory, QString::null, parent, name ? name : "qt_filedlg_gofns", TRUE );
+
+    Q_CHECK_PTR( dlg );
+#ifndef QT_NO_WIDGET_TOPEXTRA
+    if ( parent && parent->icon() && !parent->icon()->isNull() )
+       dlg->setIcon( *parent->icon() );
+    else if ( qApp->mainWidget() && qApp->mainWidget()->icon() && !qApp->mainWidget()->icon()->isNull() )
+       dlg->setIcon( *qApp->mainWidget()->icon() );
+#endif
+
+    dlg->setFilters( filters );
+    if ( selectedFilter )
+       dlg->setFilter( *selectedFilter );
+#ifndef QT_NO_WIDGET_TOPEXTRA
+    if ( !caption.isNull() )
+       dlg->setCaption( caption );
+    else
+       dlg->setCaption( QFileDialogP::tr("Open") );
+#endif
+    dlg->setMode( QFileDialogP::ExistingFiles );
+    QString result;
+    QStringList lst;
+    if ( dlg->exec() == QDialog::Accepted ) {
+       lst = dlg->selectedFiles();
+       *workingDirectory = dlg->d->url;
+       if ( selectedFilter )
+           *selectedFilter = dlg->selectedFilter();
+    }
+    delete dlg;
+
+    qt_resolve_symlinks = save_qt_resolve_symlinks;
+
+    return lst;
+}
+
+/*!  Updates the line edit to match the speed-key usage in QListView. */
+
+void QFileDialogP::fixupNameEdit()
+{
+    if ( files->currentItem() && d->mode != ExistingFiles ) {
+       if ( ( (QFileDialogPrivate::File*)files->currentItem() )->info.isFile() )
+           nameEdit->setText( files->currentItem()->text( 0 ) );
+    }
+}
+
+/*!
+  Returns the URL of the current working directory in the file dialog.
+
+  \sa setUrl()
+*/
+
+QUrl QFileDialogP::url() const
+{
+    return d->url;
+}
+
+static bool isRoot( const QUrl &u )
+{
+#if defined(Q_OS_MAC9)
+     QString p = QDir::convertSeparators(u.path());
+     if(p.contains(':') == 1)
+       return TRUE;
+#elif defined(Q_OS_UNIX)
+    if ( u.path() == "/" )
+       return TRUE;
+#elif defined(Q_OS_WIN32)
+    QString p = u.path();
+    if ( p.length() == 3 &&
+        p.right( 2 ) == ":/" )
+       return TRUE;
+    if ( p[ 0 ] == '/' && p[ 1 ] == '/' ) {
+       int slashes = p.contains( '/' );
+       if ( slashes <= 3 )
+           return TRUE;
+       if ( slashes == 4 && p[ (int)p.length() - 1 ] == '/' )
+           return TRUE;
+    }
+#else
+#if defined(Q_CC_GNU)
+#warning "case not covered.."
+#endif
+#endif
+
+    if ( !u.isLocalFile() && u.path() == "/" )
+       return TRUE;
+
+    return FALSE;
+}
+
+void QFileDialogP::urlStart( QNetworkOperation *op )
+{
+    if ( !op )
+       return;
+
+    if ( op->operation() == QNetworkProtocol::OpListChildren ) {
+       if ( isRoot( d->url ) )
+           d->cdToParent->setEnabled( FALSE );
+       else
+           d->cdToParent->setEnabled( TRUE );
+       d->mimeTypeTimer->stop();
+       d->sortedList.clear();
+       d->pendingItems.clear();
+       d->moreFiles->clearSelection();
+       files->clearSelection();
+       d->moreFiles->clear();
+       files->clear();
+       files->setSorting( -1 );
+
+       QString s = d->url.toString( FALSE, FALSE );
+       bool found = FALSE;
+       for ( int i = 0; i < d->paths->count(); ++i ) {
+#if defined(Q_WS_WIN)
+           if ( d->paths->text( i ).lower() == s.lower() ) {
+#else
+           if ( d->paths->text( i ) == s ) {
+#endif
+               found = TRUE;
+               d->paths->setCurrentItem( i );
+               break;
+           }
+       }
+       if ( !found ) {
+           d->paths->insertItem( *openFolderIcon, s, -1 );
+           d->paths->setCurrentItem( d->paths->count() - 1 );
+       }
+       d->last = 0;
+       d->hadDotDot = FALSE;
+
+       if ( d->goBack && d->history.last() != d->url.toString() ) {
+           d->history.append( d->url.toString() );
+           if ( d->history.count() > 1 )
+               d->goBack->setEnabled( TRUE );
+       }
+    }
+}
+
+void QFileDialogP::urlFinished( QNetworkOperation *op )
+{
+    if ( !op )
+       return;
+
+    if ( op->operation() == QNetworkProtocol::OpListChildren ) {
+       if ( QApplication::overrideCursor() )
+           QApplication::restoreOverrideCursor();
+    }
+    if ( op->state() == QNetworkProtocol::StFailed ) {
+       if ( d->paths->hasFocus() )
+           d->ignoreNextKeyPress = TRUE;
+
+       if ( d->progressDia ) {
+           d->ignoreStop = TRUE;
+           d->progressDia->close();
+           delete d->progressDia;
+           d->progressDia = 0;
+       }
+
+       QMessageBox::critical( this, tr( "Error" ), op->protocolDetail() );
+
+       int ecode = op->errorCode();
+       if ( ecode == QNetworkProtocol::ErrListChildren || ecode == QNetworkProtocol::ErrParse ||
+            ecode == QNetworkProtocol::ErrUnknownProtocol || ecode == QNetworkProtocol::ErrLoginIncorrect ||
+            ecode == QNetworkProtocol::ErrValid || ecode == QNetworkProtocol::ErrHostNotFound ||
+            ecode == QNetworkProtocol::ErrFileNotExisting ) {
+           if (d->url != d->oldUrl) {
+               QString nf = d->url.nameFilter();
+               d->url = d->oldUrl;
+               d->url.setNameFilter( nf );
+               rereadDir();
+           }
+       } else {
+           // another error happened, no need to go back to last dir
+       }
+    } else if ( op->operation() == QNetworkProtocol::OpListChildren &&
+               op == d->currListChildren ) {
+       if ( !d->hadDotDot && !isRoot( d->url ) ) {
+           bool ok = TRUE;
+#if defined(Q_WS_WIN)
+           if ( d->url.path().left( 2 ) == "//" )
+               ok = FALSE;
+#endif
+           if ( ok ) {
+               QUrlInfo ui( d->url, ".." );
+               ui.setName( ".." );
+               ui.setDir( TRUE );
+               ui.setFile( FALSE );
+               ui.setSymLink( FALSE );
+               ui.setSize( 0 );
+               QValueList<QUrlInfo> lst;
+               lst << ui;
+               insertEntry( lst, 0 );
+           }
+       }
+       resortDir();
+    } else if ( op->operation() == QNetworkProtocol::OpGet ) {
+    } else if ( op->operation() == QNetworkProtocol::OpPut ) {
+       rereadDir();
+       if ( d->progressDia ) {
+           d->ignoreStop = TRUE;
+           d->progressDia->close();
+       }
+       delete d->progressDia;
+       d->progressDia = 0;
+    }
+}
+
+void QFileDialogP::dataTransferProgress( int bytesDone, int bytesTotal, QNetworkOperation *op )
+{
+    if ( !op )
+       return;
+
+    QString label;
+    QUrl u( op->arg( 0 ) );
+    if ( u.isLocalFile() ) {
+       label = u.path();
+    } else {
+       label = QString( "%1 (on %2)" );
+       label = label.arg( u.path() ).arg( u.host() );
+    }
+
+    if ( !d->progressDia ) {
+       if ( bytesDone < bytesTotal) {
+           d->ignoreStop = FALSE;
+           d->progressDia = new QFDProgressDialog( this, label, bytesTotal );
+           connect( d->progressDia, SIGNAL( cancelled() ),
+                    this, SLOT( stopCopy() ) );
+           d->progressDia->show();
+       } else
+           return;
+    }
+
+    if ( d->progressDia ) {
+       if ( op->operation() == QNetworkProtocol::OpGet ) {
+           if ( d->progressDia ) {
+               d->progressDia->setReadProgress( bytesDone );
+           }
+       } else if ( op->operation() == QNetworkProtocol::OpPut ) {
+           if ( d->progressDia ) {
+               d->progressDia->setWriteLabel( label );
+               d->progressDia->setWriteProgress( bytesDone );
+           }
+       } else {
+           return;
+       }
+    }
+}
+
+void QFileDialogP::insertEntry( const QValueList<QUrlInfo> &lst, QNetworkOperation *op )
+{
+    if ( op && op->operation() == QNetworkProtocol::OpListChildren &&
+        op != d->currListChildren )
+       return;
+    QValueList<QUrlInfo>::ConstIterator it = lst.begin();
+    for ( ; it != lst.end(); ++it ) {
+       const QUrlInfo &inf = *it;
+       if ( d->mode == DirectoryOnly && !inf.isDir() )
+           continue;
+       if ( inf.name() == ".." ) {
+           d->hadDotDot = TRUE;
+           if ( isRoot( d->url ) )
+               continue;
+#if defined(Q_WS_WIN)
+           if ( d->url.path().left( 2 ) == "//" )
+               continue;
+#endif
+       } else if ( inf.name() == "." )
+           continue;
+
+#if defined(Q_WS_WIN)
+       if ( !bShowHiddenFiles ) {
+           if ( d->url.isLocalFile() ) {
+               QString file = d->url.path() + inf.name();
+#if defined(UNICODE)
+               if ( qWinVersion() & Qt::WV_NT_based ) {
+                   if ( GetFileAttributesW( (TCHAR*)qt_winTchar( file, TRUE ) ) & FILE_ATTRIBUTE_HIDDEN )
+                       continue;
+               }
+               else
+#endif
+               {
+                   if ( GetFileAttributesA( file.local8Bit() ) & FILE_ATTRIBUTE_HIDDEN )
+                       continue;
+               }
+           } else {
+               if ( inf.name() != ".." && inf.name()[0] == QChar('.') )
+                   continue;
+           }
+       }
+#else
+       if ( !bShowHiddenFiles && inf.name() != ".." ) {
+           if ( inf.name()[ 0 ] == QChar( '.' ) )
+               continue;
+       }
+
+#endif
+       if ( !d->url.isLocalFile() ) {
+           QFileDialogPrivate::File * i = 0;
+           QFileDialogPrivate::MCItem *i2 = 0;
+           i = new QFileDialogPrivate::File( d, &inf, files );
+           i2 = new QFileDialogPrivate::MCItem( d->moreFiles, i );
+
+           if ( d->mode == ExistingFiles && inf.isDir() ||
+               ( isDirectoryMode( d->mode ) && inf.isFile() ) ) {
+               i->setSelectable( FALSE );
+               i2->setSelectable( FALSE );
+           }
+
+           i->i = i2;
+       }
+
+       d->sortedList.append( new QUrlInfo( inf ) );
+    }
+}
+
+void QFileDialogP::removeEntry( QNetworkOperation *op )
+{
+    if ( !op )
+       return;
+
+    QUrlInfo *i = 0;
+    QListViewItemIterator it( files );
+    bool ok1 = FALSE, ok2 = FALSE;
+    for ( i = d->sortedList.first(); it.current(); ++it, i = d->sortedList.next() ) {
+       if ( ( (QFileDialogPrivate::File*)it.current() )->info.name() == op->arg( 0 ) ) {
+           d->pendingItems.removeRef( (QFileDialogPrivate::File*)it.current() );
+           delete ( (QFileDialogPrivate::File*)it.current() )->i;
+           delete it.current();
+           ok1 = TRUE;
+       }
+       if ( i && i->name() == op->arg( 0 ) ) {
+           d->sortedList.removeRef( i );
+           i = d->sortedList.prev();
+           ok2 = TRUE;
+       }
+       if ( ok1 && ok2 )
+           break;
+    }
+}
+
+void QFileDialogP::itemChanged( QNetworkOperation *op )
+{
+    if ( !op )
+       return;
+
+    QUrlInfo *i = 0;
+    QListViewItemIterator it1( files );
+    bool ok1 = FALSE, ok2 = FALSE;
+    // first check whether the new file replaces an existing file.
+    for ( i = d->sortedList.first(); it1.current(); ++it1, i = d->sortedList.next() ) {
+       if ( ( (QFileDialogPrivate::File*)it1.current() )->info.name() == op->arg( 1 ) ) {
+           delete ( (QFileDialogPrivate::File*)it1.current() )->i;
+           delete it1.current();
+           ok1 = TRUE;
+       }
+       if ( i && i->name() == op->arg( 1 ) ) {
+           d->sortedList.removeRef( i );
+           i = d->sortedList.prev();
+           ok2 = TRUE;
+       }
+       if ( ok1 && ok2 )
+           break;
+    }
+
+    i = 0;
+    QListViewItemIterator it( files );
+    ok1 = FALSE;
+    ok2 = FALSE;
+    for ( i = d->sortedList.first(); it.current(); ++it, i = d->sortedList.next() ) {
+       if ( ( (QFileDialogPrivate::File*)it.current() )->info.name() == op->arg( 0 ) ) {
+           ( (QFileDialogPrivate::File*)it.current() )->info.setName( op->arg( 1 ) );
+           ok1 = TRUE;
+       }
+       if ( i && i->name() == op->arg( 0 ) ) {
+           i->setName( op->arg( 1 ) );
+           ok2 = TRUE;
+       }
+       if ( ok1 && ok2 )
+           break;
+    }
+
+    resortDir();
+}
+
+/*!
+  \property QFileDialogP::infoPreview
+
+  \brief whether the file dialog can provide preview information about
+  the currently selected file
+
+  The default is FALSE.
+*/
+bool QFileDialogP::isInfoPreviewEnabled() const
+{
+    return d->infoPreview;
+}
+
+void QFileDialogP::setInfoPreviewEnabled( bool info )
+{
+    if ( info == d->infoPreview )
+       return;
+    d->geometryDirty = TRUE;
+    d->infoPreview = info;
+    updateGeometries();
+}
+
+
+/*!
+  \property QFileDialogP::contentsPreview
+
+  \brief whether the file dialog can provide a contents preview of the
+  currently selected file
+
+  The default is FALSE.
+
+  \sa setContentsPreview() setInfoPreviewEnabled()
+*/
+// ### improve the above documentation: how is the preview done, how can I add
+// support for customized preview, etc.
+
+bool QFileDialogP::isContentsPreviewEnabled() const
+{
+    return d->contentsPreview;
+}
+
+void QFileDialogP::setContentsPreviewEnabled( bool contents )
+{
+    if ( contents == d->contentsPreview )
+       return;
+    d->geometryDirty = TRUE;
+    d->contentsPreview = contents;
+    updateGeometries();
+}
+
+
+/*!
+  Sets the widget to be used for displaying information about the file
+  to the widget \a w and a preview of that information to the
+  QFilePreviewP \a preview.
+
+  Normally you would create a preview widget that derives from both QWidget and
+  QFilePreviewP, so you should pass the same widget twice.
+
+  \code
+    class Preview : public QLabel, public QFilePreviewP
+    {
+    public:
+       Preview( QWidget *parent=0 ) : QLabel( parent ) {}
+
+       void previewUrl( const QUrl &u )
+       {
+           QString path = u.path();
+           QPixmap pix( path );
+           if ( pix.isNull() )
+               setText( "This is not a pixmap" );
+           else
+               setText( "This is a pixmap" );
+       }
+    };
+
+  //...
+
+  int main( int argc, char** argv )
+  {
+    Preview* p = new Preview;
+
+    QFileDialogP* fd = new QFileDialogP( this );
+    fd->setInfoPreviewEnabled( TRUE );
+    fd->setInfoPreview( p, p );
+    fd->setPreviewMode( QFileDialogP::Info );
+    fd->show();
+  }
+
+  \endcode
+
+  \sa setContentsPreview(), setInfoPreviewEnabled(), setPreviewMode()
+
+*/
+
+void QFileDialogP::setInfoPreview( QWidget *w, QFilePreviewP *preview )
+{
+    if ( !w || !preview )
+       return;
+
+    if ( d->infoPreviewWidget ) {
+       d->preview->removeWidget( d->infoPreviewWidget );
+       delete d->infoPreviewWidget;
+    }
+    if ( d->infoPreviewer )
+       delete d->infoPreviewer;
+    d->infoPreviewWidget = w;
+    d->infoPreviewer = preview;
+    w->reparent( d->preview, 0, QPoint( 0, 0 ) );
+}
+
+/*!
+  Sets the widget to be used for displaying the contents of the file
+  to the widget \a w and a preview of those contents to the
+  QFilePreviewP \a preview.
+
+  Normally you would create a preview widget that derives from both QWidget and
+  QFilePreviewP, so you should pass the same widget twice.
+
+  \code
+    class Preview : public QLabel, public QFilePreviewP
+    {
+    public:
+       Preview( QWidget *parent=0 ) : QLabel( parent ) {}
+
+       void previewUrl( const QUrl &u )
+       {
+           QString path = u.path();
+           QPixmap pix( path );
+           if ( pix.isNull() )
+               setText( "This is not a pixmap" );
+           else
+               setPixmap( pix );
+       }
+    };
+
+  //...
+
+  int main( int argc, char** argv )
+  {
+    Preview* p = new Preview;
+
+    QFileDialogP* fd = new QFileDialogP( this );
+    fd->setContentsPreviewEnabled( TRUE );
+    fd->setContentsPreview( p, p );
+    fd->setPreviewMode( QFileDialogP::Contents );
+    fd->show();
+  }
+  \endcode
+
+  \sa setContentsPreviewEnabled(), setInfoPreview(), setPreviewMode()
+*/
+
+void QFileDialogP::setContentsPreview( QWidget *w, QFilePreviewP *preview )
+{
+    if ( !w || !preview )
+       return;
+
+    if ( d->contentsPreviewWidget ) {
+       d->preview->removeWidget( d->contentsPreviewWidget );
+       delete d->contentsPreviewWidget;
+    }
+    if ( d->contentsPreviewer )
+       delete d->contentsPreviewer;
+    d->contentsPreviewWidget = w;
+    d->contentsPreviewer = preview;
+    w->reparent( d->preview, 0, QPoint( 0, 0 ) );
+}
+
+/*!
+  Re-sorts the displayed directory.
+
+  \sa rereadDir()
+*/
+
+void QFileDialogP::resortDir()
+{
+    d->mimeTypeTimer->stop();
+    d->pendingItems.clear();
+
+    QFileDialogPrivate::File *item = 0;
+    QFileDialogPrivate::MCItem *item2 = 0;
+
+    d->sortedList.sort();
+
+    if ( files->childCount() > 0 || d->moreFiles->count() > 0 ) {
+       d->moreFiles->clear();
+       files->clear();
+       d->last = 0;
+       files->setSorting( -1 );
+    }
+
+    QUrlInfo *i = sortAscending ? d->sortedList.first() : d->sortedList.last();
+    for ( ; i; i = sortAscending ? d->sortedList.next() : d->sortedList.prev() ) {
+       item = new QFileDialogPrivate::File( d, i, files );
+       item2 = new QFileDialogPrivate::MCItem( d->moreFiles, item, item2 );
+       item->i = item2;
+       d->pendingItems.append( item );
+       if ( d->mode == ExistingFiles && item->info.isDir() ||
+           ( isDirectoryMode( d->mode ) && item->info.isFile() ) ) {
+           item->setSelectable( FALSE );
+           item2->setSelectable( FALSE );
+       }
+    }
+
+    // ##### As the QFileIconProviderP only support QFileInfo and no
+    // QUrlInfo it can be only used for local files at the moment. In
+    // 3.0 we have to change the API of QFileIconProviderP to work on
+    // QUrlInfo so that also remote filesystems can be show mime-type
+    // specific icons.
+    if ( d->url.isLocalFile() )
+       d->mimeTypeTimer->start( 0 );
+}
+
+/*!
+  Stops the current copy operation.
+*/
+
+void QFileDialogP::stopCopy()
+{
+    if ( d->ignoreStop )
+       return;
+
+    d->url.blockSignals( TRUE );
+    d->url.stop();
+    if ( d->progressDia ) {
+       d->ignoreStop = TRUE;
+       QTimer::singleShot( 100, this, SLOT( removeProgressDia() ) );
+    }
+    d->url.blockSignals( FALSE );
+}
+
+/*!
+  \internal
+*/
+
+void QFileDialogP::removeProgressDia()
+{
+    if ( d->progressDia )
+       delete d->progressDia;
+    d->progressDia = 0;
+}
+
+/*!
+  \internal
+*/
+
+void QFileDialogP::doMimeTypeLookup()
+{
+    if ( !iconProvider() ) {
+       d->pendingItems.clear();
+       d->mimeTypeTimer->stop();
+       return;
+    }
+
+    d->mimeTypeTimer->stop();
+    if ( d->pendingItems.count() == 0 ) {
+       return;
+    }
+
+    QRect r;
+    QFileDialogPrivate::File *item = d->pendingItems.first();
+    if ( item ) {
+       QFileInfo fi;
+       if ( d->url.isLocalFile() ) {
+           fi.setFile( QUrl( d->url.path(), QFileDialogPrivate::encodeFileName( item->info.name() ) ).path( FALSE ) );
+       } else
+           fi.setFile( item->info.name() ); // #####
+       const QPixmap *p = iconProvider()->pixmap( fi );
+       if ( p && p != item->pixmap( 0 ) &&
+            ( !item->pixmap( 0 ) || p->serialNumber() != item->pixmap( 0 )->serialNumber() ) &&
+            p != fifteenTransparentPixels ) {
+           item->hasMimePixmap = TRUE;
+
+           // evil hack to avoid much too much repaints!
+           qApp->processEvents();
+           files->setUpdatesEnabled( FALSE );
+           files->viewport()->setUpdatesEnabled( FALSE );
+           if ( item != d->pendingItems.first() )
+               return;
+           item->setPixmap( 0, *p );
+           qApp->processEvents();
+           files->setUpdatesEnabled( TRUE );
+           files->viewport()->setUpdatesEnabled( TRUE );
+
+           if ( files->isVisible() ) {
+               QRect ir( files->itemRect( item ) );
+               if ( ir != QRect( 0, 0, -1, -1 ) ) {
+                   r = r.unite( ir );
+               }
+           } else {
+               QRect ir( d->moreFiles->itemRect( item->i ) );
+               if ( ir != QRect( 0, 0, -1, -1 ) ) {
+                   r = r.unite( ir );
+               }
+           }
+       }
+       if ( d->pendingItems.count() )
+           d->pendingItems.removeFirst();
+    }
+
+    if ( d->moreFiles->isVisible() ) {
+       d->moreFiles->viewport()->repaint( r, FALSE );
+    } else {
+       files->viewport()->repaint( r, FALSE );
+    }
+
+    if ( d->pendingItems.count() )
+       d->mimeTypeTimer->start( 0 );
+    else if ( d->moreFiles->isVisible() )
+       d->moreFiles->triggerUpdate( TRUE );
+}
+
+/*!
+  If \a b is TRUE then all the files in the current directory are selected;
+  otherwise, they are deselected.
+*/
+
+void QFileDialogP::selectAll( bool b )
+{
+    if ( d->mode != ExistingFiles )
+       return;
+    d->moreFiles->selectAll( b );
+    files->selectAll( b );
+}
+
+void QFileDialogP::goBack()
+{
+    if ( !d->goBack || !d->goBack->isEnabled() )
+       return;
+    d->history.remove( d->history.last() );
+    if ( d->history.count() < 2 )
+       d->goBack->setEnabled( FALSE );
+    setUrl( d->history.last() );
+}
+
+// a class with wonderfully inflexible flexibility. why doesn't it
+// just subclass QWidget in the first place? 'you have to derive your
+// preview widget from QWidget and from this class' indeed.
+
+/*!
+  \class QFilePreviewP qfiledialog.h
+  \ingroup misc
+  \brief The QFilePreviewP class provides file previewing in QFileDialogP.
+
+  This class is an abstract base class which is used to implement
+  widgets that can display a preview of a file in a QFileDialogP.
+
+  You must derive the preview widget from both QWidget and from this
+  class. Then you must reimplement this class's previewUrl() function,
+  which is called by the file dialog if the preview of a file
+  (specified as a URL) should be shown.
+
+  See also QFileDialog::setPreviewMode(), QFileDialogP::setContentsPreview(),
+  QFileDialogP::setInfoPreview(), QFileDialogP::setInfoPreviewEnabled(),
+  QFileDialogP::setContentsPreviewEnabled().
+
+  For an example of a preview widget see qt/examples/qdir/qdir.cpp.
+*/
+
+/*!
+  Constructs the QFilePreviewP.
+*/
+
+QFilePreviewP::QFilePreviewP()
+{
+}
+
+/*!
+  \fn void QFilePreviewP::previewUrl( const QUrl &url )
+
+  This function is called by QFileDialogP if a preview
+  for the \a url should be shown. Reimplement this
+  function to provide file previewing.
+*/
+
+#endif
diff --git a/src/PatchQt/qfiledialogP.h b/src/PatchQt/qfiledialogP.h
new file mode 100644 (file)
index 0000000..f7355a1
--- /dev/null
@@ -0,0 +1,528 @@
+/////////////////////////////////////////////////////////////////////////////
+// Module      : PatchQt
+// File        : qfiledialogP.h
+// Description : the patch for Qt's QFileDialog class (qfiledialog.h)
+/////////////////////////////////////////////////////////////////////////////
+
+/****************************************************************************
+** $Id$
+**
+** Definition of QFileDialog class
+**
+** Created : 950428
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the dialogs module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QFILEDIALOGP_H
+#define QFILEDIALOGP_H
+
+class QPushButton;
+class QButton;
+class QLabel;
+class QWidget;
+class QFileDialog;
+class QTimer;
+class QNetworkOperation;
+class QLineEdit;
+class QListViewItem;
+class QListBoxItem;
+class QProgressBar;
+class QFileDialogPrivate;
+class QFileDialogQFileListView;
+
+#ifndef QT_H
+#include "qdir.h"
+#include "qdialog.h"
+#include "qurloperator.h"
+#include "qurlinfo.h"
+#include "qlistbox.h"
+#include "qlistview.h"
+#include "qlineedit.h"
+#endif // QT_H
+
+#ifndef QT_NO_FILEDIALOG
+
+class Q_EXPORT QFileIconProviderP : public QObject
+{
+    Q_OBJECT
+public:
+    QFileIconProviderP( QObject * parent = 0, const char* name = 0 );
+    virtual const QPixmap * pixmap( const QFileInfo & );
+
+private:       // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+    QFileIconProviderP( const QFileIconProviderP & );
+    QFileIconProviderP& operator=( const QFileIconProviderP & );
+#endif
+};
+
+class Q_EXPORT QFilePreviewP
+{
+public:
+    QFilePreviewP();
+    virtual void previewUrl( const QUrl &url ) = 0;
+
+};
+
+class Q_EXPORT QFileDialogP : public QDialog
+{
+    Q_OBJECT
+    Q_ENUMS( Mode ViewMode PreviewMode )
+    // ##### Why are this read-only properties ?
+    Q_PROPERTY( QString selectedFile READ selectedFile )
+    Q_PROPERTY( QString selectedFilter READ selectedFilter )
+    Q_PROPERTY( QStringList selectedFiles READ selectedFiles )
+    // #### Should not we be able to set the path ?
+    Q_PROPERTY( QString dirPath READ dirPath )
+    Q_PROPERTY( bool showHiddenFiles READ showHiddenFiles WRITE setShowHiddenFiles )
+    Q_PROPERTY( Mode mode READ mode WRITE setMode )
+    Q_PROPERTY( ViewMode viewMode READ viewMode WRITE setViewMode )
+    Q_PROPERTY( PreviewMode previewMode READ previewMode WRITE setPreviewMode )
+    Q_PROPERTY( bool infoPreview READ isInfoPreviewEnabled WRITE setInfoPreviewEnabled )
+    Q_PROPERTY( bool contentsPreview READ isContentsPreviewEnabled WRITE setContentsPreviewEnabled )
+
+public:
+    QFileDialogP( const QString& dirName, const QString& filter = QString::null,
+                QWidget* parent=0, const char* name=0, bool modal = FALSE );
+    QFileDialogP( QWidget* parent=0, const char* name=0, bool modal = FALSE );
+    ~QFileDialogP();
+
+    // recommended static functions
+
+    static QString getOpenFileName( const QString &initially = QString::null,
+                                   const QString &filter = QString::null,
+                                   QWidget *parent = 0, const char* name = 0,
+                                   const QString &caption = QString::null,
+                                   QString *selectedFilter = 0,
+                                   bool resolveSymlinks = TRUE);
+    static QString getSaveFileName( const QString &initially = QString::null,
+                                   const QString &filter = QString::null,
+                                   QWidget *parent = 0, const char* name = 0,
+                                   const QString &caption = QString::null,
+                                   QString *selectedFilter = 0,
+                                   bool resolveSymlinks = TRUE);
+    static QString getExistingDirectory( const QString &dir = QString::null,
+                                        QWidget *parent = 0,
+                                        const char* name = 0,
+                                        const QString &caption = QString::null,
+                                        bool dirOnly = TRUE,
+                                        bool resolveSymlinks = TRUE);
+    static QStringList getOpenFileNames( const QString &filter= QString::null,
+                                        const QString &dir = QString::null,
+                                        QWidget *parent = 0,
+                                        const char* name = 0,
+                                        const QString &caption = QString::null,
+                                        QString *selectedFilter = 0,
+                                        bool resolveSymlinks = TRUE);
+
+    // other static functions
+
+    static void setIconProvider( QFileIconProviderP * );
+    static QFileIconProviderP* iconProvider();
+
+    // non-static function for special needs
+
+    QString selectedFile() const;
+    QString selectedFilter() const;
+    virtual void setSelectedFilter( const QString& );
+    virtual void setSelectedFilter( int );
+
+    void setSelection( const QString &);
+
+    void selectAll( bool b );
+
+    QStringList selectedFiles() const;
+
+    QString dirPath() const;
+
+    void setDir( const QDir & );
+    const QDir *dir() const;
+
+    void setShowHiddenFiles( bool s );
+    bool showHiddenFiles() const;
+
+    void rereadDir();
+    void resortDir();
+
+    enum Mode { AnyFile, ExistingFile, Directory, ExistingFiles, DirectoryOnly };
+    void setMode( Mode );
+    Mode mode() const;
+
+    enum ViewMode { Detail, List };
+    enum PreviewMode { NoPreview, Contents, Info };
+    void setViewMode( ViewMode m );
+    ViewMode viewMode() const;
+    void setPreviewMode( PreviewMode m );
+    PreviewMode previewMode() const;
+
+    bool eventFilter( QObject *, QEvent * );
+
+    bool isInfoPreviewEnabled() const;
+    bool isContentsPreviewEnabled() const;
+    void setInfoPreviewEnabled( bool );
+    void setContentsPreviewEnabled( bool );
+
+    void setInfoPreview( QWidget *w, QFilePreviewP *preview );
+    void setContentsPreview( QWidget *w, QFilePreviewP *preview );
+
+    QUrl url() const;
+
+    void addFilter( const QString &filter );
+
+public slots:
+    void done( int );
+    void setDir( const QString& );
+    void setUrl( const QUrlOperator &url );
+    void setFilter( const QString& );
+    void setFilters( const QString& );
+    void setFilters( const char ** );
+    void setFilters( const QStringList& );
+
+protected:
+    void resizeEvent( QResizeEvent * );
+    void keyPressEvent( QKeyEvent * );
+
+    void addWidgets( QLabel *, QWidget *, QPushButton * );
+    void addToolButton( QButton *b, bool separator = FALSE );
+    void addLeftWidget( QWidget *w );
+    void addRightWidget( QWidget *w );
+
+signals:
+    void fileHighlighted( const QString& );
+    void fileSelected( const QString& );
+    void filesSelected( const QStringList& );
+    void dirEntered( const QString& );
+    void filterSelected( const QString& );
+
+private slots:
+    void detailViewSelectionChanged();
+    void listBoxSelectionChanged();
+    void changeMode( int );
+    void fileNameEditReturnPressed();
+    void stopCopy();
+    void removeProgressDia();
+
+    void fileSelected( int );
+    void fileHighlighted( int );
+    void dirSelected( int );
+    void pathSelected( int );
+
+    void updateFileNameEdit( QListViewItem *);
+    void selectDirectoryOrFile( QListViewItem * );
+    void popupContextMenu( QListViewItem *, const QPoint &, int );
+    void popupContextMenu( QListBoxItem *, const QPoint & );
+    void updateFileNameEdit( QListBoxItem *);
+    void selectDirectoryOrFile( QListBoxItem * );
+    void fileNameEditDone();
+
+    void okClicked();
+    void filterClicked(); // not used
+    void cancelClicked();
+
+    void cdUpClicked();
+    void newFolderClicked();
+
+    void fixupNameEdit();
+
+    void doMimeTypeLookup();
+
+    void updateGeometries();
+    void modeButtonsDestroyed();
+    void urlStart( QNetworkOperation *op );
+    void urlFinished( QNetworkOperation *op );
+    void dataTransferProgress( int bytesDone, int bytesTotal, QNetworkOperation * );
+    void insertEntry( const QValueList<QUrlInfo> &fi, QNetworkOperation *op );
+    void removeEntry( QNetworkOperation * );
+    void createdDirectory( const QUrlInfo &info, QNetworkOperation * );
+    void itemChanged( QNetworkOperation * );
+    void goBack();
+
+private:
+    enum PopupAction {
+       PA_Open = 0,
+       PA_Delete,
+       PA_Rename,
+       PA_SortName,
+       PA_SortSize,
+       PA_SortType,
+       PA_SortDate,
+       PA_SortUnsorted,
+       PA_Cancel,
+       PA_Reload,
+       PA_Hidden
+    };
+
+    void init();
+    bool trySetSelection( bool isDir, const QUrlOperator &, bool );
+    void deleteFile( const QString &filename );
+    void popupContextMenu( const QString &filename, bool withSort,
+                          PopupAction &action, const QPoint &p );
+
+    QDir reserved; // was cwd
+    QString fileName;
+
+    friend class QFileDialogQFileListView;
+    friend class QFileListBox;
+
+    QFileDialogPrivate *d;
+    QFileDialogQFileListView  *files;
+
+    QLineEdit  *nameEdit; // also filter
+    QPushButton *okB;
+    QPushButton *cancelB;
+
+#if defined(Q_WS_WIN)
+    static QString winGetOpenFileName( const QString &initialSelection,
+                                      const QString &filter,
+                                      QString* workingDirectory,
+                                      QWidget *parent = 0,
+                                      const char* name = 0,
+                                      const QString& caption = QString::null,
+                                      QString* selectedFilter = 0 );
+    static QString winGetSaveFileName( const QString &initialSelection,
+                                      const QString &filter,
+                                      QString* workingDirectory,
+                                      QWidget *parent = 0,
+                                      const char* name = 0,
+                                      const QString& caption = QString::null,
+                                      QString* selectedFilter = 0 );
+    static QStringList winGetOpenFileNames( const QString &filter,
+                                           QString* workingDirectory,
+                                           QWidget *parent = 0,
+                                           const char* name = 0,
+                                           const QString& caption = QString::null,
+                                           QString* selectedFilter = 0 );
+    static QString winGetExistingDirectory( const QString &initialDirectory,
+                                           QWidget* parent = 0,
+                                           const char* name = 0,
+                                           const QString& caption = QString::null);
+    static QString resolveLinkFile( const QString& linkfile );
+#endif
+#if defined(Q_WS_MACX) || defined(Q_WS_MAC9)
+    static QString macGetSaveFileName( const QString &, const QString &, 
+                                      QString *, QWidget *, const char*,
+                                      const QString& );
+    static QStringList macGetOpenFileNames( const QString &, QString*,
+                                           QWidget *, const char *,
+                                           const QString&, bool = TRUE,
+                                           bool = FALSE );
+#endif
+
+
+private:       // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+    QFileDialogP( const QFileDialogP & );
+    QFileDialogP &operator=( const QFileDialogP & );
+#endif
+};
+
+/******************************************************************
+ *
+ * Definitions of view classes
+ *
+ ******************************************************************/
+
+class QRenameEdit : public QLineEdit
+{
+    Q_OBJECT
+
+public:
+    QRenameEdit( QWidget *parent )
+       : QLineEdit( parent, "qt_rename_edit" )
+    {}
+
+protected:
+    void keyPressEvent( QKeyEvent *e );
+    void focusOutEvent( QFocusEvent *e );
+
+signals:
+    void escapePressed();
+
+};
+
+class QFileListBox : public QListBox
+{
+    friend class QFileDialogP;
+
+    Q_OBJECT
+
+private:
+    QFileListBox( QWidget *parent, QFileDialogP *d );
+
+    void clear();
+    void show();
+    void startRename( bool check = TRUE );
+    void viewportMousePressEvent( QMouseEvent *e );
+    void viewportMouseReleaseEvent( QMouseEvent *e );
+    void viewportMouseDoubleClickEvent( QMouseEvent *e );
+    void viewportMouseMoveEvent( QMouseEvent *e );
+#ifndef QT_NO_DRAGANDDROP
+    void viewportDragEnterEvent( QDragEnterEvent *e );
+    void viewportDragMoveEvent( QDragMoveEvent *e );
+    void viewportDragLeaveEvent( QDragLeaveEvent *e );
+    void viewportDropEvent( QDropEvent *e );
+    bool acceptDrop( const QPoint &pnt, QWidget *source );
+    void setCurrentDropItem( const QPoint &pnt );
+#endif
+    void keyPressEvent( QKeyEvent *e );
+
+private slots:
+    void rename();
+    void cancelRename();
+    void doubleClickTimeout();
+    void changeDirDuringDrag();
+    void dragObjDestroyed();
+    void contentsMoved( int, int );
+
+private:
+    QRenameEdit *lined;
+    QFileDialogP *filedialog;
+    bool renaming;
+    QTimer* renameTimer;
+    QListBoxItem *renameItem, *dragItem;
+    QPoint pressPos, oldDragPos;
+    bool mousePressed;
+    int urls;
+    QString startDragDir;
+    QListBoxItem *currDropItem;
+    QTimer *changeDirTimer;
+    bool firstMousePressEvent;
+    QUrlOperator startDragUrl;
+
+};
+
+
+class QFileDialogQFileListView : public QListView
+{
+    Q_OBJECT
+
+public:
+    QFileDialogQFileListView( QWidget *parent, QFileDialogP *d );
+
+    void clear();
+    void startRename( bool check = TRUE );
+    void setSorting( int column, bool increasing = TRUE );
+
+    QRenameEdit *lined;
+    bool renaming;
+    QListViewItem *renameItem;
+
+private:
+    void viewportMousePressEvent( QMouseEvent *e );
+    void viewportMouseDoubleClickEvent( QMouseEvent *e );
+    void keyPressEvent( QKeyEvent *e );
+    void viewportMouseReleaseEvent( QMouseEvent *e );
+    void viewportMouseMoveEvent( QMouseEvent *e );
+#ifndef QT_NO_DRAGANDDROP
+    void viewportDragEnterEvent( QDragEnterEvent *e );
+    void viewportDragMoveEvent( QDragMoveEvent *e );
+    void viewportDragLeaveEvent( QDragLeaveEvent *e );
+    void viewportDropEvent( QDropEvent *e );
+    bool acceptDrop( const QPoint &pnt, QWidget *source );
+    void setCurrentDropItem( const QPoint &pnt );
+#endif
+
+private slots:
+    void rename();
+    void cancelRename();
+    void changeSortColumn2( int column );
+    void doubleClickTimeout();
+    void changeDirDuringDrag();
+    void dragObjDestroyed();
+    void contentsMoved( int, int );
+
+private:
+    QFileDialogP *filedialog;
+    QTimer* renameTimer;
+    QPoint pressPos, oldDragPos;
+    bool mousePressed;
+    int urls;
+    QString startDragDir;
+    QListViewItem *currDropItem, *dragItem;
+    QTimer *changeDirTimer;
+    bool firstMousePressEvent;
+    bool ascending;
+    int sortcolumn;
+    QUrlOperator startDragUrl;
+
+};
+
+/****************************************************************************
+ *
+ * Classes for copy progress dialog
+ *
+ ****************************************************************************/
+
+class QFDProgressAnimation : public QWidget
+{
+    Q_OBJECT
+
+public:
+    QFDProgressAnimation( QWidget *parent );
+    void start();
+
+private slots:
+    void next();
+
+protected:
+    void paintEvent( QPaintEvent *e );
+
+private:
+    int step;
+    QTimer *timer;
+
+};
+
+class QFDProgressDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    QFDProgressDialog( QWidget *parent, const QString &fn, int steps );
+
+    void setReadProgress( int p );
+    void setWriteProgress( int p );
+    void setWriteLabel( const QString &s );
+
+signals:
+    void cancelled();
+
+private:
+    QProgressBar *readBar;
+    QProgressBar *writeBar;
+    QLabel *writeLabel;
+    QFDProgressAnimation *animation;
+
+};
+
+#endif
+
+#endif // QFILEDIALOG_H
index 4b8268af90164280f6447e480547db41c7ca31ca..fd2a7fc5c6aa2c82ae0950a084f66f4ad728bf43 100644 (file)
@@ -1,30 +1,9 @@
-//  SALOME PatchQt : patch for Qt
-//
-//  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   : qsplitterP.cxx
-//  Module : SALOME
+/////////////////////////////////////////////////////////////////////////////
+// Module      : PatchQt
+// File        : qsplitterP.cxx
+// Description : the patch for Qt's QSplitter class (qsplitter.cpp)
+/////////////////////////////////////////////////////////////////////////////
 
-using namespace std;
 /****************************************************************************
 ** $Id$
 **
@@ -61,6 +40,8 @@ using namespace std;
 ** not clear to you.
 **
 **********************************************************************/
+
+using namespace std;
 #include "qsplitterP.h"
 #ifndef QT_NO_COMPLEXWIDGETS
 
index 70d9a72ecb6d152c6a5d37c2bf1ca4902eedf19d..263a90429e4bedb039bc3fd482425881a20cdb00 100644 (file)
@@ -1,28 +1,8 @@
-//  SALOME PatchQt : patch for Qt
-//
-//  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   : qsplitterP.h
-//  Module : SALOME
+/////////////////////////////////////////////////////////////////////////////
+// Module      : PatchQt
+// File        : qsplitterP.h
+// Description : the patch for Qt's QSplitter class (qsplitter.h)
+/////////////////////////////////////////////////////////////////////////////
 
 /****************************************************************************
 ** $Id$
@@ -116,6 +96,10 @@ public:
     QSplitterPHandle* getHandleBefore(QWidget* w);
 // VSR 21/11/02 <- ================================
 
+// ASL 07/09/04
+   bool isCompressed( const QWidget* ) const;
+// ASL 07/09/04
+
 protected:
     void childEvent( QChildEvent * );
 
@@ -125,7 +109,7 @@ protected:
     int idAfter( QWidget* ) const;
     QWidget* widgetBefore( int id ) const;
     QWidget* widgetAfter( int id ) const;
-    bool isCompressed(const QWidget*) const;
+
     QSize minSize( const QWidget *w ) const;
     QSize maxSize( const QWidget *w ) const;
     
index 0d4d618f751574db9d1cc7dd940d2c9d4cbd7936..f73e7392787fa6810d8fb965eb3059f6c163b4d6 100644 (file)
@@ -1,13 +1,45 @@
-//  SALOME PatchQt : patch for Qt
-//
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
-//
-//
-//
-//  File   : qworkspaceP.cxx
-//  Author : Vadim SANDLER
-//  Module : SALOME
-//  $Header$
+/////////////////////////////////////////////////////////////////////////////
+// Module      : PatchQt
+// File        : qworkspaceP.cxx
+// Description : the patch for Qt's QWorkspace class (qworkspace.cpp)
+/////////////////////////////////////////////////////////////////////////////
+
+/****************************************************************************
+** $Id$
+**
+** Implementation of the QWorkspace class
+**
+** Created : 931107
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the workspace module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition licenses may use this
+** file in accordance with the Qt Commercial License Agreement provided
+** with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
 
 using namespace std;
 #include "qworkspaceP.h"
index fd70401172c4b50ea72ad9c2c4c2549bac68664e..fb15237357d196e2c39d84f7b08fc70a9fcb446c 100644 (file)
@@ -1,13 +1,45 @@
-//  SALOME PatchQt : patch for Qt
-//
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
-//
-//
-//
-//  File   : qworkspaceP.h
-//  Author : Vadim SANDLER
-//  Module : SALOME
-//  $Header$
+/////////////////////////////////////////////////////////////////////////////
+// Module      : PatchQt
+// File        : qworkspaceP.h
+// Description : the patch for Qt's QWorkspace class (qworkspace.h)
+/////////////////////////////////////////////////////////////////////////////
+
+/****************************************************************************
+** $Id$
+**
+** Definition of the QWorkspace class
+**
+** Created : 990210
+**
+** Copyright (C) 1999-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the workspace module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition licenses may use this
+** file in accordance with the Qt Commercial License Agreement provided
+** with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
 
 #ifndef QWORKSPACEP_H
 #define QWORKSPACEP_H
index 580beb4456d356bdd65ce5f81ce786b52ba0506e..375a786b08b215df5467908c2bee466a19546172 100644 (file)
@@ -14,7 +14,8 @@ EXPORT_HEADERS = \
            Plot2d_ViewFrame.h \
            Plot2d_SetupViewDlg.h \
            Plot2d_SetupPlot2dDlg.h \
-           Plot2d_FitDataDlg.h
+           Plot2d_FitDataDlg.h \
+          Plot2d_Prs.h
 
 # .po files to transform in .qm
 #PO_FILES = \
@@ -29,7 +30,8 @@ LIB_SRC =       \
            Plot2d_ViewFrame.cxx \
            Plot2d_SetupViewDlg.cxx \
            Plot2d_SetupPlot2dDlg.cxx \
-           Plot2d_FitDataDlg.cxx
+           Plot2d_FitDataDlg.cxx \
+           Plot2d_Prs.cxx
 
 LIB_MOC = \
            Plot2d.h \
@@ -44,7 +46,7 @@ LIB_CLIENT_IDL = SALOMEDS.idl \
                 SALOME_Exception.idl
 
 CPPFLAGS+=$(QT_INCLUDES) $(OCC_INCLUDES) $(OGL_INCLUDES) $(PYTHON_INCLUDES) $(QWT_INCLUDES) 
-LDFLAGS+=$(QT_MT_LIBS) $(OGL_LIBS) $(QWT_LIBS) -lSalomeGUI
+LDFLAGS+=$(QT_MT_LIBS) $(OGL_LIBS) $(QWT_LIBS) -lSalomePrs -lSalomeGUI
 
 
 @CONCLUDE@
index f55104645e12add265756be029f9185a04ee65a1..b5267b086f3927d0bbb4bff6bf0a52a86ef2e0f4 100644 (file)
@@ -62,7 +62,7 @@ int Plot2d_CurveContainer::count()
 /*!
   Returns true if contains no curves
 */
-bool Plot2d_CurveContainer::isEmpty()
+bool Plot2d_CurveContainer::isEmpty() const
 {
   return myCurves.isEmpty();
 }
index 7cbf58f856824e186df7423b403b387fec593e68..ff5fdfcd85e0839b513f6130b925dae1cf525b00 100644 (file)
@@ -23,7 +23,7 @@ public:
   void                removeCurve( const int index, bool alsoDelete = false ) ;
   void                clear( bool alsoDelete = false );
   int                 count();
-  bool                isEmpty();
+  bool                isEmpty() const;
   Plot2d_Curve*       curve( const int index );
 
 private:
diff --git a/src/Plot2d/Plot2d_Prs.cxx b/src/Plot2d/Plot2d_Prs.cxx
new file mode 100644 (file)
index 0000000..2db19df
--- /dev/null
@@ -0,0 +1,95 @@
+//  SALOME OCCViewer : build OCC 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   : Plot2d_Prs.cxx
+//  Author : Sergey ANIKIN
+//  Module : SALOME
+//  $Header$
+
+#include "Plot2d_Prs.h"
+
+//==========================================================
+/*!
+ *  Plot2d_Prs::Plot2d_Prs
+ *  Default constructor
+ */
+//==========================================================
+Plot2d_Prs::Plot2d_Prs()  
+{
+}
+
+//==========================================================
+/*!
+ *  Plot2d_Prs::Plot2d_Prs
+ *  Standard constructor
+ */
+//==========================================================
+Plot2d_Prs::Plot2d_Prs( const Plot2d_Curve* obj )
+{ 
+  AddObject( obj ); 
+}
+
+//==========================================================
+/*!
+ *  Plot2d_Prs::~Plot2d_Prs
+ *  Destructor
+ */
+//==========================================================
+Plot2d_Prs::~Plot2d_Prs()
+{ 
+  myObjects.clear(); 
+}
+
+//==========================================================
+/*!
+ *  Plot2d_Prs::GetObjects
+ *  Get curves list
+ */
+//==========================================================
+Plot2d_CurveContainer Plot2d_Prs::GetObjects() const 
+{ 
+  return myObjects; 
+}
+
+//==========================================================
+/*!
+ *  Plot2d_Prs::AddObject
+ *  Add curbe
+ */
+//==========================================================
+void Plot2d_Prs::AddObject( const Plot2d_Curve* obj )
+{ 
+  myObjects.addCurve( (Plot2d_Curve*)obj ); 
+}
+
+//==========================================================
+/*!
+ *  Plot2d_Prs::IsNull
+ *  Return 0 if list of the curves is empty
+ *  [ Reimplemented from SALOME_Prs ]
+ */
+//==========================================================
+bool Plot2d_Prs::IsNull() const 
+{ 
+  return myObjects.isEmpty(); 
+}
diff --git a/src/Plot2d/Plot2d_Prs.h b/src/Plot2d/Plot2d_Prs.h
new file mode 100644 (file)
index 0000000..551f755
--- /dev/null
@@ -0,0 +1,59 @@
+//  SALOME OCCViewer : build OCC 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   : Plot2d_Prs.h
+//  Author : Sergey ANIKIN
+//  Module : SALOME
+//  $Header$
+
+#ifndef PLOT2D_PRS_H
+#define PLOT2D_PRS_H
+
+#include "SALOME_Prs.h"
+#include <Plot2d_CurveContainer.h>
+
+class Plot2d_Curve;
+
+class Plot2d_Prs : public SALOME_Prs2d
+{
+public:
+  Plot2d_Prs();
+  // Default constructor
+  Plot2d_Prs( const Plot2d_Curve* obj );
+  // Standard constructor
+  ~Plot2d_Prs();
+  // Destructor
+
+  Plot2d_CurveContainer GetObjects() const;
+  // Get curves list
+  void AddObject( const Plot2d_Curve* obj );
+  // Add curve
+
+  bool IsNull() const;
+  // Reimplemented from SALOME_Prs
+
+private:
+  Plot2d_CurveContainer myObjects;   // list of curves
+};
+
+#endif
index 89d8a738a3925b4c7ee4a3a2556188d0310314f3..1a14428e4342113344092cb3cd6c453cb4478036 100644 (file)
 #include <qcolordialog.h>
 #include <qspinbox.h>
 
+#include "utilities.h"
+
+using namespace std;
+
 #define DLG_SIZE_WIDTH    500 
 #define DLG_SIZE_HEIGHT   400
 #define MAX_LINE_WIDTH    100
@@ -107,10 +111,10 @@ Plot2d_SetupPlot2dDlg::Plot2d_SetupPlot2dDlg( SALOMEDS::SObject_var object, QWid
          frameLayout->addWidget( item->myVBtn,        row, 1 );
          frameLayout->addWidget( item->myTitleLab,    row, 3 );
          if ( rowTitles->length() > 0 )
-           item->myTitleLab->setText( QString( strdup( rowTitles[ i ] ) ) );
+           item->myTitleLab->setText( QString( rowTitles[ i ] ) );
          frameLayout->addWidget( item->myUnitLab,     row, 5 );
          if ( rowUnits->length() > 0 )
-           item->myUnitLab->setText( QString( strdup( rowUnits[ i ] ) ) );
+           item->myUnitLab->setText( QString( rowUnits[ i ] ) );
          frameLayout->addWidget( item->myAutoCheck,   row, 7 );
          frameLayout->addWidget( item->myLineCombo,   row, 8 );
          frameLayout->addWidget( item->myLineSpin,    row, 9 );
@@ -142,10 +146,10 @@ Plot2d_SetupPlot2dDlg::Plot2d_SetupPlot2dDlg( SALOMEDS::SObject_var object, QWid
          frameLayout->addWidget( item->myVBtn,        row, 1 );
          frameLayout->addWidget( item->myTitleLab,    row, 3 );
          if ( rowTitles->length() > 0 )
-           item->myTitleLab->setText( QString( strdup( rowTitles[ i ] ) ) );
+           item->myTitleLab->setText( QString( rowTitles[ i ] ) );
          frameLayout->addWidget( item->myUnitLab,     row, 5 );
          if ( rowUnits->length() > 0 )
-           item->myUnitLab->setText( QString( strdup( rowUnits[ i ] ) ) );
+           item->myUnitLab->setText( QString( rowUnits[ i ] ) );
          frameLayout->addWidget( item->myAutoCheck,   row, 7 );
          frameLayout->addWidget( item->myLineCombo,   row, 8 );
          frameLayout->addWidget( item->myLineSpin,    row, 9 );
@@ -272,13 +276,13 @@ void Plot2d_SetupPlot2dDlg::getCurves( Plot2d_CurveContainer& container )
          Plot2d_Curve* curve = new Plot2d_Curve();
          // curve titles
          if ( rowTitles->length() > 0 ) {
-           curve->setHorTitle( strdup( rowTitles[ horIndex ] ) );
-           curve->setVerTitle( strdup( rowTitles[ verIndex[i] ] ) );
+           curve->setHorTitle( QString( rowTitles[ horIndex ] ) );
+           curve->setVerTitle( QString( rowTitles[ verIndex[i] ] ) );
          }
          // curve units
          if ( rowUnits->length() > 0 ) {
-           curve->setHorUnits( strdup( rowUnits[ horIndex ] ) );
-           curve->setVerUnits( strdup( rowUnits[ verIndex[i] ] ) );
+           curve->setHorUnits( QString( rowUnits[ horIndex ] ) );
+           curve->setVerUnits( QString( rowUnits[ verIndex[i] ] ) );
          }
          // curve data
          int nbPoints = 0;
@@ -324,13 +328,13 @@ void Plot2d_SetupPlot2dDlg::getCurves( Plot2d_CurveContainer& container )
          Plot2d_Curve* curve = new Plot2d_Curve();
          // curve titles
          if ( rowTitles->length() > 0 ) {
-           curve->setHorTitle( strdup( rowTitles[ horIndex ] ) );
-           curve->setVerTitle( strdup( rowTitles[ verIndex[i] ] ) );
+           curve->setHorTitle( QString( rowTitles[ horIndex ] ) );
+           curve->setVerTitle( QString( rowTitles[ verIndex[i] ] ) );
          }
          // curve units
          if ( rowUnits->length() > 0 ) {
-           curve->setHorUnits( strdup( rowUnits[ horIndex ] ) );
-           curve->setVerUnits( strdup( rowUnits[ verIndex[i] ] ) );
+           curve->setHorUnits( QString( rowUnits[ horIndex ] ) );
+           curve->setVerUnits( QString( rowUnits[ verIndex[i] ] ) );
          }
          // curve data
          int nbPoints = 0;
index a2a03544d8c41f92f392ffed03988d26e8a2a8f3..53a7b3d920d9739d5e07a4a0bf527985123c3344 100644 (file)
@@ -9,6 +9,8 @@
 
 #include "Plot2d_ViewFrame.h"
 #include "Plot2d_SetupViewDlg.h"
+#include "Plot2d_Prs.h"
+
 #include "QAD_Desktop.h"
 #include "QAD_ResourceMgr.h"
 #include "QAD_FileDlg.h"
@@ -806,6 +808,7 @@ void Plot2d_ViewFrame::updateCurve( Plot2d_Curve* curve, bool update )
                                                   QSize( myMarkerSize, myMarkerSize ) ) );
     }
     myPlot->setCurveTitle( curveKey, curve->getVerTitle() );
+    myPlot->setCurveData( curveKey, curve->horData(), curve->verData(), curve->nbPoints() );
     myPlot->curve( curveKey )->setEnabled( true );
     updateTitles();
     if ( update )
@@ -1713,3 +1716,81 @@ bool Plot2d_Plot2d::existMarker( const QwtSymbol::Style typeMarker, const QColor
   }
   return false;
 }
+
+//==========================================================
+/*!
+ *  Plot2d_ViewFrame::Display
+ *  Display presentation
+ */
+//==========================================================
+void Plot2d_ViewFrame::Display( const SALOME_Prs2d* prs )
+{
+  // try do downcast object
+  const Plot2d_Prs* aPlot2dPrs = dynamic_cast<const Plot2d_Prs*>( prs );
+  if ( !aPlot2dPrs || aPlot2dPrs->IsNull() )
+    return;
+
+  // display all curves from presentation
+  Plot2d_CurveContainer aCurves = aPlot2dPrs->GetObjects();
+  displayCurves( aCurves );
+}
+
+//==========================================================
+/*!
+ *  Plot2d_ViewFrame::Erase
+ *  Erase presentation
+ */
+//==========================================================
+void Plot2d_ViewFrame::Erase( const SALOME_Prs2d* prs, const bool )
+{
+  // try do downcast object
+  const Plot2d_Prs* aPlot2dPrs = dynamic_cast<const Plot2d_Prs*>( prs );
+  if ( !aPlot2dPrs || aPlot2dPrs->IsNull() )
+    return;
+
+  // erase all curves from presentation
+  Plot2d_CurveContainer aCurves = aPlot2dPrs->GetObjects();
+  eraseCurves( aCurves );
+}
+  
+//==========================================================
+/*!
+ *  Plot2d_ViewFrame::CreatePrs
+ *  Create presentation by entry
+ */
+//==========================================================
+SALOME_Prs* Plot2d_ViewFrame::CreatePrs( const char* entry )
+{
+  Plot2d_Prs* prs = new Plot2d_Prs();
+  if ( entry ) {
+    QIntDictIterator<Plot2d_Curve> it( myCurves );
+    for ( ; it.current(); ++it ) {
+      if ( it.current()->hasIO() && !strcmp( it.current()->getIO()->getEntry(), entry ) ) {
+       prs->AddObject( it.current() );
+      }
+    }
+  }
+  return prs;
+}
+
+//==========================================================
+/*!
+ *  Plot2d_ViewFrame::BeforeDisplay
+ *  Axiluary method called before displaying of objects
+ */
+//==========================================================
+void  Plot2d_ViewFrame::BeforeDisplay( SALOME_Displayer* d )
+{
+  d->BeforeDisplay( this, SALOME_Plot2dViewType() );
+}
+
+//==========================================================
+/*!
+ *  Plot2d_ViewFrame::AfterDisplay
+ *  Axiluary method called after displaying of objects
+ */
+//==========================================================
+void  Plot2d_ViewFrame::AfterDisplay( SALOME_Displayer* d )
+{
+  d->AfterDisplay( this, SALOME_Plot2dViewType() );
+}
index 40e41b35786f1d1200f03a7e1e997abb8caa1bdb..04c87155c3e41817d99b090d64ea509c8b122532 100644 (file)
@@ -78,6 +78,13 @@ public:
   void           EraseAll();
   void           Repaint();
 
+  /* Reimplemented from SALOME_View */
+  void          Display( const SALOME_Prs2d* );
+  void          Erase( const SALOME_Prs2d*, const bool = false );
+  SALOME_Prs*   CreatePrs( const char* entry = 0 );
+  virtual void  BeforeDisplay( SALOME_Displayer* d );
+  virtual void  AfterDisplay ( SALOME_Displayer* d );
+
   /* event filter */
   bool    eventFilter( QObject* o, QEvent* e );
 
diff --git a/src/Prs/Makefile.in b/src/Prs/Makefile.in
new file mode 100755 (executable)
index 0000000..09f8a24
--- /dev/null
@@ -0,0 +1,27 @@
+# source path
+top_srcdir=@top_srcdir@
+top_builddir=../..
+srcdir=@srcdir@
+VPATH=.:@srcdir@:@top_srcdir@/idl
+
+
+@COMMENCE@
+
+EXPORT_HEADERS = SALOME_Prs.h
+
+# Libraries targets
+
+LIB = libSalomePrs.la
+LIB_SRC =       SALOME_Prs.cxx
+
+LIB_CLIENT_IDL = 
+
+# Executables targets
+BIN = 
+BIN_SRC        =
+
+CPPFLAGS+=
+LDFLAGS+= 
+
+
+@CONCLUDE@
diff --git a/src/Prs/SALOME_Prs.cxx b/src/Prs/SALOME_Prs.cxx
new file mode 100644 (file)
index 0000000..1856fa1
--- /dev/null
@@ -0,0 +1,364 @@
+// File:       SALOME_Prs.cxx
+// Created:    Wed Apr 28 15:03:43 2004
+// Author:     Sergey ANIKIN
+//             <san@startrex.nnov.opencascade.com>
+
+
+#include "SALOME_Prs.h"
+
+#include "utilities.h"
+
+using namespace std;
+
+//===========================================================
+/*!
+ *  Function: SALOME_OCCPrs::DisplayIn
+ *  Purpose:  Dispatches display operation to proper Display()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_OCCPrs::DisplayIn( SALOME_View* v ) const
+{
+  if ( v ) v->Display( this );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_OCCPrs::EraseIn
+ *  Purpose:  Dispatches display operation to proper Erase()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_OCCPrs::EraseIn( SALOME_View* v, const bool forced ) const
+{
+  if ( v ) v->Erase( this, forced );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_OCCPrs::LocalSelectionIn
+ *  Purpose:  Dispatches operation to proper LocalSelectionIn()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_OCCPrs::LocalSelectionIn( SALOME_View* v, const int mode ) const
+{
+  if ( v ) v->LocalSelection( this, mode );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_OCCPrs::Update
+ *  Purpose:  Dispatches update operation to proper Update()
+ *            method of SALOME_Displayer
+ */
+//===========================================================
+void SALOME_OCCPrs::Update( SALOME_Displayer* d )
+{
+  if ( d ) d->Update( this );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_VTKPrs::DisplayIn
+ *  Purpose:  Dispatches display operation to proper Display()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_VTKPrs::DisplayIn( SALOME_View* v ) const
+{
+  if ( v ) v->Display( this );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_VTKPrs::EraseIn
+ *  Purpose:  Dispatches display operation to proper Erase()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_VTKPrs::EraseIn( SALOME_View* v, const bool forced ) const
+{
+  if ( v ) v->Erase( this, forced );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_VTKPrs::LocalSelectionIn
+ *  Purpose:  Dispatches operation to proper LocalSelectionIn()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_VTKPrs::LocalSelectionIn( SALOME_View* v, const int mode ) const
+{
+  if ( v ) v->LocalSelection( this, mode );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_VTKPrs::Update
+ *  Purpose:  Dispatches update operation to proper Update()
+ *            method of SALOME_Displayer
+ */
+//===========================================================
+void SALOME_VTKPrs::Update( SALOME_Displayer* d )
+{
+  if ( d ) d->Update( this );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_Prs2d::DisplayIn
+ *  Purpose:  Dispatches display operation to proper Display()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_Prs2d::DisplayIn( SALOME_View* v ) const
+{
+  if ( v ) v->Display( this );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_Prs2d::EraseIn
+ *  Purpose:  Dispatches display operation to proper Erase()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_Prs2d::EraseIn( SALOME_View* v, const bool forced ) const
+{
+  if ( v ) v->Erase( this, forced );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_Prs2d::LocalSelectionIn
+ *  Purpose:  Dispatches operation to proper LocalSelectionIn()
+ *            method of SALOME_View
+ */
+//===========================================================
+void SALOME_Prs2d::LocalSelectionIn( SALOME_View* v, const int mode ) const
+{
+  if ( v ) v->LocalSelection( this, mode );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_Prs2d::Update
+ *  Purpose:  Dispatches update operation to proper Update()
+ *            method of SALOME_Displayer
+ */
+//===========================================================
+void SALOME_Prs2d::Update( SALOME_Displayer* d )
+{
+  if ( d ) d->Update( this );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::Display
+ *  Purpose:  Gives control to SALOME_Prs object, so that
+ *            it could perform double dispatch
+ */
+//===========================================================
+void SALOME_View::Display( const SALOME_Prs* prs )
+{
+  prs->DisplayIn( this );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::Erase
+ *  Purpose:  Gives control to SALOME_Prs object, so that
+ *            it could perform double dispatch
+ */
+//===========================================================
+void SALOME_View::Erase( const SALOME_Prs* prs, const bool forced )
+{
+  prs->EraseIn( this, forced );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::LocalSelection
+ *  Purpose:  Gives control to SALOME_Prs object, so that
+ *            it could perform double dispatch
+ */
+//===========================================================
+void SALOME_View::LocalSelection( const SALOME_Prs* prs, const int mode )
+{
+  prs->LocalSelectionIn( this, mode );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::Display
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::Display( const SALOME_OCCPrs* )
+{
+  MESSAGE( "SALOME_View::Display( const SALOME_OCCPrs& ) called! Probably, presentation is being displayed in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::Display
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::Display( const SALOME_VTKPrs* )
+{
+  MESSAGE( "SALOME_View::Display( const SALOME_VTKPrs& ) called! Probably, presentation is being displayed in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::Display
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::Display( const SALOME_Prs2d* )
+{
+  MESSAGE( "SALOME_View::Display( const SALOME_Prs2d& ) called! Probably, presentation is being displayed in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::Erase
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::Erase( const SALOME_OCCPrs*, const bool )
+{
+  MESSAGE( "SALOME_View::Erase( const SALOME_OCCPrs& ) called! Probably, presentation is being erased in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::Erase
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::Erase( const SALOME_VTKPrs*, const bool )
+{
+  MESSAGE( "SALOME_View::Erase( const SALOME_VTKPrs& ) called! Probably, presentation is being erased in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::Erase
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::Erase( const SALOME_Prs2d*, const bool )
+{
+  MESSAGE( "SALOME_View::Erase( const SALOME_Prs2d& ) called! Probably, presentation is being erased in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::LocalSelection
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::LocalSelection( const SALOME_OCCPrs*, const int )
+{
+  MESSAGE( "SALOME_View::LocalSelection( const SALOME_OCCPrs* ) called! \
+   Probably, selection is being activated in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::LocalSelection
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::LocalSelection( const SALOME_VTKPrs*, const int )
+{
+  MESSAGE( "SALOME_View::LocalSelection( const SALOME_VTKPrs* ) called! \
+   Probably, selection is being activated in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::LocalSelection
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::LocalSelection( const SALOME_Prs2d*, const int )
+{
+  MESSAGE( "SALOME_View::LocalSelection( const SALOME_Prs2d* ) called! \
+   Probably, selection is being activated in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_View::GlobalSelection
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_View::GlobalSelection( const bool ) const
+{
+  MESSAGE( "SALOME_View::GlobalSelection() called! \
+   Probably, selection is being activated in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_Displayer::UpdatePrs
+ *  Purpose:  Gives control to SALOME_Prs object, so that
+ *            it could perform double dispatch
+ */
+//===========================================================
+void SALOME_Displayer::UpdatePrs( SALOME_Prs* prs )
+{
+  prs->Update( this );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_Displayer::Update
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_Displayer::Update( SALOME_OCCPrs* )
+{
+  MESSAGE( "SALOME_Displayer::Update( SALOME_OCCPrs* ) called! Probably, presentation is being updated in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_Displayer::Update
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_Displayer::Update( SALOME_VTKPrs* )
+{
+  MESSAGE( "SALOME_Displayer::Update( SALOME_VTKPrs* ) called! Probably, presentation is being updated in uncompatible viewframe." );
+}
+
+//===========================================================
+/*!
+ *  Function: SALOME_Displayer::Update
+ *  Purpose:  Virtual method, should be reimplemented in successors,
+ *            by default issues a warning and does nothing.
+ */
+//===========================================================
+void SALOME_Displayer::Update( SALOME_Prs2d* )
+{
+  MESSAGE( "SALOME_Displayer::Update( SALOME_Prs2d* ) called! Probably, presentation is being updated in uncompatible viewframe." );
+}
+
diff --git a/src/Prs/SALOME_Prs.h b/src/Prs/SALOME_Prs.h
new file mode 100644 (file)
index 0000000..060bf18
--- /dev/null
@@ -0,0 +1,255 @@
+//  SALOME OBJECT : implementation of interactive object visualization for OCC and VTK viewers
+//
+//  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   : SALOME_Prs.h
+//  Author : Sergey ANIKIN
+//  Module : SALOME
+//  $Header$
+
+#ifndef SALOME_PRS_H
+#define SALOME_PRS_H
+
+class SALOME_View;
+class SALOME_Displayer;
+
+//===========================================================
+/*!
+ *  Class:       SALOME_Prs
+ *  Description: Base class for SALOME graphic object wrappers - presentations.
+ *               Presentations are temporary objects, so they can be created on the stack.
+ */
+//===========================================================
+
+class SALOME_Prs
+{
+public:
+  virtual ~SALOME_Prs() {}
+  // Destructor
+
+  virtual void DisplayIn( SALOME_View* ) const = 0;
+  // Key method for double dispatch of display operation
+
+  virtual void EraseIn( SALOME_View*, const bool = false ) const = 0;
+  // Key method for double dispatch of erase operation
+
+  virtual void Update( SALOME_Displayer* ) = 0;
+  // Key method for double dispatch of update operation
+
+  virtual bool IsNull() const = 0;
+  // Should return true, if this presentation contains a graphic object
+
+  virtual void LocalSelectionIn( SALOME_View*, const int ) const = 0;
+  // Key method for double dispatch of activation of subshapes selection
+};
+
+//===========================================================
+/*!
+ *  Class:       SALOME_OCCPrs
+ *  Description: Base class for OpenCASCADE graphic object (AIS_InteractiveObject) wrappers.
+ *               This intermediate class is necessary to avoid dependencies from OCC libs.
+ */
+//===========================================================
+
+class SALOME_OCCPrs : public SALOME_Prs
+{
+public:
+  virtual void DisplayIn( SALOME_View* ) const;
+  // It uses double dispatch in order to
+  // invoke Display() method corresponding to the actual type of presentation.
+
+  virtual void EraseIn( SALOME_View*, const bool = false ) const;
+  // It uses double dispatch in order to
+  // invoke Erase() method corresponding to the actual type of presentation.
+
+  virtual void Update( SALOME_Displayer* );
+  // It uses double dispatch in order to
+  // invoke Update() method corresponding to the actual type of presentation.
+
+  virtual void LocalSelectionIn( SALOME_View*, const int ) const;
+  // Key method for double dispatch of activation of subshapes selection
+};
+
+//===========================================================
+/*!
+ *  Class:       SALOME_VTKPrs
+ *  Description: Base class for VTK graphic object (vtkActor) wrappers
+ *               This intermediate class is necessary to avoid dependencies from VTK libs.
+ */
+//===========================================================
+
+class SALOME_VTKPrs : public SALOME_Prs
+{
+public:
+  virtual void DisplayIn( SALOME_View* ) const;
+  // It uses double dispatch in order to
+  // invoke Display() method corresponding to the actual type of presentation.
+
+  virtual void EraseIn( SALOME_View*, const bool = false ) const;
+  // It uses double dispatch in order to
+  // invoke Erase() method corresponding to the actual type of presentation.
+
+  virtual void Update( SALOME_Displayer* );
+  // It uses double dispatch in order to
+  // invoke Update() method corresponding to the actual type of presentation.
+
+  virtual void LocalSelectionIn( SALOME_View*, const int ) const;
+  // Key method for double dispatch of activation of subshapes selection
+};
+
+//===========================================================
+/*!
+ *  Class:       SALOME_Prs2d
+ *  Description: Base class for Plot2d graphic object (Plot2d_Curve) wrappers.
+ */
+//===========================================================
+
+class SALOME_Prs2d : public SALOME_Prs
+{
+public:
+  virtual void DisplayIn( SALOME_View* ) const;
+  // It uses double dispatch in order to
+  // invoke Display() method corresponding to the actual type of presentation.
+
+  virtual void EraseIn( SALOME_View*, const bool = false ) const;
+  // It uses double dispatch in order to
+  // invoke Erase() method corresponding to the actual type of presentation.
+
+  virtual void Update( SALOME_Displayer* );
+  // It uses double dispatch in order to
+  // invoke Update() method corresponding to the actual type of presentation.
+
+  virtual void LocalSelectionIn( SALOME_View*, const int ) const;
+  // Key method for double dispatch of activation of subshapes selection
+};
+
+/////////////////////////////////////////////////////////////////////////
+// Base classes for object wrappers for any other visualization libraries
+// should be added here!
+/////////////////////////////////////////////////////////////////////////
+
+//===========================================================
+/*!
+ *  Class:       SALOME_View
+ *  Description: Base class for SALOME views (or view frames)
+ */
+//===========================================================
+
+class SALOME_View
+{
+public:
+  virtual ~SALOME_View() {}
+  // Destructor
+
+  void Display( const SALOME_Prs* );
+  // This Display() method should be called to display given presentation
+  // created anywhere by anybody. It simply passes control to SALOME_Prs object
+  // so that it could perform double dispatch.
+  void Erase( const SALOME_Prs*, const bool = false );
+  // This Erase() method should be called to erase given presentation
+  // created anywhere by anybody. It simply passes control to SALOME_Prs object
+  // so that it could perform double dispatch.
+
+  void LocalSelection( const SALOME_Prs*, const int );
+  // This LocalSelection() method should be called to activate sub-shapes selection
+  // created anywhere by anybody. It simply passes control to SALOME_Prs object
+  // so that it could perform double dispatch.
+
+  // Interface for derived views
+
+  // Display() methods for ALL kinds of presentation should appear here
+  virtual void Display( const SALOME_OCCPrs* );
+  virtual void Display( const SALOME_VTKPrs* );
+  virtual void Display( const SALOME_Prs2d* );
+  // Add new Display() methods here...
+
+  // Erase() methods for ALL kinds of presentation should appear here
+  virtual void Erase( const SALOME_OCCPrs*, const bool = false );
+  virtual void Erase( const SALOME_VTKPrs*, const bool = false );
+  virtual void Erase( const SALOME_Prs2d*, const bool = false );
+  // Add new Erase() methods here...
+
+  // LocalSelection() methods for ALL kinds of presentation should appear here
+  virtual void LocalSelection( const SALOME_OCCPrs*, const int );
+  virtual void LocalSelection( const SALOME_VTKPrs*, const int );
+  virtual void LocalSelection( const SALOME_Prs2d* , const int );  
+
+  virtual void GlobalSelection( const bool = false ) const;
+  // Deactivates selection of sub-shapes (must be redefined with OCC viewer)
+
+  // Creates empty presenation of corresponding type
+  virtual SALOME_Prs* CreatePrs( const char* entry = 0 ) { return 0; }
+
+  // Axiluary methods called before and after displaying of objects
+  virtual void BeforeDisplay( SALOME_Displayer* d ) {}
+  virtual void AfterDisplay ( SALOME_Displayer* d ) {}
+};
+
+//===========================================================
+/*!
+ *  Classes:     SALOME_Displayer
+ *  Description: These classes are used to specify type of view
+ *               VTK, OCC or Plot2d
+ */
+//===========================================================
+
+class SALOME_OCCViewType    {};
+class SALOME_VTKViewType    {};
+class SALOME_Plot2dViewType {};
+
+//===========================================================
+/*!
+ *  Class:       SALOME_Displayer
+ *  Description: Base class for SALOME displayers
+ */
+//===========================================================
+
+class SALOME_Displayer
+{
+public:
+  virtual ~SALOME_Displayer() {}
+  // Destructor
+
+  void UpdatePrs( SALOME_Prs* );
+  // This Update() method should be called to update given presentation
+  // created anywhere by anybody. It simply passes control to SALOME_Prs object
+  // so that it could perform double dispatch.
+
+  // Interface for derived displayers
+
+  // Update() methods for ALL kinds of presentation should appear here
+  virtual void Update( SALOME_OCCPrs* );
+  virtual void Update( SALOME_VTKPrs* );
+  virtual void Update( SALOME_Prs2d* );
+  // Add new Update() methods here...
+
+  // Axiluary methods called before and after displaying of objects
+  virtual void BeforeDisplay( SALOME_View*, const SALOME_OCCViewType&    ) {};
+  virtual void AfterDisplay ( SALOME_View*, const SALOME_OCCViewType&    ) {};
+  virtual void BeforeDisplay( SALOME_View*, const SALOME_VTKViewType&    ) {};
+  virtual void AfterDisplay ( SALOME_View*, const SALOME_VTKViewType&    ) {};
+  virtual void BeforeDisplay( SALOME_View*, const SALOME_Plot2dViewType& ) {};
+  virtual void AfterDisplay ( SALOME_View*, const SALOME_Plot2dViewType& ) {};
+};
+
+#endif
+
index c7a16048fff2da2d82fefc7feb17e40e96430070..d78d5150fbe4fb7cd494a550f6ddd41451e4a489 100644 (file)
@@ -134,9 +134,11 @@ RegWidget::RegWidget(CORBA::ORB_var &orb, QWidget *parent, const char *name )
   connect( _refresh, SIGNAL( clicked() ), this, SLOT( slotListeSelect() ) );
   QToolTip::add( _refresh, "", toolTipGroup(), tr("Immediately updates list of components") );
   
+  /* PAL5540 - this button is needless
   QPushButton* help = new QPushButton( tr( "Help" ), topbar );
   connect( help, SIGNAL( clicked() ), this, SLOT( slotHelp() ) );
   QToolTip::add( help, "", toolTipGroup(), tr("Opens Help window") );
+  */
   
   _interval = new QPushButton( tr( "Interval" ), topbar );
   connect( _interval, SIGNAL( clicked() ), this, SLOT( slotSelectRefresh() ) );
index e82e54a2326d5fd20c6073262c1397a09ee8c834..56517030131e784cc8a7eba8475a512f42339300 100755 (executable)
 //  Module : SALOME
 //$Header$
 
-using namespace std;
-#define WRITE_RESSOURCES_TYPE
 #include "SALOME_RessourcesCatalog_Handler.hxx"
 
+#include "utilities.h"
+
+using namespace std;
+
+ListOfParserressources _ressources_list;
+
 //----------------------------------------------------------------------
 //Function : SALOME_RessourcesCatalog_Handler
 //Purpose: Constructor
index eaae9def9e903b7924109a52d89c7d31b6b30f17..9e1b8e2f8d898c377c63ef2c41b982ec11e029e6 100755 (executable)
@@ -29,8 +29,8 @@
 #ifndef SALOME_RESSOURCES_CATALOG_HANDLER
 #define SALOME_RESSOURCES_CATALOG_HANDLER
 
-#include "utilities.h"
 #include "SALOME_RessourcesCatalog_Parser.hxx"
+
 #include <qxml.h>
 #include <string>
 #include <vector>
@@ -101,7 +101,7 @@ public :
 private :
   QString errorProt;
 
-  string content;
+  std::string content;
 
   const char* test_computer;
   const char* test_computer_name;
index b32e4c31204634a1418113ce6c0b5ba1f4c6aea1..107f5ee41014e5b97ebfdee502f1daa9ef4a3a82 100755 (executable)
 
 struct ParserProc{
     long Parsernumber;
-    string Parsermodel_name;
+    std::string Parsermodel_name;
     float Parsercpu_mhz;
     float Parsercache_size;
 };
 
-typedef vector<ParserProc> ListOfParserProc;
+typedef std::vector<ParserProc> ListOfParserProc;
 
 enum Parsercontainertype {Cpp, python, NP};
-typedef vector<Parsercontainertype> ListOfParserContainerType;
+typedef std::vector<Parsercontainertype> ListOfParserContainerType;
 
 struct Parserressources{
-  string Parsername;
-  string ParserOS;
-  string ParserOS_version;
+  std::string Parsername;
+  std::string ParserOS;
+  std::string ParserOS_version;
   ListOfParserProc Parserprocs;
   ListOfParserContainerType Parsercontainertype;
 };
 
-typedef vector<Parserressources> ListOfParserressources;
+typedef std::vector<Parserressources> ListOfParserressources;
 
-#ifdef WRITE_RESSOURCES_TYPE
-ListOfParserressources _ressources_list;
-#else
 extern ListOfParserressources _ressources_list;
-#endif
+
 
 #endif //SALOME_RESSOURCES_CATALOG_PARSER
index 11336f9ae384de57e40d78b7b56f6cceba751df0..a5f6b39e812d1c5b35177220d88a5d6b248f36ab 100644 (file)
@@ -115,7 +115,7 @@ BIN_CLIENT_IDL =
 
 CPPFLAGS+=$(OCC_INCLUDES) $(HDF5_INCLUDES)
 CXXFLAGS+=$(OCC_CXXFLAGS)
-LDFLAGS+= $(HDF5_LIBS) -lTOOLSDS -lSalomeNS -lSalomeHDFPersist -lOpUtil -lSALOMELocalTrace $(CAS_LDPATH) -lTKCAF -lTKStdSchema -lSalomeGenericObj -lSalomeLifeCycleCORBA
+LDFLAGS+= $(HDF5_LIBS) -lTOOLSDS -lSalomeNS -lSalomeHDFPersist -lOpUtil -lSALOMELocalTrace $(CAS_LDPATH) -lTKCAF -lTKBO -lTKStdSchema -lSalomeGenericObj -lSalomeLifeCycleCORBA
 
 # _CS_gbo_090604 Ajout Spécifique Calibre 3, pour l'utilisation de la version 5.12 de la bibliothèque OCC.
 # La bibliothèque OCC5.12 a été compilée sur Calibre 3 avec l'extention Xmu (impossible de compiler sans).
index f21ae9b3bac5cd014db15cf8d499f6ff79d40afc..5164435584efd3c8ab34125b4170be302caf41e1 100644 (file)
@@ -42,7 +42,7 @@ void SALOMEDS_AttributeDrawable_i::SetDrawable(CORBA::Boolean value) {
 }
 
 char* SALOMEDS_AttributeDrawable_i::Store() {
-  return strdup(IsDrawable()?"1":"0");
+  return CORBA::string_dup(IsDrawable()?"1":"0");
 }
 
 void SALOMEDS_AttributeDrawable_i::Restore(const char* value) {
index 98a0720cf9373f66644f80aa440b47bd8fadeb31..01679d0cab39dc8aea3c51d1c602b3d4a7a12fac 100644 (file)
@@ -41,7 +41,7 @@ void SALOMEDS_AttributeExpandable_i::SetExpandable(CORBA::Boolean value) {
 }
 
 char* SALOMEDS_AttributeExpandable_i::Store() {
-  return strdup(IsExpandable()?"1":"0");
+  return CORBA::string_dup(IsExpandable()?"1":"0");
 }
 
 void SALOMEDS_AttributeExpandable_i::Restore(const char* value) {
index e9ce976d42ec4465b7585083fd66883b20b00174..3dafade54d62f0f0cc9611c3835f13ad348c5123 100644 (file)
@@ -39,8 +39,9 @@ char* SALOMEDS_AttributeName_i::Value() {
 
 void SALOMEDS_AttributeName_i::SetValue(const char* value) {
   CheckLocked();
-  CORBA::String_var Str = CORBA::string_dup(value);
-  Handle(TDataStd_Name)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str));
+  //CORBA::String_var Str = CORBA::string_dup(value);
+  //Handle(TDataStd_Name)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str));
+  Handle(TDataStd_Name)::DownCast(_myAttr)->Set(TCollection_ExtendedString((char*)value));
 }
 
 char* SALOMEDS_AttributeName_i::Store() {
index cd4e87f17b70702f7349d72699e62c13e14f0d79..1c5808a596adab0909c184350053c7e2462858d1 100644 (file)
@@ -41,7 +41,7 @@ void SALOMEDS_AttributeOpened_i::SetOpened(CORBA::Boolean value) {
 }
 
 char* SALOMEDS_AttributeOpened_i::Store() {
-  return strdup(IsOpened()?"1":"0");
+  return CORBA::string_dup(IsOpened()?"1":"0");
 }
 
 void SALOMEDS_AttributeOpened_i::Restore(const char* value) {
index a02fa874eba13d2403b8cde375c32ec160dceb17..dde8e609309227431f18e75f2b877bcb01c64282 100644 (file)
@@ -40,6 +40,7 @@ char* SALOMEDS_AttributePythonObject_i::Store() {
 }
 
 void SALOMEDS_AttributePythonObject_i::Restore(const char* value) {
-  char* aString = strdup(value);
+  char* aString = CORBA::string_dup(value);
   SetObject(aString + 1, aString[0]=='s');
+  delete(aString);
 }
index c87b604865658a359067986694116db9a8323aee..62b52968025ae5f7fae37021754b4411db192463 100644 (file)
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include "SALOMEDS_AttributeReal_i.hxx"
 #include "SALOMEDS_SObject_i.hxx"
+#include <sstream>
+
+using namespace std;
+
+static const char* write_double(double value)
+{
+  std::ostringstream os;
+  unsigned char* array = (unsigned char*)&value;
+  for(int i = 0; i < sizeof(double); i++) {
+    unsigned tmp = (unsigned short)array[i];
+    os << " " << tmp;
+  }
+  return os.str().c_str();
+}
+
+static double read_double(const char* str)
+{
+  std::istringstream is(str);
+  double value;
+  unsigned char* array = (unsigned char*)(&value);
+  for(int i = 0; i < sizeof(double); i++) {
+    unsigned tmp;
+    is >> tmp;
+    array[i] = (unsigned char)tmp;
+  }
+  return value;
+}
 
 CORBA::Double SALOMEDS_AttributeReal_i::Value() {
   return Handle(TDataStd_Real)::DownCast(_myAttr)->Get();
@@ -40,13 +66,16 @@ void SALOMEDS_AttributeReal_i::SetValue(CORBA::Double value) {
 }
 
 char* SALOMEDS_AttributeReal_i::Store() {
-  char* RealVal = new char[25];
-  sprintf(RealVal, "%f", Value());
-  return RealVal;
+  //  char* RealVal = new char[35];
+  //  sprintf(RealVal, "%.20f", Value());
+  //return RealVal;
+  return (char*)write_double( (double)Value() );
 }
 
 void SALOMEDS_AttributeReal_i::Restore(const char* value) {
-  char *err = NULL;
-  CORBA::Double r =  strtod(value, &err);
-  if (err != value) SetValue(r);
+  //char *err = NULL;
+  //CORBA::Double r =  strtod(value, &err);
+  //if (err != value) SetValue(r);
+  SetValue( read_double(value) );
 }
+
index fd9fa7ad2bc7a5399e88137d7933da2f3e43e26d..c18334aea5d0060e1d2e89dea84f3c3663190228 100644 (file)
@@ -41,7 +41,7 @@ void SALOMEDS_AttributeSelectable_i::SetSelectable(CORBA::Boolean value) {
 }
 
 char* SALOMEDS_AttributeSelectable_i::Store() {
-  return strdup(IsSelectable()?"1":"0");
+  return CORBA::string_dup(IsSelectable()?"1":"0");
 }
 
 void SALOMEDS_AttributeSelectable_i::Restore(const char* value) {
index 703810bc5b3cb72335324173e440eda70b53de7d..28748f7532f3d7e10051ba5b1da00bd0b3d2ae6b 100644 (file)
@@ -97,7 +97,7 @@ char* SALOMEDS_AttributeSequenceOfInteger_i::Store() {
 void SALOMEDS_AttributeSequenceOfInteger_i::Restore(const char* value) {
   Handle(TColStd_HSequenceOfInteger) CasCadeSeq = new TColStd_HSequenceOfInteger;
   
-  char* aCopy = strdup(value);
+  char* aCopy = CORBA::string_dup(value);
   char* adr = strtok(aCopy, " ");
   while (adr) {
     CORBA::Long l =  atol(adr);
index d7f480a160c7c86fd72fa6fb241a0fc2bf4001de..a88637f6a01504d802670375554cd3fafdb5a1b9 100644 (file)
@@ -96,7 +96,7 @@ char* SALOMEDS_AttributeSequenceOfReal_i::Store() {
 void SALOMEDS_AttributeSequenceOfReal_i::Restore(const char* value) {
   Handle(TColStd_HSequenceOfReal) CasCadeSeq = new TColStd_HSequenceOfReal;
   
-  char* aCopy = strdup(value);
+  char* aCopy =  CORBA::string_dup(value);
   char* adr = strtok(aCopy, " ");
   char *err = NULL;
   while (adr) {
index 9b2b8912c8f29a590098a3e65dd049e76d104ac9..8444beca918760d90dd3909b6e171292b794c439 100644 (file)
@@ -22,7 +22,7 @@ using namespace std;
 void SALOMEDS_AttributeStudyProperties_i::SetUserName(const char* theName) {
   CheckLocked();
   Handle(SALOMEDS_StudyPropertiesAttribute) aProp = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr);
-  aProp->SetFirstName(TCollection_ExtendedString(strdup(theName)));
+  aProp->SetFirstName((char*)theName);
 }
 
 char* SALOMEDS_AttributeStudyProperties_i::GetUserName() {
@@ -111,7 +111,7 @@ void SALOMEDS_AttributeStudyProperties_i::SetModification(const char* theName,
                                                          CORBA::Long theYear) {
   CheckLocked();
   Handle(SALOMEDS_StudyPropertiesAttribute) aProp = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr);
-  aProp->SetUserName(strdup(theName));
+  aProp->SetUserName((char*)theName);
   aProp->SetModificationDate((int)theMinute, (int)theHour, (int)theDay, (int)theMonth, (int)theYear);
 }
 void SALOMEDS_AttributeStudyProperties_i::GetModificationsList(SALOMEDS::StringSeq_out theNames,
@@ -185,7 +185,7 @@ char* SALOMEDS_AttributeStudyProperties_i::Store() {
 }
 
 void SALOMEDS_AttributeStudyProperties_i::Restore(const char* value) {
-  char* aCopy = strdup(value);
+  char* aCopy = CORBA::string_dup(value);
   if (aCopy[0] == 'f') SetCreationMode("from scratch");
   else if (aCopy[0] == 'c') SetCreationMode("copy from");
   else SetCreationMode("none");
index 6e575f1310ff8b49f490d352e8159e49c5457041..e37bd2a9bd884043df6e9ddb26a4e3767be137d9 100644 (file)
@@ -204,7 +204,7 @@ void SALOMEDS_AttributeTreeNode_i::Restore(const char* value) {
   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
   Handle(TDF_Data) DF = TDocStd_Document::Get(_myAttr->Label())->GetData();
   
-  char* aCopy = strdup(value);
+  char* aCopy = CORBA::string_dup(value);
   char* adr = strtok(aCopy, " ");
   
   TDF_Label aLabel;
@@ -236,4 +236,5 @@ void SALOMEDS_AttributeTreeNode_i::Restore(const char* value) {
     if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
     aNode->SetFirst(aDepNode);
   }
+  delete(aCopy);
 }
index 2ea8c97fe54b166a3d31fe3a3012520ac7abfbf2..2e4af4382fb204d4e83330260e36158b866d7a27 100644 (file)
@@ -62,13 +62,13 @@ public:
 
 // defines for creation attributes objects
 
-//cout<<"*** Create new CORBA attribute for "<<#CORBA_Name<<endl;
+//MESSAGE("*** Create new CORBA attribute for "<<#CORBA_Name);
 #define __ReturnCORBAAttribute(OCAF_Name, CORBA_Name) if (theAttr->ID() == OCAF_Name::GetID()) { \
     SALOMEDS_##CORBA_Name##_i* Attr = new SALOMEDS_##CORBA_Name##_i(Handle(OCAF_Name)::DownCast(theAttr), theOrb); \
     return Attr->CORBA_Name::_this(); \
   }
 
-//cout<<"Create New Attribute "<<#CORBA_Name<<endl;
+//MESSAGE("Create New Attribute "<<#CORBA_Name);
 #define __FindOrCreateAttribute(OCAF_Name, CORBA_Name) if (strcmp(aTypeOfAttribute, #CORBA_Name) == 0) { \
     Handle(OCAF_Name) anAttr; \
     if (!Lab.FindAttribute(OCAF_Name::GetID(), anAttr)) { \
@@ -79,7 +79,7 @@ public:
     return Attr->CORBA_Name::_this(); \
   }
 
-//cout<<"Create New Attribute "<<#CORBA_Name<<endl;
+//MESSAGE("Create New Attribute "<<#CORBA_Name);
 #define __FindOrCreateAttributeLocked(OCAF_Name, CORBA_Name) if (strcmp(aTypeOfAttribute, #CORBA_Name) == 0) { \
     Handle(OCAF_Name) anAttr; \
     if (!Lab.FindAttribute(OCAF_Name::GetID(), anAttr)) { \
index 896859cca1bd7bb366e8d213a7dbe9aa3113bd20..15b066e5ec96f4c7c3d1933c6d506b508a499a99 100644 (file)
@@ -87,7 +87,7 @@ CORBA::Boolean SALOMEDS_SComponent_i::ComponentIOR(CORBA::String_out IOR)
   if (!_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),ior) )
       return false;
   TCollection_AsciiString ch(ior->Get());
-  IOR = strdup(ch.ToCString());
+  IOR = CORBA::string_dup(ch.ToCString());
   return true;
 }
   
index 25cb25ac7f4416f99146fa250f5d2b2034c6a10a..42971688602e8cdf6fdb5fc0fb61264fd73500c1 100644 (file)
@@ -233,6 +233,16 @@ CORBA::Short SALOMEDS_SObject_i::Tag()
   return _lab.Tag();
 }
 
+//============================================================================
+/*! Function :
+ *  Purpose  : 
+ */
+//============================================================================
+CORBA::Short SALOMEDS_SObject_i::Depth()
+{
+  return _lab.Depth();
+}
+
 //============================================================================
 /*! Function :
  *  Purpose  : 
index fa0fa58dc6edc89fd589c6830910b0b1f06ecb9d..67ab9d9ba006b6ccff516fc3bf90de5486a25e94 100644 (file)
@@ -87,6 +87,7 @@ public:
   virtual char* GetIOR();
 
   virtual CORBA::Short Tag();
+  virtual CORBA::Short Depth();
 
   static char* AttributeIDToType(Standard_GUID);
   
index 64eba6c88b5fb489cfb825d0529b119f7904a5f0..47bfde5ae180fd1a8e54c909372ce52330b818a4 100644 (file)
@@ -457,16 +457,10 @@ void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr anSCO,
          aDriver->Load(anSCO, aStreamFile.in(), aDir, aMultifileState[0]=='M');
       if(!aResult) {
        RemoveAttribute( anSCO, "AttributeIOR" );
-       if (isASCII) {
-         SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames;
-         aFilesToRemove->length(1);
-         aFilesToRemove[0] = CORBA::string_dup(&(aHDFUrl[strlen(SALOMEDS_Tool::GetDirFromPath(aHDFUrl))]));
-         SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true);
-       }
-       delete aHDFUrl;
+
        MESSAGE("Can't load component");
-       THROW_SALOME_CORBA_EXCEPTION("Unable to load component data",SALOME::BAD_PARAM);
-         //    throw HDFexception("Unable to load component");
+       //THROW_SALOME_CORBA_EXCEPTION("Unable to load component data",SALOME::BAD_PARAM);
+       throw HDFexception("Unable to load component");
       }
       
       delete(aDir);
@@ -485,8 +479,8 @@ void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr anSCO,
       if (isASCII) {
        SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames;
        aFilesToRemove->length(1);
-       aFilesToRemove[0] = CORBA::string_dup(&(aHDFUrl[strlen(SALOMEDS_Tool::GetDirFromPath(aHDFUrl))]));
-       SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true);
+       aFilesToRemove[0] = CORBA::string_dup(&(aHDFUrl[strlen(SALOMEDS_Tool::GetDirFromPath(aHDFUrl).c_str())]));
+       SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aHDFUrl).c_str(), aFilesToRemove, true);
       }
       delete aHDFUrl;
     }
@@ -496,12 +490,12 @@ void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr anSCO,
       if (isASCII) {
        SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames;
        aFilesToRemove->length(1);
-       aFilesToRemove[0] = CORBA::string_dup(&(aHDFUrl[strlen(SALOMEDS_Tool::GetDirFromPath(aHDFUrl))]));
-       SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true);
+       aFilesToRemove[0] = CORBA::string_dup(&(aHDFUrl[strlen(SALOMEDS_Tool::GetDirFromPath(aHDFUrl).c_str())]));
+       SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aHDFUrl).c_str(), aFilesToRemove, true);
       }
       delete aHDFUrl;
       if (aLocked) anSCO->GetStudy()->GetProperties()->SetLocked(true);
-      return;
+      THROW_SALOME_CORBA_EXCEPTION("No persistent file Name found",SALOME::BAD_PARAM);   
     }
     
     try {
@@ -689,13 +683,15 @@ void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me)
 
   Lab.ForgetAttribute(TDF_Reference::GetID());  
 
-  TDF_Label RefLab;  
+  //SRN: 30 Aug, 2004 : fix from Ecole l'ete version 
+
+  TDF_Label RefLab;
   ASSERT(!CORBA::is_nil(theReferencedObject));
   CORBA::String_var roid = theReferencedObject->GetID();
   TDF_Tool::Label(_doc->GetData(),roid,RefLab);
-
-  RemoveAttribute(theReferencedObject, "AttributeTarget");
-  //if(!CORBA::is_nil(_callbackOnRemove) && Lab.IsDescendant(_doc->Main())) _callbackOnRemove->OnRemoveSObject(me);
+       
+  Handle(SALOMEDS_TargetAttribute) aTarget;
+  if(RefLab.FindAttribute(SALOMEDS_TargetAttribute::GetID(), aTarget)) aTarget->Remove(Lab);
 }
 
 
@@ -849,7 +845,7 @@ void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::Loc
 //============================================================================
 CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand()
 {
-  _doc->HasOpenCommand();
+  return _doc->HasOpenCommand();
 }
 
 //============================================================================
index 222a6fe2738dfc0e7bd43a235d56cb0c5f4a0b3a..0f4a38c99d44ec05088deacaccfeb5934faff9e1 100644 (file)
@@ -278,7 +278,7 @@ SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::NewStudy(const char* study_name)
 
   // Assign the value of the IOR in the study->root
   const char*  IORStudy = _orb->object_to_string(Study);
-  SALOMEDS_IORAttribute::Set(Doc->Main().Root(),TCollection_ExtendedString(strdup(IORStudy)),_orb);
+  SALOMEDS_IORAttribute::Set(Doc->Main().Root(),TCollection_ExtendedString((char*)IORStudy),_orb);
 
   // set Study properties
   SALOMEDS::AttributeStudyProperties_ptr aProp = Study->GetProperties();
@@ -315,7 +315,7 @@ SALOMEDS::Study_ptr  SALOMEDS_StudyManager_i::Open(const char* aUrl)
     sprintf(aHDFUrl, "%shdf_from_ascii.hdf", aResultPath);
     delete(aResultPath);
   } else {
-    aHDFUrl = strdup(aUrl);
+    aHDFUrl = CORBA::string_dup(aUrl);
   }
 
   hdf_file = new HDFfile(aHDFUrl);
@@ -354,7 +354,7 @@ SALOMEDS::Study_ptr  SALOMEDS_StudyManager_i::Open(const char* aUrl)
   SALOMEDS_IORAttribute::Set(Doc->Main().Root(),
                             TCollection_ExtendedString(CORBA::string_dup(IORStudy)),_orb);
 
-  SALOMEDS_PersRefAttribute::Set(Doc->Main(),strdup(aUrl)); 
+  SALOMEDS_PersRefAttribute::Set(Doc->Main(),(char*)aUrl); 
 
   if (!hdf_file->ExistInternalObject("STUDY_STRUCTURE")) {
     delete aHDFUrl;
@@ -391,8 +391,8 @@ SALOMEDS::Study_ptr  SALOMEDS_StudyManager_i::Open(const char* aUrl)
   if (isASCII) {
     SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames;
     aFilesToRemove->length(1);
-    aFilesToRemove[0] = strdup(&(aHDFUrl[strlen(SALOMEDS_Tool::GetDirFromPath(aHDFUrl))]));
-    SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true);
+    aFilesToRemove[0] = CORBA::string_dup(&(aHDFUrl[strlen(SALOMEDS_Tool::GetDirFromPath(aHDFUrl).c_str())]));
+    SALOMEDS_Tool::RemoveTemporaryFiles(SALOMEDS_Tool::GetDirFromPath(aHDFUrl).c_str(), aFilesToRemove, true);
   }
   delete aHDFUrl;
   delete hdf_file; // all related hdf objects will be deleted
@@ -583,20 +583,20 @@ static void SaveAttributes(SALOMEDS::SObject_ptr SO, HDFgroup *hdf_group_sobject
     if (strcmp(anAttrList[a]->Type(), "AttributeIOR") == 0) continue; // never write AttributeIOR to file
     if (strcmp(anAttrList[a]->Type(), "AttributeExternalFileDef") == 0) continue; // never write ExternalFileDef to file
     if (strcmp(anAttrList[a]->Type(), "AttributeFileType") == 0) continue; // never write FileType to file
-    CORBA::String_var aSaveStr = strdup(anAttrList[a]->Store());
+    CORBA::String_var aSaveStr = CORBA::string_dup(anAttrList[a]->Store());
     size[0] = (hdf_int32) strlen(aSaveStr) + 1;
     HDFdataset *hdf_dataset = new HDFdataset(anAttrList[a]->Type(),hdf_group_sobject,HDF_STRING,size,1);
     hdf_dataset->CreateOnDisk();
     hdf_dataset->WriteOnDisk(aSaveStr);
     hdf_dataset->CloseOnDisk();
-    //cout<<"********** Write Attribute "<<anAttrList[a]->Type()<<" : "<<aSaveStr<<" done"<<endl;
+    //MESSAGE("********** Write Attribute "<<anAttrList[a]->Type()<<" : "<<aSaveStr<<" done");
     hdf_dataset=0; //will be deleted by hdf_sco_group destructor
   }
 
   // Reference attribute has no CORBA attribute representation, so, GetAllAttributes can not return this attribute
   SALOMEDS::SObject_var RefSO;
   if(SO->ReferencedObject(RefSO)) {
-    CORBA::String_var attribute_reference = strdup(RefSO->GetID());
+    CORBA::String_var attribute_reference = CORBA::string_dup(RefSO->GetID());
     size[0] = strlen(attribute_reference) + 1 ; 
     HDFdataset *hdf_dataset = new HDFdataset("Reference",hdf_group_sobject,HDF_STRING,size,1);
     hdf_dataset->CreateOnDisk();
@@ -668,7 +668,8 @@ void SALOMEDS_StudyManager_i::_SaveProperties(SALOMEDS::Study_ptr aStudy, HDFgro
   MESSAGE("attribute StudyProperties " <<  aProperty << " wrote on file");
   hdf_dataset->CloseOnDisk();
   hdf_dataset=0; //will be deleted by hdf_sco_group destructor
-  delete(aProperty);
+  //delete(aProperty); 
+  delete [] aProperty;
   aProp->SetModified(0);
 }
 
@@ -717,28 +718,26 @@ void SALOMEDS_StudyManager_i::_SaveAs(const char* aUrl,
       for (; itcomponent1->More(); itcomponent1->Next())
        {
          SALOMEDS::SComponent_var sco = itcomponent1->Value();
+
          // if there is an associated Engine call its method for saving
          CORBA::String_var IOREngine;
          try {
-           
            if (!sco->ComponentIOR(IOREngine)) {
              SALOMEDS::GenericAttribute_var aGeneric;
-             SALOMEDS::AttributeName_var aName;
-             if(sco->FindAttribute(aGeneric, "AttributeName"))
-               aName = SALOMEDS::AttributeName::_narrow(aGeneric);
-
+             SALOMEDS::AttributeComment_var aName;
+             if(sco->FindAttribute(aGeneric, "AttributeComment"))
+               aName = SALOMEDS::AttributeComment::_narrow(aGeneric);
+           
              if (!aName->_is_nil()) {
                
                CORBA::String_var aCompType = aName->Value();
 
-               
                CORBA::String_var aFactoryType;
                if (strcmp(aCompType, "SUPERV") == 0) aFactoryType = "SuperVisionContainer";
                else aFactoryType = "FactoryServer";
                
                Engines::Component_var aComp =
                  SALOME_LifeCycleCORBA(_name_service).FindOrLoad_Component(aFactoryType, aCompType);
-               
                if (aComp->_is_nil()) {
                  Engines::Component_var aComp =
                    SALOME_LifeCycleCORBA(_name_service).FindOrLoad_Component("FactoryServerPy", aCompType);
@@ -842,8 +841,8 @@ void SALOMEDS_StudyManager_i::_SaveAs(const char* aUrl,
 
                  SALOMEDS::TMPFile_var aStream;
 
-                  if (theASCII) aStream = Engine->SaveASCII(sco,SALOMEDS_Tool::GetDirFromPath(aUrl),theMultiFile);
-                 else aStream = Engine->Save(sco,SALOMEDS_Tool::GetDirFromPath(aUrl),theMultiFile);
+                  if (theASCII) aStream = Engine->SaveASCII(sco,SALOMEDS_Tool::GetDirFromPath(aUrl).c_str(),theMultiFile);
+                 else aStream = Engine->Save(sco,SALOMEDS_Tool::GetDirFromPath(aUrl).c_str(),theMultiFile);
 
                  HDFdataset *hdf_dataset;
                  hdf_size aHDFSize[1];
@@ -1006,7 +1005,7 @@ void SALOMEDS_StudyManager_i::_SaveObject(SALOMEDS::Study_ptr aStudy,
        }
       }
 
-      CORBA::String_var scoid = strdup(SO->GetID());
+      CORBA::String_var scoid = CORBA::string_dup(SO->GetID());
       hdf_group_sobject = new HDFgroup(scoid,hdf_group_datatype);
       hdf_group_sobject->CreateOnDisk();
       SaveAttributes(SO, hdf_group_sobject);
@@ -1031,7 +1030,7 @@ const char *SALOMEDS_StudyManager_i::_SubstituteSlash(const char *aUrl)
   Standard_ExtCharacter val2 = ToExtCharacter(':');
   theUrl.ChangeAll(val1,val2);
   TCollection_AsciiString ch(theUrl);
-  return strdup(ch.ToCString());
+  return CORBA::string_dup(ch.ToCString());
 }
 
 //============================================================================
@@ -1122,7 +1121,7 @@ void SALOMEDS_StudyManager_i::CopyLabel(const SALOMEDS::Study_ptr theSourceStudy
     if (!Handle(SALOMEDS_IORAttribute)::DownCast(anAttr).IsNull()) { // IOR => ID and TMPFile of Engine
       TCollection_AsciiString anEntry;
       TDF_Tool::Entry(theSource, anEntry);
-      SALOMEDS::SObject_var aSO = theSourceStudy->FindObjectID(strdup(anEntry.ToCString()));
+      SALOMEDS::SObject_var aSO = theSourceStudy->FindObjectID(anEntry.ToCString());
 //        if (theEngine->CanCopy(aSO)) {
        CORBA::Long anObjID;
 //     TCollection_ExtendedString aResStr(strdup((char*)(theEngine->CopyFrom(aSO, anObjID))));
@@ -1176,14 +1175,15 @@ CORBA::Boolean SALOMEDS_StudyManager_i::Copy(SALOMEDS::SObject_ptr theObject) {
   // set component data type to the name attribute of root label
   if (!aStructureOnly) {
     TDataStd_Comment::Set(aTargetDocument->Main().Root(),
-                         TCollection_ExtendedString(strdup(Engine->ComponentDataType())));
+                         TCollection_ExtendedString(Engine->ComponentDataType()));
   }
   // set to the Root label integer attribute: study id
   TDataStd_Integer::Set(aTargetDocument->Main().Root(), aStudy->StudyId());
   // iterate all theObject's label children
   TDF_Label aStartLabel;
-  char* aStartID = strdup(theObject->GetID());
+  char* aStartID = CORBA::string_dup(theObject->GetID());
   TDF_Tool::Label(aDocument->GetData(), aStartID, aStartLabel);
+  delete(aStartID);
   Standard_Integer aSourceStartDepth = aStartLabel.Depth();
   
   // copy main source label
@@ -1230,7 +1230,7 @@ CORBA::Boolean SALOMEDS_StudyManager_i::CanPaste(SALOMEDS::SObject_ptr theObject
   CORBA::Object_var obj = _orb->string_to_object(IOREngine);
   SALOMEDS::Driver_var Engine = SALOMEDS::Driver::_narrow(obj) ;
   if (CORBA::is_nil(Engine)) return false;
-  return Engine->CanPaste(strdup(TCollection_AsciiString(aCompName->Get()).ToCString()), anObjID->Get());
+  return Engine->CanPaste(TCollection_AsciiString(aCompName->Get()).ToCString(), anObjID->Get());
 }
 //============================================================================
 /*! Function : PasteLabel
@@ -1265,7 +1265,7 @@ TDF_Label SALOMEDS_StudyManager_i::PasteLabel(const SALOMEDS::Study_ptr theDesti
     aAuxSourceLabel.FindAttribute(TDataStd_Integer::GetID(), anObjID);
     Handle(TDataStd_Comment) aComponentName;
     theSource.Root().FindAttribute(TDataStd_Comment::GetID(), aComponentName);
-    CORBA::String_var aCompName = strdup(TCollection_AsciiString(aComponentName->Get()).ToCString());
+    CORBA::String_var aCompName = CORBA::string_dup(TCollection_AsciiString(aComponentName->Get()).ToCString());
 
     if (theEngine->CanPaste(aCompName, anObjID->Get())) {
       SALOMEDS::TMPFile_var aTMPFil = new SALOMEDS::TMPFile();
@@ -1281,7 +1281,7 @@ TDF_Label SALOMEDS_StudyManager_i::PasteLabel(const SALOMEDS::Study_ptr theDesti
       
       TCollection_AsciiString anEntry;
       TDF_Tool::Entry(aTargetLabel, anEntry);
-      SALOMEDS::SObject_var aPastedSO = theDestinationStudy->FindObjectID(strdup(anEntry.ToCString()));
+      SALOMEDS::SObject_var aPastedSO = theDestinationStudy->FindObjectID(anEntry.ToCString());
       if (isFirstElement) {
        SALOMEDS::SObject_var aDestSO =
          theEngine->PasteInto(aTMPFil.in(),
@@ -1325,7 +1325,7 @@ TDF_Label SALOMEDS_StudyManager_i::PasteLabel(const SALOMEDS::Study_ptr theDesti
       if (aNameStart) TDataStd_Name::Set(aTargetLabel, aNameStart);
       else TDataStd_Name::Set(aTargetLabel, TCollection_ExtendedString("Reference to:")+anEntry);
     }
-    delete(anEntry);
+    delete [] anEntry;
   }
 
   return aTargetLabel;
index 737f1f752fde4b23930e765f300b65ef56a371a0..d3a3ab2e51b180b1bc80ae8bf23cb43b99a47a9a 100644 (file)
@@ -18,7 +18,7 @@ using namespace std;
 
 const Standard_GUID& SALOMEDS_TableOfStringAttribute::GetID() 
 {
-  static Standard_GUID SALOMEDS_TableOfStringAttributeID ("128371A2-8F52-11d6-A8A3-0001021E8C7F");
+  static Standard_GUID SALOMEDS_TableOfStringAttributeID ("128371A4-8F52-11d6-A8A3-0001021E8C7F");
   return SALOMEDS_TableOfStringAttributeID;
 }
 
@@ -332,8 +332,9 @@ void SALOMEDS_TableOfStringAttribute::ConvertToString(ostrstream& theStream)
     if (anIterator.Value().Length()) { // check empty string in the value table
       theStream << anIterator.Key() << "\n";
       unsigned long aValueSize = anIterator.Value().Length();
-      theStream.write((char*)&aValueSize, sizeof(unsigned long));
+      theStream<<aValueSize << "\n";
       theStream.write((TCollection_AsciiString(anIterator.Value()).ToCString()),aValueSize);
+      theStream<<"\n";
     } else { // write index only of kind: "0key"; "05", for an example
       theStream << "0" << anIterator.Key() << "\n";
     }
@@ -409,8 +410,10 @@ bool SALOMEDS_TableOfStringAttribute::RestoreFromString(istrstream& theStream)
       aValue = "";
     else {
       unsigned long aValueSize;
-      theStream.read((char*)&aValueSize, sizeof(unsigned long));
+      theStream >> aValueSize;
+      theStream.read(aValueString, 1); // an '\n' omitting
       theStream.read(aValueString, aValueSize);
+      theStream.read(aValueString, 1); // an '\n' omitting
       aValue = aValueString;
     }
     myTable.Bind(aKey, aValue);
index 004fd69730542957f50a03b369bd426c61d10777..9e623b8b1b16466ee78d511787fab97e4276e046 100644 (file)
@@ -77,6 +77,8 @@ void SALOMEDS_TargetAttribute::Append(TDF_Label& theReferencedObject) {
   Backup();
   Handle(TDF_Reference) aReference;
   if (theReferencedObject.FindAttribute(TDF_Reference::GetID(),aReference)) {
+    TDF_ListIteratorOfAttributeList anIter(GetVariables());
+    for(;anIter.More();anIter.Next()) if(anIter.Value()->Label() == theReferencedObject) return; //BugID: PAL6192    
     GetVariables().Append(aReference);
   } else {
     MESSAGE("SALOMEDS_TargetAttribute::Append: can't append referenced object");
index 698fbb1c6cb3de72b48c8a807e7584c4b2effac8..ba6d6397e5a3609b9dfc7f129a0b190cce8f47c3 100644 (file)
@@ -272,7 +272,7 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetName(const char* theName) {
   if(_root.IsNull()) return 0;
 
   Handle(TDataStd_Name) aNameAttrib;
-  TCollection_ExtendedString aName(strdup(theName));
+  TCollection_ExtendedString aName((char*)theName);
 
   if (!_root->FindAttribute(TDataStd_Name::GetID(), aNameAttrib))
     aNameAttrib = TDataStd_Name::Set(_root->Label(), aName);
@@ -315,7 +315,7 @@ char* SALOMEDS_UseCaseBuilder_i::GetName() {
 
   Handle(TDataStd_Name) aName;
   if (!_root->FindAttribute(TDataStd_Name::GetID(), aName)) return aString._retn();
-  aString = strdup(TCollection_AsciiString(aName->Get()).ToCString());
+  aString = CORBA::string_dup(TCollection_AsciiString(aName->Get()).ToCString());
   return aString._retn();
 }
 
@@ -368,7 +368,7 @@ SALOMEDS::SObject_ptr SALOMEDS_UseCaseBuilder_i::AddUseCase(const char* theName)
   TDF_Label aChild = aLabel.FindChild(anInteger->Get());
   aNode = TDataStd_TreeNode::Set(aChild, aBasicGUID);
   aFatherNode->Append(aNode);
-  TDataStd_Name::Set(aChild, TCollection_ExtendedString(strdup(theName)));
+  TDataStd_Name::Set(aChild, TCollection_ExtendedString((char*)theName));
 
   SALOMEDS_SObject_i *  so_servant = new SALOMEDS_SObject_i (aChild, _orb);
   SALOMEDS::SObject_var so = SALOMEDS::SObject::_narrow(so_servant->_this()); 
index f0e5f90f9e2d47a8f3ff99e633bea10e913391c6..73e232ffc22590f58d3dc508aa1e027b53b4c850 100644 (file)
@@ -20,17 +20,17 @@ msgstr ""
 #---------------
 
 msgid "INF_VERSION"
-msgstr "Version 2.0.0"
+msgstr "Version 2.1.0"
 
 msgid "INF_COPYRIGHT"
-msgstr "  "
+msgstr "Copyright : CEA"
 
 msgid "INF_LICENSE"
 msgstr "  "
 
 #: SALOMEGUI_AboutDlg.cxx:42
 msgid "ABOUT_TLT"
-msgstr "About SALOME"
+msgstr "About PAL/SALOME"
 
 #: QAD_Config.cxx:84
 msgid "MEN_APPNAME"
@@ -38,8 +38,8 @@ msgstr "salome"
 
 #: QAD_Application.cxx:133
 msgid "QAD_Application::APP_DEFAULTTITLE"
-msgstr "SALOME 2.0.0"
+msgstr "PAL/SALOME 2.1.0"
 
 #: QAD_Desktop.cxx:424
 msgid "QAD_Desktop::DESK_DEFAULTTITLE"
-msgstr "SALOME 2.0.0"
+msgstr "PAL/SALOME 2.1.0"
index 3f7bc1c78d4775a90da78d5b4d36666a34a8059a..f3d426d18d24633015ac993cd35a94f151986899 100644 (file)
@@ -91,6 +91,7 @@ EXPORT_HEADERS = \
                  SALOME_NumberFilter.hxx \
                  Handle_SALOME_NumberFilter.hxx \
                  SALOME_DataMapOfIOMapOfInteger.hxx \
+      SALOME_DataMapIteratorOfDataMapOfIOMapOfInteger.hxx \
                  Handle_SALOME_DataMapNodeOfDataMapOfIOMapOfInteger.hxx \
                  SALOMEGUI.h \
                  SALOMEGUI_LoadStudiesDlg.h \
@@ -220,7 +221,7 @@ LIB_CLIENT_IDL = SALOMEDS.idl \
                 SALOME_Exception.idl
 
 CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES)
-LDFLAGS+=$(QT_MT_LIBS) -lSalomeNS -lqsplitterP -lSalomeLifeCycleCORBA -lOpUtil -lSalomeObject -lEvent
+LDFLAGS+=$(QT_MT_LIBS) -lSalomeNS -lqsplitterP -lSalomeLifeCycleCORBA -lOpUtil -lSalomeObject -lEvent -lSalomePrs
 
 LIBS+= $(PYTHON_LIBS)
 
index dd136e506e506c7f77acc3b2bde9e7bff6ae02af..440c302f3f0d50f629993d4879877a93e5aa4d91 100644 (file)
@@ -22,7 +22,6 @@ using namespace std;
  */
 PyInterp_PyQt::PyInterp_PyQt(): PyInterp_base()
 {
-  initialize();
 }
 
 PyInterp_PyQt::~PyInterp_PyQt()
index e16f1e04193f606bc65a82af07ca3e10c481ce29..08990e6e5559658968c07892cc0ceea050e9097c 100644 (file)
@@ -9,6 +9,7 @@
 //  Module : SALOME
 //  $Header$
 
+
 #include <string>
 #include <vector>
 
index 3f222202750327d04d1bd58c325ff9194d766e77..ac1763f4d810eb166a47bf99a18001743cc8be21 100644 (file)
@@ -72,6 +72,7 @@
 
 #include "SALOMEGUI_CloseDlg.h"
 #include "SALOMEGUI_ActivateComponentDlg.h"
+#include "SALOMEGUI_QtCatchCorbaException.hxx"
 
 #include "SALOME_Event.hxx"
 
@@ -201,7 +202,8 @@ myActiveStudy(0),
 myCntUntitled(0),
 //NRImyHelpWindow(0),
 myDefaultTitle( tr("DESK_DEFAULTTITLE") ),
-myQueryClose( true )
+myQueryClose( true ),
+myAboutToClose( false )
 {
   /* Force reading of user config file */
   QAD_CONFIG->readConfigFile();  
@@ -287,9 +289,9 @@ myQueryClose( true )
     QString resDir;
 
     /* find component icon */
-    QString iconfile = strdup(list_composants[ind].moduleicone) ;
-    QString modulename = strdup(list_composants[ind].modulename) ;
-    QString moduleusername = strdup(list_composants[ind].moduleusername) ;
+    QString iconfile = CORBA::string_dup(list_composants[ind].moduleicone) ;
+    QString modulename = CORBA::string_dup(list_composants[ind].modulename) ;
+    QString moduleusername = CORBA::string_dup(list_composants[ind].moduleusername) ;
 
     //    MESSAGE ( " MODULE = " << modulename )
     //    MESSAGE ( " MODULE icon = " << iconfile )
@@ -388,7 +390,9 @@ const int IdSelectAll = 1004;
 */
 bool QAD_Desktop::eventFilter( QObject* o, QEvent* e )
 {
-  if (e->type() == 2000   ) {
+  if (e->type() == QEvent::Close && o == this )
+    myAboutToClose = true;
+  else if (e->type() == 2000   ) {
     QMessageBox::information (this, tr ( "Help Information" ), tr ( "Can't run choosen browser.\nRunning default browser (Mozilla). "));
     return TRUE;
   }
@@ -396,9 +400,9 @@ bool QAD_Desktop::eventFilter( QObject* o, QEvent* e )
     QMessageBox::critical(this, tr ( "Help Error" ), tr ( "Can't run the default browser.") );
     return TRUE;
   }
-    else if ( e->type() == QEvent::ContextMenu ) {
-      QContextMenuEvent* ce = (QContextMenuEvent*)e;
-      if ( o->inherits("QRenameEdit") ) {
+  else if ( e->type() == QEvent::ContextMenu ) {
+    QContextMenuEvent* ce = (QContextMenuEvent*)e;
+    if ( o->inherits("QRenameEdit") ) {
       return TRUE;
     }
     else if ( o->inherits("QLineEdit") ) {
@@ -453,11 +457,8 @@ bool QAD_Desktop::eventFilter( QObject* o, QEvent* e )
   }
   else if ( e->type() == SALOME_EVENT ) { 
     SALOME_Event* aSE = (SALOME_Event*)((QCustomEvent*)e)->data();
-    processEvent( aSE );
-    // Signal the calling thread that the event has been processed
-    aSE->processed();
+    processEvent(aSE);
     ((QCustomEvent*)e)->setData( 0 );
-    delete aSE;
     return TRUE;
   }
   return QMainWindow::eventFilter( o, e );
@@ -468,9 +469,11 @@ bool QAD_Desktop::eventFilter( QObject* o, QEvent* e )
 */
 void QAD_Desktop::processEvent( SALOME_Event* theEvent )
 {
-  if ( !theEvent )
-    return;
-  theEvent->Execute();
+  if(theEvent){
+    theEvent->Execute();
+    // Signal the calling thread that the event has been processed
+    theEvent->processed();
+  }
 }
 
 /*!
@@ -990,13 +993,13 @@ void QAD_Desktop::createActions()
       myCatalogue->GetComponentIconeList();
       
     for (unsigned int ind = 0; ind < list_composants->length(); ind++) {
-      QString aModuleName = strdup(list_composants[ind].modulename) ;
+      QString aModuleName = CORBA::string_dup(list_composants[ind].modulename) ;
       QString dir;
       if (dir = getenv( aModuleName + "_ROOT_DIR")) {
        dir = QAD_Tools::addSlash( QAD_Tools::addSlash(dir) + "doc/salome/" );
        QString aFileName = aModuleName + "_index.html"; 
        if ( QFileInfo( dir + aFileName ).exists() ) {
-         QString aModuleUserName = strdup(list_composants[ind].moduleusername) ;
+         QString aModuleUserName = CORBA::string_dup(list_composants[ind].moduleusername) ;
          if ( aModuleUserName == "Salome" )  aModuleUserName = "Kernel" ;
          QActionP* moduleHelpAction = new QActionP( "", aModuleUserName + " Help" , 0, this, aModuleName);
          QAD_ASSERT(connect( moduleHelpAction, SIGNAL(activated()), this, SLOT(onHelpContentsModule() )));
@@ -1412,36 +1415,44 @@ void QAD_Desktop::closeEvent ( QCloseEvent* e )
                                      QAD_NO, QAD_NO ) == QAD_YES;
   }
 
-  if ( doClose ) { 
-    for ( QAD_Application* app = myApps.first(); app; app = myApps.next() ) { 
-      QList<QAD_Study>& studies = app->getStudies();
-      for(QAD_Study* study = studies.first(); study != 0; study = studies.next()) {
-       if(myQueryClose && study->getStudyDocument()->IsModified()) {
-         SALOMEGUI_CloseDlg aDlg( this );
-         switch ( aDlg.exec() ) {
-         case 1:
-           if ( !onSaveStudy( study ) ) {
-             putInfo( tr("INF_CANCELLED") );
-             e->ignore();
-             return;
-           }
-           break;
-         case 2:
-         case 3:
-           break;
-         case 0:
-         default: 
-           e->ignore();
+  for ( QAD_Application* app = myApps.first(); doClose && app; app = myApps.next() ) { 
+    QList<QAD_Study>& studies = app->getStudies();
+    for(QAD_Study* study = studies.first(); doClose && study != 0; study = studies.next()) {
+      if(myQueryClose && study->getStudyDocument()->IsModified()) {
+       SALOMEGUI_CloseDlg aDlg( this );
+       switch ( aDlg.exec() ) {
+       case 1:
+         if ( !onSaveStudy( study ) ) {
            putInfo( tr("INF_CANCELLED") );
-           return;
+           doClose = false;
          }
+         break;
+       case 2:
+       case 3:
+         break;
+       case 0:
+       default: 
+         doClose = false;
+         putInfo( tr("INF_CANCELLED") );
        }
-       study->close();
       }
+      if ( doClose )
+       study->close();
     }
   }
+
   myQueryClose = true;
-  doClose ? e->accept() : e->ignore();
+
+  if ( !doClose ) {
+    myAboutToClose = false;
+    // onActiveStudyChanged() is normally caused by QWorkspace::eventFilter(), 
+    // but this call was blocked by myAboutToClose == true, so now we should do it manually
+    onActiveStudyChanged(); 
+
+    e->ignore();
+  }
+  else
+    e->accept();
 }
 
 /*!
@@ -1716,12 +1727,7 @@ void QAD_Desktop::onOpenStudy()
                                      tr("ERR_ERROR"),
                                      tr("ERR_DOC_CANTOPEN") + "\n" + name,
                                      tr("BUT_OK") );
-           } else if (myActiveComp != "") {
-             QApplication::setOverrideCursor( Qt::waitCursor );
-             loadComponentData(mapComponentName[myActiveComp]);
-             openStudy->updateObjBrowser(true);
-             QApplication::restoreOverrideCursor();
-           }
+           } 
            break;
        }
     }
@@ -1738,6 +1744,13 @@ void QAD_Desktop::onOpenStudy()
 
 bool QAD_Desktop::loadComponentData( const QString& compName )
 {
+  QAD_WaitCursor wc;
+
+  if ( compName.isEmpty() ) {
+    MESSAGE("loadComponentData(): empty component name passed!")
+    return false;
+  }
+
   // Open component's data in active study if any
   MESSAGE("loadComponentData(): Opening " << compName << " component data ")
   if (!myActiveStudy) {
@@ -1758,33 +1771,36 @@ bool QAD_Desktop::loadComponentData( const QString& compName )
       comp = getEngine( "FactoryServerPy", compName);
   }
 
+  if ( CORBA::is_nil( comp ) ) {
+    MESSAGE("loadComponentData(): Engine is null");
+    return false;
+  }  
+
   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
   SALOMEDS::SComponent_var SCO = SALOMEDS::SComponent::_narrow(aStudy->FindObject( getComponentUserName(compName) ));
           
   if (!SCO->_is_nil()) {
-    if (!CORBA::is_nil(comp)) {
-      SALOMEDS::Driver_var   driver = SALOMEDS::Driver::_narrow(comp);
-      if (!CORBA::is_nil(driver)) {
-       SALOMEDS::StudyBuilder_var  B = aStudy->NewBuilder();
-       if (!CORBA::is_nil(B)) {
-//       QAD_Operation* op = new QAD_Operation( myActiveStudy );
-//       op->start();
+    SALOMEDS::Driver_var   driver = SALOMEDS::Driver::_narrow(comp);
+    if (!CORBA::is_nil(driver)) {
+      SALOMEDS::StudyBuilder_var  B = aStudy->NewBuilder();
+      if (!CORBA::is_nil(B)) {
+       try {
          B->LoadWith(SCO,driver);
-//       op->finish();
-       } else {
+       }
+       catch( const SALOME::SALOME_Exception& ) {
+         // Oops, something went wrong while loading -> return an error
          return false;
        }
-      } else {
-       MESSAGE("loadComponentData(): Driver is null");
-       return false;
-      }
+      } 
     } else {
-      MESSAGE("loadComponentData(): Engine is null");
+      MESSAGE("loadComponentData(): Driver is null");
+      // Incorrect! All components should inherit SALOMEDS::Driver
       return false;
     }
   } else {
     MESSAGE("loadComponentData(): SComponent is null");
-    return false;
+    // Don't return false here, for there might be no data 
+    // for a given component in the study yet
   }
 
   return true;
@@ -2551,7 +2567,9 @@ void QAD_Desktop::onOpenWith()
     if (SCO->FindAttribute(anAttr, "AttributeName")) {
       aName = SALOMEDS::AttributeName::_narrow(anAttr);
       name = aName->Value();
-      SALOME_ModuleCatalog::Acomponent_var Comp = myCatalogue->GetComponent( mapComponentName[name] );
+      if ( getComponentName( name ).isEmpty() )
+       return;
+      SALOME_ModuleCatalog::Acomponent_var Comp = myCatalogue->GetComponent( getComponentName(name) );
       if ( !Comp->_is_nil() ) {
        
        SALOME_ModuleCatalog::ListOfComponents_var list_type_composants =
@@ -2562,7 +2580,7 @@ void QAD_Desktop::onOpenWith()
        } else if ( list_type_composants->length() > 1 ) {
          SALOMEGUI_OpenWith* aDlg = new SALOMEGUI_OpenWith( this );
          for (unsigned int ind = 0; ind < list_type_composants->length();ind++) {
-           QString compusername = getComponentUserName( strdup(list_type_composants[ind]) );
+           QString compusername = getComponentUserName( (char*)list_type_composants[ind] );
            if ( !compusername.isEmpty() )
              aDlg->addComponent( compusername );
          }
@@ -2622,6 +2640,11 @@ void QAD_Desktop::setSettings()
 */
 bool QAD_Desktop::loadComponent(QString Component)
 {
+  if ( Component.isEmpty() ) {
+    MESSAGE("loadComponent(): empty component name passed!")
+    return false;
+  }
+
   QAD_WaitCursor wc;
   QString resDir("/");  //NRI : Pb under Windows
 
@@ -2694,16 +2717,6 @@ bool QAD_Desktop::loadComponent(QString Component)
   if (myActiveMenus)
     nbToolbars = myActiveMenus->getToolBarList().count();
 
-  // san - avoid loading component GUI library multiple times
-  QString aUserName( getComponentUserName( Component ) );
-  
-  SALOMEGUI* anActiveGUI = getComponentGUI(aUserName);
-  if ( !anActiveGUI )
-    return false;
-
-  /* SETTINGS */
-  anActiveGUI->SetSettings( this, (char*)Component.latin1() );
-
   /* COMPONENT INTERFACE */
   SALOME_ModuleCatalog::Acomponent_ptr aComponent =
     myCatalogue->GetComponent(Component.latin1());
@@ -3012,6 +3025,23 @@ void QAD_Desktop::onComboActiveComponent( const QString & component, bool isLoad
       //NRI if (component.compare(QString("Salome"))!= 0) {
       if (component.compare( getComponentUserName( "KERNEL" ) )!= 0) {
 //     QApplication::setOverrideCursor( Qt::waitCursor );
+       bool isOk = ( !isLoadData || loadComponentData( getComponentName(component) ) );
+       if ( !isOk ) {
+         QAD_MessageBox::error1( this, 
+                                tr("ERR_ERROR"),
+                                tr("ERR_COMP_DATA_NOT_LOADED").arg( component ), 
+                                tr("BUT_OK") );          
+       }
+
+       if ( !isOk || !loadComponent( getComponentName(component) ) ) {
+         myCombo->setCurrentItem (0);
+         for ( QToolButton* aButton=myComponentButton.first(); aButton; aButton=myComponentButton.next() ) {
+           aButton->setOn(false);
+         }
+         myActiveComp = "";
+         return;
+       }
+
        myActiveComp = component;
 
        SALOME_Selection* oldSel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
@@ -3024,13 +3054,6 @@ void QAD_Desktop::onComboActiveComponent( const QString & component, bool isLoad
        }
 
        myActiveStudy->Selection( component );
-       if ( !loadComponent(mapComponentName[component]) ) {
-         myCombo->setCurrentItem (0);
-         for ( QToolButton* aButton=myComponentButton.first(); aButton; aButton=myComponentButton.next() ) {
-           aButton->setOn(false);
-         }
-         myActiveComp = "";
-       }
 
        SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
        SALOME_ListIteratorOfListIO It( oldSel->StoredIObjects() );
@@ -3044,10 +3067,13 @@ void QAD_Desktop::onComboActiveComponent( const QString & component, bool isLoad
          
        }
 
-       // Open new component's data in active study if any
-       if(isLoadData) loadComponentData(mapComponentName[component]);
-
        oldSel->Clear();
+
+       /* SETTINGS */
+       // IMPORTANT: SetSettings() should be called AFTER SALOME_Selection
+       // has been created for a newly activated component
+       getComponentGUI(component)->SetSettings( this, (char*)getComponentName(component).latin1() );
+
        myActiveStudy->updateObjBrowser(true);
 
 //     QApplication::restoreOverrideCursor();
@@ -3132,7 +3158,8 @@ void QAD_Desktop::onButtonActiveComponent( )
  */
 void QAD_Desktop::clearMenus()
 {
-  onActiveStudyChanged();
+  // san - commented as presumably obsolete
+  //  onActiveStudyChanged();
 
   /* menus */
   myMenusList.clear();
@@ -3223,6 +3250,8 @@ typedef SALOMEGUI* (*ComponentGUI)();
 SALOMEGUI* QAD_Desktop::getComponentGUI( const QString& component )
 {
   SALOMEGUI* aCompGUI = 0;
+  if ( component.isEmpty() || getComponentName( component ).isEmpty() )
+    return aCompGUI;
   
   // Load component GUI if requested for the first time
   if ( myComponents.find( component ) == myComponents.end() ) {
@@ -3328,6 +3357,22 @@ SALOMEGUI* QAD_Desktop::getComponentGUI( const QString& component )
 }
 
 
+/*!
+    Returns name of active component
+*/
+QString QAD_Desktop::getComponentDataType() const
+{
+  using namespace SALOMEDS;
+  Study_var aStudy = getActiveStudy()->getStudyDocument();
+  SObject_var aSObject = aStudy->FindObject(myActiveComp.latin1());
+  SComponent_var aComponent = SComponent::_narrow(aSObject);
+  if(!aComponent->_is_nil()){
+    CORBA::String_var aString = aComponent->ComponentDataType();
+    return aString.in();
+  }
+  return "";
+}
+
 void QAD_Desktop::definePopup(QString & theContext,
                              QString & theParent, 
                              QString & theObject ) 
@@ -3417,6 +3462,34 @@ void QAD_Desktop::createPopup(QPopupMenu* popup, const QString & theContext,
 
 void QAD_Desktop::onActiveStudyChanged()
 {
+  // Avoid recursive calls caused by QAD_MessageBox
+  static bool isRecursion = false;
+  if ( isRecursion || myAboutToClose )
+    return;
+
+  if (myActiveComp != "") {
+    // Try to load active component's data in the activated study
+    if ( !loadComponentData(mapComponentName[myActiveComp]) ) {
+      isRecursion = true;
+      QAD_MessageBox::error1( this, 
+                            tr("ERR_ERROR"),
+                            tr("ERR_COMP_DATA_NOT_LOADED").arg( myActiveComp ), 
+                            tr("BUT_OK") );
+      // Error while loading component's data -> deactivate it
+      deactivateComponent();
+      if (!myXmlHandler->myIdList.IsEmpty()) clearMenus();
+      myCombo->setCurrentItem (0);
+      for ( QToolButton* aButton=myComponentButton.first(); aButton; aButton=myComponentButton.next() ) {
+       aButton->setOn(false);
+      }
+      myActiveComp = "";
+      isRecursion = false;
+      return;
+    }
+    else
+      myActiveStudy->updateObjBrowser(true);
+  }
+
   SALOMEGUI* anActiveGUI = getActiveGUI();
   if ( anActiveGUI ) 
     anActiveGUI->ActiveStudyChanged(this);
index 96d3b90897a30f1b03af13197b107ffd4d965c23..83bc083c972ceb6c8f30bb1c09f3831fae75a4d8 100644 (file)
@@ -151,6 +151,7 @@ public:
     virtual void      helpContext(const QString& path, const QString& dir = QString::null);
 */
     bool             loadComponent(QString);
+    bool              loadComponentData( const QString& );
     QString           changeXmlInputSourceData(QString theData, QString theComponent);
     void             activateComponent(const QString& theName, bool isLoadData = true);
     void              deactivateComponent();
@@ -165,6 +166,7 @@ public:
     const QString&       getActiveComponent() const;
     SALOMEGUI*            getActiveGUI();
     SALOMEGUI*            getComponentGUI( const QString& );  // accepts component`s user name
+    QString               getComponentDataType() const;
     SALOME_NamingService* getNameService()      {return myNameService;}
 
     Engines::Component_var getEngine(const char *containerName,
@@ -194,8 +196,6 @@ protected:
     virtual   void    updateCaption( UpdateCommand );
     virtual   void    updateMenu( UpdateCommand );
 
-    bool              loadComponentData( const QString& );
-
 protected slots:
     virtual void      onNewStudy();
     virtual void      onNewStudy(QAD_Application* app);
@@ -342,6 +342,7 @@ private:
     SALOME_LifeCycleCORBA *                myEnginesLifeCycle;
     QComboBox *                                    myCombo;
     bool                                    myQueryClose;
+    bool                                    myAboutToClose;
     bool                                    _islibso;
 
     ComponentMap                            myComponents;
index 76860b89d524c49033bfbc62af43255261f9e931..d3e1bb230fa65348134eb27106e74e339f094d0a 100644 (file)
@@ -31,15 +31,15 @@ QString QAD_FileDlg::myLastVisitedPath;
 Constructor
 */
 QAD_FileDlg::QAD_FileDlg( QWidget* parent, bool open, bool showQuickDir, bool modal ) :
-QFileDialog( parent, 0, modal ),
+QFileDialogP( parent, 0, modal ),
 myValidator( 0 ),
 myQuickCombo( 0 ),
 myOpen( open )
 {    
   if ( parent->icon() )
-    setIcon( *parent->icon() );       
+    setIcon( *parent->icon() );
   setSizeGripEnabled( true );
-  
+
   if (showQuickDir) {
     // inserting quick dir combo box
     QLabel* lab  = new QLabel(tr("Quick path:"), this);
@@ -176,7 +176,7 @@ void QAD_FileDlg::accept()
 {
 //  mySelectedFile = QFileDialog::selectedFile().simplifyWhiteSpace(); //VSR- 06/12/02
   if ( mode() != ExistingFiles ) {
-    mySelectedFile = QFileDialog::selectedFile(); //VSR+ 06/12/02
+    mySelectedFile = QFileDialogP::selectedFile(); //VSR+ 06/12/02
     addExtension();
   }
 //  mySelectedFile = mySelectedFile.simplifyWhiteSpace(); //VSR- 06/12/02
@@ -187,7 +187,7 @@ void QAD_FileDlg::accept()
   */
   if ( acceptData() ) {
     myLastVisitedPath = dirPath();
-    QFileDialog::accept();        
+    QFileDialogP::accept();        
   }
 }
 
@@ -197,7 +197,7 @@ Closes this dialog and sets the return code to 'Rejected'
 void QAD_FileDlg::reject()
 {
   mySelectedFile = QString::null;
-  QFileDialog::reject();        
+  QFileDialogP::reject();        
 }
 
 /*!
@@ -342,7 +342,9 @@ QString QAD_FileDlg::getFileName( QWidget*           parent,
   if ( !initial.isEmpty() ) { 
     fd->processPath( initial ); // VSR 24/03/03 check for existing of directory has been added to avoid QFileDialog's bug
   }
-  fd->setFilters( filters );        
+
+  fd->setFilters( filters );
+
   if ( validator )
     fd->setValidator( validator );
   fd->exec();
@@ -396,11 +398,11 @@ QString QAD_FileDlg::getExistingDirectory ( QWidget*       parent,
   }
   fd->setMode( DirectoryOnly );
   fd->setFilters(tr("DIRECTORIES_FILTER"));
+
   fd->exec();
   QString dirname = fd->selectedFile();
   delete fd;
   qApp->processEvents();
   return dirname;
-  
 }
 
index e6964280fdb69b7b651ef3bf6d0e8bb208b4b5fd..a604596a592a666b927d4bcc097619513db44c03 100644 (file)
 #ifndef QAD_FILEDIALOG_H
 #define QAD_FILEDIALOG_H
 
-#include <qfiledialog.h>
 #include <qcombobox.h>
+
+#include <qfiledialogP.h>
 #include "QAD.h"
 #include "QAD_FileValidator.h"
 
-class QAD_EXPORT QAD_FileDlg : public QFileDialog
+class QAD_EXPORT QAD_FileDlg : public QFileDialogP
 {
     Q_OBJECT
 
 public:
     QAD_FileDlg( QWidget* parent, bool open, bool showQuickDir = true, bool modal = true );
-    ~QAD_FileDlg();
+    virtual ~QAD_FileDlg();
 
 public:    
     bool               isOpenDlg()    const;    
@@ -48,8 +49,11 @@ public:
                                              const QString& initial,
                                              const QString& caption, 
                                              bool           showQuickDir = true);
+
+protected:
+  virtual bool         acceptData();
+                            
 private:
-    bool               acceptData();
     void               addExtension();
     bool               processPath( const QString& path );
 
@@ -64,7 +68,6 @@ protected:
     QAD_FileValidator* myValidator;        /* file validator      */
     static QString     myLastVisitedPath;  /* last visited path   */
     QComboBox*         myQuickCombo;       /* quick dir combo box */
-
 };
 
 #endif
index f12915a41fe7090d1be3e887ab42698141bae907..0a4c7742648027e2871ef841bed4517c61133427 100644 (file)
@@ -9,15 +9,18 @@
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include "QAD_FileValidator.h"
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 #include "QAD_MessageBox.h"
 
+#include "utilities.h"
+
 #include <qfile.h>
 #include <qfileinfo.h>
 
+using namespace std;
+
 /* constructor */
 QAD_FileValidator::QAD_FileValidator(QWidget* parent) :
 myParent(parent) 
index d555fd378d308a0faed878c0e36b14e15b0042b3..b48d624186ed60ac2bc47c192c712aaecae4f45b 100644 (file)
@@ -9,7 +9,6 @@
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include "QAD_ListView.h"
 
 #include <qheader.h>
@@ -19,13 +18,13 @@ using namespace std;
 
 #include "QAD_Desktop.h"
 
-//#include <QAD_Application.h>
-//#include <QAD_Document.h>
-
-
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
 #include <TColStd_ListIteratorOfListOfReal.hxx>
 
+#include "utilities.h"
+
+using namespace std;
+
 //////////////////////////////////////////////////////////////////////
 // QAD_ListView class implementation
 //////////////////////////////////////////////////////////////////////
index 4516e99345fc19fbfa048b397596e0156f3154df..91cc38a5985680873e67a74f818ed4a372e0331b 100644 (file)
@@ -55,6 +55,8 @@
 #include <qtooltip.h>
 #include <qdragobject.h>
 #include <qstringlist.h>
+#include <qmap.h>
+
 using namespace std;
 
 //VRV: porting on Qt 3.0.5
@@ -456,6 +458,35 @@ bool QAD_ObjectBrowser::eventFilter( QObject* o, QEvent* e )
 }
 
 
+/*!
+  Returns true if item is collapsed has collapsed children
+*/
+static bool hasCollapsed( QListViewItem* item )
+{
+  if ( !item )
+    return false;
+
+  bool res = ( item->childCount() && !item->isOpen() );
+  for ( QListViewItem* child = item->firstChild(); !res && child; child = child->nextSibling() )
+    res = hasCollapsed( child );
+
+  return res;
+}
+
+/*!
+  Expands item and all its children
+*/
+static void expand(QListViewItem* item)
+{
+  if ( !item )
+    return;
+
+  item->setOpen( true );
+
+  for ( QListViewItem* child = item->firstChild(); child; child = child->nextSibling() )
+    expand( child );
+}
+
 /*!
   Builds popup menu
 */
@@ -486,6 +517,18 @@ void QAD_ObjectBrowser::onCreatePopup()
                             this,
                             SLOT( onEditAttribute() ) );
       }
+
+      bool canExpand = false;
+      for ( QListViewItemIterator it( getListView() ); it.current() && !canExpand; ++it )
+       canExpand = canExpand || ( it.current()->isSelected() && hasCollapsed( it.current() ) );
+
+      if ( canExpand ) {
+       if ( myPopup->count() > 0 )
+         myPopup->insertSeparator();
+       myPopup->insertItem( tr( "EXPAND_ALL_CMD" ),
+                            this,
+                            SLOT( onExpandAll() ) );
+      }
     }
   } else {
     // NRI 02/12/2002
@@ -534,6 +577,16 @@ void QAD_ObjectBrowser::onCreatePopup()
   }
 }
 
+/*!
+  Called on "Expand all" popup menu command
+*/
+void QAD_ObjectBrowser::onExpandAll()
+{
+  for ( QListViewItemIterator it( getListView() ); it.current(); ++it )
+    if ( it.current()->isSelected() )
+      expand( it.current() );  
+}
+
 /*!
   Returns Object Browser list view
 */
@@ -627,7 +680,7 @@ void QAD_ObjectBrowser::Update( SALOMEDS::SObject_ptr SO,
     SALOMEDS::SObject_var             CSO = it->Value();
     SALOMEDS::SObject_var             RefSO;
     QString                           ior = "";
-    QString                           CSOEntry = strdup( CSO->GetID() );
+    QString                           CSOEntry = CORBA::string_dup( CSO->GetID() );
     SALOMEDS::GenericAttribute_var    anAttr;
     SALOMEDS::AttributeName_var       aName;
     SALOMEDS::AttributeComment_var    aCmnt;
@@ -647,17 +700,17 @@ void QAD_ObjectBrowser::Update( SALOMEDS::SObject_ptr SO,
    
     if ( CSO->ReferencedObject(RefSO) && !RefSO->_is_nil() ) {
       
-      QString RefSOEntry = strdup( RefSO->GetID() );
+      QString RefSOEntry = CORBA::string_dup( RefSO->GetID() );
       if (CSO->FindAttribute(anAttr, "AttributeName") || RefSO->FindAttribute(anAttr, "AttributeName")) {
         aName = SALOMEDS::AttributeName::_narrow(anAttr);
         if (RefSO->FindAttribute(anAttr, "AttributeIOR")) {
           anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-          ior = strdup( anIOR->Value() );
+          ior = CORBA::string_dup( anIOR->Value() );
         }
        valueString = getValueFromObject( RefSO );
-//      AddItem (Item, QString(" * ") + strdup( aName->Value() ), RefSOEntry, ior, 2, CSOEntry);
+//      AddItem (Item, QString(" * ") + CORBA::string_dup( aName->Value() ), RefSOEntry, ior, 2, CSOEntry);
        Item = AddItem(theParentItem, 
-                      QString(" * ") + strdup( aName->Value() ), 
+                      QString(" * ") + CORBA::string_dup( aName->Value() ), 
                       RefSOEntry, 
                       ior, 
                       2, 
@@ -674,12 +727,12 @@ void QAD_ObjectBrowser::Update( SALOMEDS::SObject_ptr SO,
       // getting IOR
       if (CSO->FindAttribute(anAttr, "AttributeIOR"))  {
         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-        ior = strdup( anIOR->Value() );
+        ior = CORBA::string_dup( anIOR->Value() );
       }
       // getting Name and adding new Item
       if (CSO->FindAttribute(anAttr, "AttributeName") ) {
         aName = SALOMEDS::AttributeName::_narrow(anAttr);
-        Item = AddItem(theParentItem, strdup( aName->Value() ), CSOEntry, ior, 0, "", valueString);
+        Item = AddItem(theParentItem, CORBA::string_dup( aName->Value() ), CSOEntry, ior, 0, "", valueString);
        myListViewMap[ CSOEntry ].append( Item );
       } 
       else {
@@ -773,9 +826,9 @@ void QAD_ObjectBrowser::Update()
   for (; itcomp->More(); itcomp->Next()) {
     QAD_ObjectBrowserItem*   Item     = 0;
     SALOMEDS::SComponent_var SC       = itcomp->Value();
-    QString                  dataType = strdup( SC->ComponentDataType() );
+    QString                  dataType = CORBA::string_dup( SC->ComponentDataType() );
     QString                  ior      = "";
-    QString                  SCEntry  = strdup( SC->GetID() );
+    QString                  SCEntry  = CORBA::string_dup( SC->GetID() );
 
     SALOMEDS::GenericAttribute_var    anAttr;
     SALOMEDS::AttributeName_var       aName;
@@ -792,7 +845,7 @@ void QAD_ObjectBrowser::Update()
 
     if (SC->FindAttribute(anAttr, "AttributeIOR")) {
       anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-      ior = strdup( anIOR->Value() );
+      ior = CORBA::string_dup( anIOR->Value() );
     }
 
     bool caseIAPP = false;
@@ -803,7 +856,7 @@ void QAD_ObjectBrowser::Update()
       if ( ShowIAPP.compare("true") == 0 ) {
        if (SC->FindAttribute(anAttr, "AttributeName")) {
           aName = SALOMEDS::AttributeName::_narrow(anAttr);
-         Item = AddItem (myListView, strdup( aName->Value() ), strdup( SCEntry ), ior, 1, "");
+         Item = AddItem (myListView, CORBA::string_dup( aName->Value() ), SCEntry, ior, 1, "");
          myListViewMap[ SCEntry ].append( Item );
        } 
         else {
@@ -817,7 +870,7 @@ void QAD_ObjectBrowser::Update()
       caseIAPP = false;
       if (SC->FindAttribute(anAttr, "AttributeName")) {
         aName = SALOMEDS::AttributeName::_narrow(anAttr);
-       Item = AddItem (myListView, strdup( aName->Value() ), SCEntry, ior, 1, "");
+       Item = AddItem (myListView, CORBA::string_dup( aName->Value() ), SCEntry, ior, 1, "");
        myListViewMap[ SCEntry ].append( Item );
       } 
       else {
@@ -932,7 +985,7 @@ void QAD_ObjectBrowser::UpdateUseCaseBrowser() {
   QAD_ObjectBrowserItem* root = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild();
   SALOMEDS::UseCaseBuilder_var  UCBuilder = myStudy->GetUseCaseBuilder();
   SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
-  QString UCName = QString( strdup( UCBuilder->GetName() ) );
+  QString UCName = CORBA::string_dup( UCBuilder->GetName() );
   if ( UCName.isEmpty() )
     UCName = QString( tr( "Root" ) );
   // creating root item if is not yet created
@@ -950,7 +1003,7 @@ void QAD_ObjectBrowser::UpdateUseCaseBrowser() {
   if ( !UCIter->_is_nil() ) {
     for ( ; UCIter->More(); UCIter->Next() ) {
       SALOMEDS::SObject_var UCObject = UCIter->Value();
-      QString UCEntry = strdup( UCObject->GetID() );
+      QString UCEntry = CORBA::string_dup( UCObject->GetID() );
       ucList[ UCEntry ] = UCObject;
     }
   }
@@ -998,7 +1051,7 @@ void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_Object
   SALOMEDS::AttributeTextHighlightColor_var  aTextHighlightColor;
   QString                                    valueString;
   QString                                    ior = "";
-  QString                                    UCEntry = strdup( UCObject->GetID() );
+  QString                                    UCEntry = CORBA::string_dup( UCObject->GetID() );
 
   SALOMEDS::UseCaseBuilder_var               UCBuilder = myStudy->GetUseCaseBuilder();
   SALOMEDS::SObject_var                      SOCurrent = UCBuilder->GetCurrentObject();
@@ -1010,17 +1063,17 @@ void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_Object
 
 //  if ( !bFound ) {
   if ( UCObject->ReferencedObject( RefSO ) && !RefSO->_is_nil() ) {
-    QString RefSOEntry = strdup( RefSO->GetID() );
+    QString RefSOEntry = CORBA::string_dup( RefSO->GetID() );
     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) || RefSO->FindAttribute( anAttr, "AttributeName" ) ) {
       aName = SALOMEDS::AttributeName::_narrow( anAttr );
       if ( RefSO->FindAttribute( anAttr, "AttributeIOR" ) ) {
        anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
-       ior = strdup( anIOR->Value() );
+       ior = CORBA::string_dup( anIOR->Value() );
       }
       valueString = getValueFromObject( RefSO );
       if ( !UCSubItem ) {
        UCSubItem = AddItem( UCItem, 
-                            QString( " * " ) + strdup( aName->Value() ), 
+                            QString( " * " ) + CORBA::string_dup( aName->Value() ), 
                             RefSOEntry, 
                             ior, 
                             2, 
@@ -1029,7 +1082,7 @@ void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_Object
        myUseCaseMap[ RefSOEntry ].append( UCSubItem );
       }
       else {
-       UCSubItem->setName( QString( " * " ) + strdup( aName->Value() ) );
+       UCSubItem->setName( QString( " * " ) + CORBA::string_dup( aName->Value() ) );
        UCSubItem->setEntry( RefSOEntry );
        UCSubItem->setIOR( ior );
        UCSubItem->setReference( UCEntry );
@@ -1044,17 +1097,17 @@ void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_Object
     // getting IOR
     if ( UCObject->FindAttribute( anAttr, "AttributeIOR" ) )  {
       anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
-      ior = strdup( anIOR->Value() );
+      ior = CORBA::string_dup( anIOR->Value() );
     }
     // getting Name and adding new Item
     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) ) {
       aName = SALOMEDS::AttributeName::_narrow( anAttr );
       if ( !UCSubItem ) {
-       UCSubItem = AddItem( UCItem, strdup( aName->Value() ), UCEntry, ior, 0, "", valueString );
+       UCSubItem = AddItem( UCItem, CORBA::string_dup( aName->Value() ), UCEntry, ior, 0, "", valueString );
        myUseCaseMap[ UCEntry ].append( UCSubItem );
       }
       else {
-       UCSubItem->setName( strdup( aName->Value() ) );
+       UCSubItem->setName( CORBA::string_dup( aName->Value() ) );
        UCSubItem->setEntry( UCEntry );
        UCSubItem->setIOR( ior );
        UCSubItem->setReference( "" );
@@ -1119,7 +1172,7 @@ void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_Object
     if ( !UCIter->_is_nil() ) {
       for ( ; UCIter->More(); UCIter->Next() ) {
        SALOMEDS::SObject_var UCSubObject = UCIter->Value();
-       QString UCSubEntry = strdup( UCSubObject->GetID() );
+       QString UCSubEntry = CORBA::string_dup( UCSubObject->GetID() );
        ucList[ UCSubEntry ] = UCSubObject;
       }
     }
@@ -1298,6 +1351,18 @@ void QAD_ObjectBrowser::showPopupMenu(QListViewItem* theItem)
   QString       ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
 
   if (theItem != NULL && ( Sel->IObjectCount()>0 || ActiveComp.isEmpty() ) ) {
+
+    // PAL5618: if IO is presented by several items, assure that the selected IO
+    // is presented exactly by theItem: difference is in reference
+    QAD_ObjectBrowserItem *item = (QAD_ObjectBrowserItem *) theItem;
+    QString theEntry = item->getEntry();
+    const SALOME_ListIO& SelIO = Sel->StoredIObjects();
+    for ( SALOME_ListIteratorOfListIO SelIt( SelIO ); SelIt.More(); SelIt.Next() ) {
+      const Handle(SALOME_InteractiveObject)& IO = SelIt.Value();
+      if ( strcmp ( IO->getEntry(), theEntry ) == 0 )
+        IO->setReference( item->getReference() );
+    }
+    
     createPopup();
 
     if ( myPopup ) {
@@ -1348,6 +1413,12 @@ void QAD_ObjectBrowser::onSelectedItem()
   SALOME_ListIO DeltaNeg;
   DeltaNeg.Clear();
 
+  typedef QMap<QString, SALOME_InteractiveObject*> SelMap;
+
+  SelMap currMap, allMap;
+  for( SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); It.More(); It.Next() )
+    currMap.insert( It.Value()->getEntry(), It.Value().operator->() );
+
   QListViewItemIterator it( whoIs );
   for ( ; it.current(); ++it ) {
     QAD_ObjectBrowserItem* item = (QAD_ObjectBrowserItem*)it.current();
@@ -1357,49 +1428,35 @@ void QAD_ObjectBrowser::onSelectedItem()
 
     if ( !theEntry.isEmpty() ) {
       if ( item->isSelected() ) {
-        bool itemAlreadySelected = false;
-       
-        SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
-        for(;It.More();It.Next()) {
-         Handle(SALOME_InteractiveObject) IO = It.Value();
-         if ( strcmp ( IO->getEntry(), theEntry ) == 0 ) {
-           itemAlreadySelected = true;
-           break;
-         }
-        }
-      
-        if (!itemAlreadySelected) {
+        allMap.insert( theEntry, 0 );
+
+        if ( !currMap.contains( theEntry ) ) {
          Handle(SALOME_InteractiveObject) newIO;
          SALOMEDS::SObject_var obj = aStudy->FindObjectID( theEntry.latin1() );
          if ( !obj->_is_nil() ) {
            SALOMEDS::SComponent_var comp = obj->GetFatherComponent();
            if ( !comp->_is_nil() ) {
-             Standard_CString datatype = comp->ComponentDataType();
-             newIO = new SALOME_InteractiveObject( strdup(theEntry),
-                                                   datatype,
-                                                   strdup(theName) );
-             newIO->setReference( strdup(theRef) );
+             //Standard_CString datatype = comp->ComponentDataType();
+             const char* datatype = comp->ComponentDataType();
+             //              newIO = new SALOME_InteractiveObject( CORBA::string_dup(theEntry),
+             //                                                    datatype,
+             //                                                    CORBA::string_dup(theName) );
+             newIO = new SALOME_InteractiveObject( theEntry, datatype, theName );
+             newIO->setReference( CORBA::string_dup(theRef) );
             }
          } else {
-           newIO = new SALOME_InteractiveObject( strdup(theEntry),
-                                                 "",
-                                                 strdup(theName) );
-           newIO->setReference( strdup(theRef) );
+           //newIO = new SALOME_InteractiveObject( CORBA::string_dup(theEntry),
+           //                                            "",
+           //                                            CORBA::string_dup(theName) );
+           newIO = new SALOME_InteractiveObject( theEntry, "", theName );
+           newIO->setReference( CORBA::string_dup(theRef) );
          }
           if (!newIO.IsNull()) {
            DeltaPos.Append( newIO );
           } 
         }
-      } else {
-        SALOME_ListIteratorOfListIO It1( Sel->StoredIObjects() );
-        for(;It1.More();It1.Next()) {
-         Handle(SALOME_InteractiveObject) IO = It1.Value();
-         if ( strcmp( IO->getEntry(), item->getEntry() ) == 0 ) {
-           DeltaNeg.Append( IO );
-           break;
-         }
-        }
-      }
+      } else if ( currMap.contains( theEntry ) )
+       DeltaNeg.Append( currMap[theEntry] );
     }
   }
 
@@ -1412,6 +1469,11 @@ void QAD_ObjectBrowser::onSelectedItem()
   for(;ItPos.More();ItPos.Next()) {
     Sel->AddIObject( ItPos.Value() );
   }
+
+  for ( SelMap::iterator it = currMap.begin(); it != currMap.end(); ++it ) 
+    if ( !allMap.contains( it.key() ) )
+      Sel->RemoveIObject( it.data() );
+
   if ( myApp )
     myApp->updateActions();
 }
@@ -1496,7 +1558,7 @@ QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
   // Table of integer
   if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
     aTableInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr );
-    QString tlt = QString( strdup( aTableInt->GetTitle() ) );
+    QString tlt = QString( aTableInt->GetTitle() );
     if ( !tlt.isEmpty() )
       tlt += " ";
     int nbRows  = aTableInt->GetNbRows() ; 
@@ -1507,7 +1569,7 @@ QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
   // Table of real
   if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
     aTableReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr );
-    QString tlt = QString( strdup( aTableReal->GetTitle() ) );
+    QString tlt = QString( aTableReal->GetTitle() );
     if ( !tlt.isEmpty() )
       tlt += " ";
     int nbRows  = aTableReal->GetNbRows() ; 
@@ -1518,7 +1580,7 @@ QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
   // Comment
   if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
     aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
-    QString val = QString( strdup( aComment->Value() ) );
+    QString val = QString( aComment->Value() );
     return val;
   }
   return QString::null;
@@ -1744,8 +1806,20 @@ void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
 {
   if ( myStudy->_is_nil() )
     return;
+  
+  // Check if the study is locked
   QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
   QAD_Study* myActiveStudy = Desktop->getActiveStudy();
+  SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
+  if ( aStudy->GetProperties()->IsLocked() )
+    {
+      QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
+                             QObject::tr("WRN_WARNING"), 
+                             QObject::tr("WRN_STUDY_LOCKED"),
+                             QObject::tr("BUT_OK") );
+      return;
+    }
+
   SALOME_Selection* Sel    = SALOME_Selection::Selection( myActiveStudy->getSelection() );
   SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
   SALOMEDS::SObject_var Current = UCBuilder->GetCurrentObject();
@@ -1779,14 +1853,14 @@ void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
     if ( ucSelected.count() == 1 ) {
       QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( 0 ) );
       if ( isRootItem( useCaseItem ) ) {
-       QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( UCBuilder->GetName() ) );
+       QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), UCBuilder->GetName() );
        if ( !name.isEmpty() ) {
-         bool ok = UCBuilder->SetName( strdup( name.latin1() ) );
+         bool ok = UCBuilder->SetName( name.latin1() );
          myActiveStudy->updateUseCaseBrowser( );
        }
       }
       else/* if ( UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) )*/ {
-       QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( useCaseItem->getName() ) );
+       QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), CORBA::string_dup( useCaseItem->getName() ) );
        if ( !name.isEmpty() ) {
          myActiveStudy->renameIObject( Sel->firstIObject(), name );
        }
@@ -1845,9 +1919,20 @@ void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
 */
 void QAD_ObjectBrowser::onUseCaseBtn()
 {
+  // Check if the study is locked
+  QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
+  QAD_Study* myActiveStudy = Desktop->getActiveStudy();
+  SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
+  if ( aStudy->GetProperties()->IsLocked() )
+    {
+      QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
+                             QObject::tr("WRN_WARNING"), 
+                             QObject::tr("WRN_STUDY_LOCKED"),
+                             QObject::tr("BUT_OK") );
+      return;
+    }
+  
   if ( sender() == myNewBtn ) {
-    QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
-    QAD_Study* myActiveStudy = Desktop->getActiveStudy();
     SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
     UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) ); 
     myActiveStudy->updateUseCaseBrowser();
index ef5f940997a2ec25b85f0df095f0c5d4f5cfd66d..fec96c965ea6ae57f5fa4a3dcdbb355ea07c3a95 100644 (file)
@@ -124,6 +124,7 @@ protected slots:
     void                  showPopupMenu(QListViewItem*);
     void                   showUseCasePopupMenu(QListViewItem*);
     
+    void                   onExpandAll();
     void                   onExpanded (QListViewItem*);
     void                   onCollapsed(QListViewItem*);
     void                   onUseCasePopupMenu( int );
index 72e22033ea4058816a10fa161458b08d7e9933a5..f5258e1a05a9b6bf35d6b397129e6f8aaf0fd31b 100644 (file)
@@ -46,6 +46,7 @@
 #include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
 //NRI
 
+#include "utilities.h"
 using namespace std;
 
 
@@ -409,7 +410,6 @@ void QAD_PyEditor::keyPressEvent( QKeyEvent *e )
              _isInHistory = true;
              _currentCommand = text(endLine).remove(0,SIZEPR);
              _currentCommand.truncate( _currentCommand.length() - 1 );
-             SCRUTE(_currentCommand);
            }
          QString previousCommand = myInterp->getPrevious();
          if (previousCommand.compare(BEGIN_HISTORY_PY) != 0)
index fad3df375d4c3e35f8c8975d21c91ad9f841a8a4..611b0e49bd26ac34794eee5de9013ddcdf007f6a 100644 (file)
@@ -10,6 +10,8 @@
 //  $Header$
 
 
+
+
 #include "QAD_PyInterp_mono.h"
 #include "utilities.h"
 
index 7656e6de4ca81f10f5f988cf6384ebe70221ae88..8559ce5fb0595badc69534bd0ff6adfad569977c 100644 (file)
@@ -164,7 +164,10 @@ QAD_RightFrame::QAD_RightFrame(QWidget *theParent,
     return;
   }
 
-  SharedLib.SetName( strdup(ComponentLib) );
+  const Standard_CString aCopyCL = CORBA::string_dup(ComponentLib);
+  SharedLib.SetName( aCopyCL);
+  delete(aCopyCL);
+  
   
   bool ok = SharedLib.DlOpen(OSD_RTLD_LAZY);
   if (!ok) {
@@ -284,3 +287,46 @@ void QAD_RightFrame::unCompressBottom()
     h->unCompressAfter();
 }
 
+void QAD_RightFrame::compressLeft()
+{
+  QSplitterPHandle* h = mySplitter->getHandleAfter( getPyEditor() );
+  if( h )
+    h->compressBefore();
+}
+
+void QAD_RightFrame::compressRight()
+{
+  QSplitterPHandle* h = mySplitter->getHandleAfter( getPyEditor() );
+  if( h )
+    h->compressAfter();
+}
+
+void QAD_RightFrame::unCompressLeft()
+{
+  QSplitterPHandle* h = mySplitter->getHandleAfter( getPyEditor() );
+  if( h )
+    h->unCompressBefore();
+}
+
+void QAD_RightFrame::unCompressRight()
+{
+  QSplitterPHandle* h = mySplitter->getHandleAfter( getPyEditor() );
+  if( h )
+    h->unCompressAfter();
+}
+
+bool QAD_RightFrame::isCompressedViewFrame() const
+{
+    return isCompressed( myViewFrame );
+}
+
+bool QAD_RightFrame::isCompressedPython() const
+{
+    return mySplitter->isCompressed( getPyEditor() );
+}
+
+bool QAD_RightFrame::isCompressedMessage() const
+{
+    return mySplitter->isCompressed( getMessage() );
+}
+
index b92b6eb666b014b4590ef398668bb56c052e697e..8b4a10b9e95095c160da546f4200886b1b90e022 100644 (file)
@@ -55,7 +55,16 @@ class QAD_EXPORT QAD_RightFrame : public QAD_Splitter
   void              compressUp();
   void              unCompressBottom();
   void              unCompressUp();
-  
+
+  void              compressLeft();
+  void              compressRight();
+  void              unCompressLeft();
+  void              unCompressRight();
+
+  bool              isCompressedViewFrame() const;
+  bool              isCompressedPython() const;
+  bool              isCompressedMessage() const;
+    
 protected:
   ViewType          myViewType;
   
index f43c8714f2854510a097ea39e24cf5defe8c6de7..1ad0b2112123565324e16c1a2f647fb4cca0531c 100644 (file)
@@ -389,6 +389,14 @@ void QAD_Study::setReadOnly(bool state)
   myIsReadOnly = state;
 }
 
+bool QAD_Study::isLocked()
+{
+  bool state = false;
+  if ( !CORBA::is_nil( myStudy ) )
+    state = myStudy->GetProperties()->IsLocked();
+  return state;
+}
+
 //=======================================================================//
 //                     Study operations                                 //
 //=======================================================================//
@@ -648,7 +656,7 @@ QAD_StudyFrame* QAD_Study::createStudyFrame( const QString& title, ViewType theV
                              title, VIEW_OCC,
                              myInterp, myMutex );
     
-    Standard_CString name = strdup(sf->title().latin1());
+    Standard_CString name = CORBA::string_dup(sf->title().latin1());
     anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
     aName = SALOMEDS::AttributeName::_narrow(anAttr);
     aName->SetValue(name);
@@ -820,7 +828,7 @@ bool QAD_Study::undo()
 
     for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
       /* Update Viewer */
-      sf->getRightFrame()->getViewFrame()->undo( myStudy, sf->entry() );
+      sf->getRightFrame()->getViewFrame()->undo( this, sf->entry() );
     }
     updateCaptions();
 
@@ -855,7 +863,7 @@ bool QAD_Study::redo()
 
     /* Update Viewer */
     for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
-      sf->getRightFrame()->getViewFrame()->redo( myStudy, sf->entry() );
+      sf->getRightFrame()->getViewFrame()->redo( this, sf->entry() );
     }
     updateCaptions();
 
@@ -1192,7 +1200,7 @@ void QAD_Study::renameIObject( const Handle(SALOME_InteractiveObject)& IObject,
     SALOMEDS::AttributeName_var    aName;
     anAttr = aStudyBuilder->FindOrCreateAttribute(obj, "AttributeName");
     aName = SALOMEDS::AttributeName::_narrow(anAttr);
-    aName->SetValue(strdup(newName.latin1()));
+    aName->SetValue(newName.latin1());
   }
 
   // VSR 13/03/03 - rename Interactive object 
index 8139e8a5dbfe47b71e9c6b58ed0dde732388349c..4a41ee5d71e27351c349c0871252c33146eeb072 100644 (file)
@@ -83,6 +83,7 @@ public:
   bool            isModified() const;
   bool            isReadOnly() const;
   void            setReadOnly(bool state);
+  bool             isLocked();
   const QString&   getTitle() const;
   int              getStudyId();
   const QString&   getPath() const;
index b54b6dfc0d4d11f2fdfb5c70258bc20a26a040e3..92f5823d6d577c9308f088a2c206662389bcad76 100644 (file)
@@ -31,6 +31,7 @@
   \brief Frame window which contains QAD_LeftFrame and QAD_RightFrame.
 */
 
+#include "QAD_StudyFrame.h"
 #include "QAD_StudyFrame.h"
 #include "QAD_RightFrame.h"
 #include "QAD_LeftFrame.h"
@@ -133,22 +134,40 @@ void QAD_StudyFrame::closeEvent(QCloseEvent* e)
  */
 void QAD_StudyFrame::compressLeft()
 {
-  mySplitter->compress(myLeftFrm);
+  QSplitterPHandle* h = mySplitter->getHandleAfter(myLeftFrm);
+  if( h ) 
+    h->compressBefore();
 }
 
 void QAD_StudyFrame::compressRight()
 {
-  mySplitter->compress(myRightFrm);  
+  QSplitterPHandle* h = mySplitter->getHandleAfter(myLeftFrm);
+  if( h )
+    h->compressAfter();
 }
 
 void QAD_StudyFrame::unCompressLeft()
 {
-  mySplitter->unCompress(myLeftFrm);
+  QSplitterPHandle* h = mySplitter->getHandleAfter(myLeftFrm);
+  if( h )
+    h->unCompressBefore();
 }
 
 void QAD_StudyFrame::unCompressRight()
 {
-  mySplitter->unCompress(myRightFrm);  
+  QSplitterPHandle* h = mySplitter->getHandleAfter(myLeftFrm);
+  if( h )
+    h->unCompressAfter();
+}
+
+bool QAD_StudyFrame::isCompressedLeft() const
+{
+  return mySplitter->isCompressed(myLeftFrm);
+}
+
+bool QAD_StudyFrame::isCompressedRight() const
+{
+  return mySplitter->isCompressed(myRightFrm);
 }
 
 /*!
index cdb83befaa85a2d2300ae8e353cb69297384fe9c..ea8e45e82bca86d449b35ce7d3318f437176b28a 100644 (file)
@@ -82,6 +82,9 @@ class QAD_EXPORT QAD_StudyFrame: public QMainWindow
   void                unCompressLeft();
   void                unCompressRight();
 
+  bool                isCompressedLeft() const;
+  bool                isCompressedRight() const;
+  
  signals:
   void                sfStudyFrameActivated( QAD_StudyFrame* );
   void                sfStudyFrameClosing( QAD_StudyFrame*);
index 6fa9053717f09079fc3c6c83bba10b92a28766ca..c22c7a4a8224e785529c5df99c060cc166fffdde 100644 (file)
@@ -26,7 +26,6 @@
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include "QAD.h"
 #include "QAD_ViewFrame.h"
 #include "QAD_Application.h"
@@ -38,6 +37,8 @@ using namespace std;
 #include <qimage.h>
 #include "utilities.h"
 
+using namespace std;
+
 /*!
     Constructor
 */
@@ -69,30 +70,6 @@ void QAD_ViewFrame::cleanup()
 {
 } 
 
-bool QAD_ViewFrame::isInViewer(SALOMEDS::Study_var aStudy,
-                              const char* anEntry, const char* StudyFrameEntry)
-{
-  SALOMEDS::SObject_var RefSO;
-  SALOMEDS::SObject_var SO = aStudy->FindObjectID(StudyFrameEntry);
-  SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(SO);
-  for (; it->More();it->Next()){
-    SALOMEDS::SObject_var CSO= it->Value();
-    if (CSO->ReferencedObject(RefSO))
-      if ( strcmp( anEntry, RefSO->GetID() ) == 0 )
-       return 1;
-  }
-  return 0;
-}
-
-//san:T3.13 - it's up to VTKViewer_ViewFrame to implement (or not implement) getRenderer() method. Be careful!
-/*
-vtkRenderer* QAD_ViewFrame::getRenderer()
-{
-  MESSAGE ( "Only redefined  VTKViewer")
-  return NULL;
-}
-*/
-
 /*
    Dumps 3d-Viewer contents into image file
    File format is defined by file's extension; supported formats : PNG, BMP, GIF, JPG
index 48aa8693a719749b9f89076c65da487214476620..119490b634d6c8dc6b44e857fc74c65458cd9325 100644 (file)
 #include "QAD_StudyFrame.h"
 #include "SALOME_InteractiveObject.hxx"
 #include "SALOME_Selection.h"
+#include "SALOME_Prs.h"
+
+class QAD_Study;
 
 // QT Include
 #include <qmainwindow.h>
 
-//class vtkRenderer;
 
-class QAD_EXPORT QAD_ViewFrame : public QMainWindow
+class QAD_EXPORT QAD_ViewFrame : public QMainWindow, public SALOME_View
 {
   Q_OBJECT
 
@@ -53,7 +55,6 @@ public:
 
   virtual ViewType       getTypeView() const = 0; 
   virtual QWidget*       getViewWidget() = 0;
-//  virtual vtkRenderer*   getRenderer();
 
   virtual void           setBackgroundColor( const QColor& ) = 0;
   virtual QColor         backgroundColor() const = 0;
@@ -75,14 +76,8 @@ public:
   virtual bool           isVisible( const Handle(SALOME_InteractiveObject)& IObject ) = 0;
 
   /*  undo/redo management */
-  virtual void           undo(SALOMEDS::Study_var aStudy,
-                             const char* StudyFrameEntry) = 0;
-  virtual void           redo(SALOMEDS::Study_var aStudy,
-                             const char* StudyFrameEntry) = 0;
-
-  static bool           isInViewer(SALOMEDS::Study_var aStudy,
-                                   const char* anEntry,
-                                   const char* StudyFrameEntry);
+  virtual void           undo(QAD_Study* aStudy, const char* StudyFrameEntry) {}
+  virtual void           redo(QAD_Study* aStudy, const char* StudyFrameEntry) {}
 
   /* selection */
   virtual Handle(SALOME_InteractiveObject)   FindIObject(const char* Entry) = 0;
index a843fd12f92630590111fdd4114d5a814268d960..07e568038c3270cec2f52643ab4b78bee459ec65 100644 (file)
@@ -588,6 +588,12 @@ msgstr "%1GUI instance creation failed!"
 msgid "ERR_GET_GUI_NOT_FOUND"
 msgstr "GetComponentGUI() function not found in %1 library!"
 
+msgid "ERR_EMPTY_COMP_NAME"
+msgstr "Component name not found for %1"
+
+msgid "ERR_COMP_DATA_NOT_LOADED"
+msgstr "Persistent data for %1 component has not been loaded!\nProbably, persistent data file is missing or corrupted.\nThe component will be deactivated."
+
 #---------------
 # QUESTION
 #---------------
@@ -856,6 +862,9 @@ msgstr "Pastes object from the clipboard"
 msgid "EDIT_VALUE_CMD"
 msgstr "Edit value"
 
+msgid "EXPAND_ALL_CMD"
+msgstr "Expand all"
+
 msgid "PLOT_TABLE_CMD"
 msgstr "Plot table"
 
index 8d95761e962f82effbf2d125faf45098e52cac4b..4b2a35045851b567f7ca5987413663412fd6f7b4 100644 (file)
@@ -42,6 +42,7 @@
 #include "QAD_Resource.h"
 #include "QAD_Tools.h"
 #include "QAD_WaitCursor.h"
+#include "QAD_MessageBox.h"
 
 // QT Includes
 #include <qapplication.h>
@@ -218,7 +219,7 @@ void SALOMEGUI_Application::onStudyShown( QAD_Study* study )
   }
 
   QAD_StudyFrame* sf = myActiveStudy->getActiveStudyFrame();
-  Standard_CString name = strdup(sf->title().latin1());
+  Standard_CString name = CORBA::string_dup(sf->title().latin1());
   
   SALOMEDS::SComponent_var father = aStudy->FindComponent("Interface Applicative");
   SALOMEDS::SObject_var newObj = B->NewObject(father);
@@ -479,61 +480,76 @@ void SALOMEGUI_Application::onDisplay(int id)
 
   QAD_ViewFrame* viewFrame = myActiveStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame();
 
+  // Ensure that parent component's data are loaded
+  QString compName = desktop->getComponentName( parentComp );
+  if ( compName.isEmpty() ) {
+      waitCursor.stop();
+      QAD_MessageBox::error1( desktop, 
+                             tr("ERR_ERROR"), 
+                             tr("ERR_EMPTY_COMP_NAME").arg( parentComp ), 
+                             tr("BUT_OK"));    
+    return;
+  }
+
+  desktop->loadComponentData( compName );
+
   // Build the graphic presentation (it is stored in the corresponding viewer)
 
+  bool isComponent = false;
+  SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
+  bool needRepaint = false;
+
   // Copy the selection
   SALOME_ListIteratorOfListIO itInit( Sel->StoredIObjects() );
   SALOME_ListIO selList;
   for (; itInit.More(); itInit.Next()) {
-    selList.Append(itInit.Value());
+    Handle(SALOME_InteractiveObject) IObject = itInit.Value();
+    if ( IObject->hasEntry() ) {
+      // check whether the component is selected
+      SALOMEDS::SObject_var obj = aStudy->FindObjectID(IObject->getEntry() );
+      if ( !obj->_is_nil() && strcmp( obj->GetFatherComponent()->GetID(), obj->GetID() ) == 0 ) {
+       selList.Clear();
+       isComponent = true;
+       selList.Append( IObject );
+       break;
+      }
+    }
+    selList.Append( IObject );
   }
-  
-  SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
 
-  bool needRepaint = false;
-    
   if (id == QAD_DisplayOnly_Popup_ID) 
     viewFrame->EraseAll();
 
-  SALOME_ListIteratorOfListIO It( selList );
-  for(;It.More();It.Next()) {
-    Handle(SALOME_InteractiveObject) IObject    = It.Value();
-
-    // First check whether the object is a component or a child object
-    bool isComponent = false;
-
-    if (!IObject->hasEntry()) continue; 
-
-    SALOMEDS::SObject_var obj = aStudy->FindObjectID(IObject->getEntry());
-    if (!obj->_is_nil()) {
-      SALOMEDS::SComponent_var comp = obj->GetFatherComponent();
-      isComponent = (strcmp(comp->GetID(), obj->GetID()) == 0);
-    }
-
-    // For component -> display all children
-    if (isComponent) {
-      SALOMEDS::ChildIterator_ptr it = aStudy->NewChildIterator(obj);
-      it->InitEx(true);
-      for ( ; it->More(); it->Next()) {
-       SALOMEDS::SObject_ptr child = it->Value();
+  // For component -> display all children
+  if ( isComponent ) {
+    SALOMEDS::SObject_var obj = aStudy->FindObjectID( selList.First()->getEntry() );
+    SALOMEDS::ChildIterator_ptr It = aStudy->NewChildIterator( obj );
+    It->InitEx( true );
+    for ( ; It->More(); It->Next() ) {
+      SALOMEDS::SObject_ptr child = It->Value();
+      SALOMEDS::SObject_ptr ref;
+      if ( !child->ReferencedObject( ref ) ) {
        Handle(SALOME_InteractiveObject) childIObject = new SALOME_InteractiveObject();
-       childIObject->setEntry(child->GetID());
-
+       childIObject->setEntry( child->GetID() );
        // Ensure that proper 3D presentation exists for IObject
        aGUI->BuildPresentation(childIObject);
        viewFrame->Display(childIObject, false);
        needRepaint = true;
       }
-    } else { // for child object -> simply display it (no children are displayed)
+    } 
+  }
+  else { // for child object -> simply display it (no children are displayed)
+    SALOME_ListIteratorOfListIO It( selList );
+    for( ;It.More();It.Next() ) {
+      Handle(SALOME_InteractiveObject) IObject = It.Value();
       // Ensure that proper 3D presentation exists for IObject
       aGUI->BuildPresentation(IObject);
       viewFrame->Display(IObject, false);
       needRepaint = true;
     }
-    
   }
 
-  if (needRepaint)
+  if ( needRepaint )
     viewFrame->Repaint();
 
   myActiveStudy->updateObjBrowser(true);
index 00f6efb08f9dada8ffa8aa8575f29a6181e8256c..9edbd3bb18dc79e8a7f92e94846f8938a639f476 100644 (file)
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
+#include "SALOMEGUI_Swig.hxx"
+
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 #include "QAD_Study.h"
 #include "QAD_RightFrame.h"
 #include "QAD_StudyFrame.h"
-#include "SALOMEGUI_Swig.hxx"
-#include "utilities.h"
+
+#include "SALOME_Event.hxx"
 
 #include "SALOME_Selection.h"
 #include "SALOME_InteractiveObject.hxx"
 #include "SALOME_ListIteratorOfListIO.hxx"
 
+#include "utilities.h"
+
+using namespace std;
+
+namespace SALOME{
+  QAD_ViewFrame* GetViewFrame(QAD_Study* theStudy){
+    return theStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame();
+  }
+
+  Handle(SALOME_InteractiveObject) FindIObject(QAD_Study* theStudy, const char *theEntry)
+  {
+    return GetViewFrame(theStudy)->FindIObject(theEntry);
+  }
+}
+
 
 /*!
   Constructor
 */
 SALOMEGUI_Swig::SALOMEGUI_Swig()
-// VSR 06-05-03 : _studyId(0)
 {
   //  MESSAGE("Constructeur");
 }
@@ -62,8 +77,8 @@ SALOMEGUI_Swig::~SALOMEGUI_Swig()
 */
 QAD_Study* SALOMEGUI_Swig::getActiveStudy()
 {
-  QAD_Application* app = QAD_Application::getDesktop()->getActiveApp();
-  if ( app ) return app->getActiveStudy();
+  if(QAD_Application* app = QAD_Application::getDesktop()->getActiveApp()) 
+    return app->getActiveStudy();
   return 0;
 }
 
@@ -72,12 +87,9 @@ QAD_Study* SALOMEGUI_Swig::getActiveStudy()
 */
 void SALOMEGUI_Swig::updateObjBrowser( bool updateSelection )
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myActiveStudy = getActiveStudy();
-  if ( !myActiveStudy) return;
-  // end of VSR 06-05-03 =====================================================
-  myActiveStudy->updateObjBrowser( updateSelection );
+  if(QAD_Study* myActiveStudy = getActiveStudy())
+    ProcessVoidEvent(new TVoidMemFun1ArgEvent<QAD_Study,bool>
+                    (myActiveStudy,&QAD_Study::updateObjBrowser,updateSelection));
 }
 
 /*!
@@ -85,21 +97,9 @@ void SALOMEGUI_Swig::updateObjBrowser( bool updateSelection )
 */
 int SALOMEGUI_Swig::getActiveStudyId()
 {
-  // NRI 24-02-03 :
-  //  if (_studyId ==0)
-  //    {
-  //  QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  //  _name = myStudy->getTitle();
-
-  // VSR 06-05-03 ============================================================
-  // _studyId = QAD_Application::getDesktop()->getActiveStudy()->getStudyId();
-  int _studyId = 0;
-  QAD_Study* myActiveStudy = getActiveStudy();
-  if ( myActiveStudy) _studyId = myActiveStudy->getStudyId();
-  // SCRUTE(_studyId);
-  // end of VSR 06-05-03 =====================================================
-  //    }
-  return _studyId;
+  if(QAD_Study* myActiveStudy = getActiveStudy())
+    return myActiveStudy->getStudyId();
+  return 0;
 }
 
 /*!
@@ -107,18 +107,9 @@ int SALOMEGUI_Swig::getActiveStudyId()
 */
 const char *SALOMEGUI_Swig::getActiveStudyName()
 {
-  // VSR 06-05-03 ============================================================
-  // QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  // _name = myStudy->getTitle();
-  QString _name = QString::null;
-  QAD_Study* myActiveStudy = getActiveStudy();
-  if ( myActiveStudy) _name = myActiveStudy->getTitle();
-  // end of VSR 06-05-03 =====================================================
-
-  // NRI 24-02-03 :
-  //if (_studyId ==0) 
-  //  getActiveStudyId();
-  return _name.latin1();
+  if(QAD_Study* myActiveStudy = getActiveStudy())
+    return myActiveStudy->getTitle().latin1();
+  return QString::null;
 }
 
 /*!
@@ -141,14 +132,11 @@ const char* SALOMEGUI_Swig::getComponentUserName( const char* ComponentName )
 */
 int SALOMEGUI_Swig::SelectedCount()
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return 0;
-  // end of VSR 06-05-03 =====================================================
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-  return Sel->IObjectCount();
+  if(QAD_Study* myStudy = getActiveStudy()){
+    SALOME_Selection* Sel = SALOME_Selection::Selection(myStudy->getSelection());
+    return Sel->IObjectCount();
+  }
+  return 0;
 }
 
 /*!
@@ -156,68 +144,56 @@ int SALOMEGUI_Swig::SelectedCount()
 */
 const char* SALOMEGUI_Swig::getSelected(int i)
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return "";
-  // end of VSR 06-05-03 =====================================================
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-  SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
-  int index = 0;
-  for(;It.More();It.Next())
-    {
-      Handle(SALOME_InteractiveObject) IObject = It.Value();
-      if ( i == index++ )
-       {
+  if(QAD_Study* myStudy = getActiveStudy()){
+    SALOME_Selection* Sel = SALOME_Selection::Selection( myStudy->getSelection() );
+    SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
+    int index = 0;
+    for(;It.More();It.Next()){
+       Handle(SALOME_InteractiveObject) IObject = It.Value();
+       if( i == index++ ){
          if ( IObject->hasEntry() )
            return IObject->getEntry();
        }
     }
+  }
   return "";
 }
 
 /*!
   Add object with Entry into selection.
 */
-void SALOMEGUI_Swig::AddIObject(const char *Entry)
+void SALOMEGUI_Swig::AddIObject(const char *theEntry)
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return;
-  // end of VSR 06-05-03 =====================================================
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-
-  if ( !IsInCurrentView( Entry ) )
-    return;
-  
-  Handle(SALOME_InteractiveObject) IO = 
-    myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->FindIObject( Entry );
-  Sel->AddIObject( IO );
+  if(QAD_Study* myStudy = getActiveStudy()){
+    SALOME_Selection* aSel = SALOME_Selection::Selection( myStudy->getSelection() );
+    if(IsInCurrentView(theEntry)){
+      Handle(SALOME_InteractiveObject) anIO = SALOME::FindIObject(myStudy,theEntry);
+      if(anIO.IsNull())        return;
+      ProcessEvent(new TMemFun2ArgEvent<SALOME_Selection,int,
+                  const Handle(SALOME_InteractiveObject)&,bool,
+                  Handle(SALOME_InteractiveObject)>
+                  (aSel,&SALOME_Selection::AddIObject,anIO,true));
+    }
+  }
 }
 
 
 /*!
   Removes object with Entry into selection.
 */
-void SALOMEGUI_Swig::RemoveIObject(const char *Entry)
+void SALOMEGUI_Swig::RemoveIObject(const char *theEntry)
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return;
-  // end of VSR 06-05-03 =====================================================
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-
-  if ( !IsInCurrentView( Entry ) )
-    return;
-
-  Handle(SALOME_InteractiveObject) IO = 
-    myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->FindIObject( Entry );
-  Sel->RemoveIObject( IO );
+  if(QAD_Study* myStudy = getActiveStudy()){
+    SALOME_Selection* aSel = SALOME_Selection::Selection( myStudy->getSelection() );
+    if(IsInCurrentView(theEntry)){
+      Handle(SALOME_InteractiveObject) anIO = SALOME::FindIObject(myStudy,theEntry);
+      if(anIO.IsNull())        return;
+      ProcessEvent(new TMemFun2ArgEvent<SALOME_Selection,int,
+                  const Handle(SALOME_InteractiveObject)&,bool,
+                  Handle(SALOME_InteractiveObject)>
+                  (aSel,&SALOME_Selection::RemoveIObject,anIO,true));
+    }
+  }
 }
 
 
@@ -226,76 +202,65 @@ void SALOMEGUI_Swig::RemoveIObject(const char *Entry)
 */
 void SALOMEGUI_Swig::ClearIObjects()
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return;
-  // end of VSR 06-05-03 =====================================================
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-  Sel->ClearIObjects();
+  if(QAD_Study* myStudy = getActiveStudy()){
+    SALOME_Selection* aSel = SALOME_Selection::Selection( myStudy->getSelection() );
+    ProcessVoidEvent(new TVoidMemFunEvent<SALOME_Selection>
+                    (aSel,&SALOME_Selection::ClearIObjects));
+  }
 }
 
 /*!
   Display
 */             
-void SALOMEGUI_Swig::Display(const char *Entry)
+void SALOMEGUI_Swig::Display(const char *theEntry)
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return;
-  // end of VSR 06-05-03 =====================================================
-
-  if ( !IsInCurrentView( Entry ) )
-    return;
-
-  Handle(SALOME_InteractiveObject) IO = 
-    myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->FindIObject( Entry );
-
-  myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->Display(IO);
+  if(QAD_Study* myStudy = getActiveStudy()){
+    if(IsInCurrentView(theEntry)){
+      Handle(SALOME_InteractiveObject) anIO = SALOME::FindIObject(myStudy,theEntry);
+      if(anIO.IsNull())        return;
+      QAD_ViewFrame* aViewFrame = SALOME::GetViewFrame(myStudy);
+      ProcessVoidEvent(new TVoidMemFun2ArgEvent<QAD_ViewFrame,
+                      const Handle(SALOME_InteractiveObject)&,bool,
+                      Handle(SALOME_InteractiveObject)>
+                      (aViewFrame,&QAD_ViewFrame::Display,anIO,true));
+    }
+  }
 }
 
 /*!
   Display only
 */
-void SALOMEGUI_Swig::DisplayOnly(const char *Entry)
+void SALOMEGUI_Swig::DisplayOnly(const char *theEntry)
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return;
-  // end of VSR 06-05-03 =====================================================
-
-  if ( !IsInCurrentView( Entry ) )
-    return;
-
-  Handle(SALOME_InteractiveObject) IO = 
-    myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->FindIObject( Entry );
-
-  if ( !IO.IsNull() ) {
-    myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->DisplayOnly(IO);
+  if(QAD_Study* myStudy = getActiveStudy()){
+    if(IsInCurrentView(theEntry)){
+      Handle(SALOME_InteractiveObject) anIO = SALOME::FindIObject(myStudy,theEntry);
+      if(anIO.IsNull())        return;
+      QAD_ViewFrame* aViewFrame = SALOME::GetViewFrame(myStudy);
+      ProcessVoidEvent(new TVoidMemFun1ArgEvent<QAD_ViewFrame,
+                      const Handle(SALOME_InteractiveObject)&,
+                      Handle(SALOME_InteractiveObject)>
+                      (aViewFrame,&QAD_ViewFrame::DisplayOnly,anIO));
+    }
   }
 }
 
 /*!
   Erase
 */
-void SALOMEGUI_Swig::Erase(const char *Entry)
+void SALOMEGUI_Swig::Erase(const char *theEntry)
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return;
-  // end of VSR 06-05-03 =====================================================
-
-  if ( !IsInCurrentView( Entry ) )
-    return;
-
-  Handle(SALOME_InteractiveObject) IO = 
-    myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->FindIObject( Entry );
-
-  myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->Erase(IO);
+  if(QAD_Study* myStudy = getActiveStudy()){
+    if(IsInCurrentView(theEntry)){
+      Handle(SALOME_InteractiveObject) anIO = SALOME::FindIObject(myStudy,theEntry);
+      if(anIO.IsNull())        return;
+      QAD_ViewFrame* aViewFrame = SALOME::GetViewFrame(myStudy);
+      ProcessVoidEvent(new TVoidMemFun2ArgEvent<QAD_ViewFrame,
+                      const Handle(SALOME_InteractiveObject)&,bool,
+                      Handle(SALOME_InteractiveObject)>
+                      (aViewFrame,&QAD_ViewFrame::Erase,anIO,true));
+    }
+  }
 }
 
 /*!
@@ -303,12 +268,11 @@ void SALOMEGUI_Swig::Erase(const char *Entry)
 */
 void SALOMEGUI_Swig::DisplayAll()
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return;
-  // end of VSR 06-05-03 =====================================================
-  myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->DisplayAll();
+  if(QAD_Study* myStudy = getActiveStudy()){
+    QAD_ViewFrame* aViewFrame = SALOME::GetViewFrame(myStudy);
+    ProcessVoidEvent(new TVoidMemFunEvent<QAD_ViewFrame>
+                    (aViewFrame,&QAD_ViewFrame::DisplayAll));
+  }
 }
 
 /*!
@@ -316,66 +280,20 @@ void SALOMEGUI_Swig::DisplayAll()
 */
 void SALOMEGUI_Swig::EraseAll()
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return;
-  // end of VSR 06-05-03 =====================================================
-  SALOME_Selection* Sel 
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-  
-  Sel->ClearIObjects();
-  myStudy->getActiveStudyFrame()->getRightFrame()->getViewFrame()->EraseAll();
+  ClearIObjects();
+  if(QAD_Study* myStudy = getActiveStudy()){
+    QAD_ViewFrame* aViewFrame = SALOME::GetViewFrame(myStudy);
+    ProcessVoidEvent(new TVoidMemFunEvent<QAD_ViewFrame>
+                    (aViewFrame,&QAD_ViewFrame::EraseAll));
+  }
 }
 
 /*!
   Checks if object is displayed in current viewer
 */
-bool SALOMEGUI_Swig::IsInCurrentView(const char *Entry)
+bool SALOMEGUI_Swig::IsInCurrentView(const char *theEntry)
 {
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Study* myStudy = getActiveStudy();
-  if ( !myStudy) return false;
-  // end of VSR 06-05-03 =====================================================
-  return myStudy->isInViewer( Entry, myStudy->getActiveStudyFrame()->entry() );
+  if(QAD_Study* myStudy = getActiveStudy())
+    return myStudy->isInViewer( theEntry, myStudy->getActiveStudyFrame()->entry() );
+  return false;
 }
-
-/*!
-  Gets VTK renderer if available
-*/
-//san:T3.13 - move getRenderer() implementation from here to SalomePy.cxx
-/*vtkRenderer *SALOMEGUI_Swig::getRenderer(int viewId)
-{
-  // VSR 06-05-03 ============================================================
-  //QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  QAD_Application* app = QAD_Application::getDesktop()->getActiveApp();
-  if ( !app ) return NULL;
-  QAD_Study* myStudy = app->getActiveStudy();
-  if ( !myStudy) return NULL;
-  // end of VSR 06-05-03 =====================================================
-  int nbStudyFrames = myStudy->getStudyFramesCount();
-  vtkRenderer *myRenderer = NULL;
-  if (viewId == -1) // find the first frame with VTK viewer & get renderer
-    {
-      int i=0;
-      for(i=0; i<nbStudyFrames; i++)
-       {
-         if ( myStudy->getStudyFrame(i)->getTypeView() == VIEW_VTK )
-           {
-             myRenderer = myStudy->getStudyFrame(i)->getRightFrame()->getViewFrame()->getRenderer();
-             break;
-           }
-       }
-    }
-  else     // get the VTK renderer of a given frame
-    {
-      SCRUTE(viewId);
-      if ((viewId >=0) && (viewId <nbStudyFrames))
-       myRenderer = myStudy->getStudyFrame(viewId)->getRightFrame()->getViewFrame()->getRenderer();
-    }
-  if (myRenderer == NULL) MESSAGE("No VTK Renderer available !");
-  return myRenderer;
-}
-*/
-
index 0af5330a197e01a326078d4902d740e071661aa3..f61d26fd0bd39b83c08245c186b2ad7e7f9677a7 100644 (file)
 
 #include <Standard.hxx>
 
-class vtkRenderer;
+#include "SALOME_InteractiveObject.hxx"
+
 class QAD_Study;
+class QAD_ViewFrame;
+
+namespace SALOME{
+  QAD_ViewFrame* GetViewFrame(QAD_Study* theStudy);
+  Handle(SALOME_InteractiveObject) FindIObject(QAD_Study* theStudy, const char *theEntry);
+}
+
 
 class SALOMEGUI_Swig
 {
@@ -43,9 +51,6 @@ public:
   SALOMEGUI_Swig();
   ~SALOMEGUI_Swig();
 
-  //san:T3.13 - move getRenderer() implementation from here to SalomePy.cxx
-  //static vtkRenderer* getRenderer(int viewId = -1);
-
   void         updateObjBrowser( bool updateSelection );
   QAD_Study*   getActiveStudy();
   int          getActiveStudyId();
index 07c1b7bdbb322f022944a049cb4285cb8d4506bd..5f0455fcdf12ddb8bb527902499632ec97589618 100644 (file)
@@ -202,16 +202,16 @@ void SALOMEGUI_TableDlg::onOK()
              }
              if ( !bEmptyRow ) {  // Skip rows with no data !!!
                // set row title
-               tblIntAttr->SetRowTitle( nRow+1, rowTitles[ i ].isNull() ? strdup( "" ) : strdup( rowTitles[ i ] ) ); 
+               tblIntAttr->SetRowTitle( nRow+1, rowTitles[ i ].isNull() ? QString( "" ) : QString( rowTitles[ i ] ) ); 
                // set row unit
-               tblIntAttr->SetRowUnit( nRow+1, units[ i ].isNull() ? strdup( "" ) : strdup( units[ i ] ) ); 
+               tblIntAttr->SetRowUnit( nRow+1, units[ i ].isNull() ? QString( "" ) : QString( units[ i ] ) ); 
                nRow++;
              }
            }
            if ( nRow > 0 ) { // Set columns only if table is not empty, otherwise exception is raised !!!
              // column titles
              for ( i = 0; i < colTitles.count(); i++ )
-               tblIntAttr->SetColumnTitle( i+1, colTitles[ i ].isNull() ? strdup( "" ) : strdup( colTitles[ i ] ) );
+               tblIntAttr->SetColumnTitle( i+1, colTitles[ i ].isNull() ? QString( "" ) : QString( colTitles[ i ] ) );
            }
          }
          // title
@@ -247,16 +247,16 @@ void SALOMEGUI_TableDlg::onOK()
              }
              if ( !bEmptyRow ) {  // Skip rows with no data !!!
                // set row title
-               tblRealAttr->SetRowTitle( nRow+1, rowTitles[ i ].isNull() ? strdup( "" ) : strdup( rowTitles[ i ] ) ); 
+               tblRealAttr->SetRowTitle( nRow+1, rowTitles[ i ].isNull() ? QString( "" ) : QString( rowTitles[ i ] ) ); 
                // set row unit
-               tblRealAttr->SetRowUnit( nRow+1, units[ i ].isNull() ? strdup( "" ) : strdup( units[ i ] ) ); 
+               tblRealAttr->SetRowUnit( nRow+1, units[ i ].isNull() ? QString( "" ) : QString( units[ i ] ) ); 
                nRow++;
              }
            }
            if ( nRow > 0 ) { // Set columns only if table is not empty, otherwise exception is raised !!!
              // column titles
              for ( i = 0; i < colTitles.count(); i++ )
-               tblRealAttr->SetColumnTitle( i+1, colTitles[ i ].isNull() ? strdup( "" ) : strdup( colTitles[ i ] ) );
+               tblRealAttr->SetColumnTitle( i+1, colTitles[ i ].isNull() ? QString( "" ) : QString( colTitles[ i ] ) );
            }
          }
          // title
@@ -300,7 +300,7 @@ void SALOMEGUI_TableDlg::initDlg()
       try {
        SALOMEGUI_Table* tbl = myIntTable->getTable();
        // title
-       myIntTable->setTableTitle( strdup( tblIntAttr->GetTitle() ) );
+       myIntTable->setTableTitle( CORBA::string_dup( tblIntAttr->GetTitle() ) );
        // nb of rows & cols
        int nbRows = tblIntAttr->GetNbRows() ; 
        int nbCols = tblIntAttr->GetNbColumns();
@@ -311,7 +311,7 @@ void SALOMEGUI_TableDlg::initDlg()
        SALOMEDS::StringSeq_var rowTitles = tblIntAttr->GetRowTitles();
        for ( i = 0; i < nbRows; i++ ) {
          if ( rowTitles->length() > 0 )
-           strlist.append( strdup( rowTitles[i] ) );
+           strlist.append( CORBA::string_dup( rowTitles[i] ) );
          else
            strlist.append( "" );
        }
@@ -321,7 +321,7 @@ void SALOMEGUI_TableDlg::initDlg()
        SALOMEDS::StringSeq_var colTitles = tblIntAttr->GetColumnTitles();
        for ( i = 0; i < nbCols; i++ ) {
          if ( colTitles->length() > 0 )
-           strlist.append( strdup( colTitles[i] ) );
+           strlist.append( CORBA::string_dup( colTitles[i] ) );
          else
            strlist.append( "" );
        }
@@ -331,7 +331,7 @@ void SALOMEGUI_TableDlg::initDlg()
        SALOMEDS::StringSeq_var rowUnits = tblIntAttr->GetRowUnits();
        if ( rowUnits->length() > 0 ) {
          for ( i = 0; i < nbRows; i++ )
-           strlist.append( strdup( rowUnits[i] ) );
+           strlist.append( CORBA::string_dup( rowUnits[i] ) );
          myIntTable->setUnits( strlist );
        }
        // data
@@ -356,7 +356,7 @@ void SALOMEGUI_TableDlg::initDlg()
       try {
        SALOMEGUI_Table* tbl = myRealTable->getTable();
        // title
-       myRealTable->setTableTitle( strdup( tblRealAttr->GetTitle() ) );
+       myRealTable->setTableTitle( CORBA::string_dup( tblRealAttr->GetTitle() ) );
        // nb of rows & cols
        int nbRows = tblRealAttr->GetNbRows() ; 
        int nbCols = tblRealAttr->GetNbColumns();
@@ -367,7 +367,7 @@ void SALOMEGUI_TableDlg::initDlg()
        SALOMEDS::StringSeq_var rowTitles = tblRealAttr->GetRowTitles();
        for ( i = 0; i < nbRows; i++ ) {
          if ( rowTitles->length() > 0 )
-           strlist.append( strdup( rowTitles[i] ) );
+           strlist.append( CORBA::string_dup( rowTitles[i] ) );
          else
            strlist.append( "" );
        }
@@ -377,7 +377,7 @@ void SALOMEGUI_TableDlg::initDlg()
        SALOMEDS::StringSeq_var colTitles = tblRealAttr->GetColumnTitles();
        for ( i = 0; i < nbCols; i++ ) {
          if ( colTitles->length() > 0 )
-           strlist.append( strdup( colTitles[i] ) );
+           strlist.append( CORBA::string_dup( colTitles[i] ) );
          else
            strlist.append( "" );
        }
@@ -387,7 +387,7 @@ void SALOMEGUI_TableDlg::initDlg()
        SALOMEDS::StringSeq_var rowUnits = tblRealAttr->GetRowUnits();
        if ( rowUnits->length() > 0 ) {
          for ( i = 0; i < nbRows; i++ )
-           strlist.append( strdup( rowUnits[i] ) );
+           strlist.append( CORBA::string_dup( rowUnits[i] ) );
          myRealTable->setUnits( strlist );
        }
         // data
index e118f219db0e788e3f3008768a04c20a80d65d99..760c94eb3ab4092eba7805b37eaa40607e31e46a 100644 (file)
@@ -38,7 +38,7 @@
 #endif
 class Standard_NoSuchObject;
 class SALOME_InteractiveObject;
-class TColStd_MapOfInteger;
+class TColStd_IndexedMapOfInteger;
 class TColStd_MapTransientHasher;
 class SALOME_DataMapOfIOMapOfInteger;
 class SALOME_DataMapNodeOfDataMapOfIOMapOfInteger;
@@ -77,7 +77,7 @@ Standard_EXPORT SALOME_DataMapIteratorOfDataMapOfIOMapOfInteger();
 Standard_EXPORT SALOME_DataMapIteratorOfDataMapOfIOMapOfInteger(const SALOME_DataMapOfIOMapOfInteger& aMap);
 Standard_EXPORT   void Initialize(const SALOME_DataMapOfIOMapOfInteger& aMap) ;
 Standard_EXPORT  const Handle_SALOME_InteractiveObject& Key() const;
-Standard_EXPORT  const TColStd_MapOfInteger& Value() const;
+Standard_EXPORT  const TColStd_IndexedMapOfInteger& Value() const;
 
 
 
index 1fca36e3ebe63a334e502df902dbe5bc7dbe9d89..b45bb6c6d8b9eda36dafa4032baa3a601ed2b3bc 100644 (file)
@@ -33,8 +33,8 @@ using namespace std;
 #ifndef _SALOME_InteractiveObject_HeaderFile
 #include "SALOME_InteractiveObject.hxx"
 #endif
-#ifndef _TColStd_MapOfInteger_HeaderFile
-#include <TColStd_MapOfInteger.hxx>
+#ifndef _TColStd_IndexedMapOfInteger_HeaderFile
+#include <TColStd_IndexedMapOfInteger.hxx>
 #endif
 #ifndef _TColStd_MapTransientHasher_HeaderFile
 #include <TColStd_MapTransientHasher.hxx>
@@ -49,8 +49,8 @@ using namespace std;
 
 #define TheKey Handle_SALOME_InteractiveObject
 #define TheKey_hxx "SALOME_InteractiveObject.hxx"
-#define TheItem TColStd_MapOfInteger
-#define TheItem_hxx <TColStd_MapOfInteger.hxx>
+#define TheItem TColStd_IndexedMapOfInteger
+#define TheItem_hxx <TColStd_IndexedMapOfInteger.hxx>
 #define Hasher TColStd_MapTransientHasher
 #define Hasher_hxx <TColStd_MapTransientHasher.hxx>
 #define TCollection_DataMapNode SALOME_DataMapNodeOfDataMapOfIOMapOfInteger
index dc0cbd32d3850ccbe65bf84b496723b60b07ee99..cbfa39192578fffbdfb224c9898e698b3be8efde 100644 (file)
@@ -37,8 +37,8 @@
 #ifndef _Handle_SALOME_InteractiveObject_HeaderFile
 #include <Handle_SALOME_InteractiveObject.hxx>
 #endif
-#ifndef _TColStd_MapOfInteger_HeaderFile
-#include <TColStd_MapOfInteger.hxx>
+#ifndef _TColStd_IndexedMapOfInteger_HeaderFile
+#include <TColStd_IndexedMapOfInteger.hxx>
 #endif
 #ifndef _TCollection_MapNode_HeaderFile
 #include <TCollection_MapNode.hxx>
@@ -47,7 +47,7 @@
 #include <TCollection_MapNodePtr.hxx>
 #endif
 class SALOME_InteractiveObject;
-class TColStd_MapOfInteger;
+class TColStd_IndexedMapOfInteger;
 class TColStd_MapTransientHasher;
 class SALOME_DataMapOfIOMapOfInteger;
 class SALOME_DataMapIteratorOfDataMapOfIOMapOfInteger;
@@ -75,9 +75,9 @@ public:
 //      }
  // Methods PUBLIC
  // 
-Standard_EXPORT inline SALOME_DataMapNodeOfDataMapOfIOMapOfInteger(const Handle(SALOME_InteractiveObject)& K,const TColStd_MapOfInteger& I,const TCollection_MapNodePtr& n);
+Standard_EXPORT inline SALOME_DataMapNodeOfDataMapOfIOMapOfInteger(const Handle(SALOME_InteractiveObject)& K,const TColStd_IndexedMapOfInteger& I,const TCollection_MapNodePtr& n);
 Standard_EXPORT inline   Handle_SALOME_InteractiveObject& Key() const;
-Standard_EXPORT inline   TColStd_MapOfInteger& Value() const;
+Standard_EXPORT inline   TColStd_IndexedMapOfInteger& Value() const;
 Standard_EXPORT ~SALOME_DataMapNodeOfDataMapOfIOMapOfInteger();
 
 
@@ -108,15 +108,15 @@ private:
  // Fields PRIVATE
  //
 Handle_SALOME_InteractiveObject myKey;
-TColStd_MapOfInteger myValue;
+TColStd_IndexedMapOfInteger myValue;
 
 
 };
 
 #define TheKey Handle_SALOME_InteractiveObject
 #define TheKey_hxx "SALOME_InteractiveObject.hxx"
-#define TheItem TColStd_MapOfInteger
-#define TheItem_hxx <TColStd_MapOfInteger.hxx>
+#define TheItem TColStd_IndexedMapOfInteger
+#define TheItem_hxx <TColStd_IndexedMapOfInteger.hxx>
 #define Hasher TColStd_MapTransientHasher
 #define Hasher_hxx <TColStd_MapTransientHasher.hxx>
 #define TCollection_DataMapNode SALOME_DataMapNodeOfDataMapOfIOMapOfInteger
index 7fefc9c062f0d7a2d6a8c1432c2c72493324540f..d4d843fe0fc97601c35fa54577416763f8b53472 100644 (file)
@@ -34,8 +34,8 @@ using namespace std;
 #ifndef _SALOME_InteractiveObject_HeaderFile
 #include "SALOME_InteractiveObject.hxx"
 #endif
-#ifndef _TColStd_MapOfInteger_HeaderFile
-#include <TColStd_MapOfInteger.hxx>
+#ifndef _TColStd_IndexedMapOfInteger_HeaderFile
+#include <TColStd_IndexedMapOfInteger.hxx>
 #endif
 #ifndef _TColStd_MapTransientHasher_HeaderFile
 #include <TColStd_MapTransientHasher.hxx>
@@ -98,8 +98,8 @@ Standard_Boolean SALOME_DataMapNodeOfDataMapOfIOMapOfInteger::IsKind(const Handl
 Handle_SALOME_DataMapNodeOfDataMapOfIOMapOfInteger::~Handle_SALOME_DataMapNodeOfDataMapOfIOMapOfInteger() {}
 #define TheKey Handle_SALOME_InteractiveObject
 #define TheKey_hxx "SALOME_InteractiveObject.hxx"
-#define TheItem TColStd_MapOfInteger
-#define TheItem_hxx <TColStd_MapOfInteger.hxx>
+#define TheItem TColStd_IndexedMapOfInteger
+#define TheItem_hxx <TColStd_IndexedMapOfInteger.hxx>
 #define Hasher TColStd_MapTransientHasher
 #define Hasher_hxx <TColStd_MapTransientHasher.hxx>
 #define TCollection_DataMapNode SALOME_DataMapNodeOfDataMapOfIOMapOfInteger
index 6617df7e0faa870abc9a18471e69318b2e5f273b..0478b82a122683b6597816f1fbd4ac512a81384a 100644 (file)
@@ -45,7 +45,7 @@
 class Standard_DomainError;
 class Standard_NoSuchObject;
 class SALOME_InteractiveObject;
-class TColStd_MapOfInteger;
+class TColStd_IndexedMapOfInteger;
 class TColStd_MapTransientHasher;
 class SALOME_DataMapNodeOfDataMapOfIOMapOfInteger;
 class SALOME_DataMapIteratorOfDataMapOfIOMapOfInteger;
@@ -94,17 +94,17 @@ Standard_EXPORT   void Clear() ;
   Clear();
 }
 
-Standard_EXPORT   Standard_Boolean Bind(const Handle(SALOME_InteractiveObject)& K,const TColStd_MapOfInteger& I) ;
+Standard_EXPORT   Standard_Boolean Bind(const Handle(SALOME_InteractiveObject)& K,const TColStd_IndexedMapOfInteger& I) ;
 Standard_EXPORT   Standard_Boolean IsBound(const Handle(SALOME_InteractiveObject)& K) const;
 Standard_EXPORT   Standard_Boolean UnBind(const Handle(SALOME_InteractiveObject)& K) ;
-Standard_EXPORT  const TColStd_MapOfInteger& Find(const Handle(SALOME_InteractiveObject)& K) const;
- const TColStd_MapOfInteger& operator()(const Handle(SALOME_InteractiveObject)& K) const
+Standard_EXPORT  const TColStd_IndexedMapOfInteger& Find(const Handle(SALOME_InteractiveObject)& K) const;
+ const TColStd_IndexedMapOfInteger& operator()(const Handle(SALOME_InteractiveObject)& K) const
 {
   return Find(K);
 }
 
-Standard_EXPORT   TColStd_MapOfInteger& ChangeFind(const Handle(SALOME_InteractiveObject)& K) ;
-  TColStd_MapOfInteger& operator()(const Handle(SALOME_InteractiveObject)& K) 
+Standard_EXPORT   TColStd_IndexedMapOfInteger& ChangeFind(const Handle(SALOME_InteractiveObject)& K) ;
+  TColStd_IndexedMapOfInteger& operator()(const Handle(SALOME_InteractiveObject)& K) 
 {
   return ChangeFind(K);
 }
index 990e1bad6b83ce5dd2d29cf106357a2f9615bc4a..e55a3e490d1420259ad18052edd7db72143dae94 100644 (file)
@@ -36,8 +36,8 @@ using namespace std;
 #ifndef _SALOME_InteractiveObject_HeaderFile
 #include "SALOME_InteractiveObject.hxx"
 #endif
-#ifndef _TColStd_MapOfInteger_HeaderFile
-#include <TColStd_MapOfInteger.hxx>
+#ifndef _TColStd_IndexedMapOfInteger_HeaderFile
+#include <TColStd_IndexedMapOfInteger.hxx>
 #endif
 #ifndef _TColStd_MapTransientHasher_HeaderFile
 #include <TColStd_MapTransientHasher.hxx>
@@ -52,8 +52,8 @@ using namespace std;
 
 #define TheKey Handle_SALOME_InteractiveObject
 #define TheKey_hxx "SALOME_InteractiveObject.hxx"
-#define TheItem TColStd_MapOfInteger
-#define TheItem_hxx <TColStd_MapOfInteger.hxx>
+#define TheItem TColStd_IndexedMapOfInteger
+#define TheItem_hxx <TColStd_IndexedMapOfInteger.hxx>
 #define Hasher TColStd_MapTransientHasher
 #define Hasher_hxx <TColStd_MapTransientHasher.hxx>
 #define TCollection_DataMapNode SALOME_DataMapNodeOfDataMapOfIOMapOfInteger
index 21fa00996faf9c70f42a1accb4a21347b1ecc7dc..74a60fb5e09f3bdf6cad78cfaffb718d4ec30917 100644 (file)
@@ -26,7 +26,6 @@
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 /*!
   \class SALOME_Selection SALOME_Selection.h
   \brief Selection Mechanism of Interactive Object.
@@ -42,6 +41,15 @@ using namespace std;
 #include "utilities.h"
 
 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+using namespace std;
 
 static QList<SALOME_Selection>&  SALOME_Sel_GetSelections()
 {
@@ -245,7 +253,7 @@ int SALOME_Selection::AddIObject(const Handle(SALOME_InteractiveObject)& anObjec
   QAD_Study* myActiveStudy = myDesktop->getActiveStudy();
 
   if ( !IsOk(anObject) ) {
-    MESSAGE ( "The Object not authorized by Filters" )
+    if(MYDEBUG) INFOS ( "The Object not authorized by Filters" )
     myActiveStudy->highlight(anObject,false, update);
     return -1;
   }
@@ -307,13 +315,13 @@ int SALOME_Selection::IObjectCount()
 //!  Returns the first InteractiveObject in the selection.
 Handle(SALOME_InteractiveObject) SALOME_Selection::firstIObject()
 {
-  return myIObjects.First();
+  return myIObjects.Extent() > 0 ? myIObjects.First() : Handle(SALOME_InteractiveObject)();
 }
 
 //! Returns the last InteractiveObject in the selection.
 Handle(SALOME_InteractiveObject) SALOME_Selection::lastIObject()
 {
-  return myIObjects.Last();
+  return myIObjects.Extent() > 0 ? myIObjects.Last() : Handle(SALOME_InteractiveObject)();
 }
 
 /*!
@@ -351,7 +359,7 @@ bool SALOME_Selection::HasIndex( const Handle(SALOME_InteractiveObject)& IObject
   return myMapIOSubIndex.IsBound(IObject);
 }
 
-void SALOME_Selection::GetIndex( const Handle(SALOME_InteractiveObject)& IObject, TColStd_MapOfInteger& theIndex )
+void SALOME_Selection::GetIndex( const Handle(SALOME_InteractiveObject)& IObject, TColStd_IndexedMapOfInteger& theIndex )
 {
   if ( myMapIOSubIndex.IsBound(IObject) ) {
     theIndex = myMapIOSubIndex.Find(IObject);
@@ -368,11 +376,32 @@ bool SALOME_Selection::IsIndexSelected(const Handle(SALOME_InteractiveObject)& I
   if ( !myMapIOSubIndex.IsBound( IObject ) ) {
     return false;
   }
-  TColStd_MapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
+  TColStd_IndexedMapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
   return MapIndex.Contains( index );
 }
 
-
+static bool removeIndex( TColStd_IndexedMapOfInteger& MapIndex,
+                        const int                     Index)
+{
+  int i = MapIndex.FindIndex( Index ); // i==0 if Index is not in the MapIndex
+  if ( i ) {
+    // only the last key can be removed
+    int indexLast = MapIndex.FindKey( MapIndex.Extent() );
+    if ( indexLast == Index )
+      MapIndex.RemoveLast();
+    else {
+      TColStd_IndexedMapOfInteger aNewMap;
+      aNewMap.ReSize( MapIndex.Extent() - 1 );
+      for ( int j = 1; j <= MapIndex.Extent(); j++ ) {
+        int ind = MapIndex( j );
+        if ( ind != Index )
+          aNewMap.Add( ind );
+      }
+      MapIndex = aNewMap;
+    }
+  }
+  return i;
+}
 
 
 bool SALOME_Selection::AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)& IObject, 
@@ -380,36 +409,34 @@ bool SALOME_Selection::AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)&
                                         bool modeShift,
                                         bool update)
 {
-  MESSAGE ( " SALOME_Selection::AddOrRemoveIndex " << index << " - " << modeShift );
+  if(MYDEBUG) INFOS( " SALOME_Selection::AddOrRemoveIndex " << index << " - " << modeShift );
   QAD_Desktop*   myDesktop = (QAD_Desktop*) QAD_Application::getDesktop();
   QAD_Study* myActiveStudy = myDesktop->getActiveStudy();
 
   if ( !myMapIOSubIndex.IsBound( IObject ) ) {
-    TColStd_MapOfInteger Empty;
+    TColStd_IndexedMapOfInteger Empty;
     myMapIOSubIndex.Bind( IObject, Empty );
   }
-  TColStd_MapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
+  TColStd_IndexedMapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
 
-  if ( MapIndex.Contains( index )) {
-    if ( modeShift ) {
-      MapIndex.Remove( index );
-      myActiveStudy->highlight( IObject, true, update );
-    }
-  } else {
-    if ( !modeShift )
-      MapIndex.Clear();
+  bool anIsConatains = MapIndex.Contains( index );
 
+  if (anIsConatains)
+    removeIndex( MapIndex, index );
+  
+  if (!modeShift)
+    MapIndex.Clear();
+  
+  if(!anIsConatains)
     MapIndex.Add( index );
-    myActiveStudy->highlight( IObject, true, update );
-    emit currentSelectionChanged();
-    return true;
-  }
 
   if ( MapIndex.IsEmpty() ) {
     myMapIOSubIndex.UnBind( IObject );
     RemoveIObject( IObject, update );
   }
 
+  myActiveStudy->highlight( IObject, true, update );   
+
   emit currentSelectionChanged();
   return false;
 }
@@ -423,40 +450,33 @@ bool SALOME_Selection::AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)&
   QAD_Study* myActiveStudy = myDesktop->getActiveStudy();
   
   if ( !myMapIOSubIndex.IsBound( IObject ) ) {
-    TColStd_MapOfInteger Empty;
+    TColStd_IndexedMapOfInteger Empty;
     myMapIOSubIndex.Bind( IObject, Empty );
   }
-  TColStd_MapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
+  TColStd_IndexedMapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
   TColStd_MapIteratorOfMapOfInteger It;
   It.Initialize(theIndices);
   
-  bool add = true;
-  
-  if (MapIndex.Contains(It.Key()))
-    {
-      if (!modeShift) return add;
-      add = false;
-    }
-  else if (!modeShift)
+  if (!modeShift)
     MapIndex.Clear();
   
-  if (add) 
-    for(;It.More();It.Next())
-      MapIndex.Add(It.Key());
-  else
-    for(;It.More();It.Next())
-      MapIndex.Remove(It.Key());
-  
+  for(;It.More();It.Next())
+    MapIndex.Add(It.Key());
   
+  if ( MapIndex.IsEmpty() ) {
+    myMapIOSubIndex.UnBind( IObject );
+    RemoveIObject( IObject, update );
+  }
+
   myActiveStudy->highlight( IObject, true, update );   
-  if ( MapIndex.IsEmpty() )  myMapIOSubIndex.UnBind( IObject );
+
   emit currentSelectionChanged();
   
-  return add;
+  return !MapIndex.IsEmpty();
 }
 
 bool SALOME_Selection::AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)& IObject, 
-                                        const std::vector<int>& theIndices, 
+                                        const TContainerOfId& theIndices, 
                                         bool modeShift,
                                         bool update)
 {
@@ -464,42 +484,63 @@ bool SALOME_Selection::AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)&
   QAD_Study* myActiveStudy = myDesktop->getActiveStudy();
   
   if ( !myMapIOSubIndex.IsBound( IObject ) ) {
-    TColStd_MapOfInteger Empty;
+    TColStd_IndexedMapOfInteger Empty;
     myMapIOSubIndex.Bind( IObject, Empty );
   }
-  TColStd_MapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
+  TColStd_IndexedMapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
       
-  bool add = true;
-  
-  if (MapIndex.Contains(theIndices[0]))
-    {
-      if (!modeShift) return add;
-      add = false;
-    }
-  else if (!modeShift)
+  if (!modeShift)
     MapIndex.Clear();
   
-  if (add) 
-    for (int i=0; i<theIndices.size();i++)
-      MapIndex.Add(theIndices[i]); 
-  else
-    for (int i=0; i<theIndices.size();i++)
-      MapIndex.Remove(theIndices[i]);
-  
-  myActiveStudy->highlight( IObject, true, update );   
-  if ( MapIndex.IsEmpty() )  
+  TContainerOfId::const_iterator anIter = theIndices.begin();
+  TContainerOfId::const_iterator anIterEnd = theIndices.end();
+  for(; anIter != anIterEnd; anIter++)
+    MapIndex.Add(*anIter); 
+
+  if ( MapIndex.IsEmpty() ) {
     myMapIOSubIndex.UnBind( IObject );
+    RemoveIObject( IObject, update );
+  }
+
+  myActiveStudy->highlight( IObject, true, update );   
+
   emit currentSelectionChanged();
   
-  return add;
+  return !MapIndex.IsEmpty();
 }
 
 void SALOME_Selection::RemoveIndex( const Handle(SALOME_InteractiveObject)& IObject, int index )
 {
   if ( myMapIOSubIndex.IsBound( IObject ) ) {
-    TColStd_MapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
-    if ( MapIndex.Contains( index ) )
-      MapIndex.Remove( index );
+    TColStd_IndexedMapOfInteger& MapIndex = myMapIOSubIndex.ChangeFind( IObject );
+    removeIndex( MapIndex, index );
   }
 }
 
+void SALOME_Selection::ClearIndex()
+{
+  myMapIOSubIndex.Clear();  
+}
+
+
+//================================================================
+// Function : GEOMBase_Helper
+// Purpose  : Block signal currentSelectionChanged. Use this method to
+//            deactivate signal before big modification of selection.
+//            After this modification this signal must be activated and
+//            method SelectionChanged must be called to notify other oblects
+//            ( dialogs for example )
+//================================================================
+void SALOME_Selection::BlockSignals( const bool theState )
+{
+  blockSignals( theState );
+}
+
+//================================================================
+// Function : SelectionChanged
+// Purpose  : Enit signal currentSelectionChanged()
+//================================================================
+void SALOME_Selection::SelectionChanged()
+{
+  emit currentSelectionChanged();
+}
index 0058a1984c816667574ee9778300b7781adb58f9..a2e413262be456ce4d3d462b348985c4074b89cc 100644 (file)
@@ -43,7 +43,7 @@
 // Open CASCADE Include
 #include <TColStd_MapOfInteger.hxx>
 
-#include <vector>
+#include <set>
 
 enum Selection_Mode { 
  NodeSelection, 
@@ -96,13 +96,19 @@ public:
        
        bool                        HasIndex( const Handle(SALOME_InteractiveObject)& IObject );
        void                       GetIndex( const Handle(SALOME_InteractiveObject)& IObject, 
-                                            TColStd_MapOfInteger& theIndex );
+                                            TColStd_IndexedMapOfInteger& theIndex );
        
+       typedef std::set<int> TContainerOfId;
+
        bool                        AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)& IObject, int index, bool modeShift, bool update=true );
        bool                        AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)& IObject, const TColStd_MapOfInteger& theIndices, bool modeShift, bool update=true );
-       bool                        AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)& IObject, const std::vector<int>& theIndices, bool modeShift, bool update=true );
+       bool                        AddOrRemoveIndex( const Handle(SALOME_InteractiveObject)& IObject, const TContainerOfId& theIndices, bool modeShift, bool update=true );
        void                        RemoveIndex( const Handle(SALOME_InteractiveObject)& IObject, int index );
        bool                        IsIndexSelected(const Handle(SALOME_InteractiveObject)& IObject, int index);
+       void                        ClearIndex();
+
+       void                        BlockSignals( const bool );
+       void                        SelectionChanged();
 
 signals:
        void                        currentSelectionChanged();
index c7059d8558e11aaac706d96fa7b50dcf2248abd5..be0041573ccdceaadc3d2a23ea73207ec32ea75d 100644 (file)
 #include <iostream>
 
 #include "SALOME_Log.hxx"
-using namespace std;
-
-SALOME_Log* SALOME_Log::_singleton = 0;
 
-// log line size: if too short, log line is truncated, without crash...
-char SALOME_LogStr[1024]; 
+using namespace std;
 
-SALOME_Log::SALOME_Log(): ostrstream(SALOME_LogStr,sizeof(SALOME_LogStr))
+SALOME_Log::SALOME_Log()
 {
 }
 
@@ -45,10 +41,10 @@ SALOME_Log::~SALOME_Log()
 {
 }
 
-SALOME_Log* SALOME_Log::Instance()
+SALOME_Log& SALOME_Log::Instance()
 {
-  if (_singleton == 0) _singleton = new SALOME_Log();
-  return _singleton;
+  static SALOME_Log instance;
+  return instance;
 }
 
 void SALOME_Log::putMessage(std::ostream& msg)
@@ -59,4 +55,3 @@ void SALOME_Log::putMessage(std::ostream& msg)
   seekp(0);
 }
 
-
index 30694062bf28f0e6f04d1605b88af6745b08c826..c92699457dee3cc06df70562078bb9a405069ba6 100644 (file)
@@ -29,6 +29,9 @@
 #ifndef _SALOME_LOG_HXX_
 #define _SALOME_LOG_HXX_
 
+#include <iostream>
+#include <strstream>
+
 //these declarations for files don't using OCC includes (for example HDF)
 # ifdef WNT
 
 # endif  /* WNT */
 
 
-
-#include <iostream>
-#include <strstream>
-
-using namespace std;
-
-class SALOME_Log : public ostrstream
+class SALOME_Log : public std::ostrstream
 {
-private:
-  static SALOME_Log* _singleton;
-protected:
-  //disable creation of instances: force use static SALOME_Log& Instance()
-  SALOME_Log();
 public:
   virtual ~SALOME_Log();
-  static Standard_EXPORT SALOME_Log* Instance();
+  static Standard_EXPORT SALOME_Log& Instance();
   Standard_EXPORT void putMessage(std::ostream& msg);
+
+protected:
+  //disable creation of instances: force use static SALOME_Log& Instance()
+  SALOME_Log();
 };
 
+
 #define SLog SALOME_Log::Instance()
 
 #endif
index a468e9ffe6826e5acc737ee09d6a4f0afebd1128..d876a7350ebe5988a7fc33c85c7d0893d050d832 100644 (file)
@@ -36,16 +36,19 @@ using namespace std;
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(Logger)
 
-SALOME_Logger::Logger_ptr m_pInterfaceLogger; // object reference on Logger server
+#include "utilities.h"
 
-SALOME_Log* SALOME_Log::_singleton = 0;
+// class SALOME_LoggerClient : public SALOME_Log
+// {
+// protected:
+//   SALOME_Logger::Logger_var m_pInterfaceLogger; // object reference on Logger server
+// };
 
-// log line size: if too short, log line is truncated, without crash...
-char SALOME_LogStr[1024]; 
+SALOME_Logger::Logger_ptr m_pInterfaceLogger; // object reference on Logger server
 
-SALOME_Log::SALOME_Log(): ostrstream(SALOME_LogStr,sizeof(SALOME_LogStr))
+SALOME_Log::SALOME_Log()
 {
-  cout << "SALOME_LoggerClient: constructor" << endl;
+  MESSAGE("SALOME_LoggerClient: constructor");
   //get reference on object reference from NS
   //and initialize m_pInterfaceLogger 
 
@@ -86,11 +89,11 @@ SALOME_Log::SALOME_Log(): ostrstream(SALOME_LogStr,sizeof(SALOME_LogStr))
            }  
          catch( CORBA::COMM_FAILURE& )
            {
-             cout<<"SALOME_LoggerClient: CORBA::COMM_FAILURE: Unable to contact the Naming Service"<<endl;
+             MESSAGE("SALOME_LoggerClient: CORBA::COMM_FAILURE: Unable to contact the Naming Service");
            }
           catch(...)
            {
-             cout<<"SALOME_LoggerClient: Unknown exception dealing with Naming Service"<<endl;
+             MESSAGE("SALOME_LoggerClient: Unknown exception dealing with Naming Service");
            }
          
          if(!CORBA::is_nil(inc))
@@ -98,30 +101,30 @@ SALOME_Log::SALOME_Log(): ostrstream(SALOME_LogStr,sizeof(SALOME_LogStr))
              obj = inc->resolve(name);
              m_pInterfaceLogger = SALOME_Logger::Logger::_narrow(obj);
              if (!CORBA::is_nil(m_pInterfaceLogger))
-               cout<<"SALOME_LoggerClient: Logger Server was found"<<endl;
+               MESSAGE("SALOME_LoggerClient: Logger Server was found");
              break;
            }
        }          
     }
   catch (const CosNaming::NamingContext::NotFound&)
     {
-      //       cout << "Caught exception: Naming Service can't found Logger";
+      //       MESSAGE("Caught exception: Naming Service can't found Logger");
     }
   catch (CORBA::COMM_FAILURE&)
     {
-      //       cout << "Caught CORBA::SystemException CommFailure.";
+      //       MESSAGE("Caught CORBA::SystemException CommFailure.");
     }
   catch (CORBA::SystemException&)
     {
-      //       cout << "Caught CORBA::SystemException.";
+      //       MESSAGE("Caught CORBA::SystemException.");
     }
   catch (CORBA::Exception&)
     {
-      //       cout << "Caught CORBA::Exception.";
+      //       MESSAGE("Caught CORBA::Exception.");
     }
   catch (...)
     {
-      //       cout << "Caught unknown exception.";
+      //       MESSAGE("Caught unknown exception.");
     }
   //cerr << "-----SALOME_Trace::SALOME_Trace----"<<endl;
 }
@@ -130,10 +133,10 @@ SALOME_Log::~SALOME_Log()
 {
 }
 
-SALOME_Log* SALOME_Log::Instance()
+SALOME_Log& SALOME_Log::Instance()
 {
-  if (_singleton == 0) _singleton = new SALOME_Log();
-  return _singleton;
+  static SALOME_Log instance;
+  return instance;
 }
 
 void SALOME_Log::putMessage(std::ostream& msg)
index 20a0edfe773dc707c439d73ac614cac8137376a5..d23fcf57111da44f233ad9874f897d6f28accbb8 100644 (file)
@@ -94,7 +94,8 @@ void SALOME_PYQT_GUI::initInterp(int StudyID)
      * The creation of Python interpretor must be protected par a C++ Lock because of C threads
      */
     ThreadLock aPyLock = GetPyThreadLock("SALOME_PYQT_GUI::initInterp");
-    interp=new PyInterp_PyQt();
+    interp = new PyInterp_PyQt();
+    interp->initialize();
     mapInterp[StudyID] = interp;
   }
   // imports Python GUI module and puts it in _module attribute
@@ -134,6 +135,7 @@ bool SALOME_PYQT_GUI::OnGUIEvent (int theCommandID,
                                  QAD_Desktop* parent)
 {
   MESSAGE("SALOME_PYQT_GUI::OnGUIEvent");
+  ThreadLock aPyLock = GetPyThreadLock("SALOME_PYQT_GUI::OnGUIEvent");
   PyLockWrapper aLock = interp->GetLockWrapper();
 
   PyObjWrapper res(PyObject_CallMethod(_module,"OnGUIEvent","i",theCommandID));
index f06796eb72e00ec289297ced8f0e15b032e5f128..c997d9fa6b0d949450beec71b309c1003e986131 100644 (file)
@@ -180,8 +180,8 @@ def CheckCopyPaste(theSO, theInfo ,theComponentPaste):
     if theComponentPaste:
         aSObj = theSO.GetFatherComponent()
         theInfo = theInfo + "(paste for component)"
-    if not myStudyManager.Paste(aSObj):
-        raise RuntimeError, "<Paste> for "+theInfo+" returns false"
+    if myStudyManager.Paste(aSObj) == None:
+        raise RuntimeError, "<Paste> for "+theInfo+" returns None object"
     aNewTree = GetTree(aRoot)
     aLen = len(aTree)
     for a in range(0,aLen):
@@ -213,16 +213,24 @@ def FindFileInDataDir(filename):
         
 #--------------------------------------------------------------------------
 # initialise the ORB
-orb = CORBA.ORB_init([''], CORBA.ORB_ID)
+orb = None
+
+while orb == None:
+    orb = CORBA.ORB_init([''], CORBA.ORB_ID)
 
 # create an LifeCycleCORBA instance
 lcc = LifeCycleCORBA(orb)
 
+while lcc._catalog == None:
+    lcc = LifeCycleCORBA(orb)
+
 #create a naming service instance
 naming_service = SALOME_NamingServicePy_i(orb)
 
 # get Study Manager reference
-obj = naming_service.Resolve('myStudyManager')
+obj=None
+while obj == None:
+    obj = naming_service.Resolve('myStudyManager') 
 myStudyManager = obj._narrow(SALOMEDS.StudyManager)
 
 # create new study
@@ -239,3 +247,4 @@ myStudyName = myStudy._get_Name()
 myStudyId = myStudy._get_StudyId()
 print myStudyId
 
+
index 2a8196dc0aaf3d8cb8574ea814e438e515acc535..a1e63a6ccc34720bce76cc2b0078ebb5fd37e276 100644 (file)
@@ -95,7 +95,7 @@ idbox = geompy.addToStudy(box,"box")
 
 subShapeList=geompy.SubShapeAll(box,ShapeTypeFace)
 face=subShapeList[0]
-name = geompy.SubShapeName( face._get_Name(), box._get_Name() )
+name = geompy.SubShapeName(face, box)
 print name
 idface=geompy.addToStudyInFather(box,face,name)
 
@@ -103,7 +103,7 @@ idface=geompy.addToStudyInFather(box,face,name)
 
 subShellList=geompy.SubShapeAll(box,ShapeTypeShell)
 shell = subShellList[0]
-name = geompy.SubShapeName( shell._get_Name(), box._get_Name() )
+name = geompy.SubShapeName(shell, box)
 print name
 idshell=geompy.addToStudyInFather(box,shell,name)
 
@@ -111,7 +111,7 @@ idshell=geompy.addToStudyInFather(box,shell,name)
 
 edgeList = geompy.SubShapeAll(face,ShapeTypeEdge)
 edge=edgeList[0];
-name = geompy.SubShapeName( edge._get_Name(), face._get_Name() )
+name = geompy.SubShapeName(edge, face)
 print name
 idedge=geompy.addToStudyInFather(face,edge,name)
 
index 42aeafdf3a73e460bac6a82d04bb3155bd3c1981..05edf9581a2fed40191ddafe1b9d18b31772ffc6 100644 (file)
@@ -87,7 +87,7 @@ class QAD_EXPORT SUPERVGraph_ViewFrame : public QAD_ViewFrame {
 
 
   /* selection */
-  Handle(SALOME_InteractiveObject) FindIObject(const char* Entry) { };
+  Handle(SALOME_InteractiveObject) FindIObject(const char* Entry) { Handle(SALOME_InteractiveObject) o; return o; };
 
   /* display */                
   void           Display(const Handle(SALOME_InteractiveObject)& IObject, bool immediatly = true){};
index 2072c8e84d02cb3464bcfa7d2497693095fbb50b..01c5872213ed99e30936b984278c4ad25d51c276 100644 (file)
@@ -42,7 +42,8 @@ LIB = libSalomeSession.la
 LIB_SRC=\
        SALOME_Session_i.cxx \
        Session_ServerThread.cxx \
-       Session_ServerLauncher.cxx
+       Session_ServerLauncher.cxx \
+       SALOME_Session_SignalsHandler.cxx
 
 # Executables targets
 BIN = SALOME_Session_Server
@@ -52,7 +53,7 @@ BIN_CLIENT_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Component.idl SALOM
 
 CPPFLAGS+=$(QT_MT_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) $(HDF5_INCLUDES)
 CXXFLAGS+=$(OCC_CXXFLAGS)
-LDFLAGS+=$(QT_MT_LIBS) $(HDF5_LIBS) -lSalomeHDFPersist -lSalomeNS -lSalomeGUI -lSalomeObject -lSalomeLifeCycleCORBA -lqsplitterP -lOpUtil -lPlot2d -lSalomeVTKFilter -lSALOMELocalTrace -lSalomeContainer -lRegistry -lSalomeNotification -lSalomeDS -lTOOLSDS -lSalomeGenericObj -lSalomeCatalog -lEvent
+LDFLAGS+=$(QT_MT_LIBS) $(HDF5_LIBS) -lSalomeHDFPersist -lSalomeNS -lSalomeGUI -lSalomeObject -lSalomeLifeCycleCORBA -lqsplitterP -lOpUtil -lPlot2d -lSalomeVTKFilter -lSALOMELocalTrace -lSalomeContainer -lRegistry -lSalomeNotification -lSalomeDS -lTOOLSDS -lSalomeGenericObj -lSalomeCatalog -lEvent -lSalomePrs $(CAS_LDPATH) -lTKBO -lCASCatch
 
 
 @CONCLUDE@
index b4e40e63f2e17c6459c4342617b5bb41a75b1386..cd9060a3ccadc043b4b5ef4632bfad463e5442a9 100644 (file)
@@ -31,7 +31,6 @@
 #include "SALOME_NamingService.hxx"
 #include <iostream>
 #include <unistd.h>
-using namespace std;
 
 #include <qthread.h> 
 #include <qapplication.h>
@@ -46,11 +45,10 @@ using namespace std;
 #include "QAD_Config.h"
 #include "QAD_Tools.h"
 #include "QAD_ResourceMgr.h"
-#include "Utils_CatchSignals.h"
 #include "Utils_SALOME_Exception.hxx"
 #include "Utils_CorbaException.hxx"
 #include "SALOMEGUI_QtCatchCorbaException.hxx"
-
+#include "SALOME_Event.hxx"
 
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOME_Session)
@@ -62,18 +60,14 @@ using namespace std;
 
 #include "Session_ServerLauncher.hxx"
 
+extern "C" int HandleSignals(QApplication *theQApplication);
+
 /*! - read arguments, define list of server to launch with their arguments.
  *  - wait for naming service
  *  - create and run a thread for launch of all servers
  *  
  */
 
-// ----------------------------------------------------------------------------
-
-
-
-// ----------------------------------------------------------------------------
-
 //! CORBA server for SALOME Session
 /*!
  *  SALOME_Session Server launches a SALOME session servant.
@@ -86,10 +80,20 @@ using namespace std;
  *   - get session state
  */
 
+using namespace std;
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
 int main(int argc, char **argv)
 {
   try
     {
+      SALOME_Event::GetSessionThread();
+
       ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
       ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
       int orbArgc = 1;
@@ -104,11 +108,7 @@ int main(int argc, char **argv)
 
       SALOME_NamingService *_NS = new SALOME_NamingService(orb);
 
-      Utils_CatchSignals aCatch;
-      aCatch.Activate();
-
       // CORBA Servant Launcher
-
       QMutex _GUIMutex ;
       QWaitCondition _ServerLaunch;
       _GUIMutex.lock();     // to block Launch server thread until wait(mutex)
@@ -117,34 +117,37 @@ int main(int argc, char **argv)
        = new Session_ServerLauncher(argc, argv, orb, poa, &_GUIMutex, &_ServerLaunch);
       myServerLauncher->start();
 
-      MESSAGE("waiting wakeAll()");
-      _ServerLaunch.wait(&_GUIMutex); // to be reseased by Launch server thread when ready:
-      // atomic operation lock - unlock on mutex
-      // unlock mutex: serverThread runs, calls  _ServerLaunch->wakeAll()
-      // this thread wakes up, and lock mutex
+      QApplication *_qappl = 0;
+
+      // Allow multiple activation/deactivation of GUI
+      while ( 1 ) {
+       MESSAGE("waiting wakeAll()");
+       _ServerLaunch.wait(&_GUIMutex); // to be reseased by Launch server thread when ready:
+       // atomic operation lock - unlock on mutex
+       // unlock mutex: serverThread runs, calls  _ServerLaunch->wakeAll()
+       // this thread wakes up, and lock mutex
+
+       INFOS("Session activated, Launch IAPP...");
 
-      INFOS("Session activated, Launch IAPP...");
+       int qappArgc = 1;
+       if ( !_qappl )
+         _qappl = new QApplication(qappArgc, argv );
 
-      int qappArgc = 1;
-      QApplication *_qappl = new QApplication(qappArgc, argv );
-      INFOS("creation QApplication");
-      _GUIMutex.unlock();
+       INFOS("creation QApplication");
+       _GUIMutex.unlock();
 
-      QAD_ASSERT ( QObject::connect(_qappl, SIGNAL(lastWindowClosed()), _qappl, SLOT(quit()) ) );
-      SALOMEGUI_Application* _mw = new SALOMEGUI_Application ( "MDTV-Standard", "HDF", "hdf" );
-      INFOS("creation SALOMEGUI_Application");
-      
-      SCRUTE(_NS);
-      if ( !SALOMEGUI_Application::addToDesktop ( _mw, _NS ) )
-       {
+       QAD_ASSERT ( QObject::connect(_qappl, SIGNAL(lastWindowClosed()), _qappl, SLOT(quit()) ) );
+       SALOMEGUI_Application* _mw = new SALOMEGUI_Application ( "MDTV-Standard", "HDF", "hdf" );
+       INFOS("creation SALOMEGUI_Application");
+       
+       SCRUTE(_NS);
+       if ( !SALOMEGUI_Application::addToDesktop ( _mw, _NS ) ) {
          QAD_MessageBox::error1 ( 0,
                                   QObject::tr("ERR_ERROR"), 
                                   QObject::tr("ERR_APP_INITFAILED"),
                                   QObject::tr("BUT_OK") );
        }
-      else
-       {
-         
+       else {
          QFileInfo prgInfo(argv[0]);
          QDir prgDir(prgInfo.dirPath(true));
          QAD_CONFIG->setPrgDir(prgDir);        // CWD is program directory
@@ -154,77 +157,76 @@ int main(int argc, char **argv)
          
          _qappl->setPalette( QAD_Application::getPalette() ); 
 
-         //Utils_CatchSignals aCatch;
-         //aCatch.Activate();
-
          /* Run 'SALOMEGUI' application */
          QAD_Application::run();
 
          // T2.12 - catch exceptions thrown on attempts to modified a locked study
-         while (1) 
-           {
-             try 
-               {
-                 MESSAGE("run(): starting the main event loop");
-                 int _ret = _qappl->exec();
-                 break;
-               }
-             catch (SALOME::SALOME_Exception& e)
-               {
-                 QtCatchCorbaException(e);
-               }
-             catch(SALOMEDS::StudyBuilder::LockProtection&)
-               {
-                 INFOS("run(): An attempt to modify a locked study has not been handled by QAD_Operation");
-                 QApplication::restoreOverrideCursor();
-                 QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
-                                         QObject::tr("WRN_WARNING"), 
-                                         QObject::tr("WRN_STUDY_LOCKED"),
-                                         QObject::tr("BUT_OK") );
-               }
-             catch (const CORBA::Exception& e)
-               {
-                 CORBA::Any tmp;
-                 tmp<<= e;
-                 CORBA::TypeCode_var tc = tmp.type();
-                 const char *p = tc->name();
-                 INFOS ("run(): CORBA exception of the kind : "<<p<< " is caught");
+         while (1) {
+           try 
+             {
+               MESSAGE("run(): starting the main event loop");
+               int _ret = HandleSignals(_qappl);
+               break;
+             }
+           catch (SALOME::SALOME_Exception& e)
+             {
+               QtCatchCorbaException(e);
+             }
+           catch(SALOMEDS::StudyBuilder::LockProtection&)
+             {
+               INFOS("run(): An attempt to modify a locked study has not been handled by QAD_Operation");
+               QApplication::restoreOverrideCursor();
+               QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
+                                      QObject::tr("WRN_WARNING"), 
+                                      QObject::tr("WRN_STUDY_LOCKED"),
+                                      QObject::tr("BUT_OK") );
+             }
+           catch (const CORBA::Exception& e)
+             {
+               CORBA::Any tmp;
+               tmp<<= e;
+               CORBA::TypeCode_var tc = tmp.type();
+               const char *p = tc->name();
+               INFOS ("run(): CORBA exception of the kind : "<<p<< " is caught");
 
-                 QApplication::restoreOverrideCursor();
-                 QAD_MessageBox::error1 ( (QWidget*)QAD_Application::getDesktop(),
-                                          QObject::tr("ERR_ERROR"), 
-                                          QObject::tr("ERR_APP_EXCEPTION")
-                                          + QObject::tr(" CORBA exception ") + QObject::tr(p),
-                                          QObject::tr("BUT_OK") );
-               }
-             catch(std::exception& e)
-               {
-                 INFOS("run(): An exception has been caught");
-                 QApplication::restoreOverrideCursor();
-                 QAD_MessageBox::error1 ( (QWidget*)QAD_Application::getDesktop(),
-                                          QObject::tr("ERR_ERROR"), 
-                                          QObject::tr("ERR_APP_EXCEPTION")+ " " +QObject::tr(e.what()),
-                                          QObject::tr("BUT_OK") );
-               }
-             catch(...)
-               {
-                 INFOS("run(): An exception has been caught");
-                 QApplication::restoreOverrideCursor();
-                 QAD_MessageBox::error1 ( (QWidget*)QAD_Application::getDesktop(),
-                                          QObject::tr("ERR_ERROR"), 
-                                          QObject::tr("ERR_APP_EXCEPTION"),
-                                          QObject::tr("BUT_OK") );
-               }
-           }
-         //aCatch.Deactivate();
+               QApplication::restoreOverrideCursor();
+               QAD_MessageBox::error1 ( (QWidget*)QAD_Application::getDesktop(),
+                                       QObject::tr("ERR_ERROR"), 
+                                       QObject::tr("ERR_APP_EXCEPTION")
+                                       + QObject::tr(" CORBA exception ") + QObject::tr(p),
+                                       QObject::tr("BUT_OK") );
+             }
+           catch(std::exception& e)
+             {
+               INFOS("run(): An exception has been caught");
+               QApplication::restoreOverrideCursor();
+               QAD_MessageBox::error1 ( (QWidget*)QAD_Application::getDesktop(),
+                                       QObject::tr("ERR_ERROR"), 
+                                       QObject::tr("ERR_APP_EXCEPTION")+ "\n" +QObject::tr(e.what()),
+                                       QObject::tr("BUT_OK") );
+             }
+           catch(...)
+             {
+               INFOS("run(): An exception has been caught");
+               QApplication::restoreOverrideCursor();
+               QAD_MessageBox::error1 ( (QWidget*)QAD_Application::getDesktop(),
+                                       QObject::tr("ERR_ERROR"), 
+                                       QObject::tr("ERR_APP_EXCEPTION"),
+                                       QObject::tr("BUT_OK") );
+             }
+         }
          QString confMsg = "Settings create " 
            + QAD_CONFIG->getConfigDir().absPath() + "/" + QObject::tr("MEN_APPNAME") + ".conf";
          MESSAGE (confMsg);
          QAD_CONFIG->createConfigFile(true);
        }
+
+       // Prepare _GUIMutex for a new GUI activation
+       _GUIMutex.lock(); 
+      }
+
       //orb->shutdown(0);
       myServerLauncher->KillAll();
-      aCatch.Deactivate();
     }
   catch (SALOME_Exception& e)
     {
@@ -251,6 +253,5 @@ int main(int argc, char **argv)
     {
       INFOS("Caught unknown exception.");
     }
-  MESSAGE("End of SALOME_Session_Server");
   return 0 ;
 }
diff --git a/src/Session/SALOME_Session_SignalsHandler.cxx b/src/Session/SALOME_Session_SignalsHandler.cxx
new file mode 100644 (file)
index 0000000..c02f613
--- /dev/null
@@ -0,0 +1,38 @@
+//  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 
+
+
+#include <stdexcept>
+#include <qapplication.h>
+
+#include "CASCatch_SignalsHandler.h" // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
+
+
+extern "C" int HandleSignals(QApplication *theQApplication)
+{
+  CASCatch_SignalsHandler aSignalsHandler;
+  int aRet = -1;
+  try {
+    aRet = theQApplication->exec();
+  }catch(Standard_Failure){
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+    throw std::runtime_error(aFail->GetMessageString());
+  }
+  return aRet;
+}
index 89002812778d13903f45145f887d4affe473bb1b..7e6c34c8699a52601fef7e4bcf2fc05330a1b7c4 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "SALOME_Session_i.hxx"
 #include "SALOME_NamingService.hxx"
-#include "SALOME_Session_QThread.hxx"
+#include "SALOME_Event.hxx"
 
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
@@ -48,7 +48,12 @@ using namespace std;
  */ 
 //=============================================================================
 
-SALOME_Session_i::SALOME_Session_i(int argc, char ** argv, CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, QMutex* GUIMutex)
+SALOME_Session_i::SALOME_Session_i(int argc, 
+                                  char ** argv, 
+                                  CORBA::ORB_ptr orb, 
+                                  PortableServer::POA_ptr poa, 
+                                  QMutex* GUIMutex,
+                                  QWaitCondition* GUILauncher)
 {
   _argc = argc ;
   _argv = argv ;
@@ -57,7 +62,8 @@ SALOME_Session_i::SALOME_Session_i(int argc, char ** argv, CORBA::ORB_ptr orb, P
   _orb = CORBA::ORB::_duplicate(orb) ;
   _poa = PortableServer::POA::_duplicate(poa) ;
   _GUIMutex = GUIMutex;
-  MESSAGE("constructor end");
+  _GUILauncher = GUILauncher;
+  //MESSAGE("constructor end");
 }
 
 //=============================================================================
@@ -68,7 +74,7 @@ SALOME_Session_i::SALOME_Session_i(int argc, char ** argv, CORBA::ORB_ptr orb, P
 
 Engines::Component_ptr SALOME_Session_i::GetVisuComponent()
 {
-  MESSAGE("SALOME_Session_i::GetVisuGen");
+  //MESSAGE("SALOME_Session_i::GetVisuGen");
   typedef Engines::Component_ptr TGetImpl(CORBA::ORB_ptr,
                                         PortableServer::POA_ptr,
                                         SALOME_NamingService*,QMutex*);
@@ -87,7 +93,7 @@ Engines::Component_ptr SALOME_Session_i::GetVisuComponent()
 
 SALOME_Session_i::~SALOME_Session_i()
 {
-  MESSAGE("destructor end"); 
+  //MESSAGE("destructor end"); 
 }
 
 //=============================================================================
@@ -114,7 +120,7 @@ void SALOME_Session_i::NSregister()
     {
       INFOS("Caught unknown exception from Naming Service");
     }
-  MESSAGE("Session registered in Naming Service"); 
+  //MESSAGE("Session registered in Naming Service"); 
 }
 
 //=============================================================================
@@ -126,14 +132,10 @@ void SALOME_Session_i::NSregister()
 
 void SALOME_Session_i::GetInterface()
 {
-  _GUIMutex->lock() ;       // get access to boolean _isGUI
-  //_isGUI = _IAPPThread->running();
-  if(!_isGUI)
-    {
-      _isGUI = TRUE ; 
-      //_IAPPThread->start() ;
-    }
-  _GUIMutex->unlock() ; // release access to boolean _isGUI 
+  if( !QAD_Application::getDesktop() ) {
+    _GUILauncher->wakeAll();
+    MESSAGE("SALOME_Session_i::GetInterface() called, starting GUI...")
+  }
 }
 
 //=============================================================================
@@ -141,12 +143,18 @@ void SALOME_Session_i::GetInterface()
  *  Kills the session if there are no active studies nore GUI
  */ 
 //=============================================================================
+class CloseEvent : public SALOME_Event
+{
+public:
+  virtual void Execute() {
+    if ( QAD_Application::getDesktop() )
+      QAD_Application::getDesktop()->closeDesktop( true );
+  }
+};
 
 void SALOME_Session_i::StopSession()
 {
-  qApp->lock();
-  QAD_Application::getDesktop()->closeDesktop( true );
-  qApp->unlock();
+  ProcessVoidEvent( new CloseEvent() );
 }
  
 //=============================================================================
@@ -156,23 +164,29 @@ void SALOME_Session_i::StopSession()
  */ 
 //=============================================================================
 
+class QtLock
+{
+public:
+  QtLock() { if ( qApp ) qApp->lock(); }
+  ~QtLock() { if ( qApp ) qApp->unlock(); }
+};
+
+
 SALOME::StatSession SALOME_Session_i::GetStatSession()
 {
   // update Session state
-  //qApp->lock(); // rollback bug 
   _GUIMutex->lock();    
-  //_isGUI = _IAPPThread->running();
-  _isGUI = 1;
+
   _runningStudies = 0;
-  if (_isGUI)
-    {
-      qApp->lock();
-      if ( QAD_Application::getDesktop() && QAD_Application::getDesktop()->getActiveApp() )
-       _runningStudies = QAD_Application::getDesktop()->getActiveApp()->getStudies().count();
-      qApp->unlock();
-    }
+  {
+    QtLock lock;
+    _isGUI = QAD_Application::getDesktop();
+    if ( _isGUI && QAD_Application::getDesktop()->getActiveApp() )
+      _runningStudies = QAD_Application::getDesktop()->getActiveApp()->getStudies().count();
+  }
+
   _GUIMutex->unlock();
-  //qApp->unlock();
+
   // getting stat info
   SALOME::StatSession_var myStats = new SALOME::StatSession ;
   if (_runningStudies)
@@ -184,3 +198,11 @@ SALOME::StatSession SALOME_Session_i::GetStatSession()
   return myStats._retn() ;
 }
 
+CORBA::Long SALOME_Session_i::GetActiveStudyId()
+{
+  long aStudyId=-1;
+  if( QAD_Application::getDesktop() && QAD_Application::getDesktop()->getActiveStudy()) {
+    aStudyId = QAD_Application::getDesktop()->getActiveStudy()->getStudyId();
+  }
+  return aStudyId;
+}
index 438b93f62aeb2c105f35bb9eeca361ac9980e4a2..b6820e5af22f909533b3d6bef0c0910bbf3f1875 100644 (file)
@@ -41,7 +41,12 @@ class SALOME_Session_i:  public virtual POA_SALOME::Session,
                         public virtual PortableServer::RefCountServantBase
 {
 public:
-  SALOME_Session_i(int argc, char ** argv, CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, QMutex* GUIMutex);
+  SALOME_Session_i(int argc, 
+                   char ** argv, 
+                   CORBA::ORB_ptr orb, 
+                   PortableServer::POA_ptr poa, 
+                   QMutex* GUIMutex,
+                   QWaitCondition* GUILauncher);
   ~SALOME_Session_i();
 
   //! Launch Graphical User Interface
@@ -58,6 +63,8 @@ public:
 
   //! Register the servant to Naming Service
   void NSregister();
+
+  CORBA::Long GetActiveStudyId();
   
   void ping(){};
 
@@ -70,6 +77,7 @@ protected:
   char **_argv;
   CORBA::Boolean _isGUI ;
   QMutex* _GUIMutex ;
+  QWaitCondition* _GUILauncher;
   int _runningStudies ;
   CORBA::ORB_var _orb;
   PortableServer::POA_var _poa;
index 4f278190b24de39e6c5b94b318bf7c444007cbff..8cbfce4de90f93c958d7ef88163f1da7e2a6f952 100644 (file)
@@ -81,15 +81,14 @@ Session_ServerLauncher::~Session_ServerLauncher()
 
 void Session_ServerLauncher::run()
 {
-  MESSAGE("Session_ServerLauncher::run");
+  //MESSAGE("Session_ServerLauncher::run");
   _GUIMutex->lock(); // lock released by calling thread when ready: wait(mutex)
-   MESSAGE("Server Launcher thread free to go...");
+  //MESSAGE("Server Launcher thread free to go...");
    _GUIMutex->unlock();
 
   CheckArgs();
   ActivateAll();
 
-  _ServerLaunch->wakeAll();
   _orb->run();       // this thread wait, during omniORB process events
 }
 
@@ -207,8 +206,8 @@ void Session_ServerLauncher::ActivateAll()
   int argc=1;
   char** argv = new char*[argc];
   argv[0] = "Session";
-  Session_ServerThread* aServerThread
-    = new Session_ServerThread(argc, argv, _orb,_root_poa,_GUIMutex);
+  Session_SessionThread* aServerThread
+    = new Session_SessionThread(argc, argv, _orb,_root_poa,_GUIMutex,_ServerLaunch);
   _serverThreads.push_front(aServerThread);
 
   aServerThread->Init();
index e5e4f055c69054b9102a72a5f18c574120813958..be3f1a4f22b5dfd688ce4889073aabb394c6a92a 100644 (file)
@@ -137,7 +137,7 @@ Session_ServerThread::Session_ServerThread(int argc,
                                           PortableServer::POA_ptr poa,
                                           QMutex *GUIMutex)
 {
-  MESSAGE("Session_ServerThread Constructor " << argv[0]);
+  //MESSAGE("Session_ServerThread Constructor " << argv[0]);
   _argc = argc;
   _argv = argv;
   _orb = CORBA::ORB::_duplicate(orb);
@@ -156,7 +156,7 @@ Session_ServerThread::Session_ServerThread(int argc,
 
 Session_ServerThread::~Session_ServerThread()
 {
-  MESSAGE("~Session_ServerThread "<< _argv[0]);
+  //MESSAGE("~Session_ServerThread "<< _argv[0]);
 }
 
 //=============================================================================
@@ -473,12 +473,33 @@ void Session_ServerThread::ActivateContainer(int argc,
 
 void Session_ServerThread::ActivateSession(int argc,
                                           char ** argv)
+{
+  MESSAGE("Session_ServerThread::ActivateSession() not implemented!");
+}
+
+Session_SessionThread::Session_SessionThread(int argc,
+                                            char** argv, 
+                                            CORBA::ORB_ptr orb, 
+                                            PortableServer::POA_ptr poa,
+                                            QMutex* GUIMutex,
+                                            QWaitCondition* GUILauncher)
+: Session_ServerThread(argc, argv, orb, poa, GUIMutex),
+  _GUILauncher( GUILauncher )
+{
+}
+
+Session_SessionThread::~Session_SessionThread()
+{
+}
+
+void Session_SessionThread::ActivateSession(int argc,
+                                           char ** argv)
 {
     try
       {
        INFOS("Session thread started");
        SALOME_Session_i * mySALOME_Session
-         = new SALOME_Session_i(argc, argv, _orb, _root_poa, _GUIMutex) ;
+         = new SALOME_Session_i(argc, argv, _orb, _root_poa, _GUIMutex, _GUILauncher) ;
        PortableServer::ObjectId_var mySALOME_Sessionid
          = _root_poa->activate_object(mySALOME_Session);
        INFOS("poa->activate_object(mySALOME_Session)");
index 3c12b138e8955e9b8b1402a26555818ebe75fb45..73737cb457a254611086f440428c4c5411932e4f 100644 (file)
@@ -63,10 +63,10 @@ protected:
                        char ** argv);
   void ActivateContainer(int argc,
                        char ** argv);
-  void ActivateSession(int argc,
+  virtual void ActivateSession(int argc,
                        char ** argv);
 
-private:
+protected:
   int _argc;
   char ** _argv;
   int _servType;
@@ -76,5 +76,24 @@ private:
   SALOME_NamingService *_NS;
 };
 
+class Session_SessionThread : public Session_ServerThread
+{
+public:
+  Session_SessionThread() {}
+  Session_SessionThread(int argc,
+                      char** argv, 
+                      CORBA::ORB_ptr orb, 
+                      PortableServer::POA_ptr poa,
+                      QMutex* GUIMutex,
+                       QWaitCondition* GUILauncher);
+  virtual ~Session_SessionThread();  
+
+protected:
+  virtual void ActivateSession(int argc,
+                       char ** argv);
+private:
+  QWaitCondition* _GUILauncher;
+};
+
 #endif
 
index 210c4273940dd87f805f6bcb09f2db8f3f3ec543..f14dcade09068e399e3032ab2f71f232c5863b0d 100644 (file)
@@ -31,7 +31,7 @@ using namespace std;
 // function : GetTempDir
 // purpose  : Return a temp directory to store created files like "/tmp/sub_dir/" 
 //============================================================================ 
-char* SALOMEDS_Tool::GetTmpDir()
+std::string SALOMEDS_Tool::GetTmpDir()
 {
   //Find a temporary directory to store a file
 
@@ -83,7 +83,7 @@ char* SALOMEDS_Tool::GetTmpDir()
   OSD_Protection aProtection(OSD_RW, OSD_RWX, OSD_RX, OSD_RX);
   aDir.Build(aProtection);
 
-  return CORBA::string_dup(aTmpDir.ToCString());
+  return aTmpDir.ToCString();
 }
 
 //============================================================================
@@ -105,6 +105,10 @@ void SALOMEDS_Tool::RemoveTemporaryFiles(const char* theDirectory,
     OSD_File anOSDFile(anOSDPath);
     if(!anOSDFile.Exists()) continue;
 
+    OSD_Protection aProtection = anOSDFile.Protection();
+    aProtection.SetUser(OSD_RW);
+    anOSDFile.SetProtection(aProtection);
+
     anOSDFile.Remove();
   }
 
@@ -128,7 +132,9 @@ SALOMEDS_Tool::PutFilesToStream(const char* theFromDirectory,
                                const int theNamesOnly)
 {
   int i, aLength = theFiles.length();
-  if(aLength == 0) return NULL;
+  if(aLength == 0)
+//    return NULL;
+    return (new SALOMEDS::TMPFile);
 
   TCollection_AsciiString aTmpDir(const_cast<char*>(theFromDirectory)); //Get a temporary directory for saved a file
 
@@ -146,7 +152,7 @@ SALOMEDS_Tool::PutFilesToStream(const char* theFromDirectory,
     //Check if the file exists
     
     if (!theNamesOnly) { // mpv 15.01.2003: if only file names must be stroed, then size of files is zero
-      TCollection_AsciiString aFullPath = aTmpDir + strdup(theFiles[i]);   
+      TCollection_AsciiString aFullPath = aTmpDir + CORBA::string_dup(theFiles[i]);   
       OSD_Path anOSDPath(aFullPath);
       OSD_File anOSDFile(anOSDPath);
       if(!anOSDFile.Exists()) continue;
@@ -168,7 +174,9 @@ SALOMEDS_Tool::PutFilesToStream(const char* theFromDirectory,
 
   aBufferSize += 4;      //4 bytes for a number of the files that will be written to the stream;
   unsigned char* aBuffer = new unsigned char[aBufferSize];  
-  if(aBuffer == NULL) return NULL; 
+  if(aBuffer == NULL)
+//    return NULL; 
+    return (new SALOMEDS::TMPFile);
 
   //Initialize 4 bytes of the buffer by 0
   memset(aBuffer, 0, 4); 
@@ -181,7 +189,7 @@ SALOMEDS_Tool::PutFilesToStream(const char* theFromDirectory,
   for(i=0; i<aLength; i++) {
     ifstream *aFile;
     if (!theNamesOnly) { // mpv 15.01.2003: we don't open any file if theNamesOnly = true
-      TCollection_AsciiString aFullPath = aTmpDir + strdup(theFiles[i]);
+      TCollection_AsciiString aFullPath = aTmpDir + CORBA::string_dup(theFiles[i]);
       OSD_Path anOSDPath(aFullPath);
       OSD_File anOSDFile(anOSDPath);
       if(!anOSDFile.Exists()) continue;
@@ -229,7 +237,7 @@ SALOMEDS_Tool::PutFilesToStream(const char* theFromDirectory,
 // function : PutStreamToFile
 // purpose  : converts the stream "theStream" to the files
 //============================================================================
-SALOMEDS::ListOfFileNames* 
+SALOMEDS::ListOfFileNames_var 
 SALOMEDS_Tool::PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
                                const char* theToDirectory,
                                const int theNamesOnly)
@@ -277,28 +285,28 @@ SALOMEDS_Tool::PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
     delete[] aFileName;
   }
 
-  return aFiles._retn();
+  return aFiles;
 }
 
 //============================================================================
 // function : GetNameFromPath
 // purpose  : Returns the name by the path
 //============================================================================
-char* SALOMEDS_Tool::GetNameFromPath(const char* thePath) {
-  if (thePath == NULL) return strdup("");
-  OSD_Path aPath = OSD_Path(TCollection_AsciiString(strdup(thePath)));
+std::string SALOMEDS_Tool::GetNameFromPath(const char* thePath) {
+  if (thePath == NULL) return string("");
+  OSD_Path aPath = OSD_Path(TCollection_AsciiString((char*)thePath));
   TCollection_AsciiString aNameString(aPath.Name());
-  return CORBA::string_dup(aNameString.ToCString());
+  return aNameString.ToCString();
 }
 
 //============================================================================
 // function : GetDirFromPath
 // purpose  : Returns the dir by the path
 //============================================================================
-char* SALOMEDS_Tool::GetDirFromPath(const char* thePath) {
-  if (thePath == NULL) return strdup("");
-  OSD_Path aPath = OSD_Path(TCollection_AsciiString(strdup(thePath)));
+std::string SALOMEDS_Tool::GetDirFromPath(const char* thePath) {
+  if (thePath == NULL) return string("");
+  OSD_Path aPath = OSD_Path(TCollection_AsciiString((char*)thePath));
   TCollection_AsciiString aDirString(aPath.Trek());
   aDirString.ChangeAll('|','/');
-  return CORBA::string_dup(aDirString.ToCString());
+  return aDirString.ToCString();
 }
index c5f8e2260fecd64e31abc38b000cc4c40d2cf460..fed29bf5509497fe361eaf8044f79631aad5ac7c 100644 (file)
 #ifndef __SALOMEDS_Tool_H__
 #define __SALOMEDS_Tool_H__
 
-
+#include <string> 
 
 // IDL headers
-#include <SALOMEDS.hh> 
+#include "SALOMEconfig.h"
+#include CORBA_SERVER_HEADER(SALOMEDS)
 
 class SALOMEDS_Tool                                
 {
+
 public:
  
   // Returns the unique temporary directory, that is defined in SALOME_TMP_DIR if this variable is set
   // otherwise return /tmp/something/ for Unix or c:\something\ for WNT
-  static char* GetTmpDir();
+  static std::string GetTmpDir();
 
  
   // Removes files which are in <theDirectory>, the files for deletion are listed in <theFiles>
@@ -36,17 +38,17 @@ public:
                                             const int theNamesOnly = 0);
 
   // Converts a byte sequence <theStream> to files and places them in <theToDirectory>
-  static SALOMEDS::ListOfFileNames* PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
+  static SALOMEDS::ListOfFileNames_var PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
                                                      const char* theToDirectory,
                                                     const int theNamesOnly = 0);
 
   // Returns the name by the path
   // for an example: if thePath = "/tmp/aaa/doc1.hdf" the function returns "doc1"
-  static char* GetNameFromPath(const char* thePath);
+  static std::string GetNameFromPath(const char* thePath);
 
   // Returns the directory by the path
   // for an example: if thePath = "/tmp/aaa/doc1.hdf" the function returns "/tmp/aaa"
-  static char* GetDirFromPath(const char* thePath);
+  static std::string GetDirFromPath(const char* thePath);
 
 };
 #endif
index abe1d147d33bacb0be2a48aa69e8185f77710bce..43b673a8e95fc63a00e1f0588714ff7b373a8047 100644 (file)
@@ -27,7 +27,6 @@
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
 #include "ToolsGUI_CatalogGeneratorDlg.h"
 
 #include "QAD_Application.h"
@@ -50,6 +49,10 @@ using namespace std;
 #include <TCollection_AsciiString.hxx>
 #include <Standard_CString.hxx>
 
+#include "utilities.h"
+
+using namespace std;
+
 #define SPACING_SIZE             6
 #define MARGIN_SIZE             11
 #define MIN_EDIT_SIZE          250
@@ -300,7 +303,7 @@ QString ToolsGUI_CatalogGeneratorDlg::getIdlPath()
   QString IDLpath = "";
 
   for (unsigned int ind = 0; ind < list_composants->length();ind++) {
-    QString modulename = strdup(list_composants[ind].modulename) ;
+    QString modulename = CORBA::string_dup(list_composants[ind].modulename) ;
     
     QCString dir;
     if (dir = getenv( modulename + "_ROOT_DIR")) {
index 8fc899ec08a65002ce7626244d943cb61dc63ea1..25eeed28b13e1c5da14709a37b8122322a6d8997 100644 (file)
 #include "Utils_CommException.hxx"
 using namespace std;
 
+static ostream& operator<<(ostream& os, const CORBA::Exception& e)
+{
+  CORBA::Any tmp;
+  tmp<<= e;
+  CORBA::TypeCode_var tc = tmp.type();
+  const char *p = tc->name();
+  os<<"Test blocking exception was catch of the kind : ";
+  if ( *p != '\0' ) {
+    os<<p;
+  } 
+  else  { 
+    os << tc->id();
+  }
+  
+  return os;
+}
+
+
 int main (int argc, char * argv[])
 {
 
@@ -193,11 +211,11 @@ int main (int argc, char * argv[])
   catch(CORBA::COMM_FAILURE& ex) {
     INFOS("Caught system exception COMM_FAILURE -- unable to contact the object.")
       }
-  catch(CORBA::SystemException&) {
-    INFOS("Caught a CORBA::SystemException.")
+  catch(CORBA::SystemException& e) {
+    INFOS("Caught a CORBA::SystemException."<<e)
       }
-  catch(CORBA::Exception&) {
-    INFOS("Caught CORBA::Exception.")
+  catch(CORBA::Exception& e) {
+    INFOS("Caught CORBA::Exception."<<e)
       }
   catch(...) {
     INFOS("Caught unknown exception.")
index fbbd1527fdb6c617c4518b3783ca3bd35f261578..b320657b137c011e575de286dd426b7f6130037f 100644 (file)
@@ -47,7 +47,7 @@ EXPORT_HEADERS= \
        Utils_SINGLETON.hxx \
        Utils_DESTRUCTEUR_GENERIQUE.hxx \
        Utils_ExceptHandlers.hxx \
-       Utils_CatchSignals.h
+       Utils_SignalsHandler.h
 
 EXPORT_PYSCRIPTS = Utils_Identity.py SALOME_utilities.py
 # Libraries targets
@@ -59,7 +59,7 @@ LIB_SRC = OpUtil.cxx Utils_Timer.cxx duplicate.cxx \
        Utils_Identity.cxx Utils_ORB_INIT.cxx \
        Utils_DESTRUCTEUR_GENERIQUE.cxx \
        Utils_ExceptHandlers.cxx \
-       Utils_CatchSignals.cxx
+       Utils_SignalsHandler.cxx
 
 LIB_SERVER_IDL = SALOME_Exception.idl
 
index 50737af05e9757d8f224dcc4b9c89b75befef29e..dbe9f1ba303f6d08f2450471c2b82beacc0a2d4a 100644 (file)
 //  Module : SALOME
 //  $Header$
 
-using namespace std;
-void Nettoyage( void ) ;
 
 # include <iostream>
-# include "utilities.h"
-# include "Utils_DESTRUCTEUR_GENERIQUE.hxx"
 # include <list>
 extern "C"
 {
 # include <stdlib.h>
 }
 
-static list<DESTRUCTEUR_GENERIQUE_*> *Destructeurs=0 ;
+# include "Utils_DESTRUCTEUR_GENERIQUE.hxx"
+# include "utilities.h"
+void Nettoyage();
 
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
 
+using namespace std;
 
+static list<DESTRUCTEUR_GENERIQUE_*> *Destructeurs=0 ;
 
 /*! \class ATEXIT_
  *
@@ -66,7 +71,7 @@ public :
        ATEXIT_( void )
        {
                ASSERT (Destructeurs==0);
-               MESSAGE("Construction ATEXIT"); // message necessaire pour utiliser logger dans Nettoyage (cf.BUG KERNEL4561)
+               if(MYDEBUG) MESSAGE("Construction ATEXIT"); // message necessaire pour utiliser logger dans Nettoyage (cf.BUG KERNEL4561)
                Destructeurs = new list<DESTRUCTEUR_GENERIQUE_*> ; // Destructeurs alloué dynamiquement (cf. ci-dessous) ,
                                                                   // il est utilisé puis détruit par la fonction Nettoyage
                int cr = atexit( Nettoyage );                      // exécute Nettoyage lors de exit, après la destruction des données statiques !
@@ -75,7 +80,7 @@ public :
 
        ~ATEXIT_( )
        {
-               MESSAGE("Destruction ATEXIT") ;
+               if(MYDEBUG) MESSAGE("Destruction ATEXIT") ;
        }
 };
 
@@ -95,16 +100,16 @@ static ATEXIT_ nettoyage ; /* singleton statique */
 
 void Nettoyage( void )
 {
-       BEGIN_OF("Nettoyage( void )") ;
+       if(MYDEBUG) BEGIN_OF("Nettoyage( void )") ;
        ASSERT(Destructeurs) ;
-       SCRUTE( Destructeurs->size() ) ;
+       if(MYDEBUG) SCRUTE( Destructeurs->size() ) ;
        if( Destructeurs->size() )
        {
                list<DESTRUCTEUR_GENERIQUE_*>::iterator it = Destructeurs->end() ;
 
                do
                {
-                       MESSAGE( "DESTRUCTION d'un SINGLETON") ;
+                       if(MYDEBUG) MESSAGE( "DESTRUCTION d'un SINGLETON");
                        it-- ;
                        DESTRUCTEUR_GENERIQUE_* ptr = *it ;
                        //Destructeurs->remove( *it ) ;
@@ -113,14 +118,14 @@ void Nettoyage( void )
                }while( it!=  Destructeurs->begin() ) ;
 
                Destructeurs->clear() ;
-               SCRUTE( Destructeurs->size() ) ;
+               if(MYDEBUG) SCRUTE( Destructeurs->size() ) ;
                ASSERT( Destructeurs->size()==0 ) ;
                ASSERT( Destructeurs->empty() ) ;
        }
 
        delete Destructeurs;
        Destructeurs=0;
-       END_OF("Nettoyage( void )") ;
+       if(MYDEBUG) END_OF("Nettoyage( void )") ;
        return ;
 }
 
index 4037ebd8c5f4bad2a47660db2bb294aa38eb1480..2e9b095670bdc72d2f860e034703ea04a4e46dfd 100644 (file)
@@ -4,9 +4,10 @@
 //             <ota@localhost.localdomain>
 
 
-#include <Utils_ExceptHandlers.hxx>
+#include "Utils_ExceptHandlers.hxx"
 #include "Utils_CorbaException.hxx"
 #include "Utils_SALOME_Exception.hxx"
+
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOME_Exception)
 
index 55558245e2f54d05cc8eb988553421d2fd9811d8..7996ae9221bb70665e17e3c354a4d7c1eca4f0dd 100644 (file)
@@ -30,7 +30,6 @@
 #define Utils_ExceptHandlers_HeaderFile
 
 #include <stdexcept>
-#include <utilities.h>
 
 typedef void (*PVF)();
 
@@ -38,8 +37,8 @@ class Unexpect { //save / retrieve unexpected exceptions treatment
   PVF old;
   public :
     Unexpect( PVF f ) 
-      { old = set_unexpected(f); }
-  ~Unexpect() { set_unexpected(old); }
+      { old = std::set_unexpected(f); }
+  ~Unexpect() { std::set_unexpected(old); }
 };
 
 class Terminate {//save / retrieve terminate function
@@ -47,12 +46,12 @@ class Terminate {//save / retrieve terminate function
   PVF old;
   public :
     Terminate( PVF f ) 
-      { old = set_terminate(f); }
-  ~Terminate() { set_terminate(old); }
+      { old = std::set_terminate(f); }
+  ~Terminate() { std::set_terminate(old); }
 };
 
 #define UNEXPECT_CATCH(FuncName, ExceptionConstructor) \
-void FuncName () {\
+inline void FuncName () {\
    throw ExceptionConstructor (); \
 }
 //Example of the usage 
@@ -72,4 +71,5 @@ void FuncName () {\
 //Definitions :
 extern void SalomeException();
 extern void SALOME_SalomeException();
+
 #endif
index f30cdb03d2dfd1098e3076c823cea605c8e174fb..55bed3bf7409daf4c3c58fd355f449dac09559c9 100644 (file)
@@ -86,9 +86,10 @@ Identity::~Identity(void)
        delete [] (char*)_name ;
        (char*&)_name = NULL ;
 
-       delete [] (char*)_dir ;
-       (char*&)_dir = NULL ;
-
+       //delete [] (char*)_dir ;
+       //(char*&)_dir = NULL ;
+       free((char*)_dir);
+       
        delete [] (char*)_adip ;
        (char*&)_adip = NULL ;
 }
index 9202df72ea405899902149c0cc9bbeac613ecf7a..9ab9c9c3c11a0740842ae31200eb2b7e3a04b882 100644 (file)
 # include <exception>
 # include <iostream>
 
-using namespace std;
-
 # define LOCALIZED(message) #message , __FILE__ , __LINE__
 
-class SALOME_Exception : public exception
+
+class SALOME_Exception : public std::exception
 {
 
 private :
@@ -49,7 +48,7 @@ public :
        SALOME_Exception( const char *text, const char *fileName=0, const unsigned int lineNumber=0 );
        SALOME_Exception( const SALOME_Exception &ex );
        ~SALOME_Exception() throw ();
-       friend ostream & operator<<( ostream &os , const SALOME_Exception &ex );
+       friend std::ostream & operator<<( std::ostream &os , const SALOME_Exception &ex );
        virtual const char *what( void ) const throw () ;
 } ;
 
index 4e06560a00cad19cb745ea2c2ea89974da4f9360..79d4843891e54b56d29957014cce2639135c8f64 100644 (file)
@@ -146,7 +146,7 @@ template <class TYPE> int SINGLETON_<TYPE>::Destruction( void )
                MESSAGE("Destruction du SINGLETON_") ;
 
 
-               list<DESTRUCTEUR_GENERIQUE_ *>::iterator k ;
+               std::list<DESTRUCTEUR_GENERIQUE_ *>::iterator k ;
                for( k=DESTRUCTEUR_GENERIQUE_::Destructeurs.begin() ; k!=DESTRUCTEUR_GENERIQUE_::Destructeurs.end();k++)
                {
                        if ( *k == PtrSingleton->_Instance )
diff --git a/src/Utils/Utils_SignalsHandler.cxx b/src/Utils/Utils_SignalsHandler.cxx
new file mode 100644 (file)
index 0000000..d72879e
--- /dev/null
@@ -0,0 +1,119 @@
+//  KERNEL Utils : common utils for KERNEL
+//  Copyright (C) 2003  CEA
+//
+//  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
+
+
+#include <stdexcept>
+#include <stdio.h>
+#include <signal.h>
+
+#include "Utils_SignalsHandler.h"
+
+
+//============================================================================
+//function : Handler 
+//purpose  : univisal handler for signals
+//============================================================================
+static void Handler(int theSigId)
+{
+  char aMessage[256] = "";
+  sprintf(aMessage,"Signal with ID = %d was cautch!",theSigId);
+  throw std::runtime_error(aMessage);
+}
+
+
+//=======================================================================
+//function : SetSigHandler
+//purpose  : Redefine signal handlers. If the handler of the signal is
+//           set as SIG_IGN. That's why the shells often ignore some 
+//           signal when starting child processes. We keep it.
+//=======================================================================
+static void SetSignalHandler(Utils_SignalsHandler::TSigHandlerCont& theSigHandlerCont,
+                                     int theSigId)
+{
+  TSigHandler anOldHandler = signal(theSigId,&Handler);
+  if(anOldHandler == SIG_IGN)
+    signal(theSigId,SIG_IGN);  
+  theSigHandlerCont[theSigId] = anOldHandler;
+}
+
+static TSigHandler StoreSignalHandler(Utils_SignalsHandler::TSigHandlerCont& theSigHandlerCont,
+                                     int theSigId)
+{
+  TSigHandler anOldHandler = signal(theSigId,&Handler);
+  signal(theSigId,anOldHandler);
+  if(anOldHandler == SIG_IGN)
+    signal(theSigId,SIG_IGN);  
+  theSigHandlerCont[theSigId] = anOldHandler;
+  return anOldHandler;
+}
+
+static void RestoreSigHandler(TSigHandler theSigHandler,
+                             int theSigId)
+{
+  signal(theSigId,theSigHandler);
+}
+
+
+//=======================================================================
+//function : Utils_SignalsHandler
+//purpose  : Constructor
+//=======================================================================
+Utils_SignalsHandler::Utils_SignalsHandler()
+{
+  StoreSignalHandler(mySigHandlerCont,SIGHUP); // floating point exception
+  StoreSignalHandler(mySigHandlerCont,SIGFPE); // floating point exception
+  
+  StoreSignalHandler(mySigHandlerCont,SIGINT); // interrupt
+  StoreSignalHandler(mySigHandlerCont,SIGQUIT); // quit
+  StoreSignalHandler(mySigHandlerCont,SIGBUS); // bus error
+  StoreSignalHandler(mySigHandlerCont,SIGILL); // illegal instruction
+  StoreSignalHandler(mySigHandlerCont,SIGTERM); // termination
+  StoreSignalHandler(mySigHandlerCont,SIGSEGV); // segmentation 
+  //StoreSignalHandler(mySigHandlerCont,SIGABRT); // abort (ANSI).  
+  StoreSignalHandler(mySigHandlerCont,SIGSTKFLT); // stack fault.  
+}
+
+
+//=======================================================================
+//function : Utils_SignalsHandler
+//purpose  : destructor
+//=======================================================================
+Utils_SignalsHandler::~Utils_SignalsHandler() 
+{
+  TSigHandlerCont::iterator anIter = mySigHandlerCont.begin();
+  TSigHandlerCont::iterator anIterEnd = mySigHandlerCont.end();
+  for(; anIter != anIterEnd; anIter++)
+    RestoreSigHandler(anIter->second,anIter->first);
+}
+
+
+//=======================================================================
+//function : SetSigHandler
+//purpose  : sets new handler for pointed signal
+//=======================================================================
+TSigHandler Utils_SignalsHandler::SetSigHandler(int theSigId, 
+                                               TSigHandler theSigHandler)
+{
+  TSigHandler anOldHandler = signal(theSigId,theSigHandler);
+  if(anOldHandler == SIG_IGN)
+    signal(theSigId,SIG_IGN);  
+  mySigHandlerCont[theSigId] = anOldHandler;
+  return anOldHandler;
+}
diff --git a/src/Utils/Utils_SignalsHandler.h b/src/Utils/Utils_SignalsHandler.h
new file mode 100644 (file)
index 0000000..475dcf1
--- /dev/null
@@ -0,0 +1,49 @@
+//  KERNEL Utils : common utils for KERNEL
+//  Copyright (C) 2003  CEA
+//
+//  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
+
+#ifndef _UTILS_SIGNALSHANDLER_H_
+#define _UTILS_SIGNALSHANDLER_H_
+
+
+#include <map>
+typedef void (*TSigHandler)(int);
+
+
+class Utils_SignalsHandler{
+ public:
+  Utils_SignalsHandler();
+  ~Utils_SignalsHandler();
+
+  TSigHandler GetSigHandler(int theSigId);
+  TSigHandler SetSigHandler(int theSigId, TSigHandler theSigHandler);
+  typedef std::map<int,TSigHandler> TSigHandlerCont;
+
+ private:
+  TSigHandlerCont mySigHandlerCont;
+};
+
+
+class Utils_CASSignalsHandler: private Utils_SignalsHandler{
+ public:
+  Utils_CASSignalsHandler();
+};
+
+
+#endif
index c2748f6ecb783525412bd5bfcc7ed28f170e8d46..f594aba9be5b2bebdae2d759fc662d2924f67fe6 100644 (file)
@@ -28,6 +28,8 @@
 # include <stream.h>
 using namespace std;
 
+#include "utilities.h"
+
 static struct timezone *tz=(struct timezone*) malloc(sizeof(struct timezone));
 
 #ifndef CLK_TCK
@@ -78,8 +80,8 @@ void Utils_Timer::Stop() {
 void Utils_Timer::Show() {
   bool StopSav = Stopped;
   if (!StopSav) Stop();
-  cout << "CPU user time: "   << Cumul_user  << " seconds " << endl;
-  cout << "CPU system time: " << Cumul_sys   << " seconds " << endl;
+  MESSAGE("CPU user time: "   << Cumul_user  << " seconds ");
+  MESSAGE("CPU system time: " << Cumul_sys   << " seconds ");
   if (!StopSav) Start();
 }
 
@@ -90,5 +92,5 @@ void Utils_Timer::Reset() {
 
 void Utils_Timer::ShowAbsolute(){
     unsigned long Absolute_user = (unsigned long) ((timeval*)RefToCurrentTimeB)->tv_sec ;
-    cout << "Absolute time: "   << Absolute_user  << " seconds " << endl;
+    MESSAGE("Absolute time: "   << Absolute_user  << " seconds ");
 }
index fd4b956338656262baee1bf60d4390986868382b..b1e449ce43cf414ee4fa2cce87ca4f801c6c48f1 100644 (file)
@@ -38,6 +38,8 @@ extern "C"
 }
 #include  "utilities.h"
 
+using namespace std;
+
 const char* duplicate( const char *const str )
 {
        ASSERT(str!=NULL) ;
index 1cf18d27a2eaae1704e0db31b77fd63af5f58982..066e25d24b42dfaebc371f5b374c9cda5114ceaa 100644 (file)
 
 #include <string>
 #include <iostream>
-#include <cstdlib>
 #include "SALOME_Log.hxx"
 
 /* ---  INFOS is always defined (without _DEBUG_): to be used for warnings, with release version --- */
 
-#define INFOS(msg)    {SLog->putMessage(*SLog<<__FILE__<<" ["<<__LINE__<<"] : "<<msg<<endl);}
-#define PYSCRIPT(msg) {SLog->putMessage(*SLog<<"---PYSCRIPT--- "<<msg<<endl);}
+#define INFOS(msg)    {SLog.putMessage(SLog<<__FILE__<<" ["<<__LINE__<<"] : "<<msg<<std::endl<<std::ends);}
+#define PYSCRIPT(msg) {SLog.putMessage(SLog<<"---PYSCRIPT--- "<<msg<<std::endl<<std::ends);}
 
 /* --- To print date and time of compilation of current source --- */
 
@@ -51,8 +50,6 @@
 #define COMPILER               "KCC" 
 #elif defined ( __PGI )
 #define COMPILER               "pgCC" 
-#elif defined ( __alpha )
-#define COMPILER               "cxx" 
 #else
 #define COMPILER               "undefined" 
 #endif
 #endif
 
 #define INFOS_COMPILATION { \
-                          SLog->putMessage(\
-                                          *SLog<<__FILE__<<" ["<< __LINE__<<"] : "\
+                          SLog.putMessage(\
+                                          SLog<<__FILE__<<" ["<< __LINE__<<"] : "\
                                           << "COMPILED with " << COMPILER \
                                           << ", " << __DATE__ \
-                                          << " at " << __TIME__ <<endl); }
+                                          << " at " << __TIME__ <<std::endl<<std::ends); }
 
 #ifdef _DEBUG_
 
 /* --- the following MACROS are useful at debug time --- */
 
-#define MYTRACE *SLog << "- Trace " << __FILE__ << " [" << __LINE__ << "] : " 
+#define MYTRACE SLog<<"- Trace "<<__FILE__<<" ["<<__LINE__<<"] : " 
 
-#define MESSAGE(msg) {SLog->putMessage( MYTRACE <<msg<<endl<<ends); }
-#define SCRUTE(var)  {SLog->putMessage( MYTRACE << #var << "=" << var <<endl<<ends); }
+#define MESSAGE(msg) {SLog.putMessage(MYTRACE<<msg<<std::endl<<std::ends);}
+#define SCRUTE(var)  {SLog.putMessage(MYTRACE<<#var<<"="<<var<<std::endl<<std::ends);}
 
-#define REPERE *SLog << "   --------------" << endl 
-#define BEGIN_OF(msg) {REPERE;MYTRACE<<"Begin of: "     <<msg<<endl;REPERE;} 
-#define END_OF(msg)   {REPERE;MYTRACE<<"Normal end of: "<<msg<<endl;REPERE;} 
+#define BEGIN_OF(msg) {SLog.putMessage(MYTRACE<<"Begin of: "<<msg<<"\n\n"<<std::ends);} 
+#define END_OF(msg)   {SLog.putMessage(SLog<<"\n"<<std::ends); \
+                       SLog.putMessage(MYTRACE<<"Normal end of: "<<msg<<"\n"<<std::ends);}
 
-#define HERE {cout<<flush ;cerr<<"- Trace "<<__FILE__<<" ["<<__LINE__<<"] : "<<flush ;}
+#define HERE {std::cout<<std::flush ;std::cerr<<"- Trace "<<__FILE__<<" ["<<__LINE__<<"] : "<<std::flush;}
 
-#define INTERRUPTION(code) {HERE;cerr<<"INTERRUPTION return code= "<<code<< endl;std::exit(code);}
+#define INTERRUPTION(code) {HERE; \
+                            cerr<<"INTERRUPTION return code= "<<code<<std::endl; \
+                            std::exit(code);}
 
 #ifndef ASSERT
 #define ASSERT(condition) \
-        if (!(condition)){HERE;cerr<<"CONDITION "<<#condition<<" NOT VERIFIED"<<endl;INTERRUPTION(1);}
+        if(!(condition)){ \
+          HERE; \
+          std::cerr<<"CONDITION "<<#condition<<" NOT VERIFIED"<<std::endl; \
+          INTERRUPTION(1); \
+        }
+
 #endif /* ASSERT */
 
 
 #define HERE 
 #define SCRUTE(var) {}
 #define MESSAGE(msg) {}
-#define REPERE
 #define BEGIN_OF(msg) {}
 #define END_OF(msg) {}
 
index 44ab60836460c408ad920680518838da807906bd..e8297f1f83de1cc9da228fa9dc9109a6a208ee85 100644 (file)
@@ -35,6 +35,7 @@ VPATH=.:@srcdir@:@top_srcdir@/idl
 EXPORT_HEADERS = SALOME_Transform.h \
                 SALOME_TransformFilter.h \
                 SALOME_PassThroughFilter.h \
+                SALOME_ShrinkFilter.h \
                 SALOME_GeometryFilter.h \
                 SALOME_ExtractUnstructuredGrid.h
 
@@ -44,6 +45,7 @@ LIB = libSalomeVTKFilter.la
 LIB_SRC = SALOME_Transform.cxx \
           SALOME_TransformFilter.cxx \
          SALOME_PassThroughFilter.cxx \
+         SALOME_ShrinkFilter.cxx \
          SALOME_GeometryFilter.cxx \
          SALOME_ExtractUnstructuredGrid.cxx
 
index dd9b1b9cd16a0f327103d384f7918b6637e85d74..2cc4930bc25c4bfc7314d0da9b9a0e4770422e81 100644 (file)
@@ -39,7 +39,7 @@
 using namespace std;
 
 #ifdef _DEBUG_
-static int MYDEBUG = 1;
+static int MYDEBUG = 0;
 #else
 static int MYDEBUG = 0;
 #endif
@@ -80,7 +80,7 @@ void SALOME_ExtractUnstructuredGrid::SetStoreMapping(int theStoreMapping){
   this->Modified();
 }
 
-vtkIdType SALOME_ExtractUnstructuredGrid::GetOutId(int theOutId) const{
+vtkIdType SALOME_ExtractUnstructuredGrid::GetInputId(int theOutId) const{
   if(myCellIds.empty() && myCellTypes.empty()) return theOutId;
   if(myOut2InId.empty() || theOutId > myOut2InId.size()) return -1;
 #if defined __GNUC_2__
@@ -90,7 +90,7 @@ vtkIdType SALOME_ExtractUnstructuredGrid::GetOutId(int theOutId) const{
 #endif
 }
 
-vtkIdType SALOME_ExtractUnstructuredGrid::GetInId(int theInId) const{
+vtkIdType SALOME_ExtractUnstructuredGrid::GetOutputId(int theInId) const{
   if(myCellIds.empty() && myCellTypes.empty()) return theInId;
   TMapId::const_iterator anIter = myIn2OutId.find(theInId);
   if(anIter == myIn2OutId.end()) return -1;
@@ -233,7 +233,7 @@ void SALOME_ExtractUnstructuredGrid::Execute(){
          }
        }
       }
-      if(aNbElems = aConnectivity->GetNumberOfCells()){
+      if((aNbElems = aConnectivity->GetNumberOfCells())){
        vtkIntArray* aCellLocationsArray = vtkIntArray::New();
        aCellLocationsArray->SetNumberOfComponents(1);
        aCellLocationsArray->SetNumberOfTuples(aNbElems);
@@ -322,7 +322,7 @@ void SALOME_ExtractUnstructuredGrid::Execute(){
        }
       }
     }
-    if(aNbElems = aConnectivity->GetNumberOfCells()){
+    if((aNbElems = aConnectivity->GetNumberOfCells())){
       vtkIntArray* aCellLocationsArray = vtkIntArray::New();
       aCellLocationsArray->SetNumberOfComponents(1);
       aCellLocationsArray->SetNumberOfTuples(aNbElems);
index 2e913795e2f92f89200bf9dbfe545227c73f945d..dc3bcc41aa6c424a352c557562d4cc27e8fa52a0 100644 (file)
@@ -57,7 +57,7 @@ public:
   // Remove the cell from the output
   void RegisterCell(vtkIdType theCellId);
   int IsCellsRegistered() { return !myCellIds.empty();}
-  int ClearRegisteredCells() { 
+  void ClearRegisteredCells() { 
     myCellIds.clear();
     Modified();
   }
@@ -65,7 +65,7 @@ public:
   // Remove every cells with the type from the output
   void RegisterCellsWithType(vtkIdType theCellType);
   int IsCellsWithTypeRegistered() { return !myCellTypes.empty();}
-  int ClearRegisteredCellsWithType() { 
+  void ClearRegisteredCellsWithType() { 
     myCellTypes.clear();
     Modified();
   }
@@ -77,8 +77,8 @@ public:
   void SetStoreMapping(int theStoreMapping);
   int GetStoreMapping(){ return myStoreMapping;}
 
-  vtkIdType GetOutId(int theOutId) const;
-  vtkIdType GetInId(int theInId) const;
+  vtkIdType GetInputId(int theOutId) const;
+  vtkIdType GetOutputId(int theInId) const;
 
   typedef std::vector<vtkIdType> TVectorId;
   typedef std::map<vtkIdType,vtkIdType> TMapId;
index c618187501faee8e2cd101994f985474143b23d2..d61f825e034cee9208b5ea11642fefbe329da5ef 100644 (file)
@@ -96,7 +96,7 @@ void SALOME_GeometryFilter::SetStoreMapping(int theStoreMapping){
 }
 
 
-vtkIdType SALOME_GeometryFilter::GetObjId(int theVtkID){
+vtkIdType SALOME_GeometryFilter::GetElemObjId(int theVtkID){
   if(myVTK2ObjIds.empty() || theVtkID > myVTK2ObjIds.size()) return -1;
 #if defined __GNUC_2__
   return myVTK2ObjIds[theVtkID];
@@ -106,17 +106,6 @@ vtkIdType SALOME_GeometryFilter::GetObjId(int theVtkID){
 }
 
 
-SALOME_GeometryFilter::TVectorId SALOME_GeometryFilter::GetVtkId(int theObjID){
-  TVectorId aVect;
-  if(myObj2VTKIds.empty() || theObjID > myObj2VTKIds.size()) return aVect;
-#if defined __GNUC_2__
-  return myObj2VTKIds[theObjID];
-#else
-  return myObj2VTKIds.at(theObjID);
-#endif
-}
-
-
 void SALOME_GeometryFilter::UnstructuredGridExecute()
 {
   vtkUnstructuredGrid *input= (vtkUnstructuredGrid *)this->GetInput();
@@ -243,9 +232,8 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
   // (Have to compute visibility first for 3D cell boundarys)
   int progressInterval = numCells/20 + 1;
   if(myStoreMapping){
-    myVTK2ObjIds.clear();  myObj2VTKIds.clear(); //apo
+    myVTK2ObjIds.clear();
     myVTK2ObjIds.reserve(numCells);
-    myObj2VTKIds.resize(numCells);
   }
   for (cellId=0, Connectivity->InitTraversal(); 
        Connectivity->GetNextCell(npts,pts); 
@@ -279,7 +267,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
           newCellId = output->InsertNextCell(aCellType,npts,pts);
          if(myStoreMapping){
            myVTK2ObjIds.push_back(cellId); //apo
-           myObj2VTKIds[cellId].push_back(newCellId);
          }
           outputCD->CopyData(cd,cellId,newCellId);
           break;
@@ -289,7 +276,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
           newCellId = output->InsertNextCell(VTK_LINE,npts,pts);
          if(myStoreMapping){
            myVTK2ObjIds.push_back(cellId); //apo
-           myObj2VTKIds[cellId].push_back(newCellId);
          }
           outputCD->CopyData(cd,cellId,newCellId);
           break;
@@ -300,7 +286,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
           newCellId = output->InsertNextCell(aCellType,npts,pts);
          if(myStoreMapping){
            myVTK2ObjIds.push_back(cellId); //apo
-           myObj2VTKIds[cellId].push_back(newCellId);
          }
           outputCD->CopyData(cd,cellId,newCellId);
           break;
@@ -309,7 +294,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
           newCellId = output->InsertNextCell(aCellType,npts,pts);
          if(myStoreMapping){
            myVTK2ObjIds.push_back(cellId); //apo
-           myObj2VTKIds[cellId].push_back(newCellId);
          }
           outputCD->CopyData(cd,cellId,newCellId);
           break;
@@ -318,7 +302,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
           newCellId = output->InsertNextCell(aCellType,npts,pts);
          if(myStoreMapping){
            myVTK2ObjIds.push_back(cellId); //apo
-           myObj2VTKIds[cellId].push_back(newCellId);
          }
          outputCD->CopyData(cd,cellId,newCellId);
           break;
@@ -344,7 +327,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
               newCellId = output->InsertNextCell(aCellType,numFacePts,aNewPts);
              if(myStoreMapping){
                myVTK2ObjIds.push_back(cellId); //apo
-               myObj2VTKIds[cellId].push_back(newCellId);
              }
               outputCD->CopyData(cd,cellId,newCellId);
               }
@@ -373,7 +355,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
               newCellId = output->InsertNextCell(aCellType,numFacePts,aNewPts);
              if(myStoreMapping){
                myVTK2ObjIds.push_back(cellId); //apo
-               myObj2VTKIds[cellId].push_back(newCellId);
              }
               outputCD->CopyData(cd,cellId,newCellId);
               }
@@ -402,7 +383,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
               newCellId = output->InsertNextCell(aCellType,numFacePts,aNewPts);
              if(myStoreMapping){
                myVTK2ObjIds.push_back(cellId); //apo
-               myObj2VTKIds[cellId].push_back(newCellId);
              }
               outputCD->CopyData(cd,cellId,newCellId);
               }
@@ -436,7 +416,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
               newCellId = output->InsertNextCell(aCellType,numFacePts,aNewPts);
              if(myStoreMapping){
                myVTK2ObjIds.push_back(cellId); //apo
-               myObj2VTKIds[cellId].push_back(newCellId);
              }
               outputCD->CopyData(cd,cellId,newCellId);
               }
@@ -470,7 +449,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
               newCellId = output->InsertNextCell(aCellType,numFacePts,aNewPts);
              if(myStoreMapping){
                myVTK2ObjIds.push_back(cellId); //apo
-               myObj2VTKIds[cellId].push_back(newCellId);
              }
               outputCD->CopyData(cd,cellId,newCellId);
               }
@@ -495,15 +473,6 @@ void SALOME_GeometryFilter::UnstructuredGridExecute()
       cout<<myVTK2ObjIds[i]<<", ";
     }
     cout<<"\n";
-    for(int i = 0, iEnd = myObj2VTKIds.size(); i < iEnd; i++){
-      TVectorId& aVectorId = myObj2VTKIds[i];
-      cout<<aVectorId.size()<<": ";
-      for(int j = 0, jEnd = aVectorId.size(); j < jEnd; j++){
-       cout<<aVectorId[j]<<", ";
-      }
-      cout<<"\n";
-    }
-    cout<<"\n";
   }
 
   // Update ourselves and release memory
index bce9d27d76ba13678a5bf124119a741f2c9efcd3..1969aedfe4c494c3658aaf33ee966cad971cfd63 100644 (file)
@@ -44,9 +44,8 @@ public:
   void SetStoreMapping(int theStoreMapping);
   int GetStoreMapping(){ return myStoreMapping;}
 
-  typedef std::vector<vtkIdType> TVectorId;
-  virtual vtkIdType GetObjId(int theVtkID);
-  virtual TVectorId GetVtkId(int theObjID);
+  virtual vtkIdType GetNodeObjId(int theVtkID) { return theVtkID;}
+  virtual vtkIdType GetElemObjId(int theVtkID);
 
 protected:
   SALOME_GeometryFilter();
@@ -59,9 +58,8 @@ private:
   int myShowInside;   
 
   int myStoreMapping;   
+  typedef std::vector<vtkIdType> TVectorId;
   TVectorId myVTK2ObjIds;
-  typedef std::vector<TVectorId> TVecVectorId;
-  TVecVectorId myObj2VTKIds;
 };
 
 #endif
diff --git a/src/VTKFilter/SALOME_ShrinkFilter.cxx b/src/VTKFilter/SALOME_ShrinkFilter.cxx
new file mode 100644 (file)
index 0000000..1ea45c8
--- /dev/null
@@ -0,0 +1,176 @@
+//  SALOME OBJECT : kernel of SALOME component
+//
+//  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_GeometryFilter.cxx
+//  Author : Michael ZORIN
+//  Module : SALOME
+//  $Header$
+
+#include "SALOME_ShrinkFilter.h"
+
+#include <vtkCell.h>
+#include <vtkCellData.h>
+#include <vtkIdList.h>
+#include <vtkObjectFactory.h>
+#include <vtkPointData.h>
+#include <vtkUnstructuredGrid.h>
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+static int MYDEBUGWITHFILES = 0;
+#else
+static int MYDEBUG = 0;
+static int MYDEBUGWITHFILES = 0;
+#endif
+
+vtkCxxRevisionMacro(SALOME_ShrinkFilter, "$Revision$");
+vtkStandardNewMacro(SALOME_ShrinkFilter);
+
+
+SALOME_ShrinkFilter::SALOME_ShrinkFilter(): 
+  myStoreMapping(0)
+{}
+
+
+SALOME_ShrinkFilter::~SALOME_ShrinkFilter()
+{}
+
+
+void SALOME_ShrinkFilter::Execute()
+{
+  vtkPoints *newPts;
+  int i, j, numIds, abort=0;
+  vtkIdType cellId, numCells, numPts;
+  vtkIdType oldId, newId;
+  float center[3], *p, pt[3];
+  vtkPointData *pd, *outPD;;
+  vtkIdList *ptIds, *newPtIds;
+  vtkDataSet *input= this->GetInput();
+  vtkUnstructuredGrid *output = this->GetOutput();
+  vtkIdType tenth;
+  float decimal;
+
+  vtkDebugMacro(<<"Shrinking cells");
+
+  numCells=input->GetNumberOfCells();
+  numPts = input->GetNumberOfPoints();
+  if (numCells < 1 || numPts < 1)
+    {
+    vtkErrorMacro(<<"No data to shrink!");
+    return;
+    }
+
+  ptIds = vtkIdList::New();
+  ptIds->Allocate(VTK_CELL_SIZE);
+  newPtIds = vtkIdList::New();
+  newPtIds->Allocate(VTK_CELL_SIZE);
+
+  output->Allocate(numCells);
+  newPts = vtkPoints::New();
+  newPts->Allocate(numPts*8,numPts);
+  pd = input->GetPointData();
+  outPD = output->GetPointData();
+  outPD->CopyAllocate(pd,numPts*8,numPts);
+
+  // Traverse all cells, obtaining node coordinates.  Compute "center" of cell,
+  // then create new vertices shrunk towards center.
+  //
+  tenth   = numCells/10 + 1;
+  decimal = 0.0;
+  if(myStoreMapping){
+    myVTK2ObjIds.clear();
+    myVTK2ObjIds.reserve(numCells);
+  }
+
+  for (cellId=0; cellId < numCells && !abort; cellId++)
+    {
+    input->GetCellPoints(cellId, ptIds);
+    numIds = ptIds->GetNumberOfIds();
+
+    //abort/progress methods
+    if (cellId % tenth == 0) 
+      {
+      decimal += 0.1;
+      this->UpdateProgress (decimal);
+      abort = this->GetAbortExecute();
+      }
+
+    // get the center of the cell
+    center[0] = center[1] = center[2] = 0.0;
+    for (i=0; i < numIds; i++)
+      {
+      p = input->GetPoint(ptIds->GetId(i));
+      for (j=0; j < 3; j++)
+        {
+        center[j] += p[j];
+        }
+      }
+    for (j=0; j<3; j++)
+      {
+      center[j] /= numIds;
+      }
+
+    // Create new points and cells
+    newPtIds->Reset();
+    for (i=0; i < numIds; i++)
+      {
+      p = input->GetPoint(ptIds->GetId(i));
+      for (j=0; j < 3; j++)
+        {
+        pt[j] = center[j] + this->ShrinkFactor*(p[j] - center[j]);
+        }
+
+      oldId = ptIds->GetId(i);
+      newId = newPts->InsertNextPoint(pt);
+      if(myStoreMapping)
+       myVTK2ObjIds.push_back(oldId);
+      newPtIds->InsertId(i,newId);
+
+      outPD->CopyData(pd, oldId, newId);
+      }
+    output->InsertNextCell(input->GetCellType(cellId), newPtIds);
+    }//for all cells
+
+  // Update ourselves and release memory
+  //
+  output->GetCellData()->PassData(input->GetCellData());
+
+  output->SetPoints(newPts);
+  output->Squeeze();
+
+  ptIds->Delete();
+  newPtIds->Delete();
+  newPts->Delete();
+}
+
+
+void SALOME_ShrinkFilter::SetStoreMapping(int theStoreMapping){
+  myStoreMapping = theStoreMapping;
+  this->Modified();
+}
+
+
+vtkIdType SALOME_ShrinkFilter::GetNodeObjId(int theVtkID){
+  if(myVTK2ObjIds.empty() || theVtkID > myVTK2ObjIds.size()) return -1;
+  return myVTK2ObjIds[theVtkID];
+}
diff --git a/src/VTKFilter/SALOME_ShrinkFilter.h b/src/VTKFilter/SALOME_ShrinkFilter.h
new file mode 100644 (file)
index 0000000..837b939
--- /dev/null
@@ -0,0 +1,61 @@
+//  SALOME OBJECT : kernel of SALOME component
+//
+//  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_GeometryFilter.h
+//  Author : Michael ZORIN
+//  Module : SALOME
+//  $Header$
+
+
+#ifndef __SALOME_ShrinkFilter_h
+#define __SALOME_ShrinkFilter_h
+
+#include <vtkShrinkFilter.h>
+#include <vector>
+
+class SALOME_ShrinkFilter : public vtkShrinkFilter 
+{
+public:
+  static SALOME_ShrinkFilter *New();
+  vtkTypeRevisionMacro(SALOME_ShrinkFilter, vtkShrinkFilter);
+
+  void SetStoreMapping(int theStoreMapping);
+  int GetStoreMapping(){ return myStoreMapping;}
+
+  virtual vtkIdType GetNodeObjId(int theVtkID);
+  virtual vtkIdType GetElemObjId(int theVtkID) { return theVtkID;}
+
+protected:
+  SALOME_ShrinkFilter();
+  ~SALOME_ShrinkFilter();
+  
+  void Execute();
+  void UnstructuredGridExecute();
+    
+private:
+  int myStoreMapping;   
+  typedef std::vector<vtkIdType> TVectorId;
+  TVectorId myVTK2ObjIds;
+};
+
+#endif
index 40ca16b5263b8511c49a399bc835877aee86bfc7..43786ab25d0bb887e7a021e31f92d837e603f84c 100644 (file)
@@ -39,7 +39,10 @@ EXPORT_HEADERS=  VTKViewer_RenderWindow.h \
                 VTKViewer_ViewFrame.h \
                 VTKViewer_RenderWindowInteractor.h \
                 VTKViewer_InteractorStyleSALOME.h \
-                VTKViewer_Filter.h
+                VTKViewer_Filter.h \
+                VTKViewer_Prs.h \
+                VTKViewer_Trihedron.h \
+                VTKViewer_VectorText.h
                     
 # Libraries targets
 LIB = libVTKViewer.la
@@ -53,7 +56,9 @@ LIB_SRC= VTKViewer.cxx \
         VTKViewer_RectPicker.cxx \
         VTKViewer_CellRectPicker.cxx \
         VTKViewer_Utilities.cxx \
-        VTKViewer_Filter.cxx
+        VTKViewer_Filter.cxx \
+         VTKViewer_Actor.cxx \
+         VTKViewer_Prs.cxx 
 
 LIB_MOC = \
         VTKViewer.h \
@@ -66,9 +71,9 @@ LIB_CLIENT_IDL = SALOMEDS.idl \
                 SALOME_Component.idl \
                 SALOME_Exception.idl
 
-CPPFLAGS+=$(QT_INCLUDES) $(OGL_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES)
-CXXFLAGS+=
-LDFLAGS+=$(VTK_LIBS) $(OGL_LIBS) $(QT_MT_LIBS) -lSalomeGUI
+CPPFLAGS+=$(QT_INCLUDES) $(OGL_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES)
+
+LDFLAGS+=$(VTK_LIBS) $(OGL_LIBS) $(QT_MT_LIBS) -lSalomePrs -lSalomeGUI
 
 @CONCLUDE@
 
diff --git a/src/VTKViewer/VTKViewer_Actor.cxx b/src/VTKViewer/VTKViewer_Actor.cxx
new file mode 100644 (file)
index 0000000..eb8cd14
--- /dev/null
@@ -0,0 +1,233 @@
+//  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 
+
+#include "VTKViewer_Actor.h"
+
+#include "SALOME_PassThroughFilter.h"
+
+// VTK Includes
+#include <vtkObjectFactory.h>
+#include <vtkUnstructuredGrid.h>
+#include <vtkDataSetMapper.h>
+#include <vtkRenderer.h>
+
+#include <vtkCell.h>
+#include <vtkPolyData.h>
+#include <vtkShrinkFilter.h>
+
+#include "utilities.h"
+using namespace std;
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+
+static void CopyPoints(vtkUnstructuredGrid* theGrid, vtkDataSet *theSourceDataSet){
+  vtkPoints *aPoints = vtkPoints::New();
+  vtkIdType iEnd = theSourceDataSet->GetNumberOfPoints();
+  aPoints->SetNumberOfPoints(iEnd);
+  for(vtkIdType i = 0; i < iEnd; i++){
+    aPoints->SetPoint(i,theSourceDataSet->GetPoint(i));
+  }
+  theGrid->SetPoints(aPoints);
+  aPoints->Delete();
+}
+
+
+//=======================================================================
+
+vtkStandardNewMacro(VTKViewer_Actor);
+
+VTKViewer_Actor::VTKViewer_Actor()
+{
+  myRenderer = NULL;
+  myIsInfinite = true;
+
+  Visibility = Pickable = false;
+
+  myUnstructuredGrid = vtkUnstructuredGrid::New();
+  myUnstructuredGrid->Allocate();
+
+  myIsShrunk = false;
+  myIsShrinkable = true;
+  myShrinkFilter = vtkShrinkFilter::New();
+
+  myMapper = vtkDataSetMapper::New();
+
+  myMapper->SetInput(myUnstructuredGrid);
+  Superclass::InitPipeLine(myMapper);
+
+  SetResolveCoincidentTopology(false);
+}
+
+
+void VTKViewer_Actor::SetShrinkFactor(float theValue){
+  myShrinkFilter->SetShrinkFactor(theValue);
+  Modified();
+}
+
+
+void VTKViewer_Actor::SetShrink()
+{
+  if ( !myIsShrinkable ) return;
+  if ( vtkDataSet* aDataSet = myPassFilter[0]->GetOutput() )
+  {
+    myShrinkFilter->SetInput( aDataSet );
+    myPassFilter[1]->SetInput( myShrinkFilter->GetOutput() );
+    myIsShrunk = true;
+  }
+}
+
+void VTKViewer_Actor::UnShrink()
+{
+  if ( !myIsShrunk ) return;
+  if ( vtkDataSet* aDataSet = myPassFilter[0]->GetOutput() )
+  {
+    myPassFilter[1]->SetInput( aDataSet );
+    myPassFilter[1]->Modified();
+    myIsShrunk = false;
+    Modified();
+  }
+}
+
+
+//----------------------------------------------------------------------------
+VTKViewer_Actor::~VTKViewer_Actor()
+{
+  if(MYDEBUG) INFOS("VTKViewer_Actor::~VTKViewer_Actor()");
+
+  myMapper->RemoveAllInputs();
+  myMapper->Delete();
+
+  myShrinkFilter->UnRegisterAllOutputs();
+  myShrinkFilter->Delete();
+
+  myUnstructuredGrid->Delete();
+}
+
+
+//----------------------------------------------------------------------------
+void VTKViewer_Actor::MapCells(SALOME_Actor* theMapActor, 
+                              const TColStd_IndexedMapOfInteger& theMapIndex)
+{
+  myUnstructuredGrid->Reset();
+
+  vtkDataSet *aSourceDataSet = theMapActor->GetInput();
+  CopyPoints(myUnstructuredGrid,aSourceDataSet);
+
+  int aNbOfParts = theMapIndex.Extent();
+  for(int ind = 1; ind <= aNbOfParts; ind++){
+    int aPartId = theMapIndex( ind );
+    vtkCell* aCell = theMapActor->GetElemCell(aPartId);
+    myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+    //for (int i = 0, iEnd = aCell->GetNumberOfEdges(); i < iEnd; i++){
+    //  vtkCell* anEdgeCell = aCell->GetEdge(i);
+    //  myUnstructuredGrid->InsertNextCell(VTK_LINE,anEdgeCell->GetPointIds());
+    //}
+  }
+
+  UnShrink();
+  if(theMapActor->IsShrunk()){
+    SetShrinkFactor(theMapActor->GetShrinkFactor());
+    SetShrink();
+  }
+}
+
+
+//----------------------------------------------------------------------------
+void VTKViewer_Actor::MapPoints(SALOME_Actor* theMapActor, 
+                               const TColStd_IndexedMapOfInteger& theMapIndex)
+{
+  myUnstructuredGrid->Reset();
+  if(int aNbOfParts = theMapIndex.Extent()){
+    vtkPoints *aPoints = vtkPoints::New();
+    aPoints->SetNumberOfPoints(aNbOfParts);
+    for(int i = 0; i < aNbOfParts; i++){
+      int aPartId = theMapIndex( i+1 );
+      float* aCoord = theMapActor->GetNodeCoord(aPartId);
+      aPoints->SetPoint(i,aCoord);
+      myUnstructuredGrid->InsertNextCell(VTK_VERTEX,1,&i);
+    }
+    myUnstructuredGrid->SetPoints(aPoints);
+    aPoints->Delete();
+  }
+
+  UnShrink();
+}
+
+
+//----------------------------------------------------------------------------
+void VTKViewer_Actor::MapEdge(SALOME_Actor* theMapActor, 
+                             const TColStd_IndexedMapOfInteger& theMapIndex)
+{
+  myUnstructuredGrid->Reset();
+
+  vtkDataSet *aSourceDataSet = theMapActor->GetInput();
+  CopyPoints(myUnstructuredGrid,aSourceDataSet);
+
+  int iEnd = theMapIndex.Extent();
+  int aCellId = -1, aCellCounter = 0;
+  for(int i = 1; i <= iEnd; i++){
+    int anId = theMapIndex( i );
+    if(anId > 0) {
+      aCellCounter++;
+      aCellId = anId;
+    }
+  }
+
+  if(aCellCounter == 1){
+    vtkCell* aCell = theMapActor->GetElemCell(aCellId);
+    if(aCell->GetCellType() <= VTK_LINE){
+      myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+    }else{
+      int aNbOfParts = aCell->GetNumberOfEdges();
+      for(int i = 1; i <= iEnd; i++){
+        int aPartId = theMapIndex(i);
+       if( aPartId < 0){
+          aPartId = -aPartId-1;
+         if(0 > aPartId || aPartId >= aNbOfParts) break;
+         vtkCell* anEdgeCell = aCell->GetEdge(aPartId);
+         myUnstructuredGrid->InsertNextCell(VTK_LINE,anEdgeCell->GetPointIds());
+       }
+      }
+    }
+  }else{
+    int aNbOfParts = aSourceDataSet->GetNumberOfCells();
+    for(int i = 1; i <= iEnd; i++){
+      int aPartId = theMapIndex( i );
+      if(aPartId > 0){
+       if(aPartId >= aNbOfParts) break;
+       vtkCell* aCell = aSourceDataSet->GetCell(aPartId);
+       myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+      }
+    }
+  }
+
+  UnShrink();
+  if(theMapActor->IsShrunk()){
+    SetShrinkFactor(theMapActor->GetShrinkFactor());
+    SetShrink();
+  }
+}
+
+//----------------------------------------------------------------------------
diff --git a/src/VTKViewer/VTKViewer_Actor.h b/src/VTKViewer/VTKViewer_Actor.h
new file mode 100644 (file)
index 0000000..a708aa6
--- /dev/null
@@ -0,0 +1,64 @@
+//  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 
+
+#ifndef VTKVIEWER_ACTOR_H
+#define VTKVIEWER_ACTOR_H
+
+#include <TColStd_IndexedMapOfInteger.hxx>
+
+class vtkRenderer;
+class vtkShrinkFilter;
+class vtkDataSetMapper;
+class vtkUnstructuredGrid;
+
+#include "SALOME_Actor.h"
+
+class VTKViewer_Actor : public SALOME_Actor {
+ public:
+  vtkTypeMacro(VTKViewer_Actor,SALOME_Actor);
+  static VTKViewer_Actor* New();
+  virtual ~VTKViewer_Actor();
+
+  void  SetShrinkFactor(float value);
+  virtual void SetShrink(); 
+  virtual void UnShrink(); 
+
+  void MapCells(SALOME_Actor* theMapActor, 
+               const TColStd_IndexedMapOfInteger& theMapIndex);
+
+  void MapPoints(SALOME_Actor* theMapActor, 
+                const TColStd_IndexedMapOfInteger& theMapIndex);
+
+  void MapEdge(SALOME_Actor* theMapActor, 
+              const TColStd_IndexedMapOfInteger& theMapIndex);
+
+ protected:
+  vtkUnstructuredGrid* myUnstructuredGrid;
+  vtkDataSetMapper* myMapper;
+
+  vtkRenderer* myRenderer;
+
+  vtkShrinkFilter* myShrinkFilter;
+  bool myIsShrinkable;
+  bool myIsShrunk;
+
+  VTKViewer_Actor();
+};
+
+#endif
diff --git a/src/VTKViewer/VTKViewer_Algorithm.h b/src/VTKViewer/VTKViewer_Algorithm.h
new file mode 100644 (file)
index 0000000..cd38a86
--- /dev/null
@@ -0,0 +1,83 @@
+//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//
+//
+//
+//  File   : VTKViewer_ViewFrame.h
+//  Author : Nicolas REJNERI
+//  Module : SALOME
+//  $Header$
+
+#ifndef VTKViewer_Algorithm_H
+#define VTKViewer_Algorithm_H
+
+class vtkActor;
+class vtkActorCollection;
+
+namespace SALOME{
+  namespace VTK{
+    
+    template<typename TActor, typename TFunction>
+      TFunction ForEach(vtkActorCollection *theCollection, TFunction theFun)
+      {
+       if(theCollection){
+         theCollection->InitTraversal();
+         while(vtkActor *anAct = theCollection->GetNextActor())
+           if(TActor *anActor = dynamic_cast<TActor*>(anAct))
+             theFun(anActor);
+       }
+       return theFun;
+      }
+  
+
+    template<typename TActor, typename TPredicate, typename TFunction>
+      TFunction ForEachIf(vtkActorCollection *theCollection, 
+                         TPredicate thePredicate,
+                         TFunction theFun)
+      {
+       if(theCollection){
+         theCollection->InitTraversal();
+         while(vtkActor *anAct = theCollection->GetNextActor())
+           if(TActor *anActor = dynamic_cast<TActor*>(anAct))
+             if(thePredicate(anActor))
+               theFun(anActor);
+       }
+       return theFun;
+      }
+  
+
+    template<typename TActor, typename TPredicate>
+      TActor* Find(vtkActorCollection *theCollection, TPredicate thePredicate)
+      {
+       if(theCollection){
+         theCollection->InitTraversal();
+         while(vtkActor *anAct = theCollection->GetNextActor())
+           if(TActor *anActor = dynamic_cast<TActor*>(anAct))
+             if(thePredicate(anActor))
+               return anActor;
+       }
+       return NULL;
+      }
+
+  }
+}
+
+#endif
index 6e05537cd7092fcb2f9686c0b37270834e1538d7..b2506538bdd111283f4268f192c13d6d0ebe5b23 100644 (file)
@@ -299,7 +299,7 @@ void VTKViewer_CellRectPicker::IncludeActor(vtkProp3D* prop,
          dir[i] = p2[i] - p1[i];
        }
 
-       input->GetCell(curData.cellId, cell2);
+       actor->GetMapper()->GetInput()->GetCell(curData.cellId, cell2);
        result = IntersectCells(cell1, cellData.depth,
                                cell2, curData.depth, dir);
        if (result > 0) {
index d9d9831a8c8ed862c1ab9971f706c26eec526413..f667356b82007c179b478062819a7e06c833eee4 100755 (executable)
@@ -48,11 +48,13 @@ public:
                               VTKViewer_Filter();\r
   virtual                     ~VTKViewer_Filter();\r
 \r
-  bool                        IsValid( SALOME_Actor*, const int theCellId );\r
-  virtual bool                IsValid( const int theCellId ) const = 0;\r
+  bool                        IsValid( SALOME_Actor*, const int theId );\r
+  virtual bool                IsValid( const int theId ) const = 0;\r
+  virtual int                 GetId() const = 0;\r
+  virtual bool                IsNodeFilter() const = 0;\r
 \r
   virtual void                SetActor( SALOME_Actor* );\r
-\r
+  \r
 protected:\r
 \r
   SALOME_Actor*               myActor;\r
diff --git a/src/VTKViewer/VTKViewer_Functor.h b/src/VTKViewer/VTKViewer_Functor.h
new file mode 100644 (file)
index 0000000..825f855
--- /dev/null
@@ -0,0 +1,98 @@
+//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//
+//
+//
+//  File   : VTKViewer_ViewFrame.h
+//  Author : Nicolas REJNERI
+//  Module : SALOME
+//  $Header$
+
+#ifndef VTKViewer_Functor_H
+#define VTKViewer_Functor_H
+
+#include <functional>
+
+#include <string>
+#include "SALOME_InteractiveObject.hxx"
+
+namespace SALOME{
+  namespace VTK{
+
+
+    template<class TActor> struct TIsSameEntry
+    {
+      std::string myEntry;
+      TIsSameEntry(const char* theEntry): myEntry(theEntry){}
+      bool operator()(TActor* theActor){
+       if(theActor->hasIO()){
+         Handle(SALOME_InteractiveObject) anIO = theActor->getIO();
+         if(anIO->hasEntry())
+           return myEntry == anIO->getEntry();
+       }
+       return false;
+      }
+    };
+
+
+    template<class TActor> struct TIsSameIObject
+    {
+      Handle(SALOME_InteractiveObject) myIObject;
+      TIsSameIObject(const Handle(SALOME_InteractiveObject)& theIObject):
+       myIObject(theIObject)
+      {}
+      bool operator()(TActor* theActor){
+       if(theActor->hasIO()){
+         Handle(SALOME_InteractiveObject) anIO = theActor->getIO();
+         return myIObject->isSame(anIO);
+       }
+       return false;
+      }
+    };
+
+
+    template<class TActor, class TArg, class TStoreArg = TArg> struct TSetFunction
+    {
+      typedef void (TActor::* TAction)(TArg);
+      TAction myAction;
+      TStoreArg myArg;
+      TSetFunction(TAction theAction, TArg theArg):
+       myAction(theAction), myArg(theArg)
+      {}
+      void operator()(TActor* theActor){
+       (theActor->*myAction)(myArg);
+      }
+    };
+
+
+    template<class TActor, class TArg = int> struct TSetVisibility: TSetFunction<TActor,TArg>
+    {
+      TSetVisibility(TArg theArg): 
+       TSetFunction<TActor,TArg>(&TActor::SetVisibility,theArg)
+      {}
+    };
+
+
+  }
+}
+
+
+#endif
index d7cbfb5c2fa642648a2390e7fedc3391014dd028..c2ac9c3cc00f51623b2e2a338e27bfec587c727b 100644 (file)
 //  $Header$
 
 #include "VTKViewer_InteractorStyleSALOME.h"
+
 #include "VTKViewer_RenderWindowInteractor.h"
 #include "VTKViewer_RenderWindow.h"
+#include "VTKViewer_ViewFrame.h"
+
 #include "VTKViewer_Utilities.h"
 #include "VTKViewer_Trihedron.h"
 #include "VTKViewer_RectPicker.h"
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 
-#include "SALOME_Selection.h"
 #include "SALOME_Actor.h"
+#include "VTKViewer_Actor.h"
+#include "SALOME_Selection.h"
 #include "SALOME_ListIteratorOfListIO.hxx"
 
 #include <vtkObjectFactory.h>
 #include <vtkMath.h>
 #include <vtkCommand.h>
-#include <vtkAssemblyNode.h>
+#include <vtkCamera.h>
+#include <vtkRenderer.h>
 #include <vtkPicker.h>
 #include <vtkPointPicker.h>
 #include <vtkCellPicker.h>
 #include <vtkLine.h> 
-#include <vtkUnstructuredGrid.h> 
-#include <vtkExtractEdges.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkDataSetCollection.h>
-#include <vtkImageData.h>
+#include <vtkMapper.h>
+#include <vtkDataSet.h>
+#include <vtkSmartPointer.h>
 
 #include <qapplication.h>
 //VRV: porting on Qt 3.0.5
 
 using namespace std;
 
-extern int SetVisibility(vtkActorCollection* theCollection, int theParam);
-extern int GetVisibility(vtkActorCollection* theCollection);
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+
+static bool IsStored(Handle(SALOME_InteractiveObject)& theIO,
+                    const SALOME_ListIO& theListIO)
+{
+  if (!theListIO.IsEmpty()){
+    SALOME_ListIteratorOfListIO anIter(theListIO);
+    for(; anIter.More(); anIter.Next()) {
+      Handle(SALOME_InteractiveObject) anIO = anIter.Value();
+      if(theIO->isSame(anIO)) {
+       theIO = anIO; //Added by SRN, fix SAL1307
+       return true;
+      }
+    }
+  }
+  return false;
+}
+
+
+static bool IsSelected(Handle(SALOME_InteractiveObject)& theIO, 
+                      SALOME_Selection* theSel)
+{
+  return IsStored(theIO,theSel->StoredIObjects());
+}
+
+
+static int GetEdgeId(vtkPicker *thePicker, SALOME_Actor *theActor, int theObjId){
+  int anEdgeId = -1;
+  if (vtkCell* aPickedCell = theActor->GetElemCell(theObjId)) {
+    float aPickPosition[3];
+    thePicker->GetPickPosition(aPickPosition);
+    float aMinDist = 1000000.0, aDist = 0;
+    for (int i = 0, iEnd = aPickedCell->GetNumberOfEdges(); i < iEnd; i++){
+      if(vtkLine* aLine = vtkLine::SafeDownCast(aPickedCell->GetEdge(i))){
+       int subId;  float pcoords[3], closestPoint[3], weights[3];
+       aLine->EvaluatePosition(aPickPosition,closestPoint,subId,pcoords,aDist,weights);
+       if (aDist < aMinDist) {
+         aMinDist = aDist;
+         anEdgeId = i;
+       }
+      }
+    }
+  }
+  return anEdgeId;
+}
+
+
+static bool CheckDimensionId(Selection_Mode theMode, SALOME_Actor *theActor, vtkIdType theObjId){
+  switch(theMode){
+  case CellSelection:
+    return true;
+  case EdgeSelection:
+    return ( theActor->GetObjDimension( theObjId ) == 1 );
+  case FaceSelection:
+    return ( theActor->GetObjDimension( theObjId ) == 2 );
+  case VolumeSelection:
+    return ( theActor->GetObjDimension( theObjId ) == 3 );
+  };
+  return false;
+}
+
 
 //----------------------------------------------------------------------------
 vtkStandardNewMacro(VTKViewer_InteractorStyleSALOME);
@@ -84,25 +152,46 @@ VTKViewer_InteractorStyleSALOME::VTKViewer_InteractorStyleSALOME()
   this->ForcedState = VTK_INTERACTOR_STYLE_CAMERA_NONE;
   loadCursors();
 
-  myPActor = vtkActor::New();
-  myPActor->PickableOff();
-  myPActor->GetProperty()->SetColor(0,1,1);
-  myPActor->GetProperty()->SetLineWidth(5);
-  myPActor->GetProperty()->SetPointSize(5);
+  myPreSelectionActor = VTKViewer_Actor::New();
+  myPreSelectionActor->GetProperty()->SetColor(0,1,1);
+  myPreSelectionActor->GetProperty()->SetLineWidth(5);
+  myPreSelectionActor->GetProperty()->SetPointSize(5);
+
+  OnSelectionModeChanged();
 }
 
 //----------------------------------------------------------------------------
 VTKViewer_InteractorStyleSALOME::~VTKViewer_InteractorStyleSALOME() 
 {
+  if(MYDEBUG) INFOS("VTKViewer_InteractorStyleSALOME::~VTKViewer_InteractorStyleSALOME()");
+  m_ViewFrame->RemoveActor(myPreSelectionActor);
 }
 
 //----------------------------------------------------------------------------
 void VTKViewer_InteractorStyleSALOME::setPreselectionProp(const double& theRed, const double& theGreen, 
                                                          const double& theBlue, const int& theWidth) 
 {
-  myPActor->GetProperty()->SetColor(theRed, theGreen, theBlue);
-  myPActor->GetProperty()->SetLineWidth(theWidth);
-  myPActor->GetProperty()->SetPointSize(theWidth);
+  myPreSelectionActor->GetProperty()->SetColor(theRed, theGreen, theBlue);
+  myPreSelectionActor->GetProperty()->SetLineWidth(theWidth);
+  myPreSelectionActor->GetProperty()->SetPointSize(theWidth);
+}
+
+//----------------------------------------------------------------------------
+void VTKViewer_InteractorStyleSALOME::SetInteractor(vtkRenderWindowInteractor *theInteractor){
+  m_Interactor = dynamic_cast<VTKViewer_RenderWindowInteractor*>(theInteractor);
+  Superclass::SetInteractor(theInteractor);
+}
+
+//----------------------------------------------------------------------------
+void VTKViewer_InteractorStyleSALOME::setViewFrame(VTKViewer_ViewFrame* theViewFrame){
+  m_ViewFrame = theViewFrame;
+  m_ViewFrame->AddActor(myPreSelectionActor);
+  myPreSelectionActor->Delete();
+}
+
+//----------------------------------------------------------------------------
+void VTKViewer_InteractorStyleSALOME::setGUIWindow(QWidget* theWindow){
+  myGUIWindow = theWindow;
 }
 
 //----------------------------------------------------------------------------
@@ -134,28 +223,18 @@ void VTKViewer_InteractorStyleSALOME::RotateXY(int dx, int dy)
   cam->Elevation(ryf);
   cam->OrthogonalizeViewUp();
   ::ResetCameraClippingRange(this->CurrentRenderer); 
-  this->Interactor->Render();
+  //this->Interactor->Render();
+  myGUIWindow->update();
 }
 
 //----------------------------------------------------------------------------
 void VTKViewer_InteractorStyleSALOME::PanXY(int x, int y, int oldX, int oldY)
 {
   TranslateView(x, y, oldX, oldY);   
-  //vtkRenderWindowInteractor *rwi = this->Interactor;
-  /* VSV Light follows camera: if (this->CurrentLight)
-    {
-      vtkCamera *cam = this->CurrentRenderer->GetActiveCamera();
-      this->CurrentLight->SetPosition(cam->GetPosition());
-      this->CurrentLight->SetFocalPoint(cam->GetFocalPoint());
-      }*/
-    
-  this->Interactor->Render();
+  //this->Interactor->Render();
+  myGUIWindow->update();
 }
 
-//----------------------------------------------------------------------------
-void VTKViewer_InteractorStyleSALOME::ControlLblSize(double aOldScale, double aNewScale) {
-  return;
-}
 
 //----------------------------------------------------------------------------
 void VTKViewer_InteractorStyleSALOME::DollyXY(int dx, int dy)
@@ -174,20 +253,14 @@ void VTKViewer_InteractorStyleSALOME::DollyXY(int dx, int dy)
     aCam->Dolly(zoomFactor);
     ::ResetCameraClippingRange(this->CurrentRenderer);
   }
-  
-  /* VSV Light follows camera: if (this->CurrentLight)
-    {      
-      this->CurrentLight->SetPosition(cam->GetPosition());
-      this->CurrentLight->SetFocalPoint(cam->GetFocalPoint());
-      }*/
-  
-  this->Interactor->Render();
+
+  //this->Interactor->Render();
+  myGUIWindow->update();
 }
 
 //----------------------------------------------------------------------------
 void VTKViewer_InteractorStyleSALOME::SpinXY(int x, int y, int oldX, int oldY)
 {
-  vtkRenderWindowInteractor *rwi = this->Interactor;
   vtkCamera *cam;
 
   if (this->CurrentRenderer == NULL)
@@ -207,7 +280,8 @@ void VTKViewer_InteractorStyleSALOME::SpinXY(int x, int y, int oldX, int oldY)
   cam->Roll(newAngle - oldAngle);
   cam->OrthogonalizeViewUp();
       
-  rwi->Render();
+  //this->Interactor->Render();
+  myGUIWindow->update();
 }
 
 
@@ -253,6 +327,8 @@ void VTKViewer_InteractorStyleSALOME::OnLeftButtonDown(int ctrl, int shift,
   }
   return;
 }
+
+
 //----------------------------------------------------------------------------
 void VTKViewer_InteractorStyleSALOME::OnLeftButtonUp(int vtkNotUsed(ctrl),
                                                     int shift, 
@@ -267,6 +343,7 @@ void VTKViewer_InteractorStyleSALOME::OnLeftButtonUp(int vtkNotUsed(ctrl),
   }
 }
 
+
 //----------------------------------------------------------------------------
 void VTKViewer_InteractorStyleSALOME::OnMiddleButtonDown(int ctrl,
                                                         int shift, 
@@ -297,6 +374,8 @@ void VTKViewer_InteractorStyleSALOME::OnMiddleButtonDown(int ctrl,
       startOperation(VTK_INTERACTOR_STYLE_CAMERA_PAN);
   }
 }
+
+
 //----------------------------------------------------------------------------
 void VTKViewer_InteractorStyleSALOME::OnMiddleButtonUp(int vtkNotUsed(ctrl),
                                                       int shift, 
@@ -311,6 +390,7 @@ void VTKViewer_InteractorStyleSALOME::OnMiddleButtonUp(int vtkNotUsed(ctrl),
   }
 }
 
+
 //----------------------------------------------------------------------------
 void VTKViewer_InteractorStyleSALOME::OnRightButtonDown(int ctrl,
                                                        int shift, 
@@ -357,12 +437,6 @@ void VTKViewer_InteractorStyleSALOME::OnRightButtonUp(int vtkNotUsed(ctrl),
 }
 
 //----------------------------------------------------------------------------
-void VTKViewer_InteractorStyleSALOME::PrintSelf(ostream& os, vtkIndent indent)
-{
-  vtkInteractorStyle::PrintSelf(os,indent);
-
-}
-
 /* XPM */
 const char* imageZoomCursor[] = { 
 "32 32 3 1",
@@ -440,6 +514,8 @@ const char* imageRotateCursor[] = {
 "................................",
 "................................"};
 
+
+//----------------------------------------------------------------------------
 // loads cursors for viewer operations - zoom, pan, etc...
 void VTKViewer_InteractorStyleSALOME::loadCursors()
 {
@@ -453,6 +529,8 @@ void VTKViewer_InteractorStyleSALOME::loadCursors()
   myCursorState     = false;
 }
 
+
+//----------------------------------------------------------------------------
 // event filter - controls mouse and keyboard events during viewer operations
 bool VTKViewer_InteractorStyleSALOME::eventFilter(QObject* object, QEvent* event)
 {
@@ -465,6 +543,8 @@ bool VTKViewer_InteractorStyleSALOME::eventFilter(QObject* object, QEvent* event
   return QObject::eventFilter(object, event);
 }
 
+
+//----------------------------------------------------------------------------
 // starts Zoom operation (e.g. through menu command)
 void VTKViewer_InteractorStyleSALOME::startZoom()
 {
@@ -478,6 +558,8 @@ void VTKViewer_InteractorStyleSALOME::startZoom()
   qApp->installEventFilter(this);
 }
 
+
+//----------------------------------------------------------------------------
 // starts Pan operation (e.g. through menu command)
 void VTKViewer_InteractorStyleSALOME::startPan()
 {
@@ -491,6 +573,7 @@ void VTKViewer_InteractorStyleSALOME::startPan()
   qApp->installEventFilter(this);
 }
 
+//----------------------------------------------------------------------------
 // starts Rotate operation (e.g. through menu command)
 void VTKViewer_InteractorStyleSALOME::startRotate()
 {
@@ -504,6 +587,8 @@ void VTKViewer_InteractorStyleSALOME::startRotate()
   qApp->installEventFilter(this);
 }
 
+
+//----------------------------------------------------------------------------
 // starts Spin operation (e.g. through menu command)
 void VTKViewer_InteractorStyleSALOME::startSpin()
 {
@@ -518,6 +603,8 @@ void VTKViewer_InteractorStyleSALOME::startSpin()
 }
 
 
+
+//----------------------------------------------------------------------------
 // starts Fit Area operation (e.g. through menu command)
 void VTKViewer_InteractorStyleSALOME::startFitArea()
 {
@@ -532,6 +619,7 @@ void VTKViewer_InteractorStyleSALOME::startFitArea()
 }
 
 
+//----------------------------------------------------------------------------
 void  VTKViewer_InteractorStyleSALOME::ViewFitAll() {
   int aTriedronWasVisible = false;
   if(m_Trihedron){
@@ -552,6 +640,7 @@ void  VTKViewer_InteractorStyleSALOME::ViewFitAll() {
 }
 
 
+//----------------------------------------------------------------------------
 // starts Global Panning operation (e.g. through menu command)
 void VTKViewer_InteractorStyleSALOME::startGlobalPan()
 {
@@ -568,26 +657,14 @@ void VTKViewer_InteractorStyleSALOME::startGlobalPan()
   myScale = cam->GetParallelScale();
 
   ViewFitAll();
-  // make fit all
-//   int TriedronWasVisible = false;
-//   if(m_Trihedron){
-//     TriedronWasVisible = 
-//       m_Trihedron->GetVisibility() == VTKViewer_Trihedron::eOn;
-//     if(TriedronWasVisible) m_Trihedron->VisibilityOff();
-//   }
-
-//   ::ResetCamera(this->CurrentRenderer);
-  
-//   if(m_Trihedron)
-//     if(TriedronWasVisible) 
-//       m_Trihedron->VisibilityOn();
 
-  //VTKViewer_RenderWindow* aRW = dynamic_cast<VTKViewer_RenderWindow*>(this->Interactor->GetRenderWindow());
   if (myGUIWindow) myGUIWindow->update();
   
   qApp->installEventFilter(this);
 }
 
+
+//----------------------------------------------------------------------------
 // returns TRUE if needs redrawing
 bool VTKViewer_InteractorStyleSALOME::needsRedrawing()
 {
@@ -598,6 +675,8 @@ bool VTKViewer_InteractorStyleSALOME::needsRedrawing()
          State == VTK_INTERACTOR_STYLE_CAMERA_NONE;
 }
 
+
+//----------------------------------------------------------------------------
 // fits viewer contents to rect
 void VTKViewer_InteractorStyleSALOME::fitRect(const int left, 
                                        const int top, 
@@ -627,18 +706,11 @@ void VTKViewer_InteractorStyleSALOME::fitRect(const int left,
     ::ResetCameraClippingRange(this->CurrentRenderer);
   }
   
-  //vtkRenderWindowInteractor *rwi = this->Interactor;
-  /* VSV Light follows camera: if (this->CurrentLight) {
-    this->CurrentLight->SetPosition(cam->GetPosition());
-    this->CurrentLight->SetFocalPoint(cam->GetFocalPoint());
-    }*/
-  //  rwi->Render();
-  //VTKViewer_RenderWindow* aRW = dynamic_cast<VTKViewer_RenderWindow*>(rwi->GetRenderWindow());
   myGUIWindow->update();
 }
 
 
-
+//----------------------------------------------------------------------------
 // starts viewer operation (!internal usage!)
 void VTKViewer_InteractorStyleSALOME::startOperation(int operation)
 {
@@ -666,6 +738,8 @@ void VTKViewer_InteractorStyleSALOME::startOperation(int operation)
   }
 }
 
+
+//----------------------------------------------------------------------------
 // sets proper cursor for window when viewer operation is activated
 void VTKViewer_InteractorStyleSALOME::setCursor(const int operation)
 {
@@ -705,6 +779,8 @@ void VTKViewer_InteractorStyleSALOME::setCursor(const int operation)
   }
 }
 
+
+//----------------------------------------------------------------------------
 // called when viewer operation started (!put necessary initialization here!)
 void VTKViewer_InteractorStyleSALOME::onStartOperation()
 {
@@ -730,6 +806,8 @@ void VTKViewer_InteractorStyleSALOME::onStartOperation()
   }
 }
 
+
+//----------------------------------------------------------------------------
 // called when viewer operation finished (!put necessary post-processing here!)
 void VTKViewer_InteractorStyleSALOME::onFinishOperation() 
 {
@@ -738,7 +816,6 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
 
   QAD_Study* aActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
   SALOME_Selection* aSel    = SALOME_Selection::Selection( aActiveStudy->getSelection() );
-  vtkRenderWindowInteractor *rwi = this->Interactor;
 
   // VSV: LOD actor activisation
   //  rwi->GetRenderWindow()->SetDesiredUpdateRate(rwi->GetStillUpdateRate());
@@ -759,7 +836,7 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
       if (State == VTK_INTERACTOR_STYLE_CAMERA_FIT) {
         // making fit rect opeation 
         int w, h, x, y;
-        rwi->GetSize(w, h);
+        m_Interactor->GetSize(w, h);
         int x1, y1, x2, y2;
         x1 = rect.left(); 
         y1 = h - rect.top() - 1;
@@ -769,260 +846,114 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
       }
       else {
         if (myPoint == myOtherPoint) {
-        // process point selection
+         // process point selection
           int w, h, x, y;
-          rwi->GetSize(w, h);
+          m_Interactor->GetSize(w, h);
           x = myPoint.x(); 
           y = h - myPoint.y() - 1;
-          vtkActorCollection* listactors = NULL;
+
           this->FindPokedRenderer(x, y);
-         rwi->StartPickCallback();
+         m_Interactor->StartPickCallback();
 
-//       vtkPicker* aPicker = vtkPicker::SafeDownCast(rwi->GetPicker());
-//       if (aPicker)
-//         aPicker->SetTolerance(0.01);
-         
-          rwi->GetPicker()->Pick(x, y, 0.0, this->CurrentRenderer);
+         vtkPicker* aPicker = vtkPicker::SafeDownCast(m_Interactor->GetPicker());
+          aPicker->Pick(x, y, 0.0, this->CurrentRenderer);
     
-          if ( rwi->GetPicker()->IsA("vtkCellPicker") ) {
-            vtkCellPicker* picker;
-            if ( (picker = vtkCellPicker::SafeDownCast(rwi->GetPicker())) ) {
-             int aVtkId = picker->GetCellId();
-             // INFOS ( " CellId : " << aVtkId );
-              if ( aVtkId >= 0 ) {
-                vtkActor* ac = picker->GetActor();
-                if ( ac->IsA("SALOME_Actor") ) {
-                  SALOME_Actor* SActor = SALOME_Actor::SafeDownCast( ac );
-                  INFOS ( " NAME Actor : " << SActor->getName() << ", CellId : " << aVtkId );
-
-                  //Cell selection /////////////////////////////// NB
-                  if ( aSelectionMode == CellSelection ) {
-                    if ( SActor->hasIO() && isValid( SActor, aVtkId, aSelectionMode ) ) {
-                      Handle(SALOME_InteractiveObject) IO = SActor->getIO();
-                      // Look in the current selection
-                      SALOME_ListIteratorOfListIO It(aSel->StoredIObjects());
-                      Standard_Boolean IsSelected = false;
-                      for(;It.More();It.Next()) {
-                        Handle(SALOME_InteractiveObject) IOS = It.Value();
-                        if(IO->isSame(IOS)) {
-                          IsSelected = true;
-                         IO = IOS; //Added by SRN, fix SAL1307
-                          break;
-                       }
-                      }
-
-                     int anObjId = SActor->GetObjId(aVtkId);
-                     std::vector<int> aVtkList;
-                     if (anObjId != -1) {
-                       aVtkList = SActor->GetVtkId(anObjId);
-                     }
-
-                     if (IsSelected) {
-                       // This IO is already in the selection
-                       if (aVtkList.size() > 0)
-                         bool add = aSel->AddOrRemoveIndex( IO, aVtkList, myShiftState, false );
-                       else
-                         bool add = aSel->AddOrRemoveIndex( IO, aVtkId, myShiftState, false );
-                     } else {
-                       if (!myShiftState) {
-                         this->HighlightProp( NULL );
-                         aSel->ClearIObjects();
-                       }
-                       if (aVtkList.size() > 0)
-                         bool add = aSel->AddOrRemoveIndex( IO, aVtkList, myShiftState, false );
-                       else
-                         bool add = aSel->AddOrRemoveIndex( IO, aVtkId, myShiftState, false );
-                       aSel->AddIObject( IO, false );
-                     }
-                    }
-                 }
-                 //Edge, Face, Volume and EdgeOfCell selection ////////////////////////// NB
-                  else if ( aSelectionMode == EdgeSelection || 
-                           aSelectionMode == FaceSelection || 
-                           aSelectionMode == VolumeSelection  ||
-                           aSelectionMode == EdgeOfCellSelection ) {
-                   if ( SActor->hasIO() && isValid( SActor, aVtkId, aSelectionMode ) ) {
-                     Handle(SALOME_InteractiveObject) IO = SActor->getIO();
-                     if (vtkDataSet* UGrid = SActor->GetMapper()->GetInput()) {
-                       if (vtkCell* pickedCell = UGrid->GetCell(aVtkId)) {
-                         bool result = false;
-                         int edgeId = -1;
-                         int anObjId = SActor->GetObjId(aVtkId);
-                         std::vector<int> aVtkList;
-                         if (anObjId > -1)
-                           aVtkList = SActor->GetVtkId(anObjId);
-
-                         if (aSelectionMode == EdgeSelection) {
-                           if ( SActor->GetObjDimension( anObjId ) == 1 )
-                             result = true;
-                         }
-                         else if ( aSelectionMode == FaceSelection ) {
-                           if ( SActor->GetObjDimension( anObjId ) == 2 )
-                             result = true;
-                         }
-                         else if (aSelectionMode == VolumeSelection) {
-                           if ( SActor->GetObjDimension( anObjId ) == 3 )
-                             result = true;
-                         }
-                         else {
-                           float pickPosition[3];
-                           picker->GetPickPosition(pickPosition);
-                           float distMin = 1000000.0, dist = 0;
-                           for (int i = 0, iEnd = pickedCell->GetNumberOfEdges(); i < iEnd; i++){
-                             vtkCell* edge = pickedCell->GetEdge(i);
-                             if (vtkLine* line = vtkLine::SafeDownCast(edge)){
-                               float pcoords[3],closestPoint[3],weights[3];
-                               int subId;
-                               line->EvaluatePosition(pickPosition,closestPoint,subId,pcoords,dist,weights);
-                               if (dist < distMin) {
-                                 distMin = dist;
-                                 edgeId = i;
-                               }
-                             }
-                           }
-                           if (edgeId != -1 || pickedCell->GetCellDimension() == 1) 
-                             result = true;
-                           INFOS("edgeID transformed = "<<edgeId);
-                         }
-                         if (result) {
-                           // Look in the current selection
-                           SALOME_ListIteratorOfListIO It(aSel->StoredIObjects());
-                           Standard_Boolean IsSelected = false;
-                           for(;It.More();It.Next()) {
-                             Handle(SALOME_InteractiveObject) IOS = It.Value();
-                             if(IO->isSame(IOS)) {
-                               IO = IOS; //Added by SRN, fix SAL1307
-                               IsSelected = true;
-                               break;
-                             }
-                           }
-                           if (!myShiftState) {
-                             this->HighlightProp( NULL );
-                             aSel->ClearIObjects();
-                           }
-                           // aSel->SetSelectionMode(EdgeSelection, true);
-                           if (aVtkList.size() > 0)
-                             aSel->AddOrRemoveIndex( IO, aVtkList, true, false);
-                           else
-                             aSel->AddOrRemoveIndex( IO, aVtkId, true, false);
-                           if (edgeId >= 0)
-                             aSel->AddOrRemoveIndex( IO, -edgeId-1, true, true );
-                           aSel->AddIObject( IO, false );
-                         }
-                       }
+         SALOME_Actor* SActor = SALOME_Actor::SafeDownCast(aPicker->GetActor());
+
+          if (vtkCellPicker* picker = vtkCellPicker::SafeDownCast(aPicker)) {
+           int aVtkId = picker->GetCellId();
+           if ( aVtkId >= 0 && SActor && SActor->hasIO() && IsValid( SActor, aVtkId ) ) {
+             int anObjId = SActor->GetElemObjId(aVtkId);
+             if(anObjId >= 0){
+               Handle(SALOME_InteractiveObject) IO = SActor->getIO();
+               if(aSelectionMode != EdgeOfCellSelection) {
+                 if(CheckDimensionId(aSelectionMode,SActor,anObjId)){
+                   if(MYDEBUG) INFOS(" CellId : "<<anObjId);
+                   if (IsSelected(IO,aSel)) {
+                     // This IO is already in the selection
+                     aSel->AddOrRemoveIndex( IO, anObjId, myShiftState, false );
+                   } else {
+                     if (!myShiftState) {
+                       this->HighlightProp( NULL );
+                       aSel->ClearIObjects();
                      }
+                     aSel->AddOrRemoveIndex( IO, anObjId, myShiftState, false );
+                     aSel->AddIObject( IO, false );
                    }
                  }
-                }
-             } else {
-               this->HighlightProp( NULL );
-               aSel->ClearIObjects();
-              }
-            }
-          } else if ( rwi->GetPicker()->IsA("vtkPointPicker") ) {
-            vtkPointPicker* picker;
-            if ( (picker = vtkPointPicker::SafeDownCast(rwi->GetPicker())) ) {
-              INFOS ( " PointId : " << picker->GetPointId() );
-              if ( picker->GetPointId() >= 0 ) {
-                vtkActor* ac = picker->GetActor();
-                if ( ac->IsA("SALOME_Actor") ) {
-                  SALOME_Actor* SActor = SALOME_Actor::SafeDownCast( ac );
-                  INFOS ( " NAME Actor : " << SActor->getName() );
-                  if ( SActor->hasIO() ) {
-                    Handle(SALOME_InteractiveObject) IO = SActor->getIO();
-                   /*
-                   if (IO.IsNull()) 
-                     break;
-                   if (aSelActiveCompOnly && 
-                       strcmp(aActiveComponent->ComponentDataType(), 
-                              IO->getComponentDataType()) != 0) {
-                     break;
+               }else{
+                 if (!myShiftState) {
+                   this->HighlightProp( NULL );
+                   aSel->ClearIObjects();
+                 }
+                 int anEdgeId = GetEdgeId(picker,SActor,anObjId);
+                 if (anEdgeId >= 0) {
+                   if(MYDEBUG) INFOS(" CellId : "<<anObjId<<"; EdgeId : "<<anEdgeId);
+                   aSel->AddOrRemoveIndex( IO, anObjId, true, false);
+                   aSel->AddOrRemoveIndex( IO, -anEdgeId-1, true, true );
+                   aSel->AddIObject( IO, false );
+                 } 
+               }
+             }
+           } else {
+             this->HighlightProp( NULL );
+             aSel->ClearIObjects();
+           }
+          } else if ( vtkPointPicker* picker = vtkPointPicker::SafeDownCast(aPicker) ) {
+           int aVtkId = picker->GetPointId();
+           if ( aVtkId >= 0 && IsValid( SActor, aVtkId, true ) ) {
+             if ( SActor && SActor->hasIO() ) {
+               int anObjId = SActor->GetNodeObjId(aVtkId);
+               if(anObjId >= 0){
+                 Handle(SALOME_InteractiveObject) IO = SActor->getIO();
+                 if(IsSelected(IO,aSel)) {
+                   // This IO is already in the selection
+                   aSel->AddOrRemoveIndex( IO, anObjId, myShiftState, false );
+                 } else {
+                   if(!myShiftState) {
+                     this->HighlightProp( NULL );
+                     aSel->ClearIObjects();
                    }
-                   */
-                    // Look in the current selection
-                    SALOME_ListIteratorOfListIO It(aSel->StoredIObjects());
-                    Standard_Boolean IsSelected = false;
-                    for(;It.More();It.Next()) {
-                      Handle(SALOME_InteractiveObject) IOS = It.Value();
-                      if(IO->isSame(IOS)) {
-                       IO = IOS; //Added by SRN, fix SAL1307
-                        IsSelected = true;
-                        break;
-                      }
-                    }
-                    if(IsSelected) {
-                      // This IO is already in the selection
-                      bool add = aSel->AddOrRemoveIndex( IO, picker->GetPointId(), myShiftState, false );
-                    } else {
-                      if(!myShiftState) {
-                        this->HighlightProp( NULL );
-                        aSel->ClearIObjects();
-                      }
-                      bool add = aSel->AddOrRemoveIndex( IO, picker->GetPointId(), myShiftState, false );
-                      aSel->AddIObject( IO, false );
-                    }
-                  }
-                } 
-              } else {
-                this->HighlightProp( NULL );
-                aSel->ClearIObjects();
-              } 
-            }
-          } else {
-            vtkPicker* picker;
-            if ( (picker = vtkPicker::SafeDownCast(rwi->GetPicker())) )        {
-              listactors = picker->GetActors();
-            }
-            if ( listactors->GetNumberOfItems() == 0 ) {
-              // No selection clear all
-              this->PropPicked = 0;
-              this->HighlightProp( NULL );
-              aSel->ClearIObjects();
-            } else {
-              vtkActor* ac;
-              listactors->InitTraversal();
-              ac = listactors->GetNextActor();
-              if ( ac->IsA("SALOME_Actor") ) {
-                SALOME_Actor* SActor = SALOME_Actor::SafeDownCast( ac );
-                if ( SActor->hasIO() ) {      
-                  this->PropPicked++;
-                  Handle(SALOME_InteractiveObject) IO = SActor->getIO();
-                  // Look in the current selection
-                  SALOME_ListIteratorOfListIO It(aSel->StoredIObjects());
-                  Standard_Boolean IsSelected = false;
-                  for(;It.More();It.Next()) {
-                    Handle(SALOME_InteractiveObject) IOS = It.Value();
-                    if( IO->isSame(IOS) ) {
-                     IO = IOS; //Added by SRN, fix SAL1307
-                      IsSelected = true;
-                      break;
-                    }
-                  }
-                  if(IsSelected) {
-                    // This IO is already in the selection
-                    if(myShiftState) {
-                      aSel->RemoveIObject(IO);
-                    }
-                  }
-                  else {
-                    if(!myShiftState) {
-                      this->HighlightProp( NULL );
-                      aSel->ClearIObjects();
-                    }
-                    aSel->AddIObject( IO, false );
-                  }
-                }
-              }
-            }
-          }
-         rwi->EndPickCallback();
+                   if(MYDEBUG) INFOS(" PointId : "<<anObjId);
+                   aSel->AddOrRemoveIndex( IO, anObjId, myShiftState, false );
+                   aSel->AddIObject( IO, false );
+                 }
+               }
+             }
+           } else {
+             this->HighlightProp( NULL );
+             aSel->ClearIObjects();
+           } 
+         } else {
+           if ( SActor && SActor->hasIO() ) {
+             this->PropPicked++;
+             Handle(SALOME_InteractiveObject) IO = SActor->getIO();
+             if(IsSelected(IO,aSel)) {
+               // This IO is already in the selection
+               if(myShiftState) {
+                 aSel->RemoveIObject(IO);
+               }
+             }
+             else {
+               if(!myShiftState) {
+                 this->HighlightProp( NULL );
+                 aSel->ClearIObjects();
+               }
+               aSel->AddIObject( IO, false );
+             }
+           }else{
+             // No selection clear all
+             this->PropPicked = 0;
+             this->HighlightProp( NULL );
+             aSel->ClearIObjects();
+           }
+         }
+         m_Interactor->EndPickCallback();
         } else {
           //processing rectangle selection
-         SALOMEDS::SComponent_var aActiveComponent = 
-           SALOMEDS::SComponent::_narrow(aActiveStudy->getStudyDocument()->
-                                         FindObject(QAD_Application::getDesktop()->getActiveComponent()));
-         if(aSelActiveCompOnly && aActiveComponent->_is_nil()) return;
-         rwi->StartPickCallback();
+         QString aComponentDataType = QAD_Application::getDesktop()->getComponentDataType();
+         if(aSelActiveCompOnly && aComponentDataType.isEmpty()) return;
+         m_Interactor->StartPickCallback();
 
          if (!myShiftState) {
            this->PropPicked = 0;
@@ -1035,7 +966,7 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
          QRect rect(myPoint, myOtherPoint);
          rect = rect.normalize();
          int w, h, x, y;
-         rwi->GetSize(w, h);
+         m_Interactor->GetSize(w, h);
          int x1, y1, x2, y2;
          x1 = rect.left(); 
          y1 = h - rect.top() - 1;
@@ -1043,70 +974,49 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
          y2 = h - rect.bottom() - 1;
 
          switch (aSelectionMode) {
-         case NodeSelection: // Nodes selection
-           {
-             if (! rwi->GetPicker()->IsA("vtkPointPicker") ) break;
-             vtkPointPicker* aPointPicker = vtkPointPicker::SafeDownCast(rwi->GetPicker());
+         case NodeSelection: {
+           if ( vtkPointPicker* aPointPicker = vtkPointPicker::SafeDownCast(m_Interactor->GetPicker()) ) {
              vtkActorCollection* aListActors = this->CurrentRenderer->GetActors();
              aListActors->InitTraversal();
-             vtkActor* aActor;
-             for (int k = 0; k < aListActors->GetNumberOfItems(); k++) {
-               aActor = aListActors->GetNextActor();
-               if (aActor != NULL) {
-                 if (aActor->GetVisibility() == 0) 
-                   continue;
-                 vtkAbstractMapper3D* aMapper3D = aActor->GetMapper();
-                 if ((aMapper3D != NULL) && (aActor->IsA("SALOME_Actor"))) {
-                   SALOME_Actor* SActor = SALOME_Actor::SafeDownCast(aActor);
-
-                   if ((SActor != NULL) && (SActor->hasIO())) {
-                     Handle(SALOME_InteractiveObject) IO = SActor->getIO();
-                     if (IO.IsNull()) 
-                       continue;
-                     if (aSelActiveCompOnly && 
-                         strcmp(aActiveComponent->ComponentDataType(), 
-                                IO->getComponentDataType()) != 0) {
-                       continue;
-                     }
-
-                     vtkMapper*       aMapper;
-                     vtkVolumeMapper* aVolumeMapper;
-                     vtkDataSet*      aDataSet;
-                     
-                     if ( (aMapper = vtkMapper::SafeDownCast(aMapper3D)) != NULL ) {
-                       aDataSet = aMapper->GetInput();
-                     } else if ((aVolumeMapper = vtkVolumeMapper::SafeDownCast(aMapper3D)) != NULL ){
-                       aDataSet = aVolumeMapper->GetInput();
-                     } else {
-                       continue;
-                     }
-                     if (aDataSet) {
-
-                       std::vector<int> anIndices;
-                       for (int i=0; i < aDataSet->GetNumberOfPoints(); i++) {
-                         float* aPoint;
-                         aPoint = aDataSet->GetPoint(i);
-                         if (IsInRect(aPoint,  x1, y1, x2, y2)) {
-                           float aDisp[3];
-                           ComputeWorldToDisplay(aPoint[0],
-                                                 aPoint[1],
-                                                 aPoint[2], aDisp);
-                           aPointPicker->Pick(aDisp[0], aDisp[1], 0.0, CurrentRenderer);
-
-                           int pid = aPointPicker->GetPointId();
-                           if ( pid >= 0) { // && (!aSel->IsIndexSelected(IO, aPointPicker->GetPointId()))) {
-                             std::vector<int>::iterator found = 
-                               find(anIndices.begin(), anIndices.end(), pid);
-                             if (found == anIndices.end())
-                               anIndices.push_back(pid);
-                           }
+             while (vtkActor* aActor = aListActors->GetNextActor()) {
+               if (!aActor->GetVisibility()) 
+                 continue;
+               if(SALOME_Actor* SActor = SALOME_Actor::SafeDownCast(aActor)) {
+                 if (SActor->hasIO()) {
+                   Handle(SALOME_InteractiveObject) IO = SActor->getIO();
+                   if (IO.IsNull()) 
+                     continue;
+                   if (aSelActiveCompOnly && aComponentDataType != IO->getComponentDataType())
+                     continue;
+                   if (vtkDataSet* aDataSet = SActor->GetInput()) {
+                     SALOME_Selection::TContainerOfId anIndices;
+                     for(int i = 0; i < aDataSet->GetNumberOfPoints(); i++) {
+                       float aPoint[3];
+                       aDataSet->GetPoint(i,aPoint);
+                       if (IsInRect(aPoint,x1,y1,x2,y2)){
+                         float aDisp[3];
+                         ComputeWorldToDisplay(aPoint[0],aPoint[1],aPoint[2],aDisp);
+                         if(aPointPicker->Pick(aDisp[0],aDisp[1],0.0,CurrentRenderer)){
+                           if(vtkActorCollection *anActorCollection = aPointPicker->GetActors()){
+                             if(anActorCollection->IsItemPresent(SActor)){
+                               float aPickedPoint[3];
+                               aPointPicker->GetMapperPosition(aPickedPoint);
+                               vtkIdType aVtkId = aDataSet->FindPoint(aPickedPoint);
+                               if ( aVtkId >= 0 && IsValid( SActor, aVtkId, true ) ){
+                                 int anObjId = SActor->GetNodeObjId(aVtkId);
+                                 anIndices.insert(anObjId);
+                               }
+                             }
+                           }
                          }
                        }
-                       if (!anIndices.empty()) {
-                         aSel->AddOrRemoveIndex(IO, anIndices, true, false);
-                         aSel->AddIObject(IO, false);
-                         anIndices.clear();
-                       }
+                     }
+                     if (!anIndices.empty()) {
+                       aSel->AddOrRemoveIndex(IO, anIndices, true, false);
+                       aSel->AddIObject(IO, false);
+                       anIndices.clear();
+                     }else{
+                       aSel->RemoveIObject(IO, false);
                      }
                    }
                  }
@@ -1114,100 +1024,40 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
              }
            }
            break;
+         }
          case CellSelection:
          case EdgeOfCellSelection:
          case EdgeSelection:
          case FaceSelection:
          case VolumeSelection: 
            {
-             VTKViewer_CellRectPicker* picker = VTKViewer_CellRectPicker::New();
+             vtkSmartPointer<VTKViewer_CellRectPicker> picker = VTKViewer_CellRectPicker::New();
              picker->SetTolerance(0.001);
              picker->Pick(x1, y1, 0.0, x2, y2, 0.0, this->CurrentRenderer);
-
+             
              vtkActorCollection* aListActors = picker->GetActors();
-             vtkActor* aActor;
              aListActors->InitTraversal();
-             while(aActor = aListActors->GetNextActor()) {
-               if (aActor->IsA("SALOME_Actor")) {
-                 SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast(aActor);
+             while(vtkActor* aActor = aListActors->GetNextActor()) {
+               if (SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast(aActor)) {
                  if (aSActor->hasIO()) {
                    Handle(SALOME_InteractiveObject) aIO = aSActor->getIO();
-                   // INFOS ( " NAME Object : " << aIO->getName() << " from " << aIO->getComponentDataType() );
-                   if (aSelActiveCompOnly &&
-                       strcmp(aActiveComponent->ComponentDataType(), 
-                              aIO->getComponentDataType()) != 0) {
+                   if (aSelActiveCompOnly && aComponentDataType != aIO->getComponentDataType())
                      continue;
-                   }
                    VTKViewer_CellDataSet cellList = picker->GetCellData(aActor);
                    if ( !cellList.empty() ) {
-                     INFOS ( " NAME Actor : " << aSActor->getName() );
-                     std::vector<int> anIndexes;
-                     if (aSelectionMode == CellSelection) {
-                       VTKViewer_CellDataSet::iterator it;
-                       for (it = cellList.begin(); it != cellList.end(); ++it) {
-                         int aCellId = (*it).cellId;
-                         if ( !isValid( aSActor, aCellId, aSelectionMode ) )
-                           continue;
-                                     
-                         int aObjId = aSActor->GetObjId(aCellId);
-                         std::vector<int> aVtkList;
-                         if ( aObjId != -1 )
-                           aVtkList = aSActor->GetVtkId(aObjId);
-                                     
-                         if (aVtkList.size() > 0) {
-                           std::vector<int>::iterator it;
-                           for (it = aVtkList.begin(); it != aVtkList.end(); ++it) {
-                             std::vector<int>::iterator found = 
-                               find(anIndexes.begin(), anIndexes.end(), *it);
-                             if (found == anIndexes.end())
-                               anIndexes.push_back(*it);
-                           }
-                         }
-                         else
-                           anIndexes.push_back(aCellId);
-                       }
-                     }
-                     else {
-                       if ( vtkDataSet* aDataSet = aSActor->GetMapper()->GetInput() ) {
-                         VTKViewer_CellDataSet::iterator it;
-                         for ( it = cellList.begin(); it != cellList.end(); ++it ) {
-                           int aCellId = (*it).cellId;
-                                         
-                           if ( !isValid( aSActor, aCellId, aSelectionMode ) )
-                             continue;
-                                         
-                           int aObjId = aSActor->GetObjId(aCellId);
-                           std::vector<int> aVtkList;
-                           if (aObjId != -1)
-                             aVtkList = aSActor->GetVtkId(aObjId);
-                           bool result = false;
-                           if (vtkCell* aCell = aDataSet->GetCell(aCellId)) {
-                             if ( aSelectionMode == EdgeSelection ) {
-                               if ( aSActor->GetObjDimension( aObjId ) == 1 )
-                                 result = true;
-                             }
-                             else if ( aSelectionMode == FaceSelection ) {
-                               if ( aSActor->GetObjDimension( aObjId ) == 2 )
-                                 result = true;
-                             }
-                             else if ( aSelectionMode == VolumeSelection ) {
-                               if ( aSActor->GetObjDimension( aObjId ) == 3 )
-                                 result = true;
-                             }
-                           }
-                           if ( result ) {
-                             if (aVtkList.size() > 0) {
-                               std::vector<int>::iterator it;
-                               for (it = aVtkList.begin(); it != aVtkList.end(); ++it) {
-                                 std::vector<int>::iterator found =
-                                   find(anIndexes.begin(), anIndexes.end(), *it);
-                                 if (found == anIndexes.end())
-                                   anIndexes.push_back(*it);
-                               }
-                             }
-                             else
-                               anIndexes.push_back(aCellId);
-                           }
+                     if(MYDEBUG) INFOS ( " NAME Actor : " << aSActor->getName() );
+                     SALOME_Selection::TContainerOfId anIndexes;
+                     VTKViewer_CellDataSet::iterator it;
+                     for ( it = cellList.begin(); it != cellList.end(); ++it ) {
+                       int aCellId = (*it).cellId;
+                       
+                       if ( !IsValid( aSActor, aCellId ) )
+                         continue;
+                       
+                       int anObjId = aSActor->GetElemObjId(aCellId);
+                       if (anObjId != -1){
+                         if ( CheckDimensionId(aSelectionMode,aSActor,anObjId) ) {
+                           anIndexes.insert(anObjId);
                          }
                        }
                      }
@@ -1221,32 +1071,18 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
            break;          
          case ActorSelection: // objects selection
            {
-             VTKViewer_RectPicker* picker = VTKViewer_RectPicker::New();
+             vtkSmartPointer<VTKViewer_RectPicker> picker = VTKViewer_RectPicker::New();
              picker->SetTolerance(0.001);
              picker->Pick(x1, y1, 0.0, x2, y2, 0.0, this->CurrentRenderer);
 
              vtkActorCollection* aListActors = picker->GetActors();
-             vtkActor* aActor;
              SALOME_ListIO aListIO;
              aListActors->InitTraversal();
-             while(aActor = aListActors->GetNextActor()) {
-               if (aActor->IsA("SALOME_Actor")) {
-                 SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast(aActor);
+             while(vtkActor* aActor = aListActors->GetNextActor()) {
+               if (SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast(aActor)) {
                  if (aSActor->hasIO()) {
                    Handle(SALOME_InteractiveObject) aIO = aSActor->getIO();
-                   bool isStored = false;
-                   if (!aListIO.IsEmpty()) {
-                     SALOME_ListIteratorOfListIO It(aListIO);
-                     for(;It.More();It.Next()) {
-                       Handle(SALOME_InteractiveObject) IOS = It.Value();
-                       if( aIO->isSame(IOS) ) {
-                         aIO = IOS; //Added by SRN, fix SAL1307
-                         isStored = true;
-                         break;
-                       }
-                     }
-                   }
-                   if (!isStored)
+                   if (!IsStored(aIO,aListIO))
                      aListIO.Append(aIO);
                  }
                }
@@ -1261,7 +1097,7 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
              }
            } // end case 4
          } //end switch
-         rwi->EndPickCallback();
+         m_Interactor->EndPickCallback();
        }
        aActiveStudy->update3dViewers();
       } 
@@ -1275,7 +1111,7 @@ void VTKViewer_InteractorStyleSALOME::onFinishOperation()
   case VTK_INTERACTOR_STYLE_CAMERA_GLOBAL_PAN: 
     {
       int w, h, x, y;
-      rwi->GetSize(w, h);
+      m_Interactor->GetSize(w, h);
       x = myPoint.x(); 
       y = h - myPoint.y() - 1;
       Place(x, y);
@@ -1352,7 +1188,10 @@ void VTKViewer_InteractorStyleSALOME::onOperation(QPoint mousePos)
 // called when selection mode changed (!put necessary initialization here!)
 void VTKViewer_InteractorStyleSALOME::OnSelectionModeChanged()
 {
-  myPActor->VisibilityOff();
+  
+  myPreSelectionActor->SetVisibility(false);
+  myElemId = myEdgeId = myNodeId = -1;
+  mySelectedActor = NULL;
 }
 
 // called when user moves mouse inside viewer window and there is no active viewer operation 
@@ -1361,216 +1200,121 @@ void VTKViewer_InteractorStyleSALOME::onCursorMove(QPoint mousePos) {
   // processing highlighting
   QAD_Study* anActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
   SALOME_Selection* Sel = SALOME_Selection::Selection( anActiveStudy->getSelection() );
-
   Selection_Mode aSelectionMode = Sel->SelectionMode();
-  myPActor->VisibilityOff();
-      
-  vtkRenderWindowInteractor *rwi = this->Interactor;
+
   int w, h, x, y;
-  rwi->GetSize(w, h);
+  m_Interactor->GetSize(w, h);
   x = mousePos.x(); y = h - mousePos.y() - 1;
 
   this->FindPokedRenderer(x,y);
-  rwi->StartPickCallback();
-  rwi->GetPicker()->Pick(x, y, 0.0, this->CurrentRenderer);
-  
-  if (rwi->GetPicker()->IsA("vtkCellPicker")) {
-    vtkCellPicker* picker = vtkCellPicker::SafeDownCast(rwi->GetPicker());
-    int aVtkId = picker->GetCellId();
-    // INFOS ( " Preselected CellId : " << picker->GetCellId() );
-    if ( aVtkId >= 0 ) {
-      vtkActor* ac = picker->GetActor();
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* SActor = SALOME_Actor::SafeDownCast( ac );
-       // INFOS ( " NAME Actor : " << SActor->getName() );
+  m_Interactor->StartPickCallback();
+  myPreSelectionActor->SetVisibility(false);
 
-       if (rwi->IsA("VTKViewer_RenderWindowInteractor")) {
-         VTKViewer_RenderWindowInteractor* aRWI = 
-           VTKViewer_RenderWindowInteractor::SafeDownCast(rwi);
+  vtkPicker* aPicker = vtkPicker::SafeDownCast(m_Interactor->GetPicker());
+  aPicker->Pick(x, y, 0.0, this->CurrentRenderer);
 
-         //Cell selection //////////////////////////////////// NB
-         if ( aSelectionMode == CellSelection )
-    {
-      if ( SActor->hasIO() && isValid( SActor, aVtkId, CellSelection ) )
-      {
-             int anObjId = SActor->GetObjId(aVtkId);
-             std::vector<int> aVtkList;
-             if (anObjId != -1)
-          aVtkList = SActor->GetVtkId(anObjId);
-
-             if (aVtkList.size() > 0)
-                     aRWI->setCellData(SActor->getIO(), aVtkList, myPActor);
-             else
-          aRWI->setCellData(SActor->getIO(), aVtkId, myPActor);
-
-             this->CurrentRenderer->AddActor(myPActor);
-             myPActor->GetProperty()->SetRepresentationToSurface();
-             myPActor->VisibilityOn();
+  SALOME_Actor* SActor = SALOME_Actor::SafeDownCast(aPicker->GetActor());
+
+  if (vtkCellPicker* picker = vtkCellPicker::SafeDownCast(aPicker)) {
+    int aVtkId = picker->GetCellId();
+    if ( aVtkId >= 0 ) {
+      int anObjId = SActor->GetElemObjId(aVtkId);
+      if ( SActor && SActor->hasIO() && IsValid( SActor, aVtkId ) ) {
+       bool anIsSameObjId = (mySelectedActor == SActor && myElemId == anObjId);
+       bool aResult = anIsSameObjId;
+       if(!anIsSameObjId) {
+         if(aSelectionMode != EdgeOfCellSelection) {
+           aResult = CheckDimensionId(aSelectionMode,SActor,anObjId);
+           if(aResult){
+             mySelectedActor = SActor;
+             myElemId = anObjId;
+             if(MYDEBUG) INFOS(" CellId : "<<anObjId);
+             m_Interactor->setCellData(anObjId,SActor,myPreSelectionActor);
            }
          }
-       
-         //Edge, Face, Volume and EdgeOfCell selection ////////////////////////// NB
-         else if ( aSelectionMode == EdgeSelection || 
-                   aSelectionMode == FaceSelection || 
-                   aSelectionMode == VolumeSelection  ||
-                   aSelectionMode == EdgeOfCellSelection ) {
-           if ( SActor->hasIO() && isValid( SActor, aVtkId, aSelectionMode ) )
-      {
-             if (vtkDataSet* UGrid = SActor->GetMapper()->GetInput()) {
-               if (vtkCell* pickedCell = UGrid->GetCell(aVtkId)) {
-                 bool result = false;
-                 int edgeId = -1;
-                 int anObjId = SActor->GetObjId(aVtkId);
-                 std::vector<int> aVtkList;
-                 if (anObjId > -1)
-                   aVtkList = SActor->GetVtkId(anObjId);
-
-                 if ( aSelectionMode == EdgeSelection ) {
-                   if ( SActor->GetObjDimension( anObjId ) == 1 )
-                     result = true;
-                 }
-                 else if ( aSelectionMode == FaceSelection ) {
-                   if ( SActor->GetObjDimension( anObjId ) == 2 )
-                     result = true;
-                 }
-                 else if ( aSelectionMode == VolumeSelection ) {
-                   if ( SActor->GetObjDimension( anObjId ) == 3 )
-                     result = true;
-                 }
-                 else {
-                   float pickPosition[3];
-                   picker->GetPickPosition(pickPosition);
-                   float distMin = 1000000.0, dist = 0;
-                   for (int i = 0, iEnd = pickedCell->GetNumberOfEdges(); i < iEnd; i++){
-                     vtkCell* edge = pickedCell->GetEdge(i);
-                     if(vtkLine* line = vtkLine::SafeDownCast(edge)){
-                       float pcoords[3],closestPoint[3],weights[3];
-                       int subId;
-                       line->EvaluatePosition(pickPosition,closestPoint,subId,pcoords,dist,weights);
-                       if (dist < distMin) {
-                         distMin = dist;
-                         edgeId = i;
-                       }
-                     }
-                   }
-                   if (edgeId != -1 || pickedCell->GetCellDimension() == 1) 
-                     result = true;
-                   // INFOS("edgeID transformed = "<<edgeId);
-                 }
-                 if (result)
-      {
-                   this->CurrentRenderer->RemoveActor(myPActor);
-                   if (edgeId == -1) {
-                     if (aVtkList.size() > 0)
-                       aRWI->setCellData(SActor->getIO(), aVtkList, myPActor);
-                     else
-                             aRWI->setCellData(SActor->getIO(), aVtkId, myPActor);
-                   }
-                   else
-                     aRWI->setEdgeData(SActor->getIO(), aVtkId, -edgeId-1, myPActor);
-          
-                   this->CurrentRenderer->AddActor(myPActor);
-                   myPActor->GetProperty()->SetRepresentationToSurface();
-                   myPActor->VisibilityOn();
-                 }
-               }
-             }
-           }
+       }
+       if(aSelectionMode == EdgeOfCellSelection){
+         int anEdgeId = GetEdgeId(picker,SActor,anObjId);
+         bool anIsSameEdgeId = (myEdgeId != anEdgeId) && anIsSameObjId;
+         aResult = anIsSameEdgeId;
+         if(!anIsSameEdgeId) {
+           aResult = (anEdgeId >= 0);
+           if (aResult) {
+             mySelectedActor = SActor;
+             myEdgeId = anEdgeId;
+             myElemId = anObjId;
+             if(MYDEBUG) INFOS(" CellId : "<<anObjId<<"; EdgeId : "<<anEdgeId);
+             m_Interactor->setEdgeData(anObjId,SActor,-anEdgeId-1,myPreSelectionActor);
+           } 
          }
        }
+       if(aResult) {
+         myPreSelectionActor->GetProperty()->SetRepresentationToSurface();
+         myPreSelectionActor->SetVisibility(true);
+       }
       }
     }
   }
-  else if (rwi->GetPicker()->IsA("vtkPointPicker")) {
-    vtkPointPicker* picker = vtkPointPicker::SafeDownCast(rwi->GetPicker());
-    // INFOS ( " Preselected PointId : " << picker->GetPointId() );
-    if (picker->GetPointId() >= 0) {
-      vtkActor* ac = picker->GetActor();
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* SActor = SALOME_Actor::SafeDownCast( ac );
-       // INFOS ( " NAME Actor : " << SActor->getName() );
-
-       if (rwi->IsA("VTKViewer_RenderWindowInteractor")) {
-         VTKViewer_RenderWindowInteractor* aRWI = 
-           VTKViewer_RenderWindowInteractor::SafeDownCast(rwi);
-
-         if ( SActor->hasIO() ) {
-           myPActor->VisibilityOff();
-           this->CurrentRenderer->RemoveActor(myPActor);
-           aRWI->setPointData(SActor->getIO(), picker->GetPointId(), myPActor);
-           this->CurrentRenderer->AddActor(myPActor);
-           myPActor->GetProperty()->SetRepresentationToSurface();
-           myPActor->VisibilityOn();
-         }
+  else if (vtkPointPicker* picker = vtkPointPicker::SafeDownCast(aPicker)) {
+    int aVtkId = picker->GetPointId();
+    if ( aVtkId >= 0 && IsValid( SActor, aVtkId, true ) ) {
+      if ( SActor && SActor->hasIO() ) {
+       int anObjId = SActor->GetNodeObjId(aVtkId);
+       bool anIsSameObjId = (mySelectedActor == SActor && myNodeId == anObjId);
+       if(!anIsSameObjId) {
+         mySelectedActor = SActor;
+         myNodeId = anObjId;
+         if(MYDEBUG) INFOS(" PointId : "<<anObjId);
+         m_Interactor->setPointData(anObjId,SActor,myPreSelectionActor);
        }
+       myPreSelectionActor->GetProperty()->SetRepresentationToSurface();
+       myPreSelectionActor->SetVisibility(true);
       }
     }
   }
-  else if ( rwi->GetPicker()->IsA("vtkPicker") ) {
-    vtkPicker* picker = vtkPicker::SafeDownCast(rwi->GetPicker());
-    vtkActor* ac = picker->GetActor();
-    
-    if ( ac != NULL ) {
-      if ( ac->IsA("SALOME_Actor") ) {
-        SALOME_Actor* SActor = SALOME_Actor::SafeDownCast( ac );
-        if ( preview != SActor ) {
-          if ( preview != NULL ) {
-            preview->SetPreSelected( false );
-          }
-         preview = SActor;
+  else if ( vtkPicker* picker = vtkPicker::SafeDownCast(aPicker) ) {
+    if ( SActor ) {
+      if ( myPreViewActor != SActor ) {
+       if ( myPreViewActor != NULL ) {
+         myPreViewActor->SetPreSelected( false );
+       }
+       myPreViewActor = SActor;
              
-         if ( SActor->hasIO() ) {
-            Handle( SALOME_InteractiveObject) IO = SActor->getIO();
-
-            SALOME_ListIteratorOfListIO It(Sel->StoredIObjects());
-            Standard_Boolean IsSelected = false;
-            for(;It.More();It.Next()) {
-              Handle(SALOME_InteractiveObject) IOS = It.Value();
-              if(IO->isSame(IOS)) {
-                IsSelected = true;
-                break;
-              }
-            }
-
-            if ( !IsSelected ) {
+       if ( SActor->hasIO() ) {
+         Handle( SALOME_InteractiveObject) IO = SActor->getIO();
+         if ( !IsSelected(IO,Sel) ) {
             // Find All actors with same IO
-              vtkActorCollection* theActors = this->CurrentRenderer->GetActors();
-              theActors->InitTraversal();
-              vtkActor *ac = theActors->GetNextActor();
-              while( ac ) {
-                if ( ac->IsA("SALOME_Actor") ) {
-                  SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-                  if ( anActor->hasIO() ) {
-                    Handle(SALOME_InteractiveObject) IOS = anActor->getIO();
-                    if(IO->isSame(IOS)) {
-                      anActor->SetPreSelected( true );
-                    }
-                  }
-                }
-                ac = theActors->GetNextActor();
-              }
-              // INFOS ( " NAME PREVIEW " << SActor->getName() );
-            }
-          }
-        }
+           vtkActorCollection* theActors = this->CurrentRenderer->GetActors();
+           theActors->InitTraversal();
+           while( vtkActor *ac = theActors->GetNextActor() ) {
+             if ( SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac ) ) {
+               if ( anActor->hasIO() ) {
+                 Handle(SALOME_InteractiveObject) IOS = anActor->getIO();
+                 if(IO->isSame(IOS)) {
+                   anActor->SetPreSelected( true );
+                 }
+               }
+             }
+           }
+           //if(MYDEBUG) INFOS ( " NAME PREVIEW " << SActor->getName() );
+         }
+       }
       }
     } else {
-      preview = NULL;
+      myPreViewActor = NULL;
       vtkActorCollection* theActors = this->CurrentRenderer->GetActors();
       theActors->InitTraversal();
-      vtkActor *ac = theActors->GetNextActor();
-      while( ac ) {
-        if ( ac->IsA("SALOME_Actor") ) {
-          SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
+      while( vtkActor *ac = theActors->GetNextActor() ) {
+        if ( SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac ) ) {
           anActor->SetPreSelected( false );
         }
-        ac = theActors->GetNextActor();
       }
     }
   }
-  rwi->EndPickCallback();
-  rwi->Render();
-
+  m_Interactor->EndPickCallback();
+  //m_Interactor->Render();
+  myGUIWindow->update();
+  
   this->LastPos[0] = x;
   this->LastPos[1] = y;
 }
@@ -1594,11 +1338,6 @@ void VTKViewer_InteractorStyleSALOME::Place(const int theX, const int theY)
   cam->SetParallelScale(myScale);
   ::ResetCameraClippingRange(this->CurrentRenderer);
 
-  /* VSV Light follows camera: if (this->CurrentLight) {
-    this->CurrentLight->SetPosition(cam->GetPosition());
-    this->CurrentLight->SetFocalPoint(cam->GetFocalPoint());
-    }*/
-  //VTKViewer_RenderWindow* aRW = dynamic_cast<VTKViewer_RenderWindow*>(this->Interactor->GetRenderWindow());
   if (myGUIWindow) myGUIWindow->update();
 
 }
@@ -1696,58 +1435,64 @@ bool VTKViewer_InteractorStyleSALOME::IsInRect(float* thePoint,
   return ((aPnt[0]>left) && (aPnt[0]<right) && (aPnt[1]>bottom) && (aPnt[1]<top));
 }
 
-void VTKViewer_InteractorStyleSALOME::SetFaceFilter( const Handle(VTKViewer_Filter)& f )
+void  VTKViewer_InteractorStyleSALOME::SetFilter( const Handle(VTKViewer_Filter)& theFilter )
 {
-  myFaceFilter = f;
+  myFilters[ theFilter->GetId() ] = theFilter;
 }
 
-void VTKViewer_InteractorStyleSALOME::RemoveFaceFilter()
+bool  VTKViewer_InteractorStyleSALOME::IsFilterPresent( const int theId )
 {
-  myFaceFilter.Nullify();
+  return myFilters.find( theId ) != myFilters.end();
 }
 
-void VTKViewer_InteractorStyleSALOME::SetEdgeFilter( const Handle(VTKViewer_Filter)& f )
+void  VTKViewer_InteractorStyleSALOME::RemoveFilter( const int theId )
 {
-  myEdgeFilter = f;
+  if ( IsFilterPresent( theId ) )
+    myFilters.erase( theId );
 }
 
-void VTKViewer_InteractorStyleSALOME::RemoveEdgeFilter()
-{
-  myEdgeFilter.Nullify();
-}
 
-bool VTKViewer_InteractorStyleSALOME::isValid( SALOME_Actor*        theActor,
-                                               const int            theId,
-                                               const Selection_Mode theSelMode )
+bool VTKViewer_InteractorStyleSALOME::IsValid( SALOME_Actor* theActor,
+                                               const int     theId,
+                                               const bool    theIsNode )
 {
-  if ( theSelMode != CellSelection &&
-       theSelMode != FaceSelection &&
-       theSelMode != EdgeSelection )
-    return true;
-
-  if ( theSelMode == CellSelection )
+  std::map<int, Handle(VTKViewer_Filter)>::const_iterator anIter;
+  for ( anIter = myFilters.begin(); anIter != myFilters.end(); ++anIter )
   {
-    vtkDataSet* aUGrid = theActor->GetMapper()->GetInput();
-    if ( aUGrid != 0 )
-    {
-      vtkCell* aCell = aUGrid->GetCell( theId );
-      if ( aCell != 0 )
-      {
-        int nbPoints = aCell->GetNumberOfPoints();
-        if ( nbPoints == 2 )
-          return myEdgeFilter.IsNull() || myEdgeFilter->IsValid( theActor, theId );
-        else
-          return myFaceFilter.IsNull() || myFaceFilter->IsValid( theActor, theId );
-
-        return true;
-      }
-    }
-    return false;
+    const Handle(VTKViewer_Filter)& aFilter = anIter->second;
+    if ( theIsNode == aFilter->IsNodeFilter() &&
+         !aFilter->IsValid( theActor, theId ) )
+      return false;
   }
-  else if ( theSelMode == FaceSelection )
-    return myFaceFilter.IsNull() || myFaceFilter->IsValid( theActor, theId );
-  else if ( theSelMode == EdgeSelection )
-    return myEdgeFilter.IsNull() || myEdgeFilter->IsValid( theActor, theId );
-    
   return true;
 }
+
+Handle(VTKViewer_Filter) VTKViewer_InteractorStyleSALOME::GetFilter( const int theId )
+{
+  return IsFilterPresent( theId ) ? myFilters[ theId ] : Handle(VTKViewer_Filter)();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
index ce55fdfc8d98c4fa1a3f0297e6af914927649afe..851aeafdfc6cddbd827b45ed205e68ea758349e9 100644 (file)
 #define __VTKViewer_InteractorStyleSALOME_h
 
 #include <vtkInteractorStyle.h>
+
+class vtkCell;
+class vtkRenderWindowInteractor;
+
 #include <qobject.h>
 #include <qcursor.h>
-#include "SALOME_Actor.h"
+
 #include "VTKViewer_Filter.h"
-#include "SALOME_Selection.h"
 
+class SALOME_Actor;
+class VTKViewer_Actor;
 class VTKViewer_Trihedron;
+class VTKViewer_ViewFrame;
+class VTKViewer_RenderWindowInteractor;
 
 #define VTK_INTERACTOR_STYLE_CAMERA_NONE    0
 #define VTK_INTERACTOR_STYLE_CAMERA_ROTATE  1
@@ -55,14 +62,16 @@ class VTKViewer_InteractorStyleSALOME : public QObject, public vtkInteractorStyl
   // parent. This class should not normally be instantiated by application
   // programmers.
   static VTKViewer_InteractorStyleSALOME *New();
+  vtkTypeMacro(VTKViewer_InteractorStyleSALOME, vtkInteractorStyle);
+
+  virtual void SetInteractor(vtkRenderWindowInteractor *theInteractor);
+  void setViewFrame(VTKViewer_ViewFrame* theViewFrame);
+  void setGUIWindow(QWidget* theWindow);
 
   void setTriedron(VTKViewer_Trihedron* theTrihedron);
   void setPreselectionProp(const double& theRed = 0, const double& theGreen = 1,
                           const double& theBlue = 1, const int& theWidth = 5);
 
-  vtkTypeMacro(VTKViewer_InteractorStyleSALOME, vtkObject);
-  void PrintSelf(ostream& os, vtkIndent indent);
-
   // Generic event bindings must be overridden in subclasses
   void OnMouseMove  (int ctrl, int shift, int x, int y);
   void OnLeftButtonDown(int ctrl, int shift, int x, int y);
@@ -76,10 +85,14 @@ class VTKViewer_InteractorStyleSALOME : public QObject, public vtkInteractorStyl
 
   void  ViewFitAll();
 
-  void  SetEdgeFilter( const Handle(VTKViewer_Filter)& );
-  void  SetFaceFilter( const Handle(VTKViewer_Filter)& );
-  void  RemoveFaceFilter();
-  void  RemoveEdgeFilter();
+  void                     SetFilter( const Handle(VTKViewer_Filter)& );
+  Handle(VTKViewer_Filter) GetFilter( const int );  
+  bool                     IsFilterPresent( const int );
+  void                     RemoveFilter( const int );
+  bool                     IsValid( SALOME_Actor* theActor,
+                                    const int     theId,
+                                    const bool    theIsNode = false );
+  
 
  protected:
   VTKViewer_InteractorStyleSALOME();
@@ -104,19 +117,21 @@ class VTKViewer_InteractorStyleSALOME : public QObject, public vtkInteractorStyl
                const int left, const int top, 
                const int right, const int bottom);
 
-  bool isValid( SALOME_Actor* theActor, const int theCellId, const Selection_Mode theSelMode );
-
   int State;
   float MotionFactor;
   float RadianToDegree;                 // constant: for conv from deg to rad
   double myScale;
 
-  SALOME_Actor* preview;
-  vtkActor*     myPActor;
+  SALOME_Actor* myPreViewActor;
 
-public:
+  VTKViewer_Actor* myPreSelectionActor;
+  SALOME_Actor* mySelectedActor;
+  int myElemId;
+  int myEdgeId;
+  int myNodeId;
+
+ public:
   bool eventFilter(QObject* object, QEvent* event);
-  void ControlLblSize(double aOldScale, double aNewScale);
   void startZoom();
   void startPan();
   void startGlobalPan();
@@ -124,10 +139,8 @@ public:
   void startFitArea();
   void startSpin();
   bool needsRedrawing();
-  QWidget* getGUIWindow() {return myGUIWindow;}
-  void setGUIWindow(QWidget* theWin) { myGUIWindow = theWin;}
 
-protected:
+ protected:
   void loadCursors();
   void startOperation(int operation);
   void onStartOperation();
@@ -136,7 +149,8 @@ protected:
   void onCursorMove(QPoint mousePos);
   void setCursor(const int operation);
 
-protected:
+
+ protected:
   QCursor                   myDefCursor;
   QCursor                   myPanCursor;
   QCursor                   myZoomCursor;
@@ -150,12 +164,12 @@ protected:
   bool                      myShiftState;
   int                       ForcedState;
   
+  VTKViewer_RenderWindowInteractor* m_Interactor;
+  VTKViewer_ViewFrame*      m_ViewFrame;
   VTKViewer_Trihedron*      m_Trihedron;
-  
   QWidget*                  myGUIWindow;
   
-  Handle(VTKViewer_Filter)  myEdgeFilter;
-  Handle(VTKViewer_Filter)  myFaceFilter;
+  std::map<int, Handle(VTKViewer_Filter)> myFilters;
 
   //  members from old version
   double                    DeltaElevation;
diff --git a/src/VTKViewer/VTKViewer_Prs.cxx b/src/VTKViewer/VTKViewer_Prs.cxx
new file mode 100644 (file)
index 0000000..4d048c6
--- /dev/null
@@ -0,0 +1,97 @@
+//  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   : VTKViewer_Prs.cxx
+//  Author : Sergey ANIKIN
+//  Module : SALOME
+//  $Header$
+
+#include "VTKViewer_Prs.h"
+
+//==========================================================
+/*!
+ *  VTKViewer_Prs::VTKViewer_Prs
+ *  Default constructor
+ */
+//==========================================================
+VTKViewer_Prs::VTKViewer_Prs() : myObjects( 0 )
+{
+}
+//==========================================================
+/*!
+ *  VTKViewer_Prs::VTKViewer_Prs
+ *  tandard constructora
+ */
+//==========================================================
+VTKViewer_Prs::VTKViewer_Prs( const vtkActor* obj ) 
+{ 
+  AddObject( obj ); 
+}
+
+//==========================================================
+/*!
+ *  VTKViewer_Prs::~VTKViewer_Prs
+ *  Destructor
+ */
+//==========================================================
+VTKViewer_Prs:: ~VTKViewer_Prs() 
+{ 
+  if ( myObjects ) myObjects->Delete(); 
+}
+
+//==========================================================
+/*!
+ *  VTKViewer_Prs::GetObjects
+ *  Get actors list
+ */
+//==========================================================
+vtkActorCollection* VTKViewer_Prs::GetObjects() const 
+{ 
+  return myObjects; 
+}
+
+//==========================================================
+/*!
+ *  VTKViewer_Prs::AddObject
+ *  Add actor
+ */
+//==========================================================
+void VTKViewer_Prs::AddObject( const vtkActor* obj ) 
+{ 
+  if ( !myObjects) 
+    myObjects = vtkActorCollection::New(); 
+  myObjects->AddItem( (vtkActor*)obj ); 
+}
+  
+//==========================================================
+/*!
+ *  VTKViewer_Prs::IsNull
+ *  Return 0 if list of the actors is empty
+ *  [ Reimplemented from SALOME_Prs ]
+ */
+//==========================================================
+bool VTKViewer_Prs::IsNull() const 
+{ 
+  return !myObjects || myObjects->GetNumberOfItems() <= 0; 
+}
diff --git a/src/VTKViewer/VTKViewer_Prs.h b/src/VTKViewer/VTKViewer_Prs.h
new file mode 100644 (file)
index 0000000..6e61c0a
--- /dev/null
@@ -0,0 +1,58 @@
+//  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   : VTKViewer_Prs.h
+//  Author : Sergey ANIKIN
+//  Module : SALOME
+//  $Header$
+
+#ifndef VTKVIEWER_PRS_H
+#define VTKVIEWER_PRS_H
+
+#include "SALOME_Prs.h"
+
+#include <vtkActorCollection.h>
+
+class VTKViewer_Prs : public SALOME_VTKPrs
+{
+public:
+  VTKViewer_Prs();
+  // Default constructor
+  VTKViewer_Prs( const vtkActor* obj );
+  // Standard constructor
+  ~VTKViewer_Prs();
+  // Destructor
+
+  vtkActorCollection* GetObjects() const;
+  // Get actors list
+  void AddObject( const vtkActor* obj );
+  // Add actor
+  
+  bool IsNull() const;
+  // Reimplemented from SALOME_Prs
+
+private:
+  vtkActorCollection* myObjects;    // list of actors
+};
+
+#endif
index 9658ef5e52e8506d57dc2e2123c4dd9323d5b4b1..c7d3828a95907295998b1f595ca96eb30bb3f93d 100644 (file)
 //  $Header$
 
 #include "VTKViewer_RenderWindowInteractor.h"
-#include "VTKViewer_RenderWindow.h"
+
 #include "VTKViewer_InteractorStyleSALOME.h"
+#include "VTKViewer_RenderWindow.h"
+#include "VTKViewer_ViewFrame.h"
+
+#include "VTKViewer_Algorithm.h"
+#include "VTKViewer_Functor.h"
 
 #include "QAD_Application.h"
 #include "QAD_Desktop.h"
 
-//#include "SALOME_Selection.h"
-#include "SALOME_Actor.h"
+#include "VTKViewer_Actor.h"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 
 // VTK Includes
-#include <vtkAssemblyNode.h>
-#include <vtkActor.h>
-#include <vtkInteractorStyle.h>
 #include <vtkObjectFactory.h>
 #include <vtkPicker.h>
 #include <vtkCellPicker.h>
 #include <vtkPointPicker.h>
-#include <vtkUnstructuredGrid.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkSphereSource.h>
-#include <vtkDataSet.h>
-#include <vtkMaskPoints.h>
-#include <vtkVertex.h>
 #include <vtkRendererCollection.h>
-#include <vtkPolyDataWriter.h>
 
 // QT Includes
 #include <qkeycode.h>
 
+#include <TColStd_IndexedMapOfInteger.hxx>
+
+#include "utilities.h"
+
 using namespace std;
 
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+
 VTKViewer_RenderWindowInteractor* VTKViewer_RenderWindowInteractor::New() {
   vtkObject *ret = vtkObjectFactory::CreateInstance("VTKViewer_RenderWindowInteractor") ;
   if( ret ) {
@@ -74,18 +79,51 @@ VTKViewer_RenderWindowInteractor* VTKViewer_RenderWindowInteractor::New() {
 VTKViewer_RenderWindowInteractor::VTKViewer_RenderWindowInteractor() {
   this->Enabled = 0 ;
   this->mTimer = new QTimer( this ) ;
-  this->displaymode = 0;
+  myDisplayMode = 0;
   myGUIWindow = 0;
-  vtkPicker* thepicker = vtkPicker::New();
-  thepicker->SetTolerance(0);
-  this->SetPicker(thepicker);
+
+  myBasicPicker = vtkPicker::New();
+  myCellPicker = vtkCellPicker::New();
+  myPointPicker = vtkPointPicker::New();
+
+  myCellActor = VTKViewer_Actor::New(); 
+  myCellActor->PickableOff();
+  myCellActor->GetProperty()->SetColor(1,1,0);
+  myCellActor->GetProperty()->SetLineWidth(5);
+  myCellActor->GetProperty()->SetRepresentationToSurface();
+
+  myEdgeActor = VTKViewer_Actor::New(); 
+  myEdgeActor->PickableOff();
+  myEdgeActor->GetProperty()->SetColor(1,0,0);
+  myEdgeActor->GetProperty()->SetLineWidth(5);
+  myEdgeActor->GetProperty()->SetRepresentationToWireframe();
+
+  myPointActor = VTKViewer_Actor::New(); 
+  myPointActor->PickableOff();
+  myPointActor->GetProperty()->SetColor(1,1,0);
+  myPointActor->GetProperty()->SetPointSize(5);
+  myPointActor->GetProperty()->SetRepresentationToPoints();
 
   connect(mTimer, SIGNAL(timeout()), this, SLOT(TimerFunc())) ;
 }
 
 
 VTKViewer_RenderWindowInteractor::~VTKViewer_RenderWindowInteractor() {
+  if(MYDEBUG) INFOS("VTKViewer_RenderWindowInteractor::~VTKViewer_RenderWindowInteractor()");
+
   delete mTimer ;
+
+  myViewFrame->RemoveActor(myCellActor);
+  myViewFrame->RemoveActor(myEdgeActor);
+  myViewFrame->RemoveActor(myPointActor);
+
+  myCellActor->Delete();
+  myEdgeActor->Delete();
+  myPointActor->Delete();
+
+  myBasicPicker->Delete();
+  myCellPicker->Delete();
+  myPointPicker->Delete();
 }
 
 void VTKViewer_RenderWindowInteractor::PrintSelf(ostream& os, vtkIndent indent) {
@@ -132,6 +170,10 @@ void VTKViewer_RenderWindowInteractor::Initialize() {
   this->Size[0] = ((aSize[0] > 0) ? aSize[0] : 300);
   this->Size[1] = ((aSize[1] > 0) ? aSize[1] : 300);
 
+  this->SetPicker(myBasicPicker);
+
+  SetSelectionTolerance();
+
   //
   // Enable the interactor. 
   //
@@ -147,93 +189,83 @@ void VTKViewer_RenderWindowInteractor::Initialize() {
   //
   this->Initialized = 1 ;
 
-  myTolNodes = 0.025;
-  myTolItems = 0.001;
+  return ;
+}
 
-  Cell_Actor = vtkActor::New(); 
-  Cell_Actor->PickableOff();
-  Cell_Actor->GetProperty()->SetColor(1,1,0);
-  Cell_Actor->GetProperty()->SetLineWidth(5);
-  Cell_Actor->GetProperty()->SetRepresentationToSurface();
 
-  Edge_Actor = vtkActor::New(); 
-  Edge_Actor->PickableOff();
-  Edge_Actor->GetProperty()->SetColor(1,0,0);
-  Edge_Actor->GetProperty()->SetLineWidth(5);
-  Edge_Actor->GetProperty()->SetRepresentationToWireframe();
+//----------------------------------------------------------------------------
+void VTKViewer_RenderWindowInteractor::setGUIWindow(QWidget* theWindow){
+  myGUIWindow = theWindow;
+}
 
-  Point_Actor = vtkActor::New(); 
-  Point_Actor->PickableOff();
-  Point_Actor->GetProperty()->SetColor(1,1,0);
-  Point_Actor->GetProperty()->SetPointSize(5);
-  Point_Actor->GetProperty()->SetRepresentationToPoints();
+//----------------------------------------------------------------------------
+void VTKViewer_RenderWindowInteractor::setViewFrame(VTKViewer_ViewFrame* theViewFrame){
+  myViewFrame = theViewFrame;
 
-  return ;
+  myViewFrame->InsertActor(myCellActor);
+  myViewFrame->InsertActor(myEdgeActor);
+  myViewFrame->InsertActor(myPointActor);
 }
 
+//----------------------------------------------------------------------------
+void VTKViewer_RenderWindowInteractor::MoveInternalActors()
+{
+  myViewFrame->MoveActor(myCellActor);
+  myViewFrame->MoveActor(myEdgeActor);
+  myViewFrame->MoveActor(myPointActor);
+}
 
+//----------------------------------------------------------------------------
 void VTKViewer_RenderWindowInteractor::SetInteractorStyle(vtkInteractorObserver *theInteractor){
   myInteractorStyle = dynamic_cast<VTKViewer_InteractorStyleSALOME*>(theInteractor);
   vtkRenderWindowInteractor::SetInteractorStyle(theInteractor);
 }
 
 
-void VTKViewer_RenderWindowInteractor::SetSelectionMode(Selection_Mode mode)
+void VTKViewer_RenderWindowInteractor::SetSelectionMode(Selection_Mode theMode)
 {
-  Cell_Actor->VisibilityOff();
-  Edge_Actor->VisibilityOff();
-  Point_Actor->VisibilityOff();
-
-  selectionmode = mode;
-  if ( mode == NodeSelection ) {
-    vtkPointPicker* thepicker = vtkPointPicker::New();
-    thepicker->SetTolerance(myTolNodes);
-    this->SetPicker(thepicker);
-  } else if ( mode == EdgeOfCellSelection ) {
-    vtkCellPicker* thepicker = vtkCellPicker::New();
-    thepicker->SetTolerance(myTolItems);
-    this->SetPicker(thepicker);
-  } else if ( mode == CellSelection || mode == EdgeSelection || 
-             mode == FaceSelection || mode == VolumeSelection ) {
-    vtkCellPicker* thepicker = vtkCellPicker::New();
-    thepicker->SetTolerance(myTolItems); 
-    this->SetPicker(thepicker);
-  } else if ( mode == ActorSelection ) {
-    vtkPicker* thepicker = vtkPicker::New();
-    thepicker->SetTolerance(myTolItems);
-    this->SetPicker(thepicker);
+  myCellActor->SetVisibility(false);
+  myEdgeActor->SetVisibility(false);
+  myPointActor->SetVisibility(false);
+
+  switch(theMode){
+  case ActorSelection:
+    this->SetPicker(myBasicPicker);
+    break;
+  case NodeSelection:
+    this->SetPicker(myPointPicker);
+    break;
+  case CellSelection:
+  case EdgeSelection:
+  case FaceSelection:
+  case VolumeSelection:
+  case EdgeOfCellSelection:
+    this->SetPicker(myCellPicker);
+    break;
   }
 
-  VTKViewer_InteractorStyleSALOME* Style = 0;
-  if (this->InteractorStyle->IsA("VTKViewer_InteractorStyleSALOME"))
-    Style = VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  else 
-    return;
-  Style->OnSelectionModeChanged();
+  myInteractorStyle->OnSelectionModeChanged();
 }
 
 void VTKViewer_RenderWindowInteractor::SetSelectionProp(const double& theRed, const double& theGreen, 
                                                        const double& theBlue, const int& theWidth) 
 {
-  Cell_Actor->GetProperty()->SetColor(theRed, theGreen, theBlue);
-  Cell_Actor->GetProperty()->SetLineWidth(theWidth);
+  myCellActor->GetProperty()->SetColor(theRed, theGreen, theBlue);
+  myCellActor->GetProperty()->SetLineWidth(theWidth);
 
-  Point_Actor->GetProperty()->SetColor(theRed, theGreen, theBlue);
-  Point_Actor->GetProperty()->SetPointSize(theWidth);
+  myPointActor->GetProperty()->SetColor(theRed, theGreen, theBlue);
+  myPointActor->GetProperty()->SetPointSize(theWidth);
 }
 
 void VTKViewer_RenderWindowInteractor::SetSelectionTolerance(const double& theTolNodes, const double& theTolItems)
 {
   myTolNodes = theTolNodes;
   myTolItems = theTolItems;
-  if (this->GetPicker()->IsA("vtkPointPicker")) {
-    vtkPointPicker* picker = vtkPointPicker::SafeDownCast(this->GetPicker());
-    picker->SetTolerance(theTolNodes);
-  }
-  else if (this->GetPicker()->IsA("vtkPicker")) {
-    vtkPicker* picker = vtkPicker::SafeDownCast(this->GetPicker());
-    picker->SetTolerance(theTolItems);
-  }
+
+  myBasicPicker->SetTolerance(myTolItems);
+  myCellPicker->SetTolerance(myTolItems);
+  myPointPicker->SetTolerance(myTolNodes);
+
 }
 
 void VTKViewer_RenderWindowInteractor::Enable() {
@@ -391,15 +423,8 @@ void VTKViewer_RenderWindowInteractor::MouseMove(const QMouseEvent *event) {
   if( ! this->Enabled ) {
     return ;
   }
-  VTKViewer_InteractorStyleSALOME* Style = 0;
-  if (this->InteractorStyle->IsA("VTKViewer_InteractorStyleSALOME"))
-    Style = VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  else {
-    emit RenderWindowModified() ; 
-    return;
-  }
-  Style->OnMouseMove(0, 0, event->x(), event->y()/*this->Size[1] - event->y() - 1*/) ;
-  if (Style->needsRedrawing() )
+  myInteractorStyle->OnMouseMove(0, 0, event->x(), event->y()/*this->Size[1] - event->y() - 1*/) ;
+  if (myInteractorStyle->needsRedrawing() )
     emit RenderWindowModified() ; 
 }
 
@@ -407,84 +432,54 @@ void VTKViewer_RenderWindowInteractor::LeftButtonPressed(const QMouseEvent *even
   if( ! this->Enabled ) {
     return ;
   }
-  VTKViewer_InteractorStyleSALOME* Style = 0;
-  if (this->InteractorStyle->IsA("VTKViewer_InteractorStyleSALOME"))
-    Style = VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  else 
-    return;
-  Style->OnLeftButtonDown((event->state() & ControlButton), 
-                         (event->state() & ShiftButton), 
-                         event->x(), event->y());
+  myInteractorStyle->OnLeftButtonDown((event->state() & ControlButton), 
+                                     (event->state() & ShiftButton), 
+                                     event->x(), event->y());
 }
 
 void VTKViewer_RenderWindowInteractor::LeftButtonReleased(const QMouseEvent *event) {
   if( ! this->Enabled ) {
     return ;
   }
-  VTKViewer_InteractorStyleSALOME* Style = 0;
-  if (this->InteractorStyle->IsA("VTKViewer_InteractorStyleSALOME"))
-    Style = VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  else 
-    return;
-  Style->OnLeftButtonUp( (event->state() & ControlButton), 
-                        (event->state() & ShiftButton), 
-                        event->x(), event->y() ) ;
+  myInteractorStyle->OnLeftButtonUp( (event->state() & ControlButton), 
+                                    (event->state() & ShiftButton), 
+                                    event->x(), event->y() ) ;
 }
 
 void VTKViewer_RenderWindowInteractor::MiddleButtonPressed(const QMouseEvent *event) {
   if( ! this->Enabled ) {
     return ;
   }
-  VTKViewer_InteractorStyleSALOME* Style = 0;
-  if (this->InteractorStyle->IsA("VTKViewer_InteractorStyleSALOME"))
-    Style = VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  else 
-    return;
-  Style->OnMiddleButtonDown((event->state() & ControlButton), 
-                           (event->state() & ShiftButton), 
-                           event->x(), event->y() ) ;
+  myInteractorStyle->OnMiddleButtonDown((event->state() & ControlButton), 
+                                       (event->state() & ShiftButton), 
+                                       event->x(), event->y() ) ;
 }
 
 void VTKViewer_RenderWindowInteractor::MiddleButtonReleased(const QMouseEvent *event) {
   if( ! this->Enabled ) {
     return ;
   }
-  VTKViewer_InteractorStyleSALOME* Style = 0;
-  if (this->InteractorStyle->IsA("VTKViewer_InteractorStyleSALOME"))
-    Style = VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  else 
-    return;
-  Style->OnMiddleButtonUp( (event->state() & ControlButton), 
-                          (event->state() & ShiftButton), 
-                          event->x(), event->y() ) ;
+  myInteractorStyle->OnMiddleButtonUp( (event->state() & ControlButton), 
+                                      (event->state() & ShiftButton), 
+                                      event->x(), event->y() ) ;
 }
 
 void VTKViewer_RenderWindowInteractor::RightButtonPressed(const QMouseEvent *event) {
   if( ! this->Enabled ) {
     return ;
   }
-  VTKViewer_InteractorStyleSALOME* Style = 0;
-  if (this->InteractorStyle->IsA("VTKViewer_InteractorStyleSALOME"))
-    Style = VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  else 
-    return;
-  Style->OnRightButtonDown( (event->state() & ControlButton), 
-                           (event->state() & ShiftButton), 
-                           event->x(), event->y() ) ;
+  myInteractorStyle->OnRightButtonDown( (event->state() & ControlButton), 
+                                       (event->state() & ShiftButton), 
+                                       event->x(), event->y() ) ;
 }
 
 void VTKViewer_RenderWindowInteractor::RightButtonReleased(const QMouseEvent *event) {
   if( ! this->Enabled ) {
     return ;
   }
-  VTKViewer_InteractorStyleSALOME* Style = 0;
-  if (this->InteractorStyle->IsA("VTKViewer_InteractorStyleSALOME"))
-    Style = VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  else 
-    return;
-  Style->OnRightButtonUp( (event->state() & ControlButton), 
-                         (event->state() & ShiftButton), 
-                         event->x(), event->y() ) ;
+  myInteractorStyle->OnRightButtonUp( (event->state() & ControlButton), 
+                                     (event->state() & ShiftButton), 
+                                     event->x(), event->y() ) ;
 }
 
 void VTKViewer_RenderWindowInteractor::ButtonPressed(const QMouseEvent *event) {
@@ -495,112 +490,59 @@ void VTKViewer_RenderWindowInteractor::ButtonReleased(const QMouseEvent *event)
   return ;
 }
 
-void VTKViewer_RenderWindowInteractor::ChangeRepresentationToWireframe(vtkActorCollection* ac)
-{
-  vtkActor* anActor;
-
-  for (ac->InitTraversal(); (anActor = ac->GetNextActor()); ) {
-    if ( anActor->IsA("GEOM_Actor") ) {
-      SALOME_Actor* SALOMEactor = SALOME_Actor::SafeDownCast(anActor);
-      // Specific for GEOM actor
-      if ( SALOMEactor->getDisplayMode() == 1 )
-       SALOMEactor->setDisplayMode(0);
-    } else {
-      anActor->GetProperty()->SetRepresentationToWireframe();
-    }
-  }
-  this->RenderWindow->Render();
-  emit RenderWindowModified() ;
-}
 
 int VTKViewer_RenderWindowInteractor::GetDisplayMode() {
-  return displaymode;
-}
-
-void VTKViewer_RenderWindowInteractor::SetDisplayMode(int mode) {
-  if(mode==0) ChangeRepresentationToWireframe();
-  else ChangeRepresentationToSurface();
-  displaymode = mode;
-}
-
-void VTKViewer_RenderWindowInteractor::SwitchRepresentation(const Handle(SALOME_InteractiveObject)& IObject,
-                                                           bool update) {  
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           if ( anActor->IsA("GEOM_Actor") ) {
-             // GEOM actor
-             if ( anActor->getDisplayMode() == 0 ) anActor->setDisplayMode(1);
-             else anActor->setDisplayMode(0);
-           }
-           else {
-             if(anActor->GetProperty()->GetRepresentation() <= 1)
-               anActor->GetProperty()->SetRepresentationToSurface();
-             else
-               anActor->GetProperty()->SetRepresentationToWireframe(); 
-           }
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  } 
-  if (update) {
-    this->RenderWindow->Render();
-    emit RenderWindowModified() ;
-  }
+  return myDisplayMode;
+}
+
+void VTKViewer_RenderWindowInteractor::SetDisplayMode(int theMode) {
+  if(theMode == 0) 
+    ChangeRepresentationToWireframe();
+  else 
+    ChangeRepresentationToSurface();
+  myDisplayMode = theMode;
 }
 
 
+void VTKViewer_RenderWindowInteractor::SetDisplayMode(const Handle(SALOME_InteractiveObject)& theIObject, int theMode){
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(GetRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TSetFunction<SALOME_Actor,int>
+                         (&SALOME_Actor::setDisplayMode,theMode));
+}
+
 
 void VTKViewer_RenderWindowInteractor::ChangeRepresentationToWireframe()
-  // change all actors to wireframe
 {
-  vtkActorCollection *ac;
-  vtkActor *anActor, *aPart;
-  
-  ac = GetRenderer()->GetActors();
-  ChangeRepresentationToWireframe(ac);
+  ChangeRepresentationToWireframe(GetRenderer()->GetActors());
 }
 
+void VTKViewer_RenderWindowInteractor::ChangeRepresentationToSurface()
+{
+  ChangeRepresentationToSurface(GetRenderer()->GetActors());
+}
 
 
-void VTKViewer_RenderWindowInteractor::ChangeRepresentationToSurface(vtkActorCollection* ac)
+void VTKViewer_RenderWindowInteractor::ChangeRepresentationToWireframe(vtkActorCollection* theCollection)
 {
-  vtkActor *anActor, *aPart;
-  
-  for (ac->InitTraversal(); (anActor = ac->GetNextActor()); ) {
-    if ( anActor->IsA("GEOM_Actor") ) {
-      SALOME_Actor* SALOMEactor = SALOME_Actor::SafeDownCast(anActor);
-      // Specific for GEOM actor
-      if ( SALOMEactor->getDisplayMode() == 0 )
-       SALOMEactor->setDisplayMode(1);
-    } else {
-      anActor->GetProperty()->SetRepresentationToSurface();
-    }
-  }
-  this->RenderWindow->Render();
-  emit RenderWindowModified() ;
+  using namespace SALOME::VTK;
+  ForEach<SALOME_Actor>(theCollection,
+                       TSetFunction<SALOME_Actor,int>
+                       (&SALOME_Actor::setDisplayMode,0));
+  emit RenderWindowModified();
 }
 
-void VTKViewer_RenderWindowInteractor::ChangeRepresentationToSurface()
-  // change all actors to "surface" or solid
+void VTKViewer_RenderWindowInteractor::ChangeRepresentationToSurface(vtkActorCollection* theCollection)
 {
-  vtkActorCollection *ac;
-  vtkActor *anActor, *aPart;
-  
-  ac = GetRenderer()->GetActors();
-  ChangeRepresentationToSurface(ac);
+  using namespace SALOME::VTK;
+  ForEach<SALOME_Actor>(theCollection,
+                       TSetFunction<SALOME_Actor,int>
+                       (&SALOME_Actor::setDisplayMode,1));
+  emit RenderWindowModified();
 }
 
+
 vtkRenderer* VTKViewer_RenderWindowInteractor::GetRenderer()
 {
   vtkRendererCollection * theRenderers =  this->RenderWindow->GetRenderers();
@@ -608,287 +550,212 @@ vtkRenderer* VTKViewer_RenderWindowInteractor::GetRenderer()
   return theRenderers->GetNextItem();
 }
 
+
+struct TErase{
+  SALOME::VTK::TSetFunction<vtkActor,int> mySetFunction;
+  TErase():
+    mySetFunction(&vtkActor::SetVisibility,false)
+  {}
+  void operator()(SALOME_Actor* theActor){
+    theActor->SetVisibility(false);
+    // Erase dependent actors
+    vtkActorCollection* aCollection = vtkActorCollection::New(); 
+    theActor->GetChildActors(aCollection);
+    SALOME::VTK::ForEach<vtkActor>(aCollection,mySetFunction);
+    aCollection->Delete();
+  }
+};
+
 void VTKViewer_RenderWindowInteractor::EraseAll()
 {   
-  vtkActorCollection *ac;
-  vtkActor *anActor, *aPart;
-  
-  ac = GetRenderer()->GetActors();
-  for (ac->InitTraversal(); (anActor = ac->GetNextActor()); ) {
-    if ( anActor->IsA("SALOME_Actor") ) {
-      SALOME_Actor* SActor = SALOME_Actor::SafeDownCast( anActor );
-      SActor->SetVisibility(false);
-    }
-  }
+  using namespace SALOME::VTK;
+  ForEach<SALOME_Actor>(GetRenderer()->GetActors(),
+                       TErase());
+
   emit RenderWindowModified() ;
 }
 
+
 void VTKViewer_RenderWindowInteractor::DisplayAll()
-{   
-  vtkActorCollection *ac;
-  vtkActor *anActor, *aPart;
-  
-  ac = GetRenderer()->GetActors();
-  for (ac->InitTraversal(); (anActor = ac->GetNextActor()); ) {
-    if ( anActor->IsA("SALOME_Actor") ) {
-      SALOME_Actor* SActor = SALOME_Actor::SafeDownCast( anActor );
-      SActor->SetVisibility( true );
-    }
-  }
+{ 
+  vtkActorCollection* aCollection = GetRenderer()->GetActors();
+  using namespace SALOME::VTK;
+  ForEach<SALOME_Actor>(aCollection,TSetVisibility<SALOME_Actor>(true));
+
   emit RenderWindowModified() ;
 }
 
-void VTKViewer_RenderWindowInteractor::Erase( SALOME_Actor* SActor, bool update)
+
+void VTKViewer_RenderWindowInteractor::Erase(SALOME_Actor* theActor, bool update)
 {
-  SActor->SetVisibility( false );
+  TErase()(theActor);
 
-  // Erase dependent actors
-  vtkActorCollection* theChildActors = vtkActorCollection::New(); 
-  SActor->GetChildActors(theChildActors);
+  if(update)
+    emit RenderWindowModified();
+}
 
-  theChildActors->InitTraversal();
-  vtkActor *ac = theChildActors->GetNextActor();
-  while(!(ac==NULL)) {
-    ac->SetVisibility( false );
-    ac = theChildActors->GetNextActor();
-  }
 
-  if (update) 
+void VTKViewer_RenderWindowInteractor::Erase(const Handle(SALOME_InteractiveObject)& theIObject, bool update)
+{
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(GetRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TErase());
+
+  if(update)
     emit RenderWindowModified();
 }
 
-void VTKViewer_RenderWindowInteractor::Erase(const Handle(SALOME_InteractiveObject)& IObject, bool update)
+
+struct TRemoveAction{
+  vtkRenderer* myRen;
+  TRemoveAction(vtkRenderer* theRen): myRen(theRen){}
+  void operator()(SALOME_Actor* theActor){
+    myRen->RemoveActor(theActor);
+  }
+};
+
+void VTKViewer_RenderWindowInteractor::Remove(const Handle(SALOME_InteractiveObject)& theIObject, bool update)
 {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           Erase(anActor, false);
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  } 
-  if (update)
-    emit RenderWindowModified() ;
+  vtkRenderer* aRen = GetRenderer();
+
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(aRen->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TRemoveAction(aRen));
+
+  if(update)
+    emit RenderWindowModified();
 }
 
-void VTKViewer_RenderWindowInteractor::Remove(const Handle(SALOME_InteractiveObject)& IObject, bool update)
+
+float VTKViewer_RenderWindowInteractor::GetTransparency(const Handle(SALOME_InteractiveObject)& theIObject) 
 {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           aren->RemoveActor(anActor);
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  } 
-  if (update)
-    emit RenderWindowModified() ;
+  using namespace SALOME::VTK;
+  SALOME_Actor* anActor = 
+    Find<SALOME_Actor>(GetRenderer()->GetActors(),
+                      TIsSameIObject<SALOME_Actor>(theIObject));
+  if(anActor)
+    return 1.0 - anActor->GetOpacity();
+  return -1.0;
 }
 
-float VTKViewer_RenderWindowInteractor::GetTransparency(const Handle(SALOME_InteractiveObject)& IObject) {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           if ( anActor->IsA("GEOM_Actor") ) {
-             // GEOM actor
-             return (1-(anActor->GetOpacity()));
-           }
-           else return (1-anActor->GetProperty()->GetOpacity());
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  } 
-  return -1;
-}
-
-void VTKViewer_RenderWindowInteractor::SetTransparency(const Handle(SALOME_InteractiveObject)& IObject, float trans) {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           if ( anActor->IsA("GEOM_Actor") ) {
-             // GEOM actor
-             anActor->SetOpacity(1-trans);
-           }
-           else anActor->GetProperty()->SetOpacity(1-trans);
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  } 
+
+void VTKViewer_RenderWindowInteractor::SetTransparency(const Handle(SALOME_InteractiveObject)& theIObject, float theTrans)
+{
+  float anOpacity = 1.0 - theTrans;
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(GetRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TSetFunction<SALOME_Actor,float>
+                         (&SALOME_Actor::SetOpacity,anOpacity));
 }
 
-void VTKViewer_RenderWindowInteractor::Display( SALOME_Actor* SActor, bool update)
+
+void VTKViewer_RenderWindowInteractor::Display(SALOME_Actor* theActor, bool update)
 {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    aren->AddActor( SActor );
-    SActor->SetVisibility( true );
-  }
+  GetRenderer()->AddActor(theActor);
+  theActor->SetVisibility(true);
 
-  if (update) {
-    Render();
+  if(update)
     emit RenderWindowModified();
-  }
 }
 
-void VTKViewer_RenderWindowInteractor::Display(const Handle(SALOME_InteractiveObject)& IObject, bool update)
+
+void VTKViewer_RenderWindowInteractor::Display(const Handle(SALOME_InteractiveObject)& theIObject, bool update)
 {
-  Standard_Boolean isalreadydisplayed = false;
-
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           anActor->SetVisibility( true );
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  }
-  if (update)
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(GetRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TSetVisibility<SALOME_Actor>(true));
+
+  if(update)
     emit RenderWindowModified() ;
 }
 
-void VTKViewer_RenderWindowInteractor::KeyPressed(QKeyEvent *event) {
-//    MESSAGE ( " vtkQGLRenderWindowInteractor::KeyPressed " )
 
-//    if (!QAD_Application::getDesktop()->getActiveComponent().isEmpty()) {
-//      QAD_Application::getDesktop()->onKeyPress( event );
-//    }
-}
+void VTKViewer_RenderWindowInteractor::KeyPressed(QKeyEvent *event){}
+
+
+struct THighlightAction{
+  bool myIsHighlight;
+  VTKViewer_InteractorStyleSALOME* myInteractorStyle;
+  THighlightAction(VTKViewer_InteractorStyleSALOME* theInteractorStyle,
+                  bool theIsHighlight): 
+    myInteractorStyle(theInteractorStyle),
+    myIsHighlight(theIsHighlight)
+  {}
+  void operator()(SALOME_Actor* theActor){
+    if(theActor->GetMapper()){
+      if(theActor->hasHighlight())
+       theActor->highlight(myIsHighlight);
+      else{
+       if(theActor->GetVisibility() && myIsHighlight)
+         myInteractorStyle->HighlightProp(theActor);
+       else if(!myIsHighlight)
+         myInteractorStyle->HighlightProp(NULL);
+      }
+    }
+  }
+};
 
-bool VTKViewer_RenderWindowInteractor::highlight( const Handle(SALOME_InteractiveObject)& IObject, 
+bool VTKViewer_RenderWindowInteractor::highlight( const Handle(SALOME_InteractiveObject)& theIObject, 
                                                  bool hilight, 
                                                  bool update)
 {
-  VTKViewer_InteractorStyleSALOME* aStyle = 
-    VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  if(!aStyle) return false;
-  vtkRendererCollection* aRenColl = this->RenderWindow->GetRenderers();
-  aRenColl->InitTraversal();
-  while(vtkRenderer* aRen = this->RenderWindow->GetRenderers()->GetNextItem()){
-      vtkActorCollection* theActors = aRen->GetActors();
-      theActors->InitTraversal();
-      while(vtkActor *anAct = theActors->GetNextActor()) {
-       if(SALOME_Actor* anActor = SALOME_Actor::SafeDownCast(anAct)){
-         if(anActor->hasIO()){
-           if(IObject->isSame(anActor->getIO())){
-             if(anActor->GetMapper() == NULL)
-               return false;
-             //highlight or unhilight actors
-             if(anActor->hasHighlight())
-               anActor->highlight(hilight);
-             else{
-               if(anActor->GetVisibility() == 1 && hilight)
-                 aStyle->HighlightProp(anActor);
-               else if(!hilight)
-                 aStyle->HighlightProp(NULL);
-             }
-           }
-         }
-       }
-      }
-    }
-  if(update){
-    Render();
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(GetRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         THighlightAction(myInteractorStyle,hilight));
+
+  if(update)
     emit RenderWindowModified();
-  }
+
   return false;
 }
 
-void VTKViewer_RenderWindowInteractor::Update() {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-
-    while(!(ac==NULL)) {
-      ac->ApplyProperties();
-      //VSV: No in VTK: ac->Update();
-      ac = theActors->GetNextActor();
-    }
-    aren->ResetCamera();
-    emit RenderWindowModified() ;  
+
+struct TUpdateAction{
+  void operator()(vtkActor* theActor){
+    theActor->ApplyProperties();
   }
+};
+
+void VTKViewer_RenderWindowInteractor::Update() {
+  vtkRenderer* aRen = GetRenderer();
+
+  using namespace SALOME::VTK;
+  ForEach<vtkActor>(aRen->GetActors(),TUpdateAction());
+
+  aRen->ResetCamera();
+
+  emit RenderWindowModified();  
 }
 
 
-bool VTKViewer_RenderWindowInteractor::unHighlightAll(){
-  VTKViewer_InteractorStyleSALOME* aStyle = 
-    VTKViewer_InteractorStyleSALOME::SafeDownCast(this->InteractorStyle);
-  if(aStyle) aStyle->HighlightProp(NULL);
-  vtkRendererCollection* aRenColl = this->RenderWindow->GetRenderers();
-  aRenColl->InitTraversal();
-  while(vtkRenderer* aRen = this->RenderWindow->GetRenderers()->GetNextItem()){
-    vtkActorCollection* theActors = aRen->GetActors();
-    if(theActors->IsItemPresent(Point_Actor)) 
-      aRen->RemoveActor(Point_Actor);
-    if(theActors->IsItemPresent(Edge_Actor)) 
-      aRen->RemoveActor(Edge_Actor); 
-    if(theActors->IsItemPresent(Cell_Actor)) 
-      aRen->RemoveActor(Cell_Actor);
-
-    theActors->InitTraversal();
-    while(vtkActor *anAct = theActors->GetNextActor()) {
-      if(SALOME_Actor* anActor = SALOME_Actor::SafeDownCast(anAct)){
-       if(anActor->hasIO()){
-         //highlight or unhilight actors
-         if(anActor->hasHighlight())
-           anActor->highlight(false);
-       }
-      }
+void VTKViewer_RenderWindowInteractor::unHighlightSubSelection(){
+  myPointActor->SetVisibility(false);
+  myEdgeActor->SetVisibility(false);
+  myCellActor->SetVisibility(false);
+}
+
+
+struct TUnHighlightAllAction{
+  void operator()(SALOME_Actor* theActor){
+    if(theActor->hasIO()){
+      if(theActor->hasHighlight())
+       theActor->highlight(false);
     }
   }
+};
+
+bool VTKViewer_RenderWindowInteractor::unHighlightAll(){
+  unHighlightSubSelection();
+
+  using namespace SALOME::VTK;
+  ForEach<SALOME_Actor>(GetRenderer()->GetActors(),
+                       TUnHighlightAllAction());
+
   emit RenderWindowModified() ;
   return false;
 }
@@ -897,159 +764,75 @@ bool VTKViewer_RenderWindowInteractor::unHighlightAll(){
 // Color methods
 //-----------------
 
-void VTKViewer_RenderWindowInteractor::SetColor(const Handle(SALOME_InteractiveObject)& IObject,QColor thecolor) {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           if ( anActor->IsA("GEOM_Actor") ) {
-             // GEOM actor
-             anActor->SetColor(float(thecolor.red())/255,float(thecolor.green())/255,float(thecolor.blue())/255);
-           }
-           else {
-             anActor->GetProperty()->SetColor(float(thecolor.red())/255,float(thecolor.green())/255,float(thecolor.blue())/255);
-           }
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  } 
-}
-
-QColor VTKViewer_RenderWindowInteractor::GetColor(const Handle(SALOME_InteractiveObject)& IObject) {
-  vtkRenderer* aren;
-  QColor emptycolor(0,0,0);
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           if ( anActor->IsA("GEOM_Actor") ) {
-             // GEOM actor
-             float r,g,b;
-             anActor->GetColor(r,g,b);
-             return QColor(int(r*255),int(g*255),int(b*255));
-           }
-           else {
-             float color[3];
-             anActor->GetProperty()->GetColor(color);   
-             return QColor(int(color[0]*255),int(color[1]*255),int(color[2]*255));
-           }
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  } 
-  return emptycolor;
+void VTKViewer_RenderWindowInteractor::SetColor(const Handle(SALOME_InteractiveObject)& theIObject,QColor theColor) 
+{
+  float aColor[3] = {theColor.red()/255., theColor.green()/255., theColor.blue()/255.};
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(GetRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TSetFunction<SALOME_Actor,const float*>
+                         (&SALOME_Actor::SetColor,aColor));
 }
 
 
-
-
-bool VTKViewer_RenderWindowInteractor::isInViewer(const Handle(SALOME_InteractiveObject)& IObject)
+QColor VTKViewer_RenderWindowInteractor::GetColor(const Handle(SALOME_InteractiveObject)& theIObject) 
 {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           //MESSAGE ( " VTKViewer_RenderWindowInteractor::isInViewer = TRUE" )
-           return true;
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
+  using namespace SALOME::VTK;
+  SALOME_Actor* anActor = 
+    Find<SALOME_Actor>(GetRenderer()->GetActors(),
+                      TIsSameIObject<SALOME_Actor>(theIObject));
+  if(anActor){
+    float r,g,b;
+    anActor->GetColor(r,g,b);
+    return QColor(int(r*255),int(g*255),int(b*255));
   }
-  //MESSAGE ( " VTKViewer_RenderWindowInteractor::isInViewer = FALSE" )
-  return false;
+  return QColor(0,0,0);
 }
 
-bool VTKViewer_RenderWindowInteractor::isVisible(const Handle(SALOME_InteractiveObject)& IObject)
+
+bool VTKViewer_RenderWindowInteractor::isInViewer(const Handle(SALOME_InteractiveObject)& theIObject)
 {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           return anActor->GetVisibility();
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  }
-  return false;
+  using namespace SALOME::VTK;
+  SALOME_Actor* anActor = 
+    Find<SALOME_Actor>(GetRenderer()->GetActors(),
+                      TIsSameIObject<SALOME_Actor>(theIObject));
+  return anActor != NULL;
 }
 
-void VTKViewer_RenderWindowInteractor::rename(const Handle(SALOME_InteractiveObject)& IObject, QString newName)
+
+bool VTKViewer_RenderWindowInteractor::isVisible(const Handle(SALOME_InteractiveObject)& theIObject)
 {
-  vtkRenderer* aren;
-  for (this->RenderWindow->GetRenderers()->InitTraversal(); 
-       (aren = this->RenderWindow->GetRenderers()->GetNextItem()); ) {
-    vtkActorCollection* theActors = aren->GetActors();
-    theActors->InitTraversal();
-    vtkActor *ac = theActors->GetNextActor();
-    while(!(ac==NULL)) {
-      if ( ac->IsA("SALOME_Actor") ) {
-       SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-       if ( anActor->hasIO() ) {
-         if ( IObject->isSame( anActor->getIO() ) ) {
-           anActor->setName(strdup(newName));
-         }
-       }
-      }
-      ac = theActors->GetNextActor();
-    }
-  }  
+  using namespace SALOME::VTK;
+  SALOME_Actor* anActor = 
+    Find<SALOME_Actor>(GetRenderer()->GetActors(),
+                      TIsSameIObject<SALOME_Actor>(theIObject));
+  return anActor != NULL && anActor->GetVisibility();
+}
 
-  emit RenderWindowModified() ;
+
+void VTKViewer_RenderWindowInteractor::rename(const Handle(SALOME_InteractiveObject)& theIObject, QString theName)
+{
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(GetRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TSetFunction<SALOME_Actor,const char*,QString>
+                         (&SALOME_Actor::setName,theName.latin1()));
 }
 
-bool VTKViewer_RenderWindowInteractor::highlight(const Handle(SALOME_InteractiveObject)& IObject, 
-                                                const TColStd_MapOfInteger& MapIndex, 
-                                                VTKViewer_RenderWindowInteractor::TCreateMapperFun theFun,
-                                                vtkActor *theActor, bool hilight, bool update )
+
+//----------------------------------------------------------------------------
+bool VTKViewer_RenderWindowInteractor::highlight(const TColStd_IndexedMapOfInteger& theMapIndex,
+                                                SALOME_Actor* theMapActor, VTKViewer_Actor* theActor,
+                                                TUpdateActor theFun, bool hilight, bool update)
 {
-  if(MapIndex.Extent() == 0) return false;
-  vtkRenderer* aRen = GetRenderer();
-  vtkActorCollection* anActorColl = aRen->GetActors();
-  if ( anActorColl->IsItemPresent(theActor) != 0 ) 
-    aRen->RemoveActor(theActor);
+  if(theMapIndex.Extent() == 0) return false;
   
   if (hilight) {
-    setActorData(IObject, MapIndex, theFun, theActor);
-    aRen->AddActor(theActor);        
-    theActor->VisibilityOn();
+    setActorData(theMapIndex,theMapActor,theActor,theFun);
+    theActor->SetVisibility(true);
   }
   else {
-    theActor->VisibilityOff();
+    theActor->SetVisibility(false);
   }
 
   if(update){
@@ -1060,190 +843,90 @@ bool VTKViewer_RenderWindowInteractor::highlight(const Handle(SALOME_Interactive
   return false;
 }
   
-void VTKViewer_RenderWindowInteractor::setActorData(const Handle(SALOME_InteractiveObject)& IObject,
-                                                   const TColStd_MapOfInteger& MapIndex, 
-                                                   VTKViewer_RenderWindowInteractor::TCreateMapperFun theFun,
-                                                   vtkActor* theActor)
+void VTKViewer_RenderWindowInteractor::setActorData(const TColStd_IndexedMapOfInteger& theMapIndex,
+                                                   SALOME_Actor* theMapActor,
+                                                   VTKViewer_Actor *theActor,
+                                                   TUpdateActor theFun)
 {
-  vtkActorCollection* anActorColl = GetRenderer()->GetActors();
-  anActorColl->InitTraversal();
-  vtkActor *ac = NULL;
-  while ((ac = anActorColl->GetNextActor()) != NULL) {
-    if (ac->IsA("SALOME_Actor")){
-      SALOME_Actor* anActor = SALOME_Actor::SafeDownCast(ac);
-      if (anActor->hasIO()) {
-       if (IObject->isSame(anActor->getIO())) {
-         if (vtkPolyData* aSourcePolyData = anActor->GetPolyDataInput()) {
-           vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New();
-           (*theFun)(aSourcePolyData,aMapper,MapIndex);
-           theActor->SetMapper(aMapper);   
-           aMapper->Delete();
-           break;
-         }
-       }
-      }
-    }
-  }
+  (*theFun)(theMapIndex,theMapActor,theActor);
 }
 
 
-static void CellCreateMapper(vtkPolyData *theSourcePolyData, vtkPolyDataMapper* theMapper, 
-                     const TColStd_MapOfInteger& theMapIndex)
+//----------------------------------------------------------------------------
+static void CellsUpdateActor(const TColStd_IndexedMapOfInteger& theMapIndex,
+                            SALOME_Actor* theMapActor, 
+                            VTKViewer_Actor* theActor)
 {
-  vtkPolyData* aPolyData = vtkPolyData::New();
-  aPolyData->Allocate();
-
-  vtkIdList *ptIds = vtkIdList::New(); 
-  ptIds->Allocate(theSourcePolyData->GetMaxCellSize());
-  //  vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New();
-  aPolyData->SetPoints(theSourcePolyData->GetPoints());
-  TColStd_MapIteratorOfMapOfInteger ite(theMapIndex);
-  int aNbOfParts = theSourcePolyData->GetNumberOfCells();
-  for(; ite.More(); ite.Next()){
-    int aPartId = ite.Key();
-    if(0 > aPartId || aPartId >= aNbOfParts) break;
-    theSourcePolyData->GetCellPoints(aPartId,ptIds);
-    vtkCell* aCell = theSourcePolyData->GetCell(aPartId);
-    aPolyData->InsertNextCell(aCell->GetCellType(),ptIds);
-    for (int i = 0, iEnd = aCell->GetNumberOfEdges(); i < iEnd; i++){
-      vtkCell* anEdgeCell = aCell->GetEdge(i);
-      aPolyData->InsertNextCell(VTK_LINE,anEdgeCell->GetPointIds());
-    }
-  }
-  ptIds->Delete();
-  theMapper->SetInput(aPolyData);  
-  aPolyData->Delete();
+  theActor->MapCells(theMapActor,theMapIndex);
 }
   
-bool VTKViewer_RenderWindowInteractor::highlightCell(const Handle(SALOME_InteractiveObject)& IObject, 
+bool VTKViewer_RenderWindowInteractor::highlightCell(const TColStd_IndexedMapOfInteger& theMapIndex,
+                                                    SALOME_Actor* theMapActor, 
                                                     bool hilight, 
-                                                    const TColStd_MapOfInteger& MapIndex, 
-                                                    bool update )
-{
-  return highlight(IObject,MapIndex,&CellCreateMapper,Cell_Actor,hilight,update);
-}
-  
-void VTKViewer_RenderWindowInteractor::setCellData(const Handle(SALOME_InteractiveObject)& IObject, 
-                                                  const int& theIndex, vtkActor* theActor )
+                                                    bool update)
 {
-  TColStd_MapOfInteger MapIndex; MapIndex.Add(theIndex);
-  return setActorData(IObject,MapIndex,&CellCreateMapper,theActor);
+  return highlight(theMapIndex,theMapActor,myCellActor,&CellsUpdateActor,hilight,update);
 }
   
-void VTKViewer_RenderWindowInteractor::setCellData(const Handle(SALOME_InteractiveObject)& IObject, 
-                                                  const std::vector<int>& theIndexes, vtkActor* theActor )
+void VTKViewer_RenderWindowInteractor::setCellData(const int& theIndex, 
+                                                  SALOME_Actor* theMapActor,
+                                                  VTKViewer_Actor* theActor)
 {
-  TColStd_MapOfInteger MapIndex; 
-  std::vector<int>::const_iterator it;
-  for (it = theIndexes.begin(); it != theIndexes.end(); ++it)
-    MapIndex.Add(*it);
-  return setActorData(IObject,MapIndex,&CellCreateMapper,theActor);
+  TColStd_IndexedMapOfInteger MapIndex; 
+  MapIndex.Add(theIndex);
+  theActor->MapCells(theMapActor,MapIndex);
 }
 
 
-static void PointCreateMapper(vtkPolyData *theSourcePolyData, vtkPolyDataMapper* theMapper, 
-                      const TColStd_MapOfInteger& theMapIndex)
+//----------------------------------------------------------------------------
+static void PointsUpdateActor(const TColStd_IndexedMapOfInteger& theMapIndex,
+                             SALOME_Actor* theMapActor, 
+                             VTKViewer_Actor* theActor)
 {
-  vtkPolyData* aPolyData = vtkPolyData::New();
-  aPolyData->Allocate();
-
-  vtkPoints *aPoints = vtkPoints::New();
-  vtkMaskPoints* aMaskPoints = vtkMaskPoints::New();
-  TColStd_MapIteratorOfMapOfInteger ite(theMapIndex);
-  aPoints->SetNumberOfPoints(theMapIndex.Extent());
-  int aNbOfParts = theSourcePolyData->GetNumberOfPoints();
-  for(int i = 0; ite.More(); ite.Next(),i++){
-    int aPartId = ite.Key();
-    if(0 > aPartId || aPartId >= aNbOfParts) break;
-    aPoints->SetPoint(i,theSourcePolyData->GetPoint(aPartId));
-  }
-  aPolyData->SetPoints(aPoints);
-  aPoints->Delete();
-  aMaskPoints->SetInput(aPolyData);
-  aMaskPoints->SetGenerateVertices(1);
-  aMaskPoints->SetOnRatio(1);
-  theMapper->SetInput(aMaskPoints->GetOutput());  
-  aMaskPoints->Delete();
+  theActor->MapPoints(theMapActor,theMapIndex);
 }
   
-bool VTKViewer_RenderWindowInteractor::highlightPoint(const Handle(SALOME_InteractiveObject)& IObject, 
-                                                     bool hilight, const TColStd_MapOfInteger& MapIndex, 
+bool VTKViewer_RenderWindowInteractor::highlightPoint(const TColStd_IndexedMapOfInteger& theMapIndex,
+                                                     SALOME_Actor* theMapActor, 
+                                                     bool hilight, 
                                                      bool update)
 {
-  return highlight(IObject,MapIndex,&PointCreateMapper,Point_Actor,hilight,update);
+  return highlight(theMapIndex,theMapActor,myPointActor,&PointsUpdateActor,hilight,update);
 }
   
-  
-void VTKViewer_RenderWindowInteractor::setPointData(const Handle(SALOME_InteractiveObject)& IObject, 
-                                                   const int& theIndex, vtkActor* theActor )
+void VTKViewer_RenderWindowInteractor::setPointData(const int& theIndex, 
+                                                   SALOME_Actor* theMapActor,
+                                                   VTKViewer_Actor* theActor)
 {
-  TColStd_MapOfInteger MapIndex; MapIndex.Add(theIndex);
-  return setActorData(IObject,MapIndex,&PointCreateMapper,theActor);
+  TColStd_IndexedMapOfInteger MapIndex; 
+  MapIndex.Add(theIndex);
+  theActor->MapPoints(theMapActor,MapIndex);
 }
 
   
-static void EdgeCreateMapper(vtkPolyData *theSourcePolyData, vtkPolyDataMapper* theMapper, 
-                     const TColStd_MapOfInteger& theMapIndex)
+//----------------------------------------------------------------------------
+static void EdgesUpdateActor(const TColStd_IndexedMapOfInteger& theMapIndex,
+                            SALOME_Actor* theMapActor, 
+                            VTKViewer_Actor* theActor)
 {
-  vtkPolyData* aPolyData = vtkPolyData::New();
-  aPolyData->Allocate();
-
-  vtkIdList *ptIds = vtkIdList::New(); 
-  ptIds->Allocate(theSourcePolyData->GetMaxCellSize());
-  vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New();
-  aPolyData->SetPoints(theSourcePolyData->GetPoints());
-  int aCellId = -1, aCellCounter = 0;
-  for(TColStd_MapIteratorOfMapOfInteger ite(theMapIndex); ite.More(); ite.Next()){
-    if(ite.Key() > 0){
-      aCellId = ite.Key();
-      aCellCounter++;
-    }
-  }
-  if(aCellCounter == 1){
-    vtkCell* aCell = theSourcePolyData->GetCell(aCellId);
-    if(aCell->GetCellType() <= VTK_LINE){
-      aPolyData->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
-    }else{
-      TColStd_MapIteratorOfMapOfInteger ite(theMapIndex);
-      int aNbOfParts = aCell->GetNumberOfEdges();
-      for(; ite.More(); ite.Next()){
-       if(ite.Key() < 0){
-         int aPartId = -ite.Key()-1;
-         if(0 > aPartId || aPartId >= aNbOfParts) break;
-         vtkCell* anEdgeCell = aCell->GetEdge(aPartId);
-         aPolyData->InsertNextCell(VTK_LINE,anEdgeCell->GetPointIds());
-       }
-      }
-    }
-  }else{
-    int aNbOfParts = theSourcePolyData->GetNumberOfCells();
-    for(TColStd_MapIteratorOfMapOfInteger ite(theMapIndex); ite.More(); ite.Next()){
-      if(ite.Key() > 0){
-       int aPartId = ite.Key();
-       if(0 > aPartId || aPartId >= aNbOfParts) break;
-       vtkCell* aCell = theSourcePolyData->GetCell(aPartId);
-       aPolyData->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
-      }
-    }
-  }
-  ptIds->Delete();
-  theMapper->SetInput(aPolyData);  
-  aPolyData->Delete();
+  theActor->MapEdge(theMapActor,theMapIndex);
 }
   
-
-bool VTKViewer_RenderWindowInteractor::highlightEdge( const Handle(SALOME_InteractiveObject)& IObject, 
-                                                     bool hilight, 
-                                                     const TColStd_MapOfInteger& MapIndex, 
-                                                     bool update )
+bool VTKViewer_RenderWindowInteractor::highlightEdge(const TColStd_IndexedMapOfInteger& theMapIndex,
+                                                    SALOME_Actor* theMapActor, 
+                                                    bool hilight, 
+                                                    bool update)
 {
-  return highlight(IObject,MapIndex,&EdgeCreateMapper,Edge_Actor,hilight,update);
+  return highlight(theMapIndex,theMapActor,myEdgeActor,&EdgesUpdateActor,hilight,update);
 }
   
-void VTKViewer_RenderWindowInteractor::setEdgeData(const Handle(SALOME_InteractiveObject)& IObject, 
-                                                  const int& theCellIndex, const int& theEdgeIndex, 
-                                                  vtkActor* theActor )
+void VTKViewer_RenderWindowInteractor::setEdgeData(const int& theCellIndex, 
+                                                  SALOME_Actor* theMapActor,
+                                                  const int& theEdgeIndex, 
+                                                  VTKViewer_Actor* theActor )
 {
-  TColStd_MapOfInteger MapIndex; MapIndex.Add(theCellIndex); MapIndex.Add(theEdgeIndex);
-  return setActorData(IObject,MapIndex,&EdgeCreateMapper,theActor);
+  TColStd_IndexedMapOfInteger MapIndex; 
+  MapIndex.Add(theCellIndex); 
+  MapIndex.Add(theEdgeIndex);
+  theActor->MapEdge(theMapActor,MapIndex);
 }
index 3a22e676aa2093cbfa04b50c2be6bfaafcc58723..eb4fdb004a6eb78c46c16035b3d4fe0ef5d29f1f 100644 (file)
@@ -33,7 +33,6 @@
 // now we define the C++ class
 
 #include "SALOME_InteractiveObject.hxx"
-#include "SALOME_Actor.h"
 #include "SALOME_Selection.h"
 
 // QT Includes
 #include <TColStd_MapOfInteger.hxx>
 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
 
-class vtkPolyData;
-class vtkPolyDataMapper;
+class vtkPicker;
+class vtkCellPicker;
+class vtkPointPicker;
+class vtkActorCollection;
 
+class SALOME_Actor;
+class VTKViewer_Actor;
+class VTKViewer_ViewFrame;
 class VTKViewer_RenderWindow;
 class VTKViewer_InteractorStyleSALOME;
 
@@ -64,7 +68,8 @@ class VTKViewer_InteractorStyleSALOME;
 class VTK_EXPORT VTKViewer_RenderWindowInteractor : 
   public QObject, public vtkRenderWindowInteractor
 {
-  Q_OBJECT 
+  Q_OBJECT ;
+  friend class VTKViewer_ViewFrame;
 public:
 
   static VTKViewer_RenderWindowInteractor *New() ; 
@@ -129,15 +134,23 @@ public:
   //virtual void EndPickCallback();
   
   /* Selection Management */
-  bool highlightCell(const Handle(SALOME_InteractiveObject)& IObject, bool hilight, 
-                    const TColStd_MapOfInteger& MapIndex, bool immediatly = true );
-  bool highlightEdge(const Handle(SALOME_InteractiveObject)& IObject, bool hilight, 
-                    const TColStd_MapOfInteger& MapIndex, bool immediatly = true ); //NB
-  bool highlightPoint(const Handle(SALOME_InteractiveObject)& IObject, bool hilight, 
-                     const TColStd_MapOfInteger& MapIndex, bool immediatly = true );
+  bool highlightCell(const TColStd_IndexedMapOfInteger& MapIndex, 
+                    SALOME_Actor* theMapActor, 
+                    bool hilight, 
+                    bool update = true );
+  bool highlightEdge(const TColStd_IndexedMapOfInteger& MapIndex, 
+                    SALOME_Actor* theMapActor, 
+                    bool hilight, 
+                    bool update = true );
+  bool highlightPoint(const TColStd_IndexedMapOfInteger& MapIndex, 
+                     SALOME_Actor* theMapActor, 
+                     bool hilight, 
+                     bool update = true );
 
   bool highlight(const Handle(SALOME_InteractiveObject)& IObject, bool hiligth, bool immediatly = true );
+  void unHighlightSubSelection();
   bool unHighlightAll();
+
   bool isInViewer( const Handle(SALOME_InteractiveObject)& IObject);
   bool isVisible( const Handle(SALOME_InteractiveObject)& IObject);
   void rename(const Handle(SALOME_InteractiveObject)& IObject, QString newName);
@@ -147,22 +160,12 @@ public:
                        const double& theBlue = 0, const int& theWidth = 5);
   void SetSelectionTolerance(const double& theTolNodes = 0.025, const double& theTolCell = 0.001);
 
-  void setCellData(const Handle(SALOME_InteractiveObject)& IObject,
-                  const int& theIndex, vtkActor* theActor );
-  void setCellData(const Handle(SALOME_InteractiveObject)& IObject,
-                  const std::vector<int>& theIndexes, vtkActor* theActor );
-  void setEdgeData(const Handle(SALOME_InteractiveObject)& IObject,
-                  const int& theCellIndex, const int& theEdgeIndex, 
-                  vtkActor* theActor ); //NB
-  void setPointData(const Handle(SALOME_InteractiveObject)& IObject, 
-                   const int& theIndex, vtkActor* theActor );
-
   // Displaymode management
   int GetDisplayMode();
   void SetDisplayMode(int);
 
   // Switch representation wireframe/shading
-  void SwitchRepresentation(const Handle(SALOME_InteractiveObject)& IObject, bool update = true);
+  void SetDisplayMode(const Handle(SALOME_InteractiveObject)& IObject, int theMode);
 
   // Change all actors to wireframe or surface
   void ChangeRepresentationToWireframe();
@@ -194,12 +197,24 @@ public:
 
   vtkRenderer* GetRenderer();
 
-  QWidget* getGUIWindow() {return myGUIWindow;}
-  void setGUIWindow(QWidget* theWin) {myGUIWindow = theWin;}
+  void setGUIWindow(QWidget* theWindow);
+
+  void setViewFrame(VTKViewer_ViewFrame* ViewFrame);
   
-  typedef void (*TCreateMapperFun)(vtkPolyData *theSourcePolyData, 
-                                  vtkPolyDataMapper* theMapper, 
-                                  const TColStd_MapOfInteger& theMapIndex);
+  void setCellData(const int& theIndex, 
+                  SALOME_Actor* theMapActor,
+                  VTKViewer_Actor* theActor);
+  void setEdgeData(const int& theCellIndex, 
+                  SALOME_Actor* theMapActor,
+                  const int& theEdgeIndex, 
+                  VTKViewer_Actor* theActor ); //NB
+  void setPointData(const int& theIndex, 
+                   SALOME_Actor* theMapActor,
+                   VTKViewer_Actor* theActor);
+
+  typedef void (*TUpdateActor)(const TColStd_IndexedMapOfInteger& theMapIndex,
+                              SALOME_Actor* theMapActor, 
+                              VTKViewer_Actor* theActor);
  protected:
 
   VTKViewer_RenderWindowInteractor();
@@ -207,25 +222,29 @@ public:
 
   VTKViewer_InteractorStyleSALOME* myInteractorStyle;
 
-  bool highlight(const Handle(SALOME_InteractiveObject)& IObject, 
-                const TColStd_MapOfInteger& MapIndex, TCreateMapperFun theFun,
-                vtkActor *theActor, bool hilight, bool update );
-  void setActorData(const Handle(SALOME_InteractiveObject)& IObject, 
-                   const TColStd_MapOfInteger& MapIndex, TCreateMapperFun theFun,
-                   vtkActor *theActor );
-
+  bool highlight(const TColStd_IndexedMapOfInteger& theMapIndex, 
+                SALOME_Actor* theMapActor, VTKViewer_Actor* theActor,
+                TUpdateActor theFun, bool hilight, bool update);
+  void setActorData(const TColStd_IndexedMapOfInteger& theMapIndex,
+                   SALOME_Actor* theMapActor,
+                   VTKViewer_Actor *theActor,
+                   TUpdateActor theFun);
+  
   // Timer used during various mouse events to figure 
   // out mouse movements. 
   QTimer *mTimer ;
 
-  //CAI: Display mode
-  int displaymode;
+  int myDisplayMode;
 
   //NRI: Selection mode
-  Selection_Mode selectionmode;
-  vtkActor* Point_Actor;
-  vtkActor* Edge_Actor; //NB
-  vtkActor* Cell_Actor;
+  VTKViewer_Actor* myPointActor;
+  VTKViewer_Actor* myEdgeActor;
+  VTKViewer_Actor* myCellActor;
+  void MoveInternalActors();
+
+  vtkPicker* myBasicPicker;
+  vtkCellPicker* myCellPicker;
+  vtkPointPicker* myPointPicker;
   
   // User for switching to stereo mode.
   int PositionBeforeStereo[2];
@@ -259,9 +278,10 @@ public:
   void RenderWindowModified() ;
 
  private:
-  QWidget*     myGUIWindow;  
-  double       myTolNodes;
-  double       myTolItems;
+  VTKViewer_ViewFrame* myViewFrame;  
+  QWidget* myGUIWindow;  
+  double myTolNodes;
+  double myTolItems;
 };
 
 #endif
index 9a278d4a6b764c7419120f4336599f98dec6f58c..17b56a422ded42d8021efa15cccfba26b322bb1f 100644 (file)
@@ -51,22 +51,6 @@ using namespace std;
 
 //==============================================================================
 
-class VTKViewer_UnScaledActor: public vtkFollower{
-  VTKViewer_UnScaledActor(const VTKViewer_UnScaledActor&);
-
-public:
-  vtkTypeMacro(VTKViewer_UnScaledActor,vtkFollower);
-  static VTKViewer_UnScaledActor *New();
-
-  virtual void SetSize(int theSize);
-  virtual void Render(vtkRenderer *theRenderer);
-
-protected:
-  VTKViewer_UnScaledActor();
-  ~VTKViewer_UnScaledActor(){}
-  int mySize;
-};
-
 vtkStandardNewMacro(VTKViewer_UnScaledActor);
 
 VTKViewer_UnScaledActor::VTKViewer_UnScaledActor(){}
@@ -99,31 +83,6 @@ void VTKViewer_UnScaledActor::SetSize(int theSize){
 
 //==============================================================================
 
-class VTKViewer_LineActor: public vtkFollower{
-  VTKViewer_LineActor(const VTKViewer_LineActor&);
-
-public:
-  vtkTypeMacro(VTKViewer_LineActor,vtkFollower);
-  static VTKViewer_LineActor *New();
-
-  void SetLabelActor(VTKViewer_UnScaledActor* theLabelActor);
-  void SetArrowActor(VTKViewer_UnScaledActor* theLabelActor);
-  virtual void Render(vtkRenderer *theRenderer);
-
-protected:
-  VTKViewer_LineActor(){
-    LabelActor = NULL;
-    ArrowActor = NULL;
-  }
-  ~VTKViewer_LineActor(){
-    SetLabelActor(NULL);
-    SetArrowActor(NULL);
-  }
-
-  VTKViewer_UnScaledActor* LabelActor;
-  VTKViewer_UnScaledActor* ArrowActor;
-};
-
 vtkStandardNewMacro(VTKViewer_LineActor);
 
 vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor);
@@ -142,69 +101,15 @@ void VTKViewer_LineActor::Render(vtkRenderer *theRenderer){
 }
 
 //==============================================================================
-
 // The base class for concreate Axis
 // Its only duty is to give correct initialization and destruction
 //   of its pipe-lines
-class VTKViewer_Axis : public vtkObject{
-protected:
-  VTKViewer_Axis();
-  VTKViewer_Axis(const VTKViewer_Axis&);
-  virtual ~VTKViewer_Axis();
- public:
-  vtkTypeMacro(VTKViewer_Axis,vtkObject);
-  
-  virtual void AddToRender(vtkRenderer* theRenderer){
-    //Order of the calls are important
-    theRenderer->AddActor(myLineActor);
-    theRenderer->AddActor(myLabelActor);
-    theRenderer->AddActor(myArrowActor);
-  }
-
-  virtual void SetVisibility(VTKViewer_Trihedron::TVisibility theVis);
-  virtual VTKViewer_Trihedron::TVisibility GetVisibility() { 
-    return myVisibility;
-  }
-
-  virtual void SetCamera(vtkCamera* theCamera){
-    myLabelActor->SetCamera(theCamera);
-  }
-
-  virtual void SetProperty(vtkProperty* theProperty){
-    myLabelActor->SetProperty(theProperty);
-    myArrowActor->SetProperty(theProperty);
-    myLineActor->SetProperty(theProperty);
-  }
-
-  virtual void SetSize(float theSize);
-
-  virtual VTKViewer_UnScaledActor* GetLabel(){
-    return myLabelActor;
-  }
-
-  virtual VTKViewer_UnScaledActor* GetArrow(){
-    return myArrowActor;
-  }
-
-protected:
-  VTKViewer_Trihedron::TVisibility myVisibility;
-  float myDir[3], myRot[3];
-
-  VTKViewer_LineActor *myLineActor;
-  //vtkActor *myLineActor;
-  VTKViewer_UnScaledActor *myArrowActor;
-  VTKViewer_UnScaledActor *myLabelActor;
-
-  vtkPolyDataMapper *myMapper[3];
-  vtkLineSource *myLineSource;
-  vtkConeSource *myConeSource;
-  VTKViewer_VectorText* myVectorText;
-};
 
 VTKViewer_Axis::VTKViewer_Axis(){
+  
   // Initialize the Line pipe-line representation
   myLineSource = vtkLineSource::New();
-  myLineSource->SetPoint1(0.0,0.0,0.0);
+  myLineSource->SetPoint1( 0, 0, 0 );
 
   myMapper[0] = vtkPolyDataMapper::New();
   myMapper[0]->SetInput(myLineSource->GetOutput());
@@ -268,8 +173,8 @@ VTKViewer_Axis::~VTKViewer_Axis(){
   // Destroy of the Arrow pipe-line representation
   myLineActor->Delete();
 
-  myMapper[2]->RemoveAllInputs();
-  myMapper[2]->Delete();
+  myMapper[0]->RemoveAllInputs();
+  myMapper[0]->Delete();
 
   myLineSource->Delete();
 }
@@ -305,6 +210,26 @@ void VTKViewer_Axis::SetSize(float theSize){
   myLabelActor->AddPosition(aPosition);
 }
 
+void VTKViewer_Axis::AddToRender( vtkRenderer* theRenderer )
+{
+  //Order of the calls are important
+  theRenderer->AddActor( myLineActor );
+  theRenderer->AddActor( myLabelActor );
+  theRenderer->AddActor( myArrowActor );
+}
+
+void VTKViewer_Axis::SetCamera( vtkCamera* theCamera )
+{
+  myLabelActor->SetCamera(theCamera);
+}
+
+void VTKViewer_Axis::SetProperty( vtkProperty* theProperty )
+{
+  myLabelActor->SetProperty(theProperty);
+  myArrowActor->SetProperty(theProperty);
+  myLineActor->SetProperty(theProperty);
+  }
+
 //==============================================================================
 class VTKViewer_XAxis : public VTKViewer_Axis{
 protected:
index d53a602c32a8b1d23c54f1e87bb8644cdd07e184..169e4734539dc6f27e006646b007422b9d45bd4d 100644 (file)
 #define VTKViewer_Trihedron_H
 
 #include <vtkObject.h>
+#include <vtkFollower.h>
 
 class vtkActorCollection;
 class VTKViewer_Axis;
 class vtkRenderer;
+class vtkPolyDataMapper;
+class vtkLineSource;
+class vtkConeSource;
+class VTKViewer_VectorText;
+class vtkCamera;
+class vtkProperty;
+
+//==============================================================================
+
+class VTKViewer_UnScaledActor: public vtkFollower{
+  VTKViewer_UnScaledActor(const VTKViewer_UnScaledActor&);
+
+public:
+  vtkTypeMacro(VTKViewer_UnScaledActor,vtkFollower);
+  static VTKViewer_UnScaledActor *New();
+
+  virtual void SetSize(int theSize);
+  virtual void Render(vtkRenderer *theRenderer);
+
+protected:
+  VTKViewer_UnScaledActor();
+  ~VTKViewer_UnScaledActor(){}
+  int mySize;
+};
+
+//==============================================================================
+
+class VTKViewer_LineActor: public vtkFollower{
+  VTKViewer_LineActor(const VTKViewer_LineActor&);
+
+public:
+  vtkTypeMacro(VTKViewer_LineActor,vtkFollower);
+  static VTKViewer_LineActor *New();
+
+  void SetLabelActor(VTKViewer_UnScaledActor* theLabelActor);
+  void SetArrowActor(VTKViewer_UnScaledActor* theLabelActor);
+  virtual void Render(vtkRenderer *theRenderer);
+
+protected:
+  VTKViewer_LineActor(){
+    LabelActor = NULL;
+    ArrowActor = NULL;
+  }
+  ~VTKViewer_LineActor(){
+    SetLabelActor(NULL);
+    SetArrowActor(NULL);
+  }
+
+  VTKViewer_UnScaledActor* LabelActor;
+  VTKViewer_UnScaledActor* ArrowActor;
+};
+
+//================================================
 
 class VTKViewer_Trihedron : public vtkObject{
  protected:
@@ -64,4 +118,43 @@ protected:
   float mySize;
 };
 
+//==============================================================================
+// The base class for concreate Axis
+// Its only duty is to give correct initialization and destruction
+//   of its pipe-lines
+class VTKViewer_Axis : public vtkObject{
+protected:
+  VTKViewer_Axis();
+  VTKViewer_Axis(const VTKViewer_Axis&);
+  virtual ~VTKViewer_Axis();
+ public:
+  vtkTypeMacro(VTKViewer_Axis,vtkObject);
+
+  virtual void AddToRender(vtkRenderer* theRenderer);
+
+  virtual void SetVisibility(VTKViewer_Trihedron::TVisibility theVis);
+  virtual VTKViewer_Trihedron::TVisibility GetVisibility() { return myVisibility; }
+
+  virtual void SetCamera(vtkCamera* theCamera);
+  virtual void SetProperty(vtkProperty* theProperty);
+  virtual void SetSize(float theSize);
+
+  virtual VTKViewer_UnScaledActor* GetLabel(){ return myLabelActor; }
+  virtual VTKViewer_UnScaledActor* GetArrow(){ return myArrowActor; }
+
+protected:
+  VTKViewer_Trihedron::TVisibility myVisibility;
+  float myDir[3], myRot[3];
+
+  VTKViewer_LineActor *myLineActor;
+  //vtkActor *myLineActor;
+  VTKViewer_UnScaledActor *myArrowActor;
+  VTKViewer_UnScaledActor *myLabelActor;
+
+  vtkPolyDataMapper *myMapper[3];
+  vtkLineSource *myLineSource;
+  vtkConeSource *myConeSource;
+  VTKViewer_VectorText* myVectorText;
+};
+
 #endif
index b68158db7374a2b735edf84261a5794d334119d9..f16a93f4cd30b8fba296731c2cd2df49c3d12164 100644 (file)
 #include "VTKViewer_Utilities.h"
 #include "VTKViewer_Trihedron.h"
 #include "VTKViewer_RenderWindow.h"
+#include "VTKViewer_RenderWindowInteractor.h"
 #include "VTKViewer_InteractorStyleSALOME.h"
+#include "VTKViewer_Algorithm.h"
+#include "VTKViewer_Functor.h"
+#include "VTKViewer_Prs.h"
 
+#include "SALOME_Actor.h"
 #include "SALOME_Transform.h"
 #include "SALOME_TransformFilter.h"
 #include "SALOME_GeometryFilter.h"
 
 // VTK Includes
 #include <vtkActor.h>
+#include <vtkCamera.h>
 #include <vtkRenderer.h>
 #include <vtkTransform.h>
+#include <vtkActorCollection.h>
+
+#include <TColStd_IndexedMapOfInteger.hxx>
 
 using namespace std;
 
@@ -95,15 +104,19 @@ void VTKViewer_ViewFrame::InitialSetup() {
   
   // Create an interactor.
   m_RWInteractor = VTKViewer_RenderWindowInteractor::New();
-  m_RWInteractor->setGUIWindow(m_RW);
   m_RWInteractor->SetRenderWindow(m_RW->getRenderWindow());
 
   VTKViewer_InteractorStyleSALOME* RWS = VTKViewer_InteractorStyleSALOME::New();
-  RWS->setGUIWindow(m_RW);
   m_RWInteractor->SetInteractorStyle(RWS); 
+  RWS->Delete();
+
+  m_RWInteractor->setGUIWindow(m_RW);
+  RWS->setGUIWindow(m_RW);
 
   m_RWInteractor->Initialize();
+  m_RWInteractor->setViewFrame(this);
   RWS->setTriedron(m_Triedron);
+  RWS->setViewFrame(this);
   //SRN: additional initialization, to init CurrentRenderer of vtkInteractorStyle 
   RWS->FindPokedRenderer(0, 0);
 
@@ -112,18 +125,18 @@ void VTKViewer_ViewFrame::InitialSetup() {
 }
 
 VTKViewer_ViewFrame::~VTKViewer_ViewFrame() {
-  m_Transform->Delete() ;
   // In order to ensure that the interactor unregisters
   // this RenderWindow, we assign a NULL RenderWindow to 
   // it before deleting it.
   m_RWInteractor->SetRenderWindow(NULL) ;
   m_RWInteractor->Delete() ;
   
+  m_Transform->Delete() ;
   //m_RW->Delete() ;
   m_Renderer->RemoveAllProps();
   // NRI : BugID 1137:  m_Renderer->Delete() ;
   m_Triedron->Delete();
-  MESSAGE("VTKViewer_ViewFrame::~VTKViewer_ViewFrame()");
+  INFOS("VTKViewer_ViewFrame::~VTKViewer_ViewFrame()");
 }
 
 /*!
@@ -137,43 +150,87 @@ bool VTKViewer_ViewFrame::isTrihedronDisplayed(){
   return m_Triedron->GetVisibility() == VTKViewer_Trihedron::eOn;
 }
 
-void VTKViewer_ViewFrame::onAdjustTrihedron(){   
-  if(!isTrihedronDisplayed()) 
+bool VTKViewer_ViewFrame::ComputeTrihedronSize( double& theNewSize, double& theSize )
+{
+  // calculating diagonal of visible props of the renderer
+  float bnd[ 6 ];
+  m_Triedron->VisibilityOff();
+  if ( ::ComputeVisiblePropBounds( m_Renderer, bnd ) == 0 )
+  {
+    bnd[ 1 ] = bnd[ 3 ] = bnd[ 5 ] = 100;
+    bnd[ 0 ] = bnd[ 2 ] = bnd[ 100 ] = 0;
+  }
+  m_Triedron->VisibilityOn();
+  float aLength = 0;
+  static bool CalcByDiag = false;
+  if ( CalcByDiag )
+  {
+    aLength = sqrt( ( bnd[1]-bnd[0])*(bnd[1]-bnd[0] )+
+                    ( bnd[3]-bnd[2])*(bnd[3]-bnd[2] )+
+                    ( bnd[5]-bnd[4])*(bnd[5]-bnd[4] ) );
+  }
+  else
+  {
+    aLength = bnd[ 1 ]-bnd[ 0 ];
+    aLength = max( ( bnd[ 3 ] - bnd[ 2 ] ),aLength );
+    aLength = max( ( bnd[ 5 ] - bnd[ 4 ] ),aLength );
+  }
+
+  static float aSizeInPercents = 105;
+  QString aSetting = QAD_CONFIG->getSetting( "Viewer:TrihedronSize" );
+  if ( !aSetting.isEmpty() )
+    aSizeInPercents = aSetting.toFloat();
+
+  static float EPS_SIZE = 5.0E-3;
+  theSize = m_Triedron->GetSize();
+  theNewSize = aLength * aSizeInPercents / 100.0;
+
+  // if the new trihedron size have sufficient difference, then apply the value
+  return fabs( theNewSize - theSize) > theSize * EPS_SIZE ||
+         fabs( theNewSize-theSize ) > theNewSize * EPS_SIZE;
+}
+
+double VTKViewer_ViewFrame::GetTrihedronSize() const
+{
+  return m_Triedron->GetSize();
+}
+
+void VTKViewer_ViewFrame::AdjustTrihedrons( const bool forcedUpdate )
+{
+  if ( !isTrihedronDisplayed() && !forcedUpdate )
     return;
-  int aVisibleNum = m_Triedron->GetVisibleActorCount(m_Renderer);
-  if(aVisibleNum){
-    // calculating diagonal of visible props of the renderer
-    float bnd[6];
-    m_Triedron->VisibilityOff();
-    ::ComputeVisiblePropBounds(m_Renderer,bnd);
-    m_Triedron->VisibilityOn();
-    float aLength = 0;
-    static bool CalcByDiag = false;
-    if(CalcByDiag){
-      aLength = sqrt((bnd[1]-bnd[0])*(bnd[1]-bnd[0])+
-                    (bnd[3]-bnd[2])*(bnd[3]-bnd[2])+
-                    (bnd[5]-bnd[4])*(bnd[5]-bnd[4]));
-    }else{
-      aLength = bnd[1]-bnd[0];
-      aLength = max((bnd[3]-bnd[2]),aLength);
-      aLength = max((bnd[5]-bnd[4]),aLength);
-    }
-   
-    static float aSizeInPercents = 105;
-    QString aSetting = QAD_CONFIG->getSetting("Viewer:TrihedronSize");
-    if(!aSetting.isEmpty()) aSizeInPercents = aSetting.toFloat();
-
-    static float EPS_SIZE = 5.0E-3;
-    float aSize = m_Triedron->GetSize();
-    float aNewSize = aLength*aSizeInPercents/100.0;
+
+  int aVisibleNum = m_Triedron->GetVisibleActorCount( m_Renderer );
+  if ( aVisibleNum || forcedUpdate )
+  {
     // if the new trihedron size have sufficient difference, then apply the value
-    if(fabs(aNewSize-aSize) > aSize*EPS_SIZE || fabs(aNewSize-aSize) > aNewSize*EPS_SIZE){
-      m_Triedron->SetSize(aNewSize);
+    double aNewSize = 100, anOldSize;
+    if ( ComputeTrihedronSize( aNewSize, anOldSize ) || forcedUpdate )
+    {
+      m_Triedron->SetSize( aNewSize );
+      // itearte throuh displayed objects and set size if necessary
+
+      vtkActorCollection* anActors = getRenderer()->GetActors();
+      anActors->InitTraversal();
+      while( vtkActor* anActor = anActors->GetNextActor() )
+      {
+        if( SALOME_Actor* aSActor = SALOME_Actor::SafeDownCast( anActor ) )
+        {
+          if ( aSActor->IsResizable() )
+            aSActor->SetSize( 0.5 * aNewSize );
+        }
+      }
     }
   }
+
   ::ResetCameraClippingRange(m_Renderer);
 }
 
+void VTKViewer_ViewFrame::onAdjustTrihedron()
+{   
+  AdjustTrihedrons( false );
+}
+
 /*!
   Display/hide Trihedron
 */
@@ -214,7 +271,7 @@ void VTKViewer_ViewFrame::onViewBottom(){
 */
 void VTKViewer_ViewFrame::onViewLeft(){
   vtkCamera* camera = m_Renderer->GetActiveCamera(); 
-  camera->SetPosition(0,1,0);
+  camera->SetPosition(0,-1,0);
   camera->SetViewUp(0,0,1);
   camera->SetFocalPoint(0,0,0);
   onViewFitAll();
@@ -225,7 +282,7 @@ void VTKViewer_ViewFrame::onViewLeft(){
 */
 void VTKViewer_ViewFrame::onViewRight(){
   vtkCamera* camera = m_Renderer->GetActiveCamera();
-  camera->SetPosition(0,-1,0);
+  camera->SetPosition(0,1,0);
   camera->SetViewUp(0,0,1);
   camera->SetFocalPoint(0,0,0);
   onViewFitAll();
@@ -258,17 +315,6 @@ void VTKViewer_ViewFrame::onViewFront(){
 */
 void VTKViewer_ViewFrame::onViewFitAll(){
   m_RWInteractor->GetInteractorStyleSALOME()->ViewFitAll();
-//   int aTriedronWasVisible = isTrihedronDisplayed();
-//   if(m_Triedron->GetVisibleActorCount(m_Renderer)){
-//     m_Triedron->VisibilityOff();
-//     ::ResetCamera(m_Renderer);
-//   }else{
-//     m_Triedron->SetVisibility(VTKViewer_Trihedron::eOnlyLineOn);
-//     ::ResetCamera(m_Renderer,true);
-//   }
-//   if(aTriedronWasVisible) m_Triedron->VisibilityOn();
-//   else m_Triedron->VisibilityOff();
-
   Repaint();
 }
 
@@ -372,31 +418,30 @@ void VTKViewer_ViewFrame::highlight( const Handle(SALOME_InteractiveObject)& IOb
   SALOME_Selection* Sel = SALOME_Selection::Selection( ActiveStudy->getSelection() );
   m_RWInteractor->highlight(IObject, highlight, update);
 
-  switch (Sel->SelectionMode()) {
-  case NodeSelection:
-    if ( Sel->HasIndex( IObject ) ) {
-      TColStd_MapOfInteger MapIndex;
-      Sel->GetIndex( IObject, MapIndex );
-      m_RWInteractor->highlightPoint(IObject, highlight, MapIndex, update);
-    }
-    break;
-  case EdgeOfCellSelection:
-    if ( Sel->HasIndex( IObject ) ) {
-      TColStd_MapOfInteger MapIndex;
-      Sel->GetIndex( IObject, MapIndex );
-      m_RWInteractor->highlightEdge(IObject, highlight, MapIndex, update);
-    }
-    break;
-  case CellSelection:
-  case EdgeSelection:
-  case FaceSelection:
-  case VolumeSelection:
-    if ( Sel->HasIndex( IObject ) ) {
-      TColStd_MapOfInteger MapIndex;
-      Sel->GetIndex( IObject, MapIndex );
-      m_RWInteractor->highlightCell(IObject, highlight, MapIndex, update);
+  if(Sel->HasIndex(IObject) && IObject->hasEntry()){
+    TColStd_IndexedMapOfInteger MapIndex;
+    Sel->GetIndex(IObject,MapIndex);
+    using namespace SALOME::VTK;
+    const char* anEntry = IObject->getEntry();
+    vtkActorCollection* aCollection = getRenderer()->GetActors();
+    if(SALOME_Actor* anActor = Find<SALOME_Actor>(aCollection,TIsSameEntry<SALOME_Actor>(anEntry))){
+      switch (Sel->SelectionMode()) {
+      case NodeSelection:
+       m_RWInteractor->highlightPoint(MapIndex,anActor,highlight,update);
+       break;
+      case EdgeOfCellSelection:
+       m_RWInteractor->highlightEdge(MapIndex,anActor,highlight,update);
+       break;
+      case CellSelection:
+      case EdgeSelection:
+      case FaceSelection:
+      case VolumeSelection:
+       m_RWInteractor->highlightCell(MapIndex,anActor,highlight,update);
+       break;
+      }
     }
-    break;
+  }else{
+    m_RWInteractor->unHighlightSubSelection();
   }
 }
 
@@ -415,170 +460,88 @@ void VTKViewer_ViewFrame::setPopupServer( QAD_Application* App )
   m_RW->setPopupServer( App );
 }
 
-void VTKViewer_ViewFrame::undo(SALOMEDS::Study_var aStudy,
-                              const char* StudyFrameEntry)
+/* selection */
+Handle(SALOME_InteractiveObject) VTKViewer_ViewFrame::FindIObject(const char* theEntry)
 {
-  vtkActorCollection* theActors = m_Renderer->GetActors();
-  theActors->InitTraversal();
-  vtkActor *ac = theActors->GetNextActor();
-  while(!(ac==NULL)) {
-    if ( ac->IsA("SALOME_Actor") ) {
-      SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-      if ( anActor->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = anActor->getIO();
-       if ( IO->hasEntry() ) { 
-         /*if (!QAD_ViewFrame::isInViewer(aStudy, IO->getEntry(), StudyFrameEntry)) {
-           m_RWInteractor->Erase(IO);
-           }*/
-       }
-      }
-    }
-    ac = theActors->GetNextActor();
-  }
+  using namespace SALOME::VTK;
+  SALOME_Actor* anActor = 
+    Find<SALOME_Actor>(getRenderer()->GetActors(),
+                      TIsSameEntry<SALOME_Actor>(theEntry));
+  if(anActor)
+    return anActor->getIO();
+
+  return Handle(SALOME_InteractiveObject)();
 }
 
-void VTKViewer_ViewFrame::redo(SALOMEDS::Study_var aStudy,
-                              const char* StudyFrameEntry)
+/* display */          
+void VTKViewer_ViewFrame::Display(const Handle(SALOME_InteractiveObject)& theIObject, bool update)
 {
-  SALOMEDS::SObject_var RefSO;
-  SALOMEDS::SObject_var SO = aStudy->FindObjectID( StudyFrameEntry );
-  SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(SO);
-  for (; it->More();it->Next()){
-    SALOMEDS::SObject_var CSO= it->Value();
-    if (CSO->ReferencedObject(RefSO)) {
-      vtkActorCollection* theActors = m_Renderer->GetActors();
-      theActors->InitTraversal();
-      vtkActor *ac = theActors->GetNextActor();
-      while(!(ac==NULL)) {
-       if ( ac->IsA("SALOME_Actor") ) {
-         SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-         if ( anActor->hasIO() ) {
-           Handle(SALOME_InteractiveObject) IO = anActor->getIO();
-           if ( IO->hasEntry() ) { 
-             /*if ( strcmp(IO->getEntry(),RefSO->GetID()) == 0 )
-               m_RWInteractor->Display(IO);*/
-           }
-         }
-       }
-       ac = theActors->GetNextActor();
-      }
-    }
-  }
+  QAD_Study* aStudy = QAD_Application::getDesktop()->getActiveStudy();
+  SALOME_Selection* aSel = SALOME_Selection::Selection(aStudy->getSelection());
+
+  m_RWInteractor->Display(theIObject,false);
+  aSel->AddIObject(theIObject,false);
+
+  if(update)
+    Repaint();
 }
 
 
-/* selection */
-Handle(SALOME_InteractiveObject) VTKViewer_ViewFrame::FindIObject(const char* Entry)
-{
-  Handle(SALOME_InteractiveObject) IO;
-  vtkActorCollection* theActors = m_Renderer->GetActors();
-  theActors->InitTraversal();
-  vtkActor *ac = theActors->GetNextActor();
-  while(!(ac==NULL)) {
-    if ( ac->IsA("SALOME_Actor") ) {
-      SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-      if ( anActor->hasIO() ) {
-       IO = anActor->getIO();
-       if ( IO->hasEntry() ) {
-         if ( strcmp( IO->getEntry(), Entry ) == 0 ) {
-           return IO;
-         }
-       }
-      }
-    }
-    ac = theActors->GetNextActor();
+struct TDisplayAction{
+  SALOME_Selection* mySel;
+  Handle(SALOME_InteractiveObject) myIO;
+  TDisplayAction(SALOME_Selection* theSel,
+                Handle(SALOME_InteractiveObject) theIO): 
+    mySel(theSel), myIO(theIO)
+  {}
+  void operator()(SALOME_Actor* theActor){
+    theActor->SetVisibility(true);
+    mySel->AddIObject(myIO,false);
   }
-  return IO;
-}
+};
 
-/* display */          
-void VTKViewer_ViewFrame::Display(const Handle(SALOME_InteractiveObject)& IObject, bool update)
+void VTKViewer_ViewFrame::DisplayOnly(const Handle(SALOME_InteractiveObject)& theIObject)
 {
-  QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-
-  vtkActorCollection* theActors = m_Renderer->GetActors();
-  theActors->InitTraversal();
-  vtkActor *ac = theActors->GetNextActor();
-  while(!(ac==NULL))
-    {
-      if ( ac->IsA("SALOME_Actor") )
-       {
-         SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-         if ( anActor->hasIO() ) 
-           {
-             Handle(SALOME_InteractiveObject) IO = anActor->getIO();
-             if ( IO->isSame(IObject) )
-               {
-                 m_RWInteractor->Display(IO, false);
-                 Sel->AddIObject(IO, false);
-                 break;
-               }
-           }
-       }
-      ac = theActors->GetNextActor();
-    }
-  if (update)
-    Repaint();
-}
+  QAD_Study* aStudy = QAD_Application::getDesktop()->getActiveStudy();
+  SALOME_Selection* aSel = SALOME_Selection::Selection(aStudy->getSelection());
 
+  aSel->ClearIObjects();
+  m_RWInteractor->EraseAll();
+
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(getRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TDisplayAction(aSel,theIObject));
 
-void VTKViewer_ViewFrame::DisplayOnly(const Handle(SALOME_InteractiveObject)& IObject)
-{
-  QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-
-  vtkActorCollection* theActors = m_Renderer->GetActors();
-  theActors->InitTraversal();
-  vtkActor *ac = theActors->GetNextActor();
-  while(!(ac==NULL)) {
-    if ( ac->IsA("SALOME_Actor") ) {
-      SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-      if ( anActor->hasIO() ) {
-       Handle(SALOME_InteractiveObject) IO = anActor->getIO();
-       if ( !IO->isSame(IObject) ) {
-         m_RWInteractor->Erase(IO, false);
-         Sel->RemoveIObject(IO, false);
-       } else {
-         anActor->SetVisibility(true);
-         Sel->AddIObject(IO, false);
-       }
-      }
-    }
-    ac = theActors->GetNextActor();
-  }
   Repaint();
 }
 
-void VTKViewer_ViewFrame::Erase(const Handle(SALOME_InteractiveObject)& IObject, bool update)
+
+struct TEraseAction: TDisplayAction{
+  VTKViewer_RenderWindowInteractor* myRWInteractor;
+  TEraseAction(SALOME_Selection* theSel,
+              Handle(SALOME_InteractiveObject) theIO,
+              VTKViewer_RenderWindowInteractor* theRWInteractor): 
+    TDisplayAction(theSel,theIO),
+    myRWInteractor(theRWInteractor)
+  {}
+  void operator()(SALOME_Actor* theActor){
+    myRWInteractor->Erase(myIO,false);
+    mySel->RemoveIObject(myIO,false);
+  }
+};
+
+void VTKViewer_ViewFrame::Erase(const Handle(SALOME_InteractiveObject)& theIObject, bool update)
 {
-  QAD_Study* myStudy = QAD_Application::getDesktop()->getActiveStudy();
-  SALOME_Selection* Sel
-    = SALOME_Selection::Selection( myStudy->getSelection() );
-
-  vtkActorCollection* theActors = m_Renderer->GetActors();
-  theActors->InitTraversal();
-  vtkActor *ac = theActors->GetNextActor();
-  while(!(ac==NULL)) 
-    {
-      if ( ac->IsA("SALOME_Actor") )
-       {
-         SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
-         if ( anActor->hasIO() )
-           {
-             Handle(SALOME_InteractiveObject) IO = anActor->getIO();
-             if ( IO->isSame( IObject ) ) {
-               m_RWInteractor->Erase(IO, false);
-               Sel->RemoveIObject(IO, false);
-               break;
-             }
-           }
-       }
-      ac = theActors->GetNextActor();
-    }
-  if (update)
+  QAD_Study* aStudy = QAD_Application::getDesktop()->getActiveStudy();
+  SALOME_Selection* aSel = SALOME_Selection::Selection(aStudy->getSelection());
+
+  using namespace SALOME::VTK;
+  ForEachIf<SALOME_Actor>(getRenderer()->GetActors(),
+                         TIsSameIObject<SALOME_Actor>(theIObject),
+                         TEraseAction(aSel,theIObject,m_RWInteractor));
+
+  if(update)
     Repaint();
 }
 
@@ -611,14 +574,132 @@ void VTKViewer_ViewFrame::SetScale(double theScale[3]){
   Repaint();
 }
 
-void VTKViewer_ViewFrame::AddActor( SALOME_Actor* theActor, bool update /*=false*/ ){
-  theActor->SetVisibility(true);
+void VTKViewer_ViewFrame::InsertActor( SALOME_Actor* theActor, bool theMoveInternalActors ){
   theActor->AddToRender(m_Renderer);
   theActor->SetTransform(m_Transform);
-  if(update) Repaint();
+  if(theMoveInternalActors) 
+    m_RWInteractor->MoveInternalActors();
+}
+
+void VTKViewer_ViewFrame::AddActor( SALOME_Actor* theActor, bool theUpdate /*=false*/ ){
+  InsertActor(theActor);
+  if(theUpdate) 
+    Repaint();
 }
 
-void VTKViewer_ViewFrame::RemoveActor( SALOME_Actor* theActor, bool update /*=false*/ ){
+void VTKViewer_ViewFrame::RemoveActor( SALOME_Actor* theActor, bool theUpdate /*=false*/ ){
   theActor->RemoveFromRender(m_Renderer);
-  if(update) Repaint();
+  if(theUpdate) 
+    Repaint();
+}
+
+void VTKViewer_ViewFrame::MoveActor(SALOME_Actor* theActor)
+{
+  RemoveActor(theActor);
+  InsertActor(theActor,true);
+}
+
+//==========================================================
+/*!
+ *  VTKViewer_ViewFrame::Display
+ *  Display presentation
+ */
+//==========================================================
+void VTKViewer_ViewFrame::Display( const SALOME_VTKPrs* prs )
+{
+  // try do downcast object
+  const VTKViewer_Prs* aVTKPrs = dynamic_cast<const VTKViewer_Prs*>( prs );
+  if ( !aVTKPrs || aVTKPrs->IsNull() )
+    return;
+
+  vtkActorCollection* actors = aVTKPrs->GetObjects();
+  if ( !actors )
+    return;
+
+  actors->InitTraversal();
+  vtkActor* actor;
+  while( ( actor = actors->GetNextActor() ) )
+  {
+    SALOME_Actor* salomeActor = SALOME_Actor::SafeDownCast( actor );
+    if ( salomeActor )                      
+    {
+      // just display the object
+      m_RWInteractor->Display( salomeActor, false );
+      if ( salomeActor->IsSetCamera() )
+        salomeActor->SetCamera( getRenderer()->GetActiveCamera() );
+    }
+  }
+}
+
+//==========================================================
+/*!
+ *  VTKViewer_ViewFrame::Erase
+ *  Erase presentation
+ */
+//==========================================================
+void VTKViewer_ViewFrame::Erase( const SALOME_VTKPrs* prs, const bool forced )
+{
+  // try do downcast object
+  const VTKViewer_Prs* aVTKPrs = dynamic_cast<const VTKViewer_Prs*>( prs );
+  if ( !aVTKPrs || aVTKPrs->IsNull() )
+    return;
+
+  vtkActorCollection* actors = aVTKPrs->GetObjects();
+  if ( !actors )
+    return;
+
+  actors->InitTraversal();
+  vtkActor* actor;
+  while( ( actor = actors->GetNextActor() ) ) {
+    SALOME_Actor* salomeActor = SALOME_Actor::SafeDownCast( actor );
+    if ( salomeActor ) {
+      // just erase the object
+      m_RWInteractor->Erase( salomeActor, forced );
+    }
+  }
+}
+  
+//==========================================================
+/*!
+ *  VTKViewer_ViewFrame::CreatePrs
+ *  Create presentation by entry
+ */
+//==========================================================
+SALOME_Prs* VTKViewer_ViewFrame::CreatePrs( const char* entry )
+{
+  VTKViewer_Prs* prs = new VTKViewer_Prs();
+  if ( entry ) {
+    vtkActorCollection* theActors = m_Renderer->GetActors();
+    theActors->InitTraversal();
+    vtkActor* ac;
+    while( ( ac = theActors->GetNextActor() ) ) {
+      SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
+      if ( anActor && anActor->hasIO() && !strcmp( anActor->getIO()->getEntry(), entry ) ) {
+       prs->AddObject( ac );
+      }
+    }
+  }
+  return prs;
+}
+
+//==========================================================
+/*!
+ *  VTKViewer_ViewFrame::BeforeDisplay
+ *  Axiluary method called before displaying of objects
+ */
+//==========================================================
+void  VTKViewer_ViewFrame::BeforeDisplay( SALOME_Displayer* d )
+{
+  d->BeforeDisplay( this, SALOME_VTKViewType() );
+}
+
+//==========================================================
+/*!
+ *  VTKViewer_ViewFrame::AfterDisplay
+ *  Axiluary method called after displaying of objects
+ */
+//==========================================================
+void  VTKViewer_ViewFrame::AfterDisplay( SALOME_Displayer* d )
+{
+  d->AfterDisplay( this, SALOME_VTKViewType() );
 }
index 5547699faffb714c50d91cad05837a62dc88e0e6..7f67e444de6619c25eea69121e1d2a69db2efa9b 100644 (file)
 #include "QAD.h"
 #include "QAD_ViewFrame.h"
 
-#include "VTKViewer_RenderWindowInteractor.h"
-#include "VTKViewer_RenderWindow.h"
-
-// VTK Includes
 class vtkRenderer;
-class vtkTransform;
+
+class SALOME_Actor;
+class SALOME_Transform;
+
 class VTKViewer_Trihedron;
+class VTKViewer_RenderWindow;
+class VTKViewer_RenderWindowInteractor;
+
 
 class QAD_EXPORT VTKViewer_ViewFrame : public QAD_ViewFrame{
   Q_OBJECT;
@@ -72,13 +74,6 @@ class QAD_EXPORT VTKViewer_ViewFrame : public QAD_ViewFrame{
   bool                           isInViewer( const Handle(SALOME_InteractiveObject)& IObject );
   bool                           isVisible( const Handle(SALOME_InteractiveObject)& IObject );
 
-  /*  undo/redo management */
-  void              undo(SALOMEDS::Study_var aStudy,
-                        const char* StudyFrameEntry);
-  void              redo(SALOMEDS::Study_var aStudy,
-                        const char* StudyFrameEntry);
-
-
   /* selection */
   Handle(SALOME_InteractiveObject) FindIObject(const char* Entry);
   
@@ -91,12 +86,22 @@ class QAD_EXPORT VTKViewer_ViewFrame : public QAD_ViewFrame{
   void           Repaint(bool theUpdateTrihedron);
   void           Repaint() { Repaint(true); }
 
+  /* Reimplemented from SALOME_View */
+  void          Display( const SALOME_VTKPrs* );
+  void          Erase( const SALOME_VTKPrs*, const bool = false );
+  SALOME_Prs*   CreatePrs( const char* entry = 0 );
+  virtual void  BeforeDisplay( SALOME_Displayer* d );
+  virtual void  AfterDisplay ( SALOME_Displayer* d );
+
   //apply existing transformation on adding SALOME_Actor
   void SetScale(double theScale[3]);
   void GetScale(double theScale[3]);
   void AddActor(SALOME_Actor*, bool update = false);
   void RemoveActor(SALOME_Actor*, bool update = false);
 
+  void          AdjustTrihedrons( const bool forced );
+  bool          ComputeTrihedronSize( double& theNewSize, double& theOldSize );
+  double        GetTrihedronSize() const;
  public slots:
   void           onViewPan(); 
   void           onViewZoom();
@@ -115,16 +120,20 @@ class QAD_EXPORT VTKViewer_ViewFrame : public QAD_ViewFrame{
   void           onAdjustTrihedron();
  
  private:
-  double                        m_ViewUp[3];
-  double                        m_ViewNormal[3];
-  
-  void                          InitialSetup();
+  void InitialSetup();
 
-  vtkRenderer*                      m_Renderer;
-  VTKViewer_RenderWindow*           m_RW;
+  double m_ViewUp[3];
+  double m_ViewNormal[3];
+  
+  vtkRenderer* m_Renderer;
+  VTKViewer_RenderWindow* m_RW;
   VTKViewer_RenderWindowInteractor* m_RWInteractor;
 
-  VTKViewer_Trihedron *m_Triedron;  
-  SALOME_Transform *m_Transform;
+  friend class VTKViewer_RenderWindowInteractor;
+  void InsertActor(SALOME_Actor* theActor, bool theMoveInternalActors = false);
+  void MoveActor(SALOME_Actor* theActor);
+
+  VTKViewer_Trihedron* m_Triedron;  
+  SALOME_Transform* m_Transform;
 };
 #endif