]> SALOME platform Git repositories - modules/visu.git/commitdiff
Salome HOME
Rollback previous changes: V5_1_main_20100422 V5_1_main_20100423 V5_1_main_20100426 V5_1_main_20100427 V5_1_main_20100428 V5_1_main_20100429 V5_1_main_20100430 V5_1_main_20100504 V5_1_main_20100505 V5_1_main_20100506 V5_1_main_20100507 V5_1_main_20100511 before_mergefrom_V5_1_4_BR_07May10
authorouv <ouv@opencascade.com>
Tue, 20 Apr 2010 07:56:07 +0000 (07:56 +0000)
committerouv <ouv@opencascade.com>
Tue, 20 Apr 2010 07:56:07 +0000 (07:56 +0000)
Refactoring (removing obsolete GUITOOLS and VVTK packages) + improvement of VISU_TableDlg class, introducing edition and sorting features (intermediate state)

36 files changed:
src/GUITOOLS/Makefile.am [new file with mode: 0644]
src/GUITOOLS/VisuGUITools.h [new file with mode: 0755]
src/GUITOOLS/VisuGUI_GUITools.cxx [new file with mode: 0644]
src/GUITOOLS/VisuGUI_GUITools.h [new file with mode: 0644]
src/GUITOOLS/VisuGUI_TableDlg.cxx [new file with mode: 0644]
src/GUITOOLS/VisuGUI_TableDlg.h [new file with mode: 0644]
src/VVTK/Makefile.am [new file with mode: 0755]
src/VVTK/VVTK.h [new file with mode: 0755]
src/VVTK/VVTK_ImageWriter.cxx [new file with mode: 0755]
src/VVTK/VVTK_ImageWriter.h [new file with mode: 0755]
src/VVTK/VVTK_ImageWriterMgr.cxx [new file with mode: 0755]
src/VVTK/VVTK_ImageWriterMgr.h [new file with mode: 0755]
src/VVTK/VVTK_InteractorStyle.cxx [new file with mode: 0644]
src/VVTK/VVTK_InteractorStyle.h [new file with mode: 0644]
src/VVTK/VVTK_MainWindow.cxx [new file with mode: 0644]
src/VVTK/VVTK_MainWindow.h [new file with mode: 0644]
src/VVTK/VVTK_PickingDlg.cxx [new file with mode: 0644]
src/VVTK/VVTK_PickingDlg.h [new file with mode: 0644]
src/VVTK/VVTK_PrimitiveBox.cxx [new file with mode: 0644]
src/VVTK/VVTK_PrimitiveBox.h [new file with mode: 0644]
src/VVTK/VVTK_Recorder.cxx [new file with mode: 0755]
src/VVTK/VVTK_Recorder.h [new file with mode: 0755]
src/VVTK/VVTK_RecorderDlg.cxx [new file with mode: 0644]
src/VVTK/VVTK_RecorderDlg.h [new file with mode: 0644]
src/VVTK/VVTK_Renderer.cxx [new file with mode: 0644]
src/VVTK/VVTK_Renderer.h [new file with mode: 0644]
src/VVTK/VVTK_SegmentationCursorDlg.cxx [new file with mode: 0644]
src/VVTK/VVTK_SegmentationCursorDlg.h [new file with mode: 0644]
src/VVTK/VVTK_SizeBox.cxx [new file with mode: 0644]
src/VVTK/VVTK_SizeBox.h [new file with mode: 0644]
src/VVTK/VVTK_ViewManager.cxx [new file with mode: 0644]
src/VVTK/VVTK_ViewManager.h [new file with mode: 0644]
src/VVTK/VVTK_ViewModel.cxx [new file with mode: 0644]
src/VVTK/VVTK_ViewModel.h [new file with mode: 0644]
src/VVTK/VVTK_ViewWindow.cxx [new file with mode: 0755]
src/VVTK/VVTK_ViewWindow.h [new file with mode: 0755]

