/*************************************************************************** * * * 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) 2002-2007 * * Umbrello UML Modeller Authors * ***************************************************************************/ #ifndef MESSAGEWIDGET_H #define MESSAGEWIDGET_H #include "umlwidget.h" #include "linkwidget.h" // forward declarations class FloatingTextWidget; class ObjectWidget; class UMLOperation; class MessageWidgetController; /** * Used to display a message on a sequence diagram. The message * could be between two objects or a message that calls itself on * an object. This class will only display the line that is * required and the text will be setup by the @ref FloatingTextWidget * widget that is passed in the constructor. A message can be * synchronous (calls a method and gains control back on return, * as happens in most programming languages) or asynchronous * (calls a method and gains back control immediately). * * @short Displays a message. * @author Paul Hensgen * @see UMLWidget * @see ObjectWidget * @see FloatingTextWidget * Bugs and comments to uml-devel@lists.sf.net or http://bugs.kde.org */ class MessageWidget : public UMLWidget, public LinkWidget { Q_OBJECT TQ_OBJECT public: friend class MessageWidgetController; /** * Constructs a MessageWidget. * * @param view The parent to this class. * @param a The role A widget for this message. * @param b The role B widget for this message. * @param y The vertical position to display this message. * @param sequenceMessageType Whether synchronous or asynchronous * @param id A unique id used for deleting this object cleanly. * The default (-1) will prompt generation of a new ID. */ MessageWidget(UMLView * view, ObjectWidget* a, ObjectWidget* b, int y, Uml::Sequence_Message_Type sequenceMessageType, Uml::IDType id = Uml::id_None); /** * Constructs a MessageWidget. * * @param view The parent to this class. * @param sequenceMessageType The Uml::Sequence_Message_Type of this message widget * @param id The ID to assign (-1 will prompt a new ID.) */ MessageWidget(UMLView * view, Uml::Sequence_Message_Type sequenceMessageType, Uml::IDType id = Uml::id_None); /** * Initializes key variables of the class. */ void init(); /** * Standard deconstructor. */ virtual ~MessageWidget(); /** * Write property of TQString m_SequenceNumber. */ void setSequenceNumber( const TQString &sequenceNumber ); /** * Read property of TQString m_SequenceNumber. */ TQString getSequenceNumber() const; /** * Returns whether the message is synchronous or asynchronous */ Uml::Sequence_Message_Type getSequenceMessageType() const { return m_sequenceMessageType; } /** * Check to see if the given ObjectWidget is involved in the message. * * @param w The ObjectWidget to check for. * @return true - if is contained, false - not contained. */ bool contains(ObjectWidget * w); /** * Returns the related widget on the given side. * * @return The ObjectWidget we are related to. */ ObjectWidget* getWidget(Uml::Role_Type role); /** * Sets the related widget on the given side. * * @param ow The ObjectWidget we are related to. * @param role The Uml::Role_Type to be set for the ObjectWidget */ void setWidget(ObjectWidget * ow, Uml::Role_Type role) ; /** * Returns the text widget it is related to. * * @return The text widget we are related to. */ FloatingTextWidget * getFloatingTextWidget() { return m_pFText; } /** * Sets the text widget it is related to. * * @param f The text widget we are related to. */ void setFloatingTextWidget(FloatingTextWidget * f) { m_pFText = f; } /** * Implements operation from LinkWidget. * Required by FloatingTextWidget. */ void lwSetFont (TQFont font); /** * Overrides operation from LinkWidget. * Required by FloatingTextWidget. * @todo Move to LinkWidget. */ UMLClassifier *getOperationOwner(); /** * Implements operation from LinkWidget. * Motivated by FloatingTextWidget. */ UMLOperation *getOperation(); /** * Implements operation from LinkWidget. * Motivated by FloatingTextWidget. */ void setOperation(UMLOperation *op); /** * Overrides operation from LinkWidget. * Required by FloatingTextWidget. */ TQString getCustomOpText(); /** * Overrides operation from LinkWidget. * Required by FloatingTextWidget. */ void setCustomOpText(const TQString &opText); /** * Overrides operation from LinkWidget. * Required by FloatingTextWidget. * * @param ft The text widget which to update. */ void setMessageText(FloatingTextWidget *ft); /** * Overrides operation from LinkWidget. * Required by FloatingTextWidget. * * @param ft The text widget which to update. * @param newText The new text to set. */ void setText(FloatingTextWidget *ft, const TQString &newText); /** * Overrides operation from LinkWidget. * Required by FloatingTextWidget. * * @param seqNum The new sequence number string to set. * @param op The new operation string to set. */ void setSeqNumAndOp(const TQString &seqNum, const TQString &op); /** * Overrides operation from LinkWidget. * Required by FloatingTextWidget. * * @param seqNum Return this MessageWidget's sequence number string. * @param op Return this MessageWidget's operation string. */ UMLClassifier * getSeqNumAndOp(TQString& seqNum, TQString& op); /** * Calculate the geometry of the widget. */ void calculateWidget(); /** * Activates a MessageWidget. Connects its m_pOw[] pointers * to UMLObjects and also send signals about its FloatingTextWidget. */ bool activate(IDChangeLog * Log = 0); /** * Calculates the size of the widget by calling * calculateDimenstionsSynchronous(), * calculateDimenstionsAsynchronous(), or * calculateDimensionsCreation() */ void calculateDimensions(); /** * Calculates and sets the size of the widget for a synchronous message */ void calculateDimensionsSynchronous(); /** * Calculates and sets the size of the widget for an asynchronous message */ void calculateDimensionsAsynchronous(); /** * Calculates and sets the size of the widget for a creation message */ void calculateDimensionsCreation(); /** * Calls drawSynchronous() or drawAsynchronous() */ void draw(TQPainter& p, int offsetX, int offsetY); /** * Draws the calling arrow with filled in arrowhead, the * timeline box and the returning arrow with a dashed line and * stick arrowhead. */ void drawSynchronous(TQPainter& p, int offsetX, int offsetY); /** * Draws a solid arrow line and a stick arrow head. */ void drawAsynchronous(TQPainter& p, int offsetX, int offsetY); /** * Draws a solid arrow line and a stick arrow head to the * edge of the target object widget instead of to the * sequence line. */ void drawCreation(TQPainter& p, int offsetX, int offsetY); /** * Sets the text position relative to the sequence message. */ void setTextPosition(); /** * Constrains the FloatingTextWidget X and Y values supplied. * Overrides operation from LinkWidget. * * @param textX Candidate X value (may be modified by the constraint.) * @param textY Candidate Y value (may be modified by the constraint.) * @param textWidth Width of the text. * @param textHeight Height of the text. * @param tr Uml::Text_Role of the text. */ void constrainTextPos(int &textX, int &textY, int textWidth, int textHeight, Uml::Text_Role tr); /** * Used to cleanup any other widget it may need to delete. */ void cleanup(); /** * Sets the state of whether the widget is selected. * * @param _select True if the widget is selected. */ void setSelected(bool _select); /** * Returns the minimum height this widget should be set at on * a sequence diagrams. Takes into account the widget positions * it is related to. */ int getMinY(); /** * Returns the maximum height this widget should be set at on * a sequence diagrams. Takes into account the widget positions * it is related to. */ int getMaxY(); /** * Overrides operation from UMLWidget. * * @param p Point to be checked. * * @return Non-zero if the point is on a part of the MessageWidget. * NB In case of a synchronous message, the empty space * between call line and return line does not count, i.e. if * the point is located in that space the function returns 0. */ int onWidget(const TQPoint & p); /** * Saves to the "messagewidget" XMI element. */ void saveToXMI( TQDomDocument & qDoc, TQDomElement & qElement ); /** * Loads from the "messagewidget" XMI element. */ bool loadFromXMI( TQDomElement & qElement ); protected: /** * Shortcut for calling m_pFText->setLink() followed by * this->setTextPosition(). */ void setLinkAndTextPos(); /** * Returns the textX arg with constraints applied. * Auxiliary to setTextPosition() and constrainTextPos(). */ int constrainX(int textX, int textWidth, Uml::Text_Role tr); /** * Draw an arrow pointing in the given direction. * The arrow head is not solid, i.e. it is made up of two lines * like so: ---> * The direction can be either TQt::LeftArrow or TQt::RightArrow. */ static void drawArrow( TQPainter& p, int x, int y, int w, TQt::ArrowType direction, bool useDottedLine = false ); /** * Draw a solid (triangular) arrowhead pointing in the given direction. * The direction can be either TQt::LeftArrow or TQt::RightArrow. */ static void drawSolidArrowhead(TQPainter& p, int x, int y, TQt::ArrowType direction); /** * Update the UMLWidget::m_bResizable flag according to the * charactersitics of this message. */ void updateResizability(); // Data loaded/saved TQString m_SequenceNumber; TQString m_CustomOp; /** * Whether the message is synchronous or asynchronous */ Uml::Sequence_Message_Type m_sequenceMessageType; private: void moveEvent(TQMoveEvent */*m*/); void resizeEvent(TQResizeEvent */*re*/); ObjectWidget * m_pOw[2]; FloatingTextWidget * m_pFText; int m_nY; /** * The following variables are used by loadFromXMI() as an intermediate * store. activate() resolves the IDs, i.e. after activate() the variables * m_pOw[] and m_pFText can be used. */ Uml::IDType m_widgetAId, m_widgetBId, m_textId; public slots: void slotWidgetMoved(Uml::IDType id); void slotMenuSelection(int sel); signals: /** * emitted when the message widget is moved up or down * slots into ObjectWidget::slotMessageMoved() */ void sigMessageMoved(); }; #endif