]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/ogl/src/basic.h
Various fixes.
[wxWidgets.git] / utils / ogl / src / basic.h
index ad433d4bcab44a812a279ac08171df94f12a0f7d..8374b2c345c8c76208e857a2cf94ce7422555702 100644 (file)
 
 #define OP_ALL (OP_CLICK_LEFT | OP_CLICK_RIGHT | OP_DRAG_LEFT | OP_DRAG_RIGHT)
 
+// Attachment modes
+#define ATTACHMENT_MODE_NONE        0
+#define ATTACHMENT_MODE_EDGE        1
+#define ATTACHMENT_MODE_BRANCHING   2
+
+// Sub-modes for branching attachment mode
+#define BRANCHING_ATTACHMENT_NORMAL 1
+#define BRANCHING_ATTACHMENT_BLOB   2
+
 class wxShapeTextLine;
 class wxShapeCanvas;
 class wxLineShape;
@@ -102,10 +111,13 @@ class wxShapeRegion;
 class wxShape;
 
 #ifdef PROLOGIO
-class wxExpr;
-class wxDatabase;
+class WXDLLEXPORT wxExpr;
+class WXDLLEXPORT wxExprDatabase;
 #endif
 
+// Round up
+#define WXROUND(x) ( (long) (x + 0.5) )
+
 class wxShapeEvtHandler: public wxObject
 {
  DECLARE_DYNAMIC_CLASS(wxShapeEvtHandler)
@@ -114,36 +126,57 @@ class wxShapeEvtHandler: public wxObject
   wxShapeEvtHandler(wxShapeEvtHandler *prev = NULL, wxShape *shape = NULL);
   virtual ~wxShapeEvtHandler();
 
-  inline void SetHandlerShape(wxShape *sh) { m_handlerShape = sh; }
+  inline void SetShape(wxShape *sh) { m_handlerShape = sh; }
   inline wxShape *GetShape() const { return m_handlerShape; }
 
+  inline void SetPreviousHandler(wxShapeEvtHandler* handler) { m_previousHandler = handler; }
+  inline wxShapeEvtHandler* GetPreviousHandler() const { return m_previousHandler; }
+
   // This is called when the _shape_ is deleted.
   virtual void OnDelete();
   virtual void OnDraw(wxDC& dc);
   virtual void OnDrawContents(wxDC& dc);
+  virtual void OnDrawBranches(wxDC& dc, bool erase = FALSE);
   virtual void OnMoveLinks(wxDC& dc);
   virtual void OnErase(wxDC& dc);
   virtual void OnEraseContents(wxDC& dc);
   virtual void OnHighlight(wxDC& dc);
-  virtual void OnLeftClick(float x, float y, int keys = 0, int attachment = 0);
-  virtual void OnRightClick(float x, float y, int keys = 0, int attachment = 0);
-  virtual void OnSize(float x, float y);
-  virtual bool OnMovePre(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
-  virtual void OnMovePost(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
-
-  virtual void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
-  virtual void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
-  virtual void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
-  virtual void OnDragRight(bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
-  virtual void OnBeginDragRight(float x, float y, int keys=0, int attachment = 0);
-  virtual void OnEndDragRight(float x, float y, int keys=0, int attachment = 0);
-  virtual void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
+  virtual void OnLeftClick(double x, double y, int keys = 0, int attachment = 0);
+  virtual void OnLeftDoubleClick(double x, double y, int keys = 0, int attachment = 0);
+  virtual void OnRightClick(double x, double y, int keys = 0, int attachment = 0);
+  virtual void OnSize(double x, double y);
+  virtual bool OnMovePre(wxDC& dc, double x, double y, double old_x, double old_y, bool display = TRUE);
+  virtual void OnMovePost(wxDC& dc, double x, double y, double old_x, double old_y, bool display = TRUE);
+
+  virtual void OnDragLeft(bool draw, double x, double y, int keys=0, int attachment = 0); // Erase if draw false
+  virtual void OnBeginDragLeft(double x, double y, int keys=0, int attachment = 0);
+  virtual void OnEndDragLeft(double x, double y, int keys=0, int attachment = 0);
+  virtual void OnDragRight(bool draw, double x, double y, int keys=0, int attachment = 0); // Erase if draw false
+  virtual void OnBeginDragRight(double x, double y, int keys=0, int attachment = 0);
+  virtual void OnEndDragRight(double x, double y, int keys=0, int attachment = 0);
+  virtual void OnDrawOutline(wxDC& dc, double x, double y, double w, double h);
   virtual void OnDrawControlPoints(wxDC& dc);
   virtual void OnEraseControlPoints(wxDC& dc);
   virtual void OnMoveLink(wxDC& dc, bool moveControlPoints = TRUE);
 
-  virtual void OnBeginSize(float WXUNUSED(w), float WXUNUSED(h)) { }
-  virtual void OnEndSize(float WXUNUSED(w), float WXUNUSED(h)) { }
+  // Control points ('handles') redirect control to the actual shape, to make it easier
+  // to override sizing behaviour.
+  virtual void OnSizingDragLeft(wxControlPoint* pt, bool draw, double x, double y, int keys=0, int attachment = 0); // Erase if draw false
+  virtual void OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int keys=0, int attachment = 0);
+  virtual void OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, int keys=0, int attachment = 0);
+
+  virtual void OnBeginSize(double WXUNUSED(w), double WXUNUSED(h)) { }
+  virtual void OnEndSize(double WXUNUSED(w), double WXUNUSED(h)) { }
+
+  // Can override this to prevent or intercept line reordering.
+  virtual void OnChangeAttachment(int attachment, wxLineShape* line, wxList& ordering);
+
+  // Creates a copy of this event handler.
+  wxShapeEvtHandler *CreateNewCopy();
+
+  // Does the copy - override for new event handlers which might store
+  // app-specific data.
+  virtual void CopyData(wxShapeEvtHandler& copy) {};
 
  private:
   wxShapeEvtHandler*    m_previousHandler;
@@ -158,21 +191,21 @@ class wxShape: public wxShapeEvtHandler
 
   wxShape(wxShapeCanvas *can = NULL);
   virtual ~wxShape();
-  virtual void GetBoundingBoxMax(float *width, float *height);
-  virtual void GetBoundingBoxMin(float *width, float *height) = 0;
-  virtual bool GetPerimeterPoint(float x1, float y1,
-                                 float x2, float y2,
-                                 float *x3, float *y3);
+  virtual void GetBoundingBoxMax(double *width, double *height);
+  virtual void GetBoundingBoxMin(double *width, double *height) = 0;
+  virtual bool GetPerimeterPoint(double x1, double y1,
+                                 double x2, double y2,
+                                 double *x3, double *y3);
   inline wxShapeCanvas *GetCanvas() { return m_canvas; }
   void SetCanvas(wxShapeCanvas *the_canvas);
   virtual void AddToCanvas(wxShapeCanvas *the_canvas, wxShape *addAfter = NULL);
   virtual void InsertInCanvas(wxShapeCanvas *the_canvas);
 
   virtual void RemoveFromCanvas(wxShapeCanvas *the_canvas);
-  inline float GetX() const { return m_xpos; }
-  inline float GetY() const { return m_ypos; }
-  inline void SetX(float x) { m_xpos = x; }
-  inline void SetY(float y) { m_ypos = y; }
+  inline double GetX() const { return m_xpos; }
+  inline double GetY() const { return m_ypos; }
+  inline void SetX(double x) { m_xpos = x; }
+  inline void SetY(double y) { m_ypos = y; }
 
   inline wxShape *GetParent() const { return m_parent; }
   inline void SetParent(wxShape *p) { m_parent = p; }
@@ -188,24 +221,31 @@ class wxShape: public wxShapeEvtHandler
   virtual void OnErase(wxDC& dc);
   virtual void OnEraseContents(wxDC& dc);
   virtual void OnHighlight(wxDC& dc);
-  virtual void OnLeftClick(float x, float y, int keys = 0, int attachment = 0);
-  virtual void OnRightClick(float x, float y, int keys = 0, int attachment = 0);
-  virtual void OnSize(float x, float y);
-  virtual bool OnMovePre(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
-  virtual void OnMovePost(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
-
-  virtual void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
-  virtual void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
-  virtual void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
-  virtual void OnDragRight(bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
-  virtual void OnBeginDragRight(float x, float y, int keys=0, int attachment = 0);
-  virtual void OnEndDragRight(float x, float y, int keys=0, int attachment = 0);
-  virtual void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
+  virtual void OnLeftClick(double x, double y, int keys = 0, int attachment = 0);
+  virtual void OnLeftDoubleClick(double x, double y, int keys = 0, int attachment = 0) {}
+  virtual void OnRightClick(double x, double y, int keys = 0, int attachment = 0);
+  virtual void OnSize(double x, double y);
+  virtual bool OnMovePre(wxDC& dc, double x, double y, double old_x, double old_y, bool display = TRUE);
+  virtual void OnMovePost(wxDC& dc, double x, double y, double old_x, double old_y, bool display = TRUE);
+
+  virtual void OnDragLeft(bool draw, double x, double y, int keys=0, int attachment = 0); // Erase if draw false
+  virtual void OnBeginDragLeft(double x, double y, int keys=0, int attachment = 0);
+  virtual void OnEndDragLeft(double x, double y, int keys=0, int attachment = 0);
+  virtual void OnDragRight(bool draw, double x, double y, int keys=0, int attachment = 0); // Erase if draw false
+  virtual void OnBeginDragRight(double x, double y, int keys=0, int attachment = 0);
+  virtual void OnEndDragRight(double x, double y, int keys=0, int attachment = 0);
+  virtual void OnDrawOutline(wxDC& dc, double x, double y, double w, double h);
   virtual void OnDrawControlPoints(wxDC& dc);
   virtual void OnEraseControlPoints(wxDC& dc);
 
-  virtual void OnBeginSize(float WXUNUSED(w), float WXUNUSED(h)) { }
-  virtual void OnEndSize(float WXUNUSED(w), float WXUNUSED(h)) { }
+  virtual void OnBeginSize(double WXUNUSED(w), double WXUNUSED(h)) { }
+  virtual void OnEndSize(double WXUNUSED(w), double WXUNUSED(h)) { }
+
+  // Control points ('handles') redirect control to the actual shape, to make it easier
+  // to override sizing behaviour.
+  virtual void OnSizingDragLeft(wxControlPoint* pt, bool draw, double x, double y, int keys=0, int attachment = 0); // Erase if draw false
+  virtual void OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int keys=0, int attachment = 0);
+  virtual void OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, int keys=0, int attachment = 0);
 
   virtual void MakeControlPoints();
   virtual void DeleteControlPoints(wxDC *dc = NULL);
@@ -238,14 +278,16 @@ class wxShape: public wxShapeEvtHandler
   inline  bool GetSpaceAttachments() const { return m_spaceAttachments; };
   void SetShadowMode(int mode, bool redraw = FALSE);
   inline int GetShadowMode() const { return m_shadowMode; }
-  virtual bool HitTest(float x, float y, int *attachment, float *distance);
+  virtual bool HitTest(double x, double y, int *attachment, double *distance);
   inline void SetCentreResize(bool cr) { m_centreResize = cr; }
   inline bool GetCentreResize() const { return m_centreResize; }
-  inline wxList& GetLines() { return m_lines; }
+  inline void SetMaintainAspectRatio(bool ar) { m_maintainAspectRatio = ar; }
+  inline bool GetMaintainAspectRatio() const { return m_maintainAspectRatio; }
+  inline wxList& GetLines() const { return (wxList&) m_lines; }
   inline void SetDisableLabel(bool flag) { m_disableLabel = flag; }
   inline bool GetDisableLabel() const { return m_disableLabel; }
-  inline void SetAttachmentMode(bool flag) { m_attachmentMode = flag; }
-  inline bool GetAttachmentMode() const { return m_attachmentMode; }
+  inline void SetAttachmentMode(int mode) { m_attachmentMode = mode; }
+  inline int GetAttachmentMode() const { return m_attachmentMode; }
   inline void SetId(long i) { m_id = i; }
   inline long GetId() const { return m_id; }
 
@@ -256,22 +298,28 @@ class wxShape: public wxShapeEvtHandler
 
   virtual void Show(bool show);
   virtual bool IsShown() const { return m_visible; }
-  virtual void Move(wxDC& dc, float x1, float y1, bool display = TRUE);
+  virtual void Move(wxDC& dc, double x1, double y1, bool display = TRUE);
   virtual void Erase(wxDC& dc);
   virtual void EraseContents(wxDC& dc);
   virtual void Draw(wxDC& dc);
   virtual void Flash();
   virtual void MoveLinks(wxDC& dc);
   virtual void DrawContents(wxDC& dc);  // E.g. for drawing text label
-  virtual void SetSize(float x, float y, bool recursive = TRUE);
-  virtual void SetAttachmentSize(float x, float y);
+  virtual void SetSize(double x, double y, bool recursive = TRUE);
+  virtual void SetAttachmentSize(double x, double y);
   void Attach(wxShapeCanvas *can);
   void Detach();
 
   inline virtual bool Constrain() { return FALSE; } ;
 
   void AddLine(wxLineShape *line, wxShape *other,
-               int attachFrom = 0, int attachTo = 0);
+               int attachFrom = 0, int attachTo = 0,
+               // The line ordering
+               int positionFrom = -1, int positionTo = -1);
+
+  // Return the zero-based position in m_lines of line.
+  int GetLinePosition(wxLineShape* line);
+
   void AddText(const wxString& string);
 
   inline wxPen *GetPen() const { return m_pen; }
@@ -309,7 +357,7 @@ class wxShape: public wxShapeEvtHandler
   virtual void NameRegions(const wxString& parentName = "");
 
   // Get list of regions
-  inline wxList& GetRegions() { return m_regions; }
+  inline wxList& GetRegions() const { return (wxList&) m_regions; }
 
   virtual void AddRegion(wxShapeRegion *region);
 
@@ -330,10 +378,9 @@ class wxShape: public wxShapeEvtHandler
   void RemoveLine(wxLineShape *line);
 
 #ifdef PROLOGIO
-  // Prolog database stuff
-  virtual char *GetFunctor();
-  virtual void WritePrologAttributes(wxExpr *clause);
-  virtual void ReadPrologAttributes(wxExpr *clause);
+  // I/O
+  virtual void WriteAttributes(wxExpr *clause);
+  virtual void ReadAttributes(wxExpr *clause);
 
   // In case the object has constraints it needs to read in in a different pass
   inline virtual void ReadConstraints(wxExpr *WXUNUSED(clause), wxExprDatabase *WXUNUSED(database)) { };
@@ -341,26 +388,97 @@ class wxShape: public wxShapeEvtHandler
   virtual void ReadRegions(wxExpr *clause);
 #endif
 
-  // Does the WHOLE copy calling PrivateCopy - don't redefine.
-  // If canvas is non-null, set the canvas too.
-  wxShape *CreateNewCopy(wxShapeCanvas *theCanvas = NULL);
-
   // Attachment code
-  virtual bool GetAttachmentPosition(int attachment, float *x, float *y,
+  virtual bool GetAttachmentPosition(int attachment, double *x, double *y,
+                                     int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
+  virtual int GetNumberOfAttachments() const;
+  virtual bool AttachmentIsValid(int attachment) const;
+
+  // Only get the attachment position at the _edge_ of the shape, ignoring
+  // branching mode. This is used e.g. to indicate the edge of interest, not the point
+  // on the attachment branch.
+  virtual bool GetAttachmentPositionEdge(int attachment, double *x, double *y,
                                      int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
-  virtual int GetNumberOfAttachments();
-  virtual bool AttachmentIsValid(int attachment);
+
+  // Assuming the attachment lies along a vertical or horizontal line,
+  // calculate the position on that point.
+  virtual wxRealPoint CalcSimpleAttachment(const wxRealPoint& pt1, const wxRealPoint& pt2,
+    int nth, int noArcs, wxLineShape* line);
+
+  // Returns TRUE if pt1 <= pt2 in the sense that one point comes before another on an
+  // edge of the shape.
+  // attachmentPoint is the attachment point (= side) in question.
+  virtual bool AttachmentSortTest(int attachmentPoint, const wxRealPoint& pt1, const wxRealPoint& pt2);
 
   virtual void EraseLinks(wxDC& dc, int attachment = -1, bool recurse = FALSE);
   virtual void DrawLinks(wxDC& dc, int attachment = -1, bool recurse = FALSE);
 
-  virtual void MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
-                                       float x, float y);
+  virtual bool MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
+                                       double x, double y);
 
   // Reorders the lines coming into the node image at this attachment
   // position, in the order in which they appear in linesToSort.
   virtual void SortLines(int attachment, wxList& linesToSort);
 
+  // Apply an attachment ordering change
+  void ApplyAttachmentOrdering(wxList& ordering);
+
+  // Can override this to prevent or intercept line reordering.
+  virtual void OnChangeAttachment(int attachment, wxLineShape* line, wxList& ordering);
+
+  //// New banching attachment code, 24/9/98
+
+  //
+  //             |________|
+  //                 | <- root
+  //                 | <- neck
+  // shoulder1 ->---------<- shoulder2
+  //             | | | | |<- stem
+  //                      <- branching attachment point N-1
+
+  // This function gets the root point at the given attachment.
+  virtual wxRealPoint GetBranchingAttachmentRoot(int attachment);
+
+  // This function gets information about where branching connections go (calls GetBranchingAttachmentRoot)
+  virtual bool GetBranchingAttachmentInfo(int attachment, wxRealPoint& root, wxRealPoint& neck,
+    wxRealPoint& shoulder1, wxRealPoint& shoulder2);
+
+  // n is the number of the adjoining line, from 0 to N-1 where N is the number of lines
+  // at this attachment point.
+  // attachmentPoint is where the arc meets the stem, and stemPoint is where the stem meets the
+  // shoulder.
+  virtual bool GetBranchingAttachmentPoint(int attachment, int n, wxRealPoint& attachmentPoint,
+    wxRealPoint& stemPoint);
+
+  // Get the number of lines at this attachment position.
+  virtual int GetAttachmentLineCount(int attachment) const;
+
+  // Draw the branches (not the actual arcs though)
+  virtual void OnDrawBranches(wxDC& dc, int attachment, bool erase = FALSE);
+  virtual void OnDrawBranches(wxDC& dc, bool erase = FALSE);
+
+  // Branching attachment settings
+  inline void SetBranchNeckLength(int len) { m_branchNeckLength = len; }
+  inline int GetBranchNeckLength() const { return m_branchNeckLength; }
+
+  inline void SetBranchStemLength(int len) { m_branchStemLength = len; }
+  inline int GetBranchStemLength() const { return m_branchStemLength; }
+
+  inline void SetBranchSpacing(int len) { m_branchSpacing = len; }
+  inline int GetBranchSpacing() const { return m_branchSpacing; }
+
+  // Further detail on branching style, e.g. blobs on interconnections
+  inline void SetBranchStyle(long style) { m_branchStyle = style; }
+  inline long GetBranchStyle() const { return m_branchStyle; }
+
+  // Rotate the standard attachment point from physical (0 is always North)
+  // to logical (0 -> 1 if rotated by 90 degrees)
+  virtual int PhysicalToLogicalAttachment(int physicalAttachment) const;
+
+  // Rotate the standard attachment point from logical
+  // to physical (0 is always North)
+  virtual int LogicalToPhysicalAttachment(int logicalAttachment) const;
+
   // This is really to distinguish between lines and other images.
   // For lines, want to pass drag to canvas, since lines tend to prevent
   // dragging on a canvas (they get in the way.)
@@ -369,17 +487,19 @@ class wxShape: public wxShapeEvtHandler
   // Returns TRUE if image is a descendant of this image
   bool HasDescendant(wxShape *image);
 
+  // Creates a copy of this shape.
+  wxShape *CreateNewCopy(bool resetMapping = TRUE, bool recompute = TRUE);
+
   // Does the copying for this object
-  void Copy(wxShape& copy);
-  // Returns a new instance, and does the copy for this class. Define for each class.
-  virtual wxShape *PrivateCopy() = 0;
+  virtual void Copy(wxShape& copy);
 
-  // Rotate about the given axis by the given amount in radians
-  // (does nothing for most objects)
-  // But even non-rotating objects should record their notional
-  // rotation in case it's important (e.g. in dog-leg code).
-  virtual inline void Rotate(float WXUNUSED(x), float WXUNUSED(y), float theta) { m_rotation = theta; }
-  virtual inline float GetRotation() const { return m_rotation; }
+  // Does the copying for this object, including copying event
+  // handler data if any. Calls the virtual Copy function.
+  void CopyWithHandler(wxShape& copy);
+
+  // Rotate about the given axis by the given amount in radians.
+  virtual void Rotate(double x, double y, double theta);
+  virtual inline double GetRotation() const { return m_rotation; }
 
   void ClearAttachments();
 
@@ -395,7 +515,7 @@ class wxShape: public wxShapeEvtHandler
  protected:
   wxShapeEvtHandler*    m_eventHandler;
   bool                  m_formatted;
-  float                 m_xpos, m_ypos;
+  double                m_xpos, m_ypos;
   wxPen*                m_pen;
   wxBrush*              m_brush;
   wxFont*               m_font;
@@ -413,10 +533,11 @@ class wxShape: public wxShapeEvtHandler
   bool                  m_selected;
   bool                  m_highlighted;      // Different from selected: user-defined highlighting,
                                             // e.g. thick border.
-  float                 m_rotation;
+  double                m_rotation;
   int                   m_sensitivity;
   bool                  m_draggable;
-  bool                  m_attachmentMode;   // TRUE if using attachments, FALSE otherwise
+  int                   m_attachmentMode;   // 0 for no attachments, 1 if using normal attachments,
+                                            // 2 for branching attachments
   bool                  m_spaceAttachments; // TRUE if lines at one side should be spaced
   bool                  m_fixedWidth;
   bool                  m_fixedHeight;
@@ -432,6 +553,11 @@ class wxShape: public wxShapeEvtHandler
   int                   m_textMarginX;    // Gap between text and border
   int                   m_textMarginY;
   wxString              m_regionName;
+  bool                  m_maintainAspectRatio;
+  int                   m_branchNeckLength;
+  int                   m_branchStemLength;
+  int                   m_branchSpacing;
+  long                  m_branchStyle;
 };
 
 class wxPolygonShape: public wxShape
@@ -444,16 +570,23 @@ class wxPolygonShape: public wxShape
   // Takes a list of wxRealPoints; each point is an OFFSET from the centre.
   // Deletes user's points in destructor.
   virtual void Create(wxList *points);
+  virtual void ClearPoints();
 
-  void GetBoundingBoxMin(float *w, float *h);
+  void GetBoundingBoxMin(double *w, double *h);
   void CalculateBoundingBox();
-  bool GetPerimeterPoint(float x1, float y1,
-                                 float x2, float y2,
-                                 float *x3, float *y3);
-  bool HitTest(float x, float y, int *attachment, float *distance);
-  void SetSize(float x, float y, bool recursive = TRUE);
+  bool GetPerimeterPoint(double x1, double y1,
+                                 double x2, double y2,
+                                 double *x3, double *y3);
+  bool HitTest(double x, double y, int *attachment, double *distance);
+  void SetSize(double x, double y, bool recursive = TRUE);
   void OnDraw(wxDC& dc);
-  void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
+  void OnDrawOutline(wxDC& dc, double x, double y, double w, double h);
+
+  // Control points ('handles') redirect control to the actual shape, to make it easier
+  // to override sizing behaviour.
+  virtual void OnSizingDragLeft(wxControlPoint* pt, bool draw, double x, double y, int keys=0, int attachment = 0);
+  virtual void OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int keys=0, int attachment = 0);
+  virtual void OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, int keys=0, int attachment = 0);
 
   // A polygon should have a control point at each vertex,
   // with the option of moving the control points individually
