summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/toolbarstateassociation.h
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/toolbarstateassociation.h')
-rw-r--r--umbrello/umbrello/toolbarstateassociation.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/umbrello/umbrello/toolbarstateassociation.h b/umbrello/umbrello/toolbarstateassociation.h
new file mode 100644
index 00000000..1d6c5174
--- /dev/null
+++ b/umbrello/umbrello/toolbarstateassociation.h
@@ -0,0 +1,168 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * copyright (C) 2004-2006 *
+ * Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************/
+
+#ifndef TOOLBARSTATEASSOCIATION_H
+#define TOOLBARSTATEASSOCIATION_H
+
+#include "toolbarstatepool.h"
+
+class QCanvasLine;
+
+/**
+ * Association tool to create associations between widgets.
+ * With association tool, two widgets are selected clicking with left button on
+ * them and an association of the needed type (depending on the association
+ * button selected) is created between the widgets. When the first widget is
+ * selected, a temporal visual association that follows the cursor movement is
+ * created until the second widget is selected or the association cancelled.
+ *
+ * Also, association tool can create association class: a classifier widget
+ * which is linked to an association. To do this, the classifier must be
+ * selected first and then the association must be selected. The association
+ * can't be selected first.
+ *
+ * An association can be cancelled using right button, which also returns to
+ * default tool, or with middle button, which only cancels the association
+ * without changing the tool being used.
+ *
+ * @todo refactor with common code in ToolBarStateMessages?
+ */
+class ToolBarStateAssociation : public ToolBarStatePool {
+ Q_OBJECT
+public:
+
+ /**
+ * Creates a new ToolBarStateAssociation.
+ *
+ * @param umlView The UMLView to use.
+ */
+ ToolBarStateAssociation(UMLView *umlView);
+
+ /**
+ * Destroys this ToolBarStateAssociation.
+ * Deletes the association line.
+ */
+ virtual ~ToolBarStateAssociation();
+
+ /**
+ * Goes back to the initial state.
+ */
+ virtual void init();
+
+ /**
+ * Called when the current tool is changed to use another tool.
+ * Executes base method and cleans the association.
+ */
+ virtual void cleanBeforeChange();
+
+ /**
+ * Called when a mouse event happened.
+ * It executes the base method and then updates the position of the
+ * association line, if any.
+ */
+ virtual void mouseMove(QMouseEvent* ome);
+
+public slots:
+
+ /**
+ * A widget was removed from the UMLView.
+ * If the widget removed was the current widget, the current widget is set
+ * to 0.
+ * Also, if it was the first widget, the association is cleaned.
+ */
+ virtual void slotWidgetRemoved(UMLWidget* widget);
+
+protected:
+
+ /**
+ * Called when the release event happened on an association.
+ * If the button pressed isn't left button, the association being created is
+ * cleaned. If it is left button, and the first widget is set and is a
+ * classifier widget, it creates an association class. Otherwise, the
+ * association being created is cleaned.
+ */
+ virtual void mouseReleaseAssociation();
+
+ /**
+ * Called when the release event happened on a widget.
+ * If the button pressed isn't left button, the association is cleaned. If
+ * it is left button, sets the first widget or the second, depending on
+ * whether the first widget is already set or not.
+ */
+ virtual void mouseReleaseWidget();
+
+ /**
+ * Called when the release event happened on an empty space.
+ * Cleans the association.
+ */
+ virtual void mouseReleaseEmpty();
+
+private:
+
+ /**
+ * Sets the first widget in the association using the current widget.
+ * If the widget can't be associated using the current type of association,
+ * an error is shown and the widget isn't set.
+ * Otherwise, the temporal visual association is created and the mouse
+ * tracking is enabled, so move events will be delivered.
+ */
+ void setFirstWidget();
+
+ /**
+ * Sets the second widget in the association using the current widget and
+ * creates the association.
+ * If the association between the two widgets using the current type of
+ * association, an error is shown and the association cancelled.
+ * Otherwise, the association is created and added to the view, and the tool
+ * is changed to the default tool.
+ *
+ * @todo Why change to the default tool? Shouldn't it better to stay on
+ * association and let the user change with a right click? The tool to
+ * create widgets doesn't change to default after creating a widget
+ */
+ void setSecondWidget();
+
+ /**
+ * Returns the association type of this tool.
+ *
+ * @return The association type of this tool.
+ */
+ Uml::Association_Type getAssociationType();
+
+ /**
+ * Adds an AssociationWidget to the association list and creates the
+ * corresponding UMLAssociation in the current UMLDoc.
+ * If the association can't be added, is deleted.
+ *
+ * @param association The AssociationWidget to add.
+ */
+ void addAssociationInViewAndDoc(AssociationWidget* association);
+
+ /**
+ * Cleans the first widget and the temporal association line, if any.
+ * Both are set to null, and the association line is also deleted.
+ */
+ void cleanAssociation();
+
+ /**
+ * The first widget in the association.
+ */
+ UMLWidget* m_firstWidget;
+
+ /**
+ * The association line shown while the first widget is selected and the
+ * second one wasn't selected yet.
+ */
+ QCanvasLine* m_associationLine;
+
+};
+
+#endif //TOOLBARSTATEASSOCIATION_H