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