1///////////////////////////////////////////////////////////////////////////// 2// Name: contrib/samples/ogl/studio/shapes.h 3// Purpose: Shape classes 4// Author: Julian Smart 5// Modified by: 6// Created: 12/07/98 7// RCS-ID: $Id: shapes.h 37440 2006-02-10 11:59:52Z ABX $ 8// Copyright: (c) Julian Smart 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12#ifndef _STUDIO_SHAPES_H_ 13#define _STUDIO_SHAPES_H_ 14 15#include "wx/docview.h" 16#include "wx/string.h" 17#include "wx/ogl/ogl.h" // base header of OGL, includes and adjusts wx/deprecated/setup.h 18#include "wx/ogl/basicp.h" 19#include "wx/ogl/linesp.h" 20#include "wx/ogl/drawn.h" 21 22class csDiagramDocument; 23 24/* 25 * Override a few members for this application 26 */ 27 28class csDiagram: public wxDiagram 29{ 30DECLARE_CLASS(csDiagram) 31public: 32 csDiagram(csDiagramDocument* doc) { m_doc = doc; } 33 ~csDiagram(); 34#if wxUSE_PROLOGIO 35 bool OnShapeSave(wxExprDatabase& db, wxShape& shape, wxExpr& expr); 36 bool OnShapeLoad(wxExprDatabase& db, wxShape& shape, wxExpr& expr); 37#endif // wxUSE_PROLOGIO 38 39 inline csDiagramDocument* GetDocument() const { return m_doc; } 40 virtual void Redraw(wxDC& dc); 41 42protected: 43 csDiagramDocument* m_doc; 44}; 45 46class wxDiagramClipboard: public wxDiagram 47{ 48DECLARE_DYNAMIC_CLASS(wxDiagramClipboard) 49public: 50 wxDiagramClipboard() {} 51 ~wxDiagramClipboard() {} 52 53 // Copy selection to clipboard 54 bool Copy(wxDiagram* diagram); 55 56 // Copy contents to the diagram, with new ids. 57 // If dc is non-NULL, the pasted shapes will be selected. 58 // The offsets are used to place the shapes at a different position 59 // from the original (for example, for duplicating shapes). 60 bool Paste(wxDiagram* diagram, wxDC* dc = NULL, 61 int offsetX = 0, int offsetY = 0); 62 63#ifdef __WXMSW__ 64 // Draw contents to a Windows metafile device context and bitmap, and then copy 65 // to the Windows clipboard. 66 bool CopyToClipboard(double scale); 67#endif 68 69// Overridables 70 // Start/end copying 71 virtual bool OnStartCopy(wxDiagram* WXUNUSED(diagramTo)) { return true; }; 72 virtual bool OnEndCopy(wxDiagram* WXUNUSED(diagramTo)) { return true; }; 73 74 // Override this to e.g. have the shape added through a Do/Undo command system. 75 // By default, we'll just add it directly to the destination diagram, and 76 // select the shape (if dc is non-NULL). 77 virtual bool OnAddShape(wxDiagram* diagramTo, wxShape* newShape, wxDC* dc); 78 79protected: 80 bool DoCopy(wxDiagram* diagramFrom, wxDiagram* diagramTo, bool newIds, 81 wxDC* dc, int offsetX = 0, int offsetY = 0); 82 83}; 84 85class csDiagramCommand; 86 87class csDiagramClipboard: public wxDiagramClipboard 88{ 89DECLARE_DYNAMIC_CLASS(csDiagramClipboard) 90public: 91 csDiagramClipboard() { m_currentCmd = NULL; } 92 ~csDiagramClipboard() {} 93 94 // Start/end copying 95 virtual bool OnStartCopy(wxDiagram* diagramTo); 96 virtual bool OnEndCopy(wxDiagram* diagramTo); 97 98 virtual bool OnAddShape(wxDiagram* diagramTo, wxShape* newShape, wxDC* dc); 99 100protected: 101 csDiagramCommand* m_currentCmd; 102}; 103 104 105/* 106 * The Studio shapes 107 * N.B. TODO: these should really all have another constructor 108 * for the ready-initialised shape, with the default one not having any 109 * data. Otherwise when copying a shape, you have to delete the old data 110 * first -> slightly less efficient. The initialised shapes are only required 111 * for the first creation of the shape in the palette, everything else is copied. 112 */ 113 114class csThinRectangleShape: public wxDrawnShape 115{ 116DECLARE_DYNAMIC_CLASS(csThinRectangleShape) 117public: 118 csThinRectangleShape(); 119}; 120 121class csWideRectangleShape: public wxDrawnShape 122{ 123DECLARE_DYNAMIC_CLASS(csWideRectangleShape) 124public: 125 csWideRectangleShape(); 126}; 127 128class csTriangleShape: public wxDrawnShape 129{ 130DECLARE_DYNAMIC_CLASS(csTriangleShape) 131public: 132 csTriangleShape(); 133}; 134 135class csSemiCircleShape: public wxDrawnShape 136{ 137DECLARE_DYNAMIC_CLASS(csSemiCircleShape) 138public: 139 csSemiCircleShape(); 140}; 141 142class csCircleShape: public wxCircleShape 143{ 144DECLARE_DYNAMIC_CLASS(csCircleShape) 145public: 146 csCircleShape(); 147}; 148 149class csCircleShadowShape: public wxCircleShape 150{ 151DECLARE_DYNAMIC_CLASS(csCircleShadowShape) 152public: 153 csCircleShadowShape(); 154}; 155 156class csOctagonShape: public wxPolygonShape 157{ 158DECLARE_DYNAMIC_CLASS(csOctagonShape) 159public: 160 csOctagonShape(); 161 162 // The attachments are as if it's a rectangle 163 bool GetAttachmentPosition(int attachment, double *x, double *y, 164 int nth = 0, int no_arcs = 1, wxLineShape *line = NULL) 165 { return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs, line); } 166 int GetNumberOfAttachments() const 167 { return wxShape::GetNumberOfAttachments(); } 168 bool AttachmentIsValid(int attachment) const 169 { return wxShape::AttachmentIsValid(attachment); } 170}; 171 172// This is a transparent shape for drawing around other shapes. 173class csGroupShape: public wxRectangleShape 174{ 175DECLARE_DYNAMIC_CLASS(csGroupShape) 176public: 177 csGroupShape(); 178 179 void OnDraw(wxDC& dc); 180 // Must modify the hit-test so it doesn't obscure shapes that are inside. 181 bool HitTest(double x, double y, int* attachment, double* distance); 182}; 183 184class csTextBoxShape: public wxRectangleShape 185{ 186DECLARE_DYNAMIC_CLASS(csTextBoxShape) 187public: 188 csTextBoxShape(); 189}; 190 191class csLineShape: public wxLineShape 192{ 193DECLARE_DYNAMIC_CLASS(csLineShape) 194public: 195 csLineShape(); 196 197 virtual bool OnMoveMiddleControlPoint(wxDC& dc, wxLineControlPoint* lpt, const wxRealPoint& pt); 198 wxLabelShape* OnCreateLabelShape(wxLineShape *parent = NULL, wxShapeRegion *region = NULL, double w = 0.0, double h = 0.0); 199}; 200 201/* 202 * Temporary arc label object 203 */ 204 205class csLabelShape: public wxLabelShape 206{ 207 DECLARE_DYNAMIC_CLASS(csLabelShape) 208 209 public: 210 csLabelShape(wxLineShape *parent = NULL, wxShapeRegion *region = NULL, double w = 0.0, double h = 0.0); 211 212 void OnEndDragLeft(double x, double y, int keys=0, int attachment = 0); 213}; 214 215/* 216 * All shape event behaviour is routed through this handler, so we don't 217 * have to derive from each shape class. We plug this in to each shape. 218 */ 219 220class csEvtHandler: public wxShapeEvtHandler 221{ 222 DECLARE_DYNAMIC_CLASS(csEvtHandler) 223 public: 224 csEvtHandler(wxShapeEvtHandler *prev = NULL, wxShape *shape = NULL, const wxString& lab = wxEmptyString); 225 ~csEvtHandler(); 226 227 void OnLeftClick(double x, double y, int keys = 0, int attachment = 0); 228 void OnRightClick(double x, double y, int keys = 0, int attachment = 0); 229 void OnBeginDragRight(double x, double y, int keys = 0, int attachment = 0); 230 void OnDragRight(bool draw, double x, double y, int keys = 0, int attachment = 0); 231 void OnEndDragRight(double x, double y, int keys = 0, int attachment = 0); 232 void OnEndSize(double x, double y); 233 void OnDragLeft(bool draw, double x, double y, int keys = 0, int attachment = 0); 234 void OnBeginDragLeft(double x, double y, int keys = 0, int attachment = 0); 235 void OnEndDragLeft(double x, double y, int keys = 0, int attachment = 0); 236 void OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, int keys = 0, int attachment = 0); 237 void OnChangeAttachment(int attachment, wxLineShape* line, wxList& ordering); 238 239 void OnLeftDoubleClick(double x, double y, int keys = 0, int attachment = 0); 240 241 // Copy any event handler data 242 virtual void CopyData(wxShapeEvtHandler& copy); 243 244 // Popup up a property dialog 245 virtual bool EditProperties(); 246 247public: 248 wxString m_label; 249}; 250 251class ShapeEditMenu: public wxMenu 252{ 253public: 254 ShapeEditMenu() {} 255 256 void OnCommand(wxCommandEvent& event); 257 258DECLARE_EVENT_TABLE() 259}; 260 261extern void studioShapeEditProc(wxMenu& menu, wxCommandEvent& event); 262 263#endif 264 // _STUDIO_SHAPES_H_ 265