X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=159b7a2f678b19e60ac6fac4862c1881100dbeca;hb=a352874d231ad2b117f55cf384c18361a0dfe67a;hp=2c9a5abad0de823444d7842d3701867fa3e319dd;hpb=34b118cd5567416cde2d00a2b7d62832d62f7a51;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index 2c9a5abad..159b7a2f6 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: Model_Session.cxx // Created: 20 Mar 2014 // Author: Mikhail PONIKAROV @@ -27,7 +29,7 @@ using namespace std; static Model_Session* myImpl = new Model_Session(); // t oredirect all calls to the root document -#define ROOT_DOC boost::dynamic_pointer_cast(moduleDocument()) +#define ROOT_DOC std::dynamic_pointer_cast(moduleDocument()) bool Model_Session::load(const char* theFileName) { @@ -48,9 +50,12 @@ void Model_Session::closeAll() void Model_Session::startOperation() { ROOT_DOC->startOperation(); - static boost::shared_ptr aStartedMsg + 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() @@ -61,9 +66,15 @@ void Model_Session::finishOperation() void Model_Session::abortOperation() { ROOT_DOC->abortOperation(); - static boost::shared_ptr anAbortMsg + // 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() @@ -98,8 +109,12 @@ void Model_Session::redo() FeaturePtr Model_Session::createFeature(string theFeatureID) { - if (this != myImpl) + if (this != myImpl) { return myImpl->createFeature(theFeatureID); + } + + // load all information about plugins, features and attributes + LoadPluginsInfo(); if (myPlugins.find(theFeatureID) != myPlugins.end()) { std::pair& aPlugin = myPlugins[theFeatureID]; // plugin and doc kind @@ -112,7 +127,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); @@ -132,18 +147,24 @@ FeaturePtr Model_Session::createFeature(string theFeatureID) return FeaturePtr(); // return nothing } -boost::shared_ptr Model_Session::moduleDocument() +std::shared_ptr Model_Session::moduleDocument() { - return boost::shared_ptr( + return std::shared_ptr( Model_Application::getApplication()->getDocument("root")); } +std::shared_ptr Model_Session::document(std::string theDocID) +{ + return std::shared_ptr( + Model_Application::getApplication()->getDocument(theDocID)); +} + bool Model_Session::hasModuleDocument() { return Model_Application::getApplication()->hasDocument("root"); } -boost::shared_ptr Model_Session::activeDocument() +std::shared_ptr Model_Session::activeDocument() { if (!myCurrentDoc || !Model_Application::getApplication()->hasDocument(myCurrentDoc->id())) myCurrentDoc = moduleDocument(); @@ -151,29 +172,30 @@ boost::shared_ptr Model_Session::activeDocument() } void Model_Session::setActiveDocument( - boost::shared_ptr theDoc, bool theSendSignal) + std::shared_ptr theDoc, bool theSendSignal) { if (myCurrentDoc != theDoc) { myCurrentDoc = theDoc; if (theSendSignal) { - static boost::shared_ptr aMsg(new Events_Message(Events_Loop::eventByName("CurrentDocumentChanged"))); + static std::shared_ptr aMsg(new Events_Message(Events_Loop::eventByName("CurrentDocumentChanged"))); Events_Loop::loop()->send(aMsg); } } } -std::list > Model_Session::allOpenedDocuments() +std::list > Model_Session::allOpenedDocuments() { - list > aResult; + list > aResult; aResult.push_back(moduleDocument()); // add subs recursively - list >::iterator aDoc = aResult.begin(); + list >::iterator aDoc = aResult.begin(); for(; aDoc != aResult.end(); aDoc++) { DocumentPtr anAPIDoc = *aDoc; - boost::shared_ptr aDoc = boost::dynamic_pointer_cast(anAPIDoc); + 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)); } @@ -183,14 +205,14 @@ std::list > Model_Session::allOpenedDocumen return aResult; } -boost::shared_ptr Model_Session::copy( - boost::shared_ptr theSource, std::string theID) +std::shared_ptr Model_Session::copy( + std::shared_ptr theSource, std::string theID) { // create a new document - boost::shared_ptr aNew = boost::dynamic_pointer_cast( + std::shared_ptr aNew = std::dynamic_pointer_cast( Model_Application::getApplication()->getDocument(theID)); // make a copy of all labels - TDF_Label aSourceRoot = boost::dynamic_pointer_cast(theSource)->document()->Main() + TDF_Label aSourceRoot = std::dynamic_pointer_cast(theSource)->document()->Main() .Father(); TDF_Label aTargetRoot = aNew->document()->Main().Father(); Handle(TDF_DataSet) aDS = new TDF_DataSet; @@ -208,7 +230,7 @@ Model_Session::Model_Session() { myPluginsInfoLoaded = false; myCheckTransactions = true; - ModelAPI_Session::setSession(boost::shared_ptr(this)); + 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()); @@ -217,18 +239,15 @@ Model_Session::Model_Session() aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED), 0, true); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED), 0, true); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_VALIDATOR_LOADED)); - - // load all information about plugins, features and attributes - LoadPluginsInfo(); } -void Model_Session::processEvent(const boost::shared_ptr& theMessage) +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 kValidatorEvent = Events_Loop::eventByName(EVENT_VALIDATOR_LOADED); if (theMessage->eventID() == kFeatureEvent) { - const boost::shared_ptr aMsg = - boost::dynamic_pointer_cast(theMessage); + const std::shared_ptr aMsg = + std::dynamic_pointer_cast(theMessage); if (aMsg) { // proccess the plugin info, load plugin if (myPlugins.find(aMsg->id()) == myPlugins.end()) { @@ -236,8 +255,8 @@ void Model_Session::processEvent(const boost::shared_ptr& theMes aMsg->pluginLibrary(), aMsg->documentKind()); } } else { - const boost::shared_ptr aMsgAttr = - boost::dynamic_pointer_cast(theMessage); + const std::shared_ptr aMsgAttr = + std::dynamic_pointer_cast(theMessage); if (aMsgAttr) { if (!aMsgAttr->isObligatory()) { validators()->registerNotObligatory(aMsgAttr->featureId(), aMsgAttr->attributeId()); @@ -251,8 +270,8 @@ void Model_Session::processEvent(const boost::shared_ptr& theMes // plugins information was started to load, so, it will be loaded myPluginsInfoLoaded = true; } else if (theMessage->eventID() == kValidatorEvent) { - boost::shared_ptr aMsg = - boost::dynamic_pointer_cast(theMessage); + std::shared_ptr aMsg = + std::dynamic_pointer_cast(theMessage); if (aMsg) { if (aMsg->attributeId().empty()) { // feature validator validators()->assignValidator(aMsg->validatorId(), aMsg->featureId(), aMsg->parameters()); @@ -283,6 +302,14 @@ void Model_Session::registerPlugin(ModelAPI_Plugin* thePlugin) static Events_ID EVENT_LOAD = Events_Loop::loop()->eventByName(EVENT_PLUGIN_LOADED); ModelAPI_EventCreator::get()->sendUpdated(ObjectPtr(), EVENT_LOAD); Events_Loop::loop()->flush(EVENT_LOAD); + // If the plugin has an ability to process GUI events, register it + Events_Listener* aListener = dynamic_cast(thePlugin); + if (aListener) { + Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID aStateRequestEventId = + Events_Loop::loop()->eventByName(EVENT_FEATURE_STATE_REQUEST); + aLoop->registerListener(aListener, aStateRequestEventId); + } } ModelAPI_ValidatorsFactory* Model_Session::validators()