X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=a22db3780ba50741c258ef66f0e94007c4118420;hb=b0196aeefbaa53754b1052fab904386707caad87;hp=10bd28f205db172f7fe67331aa8bf482d3e7ef34;hpb=1c530eba1d76c012cfc61df1c21694e62f203d94;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index 10bd28f20..a22db3780 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -71,6 +72,10 @@ bool Model_Session::save(const char* theFileName, std::list& theRes void Model_Session::closeAll() { Model_Application::getApplication()->deleteAllDocuments(); + static const Events_ID aDocChangeEvent = Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED); + static std::shared_ptr aMsg(new Events_Message(aDocChangeEvent)); + Events_Loop::loop()->send(aMsg); + Events_Loop::loop()->flush(aDocChangeEvent); } void Model_Session::startOperation(const std::string& theId, const bool theAttachedToNested) @@ -165,6 +170,29 @@ std::list Model_Session::redoList() return ROOT_DOC->redoList(); } +ModelAPI_Plugin* Model_Session::getPlugin(const std::string& thePluginName) +{ + if (myPluginObjs.find(thePluginName) == myPluginObjs.end()) { + // before load the used plugins + if (myUsePlugins.find(thePluginName) != myUsePlugins.end()) { + std::string aUse = myUsePlugins[thePluginName]; + std::stringstream aUseStream(aUse); + std::string aPluginName; + while (std::getline(aUseStream, aPluginName, ',')) { + if (myPluginObjs.find(aPluginName) == myPluginObjs.end()) + getPlugin(aPluginName); + } + } + // load plugin library if not yet done + Config_ModuleReader::loadPlugin(thePluginName); + } + if (myPluginObjs.find(thePluginName) == myPluginObjs.end()) { + Events_InfoMessage("Model_Session", "Can not load plugin '%1'").arg(thePluginName).send(); + return NULL; + } + return myPluginObjs[thePluginName]; +} + FeaturePtr Model_Session::createFeature(std::string theFeatureID, Model_Document* theDocOwner) { if (this != myImpl) { @@ -178,26 +206,20 @@ FeaturePtr Model_Session::createFeature(std::string theFeatureID, Model_Document std::pair& aPlugin = myPlugins[theFeatureID]; // plugin and doc kind if (!aPlugin.second.empty() && aPlugin.second != theDocOwner->kind()) { Events_InfoMessage("Model_Session", - "Feature '%1' can be created only in document '%2' by the XML definition") - .arg(theFeatureID).arg(aPlugin.second).send(); + "Feature '%1' can be created only in document '%2' by the XML definition") + .arg(theFeatureID).arg(aPlugin.second).send(); return FeaturePtr(); } - myCurrentPluginName = aPlugin.first; - if (myPluginObjs.find(myCurrentPluginName) == myPluginObjs.end()) { - // load plugin library if not yet done - Config_ModuleReader::loadPlugin(myCurrentPluginName); - } - if (myPluginObjs.find(myCurrentPluginName) != myPluginObjs.end()) { - FeaturePtr aCreated = myPluginObjs[myCurrentPluginName]->createFeature(theFeatureID); + ModelAPI_Plugin* aPluginObj = getPlugin(aPlugin.first); + if (aPluginObj) { + FeaturePtr aCreated = aPluginObj->createFeature(theFeatureID); if (!aCreated) { - Events_InfoMessage("Model_Session", - "Can not initialize feature '%1' in plugin '%2'") - .arg(theFeatureID).arg(myCurrentPluginName).send(); + Events_InfoMessage("Model_Session", "Can not initialize feature '%1' in plugin '%2'") + .arg(theFeatureID).arg(aPlugin.first).send(); } return aCreated; } else { - Events_InfoMessage("Model_Session", - "Can not load plugin '%1'").arg(myCurrentPluginName).send(); + Events_InfoMessage("Model_Session", "Can not load plugin '%1'").arg(aPlugin.first).send(); } } else { Events_InfoMessage("Model_Session", @@ -416,6 +438,7 @@ 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)); + aLoop->registerListener(this, Events_Loop::eventByName(Config_PluginMessage::EVENT_ID())); } void Model_Session::processEvent(const std::shared_ptr& theMessage) @@ -423,6 +446,7 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa static const Events_ID kFeatureEvent = Events_Loop::eventByName(Config_FeatureMessage::MODEL_EVENT()); static const Events_ID kValidatorEvent = Events_Loop::eventByName(EVENT_VALIDATOR_LOADED); + static const Events_ID kPluginEvent = Events_Loop::eventByName(Config_PluginMessage::EVENT_ID()); if (theMessage->eventID() == kFeatureEvent) { const std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); @@ -444,6 +468,9 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa if(aMsgAttr->isConcealment()) { validators()->registerConcealment(aMsgAttr->featureId(), aMsgAttr->attributeId()); } + if(aMsgAttr->isMainArgument()) { + validators()->registerMainArgument(aMsgAttr->featureId(), aMsgAttr->attributeId()); + } const std::list >& aCases = aMsgAttr->getCases(); if (!aCases.empty()) { validators()->registerCase(aMsgAttr->featureId(), aMsgAttr->attributeId(), aCases); @@ -463,6 +490,15 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa aMsg->parameters()); } } + } else if (theMessage->eventID() == kPluginEvent) { // plugin is started to load + std::shared_ptr aMsg = + std::dynamic_pointer_cast(theMessage); + if (aMsg.get()) { + myCurrentPluginName = aMsg->pluginId(); + if (!aMsg->uses().empty()) { + myUsePlugins[myCurrentPluginName] = aMsg->uses(); + } + } } else { // create/update/delete if (myCheckTransactions && !isOperation()) Events_InfoMessage("Model_Session", @@ -472,8 +508,14 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa if (theMessage->eventID() == kDeletedEvent) { std::shared_ptr aDeleted = std::dynamic_pointer_cast(theMessage); - if (aDeleted && - aDeleted->groups().find(ModelAPI_ResultPart::group()) != aDeleted->groups().end()) + + std::list, std::string>>::const_iterator + aGIter = aDeleted->groups().cbegin(); + for (; aGIter != aDeleted->groups().cend(); aGIter++) { + if (aGIter->second == ModelAPI_ResultPart::group()) + break; + } + if (aGIter != aDeleted->groups().cend()) { // check that the current feature of the session is still the active Part (even disabled) bool aFound = false; @@ -539,3 +581,42 @@ int Model_Session::transactionID() { return ROOT_DOC->transactionID(); } + +bool Model_Session::isAutoUpdateBlocked() +{ + Handle(Model_Application) anApp = Model_Application::getApplication(); + if (!anApp->hasRoot()) // when document is not yet created, do not create it by such simple call + return false; + return !ROOT_DOC->autoRecomutationState(); +} + +void Model_Session::blockAutoUpdate(const bool theBlock) +{ + bool aCurrentState = isAutoUpdateBlocked(); + if (aCurrentState != theBlock) { + // if there is no operation, start it to avoid modifications outside of transaction + bool isOperation = this->isOperation(); + if (!isOperation) + startOperation("Auto update"); + ROOT_DOC->setAutoRecomutationState(!theBlock); + static Events_Loop* aLoop = Events_Loop::loop(); + if (theBlock) { + static const Events_ID kAutoOff = aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE); + std::shared_ptr aMsg(new Events_Message(kAutoOff)); + aLoop->send(aMsg); + } else { + // if there is no operation, start it to avoid modifications outside of transaction + bool isOperation = this->isOperation(); + if (!isOperation) + startOperation("Auto update enabling"); + static const Events_ID kAutoOn = aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE); + std::shared_ptr aMsg(new Events_Message(kAutoOn)); + aLoop->send(aMsg); + } + if (!isOperation) { + finishOperation(); + // append this transaction to the previous one: ne don't need this separated operation in list + ROOT_DOC->appendTransactionToPrevious(); + } + } +}