Salome HOME
Merge remote-tracking branch 'remotes/origin/BR_v14_rc' into BR_SHP_FORMAT
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_StricklerTableOp.cxx
index 464b74854a8da9ce893e9a72461bf31b6564cb10..7f021249af4ac11fc8a8be0fdbb1fcebf164a77d 100644 (file)
@@ -19,8 +19,9 @@
 #include "HYDROGUI_StricklerTableOp.h"
 
 #include "HYDROGUI_StricklerTableDlg.h"
-#include "HYDROGUI_Tool.h"
 #include "HYDROGUI_DataObject.h"
+#include "HYDROGUI_Operations.h"
+#include "HYDROGUI_Tool.h"
 
 #include <HYDROData_Document.h>
 
 
 #include <QFileInfo>
 
-HYDROGUI_StricklerTableOp::HYDROGUI_StricklerTableOp( HYDROGUI_Module* theModule, bool theIsEdit )
-: HYDROGUI_Operation( theModule ), 
-  myIsEdit( theIsEdit )
+HYDROGUI_StricklerTableOp::HYDROGUI_StricklerTableOp( HYDROGUI_Module* theModule, int theType )
+    : HYDROGUI_Operation( theModule ), 
+    myType( theType )
 {
-  setName( theIsEdit ? tr( "EDIT_STRICKLER_TABLE" ) : tr( "IMPORT_STRICKLER_TABLE" ) );
+    setName( isEdit() ? tr( "EDIT_STRICKLER_TABLE" ) :
+                        ( isImport() ? tr( "IMPORT_STRICKLER_TABLE" ) : tr( "EXPORT_STRICKLER_TABLE" ) ) );
 }
 
