/*************************************************************************** * * * 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-2006 * * Umbrello UML Modeller Authors * ***************************************************************************/ #ifndef LINEPATH_H #define LINEPATH_H #include #include #include #include #include #include #include "umlnamespace.h" /* how many pixels a user could click around a point */ #define POINT_DELTA 5 class AssociationWidget; class UMLView; // TQt forward declarations class TQDataStream; class TQDomDocument; class TQDomElement; // typedefs typedef TQPtrList LineList; typedef TQPtrListIterator LineListIt; typedef TQPtrList RectList; typedef TQPtrListIterator RectListIt; /** *@author Paul Hensgen * Bugs and comments to uml-devel@lists.sf.net or http://bugs.kde.org */ class LinePath : public TQObject { Q_OBJECT public: /** * Constructor */ LinePath(); /** * Deconstructor */ ~LinePath(); /** * equal to (==) operator */ bool operator==( LinePath & rhs ); /** * copy ( = ) operator */ LinePath & operator=( LinePath & rhs ); /** * Enum to tell whether the line docks top/bottom or left/right */ enum Region { TopBottom, LeftRight }; /** * Tell the line where the line docks */ void setDockRegion( Region region ); bool hasPoints (); void dumpPoints (); /** * Returns the point at the point index. */ TQPoint getPoint( int pointIndex ); /** * Sets the position of an already set point. */ bool setPoint( int pointIndex, const TQPoint &point ); /** * Checks, if we are at an end of the segment or somewhere in the middle. * We use the delta, because with the mouse it is hard to find the * exactly point. */ bool isPoint( int pointIndex, const TQPoint &point, unsigned short delta = 0 ); /** * Inserts a point at the given index. */ bool insertPoint( int pointIndex, const TQPoint &point ); /** * Removes the point on the line given by the index, at the coordinates * given by point with a fuzzy of delta */ bool removePoint( int pointIndex, const TQPoint &point, unsigned short delta = 0 ); /** * Sets the start and end points. */ bool setStartEndPoints( const TQPoint &start, const TQPoint &end ); /** * Returns the amount of POINTS on the line. * Includes start and end points. */ int count(); /** * Returns -1 if the given point is not on the line. * else returns the line segment the point is on. * Use the value to insert points at the point position. */ int onLinePath( const TQPoint &position ); /** * Sets the canvas to be used. */ void setCanvas( TQCanvas * canvas ); /** * Sets the Association type. */ void setAssocType( Uml::Association_Type type ); /** * Calls a group of methods to update the line. Used to save you calling multiple methods. */ void update(); /** * This will setup the class ready to display the line correctly. * This MUST be called before you can use this class. */ void setAssociation( AssociationWidget * association ); /** * Returns the Association this class is linked to. */ AssociationWidget * getAssociation() { return m_pAssociation; } /** * Sets the status of whether the line is selected or not. */ void setSelected( bool select ); void saveToXMI( TQDomDocument & qDoc, TQDomElement & qElement ); bool loadFromXMI( TQDomElement & qElement ); /** * Activates the line list. * This is needed because the m_pAssociation does not yet * exist at the time of the LinePath::loadFromXMI call. * However, this means that the points in the m_LineList * do not have a parent when they are loaded. * They need to be reparented by calling LinePath::activate() * once the m_pAssociation exists. */ void activate(); /** * Removes and item created that are no longer needed. */ void cleanup(); /** * Returns the type of pen to use depending on the type of Association. */ TQPen getPen(); /** * Sets the line color used by the line. */ void setLineColor( const TQColor &color ); /** * Sets the line width used by the line. */ void setLineWidth( uint width ); protected: /** * Draw a (hollow) circle. * We can't use TQCanvasEllipse directly for this because it doesn't * use the pen, i.e. TQCanvasEllipse only draws filled ellipses. */ class Circle : public TQCanvasEllipse { public: explicit Circle(TQCanvas * canvas, int radius = 0); void setRadius(int radius); int getRadius() const; void setX(int x); void setY(int y); /** * The beef: Override method from TQCanvasEllipse. */ void drawShape(TQPainter& p); }; /** * Returns the canvas being used. * Will return zero if the Association hasn't been set. * * This class doesn't hold this information but is a wrapper * method to stop calls to undefined variable like m_pAssociation. */ TQCanvas * getCanvas(); /** * Returns the Association type. * Returns Uml::at_Association if association hasn't been set. * * This class doesn't hold this information but is a wrapper * method to stop calls to undefined variable like m_pAssociation. */ Uml::Association_Type getAssocType(); /** * Returns the Line Color to use. * Returns black if association not set. * * This class doesn't hold this information but is a wrapper * method to stop calls to undefined variable like m_pAssociation. */ TQColor getLineColor(); /** * Returns the Line Width to use. * Returns 0 if association not set. * * This class doesn't hold this information but is a wrapper * method to stop calls to undefined variable like m_pAssociation. */ uint getLineWidth(); /** * Moves the selected canvas widgets. */ void moveSelected( int pointIndex ); /** * Sets up the selected canvases needed. */ void setupSelected(); /** * Calculates the head points. */ void calculateHead(); /** * Creates the head lines to display the head. */ void createHeadLines(); /** * Create a number of new lines and append them to the given list. * * @param list The list into which to append lines. * @param by The number of lines to insert into the given list. */ void growList(LineList &list, int by); /** * Updates the head lines. Call after calculating the new points. */ void updateHead(); /** * Creates the line objects to display the parallel line. */ void setupParallelLine(); /** * Calculates the position of the parallel line. */ void calculateParallelLine(); /** * Updates the parallel line. * Call after calculating the new position. */ void updateParallelLine(); /********Attributes*************/ /** * The association we are representing. */ AssociationWidget * m_pAssociation; /** * Contains all the lines of the association. */ LineList m_LineList; /** * Selected boxes list. */ RectList m_RectList; /** * Head lines. */ LineList m_HeadList; /** * The parallel line. */ LineList m_ParallelList; /** * Selected status. */ bool m_bSelected; /** * Contains calculated points used to draw the line head. */ TQPointArray m_PointArray; /** * Contains calculated points used to draw the line head. */ TQPoint m_ArrowPointA, m_ArrowPointB, m_MidPoint, m_EgdePoint; /** * A polygon object to blank out any lines we don't want to see. */ TQCanvasPolygon * m_pClearPoly; /** * The transparent circle required by containment associations. */ Circle * m_pCircle; /** * Contains the calculated points for the parallel line * on a collaboration message to use. */ TQPointArray m_ParallelLines; /** * Region where the line docks */ Region m_DockRegion; bool m_bHeadCreated; bool m_bParallelLineCreated; public slots: /** * Sets the line color used by the line. * * @param viewID The id of the object behind the widget. */ void slotLineColorChanged( Uml::IDType viewID ); /** * Sets the line width used by the line. * * @param viewID The id of the object behind the widget. */ void slotLineWidthChanged( Uml::IDType viewID ); }; #endif