/*************************************************************************** * * * 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 * ***************************************************************************/ #ifndef TOOLBARSTATEMESSAGES_H #define TOOLBARSTATEMESSAGES_H #include "toolbarstatepool.h" #include class TQCanvasLine; class ObjectWidget; /** * Messages tool to create messages between objects in sequence diagrams. * With messages tool, two objects are selected clicking with left button on * them and a message of the needed type (depending on the message button * selected) is created between the objects. When the first object is selected, * a temporal visual message that follows the cursor movement is created until * the second object is selected or the message cancelled. * * A message can be cancelled using right button, which also returns to default * tool, or with middle button, which only cancels the message without changing * the tool being used. * * The messages to create can be normal messages or creation messages. Normal * messages are created clicking on the line of the two objects. Creation * messages are created clicking in the line of the first object, and on the * second object itself (not in its line). * * Associations aren't taken into account, and are treated as empty spaces. * Moreover, widgets other than objects aren't neither taken into account. * * @todo refactor with common code in ToolBarStateAssociation? * @todo sequence message lines should be handled by object widgets. Right now, * they aren't taken into account in testOnWidget and an explicit check is * needed. However, if onWidget in object widgets is changed to also check for * the line, a way to make them prioritaries over other widgets in testOnWidget * will be needed. For example, when creating a message clicking on an already * created message,the message line must be got instead of the message, even if * the message is smaller than the line. */ class ToolBarStateMessages : public ToolBarStatePool { Q_OBJECT public: /** * Creates a new ToolBarStateMessages. * * @param umlView The UMLView to use. */ ToolBarStateMessages(UMLView *umlView); /** * Destroys this ToolBarStateMessages. */ virtual ~ToolBarStateMessages(); /** * 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 message. */ virtual void cleanBeforeChange(); /** * Called when a mouse event happened. * It executes the base method and then updates the position of the * message line, if any. */ virtual void mouseMove(TQMouseEvent* 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 object, the message is cleaned. */ virtual void slotWidgetRemoved(UMLWidget* widget); protected: /** * Selects only widgets, but no associations. * Overrides base class method. * If the press event happened on the line of an object, the object is set * as current widget. If the press event happened on a widget, the widget is * set as current widget. */ virtual void setCurrentElement(); /** * Called when the release event happened on a widget. * If the button pressed isn't left button or the widget isn't an object * widget, the message is cleaned. * If the release event didn't happen on the line of an object and the first * object wasn't selected, nothing is done. If the first object was already * selected, a creation message is made. * If the event happened on the line of an object, the first object or the * second are set, depending on whether the first object was already set or * not. */ virtual void mouseReleaseWidget(); /** * Called when the release event happened on an empty space. * Cleans the message. * Empty spaces are not only actual empty spaces, but also associations. */ virtual void mouseReleaseEmpty(); protected: /** * The type of the message to create. */ enum MessageType { NormalMessage, CreationMessage }; /** * Sets the first object of the message using the specified object. * The temporal visual message is created and mouse tracking enabled, so * mouse events will be delivered. * * @param firstObject The first object of the message. */ void setFirstWidget(ObjectWidget* firstObject); /** * Sets the second object of the message using the specified widget and * creates the message. * The association is created and added to the view. The dialog to select * the operation of the message is shown. * * @param secondObject The second object of the message. * @param messageType The type of the message to create. */ void setSecondWidget(ObjectWidget* secondObject, MessageType messageType); /** * Returns the message type of this tool. * * @return The message type of this tool. */ Uml::Sequence_Message_Type getMessageType(); /** * Cleans the first widget and the temporal message line, if any. * Both are set to null, and the message line is also deleted. */ void cleanMessage(); /** * The first object in the message. */ ObjectWidget* m_firstObject; /** * The message line shown while the first widget is selected and the * second one wasn't selected yet. */ TQCanvasLine* m_messageLine; /** * If there is a current widget, it is true if the press event happened on * the line of an object, or false if it happened on a normal UMLWidget. */ bool m_isObjectWidgetLine; }; #endif //TOOLBARSTATEMESSAGES_H