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.
730 lines
18 KiB
730 lines
18 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 UMLWIDGET_H
|
|
#define UMLWIDGET_H
|
|
|
|
#include <tqcanvas.h>
|
|
#include <tqdatetime.h>
|
|
#include <tqfont.h>
|
|
|
|
#include "umlnamespace.h"
|
|
#include "widgetbase.h"
|
|
#include "associationwidgetlist.h"
|
|
#include "optionstate.h"
|
|
|
|
class UMLWidgetController;
|
|
|
|
class UMLObject;
|
|
class UMLView;
|
|
class UMLDoc;
|
|
class ListPopupMenu;
|
|
class IDChangeLog;
|
|
|
|
class TQPainter;
|
|
class TQFont;
|
|
class TQFontMetrics;
|
|
|
|
/**
|
|
* This is the base class for nearly all graphical widgets.
|
|
*
|
|
* @short The base class for graphical UML objects.
|
|
* @author Paul Hensgen <phensgen@techie.com>
|
|
* Bugs and comments to uml-devel@lists.sf.net or http://bugs.kde.org
|
|
*/
|
|
class UMLWidget : public WidgetBase, public TQCanvasRectangle {
|
|
Q_OBJECT
|
|
TQ_OBJECT
|
|
public:
|
|
friend class UMLWidgetController;
|
|
|
|
/**
|
|
* Creates a UMLWidget object.
|
|
*
|
|
* @param view The view to be displayed on.
|
|
* @param o The UMLObject to represent.
|
|
* @param widgetController The UMLWidgetController of this UMLWidget
|
|
*/
|
|
UMLWidget( UMLView * view, UMLObject * o, UMLWidgetController *widgetController = 0 );
|
|
|
|
/**
|
|
* Creates a UMLWidget object.
|
|
*
|
|
* @param view The view to be displayed on.
|
|
* @param id The id of the widget.
|
|
* The default value (id_None) will prompt generation of a new ID.
|
|
* @param widgetController The UMLWidgetController of this UMLWidget
|
|
*/
|
|
explicit UMLWidget( UMLView * view, Uml::IDType id = Uml::id_None, UMLWidgetController *widgetController = 0 );
|
|
|
|
/**
|
|
* Standard deconstructor
|
|
*/
|
|
virtual ~UMLWidget();
|
|
|
|
/**
|
|
* Copy constructor
|
|
*/
|
|
UMLWidget(const UMLWidget& other);
|
|
|
|
/**
|
|
* Assignment operator
|
|
*/
|
|
virtual UMLWidget& operator=(const UMLWidget& other);
|
|
|
|
/**
|
|
* Overload '==' operator
|
|
*/
|
|
virtual bool operator==(const UMLWidget& other);
|
|
|
|
/**
|
|
* Calls the method with the same name in UMLWidgetController.
|
|
* @see UMLWidgetController#mouseReleaseEvent
|
|
*
|
|
* @param me The TQMouseEvent event.
|
|
*/
|
|
virtual void mouseReleaseEvent(TQMouseEvent * me);
|
|
|
|
/**
|
|
* Calls the method with the same name in UMLWidgetController.
|
|
* @see UMLWidgetController#mouseDoubleClickEvent
|
|
*
|
|
* @param me The TQMouseEvent event.
|
|
*/
|
|
virtual void mouseDoubleClickEvent(TQMouseEvent *me);
|
|
|
|
/**
|
|
* Set the status of using fill color.
|
|
*
|
|
* @param fc the status of using fill color.
|
|
*/
|
|
void setUseFillColour(bool fc);
|
|
|
|
/**
|
|
* Read property of bool m_bUseFillColour.
|
|
*/
|
|
bool getUseFillColour() const {
|
|
return m_bUseFillColour;
|
|
}
|
|
|
|
/**
|
|
* Overrides the method from WidgetBase.
|
|
*/
|
|
void setLineColor(const TQColor &colour);
|
|
|
|
/**
|
|
* Overrides the method from WidgetBase.
|
|
*/
|
|
void setLineWidth(uint width);
|
|
|
|
/**
|
|
* Sets the background fill colour
|
|
*
|
|
* @param colour the new fill colour
|
|
*/
|
|
void setFillColour(const TQColor &colour);
|
|
|
|
/**
|
|
* Read property of TQColor m_FillColour.
|
|
*/
|
|
TQColor getFillColour() const {
|
|
return m_FillColour;
|
|
}
|
|
|
|
/**
|
|
* Calls the method with the same name in UMLWidgetController.
|
|
* @see UMLWidgetController#mouseMoveEvent
|
|
*
|
|
* @param me The TQMouseEvent event.
|
|
*/
|
|
virtual void mouseMoveEvent(TQMouseEvent* me);
|
|
|
|
/**
|
|
* Returns whether this is a line of text.
|
|
* Used for transparency in printing.
|
|
*
|
|
* @return always false
|
|
*/
|
|
virtual bool isText() {
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Sets the state of whether the widget is selected.
|
|
*
|
|
* @param _select The state of whether the widget is selected.
|
|
*/
|
|
virtual void setSelected(bool _select);
|
|
|
|
/**
|
|
* Returns the state of whether the widget is selected.
|
|
*
|
|
* @return Returns the state of whether the widget is selected.
|
|
*/
|
|
bool getSelected() const {
|
|
return m_bSelected;
|
|
}
|
|
|
|
void setSelectedFlag(bool _select) {
|
|
m_bSelected = _select;
|
|
}
|
|
|
|
/**
|
|
* Sets the view the widget is on.
|
|
*
|
|
* @param v The view the widget is on.
|
|
*/
|
|
void setView(UMLView * v);
|
|
|
|
/**
|
|
* Activate the object after serializing it from a TQDataStream
|
|
*
|
|
* @param ChangeLog
|
|
* @return true for success
|
|
*/
|
|
virtual bool activate(IDChangeLog* ChangeLog = 0);
|
|
|
|
/**
|
|
* Returns 0 if the given point is not in the boundaries of the widget,
|
|
* else returns a number which is proportional to the size of the widget.
|
|
*
|
|
* @param p Point to be checked.
|
|
*
|
|
* @return 0 if the given point is not in the boundaries of the widget;
|
|
* (width()+height())/2 if the point is within the boundaries.
|
|
*/
|
|
virtual int onWidget(const TQPoint & p);
|
|
|
|
/**
|
|
* Draws the UMLWidget on the given paint device
|
|
*
|
|
* @param p The painter for the drawing device
|
|
* @param offsetX x position to start the drawing.
|
|
* @param offsetY y position to start the drawing.
|
|
*
|
|
*/
|
|
virtual void draw(TQPainter & p, int offsetX, int offsetY) = 0;
|
|
|
|
/**
|
|
* Set the pen.
|
|
*/
|
|
void setPen(TQPainter & p);
|
|
|
|
/**
|
|
* Sets the font the widget is to use.
|
|
*
|
|
* @param font Font to be set.
|
|
*/
|
|
virtual void setFont( TQFont font );
|
|
|
|
/**
|
|
* Returns the font the widget is to use.
|
|
*/
|
|
virtual TQFont getFont() const;
|
|
|
|
/**
|
|
* Returns whether we triggered the update of position movement.
|
|
* If so, you probably don't want to move it.
|
|
*
|
|
* @return The moving state.
|
|
*/
|
|
bool getStartMove() {
|
|
return m_bStartMove;
|
|
}
|
|
|
|
/**
|
|
* Sets the x-coordinate.
|
|
* Currently, the only class that reimplements this method is
|
|
* ObjectWidget.
|
|
*
|
|
* @param x The x-coordinate to be set.
|
|
*/
|
|
virtual void setX( int x );
|
|
|
|
/**
|
|
* Sets the y-coordinate.
|
|
* Currently, the only class that reimplements this method is
|
|
* ObjectWidget.
|
|
*
|
|
* @param y The y-coordinate to be set.
|
|
*/
|
|
virtual void setY( int y );
|
|
|
|
/**
|
|
* Sets the z-coordinate.
|
|
*
|
|
* @param z The z-coordinate to be set.
|
|
*/
|
|
virtual void setZ( int z );
|
|
|
|
/**
|
|
* Gets the x-coordinate.
|
|
*/
|
|
int getX() const {
|
|
return (int)TQCanvasItem::x();
|
|
}
|
|
|
|
/**
|
|
* Gets the y-coordinate.
|
|
*/
|
|
int getY() const {
|
|
return (int)TQCanvasItem::y();
|
|
}
|
|
|
|
/**
|
|
* Gets the z-coordinate.
|
|
*/
|
|
int getZ() const {
|
|
return (int)TQCanvasItem::z();
|
|
}
|
|
|
|
/**
|
|
* Returns the height of widget.
|
|
*/
|
|
int getHeight() const {
|
|
return TQCanvasRectangle::height();
|
|
}
|
|
|
|
/**
|
|
* Returns the width of the widget.
|
|
*/
|
|
int getWidth() const {
|
|
return TQCanvasRectangle::width();
|
|
}
|
|
|
|
/**
|
|
* Sets the size.
|
|
* If m_pView->getSnapComponentSizeToGrid() is true, then
|
|
* set the next larger size that snaps to the grid.
|
|
*/
|
|
void setSize(int width,int height);
|
|
|
|
/**
|
|
* Set m_bIgnoreSnapToGrid.
|
|
*/
|
|
void setIgnoreSnapToGrid(bool to);
|
|
|
|
/**
|
|
* Return the value of m_bIgnoreSnapToGrid.
|
|
*/
|
|
bool getIgnoreSnapToGrid() const;
|
|
|
|
/**
|
|
* Move the widget by an X and Y offset relative to
|
|
* the current position.
|
|
*/
|
|
void moveBy(int dx, int dy);
|
|
|
|
/**
|
|
* Removes an already created association from the list of
|
|
* associations that include this UMLWidget
|
|
*/
|
|
void removeAssoc(AssociationWidget* pAssoc);
|
|
|
|
/**
|
|
* Adds an already created association to the list of
|
|
* associations that include this UMLWidget
|
|
*/
|
|
void addAssoc(AssociationWidget* pAssoc);
|
|
|
|
/**
|
|
* Returns the list of associations connected to this widget.
|
|
*/
|
|
AssociationWidgetList & getAssocList() {
|
|
return m_Assocs;
|
|
}
|
|
|
|
/**
|
|
* Returns m_bUsesDiagramFillColour
|
|
*/
|
|
bool getUsesDiagramFillColour() const {
|
|
return m_bUsesDiagramFillColour;
|
|
}
|
|
|
|
/**
|
|
* Returns m_bUsesDiagramUseFillColour
|
|
*/
|
|
bool getUsesDiagramUseFillColour() const {
|
|
return m_bUsesDiagramUseFillColour;
|
|
}
|
|
|
|
/**
|
|
* Sets m_bUsesDiagramFillColour
|
|
*/
|
|
void setUsesDiagramFillColour(bool usesDiagramFillColour) {
|
|
m_bUsesDiagramFillColour = usesDiagramFillColour;
|
|
}
|
|
|
|
/**
|
|
* Sets m_bUsesDiagramUseFillColour
|
|
*/
|
|
void setUsesDiagramUseFillColour(bool usesDiagramUseFillColour) {
|
|
m_bUsesDiagramUseFillColour = usesDiagramUseFillColour;
|
|
}
|
|
|
|
/**
|
|
* Write property of bool m_bIsInstance
|
|
*/
|
|
void setIsInstance(bool isInstance) {
|
|
m_bIsInstance = isInstance;
|
|
}
|
|
|
|
/**
|
|
* Read property of bool m_bIsInstance
|
|
*/
|
|
bool getIsInstance() const {
|
|
return m_bIsInstance;
|
|
}
|
|
|
|
/**
|
|
* Write property of m_instanceName
|
|
*/
|
|
void setInstanceName(const TQString &instanceName) {
|
|
m_instanceName = instanceName;
|
|
}
|
|
|
|
/**
|
|
* Read property of m_instanceName
|
|
*/
|
|
TQString getInstanceName() const {
|
|
return m_instanceName;
|
|
}
|
|
|
|
/**
|
|
* Returns the status of whether to show Stereotype.
|
|
*
|
|
* @return True if stereotype is shown.
|
|
*/
|
|
bool getShowStereotype() const;
|
|
|
|
/**
|
|
* Set the status of whether to show Stereotype.
|
|
*
|
|
* @param _status True if stereotype shall be shown.
|
|
*/
|
|
virtual void setShowStereotype(bool _status);
|
|
|
|
/**
|
|
* Show a properties dialog for a UMLWidget.
|
|
*/
|
|
virtual void showProperties();
|
|
|
|
/**
|
|
* Returns true if the Activate method has been called for this instance
|
|
*
|
|
* @return The activate status.
|
|
*/
|
|
bool isActivated();
|
|
|
|
/**
|
|
* Sets the name in the corresponding UMLObject.
|
|
* Sets the local m_Text if m_pObject is NULL.
|
|
*
|
|
* @param strName The name to be set.
|
|
*/
|
|
virtual void setName(const TQString &strName);
|
|
|
|
/**
|
|
* Gets the name from the corresponding UMLObject.
|
|
* Returns the local m_Text if m_pObject is NULL.
|
|
*
|
|
* @return The currently set name.
|
|
*/
|
|
virtual TQString getName() const;
|
|
|
|
/**
|
|
* Starts the popup menu.
|
|
*
|
|
* @param At The Point where the diagram is to be coming up.
|
|
*/
|
|
void startPopupMenu( const TQPoint &At );
|
|
|
|
/**
|
|
* Adjusts associations with the given co-ordinates
|
|
*
|
|
* @param x The x-coordinate.
|
|
* @param y The y-coordinate.
|
|
*/
|
|
virtual void adjustAssocs(int x, int y);
|
|
|
|
/**
|
|
* Adjusts all unselected associations with the given co-ordinates
|
|
*
|
|
* @param x The x-coordinate.
|
|
* @param y The y-coordinate.
|
|
*/
|
|
void adjustUnselectedAssocs(int x, int y);
|
|
|
|
/**
|
|
* Set the m_bActivated flag of a widget but does not perform the Activate method
|
|
*
|
|
* @param Active tqStatus of activation is to be set.
|
|
*/
|
|
void setActivated(bool Active = true);
|
|
|
|
/**
|
|
* Used to cleanup any other widget it may need to delete.
|
|
* Used by child classes. This should be called before deleting a widget of a diagram.
|
|
*/
|
|
virtual void cleanup();
|
|
|
|
/**
|
|
* Returns whether the widget type has an associated UMLObject
|
|
*/
|
|
static bool widgetHasUMLObject(Uml::Widget_Type type);
|
|
|
|
/**
|
|
* Update the size of this widget.
|
|
*/
|
|
void updateComponentSize();
|
|
|
|
/**
|
|
* @note For performance Reasons, only FontMetrics for already used
|
|
* font types are updated. Not yet used font types will not get a font metric
|
|
* and will get the same font metric as if painter was zero.
|
|
* This behaviour is acceptable, because diagrams will always be showed on Display
|
|
* first before a special painter like a printer device is used.
|
|
*/
|
|
void forceUpdateFontMetrics(TQPainter *painter);
|
|
|
|
/**
|
|
* Calls the method with the same name in UMLWidgetController.
|
|
* @see UMLWidgetController#mousePressEvent
|
|
*
|
|
* @param me The TQMouseEvent event.
|
|
*/
|
|
virtual void mousePressEvent(TQMouseEvent *me);
|
|
|
|
/**
|
|
* Overrides the standard operation.
|
|
*
|
|
* @param me The move event.
|
|
*/
|
|
virtual void moveEvent(TQMoveEvent *me);
|
|
|
|
virtual void saveToXMI( TQDomDocument & qDoc, TQDomElement & qElement );
|
|
|
|
virtual bool loadFromXMI( TQDomElement & qElement );
|
|
|
|
/**
|
|
* Returns the UMLWdigetController for this widget.
|
|
*/
|
|
UMLWidgetController* getWidgetController();
|
|
|
|
protected:
|
|
/**
|
|
* Apply possible constraints to the given candidate width and height.
|
|
* The default implementation calls calculateSize() and
|
|
* assigns the returned values if they are greater than the
|
|
* input values.
|
|
*
|
|
* @param width input value, may be modified by the constraint
|
|
* @param height input value, may be modified by the constraint
|
|
*/
|
|
virtual void constrain(int& width, int& height);
|
|
|
|
/**
|
|
* Draws that the widget is selected.
|
|
*
|
|
* @param p Device on which is the selection is to be drawn.
|
|
* @param offsetX The x-coordinate for drawing.
|
|
* @param offsetY The y-coordinate for drawing.
|
|
*/
|
|
virtual void drawSelected(TQPainter * p, int offsetX, int offsetY);
|
|
|
|
/**
|
|
* Overrides default method.
|
|
*
|
|
* @param p Device on which the shape.has to be drawn.
|
|
*/
|
|
virtual void drawShape(TQPainter &p );
|
|
|
|
/**
|
|
* Compute the minimum possible width and height.
|
|
* The default implementation returns width=20, height=20.
|
|
*
|
|
* @return TQSize(mininum_width, minimum_height)
|
|
*/
|
|
virtual TQSize calculateSize();
|
|
|
|
typedef enum {
|
|
FT_NORMAL = 0,
|
|
FT_BOLD = 1,
|
|
FT_ITALIC = 2,
|
|
FT_UNDERLINE = 3,
|
|
FT_BOLD_ITALIC = 4,
|
|
FT_BOLD_UNDERLINE = 5,
|
|
FT_ITALIC_UNDERLINE = 6,
|
|
FT_BOLD_ITALIC_UNDERLINE = 7,
|
|
FT_INVALID = 8
|
|
} FontType;
|
|
|
|
/** Template Method, override this to set the default
|
|
* font metric.
|
|
*/
|
|
virtual void setDefaultFontMetrics(UMLWidget::FontType fontType);
|
|
virtual void setDefaultFontMetrics(UMLWidget::FontType fontType, TQPainter &painter);
|
|
|
|
/** Returns the font metric used by this object for Text which uses bold/italic fonts*/
|
|
TQFontMetrics &getFontMetrics(UMLWidget::FontType fontType);
|
|
/** set the font metric to use */
|
|
void setFontMetrics(UMLWidget::FontType fontType, TQFontMetrics fm);
|
|
void setupFontType(TQFont &font, UMLWidget::FontType fontType);
|
|
|
|
/**
|
|
* Initializes key attributes of the class.
|
|
*/
|
|
void init();
|
|
|
|
///////////////// Data Loaded/Saved /////////////////////////////////
|
|
|
|
/**
|
|
* This flag indicates if the UMLWidget uses the Diagram FillColour
|
|
*/
|
|
bool m_bUseFillColour;
|
|
|
|
/**
|
|
* true by default, false if the colours have
|
|
* been explicitly set for this widget
|
|
*/
|
|
bool m_bUsesDiagramFillColour;
|
|
bool m_bUsesDiagramUseFillColour;
|
|
|
|
/**
|
|
* Color of the background of the widget
|
|
*/
|
|
TQColor m_FillColour;
|
|
|
|
/**
|
|
* A list of AssociationWidgets between the UMLWidget and other UMLWidgets in the diagram
|
|
*/
|
|
AssociationWidgetList m_Assocs;
|
|
|
|
/**
|
|
* getName() returns the name from the UMLObject if this widget has an
|
|
* underlying UMLObject; if it does not, then getName() returns the local
|
|
* m_Text (notably the case for FloatingTextWidget.)
|
|
*/
|
|
TQString m_Text;
|
|
|
|
/**
|
|
* The font the widget will use.
|
|
*/
|
|
TQFont m_Font;
|
|
|
|
/**
|
|
* Holds whether this widget is a component instance (i.e. on a deployment diagram)
|
|
*/
|
|
bool m_bIsInstance;
|
|
|
|
/**
|
|
* The instance name (used if on a deployment diagram)
|
|
*/
|
|
TQString m_instanceName;
|
|
|
|
/**
|
|
* Should the stereotype be displayed
|
|
*/
|
|
bool m_bShowStereotype;
|
|
|
|
///////////////// End of Data Loaded/Saved //////////////////////////
|
|
|
|
bool m_bSelected, m_bStartMove;
|
|
|
|
int m_nPosX, m_origZ;
|
|
ListPopupMenu *m_pMenu;
|
|
UMLDoc *m_pDoc; ///< shortcut for UMLApp::app()->getDocument()
|
|
bool m_bResizable;
|
|
TQFontMetrics *m_pFontMetrics[FT_INVALID];
|
|
|
|
/**
|
|
* It is true if the Activate Function has been called for this
|
|
* class instance
|
|
*/
|
|
bool m_bActivated;
|
|
|
|
/**
|
|
* Change Widget Behaviour
|
|
*/
|
|
bool m_bIgnoreSnapToGrid;
|
|
bool m_bIgnoreSnapComponentSizeToGrid;
|
|
|
|
/**
|
|
* Controller for user interaction events.
|
|
*/
|
|
UMLWidgetController *m_widgetController;
|
|
|
|
public slots:
|
|
|
|
/**
|
|
* This slot is entered when an event has occurred on the views display,
|
|
* most likely a mouse event. Before it sends out that mouse event all
|
|
* tqchildren should make sure that they don't have a menu active or there
|
|
* could be more than one popup menu displayed.
|
|
*/
|
|
virtual void slotRemovePopupMenu();
|
|
|
|
/**
|
|
* When a widget changes this slot captures that signal.
|
|
*/
|
|
virtual void updateWidget();
|
|
|
|
|
|
/**
|
|
* Captures any popup menu signals for menus it created.
|
|
*
|
|
* @param sel The command which has to be executed.
|
|
*/
|
|
virtual void slotMenuSelection(int sel);
|
|
|
|
/**
|
|
* Captures when another widget moves if it is link to it that signal.
|
|
*
|
|
* @param id The id of object behind the widget.
|
|
*/
|
|
virtual void slotWidgetMoved(Uml::IDType id);
|
|
|
|
/**
|
|
* Captures a color change signal.
|
|
*
|
|
* @param viewID The id of the object behind the widget.
|
|
*/
|
|
virtual void slotColorChanged(Uml::IDType viewID);
|
|
|
|
/**
|
|
* Captures a linewidth change signal.
|
|
*
|
|
* @param viewID The id of the object behind the widget.
|
|
*/
|
|
virtual void slotLineWidthChanged(Uml::IDType viewID);
|
|
|
|
/**
|
|
* Captures a sigClearAllSelected signal sent by @ref UMLView
|
|
*/
|
|
void slotClearAllSelected();
|
|
|
|
/**
|
|
* Tells the widget to snap to grid.
|
|
* Will use the grid settings of the @ref UMLView it belongs to.
|
|
*/
|
|
void slotSnapToGrid();
|
|
|
|
signals:
|
|
/**
|
|
* Emit when the widget moves its' position.
|
|
*
|
|
* @param id The id of the object behind the widget.
|
|
*/
|
|
void sigWidgetMoved(Uml::IDType id);
|
|
};
|
|
|
|
#endif
|