-
 HYDROGUI_StricklerTableOp::~HYDROGUI_StricklerTableOp()
 {
 }
 
 void HYDROGUI_StricklerTableOp::startOperation()
 {   
-  HYDROGUI_Operation::startOperation();
+    HYDROGUI_Operation::startOperation();
 
-  HYDROGUI_StricklerTableDlg* aPanel = (HYDROGUI_StricklerTableDlg*)inputPanel();
-  aPanel->reset();
-  aPanel->setIsEdit( myIsEdit );
+    HYDROGUI_StricklerTableDlg* aPanel = (HYDROGUI_StricklerTableDlg*)inputPanel();
+    aPanel->reset();
 
-  if( myIsEdit )
-  {
-    if ( isApplyAndClose() )
-         myEditedObject = Handle(HYDROData_StricklerTable)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
-    if ( !myEditedObject.IsNull() )
+    if ( !isImport() && isApplyAndClose() )
+        myObject = Handle(HYDROData_StricklerTable)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
+
+    if ( isEdit() )
     {
-      // Edit selected Strickler table
-
-      aPanel->setStricklerTableName( myEditedObject->GetName() );
-
-      // Get Strickler table data from the data model
-      // ...
-
-      // The code below is a sample of data filling Strickler table
-      HYDROGUI_StricklerTableDlg::StricklerCoefficientList aData;
-      HYDROGUI_StricklerTableDlg::StricklerCoefficient aStricklerCoef1( "Zones de champs, prairies, sans cultures", 20.0 );
-      HYDROGUI_StricklerTableDlg::StricklerCoefficient aStricklerCoef2( "Zones de champs cultivé à végétation basse", 17.5 );
-      HYDROGUI_StricklerTableDlg::StricklerCoefficient aStricklerCoef3( "Zones de champs cultivé à végétation haute", 12.5 );
-      HYDROGUI_StricklerTableDlg::StricklerCoefficient aStricklerCoef4( "Zones d'arbustes, de sous-bois", 10.0 );
-      HYDROGUI_StricklerTableDlg::StricklerCoefficient aStricklerCoef5( "Zones à faible urbanization (bourg)", 9.0 );
-      HYDROGUI_StricklerTableDlg::StricklerCoefficient aStricklerCoef6( "Zones à forte urbanization (agglomération)", 9.0 );
-      HYDROGUI_StricklerTableDlg::StricklerCoefficient aStricklerCoef7( "Canaux naturels", 35.0 );
-      HYDROGUI_StricklerTableDlg::StricklerCoefficient aStricklerCoef8( "Canaux artificiels en béton", 65.0 );
-      aData.append( aStricklerCoef1 );
-      aData.append( aStricklerCoef2 );
-      aData.append( aStricklerCoef3 );
-      aData.append( aStricklerCoef4 );
-      aData.append( aStricklerCoef5 );
-      aData.append( aStricklerCoef6 );
-      aData.append( aStricklerCoef7 );
-      aData.append( aStricklerCoef8 );
-      aPanel->setData(aData);
+        if ( !myObject.IsNull() )
+        {
+            // Edit selected Strickler table
+            aPanel->setTableName( myObject->GetName() );
+
+            // Get Strickler table data from the data model
+            HYDROGUI_StricklerTableDlg::StricklerCoefficientList aData;
+            TColStd_SequenceOfExtendedString aTypes = myObject->GetTypes();
+            for ( int i = 1; i <= aTypes.Length(); i++ )
+                aData.append( HYDROGUI_StricklerTableDlg::StricklerCoefficient( HYDROGUI_Tool::ToQString( aTypes.Value( i ) ),
+                myObject->Get( aTypes.Value( i ), 0 ) ) );
+
+            aPanel->setData( aData );
+        }
     }
-    else
+    else if ( isExport() )
     {
-      // Import Strickler table from file
+        if ( !myObject.IsNull() )
+            aPanel->setTableName( myObject->GetName() );
     }
-  }
+    aPanel->setTableNameReadOnly( isExport() );
 }
 
 void HYDROGUI_StricklerTableOp::abortOperation()
 {
-  //...
-
-  HYDROGUI_Operation::abortOperation();
+    HYDROGUI_Operation::abortOperation();
 }
 
 void HYDROGUI_StricklerTableOp::commitOperation()
 {
-  //...
-
-  HYDROGUI_Operation::commitOperation();
+    HYDROGUI_Operation::commitOperation();
 }
 
 HYDROGUI_InputPanel* HYDROGUI_StricklerTableOp::createInputPanel() const
 {
-  HYDROGUI_StricklerTableDlg* aPanel = new HYDROGUI_StricklerTableDlg( module(), getName() );  
-  connect( aPanel, SIGNAL( fileSelected( const QString& ) ), SLOT( onFileSelected() ) );
-  return aPanel;
+    int type = isEdit() ? HYDROGUI_StricklerTableDlg::Edit : ( isImport() ? HYDROGUI_StricklerTableDlg::Import : HYDROGUI_StricklerTableDlg::Export );
+    HYDROGUI_StricklerTableDlg* aPanel = new HYDROGUI_StricklerTableDlg( module(), getName(), type );
+    connect( aPanel, SIGNAL( fileSelected( const QString& ) ), SLOT( onFileSelected() ) );
+    return aPanel;
 }
 
 bool HYDROGUI_StricklerTableOp::processApply( int& theUpdateFlags, QString& theErrorMsg,
-                                              QStringList& theBrowseObjectsEntries )
+    QStringList& theBrowseObjectsEntries )
 {
-  HYDROGUI_StricklerTableDlg* aPanel = ::qobject_cast<HYDROGUI_StricklerTableDlg*>( inputPanel() );
-  if ( !aPanel )
-    return false;
-
-  QString aFilePath;
-  if( !myIsEdit )
-  {
-    aFilePath = aPanel->getFileName();
-    if ( aFilePath.isEmpty() )
+    HYDROGUI_StricklerTableDlg* aPanel = ::qobject_cast<HYDROGUI_StricklerTableDlg*>( inputPanel() );
+    if ( !aPanel )
+        return false;
+
+    QString aFilePath;
+    if( !isEdit() )
+    {
+        aFilePath = aPanel->getFileName();
+        if ( aFilePath.isEmpty() )
+        {
+            theErrorMsg = tr( "SELECT_STRICKLER_TABLE_FILE" ).arg( aFilePath );
+            return false;
+        }
+    }
+
+    QString aStricklerTableName = aPanel->getTableName().simplified();
+    if ( aStricklerTableName.isEmpty() )
+    {
+        theErrorMsg = tr( "INCORRECT_OBJECT_NAME" );
+        return false;
+    }
+
+    if ( isImport() || ( isEdit() && !myObject.IsNull() && myObject->GetName() != aStricklerTableName ) )
+    {
+        // check that there are no other objects with the same name in the document
+        Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), aStricklerTableName );
+        if( !anObject.IsNull() )
+        {
+            theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( aStricklerTableName );
+            return false;
+        }
+    }
+
+    Handle(HYDROData_StricklerTable) aStricklerTableObj;
+    if ( isImport() )
+    {
+        aStricklerTableObj = Handle(HYDROData_StricklerTable)::DownCast( doc()->CreateObject( KIND_STRICKLER_TABLE ) );
+        QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aStricklerTableObj );
+        theBrowseObjectsEntries.append( anEntry );
+    }
+    else
+        aStricklerTableObj = myObject;
+
+    if ( aStricklerTableObj.IsNull() )
+        return false;
+
+    if ( isExport() )
+    {
+        bool res = false;
+        QString aFilePath = aPanel->getFileName().simplified();
+        if ( !aFilePath.isEmpty() )
+            res = aStricklerTableObj->Export( HYDROGUI_Tool::ToAsciiString( aFilePath ) );
+        return res;
+    }
+
+    startDocOperation();
+
+    aStricklerTableObj->SetName( aStricklerTableName );
+
+    if( isEdit() )
+    {
+        // Get data from input panel's table and save it into data model object
+        aStricklerTableObj->Clear();
+        HYDROGUI_StricklerTableDlg::StricklerCoefficientList aData = aPanel->getData();
+        for ( HYDROGUI_StricklerTableDlg::StricklerCoefficientList::iterator it = aData.begin(); it != aData.end(); ++it )
+        {
+            const HYDROGUI_StricklerTableDlg::StricklerCoefficient& anInfo = *it;
+            aStricklerTableObj->Set( HYDROGUI_Tool::ToExtString( anInfo.myType ), anInfo.myCoefficient );
+        }
+    }
+    else
     {
-      theErrorMsg = tr( "SELECT_STRICKLER_TABLE_FILE" ).arg( aFilePath );
-      return false;
+        // Import data from Strickler table file into data model object
+        aStricklerTableObj->Import( HYDROGUI_Tool::ToAsciiString( aFilePath ) );
     }
