Salome HOME
0022764: [EDF] Filtering operators in Group and Explode dialog boxes
[modules/geom.git] / src / EntityGUI / EntityGUI_FieldDlg.cxx
index 7fd1adf9de1d3d5f5aafc6671b72caccdc13749d..d940f5040604d77624ee311742efc3b8ef49f00b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014  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
@@ -6,7 +6,7 @@
 // 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.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,6 +18,7 @@
 // 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   : EntityGUI_FieldDlg.cxx
 
@@ -41,7 +42,7 @@
 #include <OCCViewer_ViewManager.h>
 #include <SVTK_ViewModel.h>
 #include <SALOME_Prs.h>
-#include <SALOME_ListIteratorOfListIO.hxx>
+#include <SALOME_ListIO.hxx>
 
 #include <SUIT_Desktop.h>
 #include <SUIT_MessageBox.h>
@@ -55,6 +56,7 @@
 #include <QGridLayout>
 #include <QGroupBox>
 #include <QHeaderView>
+#include <QInputDialog>
 #include <QLabel>
 #include <QLineEdit>
 #include <QPushButton>
 #include <SALOMEDS_wrap.hxx>
 #include <GEOMImpl_Types.hxx>
 
+#ifdef max
+  #undef max
+#endif
+
 
 const int theIntLimit = std::numeric_limits<int>::max() - 10;
 
@@ -259,56 +265,6 @@ private:
   StepTable* myTable;
 };
 
-/*
-  Class       : EntityGUI_FieldDlg::StepTable
-  Description : Table widget
-*/
-
-class EntityGUI_FieldDlg::StepTable : public QTableWidget
-{
-  //Q_OBJECT
-
-  int                      myDataType;
-  int                      myStepID;
-  int                      myStamp;
-  GEOM::GEOM_FieldStep_var myStep;
-  bool                     myIsChanged;
-
-  QTableWidgetItem * newDefaultItem();
-public:
-  StepTable( int stepID, int dataType, int nbRows, int nbColumns,
-             QString shapeName, QStringList headers,
-             GEOM::GEOM_FieldStep_ptr stepVar, QWidget* = 0 );
-  virtual ~StepTable();
-
-  QSize                    minimumSizeHint() const;
-
-  void                     setEditable( bool, int, int );
-  bool                     isEditable( int, int ) const;
-
-  void                     setReadOnly( bool );
-  bool                     isReadOnly() const;
-
-  void                     insertRows( int, int = 1 );
-  QString                  text( int, int );
-
-  QList<int>               selectedRows();
-  void                     selectRows(const QList<int>& rows);
-
-  void                     setDim( int nbRows, QString shapeName, bool setDefault=true );
-  void                     setNbComps( int nbComps );
-  void                     setDataType( int dataType );
-  void                     setStamp( int stamp ) { myStamp = stamp; }
-  int                      getStamp() { return myStamp; }
-  int                      getStepID() { return myStepID; }
-  QStringList              getHeaders();
-  void                     setHeaders(const QStringList& headers);
-  GEOM::GEOM_FieldStep_var getStep() { return myStep; }
-  void                     setValues(GEOM::GEOM_FieldStep_var& step);
-
-  void                     setIsChanged() { myIsChanged = true; }
-};
-
 EntityGUI_FieldDlg::Delegate::Delegate( QObject* parent )
   : QItemDelegate( parent ), 
     myTable( dynamic_cast<EntityGUI_FieldDlg::StepTable*>( parent ) )
@@ -420,8 +376,11 @@ EntityGUI_FieldDlg::StepTable::StepTable (int stepID, int dataType,
   setReadOnly( false );
 
   if ( stepVar->_is_nil() )
-    return;
+  {
+    connect( horizontalHeader(), SIGNAL( sectionDoubleClicked( int ) ), this, SLOT( headerDblClicked( int ) ) );
 
+    return;
+  }
   myStamp = stepVar->GetStamp();
 
   const int nbColumns = nbComps + 1;
@@ -439,6 +398,7 @@ EntityGUI_FieldDlg::StepTable::StepTable (int stepID, int dataType,
           for ( int iC = 1; iC < nbColumns; ++iC )
             setItem( iR, iC, new CheckItem( vals[ iV++ ]));
     }
+    connect( this, SIGNAL( itemClicked(QTableWidgetItem *)), this, SLOT( setIsChanged() ));
     break;
   }
   case 1:
@@ -803,6 +763,23 @@ void EntityGUI_FieldDlg::StepTable::setValues(GEOM::GEOM_FieldStep_var& step)
   return;
 }
 
