+
+ Events_Loop* aLoop = Events_Loop::loop();
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_ORDER_UPDATED));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED));
+}
+
+//******************************************************
+void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMessage)
+{
+ DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
+ std::string aRootType = myXMLReader.rootType();
+ std::string aSubType = myXMLReader.subType();
+ int aNbFolders = foldersCount();
+
+ // Created object event *******************
+ if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) {
+ std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
+ std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ std::set<ObjectPtr> aObjects = aUpdMsg->objects();
+
+ std::set<ObjectPtr>::const_iterator aIt;
+ std::string aObjType;
+ for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) {
+ ObjectPtr aObject = (*aIt);
+ // We do not show objects which does not need to be shown in object browser
+ if (!aObject->isInHistory())
+ continue;
+
+ aObjType = aObject->groupName();
+ DocumentPtr aDoc = aObject->document();
+ if (aDoc == aRootDoc) {
+ // Check that new folders could appear
+ QStringList aNotEmptyFolders = listOfShowNotEmptyFolders();
+ foreach (QString aNotEmptyFolder, aNotEmptyFolders) {
+ if ((aNotEmptyFolder.toStdString() == aObjType) && (aRootDoc->size(aObjType) == 1))
+ // Appears first object in folder which can not be shown empty
+ insertRow(myXMLReader.rootFolderId(aObjType));
+ }
+ // Insert new object
+ int aRow = aRootDoc->size(aObjType) - 1;
+ if (aRow != -1) {
+ if (aObjType == aRootType) {
+ insertRow(aRow + aNbFolders + 1);
+ } else {
+ int aFolderId = myXMLReader.rootFolderId(aObjType);
+ if (aFolderId != -1) {
+ insertRow(aRow, createIndex(aFolderId, 0, -1));
+ }
+ }
+ }
+ } else {
+ // Object created in sub-document
+ QModelIndex aDocRoot = findDocumentRootIndex(aDoc.get());
+ if (aDocRoot.isValid()) {
+ // Check that new folders could appear
+ QStringList aNotEmptyFolders = listOfShowNotEmptyFolders(false);
+ foreach (QString aNotEmptyFolder, aNotEmptyFolders) {
+ if ((aNotEmptyFolder.toStdString() == aObjType) && (aDoc->size(aObjType) == 1))
+ // Appears first object in folder which can not be shown empty
+ insertRow(myXMLReader.subFolderId(aObjType), aDocRoot);
+ }
+ int aRow = aDoc->index(aObject);
+ if (aRow != -1) {
+ int aNbSubFolders = foldersCount(aDoc.get());
+ if (aObjType == aSubType) {
+ // List of objects under document root
+ insertRow(aRow + aNbSubFolders, aDocRoot);
+ } else {
+ // List of objects under a folder
+ if (aRow != -1) {
+ int aFolderId = folderId(aObjType, aDoc.get());
+ if (aFolderId != -1) {
+ QModelIndex aParentFolder = createIndex(aFolderId, 0, aDoc.get());
+ insertRow(aRow, aParentFolder);
+ emit dataChanged(aParentFolder, aParentFolder);
+ }
+ }
+ }
+ }
+ }
+#ifdef _DEBUG
+ else
+ Events_Error::send("Problem with Data Model definition of sub-document");
+#endif
+ }
+ }
+ // Deleted object event ***********************
+ } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) {
+ std::shared_ptr<ModelAPI_ObjectDeletedMessage> aUpdMsg =
+ std::dynamic_pointer_cast<ModelAPI_ObjectDeletedMessage>(theMessage);
+ DocumentPtr aDoc = aUpdMsg->document();
+ std::set<std::string> aGroups = aUpdMsg->groups();
+ std::set<std::string>::const_iterator aIt;
+ for (aIt = aGroups.begin(); aIt != aGroups.end(); ++aIt) {
+ std::string aGroup = (*aIt);
+ if (aDoc == aRootDoc) { // If root objects
+ int aRow = aRootDoc->size(aGroup);
+ if (aGroup == aRootType) {
+ // Process root folder
+ removeRow(aRow + aNbFolders);
+ rebuildBranch(aNbFolders, aRow);
+ } else {
+ // Process root sub-folder
+ int aFolderId = myXMLReader.rootFolderId(aGroup);
+ if (aFolderId != -1) {
+ QModelIndex aFolderIndex = createIndex(aFolderId, 0, -1);
+ removeRow(aRow, aFolderIndex);
+ //rebuildBranch(0, aRow);
+ }
+ }
+ // Check that some folders could erased
+ QStringList aNotEmptyFolders = listOfShowNotEmptyFolders();
+ foreach (QString aNotEmptyFolder, aNotEmptyFolders) {
+ if ((aNotEmptyFolder.toStdString() == aGroup) && (aRootDoc->size(aGroup) == 0)) {
+ // Appears first object in folder which can not be shown empty
+ removeRow(myXMLReader.rootFolderId(aGroup));
+ //rebuildBranch(0, aNbFolders + aDoc->size(myXMLReader.rootType()));
+ break;
+ }
+ }
+ } else {
+ // Remove row for sub-document
+ QModelIndex aDocRoot = findDocumentRootIndex(aDoc.get());
+ if (aDocRoot.isValid()) {
+ int aRow = aDoc->size(aGroup);
+ int aNbSubFolders = foldersCount(aDoc.get());
+ if (aGroup == aSubType) {
+ // List of objects under document root
+ removeRow(aRow + aNbSubFolders, aDocRoot);
+ rebuildBranch(aNbSubFolders, aRow, aDocRoot);
+ } else {
+ // List of objects under a folder
+ int aFolderId = folderId(aGroup, aDoc.get());
+ if (aFolderId != -1) {
+ QModelIndex aFolderRoot = createIndex(aFolderId, 0, aDoc.get());
+ removeRow(aRow, aFolderRoot);
+ //rebuildBranch(0, aRow, aFolderRoot);
+ }
+ }
+ // Check that some folders could disappear
+ QStringList aNotEmptyFolders = listOfShowNotEmptyFolders(false);
+ int aSize = aDoc->size(aGroup);
+ foreach (QString aNotEmptyFolder, aNotEmptyFolders) {
+ if ((aNotEmptyFolder.toStdString() == aGroup) && (aSize == 0)) {
+ // Appears first object in folder which can not be shown empty
+ removeRow(myXMLReader.subFolderId(aGroup), aDocRoot);
+ //rebuildBranch(0, aNbSubFolders + aDoc->size(myXMLReader.subType()), aDocRoot);
+ break;
+ }
+ }
+ }
+ }
+ }
+ } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) {
+ std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
+ std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ std::set<ObjectPtr> aObjects = aUpdMsg->objects();
+
+ std::set<ObjectPtr>::const_iterator aIt;
+ std::string aObjType;
+ for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) {
+ ObjectPtr aObject = (*aIt);
+ QModelIndex aIndex = objectIndex(aObject);
+ if (aIndex.isValid())
+ emit dataChanged(aIndex, aIndex);
+ }
+ } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_ORDER_UPDATED)) {
+ std::shared_ptr<ModelAPI_OrderUpdatedMessage> aUpdMsg =
+ std::dynamic_pointer_cast<ModelAPI_OrderUpdatedMessage>(theMessage);
+ DocumentPtr aDoc = aUpdMsg->document();
+ std::string aGroup = aUpdMsg->group();
+
+ QModelIndex aParent;
+ int aStartId = 0;
+ if (aDoc == aRootDoc) {
+ // Update a group under root
+ if (aGroup == myXMLReader.rootType()) // Update objects under root
+ aStartId = foldersCount();
+ else // Update objects in folder under root
+ aParent = createIndex(folderId(aGroup), 0, -1);
+ } else {
+ // Update a sub-document
+ if (aGroup == myXMLReader.subType()) {
+ // Update sub-document root
+ aParent = findDocumentRootIndex(aDoc.get());
+ aStartId = foldersCount(aDoc.get());
+ } else
+ // update folder in sub-document
+ aParent = createIndex(folderId(aGroup, aDoc.get()), 0, aDoc.get());
+ }
+ int aChildNb = rowCount(aParent);
+ rebuildBranch(aStartId, aChildNb - aStartId, aParent);
+ } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) {
+ DocumentPtr aDoc = ModelAPI_Session::get()->activeDocument();
+ if (aDoc != aRootDoc) {
+ QModelIndex aDocRoot = findDocumentRootIndex(aDoc.get());
+ if (aDocRoot.isValid())
+ emit dataChanged(aDocRoot, aDocRoot);
+ else
+ // We have got a new document
+ rebuildDataTree();
+//#ifdef _DEBUG
+// else
+// Events_Error::send("Problem with Data Model definition of sub-document");
+//#endif
+ }
+ }