]> git.saurik.com Git - wxWidgets.git/blame_incremental - contrib/samples/ogl/ogledit/view.cpp
wxMutexGuiEnter/Leave didn't work because this file is compiled with wxUSE_GUI=0
[wxWidgets.git] / contrib / samples / ogl / ogledit / view.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: view.cpp
3// Purpose: Implements view functionality in OGLEdit
4// Author: Julian Smart
5// Modified by:
6// Created: 12/07/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13// #pragma implementation
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24#include <wx/wx.h>
25#endif
26
27#include <wx/colordlg.h>
28
29#if !wxUSE_DOC_VIEW_ARCHITECTURE
30#error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in wx_setup.h!
31#endif
32
33#include "ogledit.h"
34#include "doc.h"
35#include "view.h"
36#include "palette.h"
37
38IMPLEMENT_DYNAMIC_CLASS(DiagramView, wxView)
39
40BEGIN_EVENT_TABLE(DiagramView, wxView)
41 EVT_MENU(OGLEDIT_CUT, DiagramView::OnCut)
42 EVT_MENU(OGLEDIT_CHANGE_BACKGROUND_COLOUR, DiagramView::OnChangeBackgroundColour)
43 EVT_MENU(OGLEDIT_EDIT_LABEL, DiagramView::OnEditLabel)
44END_EVENT_TABLE()
45
46// What to do when a view is created. Creates actual
47// windows for displaying the view.
48bool DiagramView::OnCreate(wxDocument *doc, long flags)
49{
50 frame = GetMainFrame();
51 canvas = GetMainFrame()->canvas;
52 canvas->view = this;
53
54 SetFrame(frame);
55 Activate(TRUE);
56
57 // Initialize the edit menu Undo and Redo items
58 doc->GetCommandProcessor()->SetEditMenu(((MyFrame *)frame)->editMenu);
59 doc->GetCommandProcessor()->Initialize();
60
61 wxShapeCanvas *shapeCanvas = (wxShapeCanvas *)canvas;
62 DiagramDocument *diagramDoc = (DiagramDocument *)doc;
63 shapeCanvas->SetDiagram(diagramDoc->GetDiagram());
64 diagramDoc->GetDiagram()->SetCanvas(shapeCanvas);
65
66 return TRUE;
67}
68
69#define CENTER FALSE // Place the drawing to the center of the page
70
71
72// Sneakily gets used for default print/preview
73// as well as drawing on the screen.
74void DiagramView::OnDraw(wxDC *dc)
75{
76
77 /* You might use THIS code if you were scaling
78 * graphics of known size to fit on the page.
79 */
80 int w, h;
81
82 // We need to adjust for the graphic size, a formula will be added
83 float maxX = 900;
84 float maxY = 700;
85 // A better way of find the maxium values would be to search through
86 // the linked list
87
88 // Let's have at least 10 device units margin
89 float marginX = 10;
90 float marginY = 10;
91
92 // Add the margin to the graphic size
93 maxX += (2 * marginX);
94 maxY += (2 * marginY);
95
96 // Get the size of the DC in pixels
97 dc->GetSize (&w, &h);
98
99 // Calculate a suitable scaling factor
100 float scaleX = (float) (w / maxX);
101 float scaleY = (float) (h / maxY);
102
103 // Use x or y scaling factor, whichever fits on the DC
104 float actualScale = wxMin (scaleX, scaleY);
105
106 float posX, posY;
107 // Calculate the position on the DC for centring the graphic
108 if (CENTER == TRUE) // center the drawing
109 {
110 posX = (float) ((w - (200 * actualScale)) / 2.0);
111 posY = (float) ((h - (200 * actualScale)) / 2.0);
112 }
113 else // Use defined presets
114 {
115 posX = 10;
116 posY = 35;
117 }
118
119
120 // Set the scale and origin
121 dc->SetUserScale (actualScale, actualScale);
122 dc->SetDeviceOrigin ((long) posX, (long) posY);
123
124 // This part was added to preform the print preview and printing functions
125
126 dc->BeginDrawing(); // Allows optimization of drawing code under MS Windows.
127 wxDiagram *diagram_p=((DiagramDocument*)GetDocument())->GetDiagram(); // Get the current diagram
128 if (diagram_p->GetShapeList())
129 {
130 wxCursor *old_cursor = NULL;
131 wxNode *current = diagram_p->GetShapeList()->First();
132
133 while (current) // Loop through the entire list of shapes
134 {
135 wxShape *object = (wxShape *)current->Data();
136 if (!object->GetParent())
137 {
138 object->Draw(* dc); // Draw the shape onto our printing dc
139 }
140 current = current->Next(); // Procede to the next shape in the list
141 }
142 }
143 dc->EndDrawing(); // Allows optimization of drawing code under MS Windows.
144}
145
146void DiagramView::OnUpdate(wxView *sender, wxObject *hint)
147{
148 if (canvas)
149 canvas->Refresh();
150}
151
152// Clean up windows used for displaying the view.
153bool DiagramView::OnClose(bool deleteWindow)
154{
155 if (!GetDocument()->Close())
156 return FALSE;
157
158 DiagramDocument *diagramDoc = (DiagramDocument *)GetDocument();
159 diagramDoc->GetDiagram()->SetCanvas(NULL);
160
161 canvas->ClearBackground();
162 canvas->SetDiagram(NULL);
163 canvas->view = NULL;
164 canvas = NULL;
165
166 wxString s = wxTheApp->GetAppName();
167 if (frame)
168 frame->SetTitle(s);
169
170 SetFrame(NULL);
171
172 Activate(FALSE);
173
174 return TRUE;
175}
176
177wxShape *DiagramView::FindSelectedShape(void)
178{
179 DiagramDocument *doc = (DiagramDocument *)GetDocument();
180 wxShape *theShape = NULL;
181 wxNode *node = doc->GetDiagram()->GetShapeList()->First();
182 while (node)
183 {
184 wxShape *eachShape = (wxShape *)node->Data();
185 if ((eachShape->GetParent() == NULL) && eachShape->Selected())
186 {
187 theShape = eachShape;
188 node = NULL;
189 }
190 else node = node->Next();
191 }
192 return theShape;
193}
194
195void DiagramView::OnCut(wxCommandEvent& event)
196{
197 DiagramDocument *doc = (DiagramDocument *)GetDocument();
198
199 wxShape *theShape = FindSelectedShape();
200 if (theShape)
201 doc->GetCommandProcessor()->Submit(new DiagramCommand("Cut", OGLEDIT_CUT, doc, NULL, 0.0, 0.0, TRUE, theShape));
202}
203
204void DiagramView::OnChangeBackgroundColour(wxCommandEvent& event)
205{
206 DiagramDocument *doc = (DiagramDocument *)GetDocument();
207
208 wxShape *theShape = FindSelectedShape();
209 if (theShape)
210 {
211 wxColourData data;
212 data.SetChooseFull(TRUE);
213 data.SetColour(theShape->GetBrush()->GetColour());
214
215 wxColourDialog *dialog = new wxColourDialog(frame, &data);
216 wxBrush *theBrush = NULL;
217 if (dialog->ShowModal() == wxID_OK)
218 {
219 wxColourData retData = dialog->GetColourData();
220 wxColour col = retData.GetColour();
221 theBrush = wxTheBrushList->FindOrCreateBrush(col, wxSOLID);
222 }
223 dialog->Close();
224
225 if (theBrush)
226 doc->GetCommandProcessor()->Submit(new DiagramCommand("Change colour", OGLEDIT_CHANGE_BACKGROUND_COLOUR, doc,
227 theBrush, theShape));
228 }
229}
230
231void DiagramView::OnEditLabel(wxCommandEvent& event)
232{
233 wxShape *theShape = FindSelectedShape();
234 if (theShape)
235 {
236 wxString newLabel = wxGetTextFromUser("Enter new label", "Shape Label", ((MyEvtHandler *)theShape->GetEventHandler())->label);
237 GetDocument()->GetCommandProcessor()->Submit(new DiagramCommand("Edit label", OGLEDIT_EDIT_LABEL, (DiagramDocument*) GetDocument(), newLabel, theShape));
238 }
239}
240
241
242/*
243 * Window implementations
244 */
245
246BEGIN_EVENT_TABLE(MyCanvas, wxShapeCanvas)
247 EVT_MOUSE_EVENTS(MyCanvas::OnMouseEvent)
248 EVT_PAINT(MyCanvas::OnPaint)
249END_EVENT_TABLE()
250
251// Define a constructor for my canvas
252MyCanvas::MyCanvas(wxView *v, wxWindow *parent, wxWindowID id, const wxPoint& pos,
253 const wxSize& size, long style):
254 wxShapeCanvas(parent, id, pos, size, style)
255{
256 SetBackgroundColour(*wxWHITE);
257 view = v;
258}
259
260MyCanvas::~MyCanvas(void)
261{
262}
263
264void MyCanvas::OnLeftClick(double x, double y, int keys)
265{
266 EditorToolPalette *palette = wxGetApp().frame->palette;
267 wxClassInfo *info = NULL;
268 switch (palette->currentlySelected)
269 {
270 case PALETTE_TOOL1:
271 {
272 info = CLASSINFO(wxRectangleShape);
273 break;
274 }
275 case PALETTE_TOOL2:
276 {
277 info = CLASSINFO(wxRoundedRectangleShape);
278 break;
279 }
280 case PALETTE_TOOL3:
281 {
282 info = CLASSINFO(wxEllipseShape);
283 break;
284 }
285 case PALETTE_TOOL4:
286 {
287 info = CLASSINFO(wxDiamondShape);
288 break;
289 }
290 default:
291 break;
292 }
293 if (info)
294 {
295 view->GetDocument()->GetCommandProcessor()->Submit(
296 new DiagramCommand((char*) info->GetClassName(), OGLEDIT_ADD_SHAPE, (DiagramDocument *)view->GetDocument(), info,
297 x, y));
298 }
299}
300
301void MyCanvas::OnRightClick(double x, double y, int keys)
302{
303}
304
305void MyCanvas::OnDragLeft(bool draw, double x, double y, int keys)
306{
307}
308
309void MyCanvas::OnBeginDragLeft(double x, double y, int keys)
310{
311}
312
313void MyCanvas::OnEndDragLeft(double x, double y, int keys)
314{
315}
316
317void MyCanvas::OnDragRight(bool draw, double x, double y, int keys)
318{
319}
320
321void MyCanvas::OnBeginDragRight(double x, double y, int keys)
322{
323}
324
325void MyCanvas::OnEndDragRight(double x, double y, int keys)
326{
327}
328
329void MyCanvas::OnMouseEvent(wxMouseEvent& event)
330{
331 wxShapeCanvas::OnMouseEvent(event);
332}
333
334void MyCanvas::OnPaint(wxPaintEvent& event)
335{
336// if (GetDiagram())
337 wxShapeCanvas::OnPaint(event);
338}