Salome HOME
Merge remote-tracking branch 'remotes/origin/hydro/imps_2017_salome_83' into HEAD
[modules/geom.git] / src / EntityGUI / EntityGUI_FieldDlg.cxx
index 9b546f5430746bd465f61787d5a6ea5d0fb9f770..38b891fdb43d4000639f52dbc46899818d7e7c5c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  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>
@@ -374,11 +375,12 @@ EntityGUI_FieldDlg::StepTable::StepTable (int stepID, int dataType,
   // set edit triggers by default
   setReadOnly( false );
 
-  connect( horizontalHeader(), SIGNAL( sectionDoubleClicked( int ) ), this, SLOT( headerDblClicked( int ) ) );
-
   if ( stepVar->_is_nil() )
-    return;
+  {
+    connect( horizontalHeader(), SIGNAL( sectionDoubleClicked( int ) ), this, SLOT( headerDblClicked( int ) ) );
 
+    return;
+  }
   myStamp = stepVar->GetStamp();
 
   const int nbColumns = nbComps + 1;
@@ -771,8 +773,8 @@ 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 );
+                                           EntityGUI_FieldDlg::tr ( "COMPONENT_NAME" ), QLineEdit::Normal,
+                                           horizontalHeaderItem( section )->text(), &bOk );
     if ( bOk && !label.isEmpty() )
       horizontalHeaderItem( section )->setText( label );
   }
@@ -871,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());
@@ -1176,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();
@@ -1291,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();
 }
@@ -1310,7 +1342,6 @@ void EntityGUI_FieldDlg::onAddStep()
 //function : onRmStep
 //purpose  : 
 //=======================================================================
-
 void EntityGUI_FieldDlg::onRmStep()
 {
   if ( myStepsCombo->count() > 1 )
@@ -1329,7 +1360,6 @@ void EntityGUI_FieldDlg::onRmStep()
 //function : onStampChange
 //purpose  : 
 //=======================================================================
-
 void EntityGUI_FieldDlg::onStampChange()
 {
   if ( myCurStepTable )
@@ -1340,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 )
@@ -1494,7 +1524,6 @@ TopAbs_ShapeEnum EntityGUI_FieldDlg::getShapeType(int* dim) const
 //function : getDim
 //purpose  : 
 //=======================================================================
-
 int EntityGUI_FieldDlg::getDim() const
 {
   int i = myDimCombo->currentIndex();
@@ -1505,7 +1534,6 @@ int EntityGUI_FieldDlg::getDim() const
 //function : getDataType
 //purpose  : 
 //=======================================================================
-
 int EntityGUI_FieldDlg::getDataType() const
 {
   return myTypeCombo->currentIndex();
@@ -1515,7 +1543,6 @@ int EntityGUI_FieldDlg::getDataType() const
 //function : getCurStepID
 //purpose  : 
 //=======================================================================
-
 int EntityGUI_FieldDlg::getCurStepID() const
 {
   if ( myStepsCombo->count() > 0 )
@@ -1527,7 +1554,6 @@ int EntityGUI_FieldDlg::getCurStepID() const
 //function : getNbComps
 //purpose  : 
 //=======================================================================
-
 int EntityGUI_FieldDlg::getNbComps() const
 {
   return myNbCompsSpin->value();
@@ -1567,7 +1593,6 @@ void EntityGUI_FieldDlg::updateShapeIDs()
 //function : updateDims
 //purpose  : update myDimCombo
 //=======================================================================
-
 void EntityGUI_FieldDlg::updateDims(int curDim)
 {
   myDimCombo->blockSignals( true );
@@ -1583,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 );
 }
@@ -1670,7 +1695,7 @@ void EntityGUI_FieldDlg::activateSelection()
         TopoDS_Shape aSubShape = myShapeMap( index );
         QString anEntry = QString( "TEMP_" ) + aMainEntry.in() + QString("_%1").arg(index);
         Handle(SALOME_InteractiveObject) io =
-          new SALOME_InteractiveObject(anEntry.toAscii(), "GEOM", "TEMP_IO");
+          new SALOME_InteractiveObject(anEntry.toLatin1(), "GEOM", "TEMP_IO");
         aDisplayer->SetColor( aCol );
         SALOME_Prs* aPrs = aDisplayer->buildSubshapePresentation(aSubShape, anEntry, aView);
         if (aPrs) {
@@ -1882,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() )
     {
@@ -1890,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() ) {
@@ -1900,6 +1926,17 @@ 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
@@ -1945,3 +1982,15 @@ bool EntityGUI_FieldDlg::execute()
 
   return true;
 }
+
+//=================================================================================
+// function : getSourceObjects
+// purpose  : virtual method to get source objects
+//=================================================================================
+QList<GEOM::GeomObjPtr> EntityGUI_FieldDlg::getSourceObjects()
+{
+  QList<GEOM::GeomObjPtr> res;
+  GEOM::GeomObjPtr aGeomObjPtr(myField->GetShape());
+  res << aGeomObjPtr;
+  return res;
+}