summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp11
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/items/classitem.h2
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp19
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/items/objectitem.h2
-rw-r--r--src/libs/modelinglib/qmt/infrastructure/contextmenuaction.h3
-rw-r--r--src/libs/modelinglib/qmt/tasks/ielementtasks.h6
-rw-r--r--src/libs/modelinglib/qmt/tasks/voidelementtasks.cpp10
-rw-r--r--src/libs/modelinglib/qmt/tasks/voidelementtasks.h11
-rw-r--r--src/plugins/modeleditor/componentviewcontroller.cpp6
-rw-r--r--src/plugins/modeleditor/elementtasks.cpp37
-rw-r--r--src/plugins/modeleditor/elementtasks.h13
-rw-r--r--src/plugins/modeleditor/extdocumentcontroller.cpp4
-rw-r--r--src/plugins/modeleditor/pxnodecontroller.cpp5
-rw-r--r--src/plugins/modeleditor/pxnodecontroller.h4
14 files changed, 105 insertions, 28 deletions
diff --git a/src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp b/src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp
index f94666c6a9..a1c76b2617 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp
+++ b/src/libs/modelinglib/qmt/diagram_scene/items/classitem.cpp
@@ -304,14 +304,11 @@ bool ClassItem::extendContextMenu(QMenu *menu)
return extended;
}
-bool ClassItem::handleSelectedContextMenuAction(QAction *action)
+bool ClassItem::handleSelectedContextMenuAction(const QString &id)
{
- auto klassAction = dynamic_cast<ContextMenuAction *>(action);
- if (klassAction) {
- if (klassAction->id() == QStringLiteral("showDefinition")) {
- diagramSceneModel()->diagramSceneController()->elementTasks()->openClassDefinition(object(), diagramSceneModel()->diagram());
- return true;
- }
+ if (id == QStringLiteral("showDefinition")) {
+ diagramSceneModel()->diagramSceneController()->elementTasks()->openClassDefinition(object(), diagramSceneModel()->diagram());
+ return true;
}
return false;
}
diff --git a/src/libs/modelinglib/qmt/diagram_scene/items/classitem.h b/src/libs/modelinglib/qmt/diagram_scene/items/classitem.h
index c4312a313c..eb80e3e865 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/items/classitem.h
+++ b/src/libs/modelinglib/qmt/diagram_scene/items/classitem.h
@@ -67,7 +67,7 @@ public:
protected:
bool extendContextMenu(QMenu *menu) override;
- bool handleSelectedContextMenuAction(QAction *action) override;
+ bool handleSelectedContextMenuAction(const QString &id) override;
QString buildDisplayName() const override;
void setFromDisplayName(const QString &displayName) override;
diff --git a/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp b/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp
index ef55159393..8c73b3c91f 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp
+++ b/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.cpp
@@ -697,9 +697,9 @@ bool ObjectItem::extendContextMenu(QMenu *menu)
return false;
}
-bool ObjectItem::handleSelectedContextMenuAction(QAction *action)
+bool ObjectItem::handleSelectedContextMenuAction(const QString &id)
{
- Q_UNUSED(action);
+ Q_UNUSED(id);
return false;
}
@@ -736,17 +736,20 @@ void ObjectItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
void ObjectItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
QMenu menu;
+ IElementTasks *element_tasks = diagramSceneModel()->diagramSceneController()->elementTasks();
bool addSeparator = false;
- if (diagramSceneModel()->diagramSceneController()->elementTasks()->hasDiagram(m_object, m_diagramSceneModel->diagram())) {
+ if (element_tasks->hasDiagram(m_object, m_diagramSceneModel->diagram())) {
menu.addAction(new ContextMenuAction(tr("Open Diagram"), QStringLiteral("openDiagram"), &menu));
addSeparator = true;
- } else if (diagramSceneModel()->diagramSceneController()->elementTasks()->mayCreateDiagram(m_object, m_diagramSceneModel->diagram())) {
+ } else if (element_tasks->mayCreateDiagram(m_object, m_diagramSceneModel->diagram())) {
menu.addAction(new ContextMenuAction(tr("Create Diagram"), QStringLiteral("createDiagram"), &menu));
addSeparator = true;
}
if (extendContextMenu(&menu))
addSeparator = true;
+ if (element_tasks->extendContextMenu(object(), diagramSceneModel()->diagram(), &menu))
+ addSeparator = true;
if (addSeparator)
menu.addSeparator();
menu.addAction(new ContextMenuAction(tr("Remove"), QStringLiteral("remove"),
@@ -774,9 +777,11 @@ void ObjectItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
QAction *selectedAction = menu.exec(event->screenPos());
if (selectedAction) {
- if (!handleSelectedContextMenuAction(selectedAction)) {
- auto action = dynamic_cast<ContextMenuAction *>(selectedAction);
- QMT_CHECK(action);
+ auto action = dynamic_cast<ContextMenuAction *>(selectedAction);
+ QMT_CHECK(action);
+ bool handled = handleSelectedContextMenuAction(action->id());
+ handled |= element_tasks->handleContextMenuAction(object(), diagramSceneModel()->diagram(), action->id());
+ if (!handled) {
if (action->id() == QStringLiteral("openDiagram")) {
m_diagramSceneModel->diagramSceneController()->elementTasks()->openDiagram(m_object, m_diagramSceneModel->diagram());
} else if (action->id() == QStringLiteral("createDiagram")) {
diff --git a/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.h b/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.h
index 4560a6fbbb..5595c86667 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.h
+++ b/src/libs/modelinglib/qmt/diagram_scene/items/objectitem.h
@@ -147,7 +147,7 @@ protected:
bool showContext() const;
virtual bool extendContextMenu(QMenu *menu);
- virtual bool handleSelectedContextMenuAction(QAction *action);
+ virtual bool handleSelectedContextMenuAction(const QString &id);
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
diff --git a/src/libs/modelinglib/qmt/infrastructure/contextmenuaction.h b/src/libs/modelinglib/qmt/infrastructure/contextmenuaction.h
index ea6f2cd504..2f1402d4d3 100644
--- a/src/libs/modelinglib/qmt/infrastructure/contextmenuaction.h
+++ b/src/libs/modelinglib/qmt/infrastructure/contextmenuaction.h
@@ -25,11 +25,12 @@
#pragma once
+#include "qmt_global.h"
#include <QAction>
namespace qmt {
-class ContextMenuAction : public QAction
+class QMT_EXPORT ContextMenuAction : public QAction
{
public:
ContextMenuAction(const QString &label, const QString &id, QObject *parent = 0);
diff --git a/src/libs/modelinglib/qmt/tasks/ielementtasks.h b/src/libs/modelinglib/qmt/tasks/ielementtasks.h
index 3120474ea6..0851dddeb7 100644
--- a/src/libs/modelinglib/qmt/tasks/ielementtasks.h
+++ b/src/libs/modelinglib/qmt/tasks/ielementtasks.h
@@ -25,6 +25,9 @@
#pragma once
+class QMenu;
+class QString;
+
namespace qmt {
class MElement;
@@ -73,6 +76,9 @@ public:
virtual bool mayCreateDiagram(const DElement *, const MDiagram *) const = 0;
virtual void createAndOpenDiagram(const MElement *) = 0;
virtual void createAndOpenDiagram(const DElement *, const MDiagram *) = 0;
+
+ virtual bool extendContextMenu(const DElement *, const MDiagram *, QMenu *) = 0;
+ virtual bool handleContextMenuAction(const DElement *, const MDiagram *, const QString &) = 0;
};
} // namespace qmt
diff --git a/src/libs/modelinglib/qmt/tasks/voidelementtasks.cpp b/src/libs/modelinglib/qmt/tasks/voidelementtasks.cpp
index 930fb4fe51..2be6953dec 100644
--- a/src/libs/modelinglib/qmt/tasks/voidelementtasks.cpp
+++ b/src/libs/modelinglib/qmt/tasks/voidelementtasks.cpp
@@ -169,4 +169,14 @@ void VoidElementTasks::createAndOpenDiagram(const DElement *, const MDiagram *)
{
}
+bool VoidElementTasks::extendContextMenu(const DElement *, const MDiagram *, QMenu *)
+{
+ return false;
+}
+
+bool VoidElementTasks::handleContextMenuAction(const DElement *, const MDiagram *, const QString &)
+{
+ return false;
+}
+
} // namespace qmt
diff --git a/src/libs/modelinglib/qmt/tasks/voidelementtasks.h b/src/libs/modelinglib/qmt/tasks/voidelementtasks.h
index 4ed1dd19b6..fc9e88364a 100644
--- a/src/libs/modelinglib/qmt/tasks/voidelementtasks.h
+++ b/src/libs/modelinglib/qmt/tasks/voidelementtasks.h
@@ -68,10 +68,13 @@ public:
void openParentDiagram(const MElement *) override;
void openParentDiagram(const DElement *, const MElement *) override;
- bool mayCreateDiagram(const qmt::MElement *) const override;
- bool mayCreateDiagram(const qmt::DElement *, const qmt::MDiagram *) const override;
- void createAndOpenDiagram(const qmt::MElement *) override;
- void createAndOpenDiagram(const qmt::DElement *, const qmt::MDiagram *) override;
+ bool mayCreateDiagram(const MElement *) const override;
+ bool mayCreateDiagram(const DElement *, const MDiagram *) const override;
+ void createAndOpenDiagram(const MElement *) override;
+ void createAndOpenDiagram(const DElement *, const MDiagram *) override;
+
+ bool extendContextMenu(const DElement *, const MDiagram *, QMenu *) override;
+ bool handleContextMenuAction(const DElement *, const MDiagram *, const QString &) override;
};
} // namespace qmt
diff --git a/src/plugins/modeleditor/componentviewcontroller.cpp b/src/plugins/modeleditor/componentviewcontroller.cpp
index 2bda099f49..c90aaa49b2 100644
--- a/src/plugins/modeleditor/componentviewcontroller.cpp
+++ b/src/plugins/modeleditor/componentviewcontroller.cpp
@@ -46,7 +46,8 @@
#include <QFileInfo>
-// TODO this class is experimental and not finished. Code needs fixes and to be cleaned up!
+// TODO implement removing include dependencies that are not longer used
+// TODO refactor add/remove relations between ancestor packages into extra controller class
namespace ModelEditor {
namespace Internal {
@@ -209,6 +210,7 @@ void UpdateIncludeDependenciesVisitor::visitMComponent(qmt::MComponent *componen
if (!haveDependency(componentAncestors.at(index1), includeComponentAncestors.at(index2))) {
auto dependency = new qmt::MDependency;
dependency->setFlags(qmt::MElement::ReverseEngineered);
+ // TODO set stereotype for testing purpose
dependency->setStereotypes(QStringList() << QStringLiteral("same stereotype"));
dependency->setDirection(qmt::MDependency::AToB);
dependency->setSource(componentAncestors.at(index1)->uid());
@@ -229,6 +231,7 @@ void UpdateIncludeDependenciesVisitor::visitMComponent(qmt::MComponent *componen
if (!haveDependency(componentAncestors.at(componentHighestAncestorIndex), includeComponentAncestors)) {
auto dependency = new qmt::MDependency;
dependency->setFlags(qmt::MElement::ReverseEngineered);
+ // TODO set stereotype for testing purpose
dependency->setStereotypes(QStringList() << QStringLiteral("ancestor"));
dependency->setDirection(qmt::MDependency::AToB);
dependency->setSource(componentAncestors.at(componentHighestAncestorIndex)->uid());
@@ -243,6 +246,7 @@ void UpdateIncludeDependenciesVisitor::visitMComponent(qmt::MComponent *componen
if (!haveDependency(componentAncestors.at(0), includeComponentAncestors)) {
auto dependency = new qmt::MDependency;
dependency->setFlags(qmt::MElement::ReverseEngineered);
+ // TODO set stereotype for testing purpose
dependency->setStereotypes(QStringList() << QStringLiteral("parents"));
dependency->setDirection(qmt::MDependency::AToB);
dependency->setSource(componentAncestors.at(0)->uid());
diff --git a/src/plugins/modeleditor/elementtasks.cpp b/src/plugins/modeleditor/elementtasks.cpp
index cb868a472e..ed120c3523 100644
--- a/src/plugins/modeleditor/elementtasks.cpp
+++ b/src/plugins/modeleditor/elementtasks.cpp
@@ -28,9 +28,12 @@
#include "modelsmanager.h"
#include "openelementvisitor.h"
#include "modeleditor_plugin.h"
+#include "componentviewcontroller.h"
#include "qmt/diagram/delement.h"
+#include "qmt/diagram/dpackage.h"
#include "qmt/document_controller/documentcontroller.h"
+#include "qmt/infrastructure/contextmenuaction.h"
#include "qmt/model/melement.h"
#include "qmt/model/mclass.h"
#include "qmt/model/mdiagram.h"
@@ -49,16 +52,20 @@
#include <coreplugin/locator/ilocatorfilter.h>
#include <utils/qtcassert.h>
+#include <QMenu>
+
namespace ModelEditor {
namespace Internal {
class ElementTasks::ElementTasksPrivate {
public:
qmt::DocumentController *documentController = 0;
+ ComponentViewController *componentViewController = 0;
};
-ElementTasks::ElementTasks()
- : d(new ElementTasksPrivate)
+ElementTasks::ElementTasks(QObject *parent)
+ : QObject(parent),
+ d(new ElementTasksPrivate)
{
}
@@ -72,6 +79,11 @@ void ElementTasks::setDocumentController(qmt::DocumentController *documentContro
d->documentController = documentController;
}
+void ElementTasks::setComponentViewController(ComponentViewController *componentViewController)
+{
+ d->componentViewController = componentViewController;
+}
+
void ElementTasks::openElement(const qmt::MElement *element)
{
OpenModelElementVisitor visitor;
@@ -408,5 +420,26 @@ void ElementTasks::createAndOpenDiagram(const qmt::DElement *element, const qmt:
createAndOpenDiagram(melement);
}
+bool ElementTasks::extendContextMenu(const qmt::DElement *delement, const qmt::MDiagram *, QMenu *menu)
+{
+ bool extended = false;
+ if (dynamic_cast<const qmt::DPackage *>(delement)) {
+ menu->addAction(new qmt::ContextMenuAction(tr("Update Include Dependencies"), QStringLiteral("updateIncludeDependencies"), menu));
+ extended = true;
+ }
+ return extended;
+}
+
+bool ElementTasks::handleContextMenuAction(const qmt::DElement *element, const qmt::MDiagram *, const QString &id)
+{
+ if (id == "updateIncludeDependencies") {
+ qmt::MPackage *mpackage = d->documentController->modelController()->findElement<qmt::MPackage>(element->modelUid());
+ if (mpackage)
+ d->componentViewController->updateIncludeDependencies(mpackage);
+ return true;
+ }
+ return false;
+}
+
} // namespace Internal
} // namespace ModelEditor
diff --git a/src/plugins/modeleditor/elementtasks.h b/src/plugins/modeleditor/elementtasks.h
index 9e38b43abe..fa2fc53cdc 100644
--- a/src/plugins/modeleditor/elementtasks.h
+++ b/src/plugins/modeleditor/elementtasks.h
@@ -25,6 +25,7 @@
#pragma once
+#include <QObject>
#include "qmt/tasks/ielementtasks.h"
namespace qmt { class DocumentController; }
@@ -32,16 +33,21 @@ namespace qmt { class DocumentController; }
namespace ModelEditor {
namespace Internal {
+class ComponentViewController;
+
class ElementTasks :
- public qmt::IElementTasks
+ public QObject, public qmt::IElementTasks
{
+ Q_OBJECT
+
class ElementTasksPrivate;
public:
- ElementTasks();
+ ElementTasks(QObject *parent = 0);
~ElementTasks();
void setDocumentController(qmt::DocumentController *documentController);
+ void setComponentViewController(ComponentViewController *componentViewController);
void openElement(const qmt::MElement *element) override;
void openElement(const qmt::DElement *element, const qmt::MDiagram *diagram) override;
@@ -82,6 +88,9 @@ public:
void createAndOpenDiagram(const qmt::MElement *element) override;
void createAndOpenDiagram(const qmt::DElement *element, const qmt::MDiagram *diagram) override;
+ bool extendContextMenu(const qmt::DElement *delement, const qmt::MDiagram *, QMenu *menu) override;
+ bool handleContextMenuAction(const qmt::DElement *element, const qmt::MDiagram *, const QString &id) override;
+
private:
ElementTasksPrivate *d;
};
diff --git a/src/plugins/modeleditor/extdocumentcontroller.cpp b/src/plugins/modeleditor/extdocumentcontroller.cpp
index 2433f21f3b..72e960461b 100644
--- a/src/plugins/modeleditor/extdocumentcontroller.cpp
+++ b/src/plugins/modeleditor/extdocumentcontroller.cpp
@@ -46,9 +46,10 @@ ExtDocumentController::ExtDocumentController(QObject *parent)
: qmt::DocumentController(parent),
d(new ExtDocumentControllerPrivate)
{
- d->elementTasks = new ElementTasks;
+ d->elementTasks = new ElementTasks(this);
d->pxNodeController = new PxNodeController(this);
d->elementTasks->setDocumentController(this);
+ d->elementTasks->setComponentViewController(d->pxNodeController->componentViewController());
diagramSceneController()->setElementTasks(d->elementTasks);
d->pxNodeController->setDiagramSceneController(diagramSceneController());
@@ -59,7 +60,6 @@ ExtDocumentController::ExtDocumentController(QObject *parent)
ExtDocumentController::~ExtDocumentController()
{
- delete d->elementTasks;
delete d;
}
diff --git a/src/plugins/modeleditor/pxnodecontroller.cpp b/src/plugins/modeleditor/pxnodecontroller.cpp
index e272c67f6f..79ceb8a914 100644
--- a/src/plugins/modeleditor/pxnodecontroller.cpp
+++ b/src/plugins/modeleditor/pxnodecontroller.cpp
@@ -113,6 +113,11 @@ PxNodeController::~PxNodeController()
delete d;
}
+ComponentViewController *PxNodeController::componentViewController() const
+{
+ return d->componentViewController;
+}
+
void PxNodeController::setDiagramSceneController(
qmt::DiagramSceneController *diagramSceneController)
{
diff --git a/src/plugins/modeleditor/pxnodecontroller.h b/src/plugins/modeleditor/pxnodecontroller.h
index 7bfcbd41aa..7eee19e66a 100644
--- a/src/plugins/modeleditor/pxnodecontroller.h
+++ b/src/plugins/modeleditor/pxnodecontroller.h
@@ -39,6 +39,8 @@ class DiagramSceneController;
namespace ModelEditor {
namespace Internal {
+class ComponentViewController;
+
class PxNodeController :
public QObject
{
@@ -50,6 +52,8 @@ public:
explicit PxNodeController(QObject *parent = 0);
~PxNodeController();
+ ComponentViewController *componentViewController() const;
+
void setDiagramSceneController(qmt::DiagramSceneController *diagramSceneController);
void setAnchorFolder(const QString &anchorFolder);