X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Session.cpp;h=b80cdd8eaf92737a34e09d233bece4bb6f4f0dc6;hb=06e7f5859095193fc7f498bd89a7d28009794f53;hp=aed8b486a860344541266fa8cb085bff37487bf0;hpb=4c74e5b864eef28128e27b3ece944990ca8f3fbe;p=modules%2Fshaper.git diff --git a/src/Model/Model_Session.cpp b/src/Model/Model_Session.cpp index aed8b486a..b80cdd8ea 100644 --- a/src/Model/Model_Session.cpp +++ b/src/Model/Model_Session.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2023 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -60,7 +59,9 @@ static Model_Session* myImpl = new Model_Session(); bool Model_Session::load(const char* theFileName) { + myIsLoading = true; bool aRes = ROOT_DOC->load(theFileName, "root", ROOT_DOC); + myIsLoading = false; return aRes; } @@ -72,10 +73,11 @@ 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)); + static const Events_ID aDocsCloseEvent = Events_Loop::eventByName(EVENT_DOCUMENTS_CLOSED); + myCurrentDoc = NULL; + static std::shared_ptr aMsg(new Events_Message(aDocsCloseEvent)); Events_Loop::loop()->send(aMsg); - Events_Loop::loop()->flush(aDocChangeEvent); + Events_Loop::loop()->flush(aDocsCloseEvent); } void Model_Session::startOperation(const std::string& theId, const bool theAttachedToNested) @@ -178,6 +180,16 @@ std::list Model_Session::redoList() return ROOT_DOC->redoList(); } +void Model_Session::clearUndoRedo() +{ + return ROOT_DOC->clearUndoRedo(); +} + +bool Model_Session::checkLicense(const std::string& thePluginName) +{ + return getPlugin(thePluginName); +} + ModelAPI_Plugin* Model_Session::getPlugin(const std::string& thePluginName) { if (myPluginObjs.find(thePluginName) == myPluginObjs.end()) { @@ -251,6 +263,12 @@ std::shared_ptr Model_Session::moduleDocument() anApp->createDocument(0); // 0 is a root ID // creation of the root document is always outside of the transaction, so, avoid checking it setCheckTransactions(true); + if (!myCurrentDoc || !Model_Application::getApplication()->hasDocument(myCurrentDoc->id())) { + myCurrentDoc = moduleDocument(); + static std::shared_ptr aMsg( + new Events_Message(Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED))); + Events_Loop::loop()->send(aMsg); + } } return anApp->rootDocument(); } @@ -268,8 +286,9 @@ bool Model_Session::hasModuleDocument() std::shared_ptr Model_Session::activeDocument() { - if (!myCurrentDoc || !Model_Application::getApplication()->hasDocument(myCurrentDoc->id())) - myCurrentDoc = moduleDocument(); + if (!myCurrentDoc || !Model_Application::getApplication()->hasDocument(myCurrentDoc->id())) { + return moduleDocument(); + } return myCurrentDoc; } @@ -347,9 +366,9 @@ std::list > Model_Session::allOpenedDocuments std::list > aResult; aResult.push_back(moduleDocument()); // add subs recursively - std::list >::iterator aDoc = aResult.begin(); - for(; aDoc != aResult.end(); aDoc++) { - DocumentPtr anAPIDoc = *aDoc; + std::list >::iterator aDocIt = aResult.begin(); + for(; aDocIt != aResult.end(); aDocIt++) { + DocumentPtr anAPIDoc = *aDocIt; std::shared_ptr aDoc = std::dynamic_pointer_cast(anAPIDoc); if (aDoc) { const std::set aSubs = aDoc->subDocuments(); @@ -362,7 +381,7 @@ std::list > Model_Session::allOpenedDocuments return aResult; } -bool Model_Session::isLoadByDemand(const std::string theDocID, const int theDocIndex) +bool Model_Session::isLoadByDemand(const std::wstring theDocID, const int theDocIndex) { return Model_Application::getApplication()->isLoadByDemand(theDocID, theDocIndex); } @@ -435,6 +454,7 @@ Model_Session::Model_Session() { myPluginsInfoLoaded = false; myCheckTransactions = true; + myIsLoading = false; ModelAPI_Session::setSession(std::shared_ptr(this)); // register the configuration reading listener Events_Loop* aLoop = Events_Loop::loop(); @@ -511,9 +531,33 @@ void Model_Session::processEvent(const std::shared_ptr& theMessa } } } else { // create/update/delete - if (myCheckTransactions && !isOperation()) - Events_InfoMessage("Model_Session", - "Modification of data structure outside of the transaction").send(); + if (myCheckTransactions && !isOperation()) { + // check it is done in real opened document: 2958 + bool aIsActual = true; + static const Events_ID kDeletedEvent = Events_Loop::eventByName(EVENT_OBJECT_DELETED); + if (theMessage->eventID() == kDeletedEvent) { + aIsActual = false; + std::shared_ptr aDeleted = + std::dynamic_pointer_cast(theMessage); + std::list > allOpened = + Model_Session::allOpenedDocuments(); + std::list, std::string>>::const_iterator + aGIter = aDeleted->groups().cbegin(); + for (; !aIsActual && aGIter != aDeleted->groups().cend(); aGIter++) { + std::list >::iterator anOpened = allOpened.begin(); + for(; anOpened != allOpened.end(); anOpened++) { + if (aGIter->first == *anOpened) { + aIsActual = true; + break; + } + } + } + } + + if (aIsActual) + Events_InfoMessage("Model_Session", + "Modification of data structure outside of the transaction").send(); + } // 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) { @@ -623,7 +667,7 @@ void Model_Session::blockAutoUpdate(const bool theBlock) aLoop->send(aMsg); } else { // if there is no operation, start it to avoid modifications outside of transaction - bool isOperation = this->isOperation(); + isOperation = this->isOperation(); if (!isOperation) startOperation("Auto update enabling"); static const Events_ID kAutoOn = aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE); @@ -637,3 +681,10 @@ void Model_Session::blockAutoUpdate(const bool theBlock) } } } + +#ifdef TINSPECTOR +Handle(TDocStd_Application) Model_Session::application() +{ + return Model_Application::getApplication(); +} +#endif