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.
403 lines
12 KiB
403 lines
12 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) 2002-2007 *
|
|
* Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
|
|
***************************************************************************/
|
|
|
|
#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.trinitydesktop.org
|
|
*/
|
|
class MessageWidget : public UMLWidget, public LinkWidget {
|
|
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
|