-  }
-
-  QString aStricklerTableName = aPanel->getStricklerTableName().simplified();
-  if ( aStricklerTableName.isEmpty() )
-  {
-    theErrorMsg = tr( "INCORRECT_OBJECT_NAME" );
-    return false;
-  }
-
-  if( !myIsEdit || ( !myEditedObject.IsNull() && myEditedObject->GetName() != aStricklerTableName ) )
-  {
-    // check that there are no other objects with the same name in the document
-    Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), aStricklerTableName );
-    if( !anObject.IsNull() )
+
+    aStricklerTableObj->Update();
+
+    commitDocOperation();
+
+    if( !isEdit() )
     {
-      theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( aStricklerTableName );
-      return false;
+        QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aStricklerTableObj );
+        theBrowseObjectsEntries.append( anEntry );
     }
-  }
-
-  Handle(HYDROData_StricklerTable) aStricklerTableObj;
-  if( myIsEdit )
-    aStricklerTableObj = myEditedObject;
-  else
-  {
-    aStricklerTableObj = Handle(HYDROData_StricklerTable)::DownCast( doc()->CreateObject( KIND_STRICKLER_TABLE ) );
-    QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aStricklerTableObj );
-    theBrowseObjectsEntries.append( anEntry );
-  }
-
-  if( aStricklerTableObj.IsNull() )
-    return false;
-
-  aStricklerTableObj->SetName( aStricklerTableName );
-
-  if( myIsEdit )
-  {
-    // Get data from input panel's table and save it into data model object
-    
-    // Check, that type names are unique within the current
-    // Strickler table and show error message, if needed
-
-    //...
-  }
-  else
-  {
-    // Import data from Strickler table file into data model object
-    aStricklerTableObj->Import( HYDROGUI_Tool::ToAsciiString( aFilePath ) );
-  }
-
-  aStricklerTableObj->Update();
-
-  if( !myIsEdit )
-  {
-    QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aStricklerTableObj );
-    theBrowseObjectsEntries.append( anEntry );
-  }
-
-  theUpdateFlags |= UF_ObjBrowser;
-
-  return true;
+
+    theUpdateFlags |= UF_ObjBrowser;
+
+    return true;
 }
 
 void HYDROGUI_StricklerTableOp::onFileSelected()
 {
-  HYDROGUI_StricklerTableDlg* aPanel = 
-    ::qobject_cast<HYDROGUI_StricklerTableDlg*>( inputPanel() );
-  if ( !aPanel )
-    return;
-
-  QString anStricklerTableName = aPanel->getStricklerTableName().simplified();
-  if ( anStricklerTableName.isEmpty() )
-  {
-    anStricklerTableName = aPanel->getFileName();
-    if ( !anStricklerTableName.isEmpty() ) {
-        anStricklerTableName = QFileInfo( anStricklerTableName ).baseName();
-    }
+    HYDROGUI_StricklerTableDlg* aPanel = 
+        ::qobject_cast<HYDROGUI_StricklerTableDlg*>( inputPanel() );
+    if ( !aPanel )
+        return;
 
-    if ( anStricklerTableName.isEmpty() ) {
-      anStricklerTableName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_STRICKLER_TABLE_NAME" ) );
+    QString anStricklerTableName = aPanel->getTableName().simplified();
+    if ( anStricklerTableName.isEmpty() )
+    {
+        anStricklerTableName = aPanel->getFileName();
+        if ( !anStricklerTableName.isEmpty() ) {
+            anStricklerTableName = QFileInfo( anStricklerTableName ).baseName();
+        }
+
+        if ( anStricklerTableName.isEmpty() ) {
+            anStricklerTableName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_STRICKLER_TABLE_NAME" ) );
+        }
+        aPanel->setTableName( anStricklerTableName );
     }
-    aPanel->setStricklerTableName( anStricklerTableName );
-  }
+}
+
+bool HYDROGUI_StricklerTableOp::isEdit() const
+{
+    return myType == EditStricklerTableId;
+}
+
+bool HYDROGUI_StricklerTableOp::isImport() const
+{
+    return myType == ImportStricklerTableFromFileId;
+}
+
+bool HYDROGUI_StricklerTableOp::isExport() const
+{
+    return myType == ExportStricklerTableFromFileId;
 }