]> git.saurik.com Git - wxWidgets.git/blob - contrib/samples/ogl/studio/symbols.cpp
wxScrolledWindow::GetVirtualSize now returns client size
[wxWidgets.git] / contrib / samples / ogl / studio / symbols.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: symbols.cpp
3 // Purpose: Implements the Studio symbol database
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 12/07/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // 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/wxexpr.h>
28
29 #include "studio.h"
30 #include "doc.h"
31 #include "shapes.h"
32 #include "view.h"
33 #include "symbols.h"
34
35 /*
36 * csSymbol
37 * Represents information about a symbol.
38 */
39
40 csSymbol::csSymbol(const wxString& name, wxShape* shape)
41 {
42 m_name = name;
43 m_shape = shape;
44 m_toolId = 0;
45 }
46
47 csSymbol::~csSymbol()
48 {
49 delete m_shape;
50 }
51
52 /*
53 * A table of all possible shapes.
54 * We can use this to construct a palette, etc.
55 */
56 csSymbolDatabase::csSymbolDatabase()
57 {
58 m_currentId = 800;
59 }
60
61 csSymbolDatabase::~csSymbolDatabase()
62 {
63 ClearSymbols();
64 }
65
66 void csSymbolDatabase::AddSymbol(csSymbol* symbol)
67 {
68 symbol->SetToolId(m_currentId);
69 m_symbols.Append(symbol);
70
71 m_currentId ++;
72 }
73
74 void csSymbolDatabase::ClearSymbols()
75 {
76 wxNode* node = m_symbols.First();
77 while (node)
78 {
79 csSymbol* symbol = (csSymbol*) node->Data();
80 delete symbol;
81
82 node = node->Next();
83 }
84 m_symbols.Clear();
85 }
86
87 csSymbol* csSymbolDatabase::FindSymbol(const wxString& name) const
88 {
89 wxNode* node = m_symbols.First();
90 while (node)
91 {
92 csSymbol* symbol = (csSymbol*) node->Data();
93 if (symbol->GetName() == name)
94 return symbol;
95
96 node = node->Next();
97 }
98 return NULL;
99 }
100
101 csSymbol* csSymbolDatabase::FindSymbol(int toolId) const
102 {
103 wxNode* node = m_symbols.First();
104 while (node)
105 {
106 csSymbol* symbol = (csSymbol*) node->Data();
107 if (symbol->GetToolId() == toolId)
108 return symbol;
109
110 node = node->Next();
111 }
112 return NULL;
113 }
114
115 // Add symbols to database
116 void csApp::InitSymbols()
117 {
118 m_symbolDatabase = new csSymbolDatabase;
119
120 wxShape* shape = new csCircleShape();
121 shape->AssignNewIds();
122 shape->SetEventHandler(new csEvtHandler(shape, shape, wxString("")));
123
124 m_symbolDatabase->AddSymbol(new csSymbol("Circle", shape));
125
126 shape = new csCircleShadowShape();
127 shape->AssignNewIds();
128 shape->SetEventHandler(new csEvtHandler(shape, shape, wxString("")));
129
130 m_symbolDatabase->AddSymbol(new csSymbol("Circle shadow", shape));
131
132 shape = new csThinRectangleShape();
133 shape->AssignNewIds();
134 shape->SetEventHandler(new csEvtHandler(shape, shape, wxString("")));
135
136 m_symbolDatabase->AddSymbol(new csSymbol("Thin Rectangle", shape));
137
138 shape = new csWideRectangleShape();
139 shape->AssignNewIds();
140 shape->SetEventHandler(new csEvtHandler(shape, shape, wxString("")));
141
142 m_symbolDatabase->AddSymbol(new csSymbol("Wide Rectangle", shape));
143
144 shape = new csSemiCircleShape();
145 shape->AssignNewIds();
146 shape->SetEventHandler(new csEvtHandler(shape, shape, wxString("")));
147
148 m_symbolDatabase->AddSymbol(new csSymbol("SemiCircle", shape));
149
150 shape = new csTriangleShape();
151 shape->AssignNewIds();
152 shape->SetEventHandler(new csEvtHandler(shape, shape, wxString("")));
153
154 m_symbolDatabase->AddSymbol(new csSymbol("Triangle", shape));
155
156 shape = new csOctagonShape();
157 shape->AssignNewIds();
158 shape->SetEventHandler(new csEvtHandler(shape, shape, wxString("")));
159
160 m_symbolDatabase->AddSymbol(new csSymbol("Octagon", shape));
161
162 shape = new csGroupShape();
163 shape->AssignNewIds();
164 shape->SetEventHandler(new csEvtHandler(shape, shape, wxString("")));
165
166 m_symbolDatabase->AddSymbol(new csSymbol("Group", shape));
167 }
168
169 wxBitmap* csSymbolDatabase::CreateToolBitmap(csSymbol* symbol, const wxSize& toolSize)
170 {
171 symbol->GetShape()->Recompute();
172
173 wxBitmap *newBitmap = new wxBitmap(toolSize.x, toolSize.y);
174
175 // Test code
176 #if 0
177 wxMemoryDC memDC;
178 memDC.SelectObject(*newBitmap);
179 memDC.SetPen(* wxBLACK_PEN);
180 memDC.SetBrush(* wxWHITE_BRUSH);
181 memDC.SetBackground(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), wxSOLID));
182 memDC.SetLogicalFunction(wxCOPY);
183 memDC.Clear();
184
185 memDC.DrawLine(0, 0, toolSize.x, toolSize.y);
186 memDC.DrawLine(0, toolSize.y, toolSize.x, 0);
187
188 memDC.SelectObject(wxNullBitmap);
189 #endif
190
191 #if 1
192 wxMemoryDC memDC;
193
194 double height, width, maxSize;
195 symbol->GetShape()->GetBoundingBoxMax(&width, &height);
196
197 if (height > width)
198 maxSize = height;
199 else
200 maxSize = width;
201
202 double borderMargin = 4.0;
203 double scaleFactor = (double)(toolSize.x / (maxSize + 2*borderMargin));
204 double centreX = (double)((toolSize.x/scaleFactor)/2.0)-1;
205 double centreY = centreX;
206
207 memDC.SelectObject(*newBitmap);
208
209 memDC.SetUserScale(scaleFactor, scaleFactor);
210
211 memDC.SetBackground(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE), wxSOLID));
212 memDC.Clear();
213
214 symbol->GetShape()->Show(TRUE);
215 symbol->GetShape()->Move(memDC, centreX, centreY);
216
217 memDC.SelectObject(wxNullBitmap);
218 #endif
219
220 return newBitmap;
221 }
222