You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/umbrello/umbrello/toolbarstatemessages.h

189 lines
6.4 KiB

/***************************************************************************
* *
* 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 TOOLBARSTATEMESSAGES_H
#define TOOLBARSTATEMESSAGES_H
#include "toolbarstatepool.h"
#include <tqpoint.h>
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 {
TQ_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