@@ -475,130 +608,130 @@ class wxPolygonShape: public wxShape
   virtual void CalculatePolygonCentre();
 
 #ifdef PROLOGIO
-  // Prolog database stuff
-  void WritePrologAttributes(wxExpr *clause);
-  void ReadPrologAttributes(wxExpr *clause);
+  void WriteAttributes(wxExpr *clause);
+  void ReadAttributes(wxExpr *clause);
 #endif
 
-  int GetNumberOfAttachments();
-  bool GetAttachmentPosition(int attachment, float *x, float *y,
+  int GetNumberOfAttachments() const;
+  bool GetAttachmentPosition(int attachment, double *x, double *y,
                                      int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
   bool AttachmentIsValid(int attachment);
   // Does the copying for this object
-  void Copy(wxPolygonShape& copy);
-  wxShape *PrivateCopy();
+  void Copy(wxShape& copy);
 
   inline wxList *GetPoints() { return m_points; }
 
+  // Rotate about the given axis by the given amount in radians
+  virtual void Rotate(double x, double y, double theta);
+
  private:
   wxList*       m_points;
   wxList*       m_originalPoints;
-  float         m_boundWidth;
-  float         m_boundHeight;
-  float         m_originalWidth;
-  float         m_originalHeight;
+  double        m_boundWidth;
+  double        m_boundHeight;
+  double        m_originalWidth;
+  double        m_originalHeight;
 };
 
 class wxRectangleShape: public wxShape
 {
  DECLARE_DYNAMIC_CLASS(wxRectangleShape)
  public:
-  wxRectangleShape(float w = 0.0, float h = 0.0);
-  void GetBoundingBoxMin(float *w, float *h);
-  bool GetPerimeterPoint(float x1, float y1,
-                                 float x2, float y2,
-                                 float *x3, float *y3);
+  wxRectangleShape(double w = 0.0, double h = 0.0);
+  void GetBoundingBoxMin(double *w, double *h);
+  bool GetPerimeterPoint(double x1, double y1,
+                                 double x2, double y2,
+                                 double *x3, double *y3);
   void OnDraw(wxDC& dc);
-  void SetSize(float x, float y, bool recursive = TRUE);
-  void SetCornerRadius(float rad); // If > 0, rounded corners
+  void SetSize(double x, double y, bool recursive = TRUE);
+  void SetCornerRadius(double rad); // If > 0, rounded corners
 
 #ifdef PROLOGIO
-  // Prolog database stuff
-  void WritePrologAttributes(wxExpr *clause);
-  void ReadPrologAttributes(wxExpr *clause);
+  void WriteAttributes(wxExpr *clause);
+  void ReadAttributes(wxExpr *clause);
 #endif
 
-  int GetNumberOfAttachments();
-  bool GetAttachmentPosition(int attachment, float *x, float *y,
+  int GetNumberOfAttachments() const;
+  bool GetAttachmentPosition(int attachment, double *x, double *y,
                                      int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
   // Does the copying for this object
-  void Copy(wxRectangleShape& copy);
-  wxShape *PrivateCopy();
+  void Copy(wxShape& copy);
 
-  inline float GetWidth() const { return m_width; }
-  inline float GetHeight() const { return m_height; }
+  inline double GetWidth() const { return m_width; }
+  inline double GetHeight() const { return m_height; }
+  inline void SetWidth(double w) { m_width = w; }
+  inline void SetHeight(double h) { m_height = h; }
 
 protected:
-  float m_width;
-  float m_height;
-  float m_cornerRadius;
+  double m_width;
+  double m_height;
+  double m_cornerRadius;
 };
 
 class wxTextShape: public wxRectangleShape
 {
  DECLARE_DYNAMIC_CLASS(wxTextShape)
  public:
-  wxTextShape(float width = 0.0, float height = 0.0);
+  wxTextShape(double width = 0.0, double height = 0.0);
 
   void OnDraw(wxDC& dc);
 
 #ifdef PROLOGIO
-  void WritePrologAttributes(wxExpr *clause);
+  void WriteAttributes(wxExpr *clause);
 #endif
 
   // Does the copying for this object
-  void Copy(wxTextShape& copy);
-  wxShape *PrivateCopy();
+  void Copy(wxShape& copy);
 };
 
 class wxEllipseShape: public wxShape
 {
  DECLARE_DYNAMIC_CLASS(wxEllipseShape)
  public:
-  wxEllipseShape(float w = 0.0, float h = 0.0);
+  wxEllipseShape(double w = 0.0, double h = 0.0);
 
-  void GetBoundingBoxMin(float *w, float *h);
-  bool GetPerimeterPoint(float x1, float y1,
-                                 float x2, float y2,
-                                 float *x3, float *y3);
+  void GetBoundingBoxMin(double *w, double *h);
+  bool GetPerimeterPoint(double x1, double y1,
+                                 double x2, double y2,
+                                 double *x3, double *y3);
 
   void OnDraw(wxDC& dc);
-  void SetSize(float x, float y, bool recursive = TRUE);
+  void SetSize(double x, double y, bool recursive = TRUE);
 
 #ifdef PROLOGIO
-  // Prolog database stuff
-  void WritePrologAttributes(wxExpr *clause);
-  void ReadPrologAttributes(wxExpr *clause);
+  void WriteAttributes(wxExpr *clause);
+  void ReadAttributes(wxExpr *clause);
 #endif
 
-  int GetNumberOfAttachments();
-  bool GetAttachmentPosition(int attachment, float *x, float *y,
+  int GetNumberOfAttachments() const;
+  bool GetAttachmentPosition(int attachment, double *x, double *y,
                                      int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
 
   // Does the copying for this object
-  void Copy(wxEllipseShape& copy);
-  wxShape *PrivateCopy();
+  void Copy(wxShape& copy);
 
-  inline float GetWidth() const { return m_width; }
-  inline float GetHeight() const { return m_height; }
+  inline double GetWidth() const { return m_width; }
+  inline double GetHeight() const { return m_height; }
+
+  inline void SetWidth(double w) { m_width = w; }
+  inline void SetHeight(double h) { m_height = h; }
 
 protected:
-  float m_width;
-  float m_height;
+  double m_width;
+  double m_height;
 };
 
 class wxCircleShape: public wxEllipseShape
 {
  DECLARE_DYNAMIC_CLASS(wxCircleShape)
  public:
-  wxCircleShape(float w = 0.0);
+  wxCircleShape(double w = 0.0);
 
-  bool GetPerimeterPoint(float x1, float y1,
-                                 float x2, float y2,
-                                 float *x3, float *y3);
+  bool GetPerimeterPoint(double x1, double y1,
+                                 double x2, double y2,
+                                 double *x3, double *y3);
   // Does the copying for this object
-  void Copy(wxCircleShape& copy);
-  wxShape *PrivateCopy();
+  void Copy(wxShape& copy);
 };
 
 #endif