X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=172b7d3ff220ffd0e685853b53ffc524b62cb89f;hb=a83e22046c5fb877969fa8879e42491d4054f198;hp=816b87f750d1e391f44a92ef939a0981d5214289;hpb=7a4b1974ffcb347d1fd0e8dd369c198829ce1def;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index 816b87f75..172b7d3ff 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -19,7 +20,9 @@ #include #include #include +#include #include +#include #include #include @@ -35,7 +38,7 @@ static Model_Session* myImpl = new Model_Session(); bool Model_Session::load(const char* theFileName) { - bool aRes = ROOT_DOC->load(theFileName); + bool aRes = ROOT_DOC->load(theFileName, ROOT_DOC); return aRes; } @@ -46,13 +49,14 @@ bool Model_Session::save(const char* theFileName, std::list& theRes void Model_Session::closeAll() { - ROOT_DOC->close(true); Model_Application::getApplication()->deleteAllDocuments(); } -void Model_Session::startOperation() +void Model_Session::startOperation(const std::string& theId, const bool theAttachedToNested) { + myOperationAttachedToNext = theAttachedToNested; ROOT_DOC->startOperation(); + ROOT_DOC->operationId(theId); static std::shared_ptr aStartedMsg (new Events_Message(Events_Loop::eventByName("StartOperation"))); Events_Loop::loop()->send(aStartedMsg); @@ -65,6 +69,10 @@ void Model_Session::finishOperation() { setCheckTransactions(false); ROOT_DOC->finishOperation(); + if (myOperationAttachedToNext) { // twice, with nested + ROOT_DOC->finishOperation(); + myOperationAttachedToNext = false; + } setCheckTransactions(true); } @@ -72,6 +80,10 @@ void Model_Session::abortOperation() { setCheckTransactions(false); ROOT_DOC->abortOperation(); + if (myOperationAttachedToNext) { // twice, with nested + ROOT_DOC->abortOperation(); + myOperationAttachedToNext = false; + } setCheckTransactions(true); // here the update mechanism may work after abort, so, supress the warnings about // modifications outside of the transactions @@ -118,10 +130,21 @@ void Model_Session::redo() setCheckTransactions(true); } -FeaturePtr Model_Session::createFeature(string theFeatureID) +//! Returns stack of performed operations +std::list Model_Session::undoList() +{ + return ROOT_DOC->undoList(); +} +//! Returns stack of rolled back operations +std::list Model_Session::redoList() +{ + return ROOT_DOC->redoList(); +} + +FeaturePtr Model_Session::createFeature(string theFeatureID, Model_Document* theDocOwner) { if (this != myImpl) { - return myImpl->createFeature(theFeatureID); + return myImpl->createFeature(theFeatureID, theDocOwner); } // load all information about plugins, features and attributes @@ -129,7 +152,7 @@ FeaturePtr Model_Session::createFeature(string theFeatureID) if (myPlugins.find(theFeatureID) != myPlugins.end()) { std::pair& aPlugin = myPlugins[theFeatureID]; // plugin and doc kind - if (!aPlugin.second.empty() && aPlugin.second != activeDocument()->kind()) { + if (!aPlugin.second.empty() && aPlugin.second != theDocOwner->kind()) { Events_Error::send( string("Feature '") + theFeatureID + "' can be created only in document '" + aPlugin.second + "' by the XML definition"); @@ -160,8 +183,18 @@ FeaturePtr Model_Session::createFeature(string theFeatureID) std::shared_ptr Model_Session::moduleDocument() { - return std::shared_ptr( + bool aFirstCall = !Model_Application::getApplication()->hasDocument("root"); + if (aFirstCall) { + // creation of the root document is always outside of the transaction, so, avoid checking it + setCheckTransactions(false); + } + std::shared_ptr aDoc = std::shared_ptr( Model_Application::getApplication()->getDocument("root")); + if (aFirstCall) { + // creation of the root document is always outside of the transaction, so, avoid checking it + setCheckTransactions(true); + } + return aDoc; } std::shared_ptr Model_Session::document(std::string theDocID) @@ -182,10 +215,33 @@ std::shared_ptr Model_Session::activeDocument() return myCurrentDoc; } +/// makes the last feature in the document as the current +static void makeCurrentLast(std::shared_ptr theDoc) { + if (theDoc.get()) { + FeaturePtr aLast = std::dynamic_pointer_cast(theDoc)->lastFeature(); + // if last is nested into something else, make this something else as last: + // otherwise it will look like edition of sub-element, so, the main will be disabled + if (aLast.get()) { + CompositeFeaturePtr aMain = ModelAPI_Tools::compositeOwner(aLast); + while(aMain.get()) { + aLast = aMain; + aMain = ModelAPI_Tools::compositeOwner(aLast); + } + } + theDoc->setCurrentFeature(aLast, false); + } +} + void Model_Session::setActiveDocument( std::shared_ptr theDoc, bool theSendSignal) { if (myCurrentDoc != theDoc) { + if (myCurrentDoc.get()) + myCurrentDoc->setActive(false); + if (theDoc.get()) + theDoc->setActive(true); + + std::shared_ptr aPrevious = myCurrentDoc; myCurrentDoc = theDoc; if (theDoc.get() && theSendSignal) { // syncronize the document: it may be just opened or opened but removed before @@ -193,7 +249,8 @@ void Model_Session::setActiveDocument( if (aDoc.get()) { bool aWasChecked = myCheckTransactions; setCheckTransactions(false); - aDoc->synchronizeFeatures(false, true); + TDF_LabelList anEmptyUpdated; + aDoc->objects()->synchronizeFeatures(anEmptyUpdated, true, true); if (aWasChecked) setCheckTransactions(true); } @@ -201,6 +258,25 @@ void Model_Session::setActiveDocument( new Events_Message(Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED))); Events_Loop::loop()->send(aMsg); } + // make the current state correct and synchronised in the module and sub-documents + if (isOperation()) { // do it only in transaction, not on opening of document + if (myCurrentDoc == moduleDocument()) { + // make the current feature the latest in root, in previous root current become also last + makeCurrentLast(aPrevious); + makeCurrentLast(myCurrentDoc); + } else { + // make the current feature the latest in sub, root current feature becomes this sub + makeCurrentLast(myCurrentDoc); + DocumentPtr aRoot = moduleDocument(); + ResultPtr aPartRes = ModelAPI_Tools::findPartResult(aRoot, myCurrentDoc); + if (aPartRes.get()) { + FeaturePtr aPartFeat = aRoot->feature(aPartRes); + if (aPartFeat.get()) { + aRoot->setCurrentFeature(aPartFeat, false); + } + } + } + } } } @@ -226,6 +302,11 @@ std::list > Model_Session::allOpenedDocuments return aResult; } +bool Model_Session::isLoadByDemand(const std::string theDocID) +{ + return Model_Application::getApplication()->isLoadByDemand(theDocID); +} + std::shared_ptr Model_Session::copy( std::shared_ptr theSource, std::string theID) { @@ -243,7 +324,8 @@ std::shared_ptr Model_Session::copy( aRT->SetRelocation(aSourceRoot, aTargetRoot); TDF_CopyTool::Copy(aDS, aRT); - aNew->synchronizeFeatures(false, true); + TDF_LabelList anEmptyUpdated; + aNew->objects()->synchronizeFeatures(anEmptyUpdated, true, true); return aNew; } @@ -251,6 +333,7 @@ Model_Session::Model_Session() { myPluginsInfoLoaded = false; myCheckTransactions = true; + myOperationAttachedToNext = false; ModelAPI_Session::setSession(std::shared_ptr(this)); // register the configuration reading listener Events_Loop* aLoop = Events_Loop::loop(); @@ -272,7 +355,7 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa const std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); if (aMsg) { - // proccess the plugin info, load plugin + // process the plugin info, load plugin if (myPlugins.find(aMsg->id()) == myPlugins.end()) { myPlugins[aMsg->id()] = std::pair( aMsg->pluginLibrary(), aMsg->documentKind()); @@ -287,7 +370,10 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa if(aMsgAttr->isConcealment()) { validators()->registerConcealment(aMsgAttr->featureId(), aMsgAttr->attributeId()); } - + if (!aMsgAttr->caseId().empty()) { + validators()->registerCase(aMsgAttr->featureId(), aMsgAttr->attributeId(), + aMsgAttr->switchId(), aMsgAttr->caseId()); + } } } // plugins information was started to load, so, it will be loaded @@ -312,7 +398,8 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa std::shared_ptr aDeleted = std::dynamic_pointer_cast(theMessage); if (aDeleted && - aDeleted->groups().find(ModelAPI_ResultPart::group()) != aDeleted->groups().end()) + aDeleted->groups().find(ModelAPI_ResultPart::group()) != aDeleted->groups().end() && + !ModelAPI_Tools::findPartResult(moduleDocument(), activeDocument()).get()) // another part may be disabled { setActiveDocument(moduleDocument()); } @@ -326,8 +413,15 @@ void Model_Session::LoadPluginsInfo() return; // Read plugins information from XML files - Config_ModuleReader aXMLReader(Config_FeatureMessage::MODEL_EVENT()); - aXMLReader.readAll(); + Config_ModuleReader aModuleReader(Config_FeatureMessage::MODEL_EVENT()); + aModuleReader.readAll(); + std::set aFiles = aModuleReader.modulePluginFiles(); + std::set::iterator it = aFiles.begin(); + for ( ; it != aFiles.end(); it++ ) { + Config_ValidatorReader aValidatorReader (*it); + aValidatorReader.readAll(); + }; + } void Model_Session::registerPlugin(ModelAPI_Plugin* thePlugin) @@ -351,3 +445,8 @@ ModelAPI_ValidatorsFactory* Model_Session::validators() static Model_ValidatorsFactory* aFactory = new Model_ValidatorsFactory; return aFactory; } + +int Model_Session::transactionID() +{ + return ROOT_DOC->transactionID(); +}