+//=======================================================================
+//function : headerDblClicked
+//purpose  : rename column, called when used double-clicks on the header
+//=======================================================================
+
+void EntityGUI_FieldDlg::StepTable::headerDblClicked( int section )
+{
+  if ( section > 0 ) {
+    bool bOk;
+    QString label = QInputDialog::getText( this, EntityGUI_FieldDlg::tr( "RENAME_COMPONENT" ),
+                                           EntityGUI_FieldDlg::tr ( "COMPONENT_NAME" ), QLineEdit::Normal,
+                                           horizontalHeaderItem( section )->text(), &bOk );
+    if ( bOk && !label.isEmpty() )
+      horizontalHeaderItem( section )->setText( label );
+  }
+}
+
 //=======================================================================
 //function : EntityGUI_FieldDlg
 //purpose  : 
@@ -896,29 +873,32 @@ EntityGUI_FieldDlg::EntityGUI_FieldDlg (GeometryGUI* theGeometryGUI,
   switchTableGrpLayout->setMargin(0);
   switchTableGrpLayout->setSpacing(0);
 
-  // step browse controls
-  myPrevStepBtn = new QPushButton( tr("PREV_STEP"), valsGroup );
+  // step add/rm controls
+  QPushButton* addStepBtn = new QPushButton( tr("ADD_STEP"), valsGroup );
   QLabel* curStepLbl = new QLabel(tr("STEP"), valsGroup );
+  myStepEdit = new QLineEdit( valsGroup );
   myStepsCombo = new QComboBox(valsGroup);
-  myNextStepBtn = new QPushButton( tr("NEXT_STEP"), valsGroup );
+  myStepsCombo->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+  myRmStepBtn = new QPushButton( tr("REMOVE_STEP"), valsGroup );
 
-  // step add/rm controls
-  QPushButton* addStepBtn = new QPushButton( tr("ADD_STEP"), valsGroup );
+  // step browse controls
+  myPrevStepBtn = new QPushButton( tr("PREV_STEP"), valsGroup );
   QLabel* stampLbl = new QLabel(tr("STAMP"), valsGroup );
   myStampSpin = new SalomeApp_IntSpinBox( -theIntLimit, theIntLimit, 1, valsGroup, true, true);
-  myRmStepBtn = new QPushButton( tr("REMOVE_STEP"), valsGroup );
-
-  valsLayout->addWidget(mySwitchTableWdg,   0, 0, 1, 4);
-  valsLayout->addWidget(myPrevStepBtn,      1, 0);
+  myNextStepBtn = new QPushButton( tr("NEXT_STEP"), valsGroup );
+  
+  valsLayout->addWidget(mySwitchTableWdg,   0, 0, 1, 5);
+  valsLayout->addWidget(addStepBtn,         1, 0);
   valsLayout->addWidget(curStepLbl,         1, 1);
-  valsLayout->addWidget(myStepsCombo,       1, 2);
-  valsLayout->addWidget(myNextStepBtn,      1, 3);
-  valsLayout->addWidget(addStepBtn,         2, 0);
+  valsLayout->addWidget(myStepEdit,         1, 2);
+  valsLayout->addWidget(myStepsCombo,       1, 3);
+  valsLayout->addWidget(myRmStepBtn,        1, 4);
+  valsLayout->addWidget(myPrevStepBtn,      2, 0);
   valsLayout->addWidget(stampLbl,           2, 1);
-  valsLayout->addWidget(myStampSpin,        2, 2);
-  valsLayout->addWidget(myRmStepBtn,        2, 3);
+  valsLayout->addWidget(myStampSpin,        2, 2, 1, 2);
+  valsLayout->addWidget(myNextStepBtn,      2, 4);
 
-  valsLayout->setColumnStretch(2, 5);
+  valsLayout->setColumnStretch(3, 5);
   valsLayout->setRowStretch   (0, 5);
 
   QVBoxLayout* layout = new QVBoxLayout(centralWidget());
@@ -960,6 +940,16 @@ EntityGUI_FieldDlg::~EntityGUI_FieldDlg()
   }
   // if ( !myField->_is_nil())
   //   aDisplayer->Display(myField);
+
+  QListIterator<int> anIter( myHiddenFieldStepIds );
+  while( anIter.hasNext() )
+  {
+    const int aStepId = anIter.next();
+    GEOM::GEOM_FieldStep_var step = myField->GetStep( aStepId );
+    if( !step->_is_nil() )
+      aDisplayer->Display( step, false );
+  }
+  aDisplayer->UpdateViewer();
 }
 
 //=================================================================================
