]> git.saurik.com Git - wxWidgets.git/blob - src/generic/fontdlgg.cpp
added operator[](unsigned int) const -- testing it now on Linux/axp,
[wxWidgets.git] / src / generic / fontdlgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: fontdlgg.cpp
3 // Purpose: Generic font dialog
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "fontdlgg.h"
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 <stdio.h>
25 #include "wx/utils.h"
26 #include "wx/dialog.h"
27 #include "wx/listbox.h"
28 #include "wx/button.h"
29 #include "wx/stattext.h"
30 #include "wx/layout.h"
31 #include "wx/dcclient.h"
32 #include "wx/choice.h"
33 #include "wx/checkbox.h"
34 #include "wx/intl.h"
35 #endif
36
37 #include <string.h>
38 #include <stdlib.h>
39
40 #include "wx/cmndata.h"
41 #include "wx/generic/fontdlgg.h"
42
43 #if !USE_SHARED_LIBRARY
44 IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog, wxDialog)
45
46 BEGIN_EVENT_TABLE(wxGenericFontDialog, wxDialog)
47 EVT_CHECKBOX(wxID_FONT_UNDERLINE, wxGenericFontDialog::OnChangeFont)
48 EVT_CHOICE(wxID_FONT_STYLE, wxGenericFontDialog::OnChangeFont)
49 EVT_CHOICE(wxID_FONT_WEIGHT, wxGenericFontDialog::OnChangeFont)
50 EVT_CHOICE(wxID_FONT_FAMILY, wxGenericFontDialog::OnChangeFont)
51 EVT_CHOICE(wxID_FONT_COLOUR, wxGenericFontDialog::OnChangeFont)
52 EVT_CHOICE(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont)
53 EVT_PAINT(wxGenericFontDialog::OnPaint)
54 EVT_CLOSE(wxGenericFontDialog::OnCloseWindow)
55 END_EVENT_TABLE()
56
57 #endif
58
59 #define NUM_COLS 48
60 static wxString wxColourDialogNames[NUM_COLS]={wxT("ORANGE"),
61 wxT("GOLDENROD"),
62 wxT("WHEAT"),
63 wxT("SPRING GREEN"),
64 wxT("SKY BLUE"),
65 wxT("SLATE BLUE"),
66 wxT("MEDIUM VIOLET RED"),
67 wxT("PURPLE"),
68
69 wxT("RED"),
70 wxT("YELLOW"),
71 wxT("MEDIUM SPRING GREEN"),
72 wxT("PALE GREEN"),
73 wxT("CYAN"),
74 wxT("LIGHT STEEL BLUE"),
75 wxT("ORCHID"),
76 wxT("LIGHT MAGENTA"),
77
78 wxT("BROWN"),
79 wxT("YELLOW"),
80 wxT("GREEN"),
81 wxT("CADET BLUE"),
82 wxT("MEDIUM BLUE"),
83 wxT("MAGENTA"),
84 wxT("MAROON"),
85 wxT("ORANGE RED"),
86
87 wxT("FIREBRICK"),
88 wxT("CORAL"),
89 wxT("FOREST GREEN"),
90 wxT("AQUARAMINE"),
91 wxT("BLUE"),
92 wxT("NAVY"),
93 wxT("THISTLE"),
94 wxT("MEDIUM VIOLET RED"),
95
96 wxT("INDIAN RED"),
97 wxT("GOLD"),
98 wxT("MEDIUM SEA GREEN"),
99 wxT("MEDIUM BLUE"),
100 wxT("MIDNIGHT BLUE"),
101 wxT("GREY"),
102 wxT("PURPLE"),
103 wxT("KHAKI"),
104
105 wxT("BLACK"),
106 wxT("MEDIUM FOREST GREEN"),
107 wxT("KHAKI"),
108 wxT("DARK GREY"),
109 wxT("SEA GREEN"),
110 wxT("LIGHT GREY"),
111 wxT("MEDIUM SLATE BLUE"),
112 wxT("WHITE")
113 };
114
115 /*
116 * Generic wxFontDialog
117 */
118
119 wxGenericFontDialog::wxGenericFontDialog(void)
120 {
121 m_useEvents = FALSE;
122 dialogParent = NULL;
123 }
124
125 wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, wxFontData *data):
126 wxDialog(parent, -1, _("Font"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
127 {
128 m_useEvents = FALSE;
129 Create(parent, data);
130 }
131
132 wxGenericFontDialog::~wxGenericFontDialog(void)
133 {
134 }
135
136 void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
137 {
138 EndModal(wxID_CANCEL);
139 }
140
141 bool wxGenericFontDialog::Create(wxWindow *parent, wxFontData *data)
142 {
143 dialogParent = parent;
144
145 if (data)
146 fontData = *data;
147
148 InitializeFont();
149 CreateWidgets();
150
151 return TRUE;
152 }
153
154 int wxGenericFontDialog::ShowModal(void)
155 {
156 int ret = wxDialog::ShowModal();
157
158 if (ret != wxID_CANCEL)
159 {
160 fontData.chosenFont = dialogFont;
161 }
162
163 return ret;
164 }
165
166
167 void wxGenericFontDialog::OnPaint(wxPaintEvent& WXUNUSED(event))
168 {
169 wxPaintDC dc(this);
170 PaintFontBackground(dc);
171 PaintFont(dc);
172 }
173
174 /*
175 static void wxGenericChangeFontText(wxTextCtrl& text, wxCommandEvent& event)
176 {
177 if (event.GetEventType() == wxEVENT_TYPE_TEXT_ENTER_COMMAND)
178 {
179 wxGenericFontDialog *dialog = (wxGenericFontDialog *)text.GetParent();
180 dialog->OnChangeFont();
181 }
182 }
183 */
184
185 void wxGenericFontDialog::CreateWidgets(void)
186 {
187 wxBeginBusyCursor();
188
189 fontRect.x = 10;
190 #ifdef __X__
191 fontRect.y = 125;
192 #else
193 fontRect.y = 115;
194 #endif
195 fontRect.width = 430;
196 fontRect.height = 100;
197
198 /*
199 static char *families[] = { "Roman", "Decorative", "Modern", "Script", "Swiss" };
200 static char *styles[] = { "Normal", "Italic", "Slant" };
201 static char *weights[] = { "Normal", "Light", "Bold" };
202 */
203
204 wxString
205 *families = new wxString[6],
206 *styles = new wxString[3],
207 *weights = new wxString[3];
208 families[0] = _("Roman");
209 families[1] = _("Decorative");
210 families[2] = _("Modern");
211 families[3] = _("Script");
212 families[4] = _("Swiss" );
213 families[5] = _("Teletype" );
214 styles[0] = _("Normal");
215 styles[1] = _("Italic");
216 styles[2] = _("Slant");
217 weights[0] = _("Normal");
218 weights[1] = _("Light");
219 weights[2] = _("Bold");
220
221 int x=-1;
222 int y=40;
223 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxPoint(10, 10), wxSize(120, -1), 5, families);
224 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(170, 10), wxSize(120, -1), 3, styles);
225 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(330, 10), wxSize(120, -1), 3, weights);
226
227 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(180, -1), NUM_COLS, wxColourDialogNames);
228 #if 0 // def __WXMOTIF__ // TODO: This necessary now?
229 // We want the pointSizeText to line up on the y axis with the colourChoice
230 colourChoice->GetPosition(&fontRect.x, &y); //NL mod
231 y+=3; //NL mod
232 #endif
233
234 wxString *pointSizes = new wxString[40];
235 int i;
236 for ( i = 0; i < 40; i++)
237 {
238 char buf[5];
239 sprintf(buf, "%d", i + 1);
240 pointSizes[i] = buf;
241 }
242
243 pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(230, y), wxSize(50, -1), 40, pointSizes);
244 underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(320, y));
245
246 int rectY;
247 pointSizeChoice->GetPosition(&x, &rectY); //NL mod
248 fontRect.y = rectY;
249 pointSizeChoice->GetSize(&x, &y); //NL mod
250
251 // Calculate the position of the bottom of the pointSizeChoice, and place
252 // the fontRect there (+5 for a nice gap)
253
254 fontRect.y+=y+5; //NL mod
255
256 int by = (fontRect.y + fontRect.height + 15);
257
258 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(230, by), wxSize(75,-1));
259 (void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(330, by), wxSize(75,-1));
260
261 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
262 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
263 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
264 wxString name(wxTheColourDatabase->FindName(fontData.fontColour));
265 colourChoice->SetStringSelection(name);
266
267 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
268 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
269
270 okButton->SetDefault();
271
272 // SetClientSize(450, by + 40);
273 Fit();
274
275 Centre(wxBOTH);
276
277 wxEndBusyCursor();
278
279 delete[] families;
280 delete[] styles;
281 delete[] weights;
282 delete[] pointSizes;
283 m_useEvents = TRUE;
284 }
285
286 void wxGenericFontDialog::InitializeFont(void)
287 {
288 int fontFamily = wxSWISS;
289 int fontWeight = wxNORMAL;
290 int fontStyle = wxNORMAL;
291 int fontSize = 12;
292 int fontUnderline = FALSE;
293 if (fontData.initialFont.Ok())
294 {
295 fontFamily = fontData.initialFont.GetFamily();
296 fontWeight = fontData.initialFont.GetWeight();
297 fontStyle = fontData.initialFont.GetStyle();
298 fontSize = fontData.initialFont.GetPointSize();
299 fontUnderline = fontData.initialFont.GetUnderlined();
300 }
301 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
302 }
303
304 void wxGenericFontDialog::PaintFontBackground(wxDC& dc)
305 {
306 dc.BeginDrawing();
307
308 dc.SetPen(*wxBLACK_PEN);
309 dc.SetBrush(*wxWHITE_BRUSH);
310 dc.DrawRectangle( fontRect.x, fontRect.y, fontRect.width, fontRect.height);
311 dc.EndDrawing();
312 }
313
314 void wxGenericFontDialog::PaintFont(wxDC& dc)
315 {
316 dc.BeginDrawing();
317 if (dialogFont.Ok())
318 {
319 dc.SetFont(dialogFont);
320 // Calculate vertical centre
321 long w, h;
322 dc.GetTextExtent("X", &w, &h);
323 float cx = (float)(fontRect.x + 10);
324 float cy = (float)(fontRect.y + (fontRect.height/2.0) - (h/2.0));
325 dc.SetTextForeground(fontData.fontColour);
326 dc.SetClippingRegion( fontRect.x, fontRect.y, (long)(fontRect.width-2.0), (long)(fontRect.height-2.0));
327 dc.DrawText(_("ABCDEFGabcdefg12345"), (long)cx, (long)cy);
328 dc.DestroyClippingRegion();
329 dc.SetFont(wxNullFont);
330 }
331 dc.EndDrawing();
332 }
333
334 void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
335 {
336 if (!m_useEvents) return;
337
338 int fontFamily = 0; /* shut up buggy egcs warnings */
339 fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
340 int fontWeight = 0;
341 fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
342 int fontStyle = 0;
343 fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
344 int fontSize = wxAtoi(pointSizeChoice->GetStringSelection());
345 int fontUnderline = underLineCheckBox->GetValue();
346
347 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
348 if (colourChoice->GetStringSelection() != wxT(""))
349 {
350 wxColour *col = (wxColour*) NULL;
351 col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
352 if (col)
353 {
354 fontData.fontColour = *col;
355 }
356 }
357 wxClientDC dc(this);
358 PaintFontBackground(dc);
359 PaintFont(dc);
360 }
361
362 wxChar *wxFontWeightIntToString(int weight)
363 {
364 switch (weight)
365 {
366 case wxLIGHT:
367 return wxT("Light");
368 case wxBOLD:
369 return wxT("Bold");
370 case wxNORMAL:
371 default:
372 return wxT("Normal");
373 }
374 return wxT("Normal");
375 }
376
377 wxChar *wxFontStyleIntToString(int style)
378 {
379 switch (style)
380 {
381 case wxITALIC:
382 return wxT("Italic");
383 case wxSLANT:
384 return wxT("Slant");
385 case wxNORMAL:
386 default:
387 return wxT("Normal");
388 }
389 return wxT("Normal");
390 }
391
392 wxChar *wxFontFamilyIntToString(int family)
393 {
394 switch (family)
395 {
396 case wxROMAN:
397 return wxT("Roman");
398 case wxDECORATIVE:
399 return wxT("Decorative");
400 case wxMODERN:
401 return wxT("Modern");
402 case wxSCRIPT:
403 return wxT("Script");
404 case wxTELETYPE:
405 return wxT("Teletype");
406 case wxSWISS:
407 default:
408 return wxT("Swiss");
409 }
410 return wxT("Swiss");
411 }
412
413 int wxFontFamilyStringToInt(wxChar *family)
414 {
415 if (!family)
416 return wxSWISS;
417
418 if (wxStrcmp(family, wxT("Roman")) == 0)
419 return wxROMAN;
420 else if (wxStrcmp(family, wxT("Decorative")) == 0)
421 return wxDECORATIVE;
422 else if (wxStrcmp(family, wxT("Modern")) == 0)
423 return wxMODERN;
424 else if (wxStrcmp(family, wxT("Script")) == 0)
425 return wxSCRIPT;
426 else if (wxStrcmp(family, wxT("Teletype")) == 0)
427 return wxTELETYPE;
428 else return wxSWISS;
429 }
430
431 int wxFontStyleStringToInt(wxChar *style)
432 {
433 if (!style)
434 return wxNORMAL;
435 if (wxStrcmp(style, wxT("Italic")) == 0)
436 return wxITALIC;
437 else if (wxStrcmp(style, wxT("Slant")) == 0)
438 return wxSLANT;
439 else
440 return wxNORMAL;
441 }
442
443 int wxFontWeightStringToInt(wxChar *weight)
444 {
445 if (!weight)
446 return wxNORMAL;
447 if (wxStrcmp(weight, wxT("Bold")) == 0)
448 return wxBOLD;
449 else if (wxStrcmp(weight, wxT("Light")) == 0)
450 return wxLIGHT;
451 else
452 return wxNORMAL;
453 }
454
455