diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index 3732f082f..003339739 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -42,6 +42,7 @@ #include #include +#include #include "Application.h" #include "MainWindow.h" @@ -889,6 +890,33 @@ void Document::importObjects(const std::vector& obj, Base: xmlReader.readEndElement("Document"); } +void Document::addRootObjectsToGroup(const std::vector& obj, App::DocumentObjectGroup* grp) +{ + std::map rootMap; + for (std::vector::const_iterator it = obj.begin(); it != obj.end(); ++it) { + rootMap[*it] = true; + } + // get the view providers and check which objects are children + for (std::vector::const_iterator it = obj.begin(); it != obj.end(); ++it) { + Gui::ViewProvider* vp = getViewProvider(*it); + if (vp) { + std::vector child = vp->claimChildren(); + for (std::vector::iterator jt = child.begin(); jt != child.end(); ++jt) { + std::map::iterator kt = rootMap.find(*jt); + if (kt != rootMap.end()) { + kt->second = false; + } + } + } + } + + // all objects that are not children of other objects can be added to the group + for (std::map::iterator it = rootMap.begin(); it != rootMap.end(); ++it) { + if (it->second) + grp->addObject(it->first); + } +} + void Document::createView(const char* sType) { View3DInventor* view3D = new View3DInventor(this, getMainWindow()); diff --git a/src/Gui/Document.h b/src/Gui/Document.h index cdc6a8f99..dca5c0ad8 100644 --- a/src/Gui/Document.h +++ b/src/Gui/Document.h @@ -37,9 +37,12 @@ class SoPath; -namespace Base -{ - class Matrix4D; +namespace Base { +class Matrix4D; +} + +namespace App { +class DocumentObjectGroup; } namespace Gui { @@ -122,6 +125,8 @@ public: virtual void RestoreDocFile(Base::Reader &reader); void exportObjects(const std::vector&, Base::Writer&); void importObjects(const std::vector&, Base::Reader&); + /// Add all root objects of the given array to a group + void addRootObjectsToGroup(const std::vector&, App::DocumentObjectGroup*); //@} /// Observer message from the App doc diff --git a/src/Gui/MainWindow.cpp b/src/Gui/MainWindow.cpp index 2f4b6bc55..75c212fb7 100644 --- a/src/Gui/MainWindow.cpp +++ b/src/Gui/MainWindow.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include "MainWindow.h" #include "Application.h" @@ -1521,7 +1522,13 @@ void MainWindow::insertFromMimeData (const QMimeData * mimeData) std::istream in(0); in.rdbuf(&buf); MergeDocuments mimeView(doc); - mimeView.importObjects(in); + std::vector newObj = mimeView.importObjects(in); + std::vector grp = Gui::Selection().getObjectsOfType(); + if (grp.size() == 1) { + Gui::Document* gui = Application::Instance->getDocument(doc); + if (gui) + gui->addRootObjectsToGroup(newObj, grp.front()); + } } else if (mimeData->hasFormat(QLatin1String("application/x-documentobject-file"))) { QByteArray res = mimeData->data(QLatin1String("application/x-documentobject-file")); @@ -1531,8 +1538,14 @@ void MainWindow::insertFromMimeData (const QMimeData * mimeData) Base::FileInfo fi((const char*)res); Base::ifstream str(fi, std::ios::in | std::ios::binary); MergeDocuments mimeView(doc); - mimeView.importObjects(str); + std::vector newObj = mimeView.importObjects(str); str.close(); + std::vector grp = Gui::Selection().getObjectsOfType(); + if (grp.size() == 1) { + Gui::Document* gui = Application::Instance->getDocument(doc); + if (gui) + gui->addRootObjectsToGroup(newObj, grp.front()); + } } else if (mimeData->hasUrls()) { // load the files into the active document if there is one, otherwise let create one diff --git a/src/Gui/Workbench.cpp b/src/Gui/Workbench.cpp index ee3be9a39..27ebe9ff8 100644 --- a/src/Gui/Workbench.cpp +++ b/src/Gui/Workbench.cpp @@ -399,24 +399,27 @@ void StdWorkbench::setupContextMenu(const char* recipient, MenuItem* item) const << "Std_ViewRear" << "Std_ViewBottom" << "Std_ViewLeft" << "Separator" << "Std_ViewRotateLeft" << "Std_ViewRotateRight"; - MenuItem *measure = new MenuItem(); - measure->setCommand("Measure"); - *measure << "View_Measure_Toggle_All" << "View_Measure_Clear_All"; + MenuItem *measure = new MenuItem(); + measure->setCommand("Measure"); + *measure << "View_Measure_Toggle_All" << "View_Measure_Clear_All"; *item << "Std_ViewFitAll" << "Std_ViewFitSelection" << "Std_DrawStyle" << StdViews << measure << "Separator" << "Std_ViewDockUndockFullscreen"; - if (Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0 ) + if (Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0) { *item << "Separator" << "Std_SetAppearance" << "Std_ToggleVisibility" << "Std_ToggleSelectability" << "Std_TreeSelection" << "Std_RandomColor" << "Separator" << "Std_Delete"; + } } else if (strcmp(recipient,"Tree") == 0) { - if (Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0 ) + if (Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0) { *item << "Std_ToggleVisibility" << "Std_ShowSelection" << "Std_HideSelection" << "Std_ToggleSelectability" << "Separator" << "Std_SetAppearance" - << "Std_RandomColor" << "Separator" << "Std_Delete"; + << "Std_RandomColor" << "Std_Cut" << "Std_Copy" << "Std_Paste" + << "Separator" << "Std_Delete"; + } } }