@@ -969,6 +959,7 @@ EntityGUI_FieldDlg::~EntityGUI_FieldDlg()
 void EntityGUI_FieldDlg::Init()
 {
   myDmMode = -1;
+  myHiddenFieldStepIds.clear();
   myStepsCombo->clear();
 
   if ( myIsCreation || myField->_is_nil() )
@@ -995,6 +986,29 @@ void EntityGUI_FieldDlg::Init()
   }
   else // edition
   {
+    // 1) get and sort step IDs
+    // 2) hide all displayed field steps' presentations
+    GEOM_Displayer* aDisplayer = getDisplayer();
+    GEOM::ListOfLong_var stepIDs = myField->GetSteps();
+    size_t i;
+    QList< int > stepsList;
+    for ( i = 0; i < stepIDs->length(); ++i )
+    {
+      int aStepId = stepIDs[i];
+      stepsList.push_back( aStepId );
+      GEOM::GEOM_FieldStep_var step = myField->GetStep( aStepId );
+      if( !step->_is_nil() )
+      {
+        QString anEntry( step->GetStudyEntry() );
+        if( aDisplayer->IsDisplayed( anEntry ) )
+        {
+          aDisplayer->Erase( step, false, false );
+          myHiddenFieldStepIds << aStepId;
+        }
+      }
+    }
+    qSort( stepsList.begin(), stepsList.end() );
+
     myIsCreation = false;
 
     CORBA::String_var fName = myField->GetName();
@@ -1020,15 +1034,8 @@ void EntityGUI_FieldDlg::Init()
     myDimCombo->setEnabled( false );
     myNbCompsSpin->setEnabled( false );
 
-    // get and sort step IDs
-    GEOM::ListOfLong_var stepIDs = myField->GetSteps();
-    QList< int > stepsList;
-    for ( size_t i = 0; i < stepIDs->length(); ++i )
-      stepsList.push_back( stepIDs[i] );
-    qSort( stepsList.begin(), stepsList.end() );
-
     myStepsCombo->blockSignals( true );
-    for ( size_t i = 0; i < stepIDs->length(); ++i )
+    for ( i = 0; i < stepIDs->length(); ++i )
     {
       myStepsCombo->insertItem( i, QString::number( stepsList[i] ));
       if ( myCurStepID == stepsList[i] )
@@ -1174,8 +1181,8 @@ void EntityGUI_FieldDlg::SelectionIntoArgument()
           myEditCurrentArgument = 0;
 
           // re-fill myDimCombo
-          const int curDim = getDim();
-          updateDims( curDim );
+          //const int curDim = getDim();
+          updateDims( -100 );
 
           // update table
           onDimChange();
@@ -1289,17 +1296,44 @@ void EntityGUI_FieldDlg::onNextStep()
   }
 }
 
+static int findInCombo( QComboBox* where, int what, bool& ok )
+{
+  int idx = 0;
+  ok = false;
+
+  for ( ; idx < where->count() && !ok; idx++ ) {
+    int step = where->itemText( idx ).toInt();
+    if ( step == what ) {
+      ok = true;
+    }
+    else if ( step > what )
+      break;
+  }
+  
+  return idx;
+}
+
 //=======================================================================
 //function : onAddStep
 //purpose  : 
 //=======================================================================
 void EntityGUI_FieldDlg::onAddStep()
 {
-  if ( myStepsCombo->count() > 0 )
-    myCurStepID = myStepsCombo->itemText( myStepsCombo->count()-1 ).toInt() + 1;
+  int step = 0;
 
-  myStepsCombo->insertItem( myStepsCombo->count(), QString::number( myCurStepID ));
-  myStepsCombo->setCurrentIndex( myStepsCombo->count() - 1 );
+  if ( !myStepEdit->text().isEmpty() )
+    step = myStepEdit->text().toInt();
+  bool ok = false;
+  int idx = findInCombo( myStepsCombo, step, ok );
+  
+  if ( ok ) {
+    SUIT_MessageBox::critical(this, QObject::tr("ERR_ERROR"),
+                             tr("ERR_STEP_EXISTS"));
+    return;
+  }
+
+  myStepsCombo->insertItem( idx, QString::number( step ));
+  myStepsCombo->setCurrentIndex( idx );
   myRemovedSteps.remove( getCurStepID() );
   //showCurStep();
 }
@@ -1308,7 +1342,6 @@ void EntityGUI_FieldDlg::onAddStep()
 //function : onRmStep
 //purpose  : 
 //=======================================================================
