X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSalomeApp%2FSalomeApp_Study.cxx;h=70bd944cbdf7458bfc2b35f49957c6cbf107c4e3;hb=02904c3728214667f919cfe06072a91e1687b12f;hp=a6dd9377f845c271af85c6eb10d98015e5a21e16;hpb=5ab4e9f868874916c91b51f12aa8beacf09f4125;p=modules%2Fgui.git diff --git a/src/SalomeApp/SalomeApp_Study.cxx b/src/SalomeApp/SalomeApp_Study.cxx index a6dd9377f..70bd944cb 100644 --- a/src/SalomeApp/SalomeApp_Study.cxx +++ b/src/SalomeApp/SalomeApp_Study.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 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 @@ -41,6 +41,9 @@ #include #include #include +#include +#include +#include #include @@ -75,7 +78,7 @@ class SalomeApp_Study::Observer_i : public virtual POA_SALOMEDS::Observer, QObje public: - Observer_i(_PTR(Study) aStudyDS, SalomeApp_Study* aStudy) + Observer_i(_PTR(Study) aStudyDS, SalomeApp_Study* aStudy):QObject(aStudy) { myStudyDS=aStudyDS; myStudy=aStudy; @@ -153,10 +156,10 @@ public: SUIT_DataObject* oldFather = suit_obj->parent(); if (oldFather) { oldFather->removeChild(suit_obj, false); - SalomeApp_Application* app = dynamic_cast( myStudy->application() ); - SUIT_AbstractModel* model = dynamic_cast(app->objectBrowser()->model()); - model->forgetObject( suit_obj ); - + SalomeApp_Application* app = dynamic_cast( myStudy->application() ); + SUIT_AbstractModel* model = dynamic_cast(app->objectBrowser()->model()); + model->forgetObject( suit_obj ); + if (SalomeApp_DataObject* oldFatherSA = dynamic_cast(oldFather)) { oldFatherSA->updateItem(); } @@ -167,7 +170,7 @@ public: entry2SuitObject[theID] = suit_obj; } - suit_obj->updateItem(); + suit_obj->updateItem(); // define position in the data tree (in aFatherDO) to insert the aSObj int pos = -1; //int childDataObjCount = aFatherDO->childCount(); @@ -183,6 +186,22 @@ public: //aFatherDO->insertChild(suit_obj, pos); aFatherDO->updateItem(); + /* Define visibility state */ + bool isComponent = dynamic_cast( suit_obj ) != 0; + if ( suit_obj && !isComponent && myStudy->visibilityState( theID.c_str() ) == Qtx::UnpresentableState ) { + QString moduleTitle = ((CAM_Application*)myStudy->application())->moduleTitle(suit_obj->componentDataType()); + if (!moduleTitle.isEmpty()) { + LightApp_Displayer* aDisplayer = LightApp_Displayer::FindDisplayer(moduleTitle,false); + if (aDisplayer) { + if(aDisplayer->canBeDisplayed(theID.c_str())) { + myStudy->setVisibilityState( theID.c_str(), Qtx::HiddenState ); //hide the just added object + //MESSAGE("Object with entry : "<< theID <<" CAN be displayed !!!"); + } + else + MESSAGE("Object with entry : "<< theID <<" CAN'T be displayed !!!"); + } + } + } } // END: work with tree nodes structure else { // BEGIN: work with study structure EntryMapIter it = entry2SuitObject.find( theID ); @@ -318,6 +337,13 @@ public: } break; } +#ifndef DISABLE_PYCONSOLE + case 6: //NoteBook variables were modified + { + myStudy->onNoteBookVarUpdate( QString( theID.c_str() ) ); + break; + } +#endif default:MESSAGE("Unknown event: " << event);break; } //switch } //notifyObserverID_real @@ -375,7 +401,18 @@ SalomeApp_Study::SalomeApp_Study( SUIT_Application* app ) */ SalomeApp_Study::~SalomeApp_Study() { + if ( myObserver ) { + PortableServer::ObjectId_var oid = myObserver->_default_POA()->servant_to_id( myObserver ); + myObserver->_default_POA()->deactivate_object( oid.in() ); + } +} + +#ifndef DISABLE_PYCONSOLE +void SalomeApp_Study::onNoteBookVarUpdate( QString theVarName) +{ + emit notebookVarUpdated( theVarName ); } +#endif /*! Gets study id. @@ -397,7 +434,7 @@ QString SalomeApp_Study::studyName() const // it can be changed outside of GUI // TEMPORARILY SOLUTION: better to be implemented with help of SALOMEDS observers if ( studyDS() ) { - QString newName = studyDS()->Name().c_str(); + QString newName = QString::fromUtf8(studyDS()->Name().c_str()); if ( LightApp_Study::studyName() != newName ) { SalomeApp_Study* that = const_cast( this ); that->setStudyName( newName ); @@ -424,7 +461,22 @@ bool SalomeApp_Study::createDocument( const QString& theStr ) // initialize myStudyDS, read HDF file QString aName = newStudyName(); - _PTR(Study) study ( SalomeApp_Application::studyMgr()->NewStudy( aName.toUtf8().data() ) ); + + _PTR(Study) study; + try { + study = _PTR(Study)( SalomeApp_Application::studyMgr()->NewStudy( aName.toUtf8().data() ) ); + } + catch(const SALOME_Exception& ex) { + SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), + tr("ERR_ERROR"), tr(ex.what())); + return false; + } + catch(...) { + SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), + tr("ERR_ERROR"), tr("CREATE_DOCUMENT_PROBLEM")); + return false; + } + if ( !study ) return false; @@ -460,7 +512,21 @@ bool SalomeApp_Study::openDocument( const QString& theFileName ) MESSAGE( "openDocument" ); // initialize myStudyDS, read HDF file - _PTR(Study) study ( SalomeApp_Application::studyMgr()->Open( theFileName.toUtf8().data() ) ); + _PTR(Study) study; + try { + study = _PTR(Study) ( SalomeApp_Application::studyMgr()->Open( theFileName.toUtf8().data() ) ); + } + catch(const SALOME_Exception& ex) { + SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), + tr("ERR_ERROR"), tr(ex.what())); + return false; + } + catch(...) { + SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), + tr("ERR_ERROR"), tr("OPEN_DOCUMENT_PROBLEM")); + return false; + } + if ( !study ) return false; @@ -543,6 +609,10 @@ bool SalomeApp_Study::loadDocument( const QString& theStudyName ) #endif bool res = CAM_Study::openDocument( theStudyName ); + + //rnv: to fix the "0051779: TC7.2.0: Save operation works incorrectly for study loaded from data server" + // mark study as "not saved" after call openDocument( ... ) method. + setIsSaved(false); emit opened( this ); bool restore = application()->resourceMgr()->booleanValue( "Study", "store_visual_state", true ); @@ -574,7 +644,7 @@ bool SalomeApp_Study::saveDocumentAs( const QString& theFileName ) // Cast to LightApp class in order to give a chance // to light modules to save their data if ( LightApp_DataModel* aModel = - dynamic_cast( it.next() ) ) { + dynamic_cast( it.next() ) ) { listOfFiles.clear(); aModel->saveAs( theFileName, this, listOfFiles ); if ( !listOfFiles.isEmpty() ) @@ -619,7 +689,7 @@ bool SalomeApp_Study::saveDocument() // Cast to LightApp class in order to give a chance // to light modules to save their data if ( LightApp_DataModel* aModel = - dynamic_cast( it.next() ) ) { + dynamic_cast( it.next() ) ) { listOfFiles.clear(); aModel->save(listOfFiles); if ( !listOfFiles.isEmpty() ) @@ -656,7 +726,9 @@ void SalomeApp_Study::closeDocument(bool permanently) _PTR(Study) studyPtr = studyDS(); if ( studyPtr ) { - if(permanently) { + if ( myObserver ) + myStudyDS->detach( myObserver->_this() ); + if ( permanently ) { SalomeApp_Application::studyMgr()->Close( studyPtr ); } SALOMEDSClient_Study* aStudy = 0; @@ -680,9 +752,9 @@ void SalomeApp_Study::closeDocument(bool permanently) \return - true if the operation succeeds, and false otherwise. */ bool SalomeApp_Study::dump( const QString& theFileName, - bool toPublish, - bool isMultiFile, - bool toSaveGUI ) + bool toPublish, + bool isMultiFile, + bool toSaveGUI ) { int savePoint; _PTR(AttributeParameter) ap; @@ -709,13 +781,13 @@ bool SalomeApp_Study::dump( const QString& theFileName, QStringList listOfFiles; while ( it.hasNext() ) { if ( LightApp_DataModel* aModel = - dynamic_cast( it.next() ) ) { + dynamic_cast( it.next() ) ) { listOfFiles.clear(); if ( aModel->dumpPython( theFileName, this, isMultiFile, listOfFiles ) && - !listOfFiles.isEmpty() ) - // This call simply passes the data model's dump output to SalomeApp_Engine servant. - // This code is shared with persistence mechanism. - // NOTE: this should be revised if behavior of saveModuleData() changes! + !listOfFiles.isEmpty() ) + // This call simply passes the data model's dump output to SalomeApp_Engine servant. + // This code is shared with persistence mechanism. + // NOTE: this should be revised if behavior of saveModuleData() changes! saveModuleData(aModel->module()->name(), listOfFiles); } } @@ -724,9 +796,9 @@ bool SalomeApp_Study::dump( const QString& theFileName, // any light module is present in the current configuration QFileInfo aFileInfo( theFileName ); bool res = aStudy->DumpStudy( aFileInfo.absolutePath().toUtf8().data(), - aFileInfo.baseName().toUtf8().data(), - toPublish, - isMultiFile); + aFileInfo.baseName().toUtf8().data(), + toPublish, + isMultiFile); if ( toSaveGUI ) removeSavePoint( savePoint ); //SRN: remove the created temporary save point. @@ -860,7 +932,7 @@ void SalomeApp_Study::setStudyDS( const _PTR(Study)& s ) \sa LightApp_Study class, LightApp_DataModel class */ CAM_ModuleObject* SalomeApp_Study::createModuleObject( LightApp_DataModel* theDataModel, - SUIT_DataObject* theParent ) const + SUIT_DataObject* theParent ) const { SalomeApp_Study* that = const_cast( this ); @@ -941,7 +1013,7 @@ void SalomeApp_Study::addComponent(const CAM_DataModel* dm) // Set default engine IOR // Issue 21377 - using separate engine for each type of light module std::string anEngineIOR = SalomeApp_Engine_i::EngineIORForComponent( aCompDataType.c_str(), - true ); + true ); aBuilder->DefineComponentInstance(aComp, anEngineIOR); //SalomeApp_DataModel::BuildTree( aComp, root(), this, /*skipExisitng=*/true ); SalomeApp_DataModel::synchronize( aComp, this ); @@ -1116,19 +1188,28 @@ void SalomeApp_Study::RemoveTemporaryFiles ( const char* theModuleName, const bo } } +#ifndef DISABLE_PYCONSOLE /*! Mark the study as saved in the file \param theFileName - the name of file */ -void SalomeApp_Study::markAsSavedIn(QString theFileName) +void SalomeApp_Study::updateFromNotebook( const QString& theFileName, bool isSaved ) { setStudyName(theFileName); - setIsSaved(true); + studyDS()->Name(theFileName.toStdString()); + setIsSaved( isSaved ); } +#endif LightApp_DataObject* SalomeApp_Study::findObjectByEntry( const QString& theEntry ) { - LightApp_DataObject* o = dynamic_cast( myObserver ? myObserver->findObject( theEntry.toLatin1().constData() ) : 0 ); + LightApp_DataObject* o = 0; + if ( myObserver ) { + o = dynamic_cast( myObserver->findObject( theEntry.toLatin1().constData() ) ); + } + if ( !o ) { + o = LightApp_Study::findObjectByEntry( theEntry ); + } return o; }