+ std::set<FeaturePtr> aDirectRefFeatures, aIndirectRefFeatures;
+ findReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures);
+
+ bool doDeleteReferences = true;
+ if (isDeleteFeatureWithReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures,
+ desktop(), doDeleteReferences)) {
+ // start operation
+ QString aDescription = contextMenuMgr()->action("DELETE_CMD")->text();
+ aDescription += " " + aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", "));
+ ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, module());
+ operationMgr()->startOperation(anOpAction);
+
+ // It is necessary to clear selection in order to avoid selection changed event during
+ // deletion and negative consequences connected with processing of already deleted items
+ mySelector->clearSelection();
+
+ // delete and commit/abort operation in model
+ if (deleteFeaturesInternal(anObjects, aDirectRefFeatures, aIndirectRefFeatures,
+ anIgnoredFeatures, doDeleteReferences))
+ operationMgr()->commitOperation();
+ else
+ operationMgr()->abortOperation(operationMgr()->currentOperation());
+ }
+}
+
+//**************************************************************
+void XGUI_Workshop::cleanHistory()
+{
+ if (!abortAllOperations())
+ return;
+
+ QObjectPtrList anObjects = mySelector->selection()->selectedObjects();
+ QObjectPtrList aFeatures;
+ foreach (ObjectPtr anObject, anObjects) {
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(anObject);
+ // for parameter result, use the corresponded reature to be removed
+ if (!aFeature.get() && anObject->groupName() == ModelAPI_ResultParameter::group()) {
+ aFeature = ModelAPI_Feature::feature(anObject);
+ }
+ aFeatures.append(aFeature);
+ }
+
+ // 1. find all referenced features
+ QList<ObjectPtr> anUnusedObjects;
+ std::set<FeaturePtr> aDirectRefFeatures;
+ //foreach (ObjectPtr anObject, anObjects) {
+ foreach (ObjectPtr anObject, aFeatures) {
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(anObject);
+ // for parameter result, use the corresponded reature to be removed
+ //if (!aFeature.get() && anObject->groupName() == ModelAPI_ResultParameter::group()) {
+ // aFeature = ModelAPI_Feature::feature(anObject);
+ //}
+ if (aFeature.get()) {
+ std::set<FeaturePtr> alreadyProcessed;
+ aDirectRefFeatures.clear();
+ XGUI_Tools::refsDirectToFeatureInAllDocuments(aFeature, aFeature, aFeatures,
+ aDirectRefFeatures, alreadyProcessed);
+ if (aDirectRefFeatures.empty() && !anUnusedObjects.contains(aFeature))
+ anUnusedObjects.append(aFeature);
+ }
+ }
+
+ // 2. warn about the references remove, break the delete operation if the user chose it
+ if (!anUnusedObjects.empty()) {
+ QStringList aNames;
+ foreach (const ObjectPtr& anObject, anUnusedObjects) {
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(anObject);
+ aNames.append(aFeature->name().c_str());
+ }
+ QString anUnusedNames = aNames.join(", ");
+
+ QString anActionId = "CLEAN_HISTORY_CMD";
+ QString aDescription = contextMenuMgr()->action(anActionId)->text();
+
+ QMessageBox aMessageBox(desktop());
+ aMessageBox.setWindowTitle(aDescription);
+ aMessageBox.setIcon(QMessageBox::Warning);
+ aMessageBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
+ aMessageBox.setDefaultButton(QMessageBox::No);
+
+ QString aText = QString(tr("Unused features are the following: %1.\nThese features will be deleted.\nWould you like to continue?")
+ .arg(anUnusedNames));
+ /*QString aText;
+ if (anUnusedNames.isEmpty()) {
+ aMessageBox.setStandardButtons(QMessageBox::Ok);
+ aMessageBox.setDefaultButton(QMessageBox::Ok);
+
+ aText = QString(tr("All features are relevant, there is nothing to be deleted"));
+ }
+ else {
+ aMessageBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
+ aMessageBox.setDefaultButton(QMessageBox::No);
+
+ aText = QString(tr("Unused features are the following: %1.\nThese features will be deleted.\nWould you like to continue?")
+ .arg(anUnusedNames));
+ }*/
+
+ aMessageBox.setText(aText);
+ if (aMessageBox.exec() == QMessageBox::No)
+ return;
+
+ // 1. start operation
+ aDescription += "by deleting of " + aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", "));
+ ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, module());
+ operationMgr()->startOperation(anOpAction);
+
+ std::set<FeaturePtr> anIgnoredFeatures;
+ if (removeFeatures(anUnusedObjects, anIgnoredFeatures, anActionId)) {
+ operationMgr()->commitOperation();
+ }
+ else {
+ operationMgr()->abortOperation(operationMgr()->currentOperation());
+ }