00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef CANVAsmANIPULATOR_H
00012 #define CANVAsmANIPULATOR_H
00013
00014 #include "eventinfo.h"
00015
00016 #include <qcanvas.h>
00017 #include <qguardedptr.h>
00018
00019 class CanvasManipulator;
00020 class Connector;
00021 class CMManager;
00022 class CNItem;
00023 class CNItemGroup;
00024 class EventInfo;
00025 class FlowContainer;
00026 class ICNDocument;
00027 class Item;
00028 class ItemDocument;
00029 class ItemGroup;
00030 class ItemView;
00031 class ManipulatorInfo;
00032 class ManualConnectorDraw;
00033 class MechanicsItem;
00034 class MechanicsGroup;
00035 class MechanicsDocument;
00036 class Node;
00037 class NodeGroup;
00038 class ResizeHandle;
00039
00040 class QCanvas;
00041 class QCanvasItem;
00042 class QCanvasLine;
00043 class QCanvasRectangle;
00044 class QMouseEvent;
00045 class QTimer;
00046 class QWheelEvent;
00047
00048 typedef CanvasManipulator*(*CreateManipulatorPtr)( ItemDocument *, CMManager * );
00049 typedef bool(*AcceptManipulationPtr)( uint eventState, uint cmState, uint itemType, uint cnItemType );
00050 typedef QValueList<NodeGroup*> NodeGroupList;
00051 typedef QValueList<QGuardedPtr<Connector> > ConnectorList;
00052 typedef QValueList<QPoint> QPointList;
00053
00054 class ManipulatorInfo
00055 {
00056 public:
00057 ManipulatorInfo();
00058 AcceptManipulationPtr m_acceptManipulationPtr;
00059 CreateManipulatorPtr m_createManipulatorPtr;
00060 };
00061 typedef QValueList<ManipulatorInfo*> ManipulatorInfoList;
00062
00063
00068 class CMManager : public QObject
00069 {
00070 Q_OBJECT
00071 public:
00072 enum EventState
00073 {
00074 es_right_click = 1 << 0,
00075 es_ctrl_pressed = 1 << 1
00076 };
00077 enum CMState
00078 {
00079 cms_repeated_add = 1 << 0,
00080 cms_manual_route = 1 << 1,
00081 cms_draw = 1 << 2
00082 };
00083 enum ItemType
00084 {
00085 it_none = 1 << 0,
00086 it_node = 1 << 1,
00087 it_connector = 1 << 2,
00088 it_pin = 1 << 3,
00089 it_canvas_item = 1 << 4,
00090 it_mechanics_item = 1 << 5,
00091 it_resize_handle = 1 << 6,
00092 it_drawpart = 1 << 7
00093 };
00094 enum ItemStateInfo
00095 {
00096 isi_isMovable = 0x2,
00097 };
00098 CMManager( ItemDocument *itemDocument );
00099 ~CMManager();
00103 void mousePressEvent( EventInfo eventInfo );
00107 void mouseReleaseEvent( const EventInfo &eventInfo );
00111 void mouseDoubleClickEvent( const EventInfo &eventInfo );
00115 void mouseMoveEvent( const EventInfo &eventInfo );
00119 void wheelEvent( const EventInfo &eventInfo );
00123 void setCMState( CMState type, bool state );
00127 void cancelCurrentManipulation();
00128 CanvasManipulator * currentManipulator() const { return m_canvasManipulator; }
00129 void setRepeatedAddId( const QString & repeatedId = QString::null );
00130 uint cmState() const { return m_cmState; }
00131 void addManipulatorInfo( ManipulatorInfo *info );
00132 QString repeatedItemId() const { return m_repeatedItemId; }
00133 void setDrawAction( int drawAction );
00134 int drawAction() const { return m_drawAction; }
00135
00136 public slots:
00137 void slotSetManualRoute( bool manualRoute );
00138
00139 signals:
00140 void manualRoutingChanged( bool manualRouting );
00141
00142 protected:
00148 void updateCurrentResizeHandle( ResizeHandle * mouseOver );
00149 CanvasManipulator *m_canvasManipulator;
00150 uint m_cmState;
00151 QString m_repeatedItemId;
00152 ItemDocument *p_itemDocument;
00153 ManipulatorInfoList m_manipulatorInfoList;
00154 QGuardedPtr<Item> p_lastMouseOverItem;
00155 QGuardedPtr<ResizeHandle> p_lastMouseOverResizeHandle;
00156 QGuardedPtr<Item> p_lastItemClicked;
00157 QTimer *m_allowItemScrollTmr;
00158 bool b_allowItemScroll;
00159 int m_drawAction;
00160
00161 private slots:
00162 void slotAllowItemScroll() { b_allowItemScroll = true; }
00163 };
00164
00169 class CanvasManipulator
00170 {
00171 public:
00172 CanvasManipulator( ItemDocument *itemDocument, CMManager *cmManager );
00173 virtual ~CanvasManipulator();
00174 enum Type
00175 {
00176 RepeatedItemAdd,
00177 RightClick,
00178 AutoConnector,
00179 ManualConnector,
00180 ItemMove,
00181 ItemResize,
00182 MechItemMove,
00183 Select,
00184 CanvasResize,
00185 ItemDrag,
00186 Draw
00187 };
00188 virtual Type type() const = 0;
00193 virtual bool mousePressedInitial( const EventInfo & ) { return false; }
00199 virtual bool mousePressedRepeat( const EventInfo & ) { return false; };
00204 virtual bool mouseMoved( const EventInfo & ) { return false; };
00209 virtual bool mouseReleased( const EventInfo & ) { return true; }
00210
00211 protected:
00212 Type m_type;
00213 EventInfo m_eventInfo;
00214 QPoint m_prevPos;
00215 ItemDocument *p_itemDocument;
00216 ICNDocument *p_icnDocument;
00217 MechanicsDocument *p_mechanicsDocument;
00218 QCanvas *p_canvas;
00219 ItemGroup *p_selectList;
00220 CNItemGroup *p_cnItemSelectList;
00221 MechanicsGroup *p_mechItemSelectList;
00222 CNItem *p_cnItemClickedOn;
00223 MechanicsItem *p_mechanicsItemClickedOn;
00224 CMManager *p_cmManager;
00225 };
00226
00230 class CMRepeatedItemAdd : public CanvasManipulator
00231 {
00232 public:
00233 CMRepeatedItemAdd( ItemDocument *itemDocument, CMManager *cmManager );
00234 virtual ~CMRepeatedItemAdd();
00235 virtual Type type() const { return RepeatedItemAdd; }
00236
00237 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00238 static ManipulatorInfo *manipulatorInfo();
00239 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00240
00241 virtual bool mousePressedInitial( const EventInfo &info );
00242 virtual bool mousePressedRepeat( const EventInfo &info );
00243 virtual bool mouseMoved( const EventInfo &info );
00244 virtual bool mouseReleased( const EventInfo &info );
00245
00246 protected:
00247 };
00248
00252 class CMRightClick : public CanvasManipulator
00253 {
00254 public:
00255 CMRightClick( ItemDocument *itemDocument, CMManager *cmManager );
00256 virtual ~CMRightClick();
00257 virtual Type type() const { return RightClick; }
00258
00259 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00260 static ManipulatorInfo *manipulatorInfo();
00261 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00262
00263 virtual bool mousePressedInitial( const EventInfo &info );
00264 virtual bool mouseMoved( const EventInfo &info );
00265 virtual bool mouseReleased( const EventInfo &info );
00266
00267 protected:
00268 };
00269
00270
00274 class ConnectorDraw : public CanvasManipulator
00275 {
00276 public:
00277 ConnectorDraw( ItemDocument *itemDocument, CMManager *cmManager );
00278 virtual ~ConnectorDraw();
00279
00284 static QColor validConnectionColor();
00285
00286 protected:
00291 Connector * toConnector( Node * node );
00299 void grabEndStuff( QCanvasItem * endItem, const QPoint & pos, bool posIsExact );
00304 QPoint toValidPos( const QPoint & clickPos, Connector * clickedConnector ) const;
00305
00306 QGuardedPtr<Node> p_startNode;
00307 QGuardedPtr<Connector> p_startConnector;
00308 Node * p_endNode;
00309 Connector * p_endConnector;
00310 QPoint startConnectorPoint;
00311 };
00312
00316 class CMAutoConnector : public ConnectorDraw
00317 {
00318 public:
00319 CMAutoConnector( ItemDocument *itemDocument, CMManager *cmManager );
00320 virtual ~CMAutoConnector();
00321 virtual Type type() const { return AutoConnector; }
00322
00323 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00324 static ManipulatorInfo *manipulatorInfo();
00325 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00326
00327 virtual bool mousePressedInitial( const EventInfo &info );
00328 virtual bool mouseMoved( const EventInfo &info );
00329 virtual bool mouseReleased( const EventInfo &info );
00330
00331 protected:
00332 QCanvasLine *m_connectorLine;
00333 };
00334
00338 class CMManualConnector : public ConnectorDraw
00339 {
00340 public:
00341 CMManualConnector( ItemDocument *itemDocument, CMManager *cmManager );
00342 virtual ~CMManualConnector();
00343 virtual Type type() const { return ManualConnector; }
00344
00345 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00346 static ManipulatorInfo *manipulatorInfo();
00347 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00348
00349 virtual bool mousePressedInitial( const EventInfo &info );
00350 virtual bool mousePressedRepeat( const EventInfo &info );
00351 virtual bool mouseMoved( const EventInfo &info );
00352 virtual bool mouseReleased( const EventInfo &info );
00353
00354 protected:
00355 ConnectorList m_fixedRouteConnectors;
00356 ManualConnectorDraw *m_manualConnectorDraw;
00357 };
00358
00362 class CMItemMove : public CanvasManipulator
00363 {
00364 public:
00365 CMItemMove( ItemDocument *itemDocument, CMManager *cmManager );
00366 virtual ~CMItemMove();
00367 virtual Type type() const { return ItemMove; }
00368
00369 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00370 static ManipulatorInfo *manipulatorInfo();
00371 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00372
00373 virtual bool mousePressedInitial( const EventInfo &info );
00374 virtual bool mouseMoved( const EventInfo &info );
00375 virtual bool mouseReleased( const EventInfo &info );
00376
00377 protected:
00378 ConnectorList m_translatableConnectors;
00379 NodeGroupList m_translatableNodeGroups;
00380 FlowContainer *p_flowContainerCandidate;
00381 };
00382
00386 class CMItemResize : public CanvasManipulator
00387 {
00388 public:
00389 CMItemResize( ItemDocument *itemDocument, CMManager *cmManager );
00390 virtual ~CMItemResize();
00391 virtual Type type() const { return ItemResize; }
00392
00393 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00394 static ManipulatorInfo *manipulatorInfo();
00395 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00396
00397 virtual bool mousePressedInitial( const EventInfo &info );
00398 virtual bool mouseMoved( const EventInfo &info );
00399 virtual bool mouseReleased( const EventInfo &info );
00400
00401 protected:
00402 ResizeHandle *p_resizeHandle;
00403 double m_rh_dx;
00404 double m_rh_dy;
00405 };
00406
00410 class CMMechItemMove : public CanvasManipulator
00411 {
00412 public:
00413 CMMechItemMove( ItemDocument *itemDocument, CMManager *cmManager );
00414 virtual ~CMMechItemMove();
00415 virtual Type type() const { return MechItemMove; }
00416
00417 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00418 static ManipulatorInfo *manipulatorInfo();
00419 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00420
00421 virtual bool mousePressedInitial( const EventInfo &info );
00422 virtual bool mouseMoved( const EventInfo &info );
00423 virtual bool mouseReleased( const EventInfo &info );
00424
00425 protected:
00426 uint m_prevClickedOnSM;
00427 };
00428
00429
00433 class SelectRectangle
00434 {
00435 public:
00436 SelectRectangle( int x, int y, int w, int h, QCanvas *qcanvas );
00437 ~SelectRectangle();
00438
00439 void setSize( int w, int h );
00440 QCanvasItemList collisions();
00441
00442 protected:
00443 QCanvasLine *m_topLine;
00444 QCanvasLine *m_rightLine;
00445 QCanvasLine *m_bottomLine;
00446 QCanvasLine *m_leftLine;
00447 const int m_x;
00448 const int m_y;
00449 int m_w;
00450 int m_h;
00451 int m_prevCollisions_w;
00452 int m_prevCollisions_h;
00453 QCanvasItemList m_prevCollisions;
00454 };
00455
00459 class CMSelect : public CanvasManipulator
00460 {
00461 public:
00462 CMSelect( ItemDocument *itemDocument, CMManager *cmManager );
00463 virtual ~CMSelect();
00464 virtual Type type() const { return Select; }
00465
00466 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00467 static ManipulatorInfo *manipulatorInfo();
00468 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00469
00470 virtual bool mousePressedInitial( const EventInfo &info );
00471 virtual bool mouseMoved( const EventInfo &info );
00472 virtual bool mouseReleased( const EventInfo &info );
00473
00474 protected:
00475 SelectRectangle *m_selectRectangle;
00476 };
00477
00481 class CMItemDrag : public CanvasManipulator
00482 {
00483 public:
00484 CMItemDrag( ItemDocument *itemDocument, CMManager *cmManager );
00485 virtual ~CMItemDrag();
00486 virtual Type type() const { return ItemDrag; }
00487
00488 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00489 static ManipulatorInfo *manipulatorInfo();
00490 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00491
00492 virtual bool mousePressedInitial( const EventInfo &info );
00493 virtual bool mouseMoved( const EventInfo &info );
00494 virtual bool mouseReleased( const EventInfo &info );
00495
00496 protected:
00497 bool b_dragged;
00498 };
00499
00504 class CanvasEllipseDraw : public QCanvasEllipse
00505 {
00506 public:
00507 CanvasEllipseDraw( int x, int y, QCanvas * canvas );
00508
00509 protected:
00510 virtual void drawShape( QPainter & p );
00511 };
00512
00516 class CMDraw : public CanvasManipulator
00517 {
00518 public:
00519 CMDraw( ItemDocument *itemDocument, CMManager *cmManager );
00520 virtual ~CMDraw();
00521 virtual Type type() const { return Draw; }
00522
00523 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00524 static ManipulatorInfo *manipulatorInfo();
00525 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00526
00527 virtual bool mousePressedInitial( const EventInfo &info );
00528 virtual bool mouseMoved( const EventInfo &info );
00529 virtual bool mouseReleased( const EventInfo &info );
00530
00531 protected:
00532 QCanvasRectangle * m_pDrawRectangle;
00533 CanvasEllipseDraw * m_pDrawEllipse;
00534 QCanvasLine * m_pDrawLine;
00535 };
00536
00540 class ManualConnectorDraw
00541 {
00542 public:
00543 ManualConnectorDraw( ICNDocument *_icnDocument, const QPoint &initialPos );
00544 virtual ~ManualConnectorDraw();
00545
00550 void mouseMoved( const QPoint &pos );
00556 QCanvasItem * mouseClicked( const QPoint &pos );
00560 QPointList pointList();
00564 void setColor( const QColor & color );
00565
00566 protected:
00567 void updateConnectorEnds();
00568
00569 QValueList<QCanvasLine*> m_connectorLines;
00570 ICNDocument *icnDocument;
00571
00572 bool b_currentVertical;
00573 bool b_orientationDefined;
00574
00575 QPoint m_initialPos;
00576 QPoint m_previousPos;
00577 QPoint m_currentPos;
00578
00579 QCanvasLine *m_currentCon;
00580 QCanvasLine *m_previousCon;
00581
00582
00583 QCanvasItem *p_initialItem;
00584
00585 QColor m_color;
00586 };
00587
00588 #endif