-
 void EntityGUI_FieldDlg::onRmStep()
 {
   if ( myStepsCombo->count() > 1 )
@@ -1327,7 +1360,6 @@ void EntityGUI_FieldDlg::onRmStep()
 //function : onStampChange
 //purpose  : 
 //=======================================================================
-
 void EntityGUI_FieldDlg::onStampChange()
 {
   if ( myCurStepTable )
@@ -1338,10 +1370,10 @@ void EntityGUI_FieldDlg::onStampChange()
 //function : showCurStep
 //purpose  : 
 //=======================================================================
-
 void EntityGUI_FieldDlg::showCurStep()
 {
-  myCurStepID = getCurStepID();
+  myCurStepID = getCurStepID(); 
+  myStepEdit->setText(QString::number( myCurStepID ));
 
   QStringList headers;
   if ( myCurStepTable )
@@ -1492,7 +1524,6 @@ TopAbs_ShapeEnum EntityGUI_FieldDlg::getShapeType(int* dim) const
 //function : getDim
 //purpose  : 
 //=======================================================================
-
 int EntityGUI_FieldDlg::getDim() const
 {
   int i = myDimCombo->currentIndex();
@@ -1503,7 +1534,6 @@ int EntityGUI_FieldDlg::getDim() const
 //function : getDataType
 //purpose  : 
 //=======================================================================
-
 int EntityGUI_FieldDlg::getDataType() const
 {
   return myTypeCombo->currentIndex();
@@ -1513,7 +1543,6 @@ int EntityGUI_FieldDlg::getDataType() const
 //function : getCurStepID
 //purpose  : 
 //=======================================================================
-
 int EntityGUI_FieldDlg::getCurStepID() const
 {
   if ( myStepsCombo->count() > 0 )
@@ -1525,7 +1554,6 @@ int EntityGUI_FieldDlg::getCurStepID() const
 //function : getNbComps
 //purpose  : 
 //=======================================================================
-
 int EntityGUI_FieldDlg::getNbComps() const
 {
   return myNbCompsSpin->value();
@@ -1565,7 +1593,6 @@ void EntityGUI_FieldDlg::updateShapeIDs()
 //function : updateDims
 //purpose  : update myDimCombo
 //=======================================================================
-
 void EntityGUI_FieldDlg::updateDims(int curDim)
 {
   myDimCombo->blockSignals( true );
@@ -1581,15 +1608,15 @@ void EntityGUI_FieldDlg::updateDims(int curDim)
     {
       exp.Init( aShape, getShapeType(&dim));
       if ( exp.More() && !aShape.IsSame( exp.Current() ))
-      {
         myDimCombo->insertItem( dim, tr( subNames[dim] ), dim );
-        if ( dim == curDim )  // restore current dim
-          myDimCombo->setCurrentIndex( myDimCombo->count()-1 );
-      }
     }
     myDimCombo->insertItem( 4, tr("WHOLE"), -1 );
-    if ( getDim() != curDim )
-      myDimCombo->setCurrentIndex( myDimCombo->count()-1 );
+
+    int idx = myDimCombo->findData( curDim );
+    if ( idx != -1 )
+      myDimCombo->setCurrentIndex( idx );
+    else 
+      myDimCombo->setCurrentIndex( myDimCombo->count()-1-(myDimCombo->count()>1?1:0) );
   }
   myDimCombo->blockSignals( false );
 }
@@ -1880,6 +1907,8 @@ bool EntityGUI_FieldDlg::execute()
   for ( ; i_tbl != myStepTables.end(); ++i_tbl )
   {
     StepTable* tbl = i_tbl.value();
+    QString stepName = (tr("STEP")+" %1 %2").arg( tbl->getStepID() ).arg( tbl->getStamp() );
+
     GEOM::GEOM_FieldStep_var step = tbl->getStep();
     if ( step->_is_nil() )
     {
@@ -1888,7 +1917,6 @@ bool EntityGUI_FieldDlg::execute()
       {
         step = myField->AddStep( tbl->getStepID(), tbl->getStamp() );
 
-        QString stepName = (tr("STEP")+" %1 %2").arg( tbl->getStepID() ).arg( tbl->getStamp() );
         SALOMEDS::SObject_wrap aSO =
           getGeomEngine()->AddInStudy( aStudyDS, step, stepName.toLatin1().constData(), myField );
         if ( /*!myIsCreation &&*/ !aSO->_is_nil() ) {
@@ -1898,8 +1926,26 @@ bool EntityGUI_FieldDlg::execute()
         }
       }
     }
+    else if ( step->GetStamp() != tbl->getStamp() )
+    {
+      // update a stamp in the object browser
+      CORBA::String_var entry = step->GetStudyEntry();
+      if ( entry.in() ) {
+        SALOMEDS::SObject_wrap SO = aStudyDS->FindObjectID( entry.in() );
+        if ( !SO->_is_nil() )
+          aBuilder->SetName( SO, stepName.toLatin1().constData() );
+      }
+    }
+
     tbl->setValues( step );
+
+    // update the presentation if it is displayed
+    CORBA::String_var aStepEntry = step->GetStudyEntry();
+    Handle(SALOME_InteractiveObject) aStepIO =
+      new SALOME_InteractiveObject( aStepEntry.in(), "GEOM", "TEMP_IO" );
+    getDisplayer()->Redisplay( aStepIO, false, false );
   }
+  getDisplayer()->UpdateViewer();
 
   // remove steps
   if ( !myIsCreation )