X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=921e964cb87be0d1a8d9abf15c2f53c9276378c6;hb=96912644cf6607688466ac69f1f098fd2fff37b7;hp=94f6cf2a87ca245ac8dce804f76e0ae36381f841;hpb=3efd29f07fa128246690fd24a3439048b5e95878;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index 94f6cf2a8..921e964cb 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -9,15 +9,19 @@ #include #include #include +#include #include #include #include +#include #include #include #include #include #include #include +#include +#include #include #include @@ -33,7 +37,8 @@ static Model_Session* myImpl = new Model_Session(); bool Model_Session::load(const char* theFileName) { - return ROOT_DOC->load(theFileName); + bool aRes = ROOT_DOC->load(theFileName); + return aRes; } bool Model_Session::save(const char* theFileName, std::list& theResults) @@ -47,25 +52,39 @@ void Model_Session::closeAll() Model_Application::getApplication()->deleteAllDocuments(); } -void Model_Session::startOperation() +void Model_Session::startOperation(const std::string& theId) { ROOT_DOC->startOperation(); + ROOT_DOC->operationId(theId); static std::shared_ptr aStartedMsg (new Events_Message(Events_Loop::eventByName("StartOperation"))); Events_Loop::loop()->send(aStartedMsg); + // remove all useless documents that has been closed: on start of operation undo/redo is cleared + std::list > aUsedDocs = allOpenedDocuments(); + Model_Application::getApplication()->removeUselessDocuments(aUsedDocs); } void Model_Session::finishOperation() { + setCheckTransactions(false); ROOT_DOC->finishOperation(); + setCheckTransactions(true); } void Model_Session::abortOperation() { + setCheckTransactions(false); ROOT_DOC->abortOperation(); + setCheckTransactions(true); + // here the update mechanism may work after abort, so, supress the warnings about + // modifications outside of the transactions + bool aWasCheck = myCheckTransactions; + myCheckTransactions = false; static std::shared_ptr anAbortMsg (new Events_Message(Events_Loop::eventByName("AbortOperation"))); Events_Loop::loop()->send(anAbortMsg); + myCheckTransactions = true; + myCheckTransactions = aWasCheck; } bool Model_Session::isOperation() @@ -85,7 +104,9 @@ bool Model_Session::canUndo() void Model_Session::undo() { + setCheckTransactions(false); ROOT_DOC->undo(); + setCheckTransactions(true); } bool Model_Session::canRedo() @@ -95,20 +116,34 @@ bool Model_Session::canRedo() void Model_Session::redo() { + setCheckTransactions(false); ROOT_DOC->redo(); + setCheckTransactions(true); +} + +//! 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) +FeaturePtr Model_Session::createFeature(string theFeatureID, Model_Document* theDocOwner) { - if (this != myImpl) - return myImpl->createFeature(theFeatureID); + if (this != myImpl) { + return myImpl->createFeature(theFeatureID, theDocOwner); + } // load all information about plugins, features and attributes LoadPluginsInfo(); 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"); @@ -117,7 +152,7 @@ FeaturePtr Model_Session::createFeature(string theFeatureID) myCurrentPluginName = aPlugin.first; if (myPluginObjs.find(myCurrentPluginName) == myPluginObjs.end()) { // load plugin library if not yet done - Config_ModuleReader::loadLibrary(myCurrentPluginName); + Config_ModuleReader::loadPlugin(myCurrentPluginName); } if (myPluginObjs.find(myCurrentPluginName) != myPluginObjs.end()) { FeaturePtr aCreated = myPluginObjs[myCurrentPluginName]->createFeature(theFeatureID); @@ -139,8 +174,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) @@ -166,8 +211,18 @@ void Model_Session::setActiveDocument( { if (myCurrentDoc != theDoc) { myCurrentDoc = theDoc; - if (theSendSignal) { - static std::shared_ptr aMsg(new Events_Message(Events_Loop::eventByName("CurrentDocumentChanged"))); + if (theDoc.get() && theSendSignal) { + // syncronize the document: it may be just opened or opened but removed before + std::shared_ptr aDoc = std::dynamic_pointer_cast(theDoc); + if (aDoc.get()) { + bool aWasChecked = myCheckTransactions; + setCheckTransactions(false); + aDoc->objects()->synchronizeFeatures(false, true, true); + if (aWasChecked) + setCheckTransactions(true); + } + static std::shared_ptr aMsg( + new Events_Message(Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED))); Events_Loop::loop()->send(aMsg); } } @@ -183,8 +238,9 @@ std::list > Model_Session::allOpenedDocuments DocumentPtr anAPIDoc = *aDoc; std::shared_ptr aDoc = std::dynamic_pointer_cast(anAPIDoc); if (aDoc) { - std::set::const_iterator aSubIter = aDoc->subDocuments().cbegin(); - for(; aSubIter != aDoc->subDocuments().cend(); aSubIter++) { + const std::set aSubs = aDoc->subDocuments(true); + std::set::const_iterator aSubIter = aSubs.cbegin(); + for(; aSubIter != aSubs.cend(); aSubIter++) { if (!Model_Application::getApplication()->isLoadByDemand(*aSubIter)) { aResult.push_back(Model_Application::getApplication()->getDocument(*aSubIter)); } @@ -211,7 +267,7 @@ std::shared_ptr Model_Session::copy( aRT->SetRelocation(aSourceRoot, aTargetRoot); TDF_CopyTool::Copy(aDS, aRT); - aNew->synchronizeFeatures(false, true); + aNew->objects()->synchronizeFeatures(false, true, true); return aNew; } @@ -222,7 +278,8 @@ Model_Session::Model_Session() ModelAPI_Session::setSession(std::shared_ptr(this)); // register the configuration reading listener Events_Loop* aLoop = Events_Loop::loop(); - static const Events_ID kFeatureEvent = Events_Loop::eventByName(Config_FeatureMessage::MODEL_EVENT()); + static const Events_ID kFeatureEvent = + Events_Loop::eventByName(Config_FeatureMessage::MODEL_EVENT()); aLoop->registerListener(this, kFeatureEvent); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED), 0, true); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED), 0, true); @@ -232,7 +289,8 @@ Model_Session::Model_Session() void Model_Session::processEvent(const std::shared_ptr& theMessage) { - static const Events_ID kFeatureEvent = Events_Loop::eventByName(Config_FeatureMessage::MODEL_EVENT()); + static const Events_ID kFeatureEvent = + Events_Loop::eventByName(Config_FeatureMessage::MODEL_EVENT()); static const Events_ID kValidatorEvent = Events_Loop::eventByName(EVENT_VALIDATOR_LOADED); if (theMessage->eventID() == kFeatureEvent) { const std::shared_ptr aMsg = @@ -253,7 +311,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 @@ -272,6 +333,17 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa } else { // create/update/delete if (myCheckTransactions && !isOperation()) Events_Error::send("Modification of data structure outside of the transaction"); + // if part is deleted, make the root as the current document (on undo of Parts creations) + static const Events_ID kDeletedEvent = Events_Loop::eventByName(EVENT_OBJECT_DELETED); + if (theMessage->eventID() == kDeletedEvent) { + std::shared_ptr aDeleted = + std::dynamic_pointer_cast(theMessage); + if (aDeleted && + aDeleted->groups().find(ModelAPI_ResultPart::group()) != aDeleted->groups().end()) + { + setActiveDocument(moduleDocument()); + } + } } } @@ -281,8 +353,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)