diff --git a/src/GUITOOLS/Makefile.am b/src/GUITOOLS/Makefile.am
new file mode 100644 (file)
index 0000000..7a30dd9
--- /dev/null
@@ -0,0 +1,52 @@
+#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+#  VISU VISUGUI : GUI of VISU component
+#  File   : Makefile.in
+#  Author : Marc Tajchman (CEA)
+#  Module : VISU
+#  $Header$
+#
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+lib_LTLIBRARIES= libVISUGUITOOLS.la
+
+salomeinclude_HEADERS= \
+       VisuGUI_TableDlg.h \
+       VisuGUITools.h \
+       VisuGUI_GUITools.h
+
+dist_libVISUGUITOOLS_la_SOURCES= \
+       VisuGUI_TableDlg.cxx \
+       VisuGUI_GUITools.cxx
+
+MOC_FILES= VisuGUI_TableDlg_moc.cxx
+nodist_libVISUGUITOOLS_la_SOURCES=$(MOC_FILES)
+
+# additionnal information to compil and link file
+libVISUGUITOOLS_la_CPPFLAGS=  -ftemplate-depth-32 \
+       $(QT_INCLUDES) $(VTK_INCLUDES) @CAS_CPPFLAGS@ @CAS_CXXFLAGS@ \
+       $(PYTHON_INCLUDES) $(HDF5_INCLUDES) $(QWT_INCLUDES) \
+       $(KERNEL_CXXFLAGS) $(GUI_CXXFLAGS) $(BOOST_CPPFLAGS)
+
+libVISUGUITOOLS_la_LDFLAGS= \
+       $(KERNEL_LDFLAGS) -lSALOMELocalTrace \
+       $(GUI_LDFLAGS) -lCAM -lsuit -lqtx -lSalomeApp
diff --git a/src/GUITOOLS/VisuGUITools.h b/src/GUITOOLS/VisuGUITools.h
new file mode 100755 (executable)
index 0000000..87537d6
--- /dev/null
@@ -0,0 +1,47 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VisuGUITools.h
+//  Author : Oleg UVAROV
+//  Module : VISU
+//
+#ifndef _VisuGUITools_H_
+#define _VisuGUITools_H_
+
+#ifdef WNT
+ #if defined VISU_GUITOOLS_EXPORTS || defined VISUGUITOOLS_EXPORTS
+  #if defined WIN32
+   #define VISU_GUITOOLS_EXPORT __declspec( dllexport )
+  #else
+   #define VISU_GUITOOLS_EXPORT
+  #endif
+ #else
+  #if defined WIN32
+   #define VISU_GUITOOLS_EXPORT __declspec( dllimport )
+  #else
+   #define VISU_GUITOOLS_EXPORT
+  #endif
+ #endif
+#else
+ #define VISU_GUITOOLS_EXPORT
+#endif
+
+#endif
diff --git a/src/GUITOOLS/VisuGUI_GUITools.cxx b/src/GUITOOLS/VisuGUI_GUITools.cxx
new file mode 100644 (file)
index 0000000..c5162d7
--- /dev/null
@@ -0,0 +1,70 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VisuGUI_GUITools.cxx
+//  Author : Sergey ANIKIN, Open CASCADE S.A.S.
+//  Module : VISU
+//
+
+#include "VisuGUI_GUITools.h"
+
+#include <SalomeApp_IntSpinBox.h>
+#include <SalomeApp_DoubleSpinBox.h>
+
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
+
+#include <QVariant>
+
+namespace VISU{
+  void initSpinBox( SalomeApp_IntSpinBox* sb, 
+                    const int bottom, 
+                    const int top, 
+                    const int step )
+  {
+    sb->setAcceptNames( false );
+    sb->setRange( bottom, top );
+    sb->setSingleStep( step );
+  }
+  
+  void initSpinBox( SalomeApp_DoubleSpinBox* sb, 
+                    const double& bottom, 
+                    const double& top, 
+                    const double& step, 
+                    const char* quantity )
+  {
+    // Obtain precision from preferences
+    SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+    int precision = resMgr->integerValue( "VISU", quantity, 3 );
+  
+    sb->setPrecision   ( precision ); 
+    sb->setDecimals    ( qAbs(precision) );
+    sb->setRange       ( bottom, top );
+    sb->setSingleStep  ( step );
+    sb->setDefaultValue( bottom );
+    sb->setAcceptNames ( false );
+  
+    // Add a hint for the user saying how to tune precision
+    QString userPropName = QObject::tr( QString( "VISU_PREF_%1" ).arg( quantity ).toLatin1().constData() );
+    sb->setProperty( "validity_tune_hint", 
+                     QVariant( QObject::tr( "VISU_PRECISION_HINT" ).arg( userPropName ) ) );  
+  }
+}
diff --git a/src/GUITOOLS/VisuGUI_GUITools.h b/src/GUITOOLS/VisuGUI_GUITools.h
new file mode 100644 (file)
index 0000000..6f90bdc
--- /dev/null
@@ -0,0 +1,41 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VisuGUI_GUITools.h
+//  Author : Sergey ANIKIN, Open CASCADE S.A.S.
+//  Module : VISU
+//
+#ifndef VISUGUI_GUITOOLS_H
+#define VISUGUI_GUITOOLS_H
+
+#include "VisuGUITools.h"
+
+class SalomeApp_IntSpinBox;
+class SalomeApp_DoubleSpinBox;
+
+namespace VISU{
+  VISU_GUITOOLS_EXPORT
+  void initSpinBox( SalomeApp_IntSpinBox*, const int, const int, const int );
+  VISU_GUITOOLS_EXPORT
+  void initSpinBox( SalomeApp_DoubleSpinBox*, const double&, const double&, const double&, const char* );
+}
+
+#endif
diff --git a/src/GUITOOLS/VisuGUI_TableDlg.cxx b/src/GUITOOLS/VisuGUI_TableDlg.cxx
new file mode 100644 (file)
index 0000000..b782a88
--- /dev/null
@@ -0,0 +1,1073 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VisuGUI_TableDlg.cxx
+//  Author : Vadim SANDLER
+//  Module : SALOME
+//
+#include "VisuGUI_TableDlg.h"
+
+#include "SUIT_Tools.h"
+#include "SUIT_MessageBox.h"
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Session.h"
+
+#include "LightApp_Application.h"
+
+#include "CAM_Module.h"
+
+#include "SALOMEDSClient_Study.hxx"
+#include "SALOMEDSClient_GenericAttribute.hxx"
+#include "SALOMEDSClient_AttributeTableOfInteger.hxx"
+#include "SALOMEDSClient_AttributeTableOfReal.hxx"
+#include "SALOMEDSClient_StudyBuilder.hxx"
+
+#include <QLayout>
+#include <QValidator>
+#include <QTableWidget>
+#include <QTabWidget>
+#include <QList>
+#include <QVector>
+#include <QInputDialog>
+#include <QLabel>
+#include <QIntValidator>
+#include <QDoubleValidator>
+#include <QKeyEvent>
+#include <QHeaderView>
+
+#include "utilities.h"
+
+using namespace std;
+
+#define MARGIN_SIZE       11
+#define SPACING_SIZE      6
+#define SPACER_SIZE       5
+#define MIN_TABLE_WIDTH   200
+#define MIN_TABLE_HEIGHT  200
+
+NumDelegateItem::NumDelegateItem( QObject* parent, NumValidator mode )
+  : QItemDelegate( parent ),
+    myMode( mode )
+{
+}
+
+NumDelegateItem::~NumDelegateItem()
+{
+}
+
+QWidget * NumDelegateItem::createEditor( QWidget * parent,
+                                         const QStyleOptionViewItem & option,
+                                         const QModelIndex & index ) const
+{
+  QLineEdit *editor = new QLineEdit(parent);
+  switch ( myMode )
+  {
+  case NV_Int:
+    editor->setValidator( new QIntValidator( editor ) );
+    break;
+  case NV_Real:
+    editor->setValidator( new QDoubleValidator( editor ) );
+    break;
+  default:
+    editor->setText( "No validator!" );
+  }
+  
+  return editor;
+}
+
+void NumDelegateItem::setEditorData( QWidget * editor,
+                                     const QModelIndex & index ) const
+{
+  QLineEdit *aLE = qobject_cast<QLineEdit*>(editor);
+  if ( !aLE )
+    return;
+  
+  switch ( myMode )
+  {
+  case NV_Int:
+    {
+      int value = index.model()->data(index, Qt::DisplayRole).toInt();
+      aLE->setText( QString("%1").arg( value ) );
+      break;
+    }
+  case NV_Real:
+    {
+      double value = index.model()->data(index, Qt::DisplayRole).toDouble();
+      aLE->setText( QString("%1").arg( value ) );
+      break;
+    }
+  default:
+    aLE->setText( "No validator!!!" );
+  }  
+}
+
+
+
+
+
+/*class VisuGUI_Table : public QTableWidget {
+public:
+  VisuGUI_Table( Orientation orient, QWidget* parent = 0 ) 
+    : QTableWidget( parent ), myValidator( 0 ), myOrientation( orient ) {}
+  VisuGUI_Table( Orientation orient, int numRows, int numCols, QWidget* parent = 0 )
+    : QTableWidget( numRows, numCols, parent ), myValidator( 0 ), myOrientation( orient ) {}
+  
+  void setValidator( QValidator* v = 0 ) { myValidator = v;  }
+  bool isEditing() const { return QTable::isEditing(); }
+  
+protected:
+  QWidget* createEditor ( int row, int col, bool initFromCell ) const
+    {
+      bool testUnits = ( myOrientation == Qt::Horizontal && col == 0 ) || ( myOrientation == Qt::Vertical && row == 0 );
+      QWidget* wg = QTable::createEditor( row, col, initFromCell );
+      if ( wg && wg->inherits("QLineEdit") && myValidator && !testUnits ) 
+        (( QLineEdit*)wg)->setValidator( myValidator );
+      return wg;
+    }
+
+protected:
+  QValidator* myValidator;
+  Orientation myOrientation;
+  };*/
+
+/*!
+  Constructor
+*/
+VisuGUI_TableDlg::VisuGUI_TableDlg( QWidget* parent, 
+                                    _PTR(SObject) obj, 
+                                    bool edit,
+                                    int which,
+                                    Qt::Orientation orient,
+                                    bool showColumnTitles )
+     : QDialog( parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint ),
+       myIntTable( 0 ), myRealTable( 0 )
+{
+  setWindowTitle( edit ? tr( "EDIT_TABLE_TLT" ) : tr( "VIEW_TABLE_TLT" ) );
+  setSizeGripEnabled( true );
+
+  myObject = obj;
+  bool bHasIntTable = false;
+  bool bHasRealTable = false;
+  if ( myObject ) {
+    _PTR(GenericAttribute) anAttr;
+    bHasIntTable  = myObject->FindAttribute( anAttr, "AttributeTableOfInteger");
+    bHasRealTable = myObject->FindAttribute( anAttr, "AttributeTableOfReal");
+  }
+  
+  QVBoxLayout* mainLayout = new QVBoxLayout( this );
+  mainLayout->setMargin( MARGIN_SIZE );
+  mainLayout->setSpacing( SPACING_SIZE );
+
+  bool bDoInt  = which == ttInt  || which == ttBoth || which == ttAuto && bHasIntTable;
+  bool bDoReal = which == ttReal || which == ttBoth || which == ttAuto && bHasRealTable;
+
+  QWidget* top;
+  QVBoxLayout* tl;
+  if ( bDoInt && bDoReal ) {
+    top = new QTabWidget( this );
+    //( ( QTabWidget* ) top) ->setMargin( MARGIN_SIZE );
+  }
+  else {
+    top = new QWidget( this );
+    tl  = new QVBoxLayout( top ); tl->setMargin( 0 ); tl->setSpacing( SPACING_SIZE );
+  }
+
+  if ( bDoInt ) {
+    myIntTable = new VisuGUI_TableWidget( top, "myIntTable", edit, orient, showColumnTitles );
+    //myIntTable->getTable()->setValidator( new QIntValidator( this ) );
+    //QAbstractItemDelegate* item = myIntTable->getTable()->itemDelegate();
+    myIntTable->getTable()->setItemDelegate( new NumDelegateItem( myIntTable, NumDelegateItem::NV_Int ) );
+    //item->deleteLater();
+                                 
+    if ( bDoInt && bDoReal )
+      ( ( QTabWidget* )top )->addTab( myIntTable, tr( "TABLE_OF_INTEGER_TLT" ) );
+    else
+      tl->addWidget( myIntTable );
+  }
+  if ( bDoReal ) {
+    myRealTable = new VisuGUI_TableWidget( top, "myRealTable", edit, orient, showColumnTitles );
+    //myRealTable->getTable()->setValidator( new QDoubleValidator( this ) );
+    //QAbstractItemDelegate* item = myIntTable->getTable()->itemDelegate();
+    myRealTable->getTable()->setItemDelegate( new NumDelegateItem( myRealTable, NumDelegateItem::NV_Real ) );
+    //item->deleteLater();
+    if ( bDoInt && bDoReal )
+      ( ( QTabWidget* )top )->addTab( myRealTable, tr( "TABLE_OF_REAL_TLT" ) );
+    else
+      tl->addWidget( myRealTable );
+  }
+  if ( !bDoInt && !bDoReal ) {
+    QLabel *dumbLabel = new QLabel( tr( "ERR_TABLE_NOT_AVAILABLE" ), top );
+    dumbLabel->setAlignment( Qt::AlignCenter );
+    tl->addWidget( dumbLabel );
+  }
+
+  QHBoxLayout* btnLayout = new QHBoxLayout; 
+  btnLayout->setMargin( 0 ); btnLayout->setSpacing( SPACING_SIZE );
+  
+  myOKBtn = new QPushButton( tr( "BUT_OK" ), this );
+  myHelpBtn = new QPushButton( tr( "BUT_HELP" ), this );
+  if ( edit ) {
+    myCancelBtn = new QPushButton( tr( "BUT_CANCEL" ), this );
+    btnLayout->addWidget( myOKBtn );
+    btnLayout->addItem( new QSpacerItem( SPACER_SIZE, SPACER_SIZE, QSizePolicy::Expanding, QSizePolicy::Minimum ) );
+    btnLayout->addWidget( myCancelBtn );
+    btnLayout->addWidget( myHelpBtn );
+    connect( myOKBtn,     SIGNAL( clicked() ), this, SLOT( onOK() ) );
+    connect( myCancelBtn, SIGNAL( clicked() ), this, SLOT( reject() ) );
+  }
+  else {
+    btnLayout->addWidget( myOKBtn );
+    btnLayout->addItem( new QSpacerItem( SPACER_SIZE, SPACER_SIZE, QSizePolicy::Expanding, QSizePolicy::Minimum ) );
+    btnLayout->addWidget( myHelpBtn );
+    connect( myOKBtn,     SIGNAL( clicked() ), this, SLOT( accept() ) );
+  }
+  connect( myHelpBtn,     SIGNAL( clicked() ), this, SLOT( onHelp() ) );
+
+  mainLayout->addWidget( top );
+  mainLayout->addLayout( btnLayout );
+
+  initDlg();
+  resize( 500, 400 );
+  SUIT_Tools::centerWidget( this, parent );
+}
+
+/*!
+  Destructor
+*/
+VisuGUI_TableDlg::~VisuGUI_TableDlg()
+{
+}
+
+/*!
+  <OK> button slot, saves table(s)
+  Called only in create/edit mode ( <edit> parameter for constructor is true )
+*/
+void VisuGUI_TableDlg::onOK()
+{
+  myOKBtn->setFocus(); // accept possible changes
+  bool done = true;
+
+  if ( myObject ) {
+    _PTR(Study) study = myObject->GetStudy();
+    _PTR(AttributeTableOfInteger) tblIntAttr;
+    _PTR(AttributeTableOfReal)    tblRealAttr;
+
+    if ( study ) {
+      _PTR(StudyBuilder) builder = study->NewBuilder();
+      builder->NewCommand(); // start transaction !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      try {
+        if ( myIntTable ) {
+          builder->RemoveAttribute( myObject, "AttributeTableOfInteger" );
+          tblIntAttr = builder->FindOrCreateAttribute( myObject, "AttributeTableOfInteger" );
+
+          int i;
+          int nbRows  = myIntTable->getNumRows();
+          int nbCols  = myIntTable->getNumCols();
+          QString tlt = myIntTable->getTableTitle();
+          QStringList rowTitles, colTitles, units;
+          myIntTable->getRowTitles( rowTitles );
+          myIntTable->getColTitles( colTitles );
+          myIntTable->getUnits( units );
+          
+          if ( nbRows > 0) {
+            // data
+            int nRow = 0;
+            tblIntAttr->SetNbColumns( nbCols );
+            for ( i = 0; i < nbRows; i++ ) {
+              QStringList data;
+              myIntTable->getRowData( i, data );
+              bool bEmptyRow = true;
+              for ( int j = 0; j < data.count(); j++ ) {
+                if ( !data[ j ].isNull() ) {
+                  tblIntAttr->PutValue( data[ j ].toInt(), nRow+1, j+1 );
+                  bEmptyRow = false;
+                }
+              }
+              if ( !bEmptyRow ) {  // Skip rows with no data !!!
+                // set row title
+                tblIntAttr->SetRowTitle( nRow+1, rowTitles[ i ].isNull() ? "" : (const char*)rowTitles[ i ].toLatin1() ); 
+                // set row unit
+                tblIntAttr->SetRowUnit( nRow+1, units[ i ].isNull() ? "" : (const char*)units[ i ].toLatin1() ); 
+                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() ? "" : (const char*)colTitles[ i ].toLatin1() );
+            }
+          }
+          // title
+          tblIntAttr->SetTitle( (const char*)myIntTable->getTableTitle().toLatin1() );
+        }
+        if ( myRealTable ) {
+          builder->RemoveAttribute( myObject, "AttributeTableOfReal" );
+          tblRealAttr = builder->FindOrCreateAttribute( myObject, "AttributeTableOfReal" );
+
+          int i;
+          int nbRows  = myRealTable->getNumRows();
+          int nbCols  = myRealTable->getNumCols();
+          QString tlt = myRealTable->getTableTitle();
+          QStringList rowTitles, colTitles, units;
+          myRealTable->getRowTitles( rowTitles );
+          myRealTable->getColTitles( colTitles );
+          myRealTable->getUnits( units );
+          
+          if ( nbRows > 0) {
+            // data
+            int nRow = 0;
+            tblRealAttr->SetNbColumns( nbCols );
+            for ( i = 0; i < nbRows; i++ ) {
+              QStringList data;
+              myRealTable->getRowData( i, data );
+              bool bEmptyRow = true;
+              for ( int j = 0; j < data.count(); j++ ) {
+                if ( !data[ j ].isNull() ) {
+                  tblRealAttr->PutValue( data[ j ].toDouble(), nRow+1, j+1 );
+                  bEmptyRow = false;
+                }
+              }
+              if ( !bEmptyRow ) {  // Skip rows with no data !!!
+                // set row title
+                tblRealAttr->SetRowTitle( nRow+1, rowTitles[ i ].isNull() ? "" : (const char*)rowTitles[ i ].toLatin1() ); 
+                // set row unit
+                tblRealAttr->SetRowUnit( nRow+1, units[ i ].isNull() ? "" : (const char*)units[ i ].toLatin1() );
+                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() ? "" : (const char*)colTitles[ i ].toLatin1() );
+            }
+          }
+          // title
+          tblRealAttr->SetTitle( (const char*)myRealTable->getTableTitle().toLatin1() );
+        }
+        if ( myIntTable || myRealTable)
+          builder->CommitCommand(); // commit transaction !!!!!!!!!!!!!!!!!!!!!!!!!!!
+        else
+          builder->AbortCommand();  // abort transaction  !!!!!!!!!!!!!!!!!!!!!!!!!!!
+      }
+      catch( ... ) {
+        MESSAGE("VisuGUI_TableDlg::onOK : Exception has been caught !!!");
+        builder->AbortCommand();  // abort transaction  !!!!!!!!!!!!!!!!!!!!!!!!!!!
+        done = false;
+        SUIT_MessageBox::critical ( this, tr("ERR_ERROR"), tr("ERR_APP_EXCEPTION") );
+      }
+    }
+  }
+  if ( done ) 
+    accept();
+}
+
+/*!
+  <Help> button slot, shows corresponding help page
+*/
+void VisuGUI_TableDlg::onHelp()
+{
+  QString aHelpFileName = "table_presentations_page.html";
+  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+  if (app)
+    app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
+  else {
+                QString platform;
+#ifdef WIN32
+                platform = "winapplication";
+#else
+                platform = "application";
+#endif
+    SUIT_MessageBox::warning(0, QObject::tr("WRN_WARNING"),
+                             QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+                             arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName) );
+  }
+}
+
+/*!
+   Populates table with data
+*/
+void VisuGUI_TableDlg::initDlg()
+{
+  int i, j;
+  if ( myObject ) {
+    _PTR(GenericAttribute) anAttr;
+    _PTR(AttributeTableOfInteger) tblIntAttr;
+    _PTR(AttributeTableOfReal)    tblRealAttr;
+    if ( myObject->FindAttribute( anAttr, "AttributeTableOfInteger") ) {
+      tblIntAttr = anAttr;
+    }
+    if ( myObject->FindAttribute( anAttr, "AttributeTableOfReal") ) {
+      tblRealAttr = anAttr;
+    }
+    // Table of integer
+    if ( tblIntAttr && myIntTable ) {
+      try {
+        // title
+        myIntTable->setTableTitle( tblIntAttr->GetTitle().c_str() );
+        // nb of rows & cols
+        int nbRows = tblIntAttr->GetNbRows() ; 
+        int nbCols = tblIntAttr->GetNbColumns();
+        myIntTable->setNumRows( nbRows );
+        myIntTable->setNumCols( nbCols );
+        // rows titles
+        QStringList strlist;
+        vector<string> rowTitles = tblIntAttr->GetRowTitles();
+        for ( i = 0; i < nbRows; i++ ) {
+          if ( rowTitles.size() > 0 )
+            strlist.append( rowTitles[i].c_str() );
+          else
+            strlist.append( "" );
+        }
+        myIntTable->setRowTitles( strlist );
+        // columns titles
+        strlist.clear();
+        vector<string> colTitles = tblIntAttr->GetColumnTitles();
+        for ( i = 0; i < nbCols; i++ ) {
+          if ( colTitles.size() > 0 )
+            strlist.append( colTitles[i].c_str() );
+          else
+            strlist.append( "" );
+        }
+        myIntTable->setColTitles( strlist );
+        // units
+        strlist.clear();
+        vector<string> rowUnits = tblIntAttr->GetRowUnits();
+        if ( rowUnits.size() > 0 ) {
+          for ( i = 0; i < nbRows; i++ )
+            strlist.append( rowUnits[i].c_str() );
+          myIntTable->setUnits( strlist );
+        }
+        // data
+        for ( i = 1; i <= nbRows; i++ ) {
+          strlist.clear();
+          for ( j = 1; j <= nbCols; j++ ) {
+            if ( tblIntAttr->HasValue( i, j ) )
+              strlist.append( QString::number( tblIntAttr->GetValue( i, j ) ) );
+            else
+              strlist.append( QString::null );
+          }
+          myIntTable->setRowData( i-1, strlist );
+        }
+        myIntTable->adjustTable();
+      }
+      catch( ... ) {
+        MESSAGE("VisuGUI_TableDlg::initDlg : Exception has been caught !!!");
+      }
+    } 
+    // Table of real
+    if ( tblRealAttr && myRealTable ) {
+      try {
+        // title
+        myRealTable->setTableTitle( tblRealAttr->GetTitle().c_str() );
+        // nb of rows & cols
+        int nbRows = tblRealAttr->GetNbRows() ; 
+        int nbCols = tblRealAttr->GetNbColumns();
+        myRealTable->setNumRows( nbRows );
+        myRealTable->setNumCols( nbCols );
+        // rows titles
+        QStringList strlist;
+        vector<string> rowTitles = tblRealAttr->GetRowTitles();
+        for ( i = 0; i < nbRows; i++ ) {
+          if ( rowTitles.size() > 0 )
+            strlist.append( rowTitles[i].c_str() );
+          else
+            strlist.append( "" );
+        }
+        myRealTable->setRowTitles( strlist );
+        // columns titles
+        strlist.clear();
+        vector<string> colTitles = tblRealAttr->GetColumnTitles();
+        for ( i = 0; i < nbCols; i++ ) {
+          if ( colTitles.size() > 0 )
+            strlist.append( colTitles[i].c_str() );
+          else
+            strlist.append( "" );
+        }
+        myRealTable->setColTitles( strlist );
+        // units
+        strlist.clear();
+        vector<string> rowUnits = tblRealAttr->GetRowUnits();
+        if ( rowUnits.size() > 0 ) {
+          for ( i = 0; i < nbRows; i++ )
+            strlist.append( rowUnits[i].c_str() );
+          myRealTable->setUnits( strlist );
+        }
+        // data
+        for ( i = 1; i <= nbRows; i++ ) {
+          strlist.clear();
+          for ( j = 1; j <= nbCols; j++ ) {
+            if ( tblRealAttr->HasValue( i, j ) )
+              strlist.append( QString::number( tblRealAttr->GetValue( i, j ) ) );
+            else
+              strlist.append( QString::null );
+          }
+          myRealTable->setRowData( i-1, strlist );
+        }
+        myRealTable->adjustTable();
+      }
+      catch( ... ) {
+        MESSAGE("VisuGUI_TableDlg::initDlg : Exception has been caught !!!");
+      }
+    } 
+  }
+}
+
+/*!
+  Provides help on F1 button click
+*/
+void VisuGUI_TableDlg::keyPressEvent( QKeyEvent* e )
+{
+  QDialog::keyPressEvent( e );
+  if ( e->isAccepted() )
+    return;
+
+  if ( e->key() == Qt::Key_F1 )
+    {
+      e->accept();
+      onHelp();
+    }
+}
+
+/*!
+  Constructor
+*/
+VisuGUI_TableWidget::VisuGUI_TableWidget( QWidget* parent, 
+                                              const char* name, 
+                                              bool edit, 
+                                              Qt::Orientation orient,
+                                              bool showColumnTitles )
+     : QWidget( parent ), myOrientation( orient )
+{
+  QGridLayout* mainLayout = new QGridLayout( this );
+  mainLayout->setMargin( 0 );
+  mainLayout->setSpacing( SPACING_SIZE );
+
+  myTitleEdit = new QLineEdit( this );
+  myTitleEdit->setAlignment( Qt::AlignCenter );
+  myTitleEdit->setReadOnly( !edit );
+  QFont fnt = myTitleEdit->font();
+  fnt.setBold( true ); 
+  myTitleEdit->setFont( fnt );
+
+  //myTable = new VisuGUI_Table( orient, this );
+  myTable = new QTableWidget( 5, 5, this );
+  //myTable->setNumRows( 5 );
+  //myTable->setNumCols( 5 );
+  myTable->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
+  myTable->setMinimumSize( MIN_TABLE_WIDTH, MIN_TABLE_HEIGHT );
+  myTable->setSelectionMode( QAbstractItemView::SingleSelection );
+  myTable->setShowGrid( true );
+  myTable->horizontalHeader()->setMovable( false );
+  myTable->verticalHeader()->setMovable( false );
+  //myTable->setColumnMovingEnabled( false );
+  //myTable->setRowMovingEnabled( false );
+  myTable->setDragEnabled( false );
+  //myTable->setReadOnly( !edit );
+  myTable->setEditTriggers( edit ? QAbstractItemView::AllEditTriggers : QAbstractItemView::NoEditTriggers );
+
+  setUnitsTitle( tr( "UNITS_TLT" ) );
+
+  if ( !showColumnTitles ) {
+    if ( myOrientation == Qt::Horizontal ) {
+      myTable->horizontalHeader()->hide();
+      //myTable->setTopMargin( 0 );
+    }
+    else {
+      myTable->verticalHeader()->hide();
+      //myTable->setLeftMargin( 0 );
+    }
+  }
+
+  mainLayout->addWidget( myTitleEdit, 0, 0 );
+  mainLayout->addWidget( myTable, 1, 0 );
+
+  if ( edit ) {
+    myAddRowBtn    = new QPushButton( tr( "ADD_ROW_BTN" ), this );
+    myDelRowBtn    = new QPushButton( tr( "REMOVE_ROW_BTN" ), this );
+    myAddColBtn    = new QPushButton( tr( "ADD_COLUMN_BTN" ), this );
+    myDelColBtn    = new QPushButton( tr( "REMOVE_COLUMN_BTN" ), this );
+    myAdjustBtn    = new QPushButton( tr( "ADJUST_CELLS_BTN" ), this );
+    mySelectAllBtn = new QPushButton( tr( "SELECT_ALL_BTN" ), this );
+    myClearBtn     = new QPushButton( tr( "CLEAR_BTN"), this );
+    QVBoxLayout* btnLayout = new QVBoxLayout; btnLayout->setMargin( 0 ); btnLayout->setSpacing( SPACING_SIZE );
+    btnLayout->addWidget( myAddRowBtn );
+    btnLayout->addWidget( myDelRowBtn );
+    btnLayout->addWidget( myAddColBtn );
+    btnLayout->addWidget( myDelColBtn );
+    btnLayout->addStretch();
+    btnLayout->addWidget( myAdjustBtn );
+    btnLayout->addStretch();
+    btnLayout->addWidget( mySelectAllBtn );
+    btnLayout->addWidget( myClearBtn );
+    mainLayout->addLayout( btnLayout, 1, 1 );
+    connect( myTable, SIGNAL( selectionChanged() ),        this, SLOT( updateButtonsState() ) );
+    connect( myTable, SIGNAL( currentChanged( int, int) ), this, SLOT( updateButtonsState() ) );
+    connect( myAddRowBtn,    SIGNAL( clicked() ),   this, SLOT( addRow() ) );
+    connect( myAddColBtn,    SIGNAL( clicked() ),   this, SLOT( addCol() ) );
+    connect( myDelRowBtn,    SIGNAL( clicked() ),   this, SLOT( delRow() ) );
+    connect( myDelColBtn,    SIGNAL( clicked() ),   this, SLOT( delCol() ) );
+    connect( myAdjustBtn,    SIGNAL( clicked() ),   this, SLOT( adjustTable() ) );
+    connect( mySelectAllBtn, SIGNAL( clicked() ),   this, SLOT( selectAll() ) );
+    connect( myClearBtn,     SIGNAL( clicked() ),   this, SLOT( clearTable() ) );
+    myTable->horizontalHeader()->installEventFilter( this );
+    myTable->verticalHeader()->installEventFilter( this );
+    myTable->installEventFilter( this );
+  }
+  updateButtonsState();
+}
+/*!
+  Destructor
+*/
+VisuGUI_TableWidget::~VisuGUI_TableWidget()
+{
+}
+/*!
+  Sets table title
+*/
+void VisuGUI_TableWidget::setTableTitle( const QString& title )
+{
+  myTitleEdit->setText( title );
+}
+/*!
+  Gets table title
+*/
+QString VisuGUI_TableWidget::getTableTitle()
+{
+  return myTitleEdit->text();
+}
+/*!
+  Sets total number of rows
+*/
+void VisuGUI_TableWidget::setNumRows( const int num )
+{
+  myOrientation == Qt::Horizontal ? myTable->setRowCount( num ) : myTable->setColumnCount( num );
+}
+/*!
+  Gets total number of rows
+*/
+int VisuGUI_TableWidget::getNumRows()
+{
+  return myOrientation == Qt::Horizontal ? myTable->rowCount() : myTable->columnCount();
+}
+/*!
+  Sets total number of columns
+*/
+void VisuGUI_TableWidget::setNumCols( const int num )
+{
+  // !!! first column contains units !!!
+  myOrientation == Qt::Horizontal ? myTable->setColumnCount( num+1 ) : myTable->setRowCount( num+1 );
+//  myOrientation == Qt::Horizontal ? myTable->setColumnReadOnly( 0, true ) : myTable->setRowReadOnly( 0, true );
+}
+/*!
+  Gets total number of columns
+*/
+int VisuGUI_TableWidget::getNumCols()
+{
+  // !!! first column contains units !!!
+  return myOrientation == Qt::Horizontal ? myTable->columnCount()-1 : myTable->rowCount()-1;
+}
+/*!
+  Sets rows titles
+*/
+void VisuGUI_TableWidget::setRowTitles( QStringList& tlts )
+{
+  QStringList aLabels;
+  for ( int i = 0; i < tlts.count(); i++ )
+    tlts[i].isNull() ? aLabels.append("") : aLabels.append( tlts[i] );
+
+  myOrientation == Qt::Horizontal ?
+    myTable->setVerticalHeaderLabels( aLabels ) :
+    myTable->setHorizontalHeaderLabels( aLabels );
+    
+    //  myTable->verticalHeader()->setLabel( i, tlts[i] ) : 
+    //myTable->horizontalHeader()->setLabel( i, tlts[i] );
+  //}
+}
+/*!
+  Gets rows titles
+*/
+void VisuGUI_TableWidget::getRowTitles( QStringList& tlts )
+{
+  tlts.clear();
+  if ( myOrientation == Qt::Horizontal ) {
+    for ( int i = 0; i < myTable->rowCount(); i++ ) {
+      tlts.append( myTable->verticalHeaderItem(i) ? myTable->verticalHeaderItem(i)->text() : "" );
+    }
+  }
+  else {
+    for ( int i = 0; i < myTable->columnCount(); i++ ) {
+      tlts.append( myTable->horizontalHeaderItem(i) ? myTable->horizontalHeaderItem(i)->text() : "" );
+    }
+  }
+}
+/*!
+  Sets columns titles
+*/
+void VisuGUI_TableWidget::setColTitles( QStringList& tlts )
+{
+  QStringList aLabels;
+
+  // !!! first column contains units !!!
+  aLabels.append(""); // it'll be initialized below - in setUnitsTitle() method
+
+  for ( int i = 0; i < tlts.count(); i++ )
+    tlts[i].isNull() ? aLabels.append("") : aLabels.append( tlts[i] );
+
+  myOrientation == Qt::Horizontal ?
+    myTable->setHorizontalHeaderLabels( aLabels ) :
+    myTable->setVerticalHeaderLabels( aLabels );
+  
+  setUnitsTitle( tr( "UNITS_TLT" ) );
+}
+/*!
+  Sets columns titles
+*/
+void VisuGUI_TableWidget::getColTitles( QStringList& tlts )
+{
+  // !!! first column contains units !!!
+  tlts.clear();
+  if ( myOrientation == Qt::Horizontal ) {
+    for ( int i = 1; i < myTable->columnCount(); i++ ) {
+      tlts.append( myTable->horizontalHeaderItem(i) ? myTable->horizontalHeaderItem(i)->text() : "" );
+    }    
+  }
+  else {
+    for ( int i = 1; i < myTable->rowCount(); i++ ) {
+      tlts.append( myTable->verticalHeaderItem(i) ? myTable->verticalHeaderItem(i)->text() : "" );
+    }
+  }
+}
+/*!
+  Sets units title
+*/
+void VisuGUI_TableWidget::setUnitsTitle( const QString& tlt ) {
+  // !!! first column contains units !!!
+  myTable->model()->setHeaderData( 0, myOrientation, QVariant(tlt.isNull() ? "" : tlt), Qt::DisplayRole );
+}
+/*!
+  Sets units
+*/
+void VisuGUI_TableWidget::setUnits( QStringList& units )
+{
+  QAbstractTableModel* aModel = qobject_cast<QAbstractTableModel*>( myTable->model() );
+  if ( aModel )
+  {
+    QModelIndex anIndex;
+    for ( int i = 0; i < units.count(); i++ )
+    {
+      myOrientation == Qt::Horizontal ?
+        anIndex = aModel->index( i, 0 ) :
+        anIndex = aModel->index( 0, i );
+
+      aModel->setData( anIndex, QVariant( units[i].isNull() ? "" : units[i] ) );      
+    }
+  }
+}
+/*!
+  Gets units
+*/
+void VisuGUI_TableWidget::getUnits( QStringList& units )
+{
+  units.clear();
+  QAbstractTableModel* aModel = qobject_cast<QAbstractTableModel*>( myTable->model() );
+  if ( aModel )
+  {
+    if ( myOrientation == Qt::Horizontal )
+    {
+      for ( int i = 0; i < myTable->rowCount(); i++ )
+        units.append( aModel->index( i, 0 ).data().toString() );
+    }
+    else {
+      for ( int i = 0; i < myTable->columnCount(); i++ )
+        units.append( aModel->index( 0, i ).data().toString() );
+    }
+  }
+}
+/*!
+  Sets row data
+*/
+void VisuGUI_TableWidget::setRowData( int row, QStringList& data )
+{
+  QAbstractTableModel* aModel = qobject_cast<QAbstractTableModel*>( myTable->model() );
+  if ( aModel )
+  {
+    QModelIndex anIndex; 
+    if ( row >= 0 && row < getNumRows() ) {
+      for ( int i = 0; i < data.count(); i++ )
+      {
+        myOrientation == Qt::Horizontal ? anIndex = aModel->index( row, i+1 ) :
+                                          anIndex = aModel->index( i+1, row );
+        aModel->setData( anIndex, QVariant( data[i] ) );
+          
+      }
+    }
+  }
+}
+/*!
+  Gets row data
+*/
+void VisuGUI_TableWidget::getRowData( int row, QStringList& data )
+{
+  data.clear();
+  QAbstractTableModel* aModel = qobject_cast<QAbstractTableModel*>( myTable->model() );
+  if ( aModel )
+  {
+    if ( row >= 0 && row < getNumRows() )
+    {
+      if ( myOrientation == Qt::Horizontal )
+      {
+        for ( int i = 1; i < myTable->columnCount(); i++ )
+          data.append( aModel->index( row, i ).data().toString() );
+      }
+      else {
+        for ( int i = 1; i < myTable->rowCount(); i++ )
+          data.append( aModel->index( i, row ).data().toString() );
+      }
+    }
+  }
+}
+/*!
+  Adjusts table cell to see contents, <Adjust Cells> button slot
+*/
+void VisuGUI_TableWidget::adjustTable()
+{
+  myTable->resizeRowsToContents();
+  myTable->resizeColumnsToContents();
+}
+/*!
+  Called when selection changed in table
+*/
+void VisuGUI_TableWidget::updateButtonsState()
+{
+  if ( myTable->editTriggers() == QAbstractItemView::NoEditTriggers )
+    return;
+  bool bDR = false; // <Delete Row(s)>
+  bool bDC = false; // <Delete Column(s)>
+  bool bSA = false; // <Select All>
+  bool bCT = false; // <Clear>
+  int i;
+  //TO DO column/row selection check
+  /*int c = myOrientation == Qt::Horizontal ? 0 : 1;
+  for ( i = c; i < myTable->rowCount(); i++ ) {
+    
+    if ( myTable->isRowSelected( i, true ) )
+      bDR = true;
+    else 
+      bSA = true;
+  }
+  c = myOrientation == Qt::Horizontal ? 1 : 0;
+  for ( i = c; i < myTable->columnCount(); i++ ) {
+    if ( myTable->isColumnSelected( i, true ) )
+      bDC = true;
+    else 
+      bSA = true;
+      }*/
+  /*int nbSel = myTable->numSelections();
+  for ( i = 0; i < nbSel; i++ ) {
+    QTableSelection ts = myTable->selection( i );
+    for ( int j = ts.topRow(); j < ts.bottomRow()+1; j++) {
+      for ( int k = ts.leftCol(); k < ts.rightCol()+1; k++) {
+        if ( myTable->item( j, k ) )
+          bCT = true;
+      }
+    }
+    }*/
+  QList<QTableWidgetItem*> aSelection = myTable->selectedItems();
+  QList<QTableWidgetItem*>::ConstIterator anIt = aSelection.constBegin(),
+    anEndIt = aSelection.constEnd();
+  for ( ; anIt !=  anEndIt; anIt++ )
+  {
+    if( *anIt )
+    {
+      bCT = true;
+      break;
+    }
+  }
+  
+  if ( myTable->item( myTable->currentRow(), myTable->currentColumn() ) )
+    bCT = true;
+  myDelRowBtn->setEnabled( bDR );
+  myDelColBtn->setEnabled( bDC );
+  mySelectAllBtn->setEnabled( bSA );
+  myClearBtn->setEnabled( bCT );
+}
+/*!
+  <Add row> button slot
+*/
+void VisuGUI_TableWidget::addRow()
+{
+  myTable->insertRow( myTable->rowCount() );
+  updateButtonsState();
+}
+/*!
+  <Add column> button slot
+*/
+void VisuGUI_TableWidget::addCol()
+{
+  myTable->insertColumn( myTable->columnCount() );
+  updateButtonsState();
+}
+/*!
+  <Delete row(s)> button slot
+*/
+void VisuGUI_TableWidget::delRow()
+{
+  //TODO
+  /*int c = myOrientation == Qt::Horizontal ? 0 : 1;
+  QList<int> il;
+  int i;
+  for ( i = c; i < myTable->rowCount(); i++ )
+    if ( myTable->isRowSelected( i, true ) )
+      il.append( i );
+  if ( il.count() > 0 ) {
+    QMemArray<int> ildel( il.count() );
+    for ( i = 0; i < il.count(); i++ )
+      ildel[ i ] = il[ i ];
+    myTable->removeRows( ildel );
+    }*/
+  
+  updateButtonsState();
+}
+/*!
+  <Delete column(s)> button slot
+*/
+void VisuGUI_TableWidget::delCol()
+{
+  //TODO
+  /*int c = myOrientation == Qt::Horizontal ? 1 : 0;
+  QValueList<int> il;
+  int i;
+  for ( i = c; i < myTable->numCols(); i++ )
+    if ( myTable->isColumnSelected( i, true ) )
+      il.append( i );
+  if ( il.count() > 0 ) {
+    QMemArray<int> ildel( il.count() );
+    for ( i = 0; i < il.count(); i++ )
+      ildel[ i ] = il[ i ];
+    myTable->removeColumns( ildel );
+    }*/
+  updateButtonsState();
+}
+/*!
+  <Select All> button slot
+*/
+void VisuGUI_TableWidget::selectAll()
+{
+  /*myTable->clearSelection();
+  QTableSelection ts;
+  ts.init( 0, 0 ); ts.expandTo( myTable->numRows()-1, myTable->numCols()-1 );
+  myTable->addSelection( ts );*/
+  myTable->selectAll();
+  updateButtonsState();
+}
+/*!
+  <Clear> button slot
+*/
+void VisuGUI_TableWidget::clearTable()
+{
+  /*int nbSel = myTable->numSelections();
+  for ( int i = 0; i < nbSel; i++ ) {
+    QTableSelection ts = myTable->selection( i );
+    for ( int j = ts.topRow(); j < ts.bottomRow()+1; j++) {
+      if ( myOrientation == Qt::Vertical && j == 0 ) {
+//      continue;      // UNITS
+      }
+      for ( int k = ts.leftCol(); k < ts.rightCol()+1; k++) {
+        if ( myOrientation == Qt::Horizontal && k == 0 ) {
+//        continue;   // UNITS
+        }
+        myTable->clearCell( j, k );
+      }
+    }
+  }
+  if ( nbSel == 0 )
+    myTable->clearCell( myTable->currentRow(), myTable->currentColumn() );
+    myTable->clearSelection();*/
+  myTable->clearContents();
+  updateButtonsState();
+}
+/*!
+  Event filter - handles titles editing
+*/
+bool VisuGUI_TableWidget::eventFilter( QObject* o, QEvent* e )
+{
+  if ( e->type() == QEvent::MouseButtonDblClick) {
+    //TODO
+    /*QMouseEvent* me = ( QMouseEvent* )e;
+    if ( me->button() == Qt::LeftButton && (myTable->editTriggers() != QAbstractItemView::NoEditTriggers ) ) {
+      if ( o == myTable->horizontalHeader() ) {
+        for ( int i = 0; i < myTable->horizontalHeader()->count(); i++ ) {
+          QRect rect = myTable->horizontalHeader()->sectionRect( i );
+          rect.addCoords( 1, 1, -1, -1 );
+          if ( rect.contains( myTable->horizontalHeader()->mapFromGlobal( me->globalPos() ) ) ) {
+            if ( myOrientation == Qt::Vertical || i != 0 ) {
+              bool bOk;
+              QString tlt = QInputDialog::getText( tr( "SET_TITLE_TLT" ), 
+                                                   tr( "TITLE_LBL" ),
+                                                   QLineEdit::Normal,
+                                                   myTable->horizontalHeader()->label( i ),
+                                                   &bOk,
+                                                   this );
+              if ( bOk && !tlt.isNull() )
+                myTable->horizontalHeader()->setLabel( i, tlt );
+              break;
+            }
+          }
+        }
+      }
+      if ( o == myTable->verticalHeader() ) {
+        for ( int i = 0; i < myTable->verticalHeader()->count(); i++ ) {
+          QRect rect = myTable->verticalHeader()->sectionRect( i );
+          rect.addCoords( 1, 1, -1, -1 );
+          if ( rect.contains( myTable->verticalHeader()->mapFromGlobal( me->globalPos() ) ) ) {
+            if ( myOrientation == Qt::Horizontal || i != 0 ) {
+              bool bOk;
+              QString tlt = QInputDialog::getText( tr( "SET_TITLE_TLT" ), 
+                                                   tr( "TITLE_LBL" ),
+                                                   QLineEdit::Normal,
+                                                   myTable->verticalHeader()->label( i ),
+                                                   &bOk,
+                                                   this );
+              if ( bOk && !tlt.isNull() )
+                myTable->verticalHeader()->setLabel( i, tlt );
+              break;
+            }
+          }
+        }
+      }
+      }*/    
+  }     
+  else if ( e->type() == QEvent::KeyRelease && o == myTable ) {
+    QKeyEvent* ke = (QKeyEvent*)e;
+    if ( ke->key() == Qt::Key_Delete && (myTable->editTriggers() != QAbstractItemView::NoEditTriggers) ) {
+      clearTable();
+    }
+    else if ( ke->key() == Qt::Key_Backspace && (myTable->editTriggers() != QAbstractItemView::NoEditTriggers) ) {
+      clearTable();
+      int i = myTable->currentRow();
+      int j = myTable->currentColumn() - 1;
+      if ( j < 0 ) { j = myTable->columnCount()-1; i--; }
+      if ( i >= 0 && j >= 0 )
+        myTable->setCurrentCell( i, j );
+    }
+  }
+  return QWidget::eventFilter( o, e );
+}
diff --git a/src/GUITOOLS/VisuGUI_TableDlg.h b/src/GUITOOLS/VisuGUI_TableDlg.h
new file mode 100644 (file)
index 0000000..9f708ae
--- /dev/null
@@ -0,0 +1,150 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VisuGUI_TableDlg.h
+//  Author : Vadim SANDLER
+//  Module : VISU
+//
+#ifndef VisuGUI_TABLE_DLG_H
+#define VisuGUI_TABLE_DLG_H
+
+#include <QDialog>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QItemDelegate>
+
+class QTableWidget;
+class VisuGUI_TableWidget;
+
+#include <SALOMEDSClient_SObject.hxx>
+
+#include "VisuGUITools.h"
+
+class VISU_GUITOOLS_EXPORT VisuGUI_TableDlg : public QDialog
+{ 
+  Q_OBJECT
+
+public:
+
+  enum { ttNone, ttInt, ttReal, ttBoth, ttAuto };
+
+  VisuGUI_TableDlg( QWidget* parent, 
+                    _PTR(SObject) obj, 
+                    bool edit = false,
+                    int which = ttAuto, 
+                    Qt::Orientation orient = Qt::Horizontal,
+                    bool showColumnTitles = true );
+  ~VisuGUI_TableDlg();
+
+private:
+  void keyPressEvent( QKeyEvent* e );
+
+public slots:
+  void onOK();
+  void onHelp(); 
+
+private:
+  void initDlg();
+
+private:
+  VisuGUI_TableWidget*   myIntTable;
+  VisuGUI_TableWidget*   myRealTable;
+  QPushButton*           myOKBtn;
+  QPushButton*           myCancelBtn;
+  QPushButton*           myHelpBtn;
+
+  _PTR(SObject) myObject;
+};
+class VISU_GUITOOLS_EXPORT VisuGUI_TableWidget : public QWidget
+{
+  Q_OBJECT
+public:
+  VisuGUI_TableWidget( QWidget* parent = 0, 
+                       const char* name = 0, 
+                       bool edit = false, 
+                       Qt::Orientation orient = Qt::Horizontal,
+                       bool showColumnTitles = true );
+  ~VisuGUI_TableWidget();
+
+  void    setTableTitle( const QString& title );
+  QString getTableTitle();
+  void    setNumRows( const int num );
+  int     getNumRows();
+  void    setNumCols( const int num );
+  int     getNumCols();
+  void    setRowTitles( QStringList& tlts );
+  void    getRowTitles( QStringList& tlts );
+  void    setColTitles( QStringList& tlts );
+  void    getColTitles( QStringList& tlts );
+  void    setUnitsTitle( const QString& tlt );
+  void    setUnits( QStringList& units );
+  void    getUnits( QStringList& units );
+  void    setRowData( int row, QStringList& data );
+  void    getRowData( int row, QStringList& data );
+
+  QTableWidget*     getTable()     { return myTable; } 
+  QLineEdit*       getTitleEdit() { return myTitleEdit; }
+
+  bool    eventFilter( QObject* o, QEvent* e);
+
+public slots:
+  void updateButtonsState();
+  void addRow();
+  void addCol();
+  void delRow();
+  void delCol();
+  void adjustTable();
+  void selectAll();
+  void clearTable();
+
+private:
+  QLineEdit*       myTitleEdit;
+  QTableWidget*    myTable;
+  QPushButton*     myAddRowBtn;
+  QPushButton*     myAddColBtn;
+  QPushButton*     myDelRowBtn;
+  QPushButton*     myDelColBtn;
+  QPushButton*     myAdjustBtn;
+  QPushButton*     mySelectAllBtn;
+  QPushButton*     myClearBtn;
+  Qt::Orientation  myOrientation;
+};
+
+class VISU_GUITOOLS_EXPORT NumDelegateItem: public QItemDelegate
+{
+public:
+  enum NumValidator{ NV_Int, NV_Real };
+
+  NumDelegateItem( QObject* parent, NumValidator mode = NV_Int );
+  virtual ~NumDelegateItem();
+
+  virtual QWidget * createEditor( QWidget * parent,
+                                  const QStyleOptionViewItem & option,
+                                  const QModelIndex & index ) const;
+  virtual void setEditorData( QWidget * editor,
+                              const QModelIndex & index ) const;
+private:
+  int         myMode;
+};
+
+#endif // VisuGUI_TABLE_DLG_H
+
diff --git a/src/VVTK/Makefile.am b/src/VVTK/Makefile.am
new file mode 100755 (executable)
index 0000000..c739d48
--- /dev/null
@@ -0,0 +1,67 @@
+#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+#  File   : Makefile.in
+#  Author : Alexander Solovyov(OCN)
+#  Module : VVTK
+# $Header: 
+#
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+lib_LTLIBRARIES= libVVTK.la
+
+# header files
+salomeinclude_HEADERS= \
+       VVTK.h \
+       VVTK_PrimitiveBox.h \
+       VVTK_SizeBox.h
+
+dist_libVVTK_la_SOURCES= \
+       VVTK_PrimitiveBox.cxx \
+       VVTK_SizeBox.cxx
+
+MOC_FILES= \
+       VVTK_PrimitiveBox_moc.cxx \
+       VVTK_SizeBox_moc.cxx
+
+nodist_libVVTK_la_SOURCES=$(MOC_FILES)
+
+libVVTK_la_CPPFLAGS= \
+       $(QT_INCLUDES) \
+       @CAS_CXXFLAGS@ @CAS_CPPFLAGS@ \
+       $(VTK_INCLUDES) \
+       $(BOOST_CPPFLAGS) \
+       $(KERNEL_CXXFLAGS) \
+       $(GUI_CXXFLAGS) \
+       $(MED_CXXFLAGS) \
+       -I$(srcdir)/../OBJECT -I$(srcdir)/../PIPELINE -I$(srcdir)/../CONVERTOR \
+       -I$(srcdir)/../GUITOOLS
+
+libVVTK_la_LDFLAGS= \
+       ../OBJECT/libVisuObject.la \
+       ../PIPELINE/libVisuPipeLine.la \
+       ../CONVERTOR/libVisuConvertor.la \
+       ../GUITOOLS/libVISUGUITOOLS.la \
+       $(KERNEL_LDFLAGS) -lOpUtil \
+       $(GUI_LDFLAGS) -lsuit -lCAM -lSalomeObject -lSVTK \
+       $(QT_MT_LIBS) \
+       $(OCC_LIBS) \
+       $(VTK_LIBS)
diff --git a/src/VVTK/VVTK.h b/src/VVTK/VVTK.h
new file mode 100755 (executable)
index 0000000..9564091
--- /dev/null
@@ -0,0 +1,34 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifdef WNT
+#if defined VISU_VVTK_EXPORTS || defined VVTK_EXPORTS
+#define VVTK_EXPORT __declspec(dllexport)
+#else
+#define VVTK_EXPORT __declspec(dllimport)
+#endif
+#else
+#define VVTK_EXPORT
+#endif
+
+#if defined WNT
+#pragma warning ( disable: 4251 )
+#endif
diff --git a/src/VVTK/VVTK_ImageWriter.cxx b/src/VVTK/VVTK_ImageWriter.cxx
new file mode 100755 (executable)
index 0000000..326498f
--- /dev/null
@@ -0,0 +1,114 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   :
+//  Author :
+//  Module :
+//  $Header$
+//
+#include "VVTK_ImageWriter.h"
+
+#include <QSemaphore>
+
+#include "utilities.h"
+
+#include <vtkImageData.h>
+#include <vtkImageClip.h>
+#include <vtkJPEGWriter.h>
+#include <vtkSmartPointer.h>
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+
+//----------------------------------------------------------------------------
+VVTK_ImageWriter
+::VVTK_ImageWriter(QSemaphore* theSemaphore,
+                   vtkImageData* theImageData,
+                   const std::string& theName,
+                   int theProgressive,
+                   int theQuality):
+  mySemaphore(theSemaphore),
+  myImageData(theImageData),
+  myName(theName),
+  myProgressive(theProgressive),
+  myQuality(theQuality),
+  myConstraint16Flag(true)
+{}
+
+//----------------------------------------------------------------------------
+VVTK_ImageWriter
+::~VVTK_ImageWriter()
+{
+  if(MYDEBUG) MESSAGE("VVTK_ImageWriter::~VVTK_ImageWriter - this = "<<this);
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_ImageWriter
+::run()
+{
+  vtkJPEGWriter *aWriter = vtkJPEGWriter::New();
+  vtkImageData *anImageData = myImageData;
+  vtkSmartPointer<vtkImageClip> anImageClip;
+  //
+  if(myConstraint16Flag){ 
+    int uExtent[6];
+    myImageData->UpdateInformation();
+    myImageData->GetUpdateExtent(uExtent);
+    unsigned int width = uExtent[1] - uExtent[0] + 1;
+    unsigned int height = uExtent[3] - uExtent[2] + 1;
+    width = (width / 16) * 16;
+    height= (height / 16) * 16;
+    uExtent[1] = uExtent[0] + width - 1;
+    uExtent[3] = uExtent[2] + height - 1;
+    //
+    anImageClip = vtkImageClip::New();
+    anImageClip->Delete();
+
+    anImageClip->SetInput(myImageData);
+    anImageClip->SetOutputWholeExtent(uExtent);
+    anImageClip->ClipDataOn();
+    anImageData = anImageClip->GetOutput();
+  }
+  //
+  aWriter->WriteToMemoryOff();
+  aWriter->SetFileName(myName.c_str());
+  aWriter->SetQuality(myQuality);
+  aWriter->SetProgressive(myProgressive);
+  aWriter->SetInput(anImageData);
+  aWriter->Write();
+
+  aWriter->Delete();
+  myImageData->Delete();
+
+  if(MYDEBUG) MESSAGE("VVTK_ImageWriter::run "<<
+                "- this = "<<this<<
+                //"; total = "<<mySemaphore->total()<<
+                "; available = "<<mySemaphore->available() );
+  mySemaphore->release();
+}
+
diff --git a/src/VVTK/VVTK_ImageWriter.h b/src/VVTK/VVTK_ImageWriter.h
new file mode 100755 (executable)
index 0000000..e20baec
--- /dev/null
@@ -0,0 +1,62 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   :
+//  Author :
+//  Module :
+//  $Header$
+//
+#ifndef _VVTK_ImageWriter_Header_File_
+#define _VVTK_ImageWriter_Header_File_
+
+#include <QThread>
+#include <string>
+
+class vtkImageData;
+class QSemaphore;
+
+
+class VVTK_ImageWriter : public QThread 
+{
+public:
+  VVTK_ImageWriter(QSemaphore* theSemaphore,
+                   vtkImageData* theImageData,
+                   const std::string& theName,
+                   int theProgressive,
+                   int theQuality);
+
+  ~VVTK_ImageWriter();
+
+ protected:
+  virtual
+  void
+  run();
+  
+ protected:
+  QSemaphore* mySemaphore;
+  vtkImageData *myImageData;
+  std::string myName;
+  int   myProgressive;
+  int   myQuality;
+  bool  myConstraint16Flag;
+};
+#endif
diff --git a/src/VVTK/VVTK_ImageWriterMgr.cxx b/src/VVTK/VVTK_ImageWriterMgr.cxx
new file mode 100755 (executable)
index 0000000..bba9094
--- /dev/null
@@ -0,0 +1,105 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   :
+//  Author :
+//  Module :
+//  $Header$
+//
+#include "VVTK_ImageWriterMgr.h"
+#include "VVTK_ImageWriter.h"
+
+#include <vtkImageData.h>
+
+#include <QSemaphore>
+
+#include "utilities.h"
+
+#include <limits>
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+//----------------------------------------------------------------------------
+VVTK_ImageWriterMgr
+::VVTK_ImageWriterMgr()
+{
+  int aMax = std::numeric_limits<int>::max() / 2;
+  mySemaphore = new QSemaphore(aMax);
+  mySemaphore->acquire( aMax );
+  if(MYDEBUG) MESSAGE("VVTK_ImageWriterMgr::VVTK_ImageWriterMgr "<<
+                //"- total = "<<mySemaphore->total()<<
+                "; available = "<<mySemaphore->available() );
+}
+
+
+//----------------------------------------------------------------------------
+VVTK_ImageWriterMgr
+::~VVTK_ImageWriterMgr()
+{
+  Stop();
+  delete mySemaphore;
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_ImageWriterMgr
+::StartImageWriter(vtkImageData *theImageData,
+                   const std::string& theName,
+                   const int theProgressive,
+                   const int theQuality)
+{
+  VVTK_ImageWriter *anImageWriter = 
+    new VVTK_ImageWriter(mySemaphore,
+                         theImageData,
+                         theName,
+                         theProgressive,
+                         theQuality);
+  myThreads.push_back(anImageWriter);
+
+  anImageWriter->start();
+
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_ImageWriterMgr
+::Stop()
+{
+  if(MYDEBUG) MESSAGE("VVTK_ImageWriterMgr::Stop "<<
+                //"- total = "<<mySemaphore->total()<<
+                "; available = "<<mySemaphore->available() );
+  if(MYDEBUG) MESSAGE("VVTK_ImageWriterMgr::Stop - *mySemaphore += "<<myThreads.size() );
+  mySemaphore->acquire( myThreads.size() );
+
+  for(size_t anId = 0, anEnd = myThreads.size(); anId < anEnd; anId++){
+    VVTK_ImageWriter* anImageWriter = myThreads[anId];
+    anImageWriter->wait();
+    delete anImageWriter;
+  }
+  myThreads.clear();
+}
diff --git a/src/VVTK/VVTK_ImageWriterMgr.h b/src/VVTK/VVTK_ImageWriterMgr.h
new file mode 100755 (executable)
index 0000000..dcc196e
--- /dev/null
@@ -0,0 +1,64 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   :
+//  Author :
+//  Module :
+//  $Header$
+//
+#ifndef _VVTK_ImageWriterMgr_Header_File_
+#define _VVTK_ImageWriterMgr_Header_File_
+
+#include <string>
+#include <vector>
+
+class QString;
+class vtkImageData;
+class VVTK_ImageWriter;
+class QSemaphore;
+
+class VVTK_ImageWriterMgr
+{
+ public:
+  VVTK_ImageWriterMgr();
+  ~VVTK_ImageWriterMgr();
+  
+  void
+  StartImageWriter(vtkImageData *theImageData,
+                   const std::string& theName,
+                   const int theProgressive,
+                   const int theQuality);
+
+  void
+  Stop();
+
+  typedef std::vector<VVTK_ImageWriter*> TWriterThreads;
+
+ protected:
+  TWriterThreads myThreads;
+
+  QSemaphore* mySemaphore;
+};
+
+
+#endif
+
diff --git a/src/VVTK/VVTK_InteractorStyle.cxx b/src/VVTK/VVTK_InteractorStyle.cxx
new file mode 100644 (file)
index 0000000..c50c8cd
--- /dev/null
@@ -0,0 +1,292 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   : VVTK_InteractorStyle.cxx
+//  Author : Christophe ATTANASIO
+//  Module : SALOME
+//  $Header$
+//
+#include "VVTK_InteractorStyle.h"
+#include "VISU_GaussPtsSettings.h"
+#include "SVTK_Selector.h"
+#include "VISU_Event.h" 
+
+#include <vtkObjectFactory.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkCallbackCommand.h>
+#include <vtkCommand.h>
+#include <vtkRenderer.h>
+#include <vtkCamera.h>
+
+
+//----------------------------------------------------------------------------
+vtkStandardNewMacro(VVTK_InteractorStyle);
+//----------------------------------------------------------------------------
+
+VVTK_InteractorStyle
+::VVTK_InteractorStyle():
+  myIsMidButtonDown( false ),
+  myIsLeftButtonDown( false ),
+  mySMDecreaseMagnificationBtn(10),
+  mySMIncreaseMagnificationBtn(11)
+{
+}
+
+//----------------------------------------------------------------------------
+VVTK_InteractorStyle
+::~VVTK_InteractorStyle() 
+{
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_InteractorStyle
+::OnLeftButtonDown(int ctrl, int shift, 
+                   int x, int y) 
+{
+  myIsLeftButtonDown = true;
+
+  if (this->HasObserver(vtkCommand::LeftButtonPressEvent)) {
+    this->InvokeEvent(vtkCommand::LeftButtonPressEvent,NULL);
+    return;
+  }
+  this->FindPokedRenderer(x, y);
+  if (this->CurrentRenderer == NULL) {
+    return;
+  }
+  myShiftState = shift;
+  // finishing current viewer operation
+  if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) {
+    onFinishOperation();
+    startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE);
+  }
+  myOtherPoint = myPoint = QPoint(x, y);
+  if (ForcedState != VTK_INTERACTOR_STYLE_CAMERA_NONE) {
+    startOperation(ForcedState);
+  } 
+  else {
+    if (!(ctrl||shift)){
+      if (myIsMidButtonDown){
+        startOperation(VTK_INTERACTOR_STYLE_CAMERA_ZOOM);
+      }
+      else{
+        startOperation(VTK_INTERACTOR_STYLE_CAMERA_ROTATE);
+      }
+    }
+  }
+  return;
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_InteractorStyle
+::OnMiddleButtonDown(int ctrl,
+                     int shift, 
+                     int x, int y) 
+{
+  myIsMidButtonDown = true;
+
+  if (this->HasObserver(vtkCommand::MiddleButtonPressEvent))  {
+    this->InvokeEvent(vtkCommand::MiddleButtonPressEvent,NULL);
+    return;
+  }
+  this->FindPokedRenderer(x, y);
+  if (this->CurrentRenderer == NULL)    {
+    return;
+  }
+  myShiftState = shift;
+  // finishing current viewer operation
+  if (State != VTK_INTERACTOR_STYLE_CAMERA_NONE) {
+    onFinishOperation();
+    startOperation(VTK_INTERACTOR_STYLE_CAMERA_NONE);
+  }
+  myOtherPoint = myPoint = QPoint(x, y);
+  if (ForcedState != VTK_INTERACTOR_STYLE_CAMERA_NONE) {
+    startOperation(ForcedState);
+  }
+  else {
+    if (!(ctrl||shift)){
+      if ( myIsLeftButtonDown ){
+        startOperation(VTK_INTERACTOR_STYLE_CAMERA_ZOOM);
+      }
+      else{
+        startOperation(VTK_INTERACTOR_STYLE_CAMERA_PAN);
+      }
+    }
+  }
+}
+
+//----------------------------------------------------------------------------
+void 
+VVTK_InteractorStyle
+::OnLeftButtonUp(int ctrl, int shift, int x, int y)
+{
+  myIsLeftButtonDown = false;
+  SVTK_InteractorStyle::OnLeftButtonUp( ctrl, shift, x, y );
+
+  if ( myIsMidButtonDown )
+    OnMiddleButtonDown( ctrl, shift, x, y );
+}
+
+//----------------------------------------------------------------------------
+void  
+VVTK_InteractorStyle
+::OnMiddleButtonUp(int ctrl, int shift, int x, int y)
+{
+  myIsMidButtonDown = false;
+  SVTK_InteractorStyle::OnMiddleButtonUp( ctrl, shift, x, y );
+
+  if ( myIsLeftButtonDown )
+    OnLeftButtonDown( ctrl, shift, x, y );
+}
+//----------------------------------------------------------------------------
+void  VVTK_InteractorStyle::onFinishOperation()
+{
+  Superclass::onFinishOperation();
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_InteractorStyle
+::SetInteractor( vtkRenderWindowInteractor* theInteractor )
+{
+  // register EventCallbackCommand as observer of standard events (keypress, mousemove, etc)
+  Superclass::SetInteractor( theInteractor );
+  if(theInteractor){ 
+    theInteractor->AddObserver( VISU::SetSMDecreaseMagnificationEvent, EventCallbackCommand, Priority );
+    theInteractor->AddObserver( VISU::SetSMIncreaseMagnificationEvent, EventCallbackCommand, Priority );
+  }
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_InteractorStyle
+::ProcessEvents( vtkObject* object,
+                 unsigned long event,
+                 void* clientData, 
+                 void* callData )
+{
+  if ( clientData ) {
+    vtkObject* anObject = reinterpret_cast<vtkObject*>( clientData );
+    VVTK_InteractorStyle* self = dynamic_cast<VVTK_InteractorStyle*>( anObject );
+    if( self ){
+      switch ( event ) {
+      case VISU::SetSMDecreaseMagnificationEvent:
+        self->mySMDecreaseMagnificationBtn = *((int*)callData);
+        return;
+      case VISU::SetSMIncreaseMagnificationEvent:
+        self->mySMIncreaseMagnificationBtn = *((int*)callData);
+        return;
+      }
+    }
+  }
+
+  Superclass::ProcessEvents( object, event, clientData, callData );
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_InteractorStyle
+::onSpaceMouseButton( int button )
+{
+  if( mySMDecreaseMagnificationBtn == button )    
+    DecreaseGaussPointMagnification();
+  if( mySMIncreaseMagnificationBtn == button )    
+    IncreaseGaussPointMagnification();
+
+  Superclass::onSpaceMouseButton( button );
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_InteractorStyle
+::DecreaseGaussPointMagnification()
+{
+  Interactor->InvokeEvent(VISU::SetSMDecreaseMagnificationEvent,NULL);
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_InteractorStyle
+::IncreaseGaussPointMagnification()
+{
+  Interactor->InvokeEvent(VISU::SetSMIncreaseMagnificationEvent,NULL);
+}
+//============================================================================
+//
+//  Controllers
+//
+vtkStandardNewMacro(VVTK_ControllerIncrement);
+//----------------------------------------------------------------------------
+VVTK_ControllerIncrement::VVTK_ControllerIncrement()
+{
+  myIncrement=10;
+}
+//----------------------------------------------------------------------------
+VVTK_ControllerIncrement::~VVTK_ControllerIncrement()
+{
+}
+//----------------------------------------------------------------------------
+int VVTK_ControllerIncrement::Increase()
+{
+  myIncrement*=2;
+  return myIncrement;
+}
+//----------------------------------------------------------------------------
+int VVTK_ControllerIncrement::Decrease()
+{
+  myIncrement/=2;
+  if (!myIncrement){
+    myIncrement=1;
+  }
+  return myIncrement;
+}
+//
+vtkStandardNewMacro(VVTK_ControllerOnKeyDown);
+//----------------------------------------------------------------------------
+VVTK_ControllerOnKeyDown::VVTK_ControllerOnKeyDown()
+{
+}
+//----------------------------------------------------------------------------
+VVTK_ControllerOnKeyDown::~VVTK_ControllerOnKeyDown()
+{
+}
+//----------------------------------------------------------------------------
+bool VVTK_ControllerOnKeyDown::OnKeyDown(vtkInteractorStyle* theIS)
+{
+  SVTK_InteractorStyle *pIS=dynamic_cast<SVTK_InteractorStyle *>(theIS);
+  if (pIS){
+    if(pIS->GetSelector()->SelectionMode()==GaussPointSelection){
+      char key = pIS->GetInteractor()->GetKeyCode();
+      //
+      if (key == 'S') {
+        pIS->ActionPicking();
+        return false;
+      }
+    }
+  }
+  return Superclass::OnKeyDown(theIS);
+}
diff --git a/src/VVTK/VVTK_InteractorStyle.h b/src/VVTK/VVTK_InteractorStyle.h
new file mode 100644 (file)
index 0000000..86702be
--- /dev/null
@@ -0,0 +1,148 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   : VVTK_InteractorStyle.h
+//  Author : Christophe ATTANASIO
+//  Module : SALOME
+//  $Header$
+//
+#ifndef __VVTK_InteractorStyle_h
+#define __VVTK_InteractorStyle_h
+
+
+#include "VVTK.h"
+
+#include "SVTK_InteractorStyle.h"
+//
+//-------------------------------------------
+//! Control the value of increment in new style of interaction.
+/*!
+  This class controls of value of increment,
+  for pan/rotate/zoom operations in new style 
+  of interaction
+*/
+class VVTK_ControllerIncrement : public SVTK_ControllerIncrement {
+ public:
+  vtkTypeMacro(VVTK_ControllerIncrement,SVTK_ControllerIncrement);
+  static VVTK_ControllerIncrement* New();
+  
+  //! Increace the increment value by multiplying on 2
+  virtual int Increase();
+
+  //! Decreace the increment value by division on 2
+  virtual int Decrease();
+  
+ protected:
+  VVTK_ControllerIncrement();
+  virtual ~VVTK_ControllerIncrement();
+  //
+ private:
+  VVTK_ControllerIncrement(const VVTK_ControllerIncrement&);  //Not implemented
+  void operator=(const VVTK_ControllerIncrement&);  //Not implemented
+};
+//
+//-------------------------------------------
+//! Control the behaviour of KeyDown event in new style of interaction.
+/*!
+  This class controls of behaviour of of KeyDown event
+  in new style of interaction.
+*/
+class VVTK_ControllerOnKeyDown : public SVTK_ControllerOnKeyDown{
+ public:
+  vtkTypeMacro(VVTK_ControllerOnKeyDown, SVTK_ControllerOnKeyDown);
+  static VVTK_ControllerOnKeyDown* New();
+
+  //! Provides the action on event 
+  virtual bool OnKeyDown(vtkInteractorStyle* );
+
+ protected:
+  VVTK_ControllerOnKeyDown();
+  virtual ~VVTK_ControllerOnKeyDown();
+  
+ private:
+  VVTK_ControllerOnKeyDown(const VVTK_ControllerOnKeyDown&);//Not implemented
+  void operator=(const VVTK_ControllerOnKeyDown&);          //Not implemented
+};
+
+
+//! Introduce new style of interaction (keyboard free)
+class VVTK_EXPORT VVTK_InteractorStyle : public SVTK_InteractorStyle
+{
+ public:
+  static VVTK_InteractorStyle *New();
+  vtkTypeMacro(VVTK_InteractorStyle,SVTK_InteractorStyle);
+
+  //! Redefined from SVTK_InteractorStyle::SetInteractor in order to add an observer (callback) for custorm event (space mouse event)
+  virtual
+  void
+  SetInteractor( vtkRenderWindowInteractor* );
+  
+ protected:
+  VVTK_InteractorStyle();
+  ~VVTK_InteractorStyle();
+
+  VVTK_InteractorStyle(const VVTK_InteractorStyle&); // Not implemented
+  void operator=(const VVTK_InteractorStyle&); // Not implemented
+
+  // Generic event bindings must be overridden in subclasses
+
+  //! Redefine SVTK_InteractorStyle::OnLeftButtonDown
+  virtual void OnLeftButtonDown(int ctrl, int shift, int x, int y);
+
+  //! Redefine SVTK_InteractorStyle::OnMiddleButtonDown
+  virtual void OnMiddleButtonDown(int ctrl, int shift, int x, int y);
+
+  //! Redefine SVTK_InteractorStyle::OnLeftButtonUp
+  virtual void OnLeftButtonUp(int ctrl, int shift, int x, int y);
+
+  //! Redefine SVTK_InteractorStyle::OnMiddleButtonUp
+  virtual void OnMiddleButtonUp(int ctrl, int shift, int x, int y);
+
+  //! Redefine SVTK_InteractorStyle::onFinishOperation
+  virtual void onFinishOperation();
+
+  //! Main process VTK event method
+  static 
+  void
+  ProcessEvents(vtkObject* object, 
+                unsigned long event,
+                void* clientData, 
+                void* callData );
+
+  //! Redefine SVTK_InteractorStyle::onSpaceMouseButton
+  virtual void onSpaceMouseButton( int button );
+  
+  //! To decrease magnification of the Gauss Points
+  void DecreaseGaussPointMagnification();
+
+  //! To increase magnification of the Gauss Points
+  void IncreaseGaussPointMagnification();
+
+  //! SpaceMouse short cuts
+  int mySMDecreaseMagnificationBtn;
+  int mySMIncreaseMagnificationBtn;
+  
+  bool myIsMidButtonDown;
+  bool myIsLeftButtonDown;
+};
+
+#endif
diff --git a/src/VVTK/VVTK_MainWindow.cxx b/src/VVTK/VVTK_MainWindow.cxx
new file mode 100644 (file)
index 0000000..b032440
--- /dev/null
@@ -0,0 +1,474 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME OBJECT : implementation of interactive object visualization for OCC and VTK viewers
+//  File   : 
+//  Author : 
+//  Module : 
+//  $Header$
+//
+#include "VVTK_MainWindow.h"
+#include "VVTK_InteractorStyle.h"
+#include "VVTK_Recorder.h"
+#include "VVTK_RecorderDlg.h"
+#include "VISU_WidgetCtrl.hxx"
+#include "VISU_GaussPtsAct.h"
+#include "VISU_Event.h" 
+
+#include "SVTK_ViewWindow.h"
+#include "SVTK_RenderWindowInteractor.h"
+#include "VVTK_Renderer.h"
+#include "VVTK_PickingDlg.h"
+#include "VVTK_SegmentationCursorDlg.h"
+
+#include "SUIT_Application.h"
+#include "SUIT_Session.h"
+#include "SUIT_Tools.h"
+#include "SUIT_ViewWindow.h"
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Accel.h"
+#include "SUIT_MessageBox.h"
+#include "QtxAction.h"
+#include "QtxMultiAction.h"
+#include "QtxActionToolMgr.h"
+
+#include <QImage>
+#include <QToolBar>
+#include <QSplitter>
+#include <QFileDialog>
+#include <QApplication>
+
+//----------------------------------------------------------------------------
+VVTK_MainWindow::VVTK_MainWindow(QWidget* theParent, 
+                                 const char* theName,
+                                 SUIT_ResourceMgr* theResourceMgr,
+                                 SUIT_ViewWindow* theViewWindow):
+  SVTK_MainWindow(theParent,theName,theResourceMgr,theViewWindow),
+  myControllerIncrement(VVTK_ControllerIncrement::New()),
+  myControllerOnKeyDown(VVTK_ControllerOnKeyDown::New())
+{
+  myToolMgr = new QtxActionToolMgr( this );
+
+  myControllerIncrement->Delete();
+  myControllerOnKeyDown->Delete();
+
+  // Recording
+  myRecordingToolBar = new QToolBar(tr("LBL_TOOLBAR_RECORD_LABEL"), this);
+  addToolBar(Qt::LeftToolBarArea, myRecordingToolBar );
+  myViewWindow->toolMgr()->remove( NonIsometric, myToolBar );
+  
+
+  myStartAction = new QtxAction(tr("MNU_VVTK_RECORDING_START"), 
+                                theResourceMgr->loadPixmap( "VISU", tr( "ICON_VVTK_RECORDING_START" ) ),
+                                tr( "MNU_VVTK_RECORDING_START" ), 0, this);
+  myStartAction->setStatusTip(tr("DSC_VVTK_RECORDING_START"));
+  //myStartAction->addTo( myRecordingToolBar );
+  myRecordingToolBar->addAction( myStartAction  );
+  connect( myStartAction, SIGNAL( triggered ( bool ) ), this, SLOT( OnStartRecording() ) );
+
+  myPlayAction = new QtxAction(tr("MNU_VVTK_RECORDING_PLAY"), 
+                               theResourceMgr->loadPixmap( "VISU", tr( "ICON_VVTK_RECORDING_PLAY" ) ),
+                               tr( "MNU_VVTK_RECORDING_PLAY" ), 0, this);
+  myPlayAction->setStatusTip(tr("DSC_VVTK_RECORDING_PLAY"));
+  myPlayAction->setEnabled( false );
+  //myPlayAction->addTo( myRecordingToolBar );
+  myRecordingToolBar->addAction( myPlayAction  );
+  connect( myPlayAction, SIGNAL( triggered ( bool ) ), this, SLOT( OnPlayRecording() ) );
+
+  myPauseAction = new QtxAction(tr("MNU_VVTK_RECORDING_PAUSE"), 
+                                theResourceMgr->loadPixmap( "VISU", tr( "ICON_VVTK_RECORDING_PAUSE" ) ),
+                                tr( "MNU_VVTK_RECORDING_PAUSE" ), 0, this);
+  myPauseAction->setStatusTip(tr("DSC_VVTK_RECORDING_PAUSE"));
+  myPauseAction->setEnabled( false );
+  //myPauseAction->addTo( myRecordingToolBar );
+  myRecordingToolBar->addAction( myPauseAction  );
+  connect( myPauseAction, SIGNAL( triggered ( bool ) ), this, SLOT( OnPauseRecording() ) );
+
+  myStopAction = new QtxAction(tr("MNU_VVTK_RECORDING_STOP"), 
+                               theResourceMgr->loadPixmap( "VISU", tr( "ICON_VVTK_RECORDING_STOP" ) ),
+                               tr( "MNU_VVTK_RECORDING_STOP" ), 0, this);
+  myStopAction->setStatusTip(tr("DSC_VVTK_RECORDING_STOP"));
+  myStopAction->setEnabled( false );
+  //myStopAction->addTo( myRecordingToolBar );
+  myRecordingToolBar->addAction( myStopAction  );
+  connect( myStopAction, SIGNAL( triggered ( bool ) ), this, SLOT( OnStopRecording() ) );
+  
+  myRecorder = VVTK_Recorder::New();
+  //myRecorder->CheckExistAVIMaker();
+  //if(myRecorder->ErrorStatus())
+  //  myRecordingToolBar->setEnabled(false);
+}
+
+//----------------------------------------------------------------------------
+
+QtxActionToolMgr* VVTK_MainWindow::toolMgr() const
+{
+  return myToolMgr;
+}
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow::Initialize(SVTK_RenderWindowInteractor* theInteractor)
+{ 
+  vtkInteractorStyle* aStyle = theInteractor->GetInteractorStyle();
+  if(SVTK_InteractorStyle *anInteractorStyle = dynamic_cast<SVTK_InteractorStyle*>(aStyle)){
+    anInteractorStyle->SetControllerIncrement(myControllerIncrement.GetPointer());
+    anInteractorStyle->SetControllerOnKeyDown(myControllerOnKeyDown.GetPointer());
+  }
+
+  myRecorder->SetNbFPS(17.3);
+  myRecorder->SetQuality(100);
+  myRecorder->SetProgressiveMode(true);
+  myRecorder->SetUseSkippedFrames(true);
+  myRecorder->SetRenderWindow(theInteractor->getRenderWindow());
+
+  disconnect( SVTK_MainWindow::action( DumpId ), SIGNAL( activated() ),
+              myViewWindow, SLOT( onDumpView() ) );
+
+  connect( SVTK_MainWindow::action( DumpId ), SIGNAL( activated() ),
+           this, SLOT( onDumpView() ) );
+
+  SVTK_MainWindow::Initialize(theInteractor);
+  addToolBar( Qt::LeftToolBarArea, getToolBar() );
+}
+
+VVTK_MainWindow::~VVTK_MainWindow()
+{
+  if(myRecorder)
+    myRecorder->Delete();
+}
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow::onDumpView()
+{
+  QImage img = dumpView();
+  if( img.isNull() )
+    return; 
+
+  SUIT_Application* app = SUIT_Session::session()->activeApplication();
+  QString fileName = app->getFileName( false, QString::null,
+                                       tr( "TLT_IMAGE_FILES" ),
+                                       tr( "TLT_DUMP_VIEW" ), 0 );
+  if( fileName.isEmpty() )
+    return;
+
+  QString fmt = SUIT_Tools::extension( fileName ).toUpper();
+  if( fmt.isEmpty() )
+    fmt = QString( "BMP" ); // default format
+  else if( fmt == "JPG" )
+    fmt = "JPEG";
+
+  QApplication::setOverrideCursor( Qt::WaitCursor );
+  img.save( fileName, fmt.toLatin1() );
+  QApplication::restoreOverrideCursor();
+}
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow::OnStartRecording()
+{
+  myRecorder->CheckExistAVIMaker();
+  if (myRecorder->ErrorStatus()) {
+    SUIT_MessageBox::warning(this, tr("ERROR"), tr("MSG_NO_AVI_MAKER") );
+  }
+  else {
+    VVTK_RecorderDlg* aRecorderDlg = new VVTK_RecorderDlg( this, myRecorder );
+
+    if( !aRecorderDlg->exec() )
+      return;
+
+    myStartAction->setEnabled( false );
+    myPlayAction->setEnabled( false );
+    myPauseAction->setEnabled( true );
+    myStopAction->setEnabled( true );
+
+    myRecorder->Record();
+  }
+}
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow::OnPlayRecording()
+{
+  myStartAction->setEnabled( false );
+  myPlayAction->setEnabled( false );
+  myPauseAction->setEnabled( true );
+  myStopAction->setEnabled( true );
+  //
+  myRecorder->Pause();
+}
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow::OnPauseRecording()
+{
+  myStartAction->setEnabled( false );
+  myPlayAction->setEnabled( true );
+  myPauseAction->setEnabled( false );
+  myStopAction->setEnabled( true );
+  //
+  myRecorder->Pause();
+}
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow::OnStopRecording()
+{
+  myStartAction->setEnabled( true );
+  myPlayAction->setEnabled( false );
+  myPauseAction->setEnabled( false );
+  myStopAction->setEnabled( false );
+  //
+  myRecorder->Stop();
+}
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow::action( const int accelAction  )
+{
+  if ( accelAction == SUIT_Accel::ZoomFit )
+    onFitAll();
+  else {
+    int anEvent = SVTK::convertAction( accelAction );
+    InvokeEvent( anEvent, 0 );
+  }
+}
+
+//----------------------------------------------------------------------------
+VVTK_MainWindow1::VVTK_MainWindow1(QSplitter* theParent, 
+                                   const char* theName,
+                                   SUIT_ResourceMgr* theResourceMgr,
+                                   SUIT_ViewWindow* theViewWindow):
+  VVTK_MainWindow(theParent,theName,theResourceMgr,theViewWindow),
+  mySplitter(theParent),
+  myPickingDlg(NULL)
+{
+  myPtsToolBar = new QToolBar( tr("LBL_TOOLBAR_GAUSS_LABEL"), this );
+  addToolBar( Qt::LeftToolBarArea, myPtsToolBar );
+
+  QPixmap aPixmap;
+  QtxAction* anAction;
+
+  aPixmap = theResourceMgr->loadPixmap("VISU",tr("ICON_VVTK_SELECTION_MODE_SWITCH"));
+  myPickingAction = new QtxAction(tr("MNU_VVTK_SELECTION_MODE_SWITCH"), 
+                                  aPixmap,
+                                  tr( "MNU_VVTK_SELECTION_MODE_SWITCH" ), 
+                                  0, 
+                                  this, 
+                                  //"VVTK/SVTK SelectionSwitch", 
+                                  true);
+  myPickingAction->setCheckable(true);
+  myPickingAction->setStatusTip(tr("DSC_VVTK_SELECTION_MODE_SWITCH"));
+  myPtsToolBar->addAction( myPickingAction );
+  connect(myPickingAction, SIGNAL(toggled(bool)), this, SLOT(OnSelectionModeSwitch(bool)));
+
+  myPickingDlg = new VVTK_PickingDlg( myPickingAction, this, "PickingDlg" );
+
+  // Plane/Sphere Segmentation
+  aPixmap = theResourceMgr->loadPixmap("VISU",tr("ICON_VVTK_PLANE_SEGMENTATION_SWITCH"));
+  myPlaneSegmentationAction = new QtxAction(tr("MNU_VVTK_PLANE_SEGMENTATION_SWITCH"), 
+                                            aPixmap,
+                                            tr( "MNU_VVTK_PLANE_SEGMENTATION_SWITCH" ), 
+                                            0, 
+                                            this, 
+                                            //"VVTK/SVTK PlaneSegmentationSwitch", 
+                                            true);
+  myPlaneSegmentationAction->setCheckable(true);
+  myPlaneSegmentationAction->setStatusTip(tr("DSC_VVTK_PLANE_SEGMENTATION_SWITCH"));
+  //myPlaneSegmentationAction->addTo( myPtsToolBar );
+  connect( myPlaneSegmentationAction, SIGNAL( triggered() ), this, SLOT( OnSegmentationSwitch() ) );
+
+  aPixmap = theResourceMgr->loadPixmap("VISU",tr("ICON_VVTK_SPHERE_SEGMENTATION_SWITCH"));
+  mySphereSegmentationAction = new QtxAction(tr("MNU_VVTK_SPHERE_SEGMENTATION_SWITCH"), 
+                                             aPixmap,
+                                             tr( "MNU_VVTK_SPHERE_SEGMENTATION_SWITCH" ), 
+                                             0, 
+                                             this, 
+                                             //"VVTK/SVTK SphereSegmentationSwitch", 
+                                             true);
+  mySphereSegmentationAction->setCheckable(true);
+  mySphereSegmentationAction->setStatusTip(tr("DSC_VVTK_SPHERE_SEGMENTATION_SWITCH"));
+  //mySphereSegmentationAction->addTo( myPtsToolBar );
+  connect( mySphereSegmentationAction, SIGNAL( activated() ), this, SLOT( OnSegmentationSwitch() ) );
+
+  mySegmentationCursorDlg = new VVTK_SegmentationCursorDlg( this, "SegmentationCursorDlg" );
+  mySegmentationCursorDlg->SetPlaneAction( myPlaneSegmentationAction );
+  mySegmentationCursorDlg->SetSphereAction( mySphereSegmentationAction );
+  connect( mySegmentationCursorDlg, SIGNAL( scgClose() ), this, SLOT( OnSegmentationSwitch() ) );
+
+  //SUIT_ToolButton* aSegmentationButton = new SUIT_ToolButton( myPtsToolBar );
+  QtxMultiAction* aSegmentationAction = new QtxMultiAction( this );
+  aSegmentationAction->insertAction( myPlaneSegmentationAction );
+  aSegmentationAction->insertAction( mySphereSegmentationAction );
+  myPtsToolBar->addAction( aSegmentationAction );
+}
+
+void VVTK_MainWindow1::Initialize(SVTK_RenderWindowInteractor* theInteractor,
+                                  VVTK_Renderer1* theRenderer)
+{
+  myRenderer = theRenderer;
+  VVTK_MainWindow::Initialize(theInteractor);
+
+  mySegmentationCursorDlg->SetWidgetCtrl( theRenderer->GetWidgetCtrl() );
+  mySegmentationCursorDlg->SetInteractor( theInteractor );
+
+  connect( theInteractor, SIGNAL( selectionChanged() ), SLOT( OnSelectionChanged() ) );
+  myPickingDlg->SetInteractor( theInteractor );
+}
+
+VVTK_MainWindow1::~VVTK_MainWindow1()
+{}
+
+//----------------------------------------------------------------------------
+VVTK_MainWindow2* VVTK_MainWindow1::CreateMainWindow2(QWidget* theParent, 
+                                                      const char* theName,
+                                                      SUIT_ResourceMgr* theResourceMgr,
+                                                      SUIT_ViewWindow* theViewWindow)
+{
+  myMainWindow2 = new VVTK_MainWindow2(theParent,
+                                       theName,
+                                       theResourceMgr,
+                                       theViewWindow);
+  return myMainWindow2;
+}
+
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow1::OnSelectionModeSwitch(bool theIsSelectionOn)
+{
+  if ( theIsSelectionOn && !isVisible() )
+    return;
+  
+  Selection_Mode aSelectionMode = SelectionMode();
+  if(theIsSelectionOn && aSelectionMode != GaussPointSelection)
+    SetSelectionMode(GaussPointSelection);
+  else if(!theIsSelectionOn && aSelectionMode == GaussPointSelection)
+    SetSelectionMode(ActorSelection);
+
+  if( theIsSelectionOn )
+  {
+    myPickingDlg->Update();
+    myPickingDlg->show();
+  }
+  else
+    myPickingDlg->hide();
+}
+
+void VVTK_MainWindow1::OnSelectionChanged()
+{
+  Selection_Mode aSelectionMode = SelectionMode();
+  if(myPickingAction->isChecked() && aSelectionMode != GaussPointSelection)
+    myPickingAction->setChecked(false);
+  else if(!myPickingAction->isChecked() && aSelectionMode == GaussPointSelection)
+    myPickingAction->setChecked(true);
+}
+
+
+//----------------------------------------------------------------------------
+VISU_WidgetCtrl* VVTK_MainWindow1::GetWidgetCtrl()
+{
+  return myRenderer->GetWidgetCtrl();
+}
+
+VISU_InsideCursorSettings* VVTK_MainWindow1::GetInsideCursorSettings()
+{
+  return mySegmentationCursorDlg->GetInsideCursorSettings();
+}
+
+VISU_OutsideCursorSettings* VVTK_MainWindow1::GetOutsideCursorSettings()
+{
+  return mySegmentationCursorDlg->GetOutsideCursorSettings();
+}
+
+VISU_PickingSettings* VVTK_MainWindow1::GetPickingSettings()
+{
+  return myPickingDlg->GetPickingSettings();
+}
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow1::SetPlanesSegementation(bool theIsOn)
+{
+  myPlaneSegmentationAction->setChecked( theIsOn );
+  OnSegmentationSwitch(myPlaneSegmentationAction);
+}
+
+void VVTK_MainWindow1::SetSphereSegementation(bool theIsOn)
+{
+  mySphereSegmentationAction->setChecked( theIsOn );
+  OnSegmentationSwitch(mySphereSegmentationAction);
+}
+
+void VVTK_MainWindow1::OnSegmentationSwitch(QtxAction* theAction)
+{
+  bool anIsSegmentationOn = myPlaneSegmentationAction->isChecked() ||
+    mySphereSegmentationAction->isChecked();
+
+  if( !theAction )
+    return;
+  
+  VISU_WidgetCtrl *aWidgetCtrl = myRenderer->GetWidgetCtrl();
+  
+  if (anIsSegmentationOn) {
+    int anIndex = (theAction == myPlaneSegmentationAction) ? 0 : 1;
+    aWidgetCtrl->SetActiveIndex(anIndex);
+  }
+  aWidgetCtrl->SetEnabled(anIsSegmentationOn);
+
+  if( theAction == myPlaneSegmentationAction && anIsSegmentationOn )
+    mySphereSegmentationAction->setChecked( false );
+  else if( theAction == mySphereSegmentationAction && anIsSegmentationOn )
+    myPlaneSegmentationAction->setChecked( false );
+
+  if( anIsSegmentationOn )
+  {
+    myMainWindow2->show();
+    mySegmentationCursorDlg->SetIsPlaneSegmentation( theAction == myPlaneSegmentationAction );
+    mySegmentationCursorDlg->UpdateSegmentation();
+    mySegmentationCursorDlg->UpdateInsideGaussPoints();
+    mySegmentationCursorDlg->UpdateOutsideGaussPoints();
+    mySegmentationCursorDlg->show();
+  }
+  else
+  {
+    myMainWindow2->hide();
+    mySegmentationCursorDlg->hide();
+  }
+}
+
+void VVTK_MainWindow1::OnSegmentationSwitch()
+{
+  QtxAction* anAction = ( QtxAction* )sender();
+  OnSegmentationSwitch(anAction);
+}
+
+
+//----------------------------------------------------------------------------
+VVTK_MainWindow2::VVTK_MainWindow2(QWidget* theParent, 
+                                   const char* theName,
+                                   SUIT_ResourceMgr* theResourceMgr,
+                                   SUIT_ViewWindow* theViewWindow):
+  VVTK_MainWindow(theParent,theName,theResourceMgr,theViewWindow)
+{}
+
+VVTK_MainWindow2::~VVTK_MainWindow2()
+{}
+
+
+//----------------------------------------------------------------------------
+void VVTK_MainWindow2::Initialize(SVTK_RenderWindowInteractor* theInteractor)
+{
+  VVTK_MainWindow::Initialize(theInteractor);
+}
+
diff --git a/src/VVTK/VVTK_MainWindow.h b/src/VVTK/VVTK_MainWindow.h
new file mode 100644 (file)
index 0000000..8149172
--- /dev/null
@@ -0,0 +1,201 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifndef VVTK_MAINWINDOW_H
+#define VVTK_MAINWINDOW_H
+
+#ifdef WIN32
+#pragma warning( disable:4251 )
+#endif
+
+#include "VVTK.h"
+#include "SVTK_MainWindow.h"
+
+class QSplitter;
+
+class VISU_WidgetCtrl;
+class VVTK_SegmentationCursorDlg;
+class VISU_InsideCursorSettings;
+class VISU_OutsideCursorSettings;
+class VISU_PickingSettings;
+class VVTK_InteractorStyle;
+class VVTK_ControllerIncrement;
+class VVTK_ControllerOnKeyDown;
+class VVTK_PickingDlg;
+class VVTK_MainWindow2;
+class VVTK_Renderer1;
+class VVTK_Renderer2;
+class VVTK_Recorder;
+
+//----------------------------------------------------------------------------
+//! Customize SVTK_MainWindow to provide VVTK functionality
+class VVTK_EXPORT VVTK_MainWindow: public SVTK_MainWindow
+{
+  Q_OBJECT;
+
+public:
+  //! Construct instance of the class
+  VVTK_MainWindow(QWidget* theParent, 
+                  const char* theName,
+                  SUIT_ResourceMgr* theResourceMgr,
+                  SUIT_ViewWindow* theViewWindow);
+
+  //! Reimplement SVTK_MainWindow::Initialize
+  virtual void Initialize(SVTK_RenderWindowInteractor* theInteractor);
+
+  //! Destroy instance of the class
+  virtual ~VVTK_MainWindow();
+
+ public slots:
+
+  virtual void onDumpView();
+
+  virtual void action( const int );
+
+  virtual void OnStartRecording();
+
+  virtual void OnPlayRecording();
+
+  virtual void OnPauseRecording();
+
+  virtual void OnStopRecording();
+
+ protected:
+  virtual QtxActionToolMgr* toolMgr() const;
+
+  vtkSmartPointer<VVTK_ControllerIncrement> myControllerIncrement;
+  vtkSmartPointer<VVTK_ControllerOnKeyDown> myControllerOnKeyDown; 
+
+  QToolBar* myRecordingToolBar;
+  QtxAction* myStartAction;
+  QtxAction* myPlayAction;
+  QtxAction* myPauseAction;
+  QtxAction* myStopAction;
+
+  VVTK_Recorder *myRecorder;
+  QtxActionToolMgr* myToolMgr;
+};
+
+
+//----------------------------------------------------------------------------
+//! Extend VVTK_MainWindow to implement functionality for base view
+class VVTK_EXPORT VVTK_MainWindow1: public VVTK_MainWindow
+{
+  Q_OBJECT;
+
+public:
+  //! Construct instance of the class
+  VVTK_MainWindow1(QSplitter* theParent, 
+                   const char* theName,
+                   SUIT_ResourceMgr* theResourceMgr,
+                   SUIT_ViewWindow* theViewWindow);
+
+  //! Reimplement VVTK_MainWindow::Initialize
+  virtual void Initialize(SVTK_RenderWindowInteractor* theInteractor,
+                          VVTK_Renderer1* theRenderer);
+
+  //! Destroy instance of the class
+  virtual ~VVTK_MainWindow1();
+
+  //! Create instance of the segmented VVTK_MainWindow
+  /*!
+    The two views (VVTK_MainWindow1 and VVTK_MainWindow2) should change its behaviour in the same time.
+    So, it is necessary to synhronize them through sharing some common pointers.
+  */
+  VVTK_MainWindow2* CreateMainWindow2(QWidget* theParent, 
+                                      const char* theName,
+                                      SUIT_ResourceMgr* theResourceMgr,
+                                      SUIT_ViewWindow* theViewWindow);
+
+  VISU_WidgetCtrl*  GetWidgetCtrl();
+
+  void SetPlanesSegementation(bool theIsOn);
+
+  void SetSphereSegementation(bool theIsOn);
+
+  VISU_InsideCursorSettings* GetInsideCursorSettings();
+
+  //! Get contained VISU_OutsideCursorSettings
+  VISU_OutsideCursorSettings* GetOutsideCursorSettings();
+
+  //! Get contained VISU_PickingSettings
+  VISU_PickingSettings* GetPickingSettings();
+
+ public slots:
+  //! To activate/ deactivate the segementation cursor at run-time
+  void OnSegmentationSwitch();//bool theIsSegmentationOn); 
+
+  void OnSegmentationSwitch(QtxAction* theAction);//bool theIsSegmentationOn); 
+
+   //! To change active selection mode at run-time
+  virtual void OnSelectionModeSwitch(bool theIsSelectionOn); 
+
+   //! To adjust to the current selection mode
+  virtual void OnSelectionChanged(); 
+
+ protected:
+  VVTK_Renderer1* myRenderer; //!< Keeps extended version of SVTK_Renderer
+
+  VVTK_MainWindow2* myMainWindow2; //!< Refer to segmented view
+
+  QToolBar* myPtsToolBar; //!< Additional tool bar
+
+  //! To implement show/hide segmented view on acttivate/ deactivate segementation cursor
+  QSplitter* mySplitter; 
+
+  QtxAction* myPickingAction; //!< Action for switch selection mode
+  QtxAction* myPlaneSegmentationAction; //!< Action for switch segmentation mode to plane
+  QtxAction* mySphereSegmentationAction; //!< Action for switch segmentation mode to sphere
+
+  //! Keep reference to VVTK_SegmentationCursorDlg
+  VVTK_SegmentationCursorDlg* mySegmentationCursorDlg; 
+  VVTK_PickingDlg* myPickingDlg; //!< Keep reference to VVTK_PickingDlg
+};
+
+
+//----------------------------------------------------------------------------
+//! Extend VVTK_MainWindow to implement functionality for segmented view
+class VVTK_EXPORT VVTK_MainWindow2: public VVTK_MainWindow
+{
+  Q_OBJECT;
+
+  friend class VVTK_MainWindow1;
+
+  //! Construct instance of the class
+  VVTK_MainWindow2(QWidget* theParent, 
+                   const char* theName,
+                   SUIT_ResourceMgr* theResourceMgr,
+                   SUIT_ViewWindow* theViewWindow);
+public:
+  //! Destroy instance of the class
+  virtual ~VVTK_MainWindow2();
+
+  //! Reimplement SVTK_MainWindow::Initialize
+  virtual void Initialize(SVTK_RenderWindowInteractor* theInteractor);
+
+};
+
+
+#ifdef WIN32
+#pragma warning( default:4251 )
+#endif
+
+#endif
diff --git a/src/VVTK/VVTK_PickingDlg.cxx b/src/VVTK/VVTK_PickingDlg.cxx
new file mode 100644 (file)
index 0000000..68a5141
--- /dev/null
@@ -0,0 +1,724 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VVTK_PickingDlg.cxx
+//  Author : Oleg Uvarov
+//  Module : VISU
+//
+#include "VVTK_PickingDlg.h"
+#include <VisuGUI_GUITools.h>
+
+#include "VISU_GaussPtsAct.h"
+#include "VISU_PickingSettings.h"
+#include "VISU_GaussPointsPL.hxx"
+
+#include "SUIT_MessageBox.h"
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Session.h"
+
+#include "CAM_Module.h"
+
+#include "SVTK_Selector.h"
+#include "SVTK_MainWindow.h"
+#include "SVTK_RenderWindowInteractor.h"
+
+#include "VTKViewer_Algorithm.h"
+#include "SVTK_Functor.h"
+
+#include <vtkActorCollection.h>
+#include <vtkCallbackCommand.h>
+#include <vtkObjectFactory.h>
+#include <vtkRenderer.h>
+#include <vtkGenericRenderWindowInteractor.h>
+#include <vtkSmartPointer.h>
+
+#include "utilities.h"
+
+#include <QCheckBox>
+#include <QColorDialog>
+#include <QComboBox>
+#include <QGroupBox>
+#include <QLabel>
+#include <QLayout>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include <QKeyEvent>
+#include <QIntValidator>
+
+#include "QtxAction.h"
+#include <SalomeApp_DoubleSpinBox.h>
+#include <SalomeApp_IntSpinBox.h>
+#include "QtxColorButton.h"
+
+#include "LightApp_Application.h"
+
+namespace
+{
+  struct SelectorHelper
+  {
+  public:
+    SelectorHelper( SVTK_RenderWindowInteractor* theInteractor ):
+      myInteractor( theInteractor )
+    {}
+
+    bool
+    get()
+    {
+      bool aResult = false;
+      myMapIndex.Clear();
+      mySelector = NULL;
+      myPipeLine = NULL;
+      myActor = NULL;
+
+      if ( !myInteractor )
+        return aResult;
+      
+      mySelector = myInteractor->GetSelector();
+      if ( !mySelector )
+        return aResult;
+      
+      const SALOME_ListIO& aListIO = mySelector->StoredIObjects();
+      if ( aListIO.Extent() != 1 ) 
+        return aResult;
+      
+      myIO = aListIO.First();
+      if ( mySelector->HasIndex( myIO ) )
+        mySelector->GetIndex(myIO, myMapIndex);
+        
+      VTK::ActorCollectionCopy aCopy(myInteractor->getRenderer()->GetActors());
+      myActor = SVTK::Find<VISU_GaussPtsAct>(aCopy.GetActors(),
+                                             SVTK::TIsSameIObject<VISU_GaussPtsAct>( myIO ));
+      if ( !myActor )
+        return aResult;
+      
+      myPipeLine = myActor->GetGaussPointsPL();
+
+      return true;
+    }
+
+    SVTK_RenderWindowInteractor* myInteractor;
+    TColStd_IndexedMapOfInteger myMapIndex;
+    Handle(SALOME_InteractiveObject) myIO;
+    SVTK_Selector* mySelector;
+
+    VISU_GaussPointsPL* myPipeLine;
+    VISU_GaussPtsAct* myActor;
+  };
+
+
+  
+  class GaussPtsIDValidator: public QIntValidator
+  {
+  public:
+    GaussPtsIDValidator( SVTK_RenderWindowInteractor* theInteractor,
+                         QObject * theParent ):
+      QIntValidator( 0, VTK_LARGE_ID, theParent ),
+      myHelper(theInteractor)
+    {}
+
+    virtual 
+    State
+    validate ( QString & theInput, int & thePos ) const
+    {
+      if ( QIntValidator::validate( theInput, thePos ) == QValidator::Invalid)
+        return QValidator::Invalid;
+      
+      if ( !myHelper.get() )
+        return QValidator::Invalid;
+
+      return QValidator::Acceptable;
+    }
+
+  protected:
+    mutable SelectorHelper myHelper;
+  };
+
+
+  class GaussCellIDValidator: public GaussPtsIDValidator
+  {
+  public:
+    GaussCellIDValidator( QLineEdit* theLocalPointLabel,
+                          SVTK_RenderWindowInteractor* theInteractor,
+                          QObject * theParent ):
+      GaussPtsIDValidator( theInteractor, theParent ),
+      myLocalPointLineEdit( theLocalPointLabel )
+    {}
+
+    virtual 
+    State
+    validate ( QString & theInput, int & thePos ) const
+    {
+      if ( GaussPtsIDValidator::validate( theInput, thePos ) == QValidator::Invalid)
+        return QValidator::Invalid;
+
+      VISU::TCellID aCellID = theInput.toInt();
+      VISU::TLocalPntID aLocalPntID = myLocalPointLineEdit->text().toInt();
+      VISU::PGaussPtsIDMapper anIDMapper = myHelper.myPipeLine->GetGaussPtsIDMapper();
+      if ( anIDMapper->GetVTKID( VISU::TGaussPointID( aCellID, aLocalPntID ) ) < 0 )
+        return QValidator::Intermediate;
+
+      return QValidator::Acceptable;
+    }
+
+  private:
+    QLineEdit* myLocalPointLineEdit;
+  };
+
+
+  class GaussLocalPointIDValidator: public GaussPtsIDValidator
+  {
+  public:
+    GaussLocalPointIDValidator( QLineEdit* theParentElementLineEdit,
+                                SVTK_RenderWindowInteractor* theInteractor,
+                                QObject * theParent ):
+      GaussPtsIDValidator( theInteractor, theParent ),
+      myParentElementLineEdit( theParentElementLineEdit )
+    {}
+
+    virtual 
+    State
+    validate ( QString & theInput, int & thePos ) const
+    {
+      if ( GaussPtsIDValidator::validate( theInput, thePos ) == QValidator::Invalid)
+        return QValidator::Invalid;
+
+      VISU::TLocalPntID aLocalPntID = theInput.toInt();
+      VISU::TCellID aCellID = myParentElementLineEdit->text().toInt();
+      VISU::PGaussPtsIDMapper anIDMapper = myHelper.myPipeLine->GetGaussPtsIDMapper();
+      if ( anIDMapper->GetVTKID( VISU::TGaussPointID( aCellID, aLocalPntID ) ) < 0 )
+        return QValidator::Intermediate;
+
+      return QValidator::Acceptable;
+    }
+
+  private:
+    QLineEdit* myParentElementLineEdit;
+  };
+}
+
+
+VVTK_ValidatedLineEdit::VVTK_ValidatedLineEdit( QWidget* parent ):
+  QLineEdit( parent )
+{
+  connect( this, SIGNAL( textChanged( const QString& ) ), this, SLOT( MarkValidated( const QString& ) ) );
+}
+
+void VVTK_ValidatedLineEdit::MarkValidated( const QString& theText )
+{
+  if ( !validator() )
+    return;
+  
+  int aPos;
+  QString aText( theText );
+  QPalette pal = palette();
+  switch ( validator()->validate( aText, aPos ) ) {
+  case QValidator::Invalid:
+  case QValidator::Intermediate:
+    pal.setColor( foregroundRole(), QColor( 255, 0, 0 ));
+    setPalette( pal );
+    break;
+  case QValidator::Acceptable:
+    pal.setColor( foregroundRole(), QColor( 0, 0, 0 ));
+    setPalette( pal );
+    break;
+  }
+}
+
+//---------------------------------------------------------------------------------
+
+VVTK_PickingDlg::VVTK_PickingDlg(QtxAction* theAction,
+                                 SVTK_MainWindow* theParent,
+                                 const char* theName):
+  SVTK_DialogBase(theAction,
+                  theParent, 
+                  theName),
+  myEventCallbackCommand( vtkCallbackCommand::New() ),
+  myPickingSettings( VISU_PickingSettings::New() )
+{
+  myPriority = 0.0;
+  myEventCallbackCommand->Delete();
+  myEventCallbackCommand->SetClientData(this); 
+  myEventCallbackCommand->SetCallback(VVTK_PickingDlg::ProcessEvents);
+
+  setWindowTitle( tr( "PICKING_DLG_TITLE" ) );
+  setSizeGripEnabled(TRUE);
+
+  QVBoxLayout* TopLayout = new QVBoxLayout( this );
+  TopLayout->setSpacing(6);
+  TopLayout->setMargin(11);
+
+  QWidget* aBox = new QWidget( this );
+  QVBoxLayout* BoxLayout = new QVBoxLayout( aBox );
+  BoxLayout->setMargin(0);
+  BoxLayout->setSpacing(6);
+
+  // Cursor
+  QGroupBox* CursorGroup = new QGroupBox( tr( "CURSOR_TITLE" ), aBox );
+  //CursorGroup->setColumnLayout(0, Qt::Vertical );
+  //CursorGroup->layout()->setSpacing( 0 );
+  //CursorGroup->layout()->setMargin( 0 );
+
+  QGridLayout* CursorGroupLayout = new QGridLayout (CursorGroup);
+  CursorGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  CursorGroupLayout->setSpacing(6);
+  CursorGroupLayout->setMargin(11);
+
+  QLabel* CursorSizeLabel = new QLabel( tr( "CURSOR_SIZE" ), CursorGroup );
+  myCursorSizeSpinBox = new SalomeApp_DoubleSpinBox( CursorGroup );
+  VISU::initSpinBox( myCursorSizeSpinBox, 0, 1, 0.1, "parametric_precision" );
+  myCursorSizeSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  QLabel* PyramidHeightLabel = new QLabel( tr( "PYRAMID_HEIGHT" ), CursorGroup );
+  double aHeightMin=1.e-7;
+  double aHeightMax=10.;
+  double aHeightStep=0.1;
+  myPyramidHeightSpinBox = new SalomeApp_DoubleSpinBox( CursorGroup );
+  VISU::initSpinBox( myPyramidHeightSpinBox, aHeightMin, aHeightMax, aHeightStep, "length_precision" );
+  myPyramidHeightSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  
+  QLabel* SelectionColorLabel = new QLabel( tr( "SELECTION_COLOR" ), CursorGroup );
+  mySelectionColorButton = new QtxColorButton( CursorGroup );
+  mySelectionColorButton->setColor( Qt::blue );
+  //QPalette aPalette( mySelectionColorButton->palette() );
+  //aPalette.setColor( mySelectionColorButton->backgroundRole(), Qt::blue );
+  //mySelectionColorButton->setPalette( aPalette );
+  //connect( mySelectionColorButton, SIGNAL( clicked() ), this, SLOT( onColorButtonPressed() ) );
+
+  CursorGroupLayout->addWidget( CursorSizeLabel, 0, 0 );
+  CursorGroupLayout->addWidget( myCursorSizeSpinBox, 0, 1 );
+  CursorGroupLayout->addWidget( PyramidHeightLabel, 1, 0 );
+  CursorGroupLayout->addWidget( myPyramidHeightSpinBox, 1, 1 );
+  CursorGroupLayout->addWidget( SelectionColorLabel, 2, 0 );
+  CursorGroupLayout->addWidget( mySelectionColorButton, 2, 1 );
+
+  BoxLayout->addWidget( CursorGroup );
+
+  // Tolerance
+  QGroupBox* ToleranceGroup = new QGroupBox( tr( "TOLERANCE_TITLE" ), aBox );
+  //ToleranceGroup->setColumnLayout(0, Qt::Vertical );
+  //ToleranceGroup->layout()->setSpacing( 0 );
+  //ToleranceGroup->layout()->setMargin( 0 );
+
+  QGridLayout* ToleranceGroupLayout = new QGridLayout (ToleranceGroup);
+  ToleranceGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  ToleranceGroupLayout->setSpacing(6);
+  ToleranceGroupLayout->setMargin(11);
+
+  QLabel* PointToleranceLabel = new QLabel( tr( "POINT_TOLERANCE" ), ToleranceGroup );
+  myPointToleranceSpinBox = new SalomeApp_DoubleSpinBox( ToleranceGroup );
+  VISU::initSpinBox( myPointToleranceSpinBox, 0.001, 10.0, 0.01, "len_tol_precision" ); 
+  myPointToleranceSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  ToleranceGroupLayout->addWidget( PointToleranceLabel, 0, 0 );
+  ToleranceGroupLayout->addWidget( myPointToleranceSpinBox, 0, 1 );
+
+  BoxLayout->addWidget( ToleranceGroup );
+
+  // Information window
+  QGroupBox* InfoWindowGroup = new QGroupBox( tr( "INFO_WINDOW_TITLE" ), aBox );
+  //InfoWindowGroup->setColumnLayout(0, Qt::Vertical );
+  //InfoWindowGroup->layout()->setSpacing( 0 );
+  //InfoWindowGroup->layout()->setMargin( 0 );
+
+  QGridLayout* InfoWindowGroupLayout = new QGridLayout (InfoWindowGroup);
+  InfoWindowGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  InfoWindowGroupLayout->setSpacing(6);
+  InfoWindowGroupLayout->setMargin(11);
+
+  QLabel* TransparencyLabel = new QLabel( tr( "TRANSPARENCY" ), InfoWindowGroup );
+  myTransparencySpinBox = new SalomeApp_IntSpinBox( InfoWindowGroup );
+  VISU::initSpinBox( myTransparencySpinBox, 0, 100, 10 );  
+  myTransparencySpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  InfoWindowGroupLayout->addWidget( TransparencyLabel, 0, 0 );
+  InfoWindowGroupLayout->addWidget( myTransparencySpinBox, 0, 1 );
+
+  QLabel* PositionLabel = new QLabel( tr( "POSITION" ), InfoWindowGroup );
+  myPositionComboBox = new QComboBox( InfoWindowGroup );
+  myPositionComboBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  myPositionComboBox->addItem( tr( "BELOW_POINT" ) );
+  myPositionComboBox->addItem( tr( "TOP_LEFT_CORNER" ) );
+
+  InfoWindowGroupLayout->addWidget( TransparencyLabel, 0, 0 );
+  InfoWindowGroupLayout->addWidget( myTransparencySpinBox, 0, 1 );
+  InfoWindowGroupLayout->addWidget( PositionLabel, 1, 0 );
+  InfoWindowGroupLayout->addWidget( myPositionComboBox, 1, 1 );
+
+  BoxLayout->addWidget( InfoWindowGroup );
+
+  // Movement of the camera
+  QGroupBox* CameraGroup = new QGroupBox( tr( "CAMERA_TITLE" ), aBox );
+  //CameraGroup->setColumnLayout(0, Qt::Vertical );
+  //CameraGroup->layout()->setSpacing( 0 );
+  //CameraGroup->layout()->setMargin( 0 );
+
+  QGridLayout* CameraGroupLayout = new QGridLayout (CameraGroup);
+  CameraGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  CameraGroupLayout->setSpacing(6);
+  CameraGroupLayout->setMargin(11);
+
+  QLabel* ZoomFactorLabel = new QLabel( tr( "ZOOM_FACTOR" ), CameraGroup );
+  myZoomFactorSpinBox = new SalomeApp_DoubleSpinBox( CameraGroup );
+  VISU::initSpinBox( myZoomFactorSpinBox, 0.1, 10.0, 0.1, "parametric_precision" );    
+  myZoomFactorSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  QLabel* StepNumberLabel = new QLabel( tr( "STEP_NUMBER" ), CameraGroup );
+  myStepNumberSpinBox = new SalomeApp_IntSpinBox( CameraGroup );
+  VISU::initSpinBox( myStepNumberSpinBox, 1, 100, 1 );      
+  myStepNumberSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  CameraGroupLayout->addWidget( ZoomFactorLabel, 0, 0 );
+  CameraGroupLayout->addWidget( myZoomFactorSpinBox, 0, 1 );
+  CameraGroupLayout->addWidget( StepNumberLabel, 1, 0 );
+  CameraGroupLayout->addWidget( myStepNumberSpinBox, 1, 1 );
+
+  BoxLayout->addWidget( CameraGroup );
+
+  // Display parent mesh element
+  QGroupBox* PositionGroup = new QGroupBox( tr( "DATA_POSITION" ), aBox );
+  //PositionGroup->setColumnLayout(0, Qt::Vertical );
+  //PositionGroup->layout()->setSpacing( 0 );
+  //PositionGroup->layout()->setMargin( 0 );
+
+  QGridLayout* PositionGroupLayout = new QGridLayout (PositionGroup);
+  PositionGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+  PositionGroupLayout->setSpacing(6);
+  PositionGroupLayout->setMargin(11);
+
+  QLabel* ParentElementLabel = new QLabel( tr( "PARENT_ELEMENT" ), PositionGroup );
+
+  myParentElementLineEdit = new VVTK_ValidatedLineEdit( PositionGroup );
+
+  QLabel* LocalPointLabel = new QLabel( tr( "LOCAL_POINT" ), PositionGroup );
+
+  myLocalPointLineEdit = new VVTK_ValidatedLineEdit( PositionGroup );
+
+  myDisplayParentMeshCheckBox = new QCheckBox( tr( "DISPLAY_PARENT_MESH" ), PositionGroup );
+
+  PositionGroupLayout->addWidget( ParentElementLabel,          0, 0, 1, 3 );
+  PositionGroupLayout->addWidget( myParentElementLineEdit,     0, 3 );
+  PositionGroupLayout->addWidget( LocalPointLabel,             1, 0, 1, 3 );
+  PositionGroupLayout->addWidget( myLocalPointLineEdit,        1, 3 );
+  PositionGroupLayout->addWidget( myDisplayParentMeshCheckBox, 2, 0, 1, 4 );
+
+  BoxLayout->addWidget( PositionGroup );
+
+  // Common buttons ===========================================================
+  QGroupBox* GroupButtons = new QGroupBox( this );
+  //GroupButtons->setColumnLayout(0, Qt::Vertical );
+  //GroupButtons->layout()->setSpacing( 0 );
+  //GroupButtons->layout()->setMargin( 0 );
+  QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons );
+  GroupButtonsLayout->setAlignment( Qt::AlignTop );
+  GroupButtonsLayout->setSpacing( 6 );
+  GroupButtonsLayout->setMargin( 11 );
+
+  QPushButton* buttonApply = new QPushButton( tr( "&Apply" ), GroupButtons );
+  buttonApply->setAutoDefault( TRUE );
+  buttonApply->setDefault( TRUE );
+  GroupButtonsLayout->addWidget( buttonApply, 0, 0 );
+  GroupButtonsLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 );
+
+  QPushButton* buttonClose = new QPushButton( tr( "&Close" ) , GroupButtons );
+  buttonClose->setAutoDefault( TRUE );
+  GroupButtonsLayout->addWidget( buttonClose, 0, 2 );
+
+  QPushButton* buttonHelp = new QPushButton( tr( "&Help" ) , GroupButtons );
+  buttonHelp->setAutoDefault( TRUE );
+  GroupButtonsLayout->addWidget( buttonHelp, 0, 3 );
+
+  TopLayout->addWidget( aBox );
+  TopLayout->addWidget( GroupButtons );
+
+  connect( buttonApply, SIGNAL( clicked() ), this, SLOT( onClickApply() ) );
+  connect( buttonClose, SIGNAL( clicked() ), this, SLOT( onClickClose() ) );
+  connect( buttonHelp,  SIGNAL( clicked() ), this, SLOT( onClickHelp() ) );
+
+  connect( myParentElementLineEdit, SIGNAL( textChanged( const QString& ) ), this, SLOT( onSelectionValidate() ) );
+  connect( myLocalPointLineEdit,    SIGNAL( textChanged( const QString& ) ), this, SLOT( onSelectionValidate() ) );
+
+}
+
+VVTK_PickingDlg::~VVTK_PickingDlg()
+{
+}
+
+void VVTK_PickingDlg::AddActor( VISU_GaussPtsAct* theActor )
+{
+  //theActor->SetPickingSettings( myPickingSettings.GetPointer() );
+}
+
+void VVTK_PickingDlg::RemoveActor( VISU_GaussPtsAct* theActor )
+{
+  //theActor->SetPickingSettings( NULL );
+}
+
+void VVTK_PickingDlg::Update()
+{
+  float aCursorSize = 0.5;
+  float aPyramidHeight = 10.0;
+  float aPointTolerance = 0.1;
+  QColor aColor = Qt::yellow;
+  int anInfoWindowTransparency = 50;
+  int anInfoWindowPosition = VISU_PickingSettings::BelowPoint;
+  float aZoomFactor = 1.5;
+  int aStepNumber = 10;
+  bool aDisplayParentMesh = false;
+
+  //if( !myPickingSettings->GetInitial() )
+  {
+    myCursorSizeSpinBox->setValue( myPickingSettings->GetCursorSize() );
+    myPyramidHeightSpinBox->setValue( myPickingSettings->GetPyramidHeight() );
+    myPointToleranceSpinBox->setValue( myPickingSettings->GetPointTolerance() );
+    myTransparencySpinBox->setValue( int(myPickingSettings->GetInfoWindowTransparency() * 100.0) );
+    myPositionComboBox->setCurrentIndex( myPickingSettings->GetInfoWindowPosition() );
+    myZoomFactorSpinBox->setValue( myPickingSettings->GetZoomFactor() );
+    myStepNumberSpinBox->setValue( myPickingSettings->GetStepNumber() );
+    myDisplayParentMeshCheckBox->setChecked( myPickingSettings->GetDisplayParentMesh() );
+
+    vtkFloatingPointType* aColor = myPickingSettings->GetColor();
+   
+    //QPalette aPalette( mySelectionColorButton->palette() );
+    /*aPalette.setColor( mySelectionColorButton->backgroundRole(),
+                       QColor( ( int )( aColor[0] * 255.0 ),
+                               ( int )( aColor[1] * 255.0 ),
+                               ( int )( aColor[2] * 255.0 ) ) );
+                               mySelectionColorButton->setPalette( aPalette );*/
+    mySelectionColorButton->setColor(
+                 QColor( ( int )( aColor[0] * 255.0 ),
+                 ( int )( aColor[1] * 255.0 ),
+                 ( int )( aColor[2] * 255.0 ) ) );
+    
+    return;
+  }
+
+  SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
+
+  aCursorSize = aResourceMgr->doubleValue( "VISU", "picking_cursor_size", aCursorSize );
+  myCursorSizeSpinBox->setValue( aCursorSize );
+
+  aPyramidHeight = aResourceMgr->doubleValue( "VISU", "picking_pyramid_height", aPyramidHeight );
+  myPyramidHeightSpinBox->setValue( aPyramidHeight );
+
+  aPointTolerance = aResourceMgr->doubleValue( "VISU", "picking_point_tolerance", aPointTolerance );
+  myPointToleranceSpinBox->setValue( aPointTolerance );
+
+  aColor = aResourceMgr->colorValue( "VISU", "picking_selection_color", aColor );
+  //QPalette aPalette( mySelectionColorButton->palette() );
+  //aPalette.setColor( mySelectionColorButton->backgroundRole(), aColor );
+  mySelectionColorButton->setColor( aColor );
+
+  anInfoWindowTransparency = aResourceMgr->integerValue( "VISU", "picking_transparency", anInfoWindowTransparency );
+  myTransparencySpinBox->setValue( anInfoWindowTransparency );
+
+  anInfoWindowPosition = aResourceMgr->integerValue( "VISU", "picking_position", anInfoWindowPosition );
+  myPositionComboBox->setCurrentIndex( anInfoWindowPosition );
+
+  aZoomFactor = aResourceMgr->doubleValue( "VISU", "picking_zoom_factor", aZoomFactor );
+  myZoomFactorSpinBox->setValue( aZoomFactor );
+
+  aStepNumber = aResourceMgr->integerValue( "VISU", "picking_step_number", aStepNumber );
+  myStepNumberSpinBox->setValue( aStepNumber );
+
+  aDisplayParentMesh = aResourceMgr->booleanValue( "VISU", "picking_display_parent_mesh", aDisplayParentMesh );
+  myDisplayParentMeshCheckBox->setChecked( aDisplayParentMesh );
+
+  onClickApply();
+}
+
+void VVTK_PickingDlg::onSelectionValidate() 
+{
+  myParentElementLineEdit->MarkValidated( myParentElementLineEdit->text() );
+  myLocalPointLineEdit->MarkValidated( myLocalPointLineEdit->text() );
+}
+
+void VVTK_PickingDlg::onSelectionEvent() 
+{
+  SelectorHelper aHelper( myInteractor );
+  if ( !aHelper.get() )
+    return;
+
+  const TColStd_IndexedMapOfInteger& aMapIndex = aHelper.myMapIndex;
+  if ( aMapIndex.Extent() != 1 )
+    return;
+
+  int anObjId = aHelper.myMapIndex(1);
+
+  VISU::TGaussPointID aGaussPointID = aHelper.myPipeLine->GetObjID( anObjId );
+
+  VISU::TCellID aCellID = aGaussPointID.first;
+  myParentElementLineEdit->setText( QString::number( aCellID ) );
+
+  VISU::TLocalPntID aLocalPntID = aGaussPointID.second;
+  myLocalPointLineEdit->setText( QString::number( aLocalPntID ) );
+}
+
+VISU_PickingSettings* 
+VVTK_PickingDlg
+::GetPickingSettings()
+{
+  return myPickingSettings.GetPointer();
+}
+
+void VVTK_PickingDlg::SetInteractor( SVTK_RenderWindowInteractor* theInteractor )
+{
+  myInteractor = theInteractor;
+
+  theInteractor->GetDevice()->AddObserver(vtkCommand::KeyPressEvent, 
+                                          myEventCallbackCommand.GetPointer(), 
+                                          myPriority);
+  theInteractor->GetDevice()->AddObserver(vtkCommand::EndPickEvent, 
+                                          myEventCallbackCommand.GetPointer(), 
+                                          myPriority);
+  {
+    QValidator* aValidator = new GaussCellIDValidator( myLocalPointLineEdit, theInteractor, myParentElementLineEdit );
+    myParentElementLineEdit->setValidator( aValidator );
+  }
+  {
+    QValidator* aValidator = new GaussLocalPointIDValidator( myParentElementLineEdit, theInteractor, myLocalPointLineEdit );
+    myLocalPointLineEdit->setValidator( aValidator );
+  }
+}
+
+void VVTK_PickingDlg::ProcessEvents(vtkObject* vtkNotUsed(theObject), 
+                                    unsigned long theEvent,
+                                    void* theClientData, 
+                                    void* vtkNotUsed(theCallData))
+{
+  VVTK_PickingDlg* self = reinterpret_cast<VVTK_PickingDlg*>(theClientData);
+
+  switch(theEvent){
+  case vtkCommand::KeyPressEvent:
+    self->KeyPressed();
+    break;
+  case vtkCommand::EndPickEvent:
+    self->onSelectionEvent();
+    break;
+  }
+}
+
+void VVTK_PickingDlg::KeyPressed()
+{
+  if( myInteractor->GetDevice()->GetKeyCode() == 'P' )
+  {
+    bool aDisplayParentMesh = !myPickingSettings->GetDisplayParentMesh();
+    myPickingSettings->SetDisplayParentMesh( aDisplayParentMesh );
+
+    myDisplayParentMeshCheckBox->setChecked( aDisplayParentMesh );
+
+    myPickingSettings->InvokeEvent(VISU::UpdatePickingSettingsEvent,NULL);
+  }
+}
+
+void VVTK_PickingDlg::onClickApply()
+{
+  //myPickingSettings->SetInitial( false );
+
+  myPickingSettings->SetCursorSize( myCursorSizeSpinBox->value() );
+  myPickingSettings->SetPyramidHeight( myPyramidHeightSpinBox->value() );
+  myPickingSettings->SetPointTolerance( myPointToleranceSpinBox->value() );
+  myPickingSettings->SetInfoWindowTransparency( myTransparencySpinBox->value() / 100.0 );
+  myPickingSettings->SetInfoWindowPosition( myPositionComboBox->currentIndex() );
+  myPickingSettings->SetZoomFactor( myZoomFactorSpinBox->value() );
+  myPickingSettings->SetStepNumber( myStepNumberSpinBox->value() );
+  myPickingSettings->SetDisplayParentMesh( myDisplayParentMeshCheckBox->isChecked() );
+
+  //QPalette aPalette( mySelectionColorButton->palette() );
+  QColor aButtonColor = mySelectionColorButton->color();//aPalette.color(mySelectionColorButton->backgroundRole() );
+  vtkFloatingPointType aColor[3];
+  aColor[0] = aButtonColor.red() / 255.0;
+  aColor[1] = aButtonColor.green() / 255.0;
+  aColor[2] = aButtonColor.blue() / 255.0;
+  myPickingSettings->SetColor( aColor );
+
+  myPickingSettings->InvokeEvent( VISU::UpdatePickingSettingsEvent,NULL );
+
+  SelectorHelper aHelper( myInteractor );
+  if ( !aHelper.get() )
+    return;
+
+  VISU::TCellID aCellID = myParentElementLineEdit->text().toInt();
+  VISU::TLocalPntID aLocalPntID = myLocalPointLineEdit->text().toInt();
+  VISU::PGaussPtsIDMapper anIDMapper = aHelper.myPipeLine->GetGaussPtsIDMapper();
+  vtkIdType anObjId = anIDMapper->GetVTKID( VISU::TGaussPointID( aCellID, aLocalPntID ) );
+  if ( anObjId < 0 )
+    return;
+
+  aHelper.myMapIndex.Clear();
+  aHelper.myMapIndex.Add( anObjId );
+  aHelper.mySelector->AddOrRemoveIndex( aHelper.myIO, aHelper.myMapIndex, false );
+  aHelper.myActor->Highlight( aHelper.myIO );
+  myInteractor->GetDevice()->CreateTimer( VTKI_TIMER_FIRST );
+}
+
+void VVTK_PickingDlg::onClickClose()
+{
+  reject();
+}
+
+void VVTK_PickingDlg::onClickHelp()
+{
+  QString aHelpFileName = "picking.htm";
+  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+  if (app)
+    app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
+  else {
+                QString platform;
+#ifdef WIN32
+                platform = "winapplication";
+#else
+                platform = "application";
+#endif
+        SUIT_MessageBox::warning( 0,
+                                  QObject::tr("WRN_WARNING"),
+                                  QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+                                    arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
+                                  QObject::tr("BUT_OK"));
+  }
+}
+
+/*void VVTK_PickingDlg::onColorButtonPressed()
+{
+  QPalette aPalette( mySelectionColorButton->palette() );
+  QColor aColor = QColorDialog::
+    getColor( aPalette.color(mySelectionColorButton->backgroundRole() ), this );
+
+  if( aColor.isValid() )
+  {
+      aPalette.setColor( mySelectionColorButton->backgroundRole(),
+                     aColor );
+      mySelectionColorButton->setPalette( aPalette );
+  }
+}*/
+
+void VVTK_PickingDlg::keyPressEvent( QKeyEvent* e )
+{
+  QDialog::keyPressEvent( e );
+  if ( e->isAccepted() )
+    return;
+
+  if ( e->key() == Qt::Key_F1 )
+    {
+      e->accept();
+      onClickHelp();
+    }
+}
diff --git a/src/VVTK/VVTK_PickingDlg.h b/src/VVTK/VVTK_PickingDlg.h
new file mode 100644 (file)
index 0000000..cd77197
--- /dev/null
@@ -0,0 +1,140 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VVTK_PickingDlg.h
+//  Author : Oleg Uvarov
+//  Module : VISU
+//
+#ifndef VVTK_PICKINGDLG_H
+#define VVTK_PICKINGDLG_H
+
+#include "SVTK_DialogBase.h"
+
+#include <vtkObject.h>
+#include <vtkSmartPointer.h>
+
+#include <QLineEdit>
+
+class vtkActorCollection;
+class vtkCallbackCommand;
+class vtkImageData;
+
+class QLabel;
+class QComboBox;
+class QCheckBox;
+class QPushButton;
+
+class QtxAction;
+class SalomeApp_DoubleSpinBox;
+class SalomeApp_IntSpinBox;
+class QtxColorButton;
+
+class VISU_GaussPtsAct;
+class VISU_PickingSettings;
+
+class SVTK_MainWindow;
+class SVTK_RenderWindowInteractor;
+class VVTK_ValidatedLineEdit;
+
+//! Picking Dialog.
+/*!
+ * Uses for set up picking preferenses and apply
+ * them to all actors in the current renderer.
+ */
+class VVTK_PickingDlg : public SVTK_DialogBase
+{
+  Q_OBJECT
+
+public:
+  VVTK_PickingDlg(QtxAction* theAction,
+                  SVTK_MainWindow* theParent,
+                  const char* theName);
+
+  ~VVTK_PickingDlg();
+
+  //! Make an actor to listen the event of Update Picking Settings event.
+  void             AddActor( VISU_GaussPtsAct* );
+  void             RemoveActor( VISU_GaussPtsAct* );
+
+  //! Update dialog contents.
+  void             Update();
+
+  VISU_PickingSettings* GetPickingSettings();
+
+  void             SetInteractor( SVTK_RenderWindowInteractor* );
+
+protected slots:
+  void             onSelectionEvent();
+  void             onClickApply();
+  void             onClickClose();
+  void             onClickHelp();
+
+  //void             onColorButtonPressed();
+  void             onSelectionValidate();
+
+private:
+  static void      ProcessEvents(vtkObject* theObject, 
+                                 unsigned long theEvent,
+                                 void* theClientData, 
+                                 void* theCallData);
+
+  void             KeyPressed();
+  void             keyPressEvent( QKeyEvent* e );
+
+private:
+  SalomeApp_DoubleSpinBox* myCursorSizeSpinBox;
+  SalomeApp_DoubleSpinBox* myPyramidHeightSpinBox;
+  QtxColorButton*   mySelectionColorButton;
+  SalomeApp_DoubleSpinBox* myPointToleranceSpinBox;
+  SalomeApp_IntSpinBox*    myTransparencySpinBox;
+  QComboBox*        myPositionComboBox;
+  SalomeApp_DoubleSpinBox* myZoomFactorSpinBox;
+  SalomeApp_IntSpinBox*    myStepNumberSpinBox;
+  QCheckBox*        myDisplayParentMeshCheckBox;
+
+  QtxAction*        myAction;
+  vtkSmartPointer<VISU_PickingSettings> 
+                    myPickingSettings;
+
+  VVTK_ValidatedLineEdit*      
+                    myParentElementLineEdit;
+  VVTK_ValidatedLineEdit*     
+                    myLocalPointLineEdit;
+
+  SVTK_RenderWindowInteractor* 
+                    myInteractor;
+
+  float             myPriority;
+  vtkSmartPointer<vtkCallbackCommand> 
+                    myEventCallbackCommand;
+};
+
+class VVTK_ValidatedLineEdit : public QLineEdit
+{
+  Q_OBJECT;
+public:
+  VVTK_ValidatedLineEdit( QWidget* parent );
+  
+public slots:
+  void MarkValidated( const QString& theText );
+};
+
+#endif
diff --git a/src/VVTK/VVTK_PrimitiveBox.cxx b/src/VVTK/VVTK_PrimitiveBox.cxx
new file mode 100644 (file)
index 0000000..c51539b
--- /dev/null
@@ -0,0 +1,377 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  VISU VISUGUI : GUI of VISU component
+//  File   : VVTK_PrimitiveBox.cxx
+//  Author : Oleg UVAROV
+//  Module : VISU
+//
+#include "VVTK_PrimitiveBox.h"
+#include <VisuGUI_GUITools.h>
+
+#include "VISU_OpenGLPointSpriteMapper.hxx"
+
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Session.h"
+
+#include <SalomeApp_DoubleSpinBox.h>
+#include <SalomeApp_IntSpinBox.h>
+
+#include <QLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QPushButton>
+#include <QFileDialog>
+
+#include <iostream>
+
+using namespace std;
+
+VVTK_PrimitiveBox::VVTK_PrimitiveBox( QWidget* parent ) :
+  QGroupBox( parent )
+{
+  SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
+
+  setTitle( tr( "PRIMITIVE_TITLE" ) );
+  //setColumnLayout(0, Qt::Vertical );
+  //layout()->setSpacing( 0 );
+  //layout()->setMargin( 0 );
+
+  QGridLayout* aLayout = new QGridLayout( this );
+  aLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  aLayout->setSpacing(6);
+  aLayout->setMargin(11);
+
+  myPrimitiveType = VISU_OpenGLPointSpriteMapper::PointSprite;
+
+  QString aRootDir = QString( getenv( "VISU_ROOT_DIR") ) + "/share/salome/resources/visu/";
+  myMainTexture = aRootDir + "sprite_texture.bmp";
+  myAlphaTexture = aRootDir + "sprite_alpha.bmp";
+
+  // Primitive Type
+  QGroupBox* aPrimitiveTypeGroup = new QGroupBox( this );
+  aPrimitiveTypeGroup->setMinimumWidth( 450 );
+  QHBoxLayout* aPrimLayout = new QHBoxLayout( aPrimitiveTypeGroup );
+  aPrimLayout->setMargin( 0 );
+
+  //QButtonGroup* aPrimitiveTypeGroup = new QButtonGroup( 3, Qt::Horizontal, this, "PrimitiveTypeGroup" );
+  //aPrimitiveTypeGroup->setMinimumWidth( 450 );
+  //aPrimitiveTypeGroup->setRadioButtonExclusive( true );
+  //aPrimitiveTypeGroup->setFrameStyle( QFrame::NoFrame );
+  //aPrimitiveTypeGroup->layout()->setMargin( 0 );
+
+  myPointSpriteButton = new QRadioButton( tr( "POINT_SPRITE" ), aPrimitiveTypeGroup );
+  myOpenGLPointButton = new QRadioButton( tr( "OPENGL_POINT" ), aPrimitiveTypeGroup );
+  myGeomSphereButton = new QRadioButton( tr( "GEOMETRICAL_SPHERE" ), aPrimitiveTypeGroup );
+
+  aPrimLayout->addWidget( myPointSpriteButton );
+  aPrimLayout->addWidget( myOpenGLPointButton );
+  aPrimLayout->addWidget( myGeomSphereButton );
+
+  aLayout->addWidget( aPrimitiveTypeGroup, 0, 0, 1, 2 );
+
+  // Clamp ( Point Sprite & OpenGL Point )
+  myClampLabel = new QLabel( tr( "CLAMP" ), this );
+  myClampSpinBox = new SalomeApp_DoubleSpinBox( this );
+  VISU::initSpinBox( myClampSpinBox, 1.0, 512.0, 1.0, "parametric_precision" );
+  myClampSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  aLayout->addWidget( myClampLabel, 1, 0 );
+  aLayout->addWidget( myClampSpinBox, 1, 1, 1, 2 );
+
+  // Main Texture ( Point Sprite )
+  myMainTextureLabel = new QLabel( tr( "MAIN_TEXTURE" ), this );
+  myMainTextureLineEdit = new QLineEdit( this );
+  myMainTextureButton = new QPushButton( this );
+  myMainTextureButton->setAutoDefault( false );
+  myMainTextureButton->setIcon( aResourceMgr->loadPixmap( "VISU", tr( "ICON_LOAD_TEXTURE" ) ) );
+  connect( myMainTextureButton, SIGNAL( clicked() ), this, SLOT( onBrowseMainTexture() ) );
+
+  aLayout->addWidget( myMainTextureLabel, 2, 0 );
+  aLayout->addWidget( myMainTextureLineEdit, 2, 1 );
+  aLayout->addWidget( myMainTextureButton, 2, 2 );
+
+  // Alpha Texture ( Point Sprite )
+  myAlphaTextureLabel = new QLabel( tr( "ALPHA_TEXTURE" ), this );
+  myAlphaTextureLineEdit = new QLineEdit( this );
+  myAlphaTextureButton = new QPushButton( this );
+  myAlphaTextureButton->setAutoDefault( false );
+  myAlphaTextureButton->setIcon( aResourceMgr->loadPixmap( "VISU", tr( "ICON_LOAD_TEXTURE" ) ) );
+  connect( myAlphaTextureButton, SIGNAL( clicked() ), this, SLOT( onBrowseAlphaTexture() ) );
+
+  aLayout->addWidget( myAlphaTextureLabel, 3, 0 );
+  aLayout->addWidget( myAlphaTextureLineEdit, 3, 1 );
+  aLayout->addWidget( myAlphaTextureButton, 3, 2 );
+
+  // Alpha Threshold ( Point Sprite )
+  myAlphaThresholdLabel = new QLabel( tr( "ALPHA_THRESHOLD" ), this );
+  myAlphaThresholdSpinBox = new SalomeApp_DoubleSpinBox( this );
+  VISU::initSpinBox( myAlphaThresholdSpinBox,  0.0, 1.0, 0.1, "parametric_precision" );  
+  myAlphaThresholdSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  aLayout->addWidget( myAlphaThresholdLabel, 4, 0 );
+  aLayout->addWidget( myAlphaThresholdSpinBox, 4, 1, 1, 2 );
+
+  // Resolution ( Geometrical Sphere )
+  myResolutionLabel = new QLabel( tr( "RESOLUTION" ), this );
+  myResolutionSpinBox = new SalomeApp_IntSpinBox( this );
+  VISU::initSpinBox( myResolutionSpinBox, 3, 100, 1 );    
+  myResolutionSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  connect( myResolutionSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( onResolutionChanged( int ) ) );
+
+  aLayout->addWidget( myResolutionLabel, 5, 0 );
+  aLayout->addWidget( myResolutionSpinBox, 5, 1, 1, 2 );
+
+  // Number of faces ( Geometrical Sphere )
+  myFaceNumberLabel = new QLabel( tr( "FACE_NUMBER" ), this );
+  myFaceNumberLineEdit = new QLineEdit( this );
+  myFaceNumberLineEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myFaceNumberLineEdit->setEnabled( false );
+  //myFaceNumberLineEdit->setReadOnly( true );
+
+  aLayout->addWidget( myFaceNumberLabel, 6, 0 );
+  aLayout->addWidget( myFaceNumberLineEdit, 6, 1, 1, 2 );
+
+  // Notification ( Geometrical Sphere )
+  myFaceLimitLabel = new QLabel( tr( "FACE_LIMIT" ), this );
+  myFaceLimitSpinBox = new SalomeApp_IntSpinBox( this );
+  VISU::initSpinBox( myFaceLimitSpinBox, 10, 1000000, 10 );      
+  myFaceLimitSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  aLayout->addWidget( myFaceLimitLabel, 7, 0 );
+  aLayout->addWidget( myFaceLimitSpinBox, 7, 1, 1, 2 );
+
+  connect( myPointSpriteButton, SIGNAL( clicked() ), this, SLOT( onTogglePointSprite() ) );
+  connect( myOpenGLPointButton, SIGNAL( clicked() ), this, SLOT( onToggleOpenGLPoint() ) );
+  connect( myGeomSphereButton,  SIGNAL( clicked() ), this, SLOT( onToggleGeomSphere() ) );
+}
+
+void VVTK_PrimitiveBox::onTogglePointSprite()
+{
+  myPrimitiveType = VISU_OpenGLPointSpriteMapper::PointSprite;
+
+  myClampLabel->show();
+  myClampSpinBox->show();
+
+  myMainTextureLabel->show();
+  myMainTextureLineEdit->show();
+  myMainTextureButton->show();
+
+  myAlphaTextureLabel->show();
+  myAlphaTextureLineEdit->show();
+  myAlphaTextureButton->show();
+
+  myAlphaThresholdLabel->show();
+  myAlphaThresholdSpinBox->show();
+
+  myResolutionLabel->hide();
+  myResolutionSpinBox->hide();
+
+  myFaceNumberLabel->hide();
+  myFaceNumberLineEdit->hide();
+
+  myFaceLimitLabel->hide();
+  myFaceLimitSpinBox->hide();
+}
+
+void VVTK_PrimitiveBox::onToggleOpenGLPoint()
+{
+  myPrimitiveType = VISU_OpenGLPointSpriteMapper::OpenGLPoint;
+
+  myClampLabel->show();
+  myClampSpinBox->show();
+
+  myMainTextureLabel->hide();
+  myMainTextureLineEdit->hide();
+  myMainTextureButton->hide();
+
+  myAlphaTextureLabel->hide();
+  myAlphaTextureLineEdit->hide();
+  myAlphaTextureButton->hide();
+
+  myAlphaThresholdLabel->hide();
+  myAlphaThresholdSpinBox->hide();
+
+  myResolutionLabel->hide();
+  myResolutionSpinBox->hide();
+
+  myFaceNumberLabel->hide();
+  myFaceNumberLineEdit->hide();
+
+  myFaceLimitLabel->hide();
+  myFaceLimitSpinBox->hide();
+}
+
+void VVTK_PrimitiveBox::onToggleGeomSphere()
+{
+  myPrimitiveType = VISU_OpenGLPointSpriteMapper::GeomSphere;
+
+  myClampLabel->hide();
+  myClampSpinBox->hide();
+
+  myMainTextureLabel->hide();
+  myMainTextureLineEdit->hide();
+  myMainTextureButton->hide();
+
+  myAlphaTextureLabel->hide();
+  myAlphaTextureLineEdit->hide();
+  myAlphaTextureButton->hide();
+
+  myAlphaThresholdLabel->hide();
+  myAlphaThresholdSpinBox->hide();
+
+  myResolutionLabel->show();
+  myResolutionSpinBox->show();
+
+  myFaceNumberLabel->show();
+  myFaceNumberLineEdit->show();
+
+  myFaceLimitLabel->show();
+  myFaceLimitSpinBox->show();
+}
+
+void VVTK_PrimitiveBox::onResolutionChanged( int theResolution )
+{
+  setFaceNumber( 2 * theResolution * ( theResolution - 2 ) );
+}
+
+void VVTK_PrimitiveBox::setPrimitiveType( int theType )
+{
+  myPrimitiveType = theType;
+
+  switch( myPrimitiveType )
+  {
+    case VISU_OpenGLPointSpriteMapper::PointSprite :
+      myPointSpriteButton->setChecked( true );
+      onTogglePointSprite();
+      break;
+    case VISU_OpenGLPointSpriteMapper::OpenGLPoint :
+      myOpenGLPointButton->setChecked( true );
+      onToggleOpenGLPoint();
+      break;
+    case VISU_OpenGLPointSpriteMapper::GeomSphere :
+      myGeomSphereButton->setChecked( true );
+      onToggleGeomSphere();
+      break;
+    default : break;
+  }
+}
+
+float VVTK_PrimitiveBox::getClamp() const
+{
+  return myClampSpinBox->value();
+}
+
+void VVTK_PrimitiveBox::setClamp( float theClamp )
+{
+  myClampSpinBox->setValue( theClamp );
+}
+
+void VVTK_PrimitiveBox::setClampMaximum( float theClampMaximum )
+{
+  myClampSpinBox->setMaximum( theClampMaximum );
+}
+
+void VVTK_PrimitiveBox::setMainTexture( const QString& theMainTexture )
+{
+  myMainTexture = theMainTexture;
+  myMainTextureLineEdit->setText( theMainTexture.section( '/', -1 ) );
+}
+
+void VVTK_PrimitiveBox::setAlphaTexture( const QString& theAlphaTexture )
+{
+  myAlphaTexture = theAlphaTexture;
+  myAlphaTextureLineEdit->setText( theAlphaTexture.section( '/', -1 ) );
+}
+
+float VVTK_PrimitiveBox::getAlphaThreshold() const
+{
+  return myAlphaThresholdSpinBox->value();
+}
+
+void VVTK_PrimitiveBox::setAlphaThreshold( float theAlphaThreshold )
+{
+  myAlphaThresholdSpinBox->setValue( theAlphaThreshold );
+}
+
+int VVTK_PrimitiveBox::getResolution() const
+{
+  return myResolutionSpinBox->value();
+}
+
+void VVTK_PrimitiveBox::setResolution( int theResolution )
+{
+  myResolutionSpinBox->setValue( theResolution );
+}
+
+int VVTK_PrimitiveBox::getFaceNumber() const
+{
+  int aResolution = getResolution();
+  return 2 * aResolution * ( aResolution - 2 );
+  //return myFaceNumberLineEdit->text().toInt();
+}
+
+void VVTK_PrimitiveBox::setFaceNumber( int theFaceNumber )
+{
+  myFaceNumberLineEdit->setText( QString::number( theFaceNumber ) );
+}
+
+int VVTK_PrimitiveBox::getFaceLimit() const
+{
+  return myFaceLimitSpinBox->value();
+}
+
+void VVTK_PrimitiveBox::setFaceLimit( int theFaceLimit )
+{
+  myFaceLimitSpinBox->setValue( theFaceLimit );
+}
+
+void VVTK_PrimitiveBox::onBrowseMainTexture()
+{
+  QString aRootDir = QString( getenv( "VISU_ROOT_DIR") ) + "/share/salome/resources/visu/";
+  QString aFileName = QFileDialog::getOpenFileName( this,
+                                                    0,
+                                                    aRootDir,
+                                                    "Bitmap (*.bmp *.jpg *.png)" );
+
+  if( aFileName.isNull() )
+    return;
+
+  myMainTexture = aFileName;
+  myMainTextureLineEdit->setText( aFileName.section( '/', -1 ) );
+}
+
+void VVTK_PrimitiveBox::onBrowseAlphaTexture()
+{
+  QString aRootDir = QString( getenv( "VISU_ROOT_DIR") ) + "/share/salome/resources/visu/";
+  QString aFileName = QFileDialog::getOpenFileName( this,
+                                                    0,
+                                                    aRootDir,
+                                                    "Bitmap (*.bmp *.jpg *.png)" );
+
+  if( aFileName.isNull() )
+    return;
+
+  myAlphaTexture = aFileName;
+  myAlphaTextureLineEdit->setText( aFileName.section( '/', -1 ) );
+}
diff --git a/src/VVTK/VVTK_PrimitiveBox.h b/src/VVTK/VVTK_PrimitiveBox.h
new file mode 100644 (file)
index 0000000..ed4ff5a
--- /dev/null
@@ -0,0 +1,122 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  VISU VISUGUI : GUI of VISU component
+//  File   : VVTK_PrimitiveBox.h
+//  Author : Oleg UVAROV
+//  Module : VISU
+//
+#ifndef VVTK_PRIMITIVEBOX_H
+#define VVTK_PRIMITIVEBOX_H
+
+#include "VVTK.h"
+
+#include <QGroupBox>
+
+class QLabel;
+class QLineEdit;
+class QPushButton;
+class QRadioButton;
+
+class SalomeApp_DoubleSpinBox;
+class SalomeApp_IntSpinBox;
+
+class VVTK_EXPORT VVTK_PrimitiveBox : public QGroupBox
+{
+  Q_OBJECT
+
+public:
+  VVTK_PrimitiveBox( QWidget* );
+  ~VVTK_PrimitiveBox() {}
+
+public:
+  int                      getPrimitiveType() const { return myPrimitiveType; }
+  void                     setPrimitiveType( int );
+
+  float                    getClamp() const;
+  void                     setClamp( float );
+  void                     setClampMaximum( float );
+
+  QString                  getMainTexture() const { return myMainTexture; }
+  void                     setMainTexture( const QString& );
+
+  QString                  getAlphaTexture() const { return myAlphaTexture; }
+  void                     setAlphaTexture( const QString& );
+
+  float                    getAlphaThreshold() const;
+  void                     setAlphaThreshold( float );
+
+  int                      getResolution() const;
+  void                     setResolution( int );
+
+  int                      getFaceNumber() const;
+  void                     setFaceNumber( int );
+
+  int                      getFaceLimit() const;
+  void                     setFaceLimit( int );
+
+protected slots:
+  void                     onTogglePointSprite();
+  void                     onToggleOpenGLPoint();
+  void                     onToggleGeomSphere();
+
+  void                     onBrowseMainTexture();
+  void                     onBrowseAlphaTexture();
+
+  void                     onResolutionChanged( int );
+
+private:
+  int                      myPrimitiveType;
+
+  QRadioButton*            myPointSpriteButton;
+  QRadioButton*            myOpenGLPointButton;
+  QRadioButton*            myGeomSphereButton;
+
+  QString                  myMainTexture;
+  QString                  myAlphaTexture;
+
+  QLabel*                  myClampLabel;
+  SalomeApp_DoubleSpinBox* myClampSpinBox;
+
+  QLabel*                  myMainTextureLabel;
+  QLineEdit*               myMainTextureLineEdit;
+  QPushButton*             myMainTextureButton;
+
+  QLabel*                  myAlphaTextureLabel;
+  QLineEdit*               myAlphaTextureLineEdit;
+  QPushButton*             myAlphaTextureButton;
+
+  QLabel*                  myAlphaThresholdLabel;
+  SalomeApp_DoubleSpinBox* myAlphaThresholdSpinBox;
+
+  QLabel*                  myResolutionLabel;
+  SalomeApp_IntSpinBox*    myResolutionSpinBox;
+
+  QLabel*                  myFaceNumberLabel;
+  QLineEdit*               myFaceNumberLineEdit;
+
+  QLabel*                  myFaceLimitLabel;
+  SalomeApp_IntSpinBox*    myFaceLimitSpinBox;
+};
+
+
+
+#endif
diff --git a/src/VVTK/VVTK_Recorder.cxx b/src/VVTK/VVTK_Recorder.cxx
new file mode 100755 (executable)
index 0000000..9ef0f6d
--- /dev/null
@@ -0,0 +1,490 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   :
+//  Author :
+//  Module :
+//  $Header$
+//
+#include "VVTK_Recorder.h"
+
+#include "VVTK_ImageWriter.h"
+#include "VVTK_ImageWriterMgr.h"
+
+#include <vtkObjectFactory.h>
+#include <vtkObject.h>
+#include <vtkCallbackCommand.h>
+#include <vtkRenderWindow.h>
+#include <vtkTimerLog.h>
+#include <vtkWindowToImageFilter.h>
+#include <vtkJPEGWriter.h>
+#include <vtkImageData.h>
+
+#include <sstream>
+#include <iomanip>
+#include <iostream>
+
+#ifndef WIN32
+#include <unistd.h>
+#endif
+
+#include <QApplication>
+#include <QFileInfo>
+#include <QDir>
+
+#include "utilities.h"
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+
+namespace
+{
+  //----------------------------------------------------------------------------
+  inline
+  void
+  GetNameJPEG(const std::string& thePreffix,  
+              const int theIndex,
+              std::string& theName)
+  {
+    using namespace std;
+    ostringstream aStream;
+    aStream<<thePreffix<<"_"<<setw(6)<<setfill('0')<<theIndex<<".jpeg";
+    theName = aStream.str();
+  }
+}
+
+//----------------------------------------------------------------------------
+vtkCxxRevisionMacro(VVTK_Recorder,"$Revision$");
+vtkStandardNewMacro(VVTK_Recorder);
+
+
+//----------------------------------------------------------------------------
+VVTK_Recorder
+::VVTK_Recorder():
+  myRenderWindow(NULL),
+  myState(VVTK_Recorder_Stop),
+  myNbFPS(5.5),
+  myQuality(100),
+  myProgressiveMode(true),
+  myUseSkippedFrames(true),
+  myErrorStatus(0),
+  myCommand(vtkCallbackCommand::New()),
+  myPriority(0.0),
+  myTimeStart(0.0),
+  myFrameIndex(0),
+  myPaused(0),
+  myFilter(vtkWindowToImageFilter::New()),
+  myWriterMgr(new VVTK_ImageWriterMgr),
+  myNbWrittenFrames(0),
+  myNameAVIMaker("jpeg2yuv")
+{
+  myCommand->SetClientData(this); 
+  myCommand->SetCallback(VVTK_Recorder::ProcessEvents);
+}
+
+
+//----------------------------------------------------------------------------
+VVTK_Recorder
+::~VVTK_Recorder()
+{
+  myCommand->Delete();
+  myFilter->Delete();
+  delete myWriterMgr;
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::CheckExistAVIMaker()
+{
+  myErrorStatus = 0;
+  using namespace std;
+  ostringstream aStream;
+  aStream<<"which "<<myNameAVIMaker<<" >& /dev/null";
+  std::string anAVIMakeCheck = aStream.str();
+  int iErr = system(anAVIMakeCheck.c_str());
+  if(iErr != 0)
+    myErrorStatus = 127;
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::SetName(const char* theName)
+{
+  myName = theName;
+}
+
+const char* 
+VVTK_Recorder::Name() const
+{
+  return myName.c_str();
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::SetNbFPS(const double theNbFPS)
+{
+  myNbFPS = theNbFPS;
+}
+
+double
+VVTK_Recorder
+::NbFPS() const
+{
+  return myNbFPS;
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::SetQuality(int theQuality)
+{
+  myQuality = theQuality;
+}
+
+int
+VVTK_Recorder
+::GetQuality() const
+{
+  return myQuality;
+}
+
+
+//----------------------------------------------------------------------------
+void 
+VVTK_Recorder
+::SetRenderWindow(vtkRenderWindow* theRenderWindow)
+{
+  myRenderWindow = theRenderWindow;
+}
+
+vtkRenderWindow* 
+VVTK_Recorder
+::RenderWindow()
+{
+  return myRenderWindow;
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::SetProgressiveMode(bool theProgressiveMode)
+{
+  myProgressiveMode = theProgressiveMode;
+}
+
+bool
+VVTK_Recorder
+::GetProgressiveMode() const
+{
+  return myProgressiveMode;
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::SetUseSkippedFrames(bool theUseSkippedFrames)
+{
+  myUseSkippedFrames = theUseSkippedFrames;
+}
+
+bool
+VVTK_Recorder
+::UseSkippedFrames() const
+{
+  return myUseSkippedFrames;
+}
+
+
+//----------------------------------------------------------------------------
+int
+VVTK_Recorder
+::ErrorStatus() const
+{
+  return myErrorStatus;
+}
+
+int
+VVTK_Recorder
+::State() const
+{
+  return myState;
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::ProcessEvents(vtkObject* vtkNotUsed(theObject), 
+                unsigned long theEvent,
+                void* theClientData, 
+                void* vtkNotUsed(theCallData))
+{
+  if(vtkObject* anObj = reinterpret_cast<vtkObject*>(theClientData)){ 
+    if(VVTK_Recorder* aSelf = dynamic_cast<VVTK_Recorder*>(anObj)){
+      if(theEvent==vtkCommand::EndEvent){
+        if(aSelf->State() == VVTK_Recorder::VVTK_Recorder_Record){
+          aSelf->DoRecord();
+        }
+      }
+    }
+  }
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::Record()
+{
+  if(myState == VVTK_Recorder_Stop){
+    if(myRenderWindow){
+      myState = VVTK_Recorder_Record;
+      myFilter->SetInput(myRenderWindow);
+      myFrameIndex = -1;
+      myNbWrittenFrames = 0;
+      myRenderWindow->RemoveObserver(myCommand);
+      myRenderWindow->AddObserver(vtkCommand::EndEvent,
+                                  myCommand,
+                                  myPriority);
+      myRenderWindow->Render();
+    }
+  }
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::Stop()
+{
+  QApplication::setOverrideCursor( Qt::WaitCursor );
+
+  if(myState == VVTK_Recorder_Record){ 
+    if(!myPaused)
+      DoRecord();
+
+    myWriterMgr->Stop();
+
+    if(myUseSkippedFrames)
+      AddSkippedFrames();
+
+    myFrameIndexes.clear();
+
+    MakeFileAVI();
+  }
+  myState = VVTK_Recorder_Stop;
+  myPaused = 0;
+
+  QApplication::restoreOverrideCursor();
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::Pause()
+{
+  myPaused = myPaused ? 0 : 1;
+  if(myPaused && !myFrameIndexes.empty()){
+    myFrameIndexes.back() *= -1;
+    if(MYDEBUG) MESSAGE("VVTK_Recorder::Pause - myFrameIndexes.back() = "<<myFrameIndexes.back());
+  }
+}
+
+
+//----------------------------------------------------------------------------
+inline 
+int
+GetFrameIndex(double theStartTime,
+              double theFPS)
+{
+  double aTimeNow = vtkTimerLog::GetCurrentTime();
+  double aDelta = aTimeNow - theStartTime;
+  return int(aDelta*theFPS);
+}
+
+void
+VVTK_Recorder
+::DoRecord()
+{
+  if(myPaused)
+    return;
+
+  if(myFrameIndex < 0){
+    myFrameIndex = 0;
+    myTimeStart = vtkTimerLog::GetCurrentTime();
+  }else{
+    int aFrameIndex = GetFrameIndex(myTimeStart,myNbFPS);
+    if(aFrameIndex <= myFrameIndex)
+      return;
+
+    // If there was a "pause" we correct the myTimeStart
+    int aLastFrameIndex = myFrameIndexes.back();
+    if(aLastFrameIndex < 0){
+      myFrameIndexes.back() = abs(myFrameIndexes.back());
+      double aPauseTime = fabs((double)(aFrameIndex - myFrameIndex - 1)) / myNbFPS;
+      if(MYDEBUG) 
+        MESSAGE("VVTK_Recorder::DoRecord - aFrameIndex = "<<aFrameIndex<<
+          "; aPauseTime = "<<aPauseTime);
+      myTimeStart += aPauseTime;
+    }
+
+    aFrameIndex = GetFrameIndex(myTimeStart,myNbFPS);
+    if(aFrameIndex <= myFrameIndex)
+      return;
+
+    myFrameIndex = aFrameIndex;
+  }
+
+  myFrameIndexes.push_back(myFrameIndex);
+  if(MYDEBUG) MESSAGE("VVTK_Recorder::DoRecord - myFrameIndex = "<<myFrameIndex);
+
+  myRenderWindow->RemoveObserver(myCommand);
+  myFilter->Modified();
+
+  std::string aName;
+  GetNameJPEG(myName,myFrameIndex,aName);
+
+  PreWrite();
+
+  vtkImageData *anImageData = vtkImageData::New(); 
+  anImageData->DeepCopy(myFilter->GetOutput());
+
+  myWriterMgr->StartImageWriter(anImageData,aName,myProgressiveMode,myQuality);
+  myNbWrittenFrames++;
+
+  myRenderWindow->AddObserver(vtkCommand::EndEvent,
+                              myCommand,
+                              myPriority);
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::PreWrite()
+{
+  vtkImageData *anImageData = myFilter->GetOutput();
+  //
+  if(!anImageData){
+    myErrorStatus = 20;
+    return;
+  }
+  anImageData->UpdateInformation();
+  int *anExtent = anImageData->GetWholeExtent();
+  anImageData->SetUpdateExtent(anExtent[0], anExtent[1],
+                               anExtent[2], anExtent[3],
+                               0,0);
+  anImageData->UpdateData();
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::AddSkippedFrames()
+{
+  myErrorStatus = 0;
+
+  if(myFrameIndexes.size() < 2)
+    return;
+
+  size_t anId = 0, anEnd = myFrameIndexes.size() - 1;
+  for(; anId < anEnd; anId++){
+    int aStartIndex = myFrameIndexes[anId];
+    if(aStartIndex < 0)
+      continue;
+
+    int aFinishIndex = abs(myFrameIndexes[anId + 1]);
+    if(aStartIndex + 1 == aFinishIndex)
+      continue;
+
+    std::string anInitialName;
+    std::ostringstream aStream;
+    GetNameJPEG(myName,aStartIndex,anInitialName);
+    for(int anIndex = aStartIndex + 1; anIndex < aFinishIndex; anIndex++){
+      myNbWrittenFrames++;
+      std::string anCurrentName;
+      GetNameJPEG(myName,anIndex,anCurrentName);
+      aStream<<"ln -s "<< anInitialName<<" "<<anCurrentName<<";";
+      if(anIndex + 1 < aFinishIndex)
+        aStream<<" \\";
+      aStream<<endl;
+    }
+    std::string aString(aStream.str());
+    system(aString.c_str());
+    if(MYDEBUG) MESSAGE("VVTK_Recorder::AddSkippedFrames - "<<aString);
+  }
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Recorder
+::MakeFileAVI()
+{
+  myErrorStatus = 0;
+  std::ostringstream aStream;
+  aStream<<myNameAVIMaker<<
+    " -I p"<<
+    " -v 0"<<
+    //" -f "<<int(myNbFPS)<<" "<<
+    " -f "<<myNbFPS<<" "<<
+    " -n "<<myNbWrittenFrames<<" "<<
+    " -j "<<myName<<"_\%06d.jpeg "<<
+    "| yuv2lav"<<
+    " -o "<<myName;
+   
+  std::string aString(aStream.str());
+  myErrorStatus = system(aString.c_str());
+
+  if(MYDEBUG) MESSAGE("VVTK_Recorder::MakeFileAVI - "<<aString);
+
+  QFileInfo aFileInfo(myName.c_str());
+  QString aDirPath = aFileInfo.absoluteDir().path();
+  QString aBaseName = aFileInfo.fileName();
+  QString aCommand = 
+    QString("(cd ") + aDirPath + 
+    "; ls " +
+    " | egrep '" + aBaseName + "_[0-9]*.jpeg'" +
+    " | xargs rm " +
+    ")";
+
+  aCommand = 
+    QString("rm ") + aDirPath + "/" + aBaseName + "*.jpeg";
+
+  if(MYDEBUG) MESSAGE("VVTK_Recorder::MakeFileAVI - "<<aCommand.toLatin1().data() );
+  system((const char*)aCommand.toLatin1());
+}
diff --git a/src/VVTK/VVTK_Recorder.h b/src/VVTK/VVTK_Recorder.h
new file mode 100755 (executable)
index 0000000..f4f6c58
--- /dev/null
@@ -0,0 +1,165 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   : 
+//  Author : 
+//  Module : SALOME
+//  $Header$
+//
+#ifndef _VVTK_Recorder_Header_File_
+#define _VVTK_Recorder_Header_File_
+
+#include <list>
+#include <string>
+#include <vector>
+
+#include <vtkObject.h>
+
+class vtkRenderWindow;
+class vtkCallbackCommand;
+class vtkWindowToImageFilter;
+class VVTK_ImageWriterMgr;
+//
+class VVTK_Recorder : public vtkObject 
+{
+ protected:
+  enum State {
+    VVTK_Recorder_Unknown=0,
+    VVTK_Recorder_Record,
+    VVTK_Recorder_Stop
+  };
+  
+ public:
+  static VVTK_Recorder *New();
+  vtkTypeRevisionMacro(VVTK_Recorder,vtkObject);
+
+  void
+  SetRenderWindow(vtkRenderWindow* theRenderWindow);
+
+  vtkRenderWindow* 
+  RenderWindow();
+
+  void 
+  SetName(const char *theName);
+
+  const char* 
+  Name() const;
+
+  void
+  SetNbFPS(const double theNbFPS);
+
+  double
+  NbFPS() const;
+
+  void
+  SetQuality(int theQuality);
+
+  int
+  GetQuality() const;
+
+  void
+  SetProgressiveMode(bool theProgressiveMode);
+
+  bool
+  GetProgressiveMode() const;
+
+  void
+  SetUseSkippedFrames(bool theUseSkippedFrames);
+
+  bool
+  UseSkippedFrames() const;
+
+  void
+  Record();
+
+  void
+  Pause();
+
+  void
+  Stop();
+
+  int
+  State() const;
+
+  int  
+  ErrorStatus() const;
+
+  void
+  CheckExistAVIMaker();
+
+protected :
+  VVTK_Recorder();
+
+  ~VVTK_Recorder();
+
+  void
+  DoRecord();
+
+  void
+  MakeFileAVI();
+
+  void
+  AddSkippedFrames();
+
+  void
+  PreWrite();
+
+  static
+  void
+  ProcessEvents(vtkObject* theObject, 
+                unsigned long theEvent,
+                void* theClientData, 
+                void* theCallData);
+
+protected :
+  int myState;
+  int myPaused;
+  int myErrorStatus;
+
+  float myPriority;
+  double myTimeStart;
+
+  int myFrameIndex;
+  int myNbWrittenFrames;
+
+  double myNbFPS;
+  int myQuality;
+  bool myProgressiveMode;
+
+  typedef std::vector<int> TFrameIndexes;
+  TFrameIndexes myFrameIndexes;
+  bool myUseSkippedFrames;
+
+  std::string myName;
+  std::string myNameAVIMaker;
+
+  vtkCallbackCommand *myCommand;
+  vtkRenderWindow *myRenderWindow;
+  vtkWindowToImageFilter *myFilter;
+  VVTK_ImageWriterMgr *myWriterMgr;
+
+
+private:
+  VVTK_Recorder(const VVTK_Recorder&);  //Not implemented
+  void operator=(const VVTK_Recorder&); //Not implemented
+};
+#endif
diff --git a/src/VVTK/VVTK_RecorderDlg.cxx b/src/VVTK/VVTK_RecorderDlg.cxx
new file mode 100644 (file)
index 0000000..0904de5
--- /dev/null
@@ -0,0 +1,231 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  VISU VISUGUI : GUI of VISU component
+//  File   : VVTK_RecorderDlg.cxx
+//  Author : Oleg UVAROV
+//  Module : VISU
+//
+#include "VVTK_RecorderDlg.h"
+#include "VVTK_Recorder.h"
+#include <VisuGUI_GUITools.h>
+
+#include "SUIT_FileDlg.h"
+#include "SUIT_MessageBox.h"
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Session.h"
+
+#include <SalomeApp_DoubleSpinBox.h>
+#include <SalomeApp_IntSpinBox.h>
+
+#include "LightApp_Application.h"
+
+#include "CAM_Module.h"
+
+#include <QCheckBox>
+#include <QComboBox>
+#include <QGroupBox>
+#include <QKeyEvent>
+#include <QLabel>
+#include <QLayout>
+#include <QLineEdit>
+#include <QPushButton>
+
+/*!
+ * Constructor
+ */
+VVTK_RecorderDlg::VVTK_RecorderDlg( QWidget* theParent, VVTK_Recorder* theRecorder ):
+  QDialog( theParent ),
+  myRecorder( theRecorder )
+{
+  setWindowTitle( tr( "DLG_RECORDER_TITLE" ) );
+
+  SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
+
+  QVBoxLayout* aTopLayout = new QVBoxLayout( this );
+  aTopLayout->setSpacing( 6 );
+  aTopLayout->setMargin( 6 );
+  //aTopLayout->setAutoAdd( true );
+
+  // Settings
+  QGroupBox* mySettingsBox = new QGroupBox( tr( "SETTINGS" ), this );
+  //mySettingsBox->setColumnLayout( 0, Qt::Vertical );
+  //mySettingsBox->layout()->setSpacing( 0 );
+  //mySettingsBox->layout()->setMargin( 0 );
+
+  QGridLayout* aSettingsLayout = new QGridLayout( mySettingsBox );
+  aSettingsLayout->setSpacing( 6 );
+  aSettingsLayout->setMargin( 11 );
+
+  QLabel* aFileNameLabel = new QLabel( tr( "FILE_NAME" ), mySettingsBox );
+  myFileNameLineEdit = new QLineEdit( mySettingsBox );
+  myFileNameLineEdit->setMinimumWidth( 250 );
+  myFileNameLineEdit->setReadOnly( true );
+
+  QLabel* aRecordingModeLabel = new QLabel( tr( "RECORDING_MODE" ), mySettingsBox );
+  myRecordingModeComboBox = new QComboBox( mySettingsBox );
+  myRecordingModeComboBox->addItem( tr( "SKIPPED_FRAMES" ) );
+  myRecordingModeComboBox->addItem( tr( "ALL_DISLPAYED_FRAMES" ) );
+  myRecordingModeComboBox->setCurrentIndex( aResourceMgr->integerValue( "VISU", "recorder_mode", 1 ) );
+
+  QLabel* aFPSLabel = new QLabel( tr( "FPS" ), mySettingsBox );
+  myFPSSpinBox = new SalomeApp_DoubleSpinBox( mySettingsBox );
+  VISU::initSpinBox( myFPSSpinBox, 0.1, 100.0, 1.0, "parametric_precision" );
+  myFPSSpinBox->setValue( aResourceMgr->doubleValue( "VISU", "recorder_fps", 10.0 ) );
+
+  QLabel* aQualityLabel = new QLabel( tr( "QUALITY" ), mySettingsBox );
+  myQualitySpinBox = new SalomeApp_IntSpinBox( mySettingsBox );
+  VISU::initSpinBox( myQualitySpinBox, 1, 100, 1 );  
+  myQualitySpinBox->setValue( aResourceMgr->integerValue( "VISU", "recorder_quality", 80 ) );
+
+  myProgressiveCheckBox = new QCheckBox( tr( "PROGRESSIVE" ), mySettingsBox );
+  myProgressiveCheckBox->setChecked( aResourceMgr->booleanValue( "VISU", "recorder_progressive", false ) );
+
+  aSettingsLayout->addWidget( aFileNameLabel, 0, 0 );
+  aSettingsLayout->addWidget( myFileNameLineEdit, 1, 0, 1, 2 );
+  //aSettingsLayout->addWidget( aFileNameButton, 1, 2 );
+  aSettingsLayout->addWidget( aRecordingModeLabel, 2, 0 );
+  aSettingsLayout->addWidget( myRecordingModeComboBox, 2, 1 );
+  aSettingsLayout->addWidget( aFPSLabel, 3, 0 );
+  aSettingsLayout->addWidget( myFPSSpinBox, 3, 1 );
+  aSettingsLayout->addWidget( aQualityLabel, 4, 0 );
+  aSettingsLayout->addWidget( myQualitySpinBox, 4, 1 );
+  aSettingsLayout->addWidget( myProgressiveCheckBox, 5, 0 );
+
+  aTopLayout->addWidget( mySettingsBox );
+
+  // Start / Close
+  QGroupBox* CommonGroup = new QGroupBox( this );
+  //CommonGroup->setColumnLayout(0, Qt::Vertical );
+  //CommonGroup->layout()->setSpacing( 0 );
+  //CommonGroup->layout()->setMargin( 0 );
+  QGridLayout* CommonGroupLayout = new QGridLayout( CommonGroup );
+  CommonGroupLayout->setAlignment( Qt::AlignTop );
+  CommonGroupLayout->setSpacing( 6 );
+  CommonGroupLayout->setMargin( 11 );
+
+  QPushButton* aStartButton = new QPushButton( tr( "START" ), CommonGroup );
+  aStartButton->setAutoDefault( true );
+  aStartButton->setDefault( true );
+  CommonGroupLayout->addWidget( aStartButton, 0, 0 );
+  CommonGroupLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 );
+
+  QPushButton* aCloseButton = new QPushButton( tr( "CLOSE" ), CommonGroup );
+  aCloseButton->setAutoDefault( true );
+  CommonGroupLayout->addWidget( aCloseButton, 0, 2 );
+
+  QPushButton* aHelpButton = new QPushButton( tr( "HELP" ), CommonGroup );
+  aHelpButton->setAutoDefault( true );
+  CommonGroupLayout->addWidget( aHelpButton, 0, 3 );
+
+  aTopLayout->addWidget( CommonGroup );
+
+  connect( aStartButton, SIGNAL( clicked() ), this, SLOT( onStart() ) );
+  connect( aCloseButton, SIGNAL( clicked() ), this, SLOT( onClose() ) );
+  connect( aHelpButton,  SIGNAL( clicked() ), this, SLOT( onHelp() ) );
+}
+
+VVTK_RecorderDlg::~VVTK_RecorderDlg()
+{
+}
+
+void VVTK_RecorderDlg::onStart()
+{
+  if( myFileName.isNull() )
+    return;
+
+  myRecorder->SetName( (const char*)myFileName.toLatin1() );
+
+  myRecorder->SetUseSkippedFrames( myRecordingModeComboBox->currentIndex() == 0 );
+  myRecorder->SetNbFPS( myFPSSpinBox->value() );
+  myRecorder->SetQuality( myQualitySpinBox->value() );
+  myRecorder->SetProgressiveMode( myProgressiveCheckBox->isChecked() );
+
+  accept();
+
+}
+
+void VVTK_RecorderDlg::onClose()
+{
+  reject();
+}
+
+void VVTK_RecorderDlg::onHelp()
+{
+  QString aHelpFileName = "animation_in_gauss_viewer.htm";
+  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+  if (app)
+    app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
+  else {
+                QString platform;
+#ifdef WIN32
+                platform = "winapplication";
+#else
+                platform = "application";
+#endif
+    SUIT_MessageBox::warning(0, QObject::tr("WRN_WARNING"),
+                             QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+                             arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName) );
+  }
+}
+
+bool VVTK_RecorderDlg::onBrowseFile()
+{
+  QString aRootDir = QString( getenv( "VISU_ROOT_DIR") );
+
+  QStringList aFilter;
+  aFilter.append( tr( "FLT_AVI_FILES" ) );
+  aFilter.append( tr( "FLT_ALL_FILES" ) );
+
+  QString aFileName = SUIT_FileDlg::getFileName( this, getenv( "HOME" ), aFilter,
+                                                 tr( "FILE_NAME" ), false );
+
+  if( aFileName.isNull() )
+    return false;
+
+  myFileName = aFileName;
+  myFileNameLineEdit->setText( aFileName.section( '/', -1 ) );
+
+  return true;
+}
+
+int VVTK_RecorderDlg::exec()
+{
+  if( !onBrowseFile() )
+  {
+    reject();
+    return 0;
+  }
+  return QDialog::exec();
+}
+
+void VVTK_RecorderDlg::keyPressEvent( QKeyEvent* e )
+{
+  QDialog::keyPressEvent( e );
+  if ( e->isAccepted() )
+    return;
+
+  if ( e->key() == Qt::Key_F1 )
+    {
+      e->accept();
+      onHelp();
+    }
+}
diff --git a/src/VVTK/VVTK_RecorderDlg.h b/src/VVTK/VVTK_RecorderDlg.h
new file mode 100644 (file)
index 0000000..7bdf619
--- /dev/null
@@ -0,0 +1,83 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  VISU VISUGUI : GUI of VISU component
+//  File   : VVTK_RecorderDlg.h
+//  Author : Oleg UVAROV
+//  Module : VISU
+//  $Header$
+//
+#ifndef VVTK_RECORDERDLG_H
+#define VVTK_RECORDERDLG_H
+
+#include <QDateTime>
+#include <QDialog>
+
+class QCheckBox;
+class QComboBox;
+class QGroupBox;
+class QLCDNumber;
+class QLineEdit;
+class QPushButton;
+class QTimer;
+
+class SalomeApp_DoubleSpinBox;
+class SalomeApp_IntSpinBox;
+
+class VVTK_Recorder;
+
+//! Recorder Dialog.
+class VVTK_RecorderDlg : public QDialog
+{
+  Q_OBJECT
+
+public:
+  VVTK_RecorderDlg( QWidget*, VVTK_Recorder* );
+  ~VVTK_RecorderDlg();
+
+  int              exec();
+
+  QString          fileName() const { return myFileName; }
+
+private:
+  virtual void     keyPressEvent( QKeyEvent* );
+
+protected slots:
+  void             onStart();
+  void             onClose();
+  void             onHelp();
+
+  bool             onBrowseFile();
+
+private:
+  VVTK_Recorder*   myRecorder;
+  QString          myFileName;
+
+  QLineEdit*       myFileNameLineEdit;
+
+  QComboBox*        myRecordingModeComboBox;
+  SalomeApp_DoubleSpinBox* myFPSSpinBox;
+  SalomeApp_IntSpinBox*    myQualitySpinBox;
+  QCheckBox*        myProgressiveCheckBox;
+
+};
+
+#endif
diff --git a/src/VVTK/VVTK_Renderer.cxx b/src/VVTK/VVTK_Renderer.cxx
new file mode 100644 (file)
index 0000000..23cc1c5
--- /dev/null
@@ -0,0 +1,437 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   :
+//  Author :
+//  Module :
+//  $Header$
+//
+#include "VVTK_Renderer.h"
+
+#include "VISU_GaussPtsAct.h"
+#include "VISU_GaussPointsPL.hxx"
+#include "VISU_WidgetCtrl.hxx"
+#include "VISU_PlanesWidget.hxx"
+#include "VISU_SphereWidget.hxx"
+
+#include <VTKViewer_Algorithm.h>
+
+#include <vtkObjectFactory.h>
+#include <vtkProperty.h>
+#include <vtkPointPicker.h>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkCallbackCommand.h>
+#include <vtkCommand.h>
+#include <vtkPlane.h>
+
+#include <vtkPropCollection.h>
+#include <vtkProp.h>
+#include <vtkActor.h>
+#include <vtkMapper.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyData.h>
+#include <vtkTextMapper.h>
+#include <vtkTextActor.h> 
+#include <vtkTextProperty.h>
+#include <vtkRenderer.h>
+
+#include <vtkPropCollection.h>
+#include <vtkProp.h>
+#include <vtkActor.h>
+#include <vtkMapper.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyData.h>
+#include <vtkTextMapper.h>
+#include <vtkTextActor.h> 
+#include <vtkTextProperty.h>
+#include <vtkRenderer.h>
+
+#include "utilities.h"
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+//======================================================================
+class VISU_FPSActor : public vtkTextActor 
+{
+public:
+  vtkTypeMacro( VISU_FPSActor, vtkTextActor);
+  static
+  VISU_FPSActor* 
+  New();
+
+  virtual
+  int
+  RenderOpaqueGeometry(vtkViewport *theViewport);
+};
+
+//======================================================================
+vtkStandardNewMacro(VISU_FPSActor);
+
+//======================================================================
+// function: RenderOpaqueGeometry
+// purpose :
+//======================================================================
+int
+VISU_FPSActor
+::RenderOpaqueGeometry(vtkViewport *theViewport) 
+{
+  // It's impossible to render opaque geometry of text actor
+  // if the size of the viewport is less than 1.0
+  int *size = theViewport->GetSize();
+  if( size[0] <= 1.0 || size[1] <= 1.0 )
+    return 1;
+
+  if(vtkRenderer *aRenderer = dynamic_cast<vtkRenderer*>(theViewport)){
+    static float aTol = 1.e-6;
+    float aLastRenderTimeInSeconds = aRenderer->GetLastRenderTimeInSeconds();
+    if(aLastRenderTimeInSeconds > aTol){
+      size_t aNumberOfCells = 0;
+      VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
+      if(vtkActorCollection *anActorCollection = aCopy.GetActors()){
+        anActorCollection->InitTraversal();
+        while(vtkActor *anActor = anActorCollection->GetNextActor()){
+          if(anActor->GetVisibility()){
+            if(SALOME_Actor *aSActor = dynamic_cast<SALOME_Actor*>(anActor)){
+              if(vtkMapper *aMapper = aSActor->GetMapper()){
+                if(vtkDataSet *aDataSet = aMapper->GetInput()){
+                  aNumberOfCells += aDataSet->GetNumberOfCells();
+                }
+              }
+            }
+          }
+        }
+      }
+      std::ostringstream aStr;
+      float aFPS = 1.0 / aLastRenderTimeInSeconds;
+      aStr<<"FPS: "<<aFPS<<"\n NumberOfCells: "<<aNumberOfCells;
+      std::string anInput = aStr.str();
+      SetInput(anInput.c_str());
+      return Superclass::RenderOpaqueGeometry(theViewport);
+    }
+  }
+  return 1;
+}
+
+//----------------------------------------------------------------------------
+vtkStandardNewMacro(VVTK_Renderer);
+
+//----------------------------------------------------------------------------
+VVTK_Renderer
+::VVTK_Renderer():
+  myFPSActor(VISU_FPSActor::New()),
+  myInsideCursorSettings(NULL),
+  myPickingSettings(NULL),
+  myGaussPointPicker(vtkPointPicker::New()),
+  myGaussPreHighlightProperty(vtkProperty::New()),
+  myGaussHighlightProperty(vtkProperty::New())
+{
+  if(MYDEBUG) INFOS("VVTK_Renderer() - "<<this);
+
+  myFPSActor->Delete();
+
+  vtkTextMapper* aTextMapper = vtkTextMapper::New();
+  vtkTextProperty *aTextProperty = aTextMapper->GetTextProperty();
+  aTextProperty->SetJustificationToRight();
+  aTextProperty->SetVerticalJustificationToTop();
+  aTextProperty->SetFontSize(10);
+
+  myFPSActor->SetPickable(false); 
+  myFPSActor->ScaledTextOff();
+  myFPSActor->SetAlignmentPoint(8);
+  myFPSActor->SetPosition2 (1., 1.);
+  myFPSActor->SetMapper(aTextMapper);
+  aTextMapper->Delete();
+
+  //GetDevice()->AddActor2D(myFPSActor.GetPointer());
+
+  myGaussPointPicker->Delete();
+
+  myGaussPreHighlightProperty->Delete();
+  myGaussPreHighlightProperty->SetColor(0,1,1);
+
+  myGaussHighlightProperty->Delete();
+  myGaussHighlightProperty->SetColor(1,1,0);
+
+}
+
+VVTK_Renderer
+::~VVTK_Renderer()
+{
+  if(MYDEBUG) INFOS("~VVTK_Renderer() - "<<this);
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer
+::AddActor(VTKViewer_Actor* theActor)
+{
+  Superclass::AddActor(theActor);
+  if(VISU_GaussPtsAct* anActor = dynamic_cast<VISU_GaussPtsAct*>(theActor)){
+    anActor->SetPointPicker(myGaussPointPicker.GetPointer());
+    anActor->SetPreHighlightProperty(myGaussPreHighlightProperty.GetPointer());
+    anActor->SetHighlightProperty(myGaussHighlightProperty.GetPointer());
+
+    anActor->SetInsideCursorSettings(myInsideCursorSettings);
+    //anActor->SetPickingSettings(myPickingSettings);
+  }
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer
+::RemoveActor(VTKViewer_Actor* theActor)
+{
+  Superclass::RemoveActor(theActor);
+  if(VISU_GaussPtsAct* anActor = dynamic_cast<VISU_GaussPtsAct*>(theActor)){
+    anActor->SetPointPicker(NULL);
+    anActor->SetPreHighlightProperty(NULL);
+    anActor->SetHighlightProperty(NULL);
+
+    anActor->SetInsideCursorSettings(NULL);
+    //anActor->SetPickingSettings(NULL);
+  }
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer
+::SetInsideCursorSettings(VISU_InsideCursorSettings* theInsideCursorSettings)
+{
+  myInsideCursorSettings = theInsideCursorSettings;
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer
+::SetPickingSettings(VISU_PickingSettings* thePickingSettings)
+{
+  myPickingSettings = thePickingSettings;
+}
+
+
+//----------------------------------------------------------------------------
+vtkStandardNewMacro(VVTK_Renderer1);
+
+//----------------------------------------------------------------------------
+VVTK_Renderer1::VVTK_Renderer1():
+  myWidgetCtrl(VISU_WidgetCtrl::New()),
+  myOutsideCursorSettings(NULL)
+{
+  if(MYDEBUG) INFOS("VVTK_Renderer1() - "<<this);
+
+  myWidgetCtrl->SetPlaceFactor(1.1);
+  //
+  VISU_PlanesWidget *aPlanesWidget = myWidgetCtrl->GetPlanesWidget();
+  aPlanesWidget->SetOutlineTranslation(false);
+  vtkProperty* aSelectedPlaneProperty = aPlanesWidget->GetSelectedPlaneProperty();
+  vtkProperty* aPlaneProperty = aPlanesWidget->GetPlaneProperty();
+  aPlaneProperty->SetOpacity(aSelectedPlaneProperty->GetOpacity()*1.5);
+  //
+  //myWidgetCtrl->Delete();
+}
+
+VVTK_Renderer1
+::~VVTK_Renderer1()
+{
+  if(MYDEBUG) INFOS("~VVTK_Renderer1() - "<<this);
+  myWidgetCtrl->SetInteractor(NULL);
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer1
+::AddActor(VTKViewer_Actor* theActor)
+{
+  Superclass::AddActor(theActor);
+  if(VISU_GaussPtsAct1* anActor = dynamic_cast<VISU_GaussPtsAct1*>(theActor)){
+    anActor->SetWidgetCtrl(GetWidgetCtrl());
+    anActor->SetOutsideCursorSettings(myOutsideCursorSettings);
+    AdjustWidgetCtrl();
+  }
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer1
+::RemoveActor(VTKViewer_Actor* theActor)
+{
+  Superclass::RemoveActor(theActor);
+  if(VISU_GaussPtsAct1* anActor = dynamic_cast<VISU_GaussPtsAct1*>(theActor)){
+    anActor->SetWidgetCtrl(NULL);
+    anActor->SetOutsideCursorSettings(NULL);
+    AdjustWidgetCtrl();
+  }
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer1
+::AdjustWidgetCtrl()
+{
+  VISU_PlanesWidget *aPlanesWidget = myWidgetCtrl->GetPlanesWidget();
+  aPlanesWidget->InitialPlaceWidget(myBndBox);
+  aPlanesWidget->SetOrigin(0.5*(myBndBox[1] + myBndBox[0]),
+                           0.5*(myBndBox[3] + myBndBox[2]),
+                           0.5*(myBndBox[5] + myBndBox[4]));
+  //
+  VISU_SphereWidget *aSphereWidget = myWidgetCtrl->GetSphereWidget();
+  aSphereWidget->SetCenter(0.5*(myBndBox[1] + myBndBox[0]),
+                           0.5*(myBndBox[3] + myBndBox[2]),
+                           0.5*(myBndBox[5] + myBndBox[4]));
+  
+  float aMinLength = VTK_LARGE_FLOAT;
+  for (int i=0; i<3; ++i) {
+    float aLength = myBndBox[2*i+1]-myBndBox[2*i];
+    aMinLength = std::min(aMinLength,aLength);
+  }
+  aSphereWidget->SetRadius(aMinLength);
+}
+
+//----------------------------------------------------------------------------
+void 
+VVTK_Renderer1
+::Initialize(vtkRenderWindowInteractor* theInteractor,
+             SVTK_Selector* theSelector)
+{
+  SVTK_Renderer::Initialize(theInteractor,theSelector);
+  myWidgetCtrl->SetInteractor(theInteractor);
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer1
+::SetOutsideCursorSettings(VISU_OutsideCursorSettings* theOutsideCursorSettings)
+{
+  myOutsideCursorSettings = theOutsideCursorSettings;
+}
+
+//----------------------------------------------------------------------------
+VISU_WidgetCtrl* 
+VVTK_Renderer1
+::GetWidgetCtrl()
+{
+  return myWidgetCtrl;//.GetPointer();
+}
+
+//----------------------------------------------------------------------------
+bool
+VVTK_Renderer1
+::OnAdjustActors()
+{
+  return SVTK_Renderer::OnAdjustActors();
+}
+
+
+//----------------------------------------------------------------------------
+vtkStandardNewMacro(VVTK_Renderer2);
+
+//----------------------------------------------------------------------------
+VVTK_Renderer2
+::VVTK_Renderer2():
+  myEventCallbackCommand(vtkCallbackCommand::New())
+{
+  if(MYDEBUG) INFOS("VVTK_Renderer2() - "<<this);
+  myEventCallbackCommand->Delete();
+
+  myPriority = 0.0;
+  myEventCallbackCommand->SetClientData(this); 
+  myEventCallbackCommand->SetCallback(VVTK_Renderer2::ProcessEvents);
+}
+
+VVTK_Renderer2
+::~VVTK_Renderer2()
+{
+  if(MYDEBUG) INFOS("~VVTK_Renderer2() - "<<this);
+}
+
+//----------------------------------------------------------------------------
+void VVTK_Renderer2::SetWidgetCtrl(VISU_WidgetCtrl* theWidgetCtrl)
+{
+  theWidgetCtrl->AddObserver(vtkCommand::EndInteractionEvent, 
+                             myEventCallbackCommand.GetPointer(), 
+                             myPriority);
+  theWidgetCtrl->AddObserver(vtkCommand::EnableEvent, 
+                             myEventCallbackCommand.GetPointer(), 
+                             myPriority);
+  theWidgetCtrl->AddObserver(vtkCommand::DisableEvent, 
+                             myEventCallbackCommand.GetPointer(), 
+                             myPriority);
+  myWidgetCtrl = theWidgetCtrl;
+}
+
+void 
+VVTK_Renderer2
+::ProcessEvents(vtkObject* vtkNotUsed(theObject), 
+                unsigned long theEvent,
+                void* theClientData, 
+                void* vtkNotUsed(theCallData))
+{
+  VVTK_Renderer2* self = reinterpret_cast<VVTK_Renderer2*>(theClientData);
+
+  switch(theEvent){
+  case vtkCommand::EnableEvent:
+  case vtkCommand::EndInteractionEvent:
+    self->OnEndInteractionEvent();  
+    break;
+  }
+}
+
+void
+VVTK_Renderer2
+::OnEndInteractionEvent()
+{
+  AdjustActors();
+  myInteractor->Render();
+}
+
+
+//----------------------------------------------------------------------------
+void VVTK_Renderer2::AddActor(VTKViewer_Actor* theActor)
+{
+  if(VISU_GaussPtsAct1* anActor = dynamic_cast<VISU_GaussPtsAct1*>(theActor)){
+    if(VISU::TGaussPtsActorFactory* aFactory = anActor->GetGaussPtsFactory()){
+      if(VISU_GaussPtsAct2* anActor2 = aFactory->CloneActor(anActor)){
+        anActor2->SetWidgetCtrl(myWidgetCtrl);
+        Superclass::AddActor(anActor2);
+      }
+    }
+  }
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_Renderer2
+::RemoveActor(VTKViewer_Actor* theActor)
+{
+  using namespace VISU;  
+  if(VISU_GaussPtsAct2* anActor = dynamic_cast<VISU_GaussPtsAct2*>(theActor)){
+    anActor->SetWidgetCtrl(NULL);
+    Superclass::RemoveActor(theActor);
+  }
+}
diff --git a/src/VVTK/VVTK_Renderer.h b/src/VVTK/VVTK_Renderer.h
new file mode 100644 (file)
index 0000000..ae558db
--- /dev/null
@@ -0,0 +1,179 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   : 
+//  Author : 
+//  Module : SALOME
+//  $Header$
+//
+#ifndef VVTK_Renderer_h
+#define VVTK_Renderer_h
+
+#include "VVTK.h"
+
+#include "SVTK_Renderer.h"
+
+class VISU_WidgetCtrl;
+class VISU_InsideCursorSettings;
+class VISU_OutsideCursorSettings;
+class VISU_PickingSettings;
+class VISU_FPSActor;
+
+class vtkPointPicker;
+class vtkImplicitFunction;
+
+//----------------------------------------------------------------------------
+//! To customize SVTK_Renderer according to VVTK functionality
+class VVTK_EXPORT VVTK_Renderer : public SVTK_Renderer
+{
+ public:
+  vtkTypeMacro(VVTK_Renderer,SVTK_Renderer);
+  static VVTK_Renderer* New();
+
+  //! Reimplement SVTK_Renderer::AddActor
+  /*!
+    Perform an additional action - apply picking settings on the published VISU_GaussPtsAct actors
+  */
+  virtual
+  void 
+  AddActor(VTKViewer_Actor* theActor);
+
+  //! Reimplement SVTK_Renderer::RemoveActor (remove additional settings)
+  virtual
+  void 
+  RemoveActor(VTKViewer_Actor* theActor);
+
+  //! To set VISU_PickingSettings to share them among all VISU_GaussPtsAct actors published into the view 
+  void
+  SetInsideCursorSettings(VISU_InsideCursorSettings* theInsideCursorSettings);
+
+  void
+  SetPickingSettings(VISU_PickingSettings* thePickingSettings);
+
+ protected:
+  VVTK_Renderer();
+  ~VVTK_Renderer();
+
+  VISU_PickingSettings* myPickingSettings; //! Keeps reference of the VISU_PickingSettings
+  VISU_InsideCursorSettings* myInsideCursorSettings; //! Keeps reference of the VISU_InsideCursorSettings
+  vtkSmartPointer<VISU_FPSActor> myFPSActor; //!< To show FPS of the rendering at run-time
+
+  vtkSmartPointer<vtkPointPicker> myGaussPointPicker;
+  vtkSmartPointer<vtkProperty>    myGaussPreHighlightProperty;
+  vtkSmartPointer<vtkProperty>    myGaussHighlightProperty;
+};
+
+
+//----------------------------------------------------------------------------
+//! To extend VVTK_Renderer to implement base view functionality
+class VVTK_EXPORT VVTK_Renderer1 : public VVTK_Renderer
+{
+ public:
+  vtkTypeMacro(VVTK_Renderer1,VVTK_Renderer);
+  static VVTK_Renderer1* New();
+
+  //! Reimplement SVTK_Renderer::Initialize
+  virtual
+  void 
+  Initialize(vtkRenderWindowInteractor* theInteractor,
+             SVTK_Selector* theSelector);
+
+  //! Reimplement VVTK_Renderer::AddActor to apply to the actor additional settings
+  virtual
+  void 
+  AddActor(VTKViewer_Actor* theActor);
+
+  //! Reimplement VVTK_Renderer::RemoveActor
+  virtual
+  void 
+  RemoveActor(VTKViewer_Actor* theActor);
+
+  //! To set VISU_PickingSettings to share them among all VISU_GaussPtsAct1 actors published into the view 
+  void
+  SetOutsideCursorSettings(VISU_OutsideCursorSettings* theOutsideCursorSettings);
+
+  VISU_WidgetCtrl*  GetWidgetCtrl();
+
+ protected:
+  VVTK_Renderer1();
+  ~VVTK_Renderer1();
+
+  //! Reimplement VVTK_Renderer::OnAdjustActors
+  virtual
+  bool
+  OnAdjustActors();
+
+  void AdjustWidgetCtrl();
+
+  VISU_WidgetCtrl* myWidgetCtrl;
+  //vtkSmartPointer<VISU_WidgetCtrl> myWidgetCtrl;
+  VISU_OutsideCursorSettings* myOutsideCursorSettings;
+  vtkSmartPointer<VISU_FPSActor> myTextActor;
+};
+
+
+//----------------------------------------------------------------------------
+class VVTK_EXPORT VVTK_Renderer2 : public VVTK_Renderer
+{
+ public:
+  vtkTypeMacro(VVTK_Renderer2,VVTK_Renderer);
+  static VVTK_Renderer2* New();
+
+  //! Reimplement VVTK_Renderer::AddActor to apply to the actor additional settings
+  virtual
+  void 
+  AddActor(VTKViewer_Actor* theActor);
+
+  //! Reimplement VVTK_Renderer::RemoveActor
+  virtual
+  void 
+  RemoveActor(VTKViewer_Actor* theActor);
+
+  void SetWidgetCtrl(VISU_WidgetCtrl* theWidgetCtrl);
+
+  //! To handle vtkCommand::EndInteractionEvent to redraw the view
+  void
+  OnEndInteractionEvent();
+
+ protected:
+  VVTK_Renderer2();
+  ~VVTK_Renderer2();
+
+  //! Main process VTK event method
+  static
+  void
+  ProcessEvents(vtkObject* theObject, 
+                unsigned long theEvent,
+                void* theClientData, 
+                void* theCallData);
+
+  //! Used to process VTK events
+  vtkSmartPointer<vtkCallbackCommand> myEventCallbackCommand;
+
+  //! Priority at which events are processed
+  float myPriority;
+
+  VISU_WidgetCtrl* myWidgetCtrl;
+};
+
+
+#endif
diff --git a/src/VVTK/VVTK_SegmentationCursorDlg.cxx b/src/VVTK/VVTK_SegmentationCursorDlg.cxx
new file mode 100644 (file)
index 0000000..8190bb3
--- /dev/null
@@ -0,0 +1,871 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VVTK_SegmentationCursorDlg.cxx
+//  Author : Oleg Uvarov
+//  Module : VISU
+//
+#include "VVTK_SegmentationCursorDlg.h"
+#include "VVTK_PrimitiveBox.h"
+#include "VVTK_SizeBox.h"
+#include <VisuGUI_GUITools.h>
+
+#include "VISU_GaussPtsAct.h"
+#include "VISU_GaussPtsSettings.h"
+
+#include "VISU_WidgetCtrl.hxx"
+#include "VISU_PlanesWidget.hxx"
+#include "VISU_SphereWidget.hxx"
+
+#include "VISU_GaussPointsPL.hxx"
+#include "VISU_OpenGLPointSpriteMapper.hxx"
+
+#include <LightApp_Application.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
+
+#include <SVTK_RenderWindowInteractor.h>
+#include <VTKViewer_Algorithm.h>
+
+#include <vtkActorCollection.h>
+#include <vtkCallbackCommand.h>
+#include <vtkObjectFactory.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkSmartPointer.h>
+#include <vtkImageData.h>
+
+#include "utilities.h"
+
+#include <QButtonGroup>
+#include <QColorDialog>
+#include <QFileDialog>
+#include <QGroupBox>
+#include <QKeyEvent>
+#include <QLabel>
+#include <QLayout>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QRadioButton>
+#include <QTabWidget>
+
+#include <QtxAction.h>
+#include <SalomeApp_DoubleSpinBox.h>
+#include <SalomeApp_IntSpinBox.h>
+#include <CAM_Module.h>
+
+//----------------------------------------------------------------
+VVTK_SegmentationCursorDlg::VVTK_SegmentationCursorDlg( QWidget* parent, const char* name )
+  :QDialog( parent,
+            Qt::WindowTitleHint | Qt::WindowSystemMenuHint ),
+   myEventCallbackCommand( vtkCallbackCommand::New() ),
+   myInsideCursorSettings( VISU_InsideCursorSettings::New() ),
+   myOutsideCursorSettings( VISU_OutsideCursorSettings::New() ),
+   myIsPlaneSegmentation( true ),
+   myWidgetCtrl(NULL),
+   myInteractor(NULL)
+{
+  setAccessibleName( name );
+
+  myPriority = 0.0;
+  myEventCallbackCommand->Delete();
+  myEventCallbackCommand->SetClientData(this); 
+  myEventCallbackCommand->SetCallback(VVTK_SegmentationCursorDlg::ProcessEvents);
+
+  myInsideCursorSettings->AddObserver(VISU::UpdateFromSettingsEvent, 
+                                      myEventCallbackCommand.GetPointer(), 
+                                      myPriority);
+
+  setWindowTitle( tr( "SEGMENTATION_CURSOR_DLG_TITLE" ) );
+  setSizeGripEnabled(TRUE);
+
+  QVBoxLayout* TopLayout = new QVBoxLayout( this );
+  TopLayout->setSpacing(6);
+  TopLayout->setMargin(11);
+
+  myTabBox = new QTabWidget( this );
+
+  // Segmentation cursor pane
+  mySegmentationCursorBox = new QWidget( this );
+  QVBoxLayout* SCBoxLayout = new QVBoxLayout( mySegmentationCursorBox );
+  SCBoxLayout->setMargin(11);
+  SCBoxLayout->setSpacing(6);
+  SCBoxLayout->setAlignment(Qt::AlignTop);
+
+  // Origin
+  myOriginGroup = new QGroupBox( tr( "ORIGIN_TITLE" ), mySegmentationCursorBox );
+  //myOriginGroup->setColumnLayout( 0, Qt::Vertical );
+  //myOriginGroup->layout()->setSpacing( 0 );
+  //myOriginGroup->layout()->setMargin( 0 );
+
+  QGridLayout* OriginGroupLayout = new QGridLayout( myOriginGroup );
+  OriginGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  OriginGroupLayout->setSpacing(6);
+  OriginGroupLayout->setMargin(11);
+
+  QLabel* XOriginLabel = new QLabel( tr( "ORIGIN_X" ), myOriginGroup );
+  myXOriginSpinBox = new SalomeApp_DoubleSpinBox( myOriginGroup );
+  VISU::initSpinBox( myXOriginSpinBox, -1000.0, 1000.0, 0.1, "length_precision" );  
+  myXOriginSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myXOriginSpinBox->setMinimumWidth( 100 );
+  myXOriginSpinBox->setValue( 0.0 );
+
+  QLabel* YOriginLabel = new QLabel( tr( "ORIGIN_Y" ), myOriginGroup );
+  myYOriginSpinBox = new SalomeApp_DoubleSpinBox( myOriginGroup );
+  VISU::initSpinBox( myYOriginSpinBox, -1000.0, 1000.0, 0.1, "length_precision" );    
+  myYOriginSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myYOriginSpinBox->setMinimumWidth( 100 );
+  myYOriginSpinBox->setValue( 0.0 );
+
+  QLabel* ZOriginLabel = new QLabel( tr( "ORIGIN_Z" ), myOriginGroup );
+  myZOriginSpinBox = new SalomeApp_DoubleSpinBox( myOriginGroup );
+  VISU::initSpinBox( myZOriginSpinBox, -1000.0, 1000.0, 0.1, "length_precision" );    
+  //myZOriginSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myZOriginSpinBox->setMinimumWidth( 100 );
+  myZOriginSpinBox->setValue( 1.0 );
+
+  OriginGroupLayout->addWidget(   XOriginLabel,   0, 0 );
+  OriginGroupLayout->addWidget( myXOriginSpinBox, 0, 1 );
+  OriginGroupLayout->addWidget(   YOriginLabel,   0, 2 );
+  OriginGroupLayout->addWidget( myYOriginSpinBox, 0, 3 );
+  OriginGroupLayout->addWidget(   ZOriginLabel,   0, 4 );
+  OriginGroupLayout->addWidget( myZOriginSpinBox, 0, 5 );
+
+  SCBoxLayout->addWidget( myOriginGroup );
+
+  // Direction ( Plane Segmentation )
+  myDirectionGroup = new QGroupBox( tr( "DIRECTION_TITLE" ), mySegmentationCursorBox );
+  //myDirectionGroup->setColumnLayout( 0, Qt::Vertical );
+  //myDirectionGroup->layout()->setSpacing( 0 );
+  //myDirectionGroup->layout()->setMargin( 0 );
+
+  QGridLayout* DirectionGroupLayout = new QGridLayout( myDirectionGroup );
+  DirectionGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  DirectionGroupLayout->setSpacing(6);
+  DirectionGroupLayout->setMargin(11);
+
+  QLabel* DXDirectionLabel = new QLabel( tr( "DIRECTION_DX" ), myDirectionGroup );
+  myDXDirectionSpinBox = new SalomeApp_DoubleSpinBox( myDirectionGroup );
+  VISU::initSpinBox( myDXDirectionSpinBox, -1.0, 1.0, 0.1, "length_precision" );    
+  myDXDirectionSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myDXDirectionSpinBox->setMinimumWidth( 100 );
+  myDXDirectionSpinBox->setValue( 0.0 );
+
+  QLabel* DYDirectionLabel = new QLabel( tr( "DIRECTION_DY" ), myDirectionGroup );
+  myDYDirectionSpinBox = new SalomeApp_DoubleSpinBox( myDirectionGroup );
+  VISU::initSpinBox( myDYDirectionSpinBox, -1.0, 1.0, 0.1, "length_precision" );
+  myDYDirectionSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myDYDirectionSpinBox->setMinimumWidth( 100 );
+  myDYDirectionSpinBox->setValue( 0.0 );
+
+  QLabel* DZDirectionLabel = new QLabel( tr( "DIRECTION_DZ" ), myDirectionGroup );
+  myDZDirectionSpinBox = new SalomeApp_DoubleSpinBox( myDirectionGroup );
+  VISU::initSpinBox( myDZDirectionSpinBox, -1.0, 1.0, 0.1, "length_precision" );  
+  myDZDirectionSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myDZDirectionSpinBox->setMinimumWidth( 100 );
+  myDZDirectionSpinBox->setValue( 1.0 );
+
+  DirectionGroupLayout->addWidget(   DXDirectionLabel,   0, 0 );
+  DirectionGroupLayout->addWidget( myDXDirectionSpinBox, 0, 1 );
+  DirectionGroupLayout->addWidget(   DYDirectionLabel,   0, 2 );
+  DirectionGroupLayout->addWidget( myDYDirectionSpinBox, 0, 3 );
+  DirectionGroupLayout->addWidget(   DZDirectionLabel,   0, 4 );
+  DirectionGroupLayout->addWidget( myDZDirectionSpinBox, 0, 5 );
+
+  SCBoxLayout->addWidget( myDirectionGroup );
+
+  // Depth ( Plane Segmentation )
+  myDepthGroup = new QGroupBox( tr( "DEPTH_TITLE" ), mySegmentationCursorBox );
+  //myDepthGroup->setColumnLayout( 0, Qt::Vertical );
+  //myDepthGroup->layout()->setSpacing( 0 );
+  //myDepthGroup->layout()->setMargin( 0 );
+
+  QGridLayout* DepthGroupLayout = new QGridLayout( myDepthGroup );
+  DepthGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  DepthGroupLayout->setSpacing(6);
+  DepthGroupLayout->setMargin(11);
+
+  QLabel* DepthLabel = new QLabel( tr( "DEPTH" ), myDepthGroup );
+  myDepthSpinBox = new SalomeApp_DoubleSpinBox( myDepthGroup );
+  VISU::initSpinBox( myDepthSpinBox, 0.0, VTK_LARGE_FLOAT, 0.1, "length_precision" );  
+  myDepthSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myDepthSpinBox->setMinimumWidth( 100 );
+  myDepthSpinBox->setValue( 1.0 );
+
+  DepthGroupLayout->addWidget(   DepthLabel,   0, 0 );
+  DepthGroupLayout->addWidget( myDepthSpinBox, 0, 1 );
+
+  SCBoxLayout->addWidget( myDepthGroup );
+
+  // Radius ( Sphere Segmentation )
+  myRadiusGroup = new QGroupBox( tr( "RADIUS_TITLE" ), mySegmentationCursorBox );
+  //myRadiusGroup->setColumnLayout( 0, Qt::Vertical );
+  //myRadiusGroup->layout()->setSpacing( 0 );
+  //myRadiusGroup->layout()->setMargin( 0 );
+
+  QGridLayout* RadiusGroupLayout = new QGridLayout( myRadiusGroup );
+  RadiusGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  RadiusGroupLayout->setSpacing(6);
+  RadiusGroupLayout->setMargin(11);
+
+  QLabel* RadiusLabel = new QLabel( tr( "RADIUS" ),myRadiusGroup  );
+  myRadiusSpinBox = new SalomeApp_DoubleSpinBox( myRadiusGroup  );
+  VISU::initSpinBox( myRadiusSpinBox, 0.0, 1000.0, 1.0, "length_precision" );    
+  myRadiusSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myRadiusSpinBox->setMinimumWidth( 100 );
+  myRadiusSpinBox->setValue( 100.0 );
+
+  QLabel* RatioLabel = new QLabel( tr( "RATIO" ), myRadiusGroup );
+  myRatioSpinBox = new SalomeApp_DoubleSpinBox( myRadiusGroup );
+  VISU::initSpinBox( myRatioSpinBox, 0.1, 10.0, 0.1, "parametric_precision" );
+  myRatioSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  myRatioSpinBox->setMinimumWidth( 100 );
+  myRatioSpinBox->setValue( 2.0 );
+
+  RadiusGroupLayout->addWidget( RadiusLabel,     0, 0 );
+  RadiusGroupLayout->addWidget( myRadiusSpinBox, 0, 1 );
+  RadiusGroupLayout->addWidget( RatioLabel,      0, 2 );
+  RadiusGroupLayout->addWidget( myRatioSpinBox,  0, 3 );
+
+  SCBoxLayout->addWidget( myRadiusGroup );
+
+  myTabBox->addTab( mySegmentationCursorBox, tr( "SEGMENTATION_CURSOR_TAB" ) );
+
+  // Gauss points pane
+  myGaussPointsBox = new QWidget( this );
+  QVBoxLayout* GPBoxLayout = new QVBoxLayout( myGaussPointsBox );
+  GPBoxLayout->setMargin(11);
+  GPBoxLayout->setSpacing(6);
+
+  // Inside Gauss points
+  QGroupBox* anInsideGroup = new QGroupBox( tr( "INSIDE_GAUSS_POINTS" ), myGaussPointsBox );
+  //anInsideGroup->setColumnLayout( 0, Qt::Vertical );
+  //anInsideGroup->layout()->setSpacing( 0 );
+  //anInsideGroup->layout()->setMargin( 0 );
+
+  QGridLayout* anInsideGroupLayout = new QGridLayout( anInsideGroup );
+  anInsideGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  anInsideGroupLayout->setSpacing(6);
+  anInsideGroupLayout->setMargin(11);
+
+  // Primitive
+  myInsidePrimitiveBox = new VVTK_PrimitiveBox( anInsideGroup );
+
+  // Size
+  myInsideSizeBox = new VVTK_SizeBox( anInsideGroup );
+  myInsideSizeBox->setType( VVTK_SizeBox::Inside );
+
+  anInsideGroupLayout->addWidget( myInsidePrimitiveBox, 0, 0 );
+  anInsideGroupLayout->addWidget( myInsideSizeBox, 1, 0 );
+
+  GPBoxLayout->addWidget( anInsideGroup );
+
+  // Outside Gauss points
+  QGroupBox* anOutsideGroup = new QGroupBox( tr( "OUTSIDE_GAUSS_POINTS" ), myGaussPointsBox );
+  //anOutsideGroup->setColumnLayout( 0, Qt::Vertical );
+  //anOutsideGroup->layout()->setSpacing( 0 );
+  //anOutsideGroup->layout()->setMargin( 0 );
+
+  QGridLayout* anOutsideGroupLayout = new QGridLayout( anOutsideGroup );
+  anOutsideGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  anOutsideGroupLayout->setSpacing(6);
+  anOutsideGroupLayout->setMargin(11);
+
+  // Primitive
+  myOutsidePrimitiveBox = new VVTK_PrimitiveBox( anOutsideGroup );
+
+  // Size
+  myOutsideSizeBox = new VVTK_SizeBox( anOutsideGroup );
+  myOutsideSizeBox->setType( VVTK_SizeBox::Outside );
+
+  anOutsideGroupLayout->addWidget( myOutsidePrimitiveBox, 0, 0 );
+  anOutsideGroupLayout->addWidget( myOutsideSizeBox, 1, 0 );
+
+  GPBoxLayout->addWidget( anOutsideGroup );
+
+  // Magnification
+  QGroupBox* MagnificationGroup = new QGroupBox ( tr( "MAGNIFICATION_TITLE" ), myGaussPointsBox );
+  //MagnificationGroup->setColumnLayout(0, Qt::Vertical );
+  //MagnificationGroup->layout()->setSpacing( 0 );
+  //MagnificationGroup->layout()->setMargin( 0 );
+
+  QGridLayout* MagnificationGroupLayout = new QGridLayout ( MagnificationGroup );
+  MagnificationGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  MagnificationGroupLayout->setSpacing(6);
+  MagnificationGroupLayout->setMargin(11);
+
+  myMagnificationLabel = new QLabel( tr( "MAGNIFICATION" ), MagnificationGroup );
+  myMagnificationSpinBox = new SalomeApp_IntSpinBox( MagnificationGroup );
+  VISU::initSpinBox( myMagnificationSpinBox,  1, 10000, 10 );  
+  myMagnificationSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  MagnificationGroupLayout->addWidget( myMagnificationLabel, 0, 0 );
+  MagnificationGroupLayout->addWidget( myMagnificationSpinBox, 0, 1 );
+
+  // Increment
+  myIncrementLabel = new QLabel( tr( "INCREMENT" ), MagnificationGroup );
+  myIncrementSpinBox = new SalomeApp_DoubleSpinBox( MagnificationGroup );
+  VISU::initSpinBox( myIncrementSpinBox, 0.01, 10, 0.1, "parametric_precision" );    
+  myIncrementSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  MagnificationGroupLayout->addWidget( myIncrementLabel, 0, 2 );
+  MagnificationGroupLayout->addWidget( myIncrementSpinBox, 0, 3 );
+
+
+  myTabBox->addTab( myGaussPointsBox, tr( "GAUSS_POINTS_TAB" ) );
+  //myTabBox->showPage( myGaussPointsBox );
+  myTabBox->setCurrentWidget( myGaussPointsBox );
+
+  GPBoxLayout->addWidget( MagnificationGroup );
+
+
+  // Common buttons ===========================================================
+  QGroupBox* GroupButtons = new QGroupBox( this );
+  //GroupButtons->setColumnLayout(0, Qt::Vertical );
+  //GroupButtons->layout()->setSpacing( 0 );
+  //GroupButtons->layout()->setMargin( 0 );
+  QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons );
+  GroupButtonsLayout->setAlignment( Qt::AlignTop );
+  GroupButtonsLayout->setSpacing( 6 );
+  GroupButtonsLayout->setMargin( 11 );
+
+  QPushButton* buttonApply = new QPushButton( tr( "&Apply" ), GroupButtons );
+  buttonApply->setAutoDefault( TRUE );
+  buttonApply->setDefault( TRUE );
+  GroupButtonsLayout->addWidget( buttonApply, 0, 0 );
+  GroupButtonsLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 );
+
+  QPushButton* buttonClose = new QPushButton( tr( "&Close" ) , GroupButtons );
+  buttonClose->setAutoDefault( TRUE );
+  GroupButtonsLayout->addWidget( buttonClose, 0, 2 );
+
+  QPushButton* buttonHelp = new QPushButton( tr( "&Help" ) , GroupButtons );
+  buttonHelp->setAutoDefault( TRUE );
+  GroupButtonsLayout->addWidget( buttonHelp, 0, 3 );
+
+  TopLayout->addWidget( myTabBox );
+  TopLayout->addWidget( GroupButtons );
+
+  connect( buttonApply, SIGNAL( clicked() ), this, SLOT( onClickApply() ) );
+  connect( buttonClose, SIGNAL( clicked() ), this, SLOT( onClickClose() ) );
+  connect( buttonHelp,  SIGNAL( clicked() ), this, SLOT( onClickHelp() ) );
+
+  connect(parent, SIGNAL(Show( QShowEvent * )), this, SLOT(onParentShow()));
+  connect(parent, SIGNAL(Hide( QHideEvent * )), this, SLOT(onParentHide()));
+}
+
+VVTK_SegmentationCursorDlg::~VVTK_SegmentationCursorDlg()
+{
+  SetWidgetCtrl(NULL);
+}
+
+float VVTK_SegmentationCursorDlg::getMagnification() const
+{
+  return myMagnificationSpinBox->value() / 100.0;
+}
+
+void VVTK_SegmentationCursorDlg::setMagnification( float theMagnification )
+{
+  myMagnificationSpinBox->setValue( ( int )( theMagnification * 100 ) );
+}
+
+float VVTK_SegmentationCursorDlg::getIncrement() const
+{
+  return myIncrementSpinBox->value();
+}
+
+void VVTK_SegmentationCursorDlg::setIncrement( float theIncrement )
+{
+  myIncrementSpinBox->setValue( theIncrement );
+}
+
+
+void VVTK_SegmentationCursorDlg::SetWidgetCtrl( VISU_WidgetCtrl* theWidgetCtrl )
+{
+  if(myWidgetCtrl == theWidgetCtrl)
+    return;
+
+  if(myWidgetCtrl)
+    myWidgetCtrl->RemoveObserver(myEventCallbackCommand.GetPointer());
+
+  myWidgetCtrl = theWidgetCtrl;
+
+  if(theWidgetCtrl)
+    theWidgetCtrl->AddObserver(vtkCommand::EndInteractionEvent, 
+                               myEventCallbackCommand.GetPointer(), 
+                               myPriority);
+}
+
+void VVTK_SegmentationCursorDlg::ProcessEvents(vtkObject* vtkNotUsed(theObject), 
+                                               unsigned long theEvent,
+                                               void* theClientData, 
+                                               void* vtkNotUsed(theCallData))
+{
+  VVTK_SegmentationCursorDlg* self = reinterpret_cast<VVTK_SegmentationCursorDlg*>(theClientData);
+
+  switch(theEvent){
+  case vtkCommand::EndInteractionEvent:
+    self->UpdateSegmentation();
+    break;
+  case VISU::UpdateFromSettingsEvent:
+    self->GetOutsideCursorSettings()->SetMagnification( self->GetInsideCursorSettings()->GetMagnification() );
+    self->GetOutsideCursorSettings()->SetIncrement( self->GetInsideCursorSettings()->GetIncrement() );
+
+    self->UpdateInsideGaussPoints();
+    self->UpdateOutsideGaussPoints();
+
+    self->GetInsideCursorSettings()->InvokeEvent(VISU::UpdateInsideSettingsEvent,NULL);
+    self->GetOutsideCursorSettings()->InvokeEvent(VISU::UpdateOutsideSettingsEvent,NULL);
+    break;
+  }
+}
+
+void VVTK_SegmentationCursorDlg::UpdateSegmentation()
+{
+  if( myIsPlaneSegmentation )
+  {
+    myDirectionGroup->show();
+    myDepthGroup->show();
+    myRadiusGroup->hide();
+
+    VISU_PlanesWidget *pPlanesWidget=myWidgetCtrl->GetPlanesWidget();
+    vtkFloatingPointType origin[3];
+    pPlanesWidget->GetOrigin( origin );
+    myXOriginSpinBox->setValue( origin[0] );
+    myYOriginSpinBox->setValue( origin[1] );
+    myZOriginSpinBox->setValue( origin[2] );
+
+    vtkFloatingPointType normal[3];
+    pPlanesWidget->GetNormal( normal );
+    myDXDirectionSpinBox->setValue( normal[0] );
+    myDYDirectionSpinBox->setValue( normal[1] );
+    myDZDirectionSpinBox->setValue( normal[2] );
+
+    myDepthSpinBox->setValue( pPlanesWidget->Distance() );
+  }
+  else
+  {
+    myDirectionGroup->hide();
+    myDepthGroup->hide();
+    myRadiusGroup->show();
+    
+    VISU_SphereWidget *pSphereWidget=myWidgetCtrl->GetSphereWidget();
+    vtkFloatingPointType origin[3], aRadius;
+    pSphereWidget->GetCenter(origin);
+    myXOriginSpinBox->setValue( origin[0] );
+    myYOriginSpinBox->setValue( origin[1] );
+    myZOriginSpinBox->setValue( origin[2] );
+    aRadius=pSphereWidget->GetRadius();
+    myRadiusSpinBox->setValue(aRadius);
+    myRatioSpinBox->setValue(pSphereWidget->GetRatio());
+  }
+}
+
+void VVTK_SegmentationCursorDlg::UpdateInsideGaussPoints()
+{
+  int aPrimitiveType = VISU_OpenGLPointSpriteMapper::PointSprite;
+  vtkFloatingPointType aClamp = 200.0;
+  QString aMainTexture = QString( getenv( "VISU_ROOT_DIR") ) + "/share/salome/resources/visu/sprite_texture.bmp";
+  QString anAlphaTexture = QString( getenv( "VISU_ROOT_DIR") ) + "/share/salome/resources/visu/sprite_alpha.bmp";
+  vtkFloatingPointType anAlphaThreshold = 0.1;
+  int aResolution = 8;
+  int aMinSize = 3;
+  int aMaxSize = 33;
+  int aMagnification = 100;
+  vtkFloatingPointType anIncrement = 2.0;
+
+  if( !myInsideCursorSettings->GetInitial() )
+  {
+    myInsidePrimitiveBox->setPrimitiveType( myInsideCursorSettings->GetPrimitiveType() );
+    myInsidePrimitiveBox->setClamp( myInsideCursorSettings->GetClamp() );
+    myInsidePrimitiveBox->setMainTexture( myInsideMainTexture );
+    myInsidePrimitiveBox->setAlphaTexture( myInsideAlphaTexture );
+    myInsidePrimitiveBox->setAlphaThreshold( myInsideCursorSettings->GetAlphaThreshold() );
+    myInsidePrimitiveBox->setResolution( myInsideCursorSettings->GetResolution() );
+
+    myInsideSizeBox->setMinSize( myInsideCursorSettings->GetMinSize() );
+    myInsideSizeBox->setMaxSize( myInsideCursorSettings->GetMaxSize() );
+
+    this->setMagnification( myInsideCursorSettings->GetMagnification() );
+    this->setIncrement( myInsideCursorSettings->GetIncrement() );
+
+    return;
+  }
+
+  SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
+
+  aPrimitiveType = aResourceMgr->integerValue( "VISU", "inside_point_sprite_primitive_type", aPrimitiveType );
+  myInsidePrimitiveBox->setPrimitiveType( aPrimitiveType );
+
+  aClamp = aResourceMgr->doubleValue( "VISU", "inside_point_sprite_clamp", aClamp );
+  myInsidePrimitiveBox->setClamp( aClamp );
+
+  aMainTexture = aResourceMgr->stringValue( "VISU", "inside_point_sprite_main_texture", aMainTexture );
+  myInsidePrimitiveBox->setMainTexture( aMainTexture );
+
+  anAlphaTexture = aResourceMgr->stringValue( "VISU", "inside_point_sprite_alpha_texture", anAlphaTexture );
+  myInsidePrimitiveBox->setAlphaTexture( anAlphaTexture );
+
+  anAlphaThreshold = aResourceMgr->doubleValue( "VISU", "inside_point_sprite_alpha_threshold", anAlphaThreshold );
+  myInsidePrimitiveBox->setAlphaThreshold( anAlphaThreshold );
+
+  aResolution = aResourceMgr->integerValue( "VISU", "inside_geom_sphere_resolution", aResolution );
+  myInsidePrimitiveBox->setResolution( aResolution );
+
+  aMinSize = aResourceMgr->integerValue( "VISU", "inside_point_sprite_min_size", aMinSize );
+  myInsideSizeBox->setMinSize( aMinSize / 100.0 );
+
+  aMaxSize = aResourceMgr->integerValue( "VISU", "inside_point_sprite_max_size", aMaxSize );
+  myInsideSizeBox->setMaxSize( aMaxSize / 100.0 );
+
+  aMagnification = aResourceMgr->integerValue( "VISU", "inside_point_sprite_magnification", aMagnification );
+  this->setMagnification( aMagnification / 100.0 );
+
+  anIncrement = aResourceMgr->doubleValue( "VISU", "inside_point_sprite_increment", anIncrement );
+  this->setIncrement( anIncrement );
+
+  myInsidePrimitiveBox->setFaceLimit( 50000 );
+
+  ApplyInsideGaussPoints();
+}
+
+void VVTK_SegmentationCursorDlg::UpdateOutsideGaussPoints()
+{
+  vtkFloatingPointType aClamp = 256.0;
+  int aPrimitiveType = VISU_OpenGLPointSpriteMapper::PointSprite;
+  QString aMainTexture = QString( getenv( "VISU_ROOT_DIR") ) + "/share/salome/resources/visu/sprite_texture.bmp";
+  QString anAlphaTexture = QString( getenv( "VISU_ROOT_DIR") ) + "/share/salome/resources/visu/sprite_alpha.bmp";
+  vtkFloatingPointType anAlphaThreshold = 0.1;
+  int aResolution = 8;
+  int aSize = 25;
+  bool aUniform = false;
+  QColor aColor = Qt::blue;
+
+  if( !myOutsideCursorSettings->GetInitial() )
+  {
+    myOutsidePrimitiveBox->setPrimitiveType( myOutsideCursorSettings->GetPrimitiveType() );
+    myOutsidePrimitiveBox->setClamp( myOutsideCursorSettings->GetClamp() );
+    myOutsidePrimitiveBox->setMainTexture( myOutsideMainTexture );
+    myOutsidePrimitiveBox->setAlphaTexture( myOutsideAlphaTexture );
+    myOutsidePrimitiveBox->setAlphaThreshold( myOutsideCursorSettings->GetAlphaThreshold() );
+    myOutsidePrimitiveBox->setResolution( myOutsideCursorSettings->GetResolution() );
+
+    myOutsideSizeBox->setOutsideSize( myOutsideCursorSettings->GetSize() );
+    myOutsideSizeBox->setUniform( myOutsideCursorSettings->GetUniform() );
+
+    vtkFloatingPointType* aColor = myOutsideCursorSettings->GetColor();
+    myOutsideSizeBox->setColor( QColor( ( int )( aColor[0] * 255.0 ),
+                                        ( int )( aColor[1] * 255.0 ),
+                                        ( int )( aColor[2] * 255.0 ) ) );
+
+    return;
+  }
+
+  SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
+
+  aPrimitiveType = aResourceMgr->integerValue( "VISU", "outside_point_sprite_primitive_type", aPrimitiveType );
+  myOutsidePrimitiveBox->setPrimitiveType( aPrimitiveType );
+
+  aClamp = aResourceMgr->doubleValue( "VISU", "outside_point_sprite_clamp", aClamp );
+  myOutsidePrimitiveBox->setClamp( aClamp );
+
+  aMainTexture = aResourceMgr->stringValue( "VISU", "outside_point_sprite_main_texture", aMainTexture );
+  myOutsidePrimitiveBox->setMainTexture( aMainTexture );
+
+  anAlphaTexture = aResourceMgr->stringValue( "VISU", "outside_point_sprite_alpha_texture", anAlphaTexture );
+  myOutsidePrimitiveBox->setAlphaTexture( anAlphaTexture );
+
+  anAlphaThreshold = aResourceMgr->doubleValue( "VISU", "outside_point_sprite_alpha_threshold", anAlphaThreshold );
+  myOutsidePrimitiveBox->setAlphaThreshold( anAlphaThreshold );
+
+  aResolution = aResourceMgr->integerValue( "VISU", "outside_geom_sphere_resolution", aResolution );
+  myOutsidePrimitiveBox->setResolution( aResolution );
+
+  aSize = aResourceMgr->integerValue( "VISU", "outside_point_sprite_size", aSize );
+  myOutsideSizeBox->setOutsideSize( aSize / 100.0 );
+
+  aUniform = aResourceMgr->booleanValue( "VISU", "outside_point_sprite_uniform", aUniform );
+  myOutsideSizeBox->setUniform( aUniform );
+
+  aColor = aResourceMgr->colorValue( "VISU", "outside_point_sprite_color", aColor );
+  myOutsideSizeBox->setColor( aColor );
+
+  myOutsidePrimitiveBox->setFaceLimit( 50000 );
+
+  ApplyOutsideGaussPoints();
+}
+
+VISU_InsideCursorSettings* VVTK_SegmentationCursorDlg::GetInsideCursorSettings()
+{
+  return myInsideCursorSettings.GetPointer();
+}
+
+VISU_OutsideCursorSettings* VVTK_SegmentationCursorDlg::GetOutsideCursorSettings()
+{
+  return myOutsideCursorSettings.GetPointer();
+}
+
+VISU::TTextureValue 
+VVTK_SegmentationCursorDlg
+::MakeImageData( bool theInside,
+                 const QString& theMainTexture, 
+                 const QString& theAlphaTexture )
+{
+  if( theInside )
+  {
+    bool updateMainTexture = myInsideMainTexture != theMainTexture;
+    bool updateAlphaTexture = myInsideAlphaTexture != theAlphaTexture;
+    if( !updateMainTexture && !updateAlphaTexture )
+      return 0;
+
+    myInsideMainTexture = theMainTexture;
+    myInsideAlphaTexture = theAlphaTexture;
+  }
+  else
+  {
+    bool updateMainTexture = myOutsideMainTexture != theMainTexture;
+    bool updateAlphaTexture = myOutsideAlphaTexture != theAlphaTexture;
+    if( !updateMainTexture && !updateAlphaTexture )
+      return 0;
+
+    myOutsideMainTexture = theMainTexture;
+    myOutsideAlphaTexture = theAlphaTexture;
+  }
+
+  return VISU::GetTexture( (const char*)theMainTexture.toLatin1(), 
+                           (const char*)theAlphaTexture.toLatin1());
+}
+
+void VVTK_SegmentationCursorDlg::onClickApply()
+{
+  if( myTabBox->currentWidget() == mySegmentationCursorBox )
+    ApplySegmentationCursor();
+  else
+  {
+    QString aWarning = "The number of faces needed to perform the 'Geometrical Sphere' primitive\n";
+    aWarning.append( "presentation might be too important to ensure an acceptable frame rate.\n\n" );
+    aWarning.append( "Can you please confirm that you want to continue anyway?" );
+    bool toApply = CheckNumberOfFaces() ||
+      SUIT_MessageBox::warning( this, tr( "Warning" ), aWarning,
+                              tr( "&OK" ), tr( "&Cancel" ), 0, 1, 1 ) == 0;
+
+    if( toApply )
+    {
+      ApplyInsideGaussPoints();
+      ApplyOutsideGaussPoints();
+    }
+  }
+}
+
+void VVTK_SegmentationCursorDlg::ApplySegmentationCursor()
+{
+  if( myIsPlaneSegmentation )
+  {
+    VISU_PlanesWidget *pPlanesWidget=myWidgetCtrl->GetPlanesWidget();
+    vtkFloatingPointType origin[3];
+    origin[0] = myXOriginSpinBox->value();
+    origin[1] = myYOriginSpinBox->value();
+    origin[2] = myZOriginSpinBox->value();
+    pPlanesWidget->SetOrigin( origin );
+
+    vtkFloatingPointType normal[3];
+    normal[0] = myDXDirectionSpinBox->value();
+    normal[1] = myDYDirectionSpinBox->value();
+    normal[2] = myDZDirectionSpinBox->value();
+    
+    if( normal[0] == 0.0 && normal[1] == 0.0 && normal[2] == 0.0 )
+    {
+      normal[2] = 1.0;
+      myDZDirectionSpinBox->setValue( 1.0 );
+    }
+    pPlanesWidget->SetNormal( normal );
+
+    pPlanesWidget->SetDistance( myDepthSpinBox->value() );
+    
+    myWidgetCtrl->InvokeEvent(vtkCommand::EndInteractionEvent,NULL);
+    myWidgetCtrl->GetInteractor()->Render();
+  }
+  else
+  {
+    VISU_SphereWidget *pSphereWidget=myWidgetCtrl->GetSphereWidget();
+    vtkFloatingPointType origin[3], aRadius;
+    origin[0] = myXOriginSpinBox->value();
+    origin[1] = myYOriginSpinBox->value();
+    origin[2] = myZOriginSpinBox->value();
+    pSphereWidget->SetCenter(origin);
+    
+    aRadius=myRadiusSpinBox->value();
+    pSphereWidget->SetRadius(aRadius);
+
+    pSphereWidget->SetRatio(myRatioSpinBox->value());
+
+    myWidgetCtrl->InvokeEvent(vtkCommand::EndInteractionEvent,NULL);
+    myWidgetCtrl->GetInteractor()->Render();
+  }
+}
+
+void VVTK_SegmentationCursorDlg::ApplyInsideGaussPoints()
+{
+  QString anInsideMainTexture = myInsidePrimitiveBox->getMainTexture();
+  QString anInsideAlphaTexture = myInsidePrimitiveBox->getAlphaTexture();
+  VISU::TTextureValue aTexture = MakeImageData( true, anInsideMainTexture, anInsideAlphaTexture );
+
+  if( aTexture.GetPointer() )
+    myInsideCursorSettings->SetTexture( aTexture.GetPointer() );
+
+  myInsideCursorSettings->SetInitial( false );
+  myInsideCursorSettings->SetPrimitiveType( myInsidePrimitiveBox->getPrimitiveType() );
+  myInsideCursorSettings->SetClamp( myInsidePrimitiveBox->getClamp() );
+  myInsideCursorSettings->SetAlphaThreshold( myInsidePrimitiveBox->getAlphaThreshold() );
+  myInsideCursorSettings->SetResolution( myInsidePrimitiveBox->getResolution() );
+
+  myInsideCursorSettings->SetMinSize( myInsideSizeBox->getMinSize() );
+  myInsideCursorSettings->SetMaxSize( myInsideSizeBox->getMaxSize() );
+
+  myInsideCursorSettings->SetMagnification( this->getMagnification() );
+  myInsideCursorSettings->SetIncrement( this->getIncrement() );
+
+  myInsideCursorSettings->InvokeEvent(VISU::UpdateInsideSettingsEvent,NULL);
+}
+
+void VVTK_SegmentationCursorDlg::ApplyOutsideGaussPoints()
+{
+  QString anOutsideMainTexture = myOutsidePrimitiveBox->getMainTexture();
+  QString anOutsideAlphaTexture = myOutsidePrimitiveBox->getAlphaTexture();
+  VISU::TTextureValue aTexture = MakeImageData( false, anOutsideMainTexture, anOutsideAlphaTexture );
+
+  if( aTexture.GetPointer() )
+    myOutsideCursorSettings->SetTexture( aTexture.GetPointer() );
+
+  myOutsideCursorSettings->SetInitial( false );
+  myOutsideCursorSettings->SetPrimitiveType( myOutsidePrimitiveBox->getPrimitiveType() );
+  myOutsideCursorSettings->SetClamp( myOutsidePrimitiveBox->getClamp() );
+  myOutsideCursorSettings->SetAlphaThreshold( myOutsidePrimitiveBox->getAlphaThreshold() );
+  myOutsideCursorSettings->SetResolution( myOutsidePrimitiveBox->getResolution() );
+
+  myOutsideCursorSettings->SetSize( myOutsideSizeBox->getOutsideSize() );
+  myOutsideCursorSettings->SetUniform( myOutsideSizeBox->getUniform() );
+
+  QColor aButtonColor = myOutsideSizeBox->getColor();
+  vtkFloatingPointType aColor[3];
+  aColor[0] = aButtonColor.red() / 255.0;
+  aColor[1] = aButtonColor.green() / 255.0;
+  aColor[2] = aButtonColor.blue() / 255.0;
+  myOutsideCursorSettings->SetColor( aColor );
+
+  myOutsideCursorSettings->SetMagnification( this->getMagnification() );
+  myOutsideCursorSettings->SetIncrement( this->getIncrement() );
+
+  myOutsideCursorSettings->InvokeEvent(VISU::UpdateOutsideSettingsEvent,NULL);
+}
+
+void VVTK_SegmentationCursorDlg::onClickClose()
+{
+  myPlaneAction->setChecked( false );
+  mySphereAction->setChecked( false );
+
+  emit scgClose();
+
+  reject();
+}
+
+void VVTK_SegmentationCursorDlg::onClickHelp()
+{
+  QString aHelpFileName = "segmentation.htm";
+  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+  if (app)
+    app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
+  else {
+                QString platform;
+#ifdef WIN32
+                platform = "winapplication";
+#else
+                platform = "application";
+#endif
+    SUIT_MessageBox::warning( 0, QObject::tr("WRN_WARNING"),
+                              QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+                              arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
+                              QObject::tr("BUT_OK"));
+  }
+}
+
+void VVTK_SegmentationCursorDlg::done( int r )
+{
+  myPlaneAction->setChecked( false );
+  mySphereAction->setChecked( false );
+
+  emit scgClose();
+
+  QDialog::done( r );
+}
+
+void VVTK_SegmentationCursorDlg::onParentShow()
+{
+  if(myPlaneAction->isChecked() || mySphereAction->isChecked())
+    show();
+  else
+    hide();
+}
+
+void VVTK_SegmentationCursorDlg::onParentHide()
+{
+  hide();
+}
+
+bool VVTK_SegmentationCursorDlg::CheckNumberOfFaces()
+{
+  if( !myInteractor )
+    return false;
+
+  vtkRenderer* aRenderer = myInteractor->getRenderer();
+
+  if( !aRenderer )
+    return false;
+
+  int aNumberOfPoints = 0;
+
+  vtkActor* anActor;
+  VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
+  vtkActorCollection* anActColl = aCopy.GetActors();
+  for( anActColl->InitTraversal(); ( anActor = anActColl->GetNextActor() ) != NULL; )
+  {
+    if( VISU_GaussPtsAct1* aGaussActor = VISU_GaussPtsAct1::SafeDownCast( anActor ) )
+      aNumberOfPoints += aGaussActor->GetInput()->GetNumberOfCells();
+  }
+  return !( myInsidePrimitiveBox->getPrimitiveType() == VISU_OpenGLPointSpriteMapper::GeomSphere &&
+            aNumberOfPoints * myInsidePrimitiveBox->getFaceNumber() * 2 > myInsidePrimitiveBox->getFaceLimit() ||
+            myOutsidePrimitiveBox->getPrimitiveType() == VISU_OpenGLPointSpriteMapper::GeomSphere &&
+            aNumberOfPoints * myOutsidePrimitiveBox->getFaceNumber() > myOutsidePrimitiveBox->getFaceLimit() );
+}
+
+void VVTK_SegmentationCursorDlg::keyPressEvent( QKeyEvent* e )
+{
+  QDialog::keyPressEvent( e );
+  if ( e->isAccepted() )
+    return;
+
+  if ( e->key() == Qt::Key_F1 )
+    {
+      e->accept();
+      onClickHelp();
+    }
+}
diff --git a/src/VVTK/VVTK_SegmentationCursorDlg.h b/src/VVTK/VVTK_SegmentationCursorDlg.h
new file mode 100644 (file)
index 0000000..5475022
--- /dev/null
@@ -0,0 +1,199 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : VVTK_SegmentationCursorDlg.h
+//  Author : Oleg Uvarov
+//  Module : VISU
+//
+#ifndef VVTK_SEGMENTATIONCURSORDLG_H
+#define VVTK_SEGMENTATIONCURSORDLG_H
+
+#include "VVTK.h"
+
+#include "VISU_GaussPtsDeviceActor.h"
+
+#include <QDialog>
+
+#include <vtkObject.h>
+#include <vtkSmartPointer.h>
+
+class vtkActorCollection;
+class vtkCallbackCommand;
+class vtkImageData;
+
+class QLabel;
+class QLineEdit;
+class QPushButton;
+class QRadioButton;
+class QTabWidget;
+class QGroupBox;
+class QWidget;
+//class QVBox;
+
+class QtxAction;
+class SalomeApp_DoubleSpinBox;
+class SalomeApp_IntSpinBox;
+
+class VISU_GaussPtsAct1;
+class VISU_InsideCursorSettings;
+class VISU_OutsideCursorSettings;
+class VISU_WidgetCtrl;
+
+class VVTK_PrimitiveBox;
+class VVTK_SizeBox;
+
+class SVTK_RenderWindowInteractor;
+
+
+//! Segmentation Cursor Dialog.
+/*!
+ * Uses for set up Segmentation and Outside Cursor Gauss Points preferenses
+ * and apply them to all actors in the current renderer.
+ */
+class VVTK_SegmentationCursorDlg : public QDialog
+{
+  Q_OBJECT
+
+public:
+  VVTK_SegmentationCursorDlg( QWidget* parent = 0, const char* name = 0 );
+  ~VVTK_SegmentationCursorDlg();
+
+  void             SetWidgetCtrl( VISU_WidgetCtrl* );
+  void             SetPlaneAction( QtxAction* theAction ) { myPlaneAction = theAction; }
+  void             SetSphereAction( QtxAction* theAction ) { mySphereAction = theAction; }
+
+  bool             GetIsPlaneSegmentation() const { return myIsPlaneSegmentation; }
+  void             SetIsPlaneSegmentation( bool on ) { myIsPlaneSegmentation = on; }
+
+  //! Update contents of the Segmentation tab.
+  void             UpdateSegmentation();
+  void             UpdateInsideGaussPoints();
+  void             UpdateOutsideGaussPoints();
+
+  //! Update contents of the Outside Cursor tab.
+  void             UpdateOutsideCursor();
+
+  VISU_InsideCursorSettings*  GetInsideCursorSettings();
+  VISU_OutsideCursorSettings* GetOutsideCursorSettings();
+
+  vtkSmartPointer<vtkCallbackCommand> GetEventCallbackCommand() { return myEventCallbackCommand; }
+
+  void             SetInteractor( SVTK_RenderWindowInteractor* theInteractor ) { myInteractor = theInteractor; }
+
+public:
+  float            getMagnification() const;
+  void             setMagnification( float );
+
+  float            getIncrement() const;
+  void             setIncrement( float );
+
+protected:
+  void             ApplySegmentationCursor();
+  void             ApplyInsideGaussPoints();
+  void             ApplyOutsideGaussPoints();
+
+  bool             CheckNumberOfFaces();
+
+  VISU::TTextureValue
+  MakeImageData( bool theInside,
+                 const QString& theMainTexture, 
+                 const QString& theAlphaTexture );
+
+private:
+  static void      ProcessEvents(vtkObject* theObject, 
+                                 unsigned long theEvent,
+                                 void* theClientData, 
+                                 void* theCallData);
+  
+  void             keyPressEvent( QKeyEvent* e );
+
+protected slots:
+  virtual void     done( int );
+  void             onParentShow();
+  void             onParentHide();
+
+  void             onClickApply();
+  void             onClickClose();
+  void             onClickHelp();
+
+signals:
+  void             scgClose();
+
+private:
+  SVTK_RenderWindowInteractor* myInteractor;
+
+  QTabWidget*       myTabBox;
+
+  // Segmentation cursor
+  QWidget*          mySegmentationCursorBox;
+
+  QGroupBox*        myOriginGroup;
+  SalomeApp_DoubleSpinBox* myXOriginSpinBox;
+  SalomeApp_DoubleSpinBox* myYOriginSpinBox;
+  SalomeApp_DoubleSpinBox* myZOriginSpinBox;
+
+  QGroupBox*        myDirectionGroup;
+  SalomeApp_DoubleSpinBox* myDXDirectionSpinBox;
+  SalomeApp_DoubleSpinBox* myDYDirectionSpinBox;
+  SalomeApp_DoubleSpinBox* myDZDirectionSpinBox;
+
+  QGroupBox*        myDepthGroup;
+  SalomeApp_DoubleSpinBox* myDepthSpinBox;
+
+  QGroupBox*        myRadiusGroup;
+  SalomeApp_DoubleSpinBox* myRadiusSpinBox;
+  SalomeApp_DoubleSpinBox* myRatioSpinBox;
+
+  bool              myIsPlaneSegmentation;
+
+  float             myPriority;
+  vtkSmartPointer<vtkCallbackCommand> myEventCallbackCommand;
+
+  VISU_WidgetCtrl*  myWidgetCtrl;
+  QtxAction*        myPlaneAction;
+  QtxAction*        mySphereAction;
+
+  // Gauss Points
+  QWidget*          myGaussPointsBox;
+
+  VVTK_PrimitiveBox* myInsidePrimitiveBox;
+  VVTK_SizeBox*     myInsideSizeBox;
+
+  QString           myInsideMainTexture;
+  QString           myInsideAlphaTexture;
+
+  vtkSmartPointer<VISU_InsideCursorSettings> myInsideCursorSettings;
+
+  VVTK_PrimitiveBox* myOutsidePrimitiveBox;
+  VVTK_SizeBox*     myOutsideSizeBox;
+
+  QString           myOutsideMainTexture;
+  QString           myOutsideAlphaTexture;
+
+  vtkSmartPointer<VISU_OutsideCursorSettings> myOutsideCursorSettings;
+
+  QLabel*           myMagnificationLabel;
+  SalomeApp_IntSpinBox*    myMagnificationSpinBox;
+  QLabel*           myIncrementLabel;
+  SalomeApp_DoubleSpinBox* myIncrementSpinBox;
+};
+
+#endif
diff --git a/src/VVTK/VVTK_SizeBox.cxx b/src/VVTK/VVTK_SizeBox.cxx
new file mode 100644 (file)
index 0000000..d12c3c9
--- /dev/null
@@ -0,0 +1,382 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  VISU VISUGUI : GUI of VISU component
+//  File   : VVTK_SizeBox.cxx
+//  Author : Oleg UVAROV
+//  Module : VISU
+//
+#include "VVTK_SizeBox.h"
+
+#include <VisuGUI_GUITools.h>
+
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Session.h"
+
+#include <SalomeApp_DoubleSpinBox.h>
+#include <SalomeApp_IntSpinBox.h>
+#include <QtxColorButton.h>
+
+#include <QLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QCheckBox>
+#include <QGroupBox>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QPushButton>
+#include <QColorDialog>
+
+using namespace std;
+
+VVTK_SizeBox::VVTK_SizeBox( QWidget* parent ) :
+  QWidget( parent )
+{
+  QVBoxLayout* aMainLayout = new QVBoxLayout( this );
+  aMainLayout->setSpacing( 0 );
+  aMainLayout->setMargin( 0 );
+
+  // Size
+  QGroupBox* SizeGroup = new QGroupBox ( tr( "SIZE_TITLE" ), this );
+  //SizeGroup->setColumnLayout(0, Qt::Vertical );
+  //SizeGroup->layout()->setSpacing( 0 );
+  //SizeGroup->layout()->setMargin( 0 );
+
+  QGridLayout* SizeGroupLayout = new QGridLayout (SizeGroup);
+  SizeGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
+  SizeGroupLayout->setSpacing(6);
+  SizeGroupLayout->setMargin(11);
+
+  // Outside Size
+  myOutsideSizeLabel = new QLabel( tr( "OUTSIDE_SIZE" ), SizeGroup );
+  myOutsideSizeSpinBox = new SalomeApp_IntSpinBox( SizeGroup );
+  VISU::initSpinBox( myOutsideSizeSpinBox, 0, 100, 1 );
+  myOutsideSizeSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  SizeGroupLayout->addWidget( myOutsideSizeLabel, 0, 0 );
+  SizeGroupLayout->addWidget( myOutsideSizeSpinBox, 0, 1 );
+
+  // Geometry Size
+  myGeomSizeLabel = new QLabel( tr( "GEOM_SIZE" ), SizeGroup );
+  myGeomSizeSpinBox = new SalomeApp_IntSpinBox( SizeGroup );
+  VISU::initSpinBox( myGeomSizeSpinBox, 0, 100, 1 );  
+  myGeomSizeSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  SizeGroupLayout->addWidget( myGeomSizeLabel, 0, 0 );
+  SizeGroupLayout->addWidget( myGeomSizeSpinBox, 0, 1 );
+
+  // Min Size
+  myMinSizeLabel = new QLabel( tr( "MIN_SIZE" ), SizeGroup );
+  myMinSizeSpinBox = new SalomeApp_IntSpinBox( SizeGroup );
+  VISU::initSpinBox( myMinSizeSpinBox, 0, 100, 1 );
+  myMinSizeSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  SizeGroupLayout->addWidget( myMinSizeLabel, 1, 0 );
+  SizeGroupLayout->addWidget( myMinSizeSpinBox, 1, 1 );
+
+  // Max Size
+  myMaxSizeLabel = new QLabel( tr( "MAX_SIZE" ), SizeGroup );
+  myMaxSizeSpinBox = new SalomeApp_IntSpinBox( SizeGroup );
+  VISU::initSpinBox( myMaxSizeSpinBox, 0, 100, 1 );
+  myMaxSizeSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  SizeGroupLayout->addWidget( myMaxSizeLabel, 1, 2 );
+  SizeGroupLayout->addWidget( myMaxSizeSpinBox, 1, 3 );
+
+  // Magnification
+  myMagnificationLabel = new QLabel( tr( "MAGNIFICATION" ), SizeGroup );
+  myMagnificationSpinBox = new SalomeApp_IntSpinBox( SizeGroup );
+  VISU::initSpinBox( myMagnificationSpinBox, 1, 10000, 10 );  
+  myMagnificationSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  SizeGroupLayout->addWidget( myMagnificationLabel, 2, 0 );
+  SizeGroupLayout->addWidget( myMagnificationSpinBox, 2, 1 );
+
+  // Increment
+  myIncrementLabel = new QLabel( tr( "INCREMENT" ), SizeGroup );
+  myIncrementSpinBox = new SalomeApp_DoubleSpinBox( SizeGroup );
+  VISU::initSpinBox( myIncrementSpinBox, 0.01, 10, 0.1, "parametric_precision" );
+  myIncrementSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  SizeGroupLayout->addWidget( myIncrementLabel, 2, 2 );
+  SizeGroupLayout->addWidget( myIncrementSpinBox, 2, 3 );
+
+  aMainLayout->addWidget( SizeGroup );
+
+  // Color
+  myColorGroup = new QGroupBox ( tr( "COLOR_TITLE" ), this );
+  //myColorGroup->setColumnLayout(0, Qt::Vertical );
+  //myColorGroup->layout()->setSpacing( 0 );
+  //myColorGroup->layout()->setMargin( 0 );
+
+  QGridLayout* ColorGroupLayout = new QGridLayout ( myColorGroup );
+  ColorGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+  ColorGroupLayout->setSpacing(6);
+  ColorGroupLayout->setMargin(11);
+
+  myUniformCheckBox = new QCheckBox( tr( "UNIFORM_COLOR" ), myColorGroup );
+
+  myColorLabel = new QLabel( tr( "COLOR" ), myColorGroup );
+  myColorButton = new QtxColorButton( myColorGroup );
+
+  ColorGroupLayout->addWidget( myUniformCheckBox, 0, 0 );
+  ColorGroupLayout->addWidget( myColorLabel, 0, 1 );
+  ColorGroupLayout->addWidget( myColorButton, 0, 2 );
+
+  aMainLayout->addWidget( myColorGroup );
+
+  connect( myUniformCheckBox, SIGNAL( toggled( bool ) ), myColorButton, SLOT( setEnabled( bool ) ) );
+  //connect( myColorButton, SIGNAL( clicked() ), this, SLOT( onColorButtonPressed() ) );
+
+  setType( VVTK_SizeBox::Results );
+}
+
+void VVTK_SizeBox::onToggleResults()
+{
+  myType = VVTK_SizeBox::Results;
+
+  myOutsideSizeLabel->hide();
+  myOutsideSizeSpinBox->hide();
+
+  myGeomSizeLabel->hide();
+  myGeomSizeSpinBox->hide();
+
+  myMinSizeLabel->show();
+  myMinSizeSpinBox->show();
+
+  myMaxSizeLabel->show();
+  myMaxSizeSpinBox->show();
+
+  myMagnificationLabel->show();
+  myMagnificationSpinBox->show();
+
+  myIncrementLabel->show();
+  myIncrementSpinBox->show();
+
+  myColorGroup->hide();
+
+  myUniformCheckBox->hide();
+}
+
+void VVTK_SizeBox::onToggleGeometry()
+{
+  myType = VVTK_SizeBox::Geometry;
+
+  myOutsideSizeLabel->hide();
+  myOutsideSizeSpinBox->hide();
+
+  myGeomSizeLabel->show();
+  myGeomSizeSpinBox->show();
+
+  myMinSizeLabel->hide();
+  myMinSizeSpinBox->hide();
+
+  myMaxSizeLabel->hide();
+  myMaxSizeSpinBox->hide();
+
+  myMagnificationLabel->show();
+  myMagnificationSpinBox->show();
+
+  myIncrementLabel->show();
+  myIncrementSpinBox->show();
+
+  myColorGroup->show();
+
+  myUniformCheckBox->hide();
+}
+
+void VVTK_SizeBox::onToggleInside()
+{
+  myType = VVTK_SizeBox::Inside;
+
+  myOutsideSizeLabel->hide();
+  myOutsideSizeSpinBox->hide();
+
+  myGeomSizeLabel->hide();
+  myGeomSizeSpinBox->hide();
+
+  myMinSizeLabel->show();
+  myMinSizeSpinBox->show();
+
+  myMaxSizeLabel->show();
+  myMaxSizeSpinBox->show();
+
+  myMagnificationLabel->hide();
+  myMagnificationSpinBox->hide();
+
+  myIncrementLabel->hide();
+  myIncrementSpinBox->hide();
+
+  myColorGroup->hide();
+
+  myUniformCheckBox->hide();
+}
+
+void VVTK_SizeBox::onToggleOutside()
+{
+  myType = VVTK_SizeBox::Outside;
+
+  myOutsideSizeLabel->show();
+  myOutsideSizeSpinBox->show();
+
+  myGeomSizeLabel->hide();
+  myGeomSizeSpinBox->hide();
+
+  myMinSizeLabel->hide();
+  myMinSizeSpinBox->hide();
+
+  myMaxSizeLabel->hide();
+  myMaxSizeSpinBox->hide();
+
+  myMagnificationLabel->hide();
+  myMagnificationSpinBox->hide();
+
+  myIncrementLabel->hide();
+  myIncrementSpinBox->hide();
+
+  myColorGroup->show();
+
+  myUniformCheckBox->show();
+}
+
+void VVTK_SizeBox::setType( int theType )
+{
+  myType = theType;
+
+  switch( myType )
+  {
+    case VVTK_SizeBox::Results  : onToggleResults(); break;
+    case VVTK_SizeBox::Geometry : onToggleGeometry(); break;
+    case VVTK_SizeBox::Inside   : onToggleInside();  break;
+    case VVTK_SizeBox::Outside  : onToggleOutside();  break;
+    default : break;
+  }
+}
+
+float VVTK_SizeBox::getOutsideSize() const
+{
+  return myOutsideSizeSpinBox->value() / 100.0;
+}
+
+void VVTK_SizeBox::setOutsideSize( float theOutsideSize )
+{
+  myOutsideSizeSpinBox->setValue( ( int )( theOutsideSize * 100 ) );
+}
+
+float VVTK_SizeBox::getGeomSize() const
+{
+  return myGeomSizeSpinBox->value() / 100.0;
+}
+
+void VVTK_SizeBox::setGeomSize( float theGeomSize )
+{
+  myGeomSizeSpinBox->setValue( ( int )( theGeomSize * 100 ) );
+}
+
+float VVTK_SizeBox::getMinSize() const
+{
+  return myMinSizeSpinBox->value() / 100.0;
+}
+
+void VVTK_SizeBox::setMinSize( float theMinSize )
+{
+  myMinSizeSpinBox->setValue( ( int )( theMinSize * 100 ) );
+}
+
+float VVTK_SizeBox::getMaxSize() const
+{
+  return myMaxSizeSpinBox->value() / 100.0;
+}
+
+void VVTK_SizeBox::setMaxSize( float theMaxSize )
+{
+  myMaxSizeSpinBox->setValue( ( int )( theMaxSize * 100 ) );
+}
+
+float VVTK_SizeBox::getMagnification() const
+{
+  return myMagnificationSpinBox->value() / 100.0;
+}
+
+void VVTK_SizeBox::setMagnification( float theMagnification )
+{
+  myMagnificationSpinBox->setValue( ( int )( theMagnification * 100 ) );
+}
+
+float VVTK_SizeBox::getIncrement() const
+{
+  return myIncrementSpinBox->value();
+}
+
+void VVTK_SizeBox::setIncrement( float theIncrement )
+{
+  myIncrementSpinBox->setValue( theIncrement );
+}
+
+bool VVTK_SizeBox::getUniform() const
+{
+  return myUniformCheckBox->isChecked();
+}
+
+void VVTK_SizeBox::setUniform( bool theUniform )
+{
+  myUniformCheckBox->setChecked( theUniform );
+  myColorButton->setEnabled( theUniform );
+}
+
+QColor VVTK_SizeBox::getColor() const
+{
+  return myColorButton->color();//palette().color( myColorButton->backgroundRole() );
+  //return myColorButton->paletteBackgroundColor();
+}
+
+void VVTK_SizeBox::setColor( const QColor& theColor )
+{
+  if ( theColor.isValid() )
+  {
+    //QPalette aPalette( myColorButton->palette() );
+    //aPalette.setColor( myColorButton->backgroundRole(), theColor );
+    myColorButton->setColor( theColor );
+  }
+  //myColorButton->setPaletteBackgroundColor( theColor );
+}
+
+void VVTK_SizeBox::enableSizeControls( bool enabled )
+{
+  myMagnificationSpinBox->setEnabled( enabled );
+  myMaxSizeSpinBox->setEnabled( enabled );
+  myMinSizeSpinBox->setEnabled( enabled );
+  myIncrementSpinBox->setEnabled( enabled );
+  myGeomSizeSpinBox->setEnabled( enabled );
+}
+
+/*void VVTK_SizeBox::onColorButtonPressed()
+{
+  QPalette aPalette( myColorButton->palette() );
+  QColor aColor = QColorDialog::
+    getColor( aPalette.color(myColorButton->backgroundRole() ), this );
+
+  if( aColor.isValid() )
+  {
+      aPalette.setColor( myColorButton->backgroundRole(), aColor );
+      myColorButton->setPalette( aPalette );
+  }
+}*/
diff --git a/src/VVTK/VVTK_SizeBox.h b/src/VVTK/VVTK_SizeBox.h
new file mode 100644 (file)
index 0000000..6322c12
--- /dev/null
@@ -0,0 +1,123 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  VISU VISUGUI : GUI of VISU component
+//  File   : VVTK_SizeBox.h
+//  Author : Oleg UVAROV
+//  Module : VISU
+//
+#ifndef VVTK_SIZEBOX_H
+#define VVTK_SIZEBOX_H
+
+#include "VVTK.h"
+
+#include <QWidget>
+
+class QLabel;
+class QLineEdit;
+class QPushButton;
+class QCheckBox;
+class QGroupBox;
+
+class SalomeApp_DoubleSpinBox;
+class SalomeApp_IntSpinBox;
+class QtxColorButton;
+
+class VVTK_EXPORT VVTK_SizeBox : public QWidget
+{
+  Q_OBJECT
+
+public:
+  enum { Results = 0, Geometry, Inside, Outside };
+
+public:
+  VVTK_SizeBox( QWidget* );
+  ~VVTK_SizeBox() {}
+
+public:
+  int                      getType() const { return myType; }
+  void                     setType( int );
+
+  float                    getOutsideSize() const;
+  void                     setOutsideSize( float );
+
+  float                    getGeomSize() const;
+  void                     setGeomSize( float );
+
+  float                    getMinSize() const;
+  void                     setMinSize( float );
+
+  float                    getMaxSize() const;
+  void                     setMaxSize( float );
+
+  float                    getMagnification() const;
+  void                     setMagnification( float );
+
+  float                    getIncrement() const;
+  void                     setIncrement( float );
+
+  bool                     getUniform() const;
+  void                     setUniform( bool );
+
+  QColor                   getColor() const;
+  void                     setColor( const QColor& );
+
+  void                     enableSizeControls( bool enabled );
+
+protected slots:
+  void                     onToggleResults();
+  void                     onToggleGeometry();
+  void                     onToggleInside();
+  void                     onToggleOutside();
+
+  //void                     onColorButtonPressed();
+
+private:
+  int                      myType;
+
+  QLabel*                  myOutsideSizeLabel;
+  SalomeApp_IntSpinBox*    myOutsideSizeSpinBox;
+
+  QLabel*                  myGeomSizeLabel;
+  SalomeApp_IntSpinBox*    myGeomSizeSpinBox;
+
+  QLabel*                  myMinSizeLabel;
+  SalomeApp_IntSpinBox*    myMinSizeSpinBox;
+
+  QLabel*                  myMaxSizeLabel;
+  SalomeApp_IntSpinBox*    myMaxSizeSpinBox;
+
+  QLabel*                  myMagnificationLabel;
+  SalomeApp_IntSpinBox*    myMagnificationSpinBox;
+
+  QLabel*                  myIncrementLabel;
+  SalomeApp_DoubleSpinBox* myIncrementSpinBox;
+
+  QCheckBox*               myUniformCheckBox;  
+
+  QGroupBox*               myColorGroup;
+  QLabel*                  myColorLabel;
+  QtxColorButton*          myColorButton;
+};
+
+
+
+#endif
diff --git a/src/VVTK/VVTK_ViewManager.cxx b/src/VVTK/VVTK_ViewManager.cxx
new file mode 100644 (file)
index 0000000..2c9f851
--- /dev/null
@@ -0,0 +1,49 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#include "VVTK_ViewManager.h"
+#include "VVTK_ViewModel.h"
+
+#include <SUIT_ViewWindow.h>
+
+int VVTK_ViewManager::_VVTKViewMgr_Id = 0;
+
+//***************************************************************
+VVTK_ViewManager
+::VVTK_ViewManager( SUIT_Study* study, 
+                    SUIT_Desktop* theDesktop ) 
+: SVTK_ViewManager( study, theDesktop )
+{
+  myId = ++_VVTKViewMgr_Id;
+  setViewModel( new VVTK_Viewer() );
+}
+
+//***************************************************************
+VVTK_ViewManager::~VVTK_ViewManager()
+{
+}
+
+//***************************************************************
+void VVTK_ViewManager::setViewName(SUIT_ViewWindow* theView)
+{
+  int aPos = myViews.indexOf(theView);
+  theView->setWindowTitle( tr( "VTK_VIEW_TITLE" ).arg( myId ).arg( aPos + 1 ) );
+}
diff --git a/src/VVTK/VVTK_ViewManager.h b/src/VVTK/VVTK_ViewManager.h
new file mode 100644 (file)
index 0000000..5bc84e4
--- /dev/null
@@ -0,0 +1,49 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifndef VVTK_VIEWMANAGER_H
+#define VVTK_VIEWMANAGER_H
+
+#include "SVTK_ViewManager.h"
+#include "VVTK.h"
+
+class SUIT_Desktop;
+
+//! Extend SUIT_ViewManager to deal with VVTK_Viewer
+class VVTK_EXPORT VVTK_ViewManager : public SVTK_ViewManager
+{
+  Q_OBJECT;
+public:
+  //! Construct the view manager
+  VVTK_ViewManager( SUIT_Study* study, SUIT_Desktop* );
+
+  //! Destroy the view manager
+  virtual ~VVTK_ViewManager();
+
+protected:
+  void setViewName( SUIT_ViewWindow* theView );
+
+private:
+  int               myId;
+  static  int       _VVTKViewMgr_Id;
+};
+
+#endif
diff --git a/src/VVTK/VVTK_ViewModel.cxx b/src/VVTK/VVTK_ViewModel.cxx
new file mode 100644 (file)
index 0000000..a06b2ca
--- /dev/null
@@ -0,0 +1,124 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#include "VVTK_ViewModel.h"
+#include "VISU_ActorFactory.h"
+#include "VVTK_ViewWindow.h"
+
+#include "VTKViewer_Algorithm.h"
+#include "SVTK_Functor.h"
+#include "VISU_ActorBase.h"
+#include "SVTK_View.h"
+#include "SVTK_Prs.h"
+
+#include <SUIT_ViewManager.h>
+
+#include <vtkActorCollection.h>
+#include <vtkRenderer.h>
+
+//---------------------------------------------------------------
+VVTK_Viewer::VVTK_Viewer()
+{
+}
+
+//---------------------------------------------------------------
+VVTK_Viewer::~VVTK_Viewer() 
+{
+}
+
+//---------------------------------------------------------------
+SUIT_ViewWindow* VVTK_Viewer::createView( SUIT_Desktop* theDesktop )
+{
+  TViewWindow* aViewWindow = new TViewWindow (theDesktop);
+  aViewWindow->Initialize(this);
+
+  aViewWindow->setBackgroundColor( backgroundColor() );
+  aViewWindow->SetTrihedronSize( trihedronSize() );
+  aViewWindow->SetProjectionMode( projectionMode() );
+  aViewWindow->SetInteractionStyle( interactionStyle() );
+  aViewWindow->SetIncrementalSpeed( incrementalSpeed(), incrementalSpeedMode() );
+  aViewWindow->SetSpacemouseButtons( spacemouseBtn(1), spacemouseBtn(2), spacemouseBtn(3) );
+
+  return aViewWindow;
+}
+
+//---------------------------------------------------------------
+void VVTK_Viewer::Display(const SALOME_VTKPrs* thePrs)
+{
+  // try do downcast object
+  if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>(thePrs)){
+    if(aPrs->IsNull())
+      return;
+    if(vtkActorCollection* aCollection = aPrs->GetObjects()){
+      aCollection->InitTraversal();
+      while(VISU_ActorBase* anActor = dynamic_cast<VISU_ActorBase*>(aCollection->GetNextActor())){
+        if(!anActor->GetFactory()->GetActiveState())
+          continue;
+        QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
+        for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
+          if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(aViews.at(i))){
+            if(SVTK_View* aView = aViewWindow->getView()){
+              aView->Display(anActor, false);
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+//---------------------------------------------------------------
+namespace VVTK
+{
+  struct TIsOneActorVisibleAction
+  {
+    bool& myResult;
+    TIsOneActorVisibleAction(bool& theResult): 
+      myResult(theResult)
+    {
+      myResult = false;
+    }
+    void
+    operator()(SALOME_Actor* theActor)
+    {
+      if(!myResult)
+        myResult = theActor->GetVisibility();
+    }
+  };
+}
+
+//---------------------------------------------------------------
+bool VVTK_Viewer::isVisible( const Handle(SALOME_InteractiveObject)& theIO )
+{
+  QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
+  for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
+    if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(aViews.at(i))){
+      bool aResult;
+      VVTK::TIsOneActorVisibleAction anAction(aResult);
+      VTK::ActorCollectionCopy aCopy(aViewWindow->getRenderer()->GetActors());
+      SVTK::ForEachIf<SALOME_Actor>(aCopy.GetActors(),
+                                    SVTK::TIsSameIObject<SALOME_Actor>(theIO),
+                                    anAction);
+      return anAction.myResult;
+    }
+  
+  return false;
+}
diff --git a/src/VVTK/VVTK_ViewModel.h b/src/VVTK/VVTK_ViewModel.h
new file mode 100644 (file)
index 0000000..7cfb87c
--- /dev/null
@@ -0,0 +1,76 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifndef VVTK_VIEWMODEL_H
+#define VVTK_VIEWMODEL_H
+
+#include <QColor>
+
+#include "VVTK.h"
+#include "SVTK_ViewModel.h"
+
+class VVTK_ViewWindow;
+
+//! VVTK View Model
+class VVTK_EXPORT VVTK_Viewer : public SVTK_Viewer
+{
+  Q_OBJECT;
+
+public:
+  typedef VVTK_ViewWindow TViewWindow;
+
+  static
+  QString
+  Type() 
+  { 
+    return "VVTK"; 
+  }
+
+  VVTK_Viewer();
+
+  virtual
+  ~VVTK_Viewer();
+
+  //! See #SUIT_ViewModel::createView
+  virtual
+  SUIT_ViewWindow* 
+  createView(SUIT_Desktop*);
+
+  //! See SUIT_ViewModel::getType
+  virtual
+  QString 
+  getType() const 
+  { 
+    return Type(); 
+  }
+
+  //! See #SALOME_View::Display( const SALOME_Prs* )
+  virtual
+  void
+  Display(const SALOME_VTKPrs* thePrs); 
+
+  //! See #SALOME_View::isVisible( const Handle(SALOME_InteractiveObject)& )
+  virtual
+  bool
+  isVisible(const Handle(SALOME_InteractiveObject)& theIO);
+};
+
+#endif
diff --git a/src/VVTK/VVTK_ViewWindow.cxx b/src/VVTK/VVTK_ViewWindow.cxx
new file mode 100755 (executable)
index 0000000..1d5be16
--- /dev/null
@@ -0,0 +1,324 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME VTKViewer : build VTK viewer into Salome desktop
+//  File   : 
+//  Author : 
+//  Module : SALOME
+//  $Header$
+//
+#include "VVTK_ViewWindow.h"
+#include "VVTK_ViewModel.h"
+#include "VVTK_MainWindow.h"
+#include "SVTK_View.h"
+
+#include "SUIT_Session.h"
+
+#include "VVTK_Renderer.h"
+#include "SVTK_Selector.h"
+#include "SVTK_InteractorStyle.h"
+#include "SVTK_RenderWindowInteractor.h"
+#include "SVTK_GenericRenderWindowInteractor.h"
+
+#include <vtkRenderWindow.h>
+
+#include <QLayout>
+#include <QList>
+#include <QSplitter>
+#include <QToolBar>
+
+//----------------------------------------------------------------------------
+VVTK_ViewWindow
+::VVTK_ViewWindow(SUIT_Desktop* theDesktop):
+  SVTK_ViewWindow(theDesktop),
+  myMainWindow1(NULL),
+  myMainWindow2(NULL),
+  myView2(NULL),
+  myDumpImage(QImage())
+{}
+
+//----------------------------------------------------------------------------
+void VVTK_ViewWindow::Initialize(SVTK_ViewModelBase* theModel)
+{
+  if(SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr()){
+
+    QSplitter* s = new QSplitter( Qt::Vertical, this );
+    setCentralWidget( s );
+
+    VISU_WidgetCtrl* aWidgetCtrl = NULL;
+    VISU_InsideCursorSettings* anInsideCursorSettings = NULL;
+    VISU_OutsideCursorSettings* anOutsideCursorSettings = NULL;
+    VISU_PickingSettings* aPickingSettings = NULL;
+    SVTK_Selector* aSelector = SVTK_Selector::New();
+    {
+      myMainWindow1 = new VVTK_MainWindow1(s,
+                                           "VVTK_MainWindow",
+                                           aResourceMgr,
+                                           this);
+
+      anInsideCursorSettings = myMainWindow1->GetInsideCursorSettings();
+      anOutsideCursorSettings = myMainWindow1->GetOutsideCursorSettings();
+      aPickingSettings = myMainWindow1->GetPickingSettings();
+
+      SVTK_RenderWindowInteractor* anIteractor = 
+        new SVTK_RenderWindowInteractor(myMainWindow1,"SVTK_RenderWindowInteractor1");
+      
+      SVTK_GenericRenderWindowInteractor* aDevice = 
+        SVTK_GenericRenderWindowInteractor::New();
+      aDevice->SetRenderWidget(anIteractor);
+      aDevice->SetSelector(aSelector);
+    
+      VVTK_Renderer1* aRenderer = VVTK_Renderer1::New();
+      aRenderer->Initialize(aDevice,aSelector);
+
+      aWidgetCtrl = aRenderer->GetWidgetCtrl();
+
+      aRenderer->SetInsideCursorSettings(anInsideCursorSettings);
+      aRenderer->SetOutsideCursorSettings(anOutsideCursorSettings);
+      aRenderer->SetPickingSettings(aPickingSettings);
+
+      anIteractor->Initialize(aDevice,aRenderer,aSelector);
+
+      SVTK_InteractorStyle* aStyle = SVTK_InteractorStyle::New();
+      anIteractor->PushInteractorStyle(aStyle);
+      aStyle->Delete();
+
+      aDevice->Delete();
+      aRenderer->Delete();
+
+      myMainWindow1->Initialize(anIteractor,aRenderer);
+
+      myView1 = new SVTK_View(myMainWindow1);
+      SVTK_ViewWindow::Initialize(myView1,theModel);
+
+      anIteractor->getRenderWindow()->Render();
+      myMainWindow1->onResetView();
+    }
+    {
+      myMainWindow2 = myMainWindow1->CreateMainWindow2(s,
+                                                       "VVTK_SegmantationWindow",
+                                                       aResourceMgr,
+                                                       this);
+      SVTK_RenderWindowInteractor* anIteractor = 
+        new SVTK_RenderWindowInteractor(myMainWindow2,"SVTK_RenderWindowInteractor1");
+      
+      SVTK_GenericRenderWindowInteractor* aDevice = 
+        SVTK_GenericRenderWindowInteractor::New();
+      aDevice->SetRenderWidget(anIteractor);
+      aDevice->SetSelector(aSelector);
+    
+      VVTK_Renderer2* aRenderer = VVTK_Renderer2::New();
+      aRenderer->Initialize(aDevice,aSelector);
+      
+      aRenderer->SetWidgetCtrl(aWidgetCtrl);
+      
+      aRenderer->SetInsideCursorSettings(anInsideCursorSettings);
+      aRenderer->SetPickingSettings(aPickingSettings);
+      
+      anIteractor->Initialize(aDevice,aRenderer,aSelector);
+
+      SVTK_InteractorStyle* aStyle = SVTK_InteractorStyle::New();
+      anIteractor->PushInteractorStyle(aStyle);
+      aStyle->Delete();
+
+      aDevice->Delete();
+      aRenderer->Delete();
+
+      myMainWindow2->Initialize(anIteractor);
+      
+      myView2 = new SVTK_View(myMainWindow2);
+      SVTK_ViewWindow::Initialize(myView2,theModel);
+
+      anIteractor->getRenderWindow()->Render();
+      myMainWindow2->onResetView();
+    }
+    aSelector->Delete();
+
+    int h = height() / 2;
+    QList<int> aSizes;
+    aSizes.append( h );
+    aSizes.append( h );
+    s->setSizes( aSizes );
+    myMainWindow2->hide();
+
+    myMainWindow = myMainWindow1;
+    myView = myView1;
+  }
+}
+
+//----------------------------------------------------------------------------
+VVTK_ViewWindow
+::~VVTK_ViewWindow()
+{}
+
+
+//----------------------------------------------------------------------------
+VVTK_MainWindow1* 
+VVTK_ViewWindow
+::getMainWindow1()
+{
+  return myMainWindow1;
+}
+
+VVTK_MainWindow2* 
+VVTK_ViewWindow
+::getMainWindow2()
+{
+  return myMainWindow2;
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_ViewWindow
+::AddActor(VTKViewer_Actor* theActor, 
+           bool theIsUpdate)
+{
+  myMainWindow1->AddActor(theActor,theIsUpdate);
+  myMainWindow2->AddActor(theActor,theIsUpdate);
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_ViewWindow
+::RemoveActor(VTKViewer_Actor* theActor, 
+              bool theIsUpdate)
+{
+  myMainWindow1->RemoveActor(theActor,theIsUpdate);
+  myMainWindow2->RemoveActor(theActor,theIsUpdate);
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_ViewWindow
+::Repaint(bool theUpdateTrihedron)
+{
+  myMainWindow1->Repaint(theUpdateTrihedron);
+  myMainWindow2->Repaint(theUpdateTrihedron);
+}
+
+//----------------------------------------------------------------
+void 
+VVTK_ViewWindow
+::unHighlightAll() 
+{
+  myView1->unHighlightAll();
+  myView2->unHighlightAll();
+}
+
+//----------------------------------------------------------------
+void
+VVTK_ViewWindow
+::highlight(const Handle(SALOME_InteractiveObject)& theIO, 
+            bool theIsHighlight, 
+            bool theIsUpdate ) 
+{
+  if(GetSelector()->AddIObject(theIO))
+    GetSelector()->EndPickCallback();
+  myView1->highlight( theIO, theIsHighlight, theIsUpdate );
+  myView2->highlight( theIO, theIsHighlight, theIsUpdate );
+}
+
+//----------------------------------------------------------------
+void
+VVTK_ViewWindow
+::onSelectionChanged()
+{
+  myView1->onSelectionChanged();
+  myView2->onSelectionChanged();
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_ViewWindow
+::onResetView()
+{
+  myMainWindow1->onResetView();
+  myMainWindow2->onResetView();
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_ViewWindow
+::onFitAll()
+{
+  myMainWindow1->onFitAll();
+  myMainWindow2->onFitAll();
+}
+
+//----------------------------------------------------------------------------
+bool 
+VVTK_ViewWindow
+::action( const int accelAction  )
+{
+  if ( myMainWindow1->hasFocus() )
+    myMainWindow1->action( accelAction );
+  else if ( myMainWindow2->hasFocus() )
+    myMainWindow2->action( accelAction );
+  else
+    return false;
+  return true;
+}
+
+//----------------------------------------------------------------------------
+QImage
+VVTK_ViewWindow
+::dumpView()
+{
+  if( myMainWindow1->GetInteractor()->hasFocus() )
+    {
+      if ( myMainWindow1->getToolBar()->testAttribute(Qt::WA_UnderMouse) || myDumpImage.isNull() )
+        return myMainWindow1->dumpView();
+      else
+        return myDumpImage;
+    }
+  
+  if( myMainWindow2->GetInteractor()->hasFocus() )
+    {
+      if ( myMainWindow1->getToolBar()->testAttribute(Qt::WA_UnderMouse) || myDumpImage.isNull() )
+        return myMainWindow2->dumpView();
+      else
+        return myDumpImage;
+    }
+
+  return QImage();
+}
+
+//----------------------------------------------------------------------------
+void
+VVTK_ViewWindow
+::setBackgroundColor( const QColor& theColor )
+{
+  myMainWindow1->SetBackgroundColor( theColor );
+  myMainWindow2->SetBackgroundColor( theColor );
+}
+
+
+//----------------------------------------------------------------------------
+void
+VVTK_ViewWindow
+::RefreshDumpImage()
+{ 
+  if( myMainWindow1->GetInteractor()->hasFocus() )
+    myDumpImage = myMainWindow1->dumpView();
+  else if ( myMainWindow2->GetInteractor()->hasFocus() )
+    myDumpImage = myMainWindow2->dumpView();
+}
diff --git a/src/VVTK/VVTK_ViewWindow.h b/src/VVTK/VVTK_ViewWindow.h
new file mode 100755 (executable)
index 0000000..bedf4b4
--- /dev/null
@@ -0,0 +1,155 @@
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+#ifndef VVTK_VIEWWINDOW_H
+#define VVTK_VIEWWINDOW_H
+
+#ifdef WIN32
+#pragma warning( disable:4251 )
+#endif
+
+#include "VVTK.h"
+#include "SVTK_ViewWindow.h"
+
+#include <QImage>
+
+#include <string>
+
+class VVTK_MainWindow1;
+class VVTK_MainWindow2;
+class SVTK_View;
+
+//----------------------------------------------------------------------------
+//! Customize the SVTK_ViewWindow in order to manage two SVTK_View (base and segmented one)
+class VVTK_EXPORT VVTK_ViewWindow : public SVTK_ViewWindow
+{
+  Q_OBJECT;
+
+public:
+  //! To construct the class
+  VVTK_ViewWindow(SUIT_Desktop* theDesktop);
+
+  //! Destroy
+  virtual
+  ~VVTK_ViewWindow();
+
+  //! To initialize
+  virtual
+  void
+  Initialize(SVTK_ViewModelBase* theModel);
+
+  //----------------------------------------------------------------------------
+  //! Get access to base SVTK_MainWindow
+  VVTK_MainWindow1* 
+  getMainWindow1();
+
+  //! Get access to segmented SVTK_MainWindow
+  VVTK_MainWindow2* 
+  getMainWindow2();
+
+  //----------------------------------------------------------------------------
+  //! Redefine SVTK_ViewWindow::AddActor method
+  /*!
+    This is an entry point for publication the presentation into the viewer.
+    Pointed actor published into the basic MainWindow. If the actor is
+    a Gauss Points one second actor is created from initial actor and 
+    is put into segemented MainWindow.
+  */
+  virtual
+  void
+  AddActor(VTKViewer_Actor* theActor,
+           bool theIsUpdate = false);
+
+  //! Redefine SVTK_ViewWindow::RemoveActor method
+  virtual
+  void
+  RemoveActor(VTKViewer_Actor* theActor,
+              bool theIsUpdate = false);
+
+  //! Redefine SVTK_ViewWindow::Repaint method
+  virtual
+  void
+  Repaint(bool theUpdateTrihedron = true);
+
+  //----------------------------------------------------------------------------
+  /*  interactive object management */
+  //! Redefine SVTK_ViewWindow::highlight method
+  virtual
+  void
+  highlight(const Handle(SALOME_InteractiveObject)& theIO, 
+            bool theIsHighlight = true, 
+            bool theIsUpdate = true);
+
+  //! Redefine SVTK_ViewWindow::unHighlightAll method
+  virtual
+  void
+  unHighlightAll();
+
+  //! Redefine SVTK_ViewWindow::setBackgroundColor method
+  virtual
+  void
+  setBackgroundColor( const QColor& );
+
+  //----------------------------------------------------------------------------
+
+  //! Refresh dump images of the viewers
+  virtual
+  void RefreshDumpImage();
+  
+public slots:
+  //! Redefine SVTK_ViewWindow::onSelectionChanged method
+  virtual
+  void
+  onSelectionChanged();
+
+  //! Redefine SVTK_ViewWindow::onResetView method
+  virtual
+  void
+  onResetView();     
+
+  //! Redefine SVTK_ViewWindow::onFitAll method
+  virtual
+  void 
+  onFitAll();
+
+  //----------------------------------------------------------------------------
+protected:
+  virtual 
+  bool
+  action( const int );
+
+  virtual QImage dumpView();
+
+  VVTK_MainWindow1* myMainWindow1; //!< The manage base view
+  SVTK_View* myView1; //!< The manage base view
+
+  VVTK_MainWindow2* myMainWindow2; //!< The manage segmented view
+  SVTK_View* myView2; //!< The manage segmented view
+
+private:
+  QImage myDumpImage;
+};
+
+#ifdef WIN32
+#pragma warning( default:4251 )
+#endif
+
+#endif