]> git.saurik.com Git - wxWidgets.git/blob - src/generic/fontdlgg.cpp
fix for a fatal bug in wxMGL's wxDir
[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 #if wxUSE_FONTDLG && (!defined(__WXGTK__) || defined(__WXUNIVERSAL__))
24
25 #ifndef WX_PRECOMP
26 #include <stdio.h>
27 #include "wx/utils.h"
28 #include "wx/dialog.h"
29 #include "wx/listbox.h"
30 #include "wx/button.h"
31 #include "wx/stattext.h"
32 #include "wx/layout.h"
33 #include "wx/dcclient.h"
34 #include "wx/choice.h"
35 #include "wx/checkbox.h"
36 #include "wx/intl.h"
37 #endif
38
39 #include <string.h>
40 #include <stdlib.h>
41
42 #include "wx/cmndata.h"
43 #include "wx/generic/fontdlgg.h"
44
45 IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog, wxDialog)
46
47 BEGIN_EVENT_TABLE(wxGenericFontDialog, wxDialog)
48 EVT_CHECKBOX(wxID_FONT_UNDERLINE, wxGenericFontDialog::OnChangeFont)
49 EVT_CHOICE(wxID_FONT_STYLE, wxGenericFontDialog::OnChangeFont)
50 EVT_CHOICE(wxID_FONT_WEIGHT, wxGenericFontDialog::OnChangeFont)
51 EVT_CHOICE(wxID_FONT_FAMILY, wxGenericFontDialog::OnChangeFont)
52 EVT_CHOICE(wxID_FONT_COLOUR, wxGenericFontDialog::OnChangeFont)
53 EVT_CHOICE(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont)
54 EVT_PAINT(wxGenericFontDialog::OnPaint)
55 EVT_CLOSE(wxGenericFontDialog::OnCloseWindow)
56 END_EVENT_TABLE()
57
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 }
375
376 wxChar *wxFontStyleIntToString(int style)
377 {
378 switch (style)
379 {
380 case wxITALIC:
381 return wxT("Italic");
382 case wxSLANT:
383 return wxT("Slant");
384 case wxNORMAL:
385 default:
386 return wxT("Normal");
387 }
388 }
389
390 wxChar *wxFontFamilyIntToString(int family)
391 {
392 switch (family)
393 {
394 case wxROMAN:
395 return wxT("Roman");
396 case wxDECORATIVE:
397 return wxT("Decorative");
398 case wxMODERN:
399 return wxT("Modern");
400 case wxSCRIPT:
401 return wxT("Script");
402 case wxTELETYPE:
403 return wxT("Teletype");
404 case wxSWISS:
405 default:
406 return wxT("Swiss");
407 }
408 }
409
410 int wxFontFamilyStringToInt(wxChar *family)
411 {
412 if (!family)
413 return wxSWISS;
414
415 if (wxStrcmp(family, wxT("Roman")) == 0)
416 return wxROMAN;
417 else if (wxStrcmp(family, wxT("Decorative")) == 0)
418 return wxDECORATIVE;
419 else if (wxStrcmp(family, wxT("Modern")) == 0)
420 return wxMODERN;
421 else if (wxStrcmp(family, wxT("Script")) == 0)
422 return wxSCRIPT;
423 else if (wxStrcmp(family, wxT("Teletype")) == 0)
424 return wxTELETYPE;
425 else return wxSWISS;
426 }
427
428 int wxFontStyleStringToInt(wxChar *style)
429 {
430 if (!style)
431 return wxNORMAL;
432 if (wxStrcmp(style, wxT("Italic")) == 0)
433 return wxITALIC;
434 else if (wxStrcmp(style, wxT("Slant")) == 0)
435 return wxSLANT;
436 else
437 return wxNORMAL;
438 }
439
440 int wxFontWeightStringToInt(wxChar *weight)
441 {
442 if (!weight)
443 return wxNORMAL;
444 if (wxStrcmp(weight, wxT("Bold")) == 0)
445 return wxBOLD;
446 else if (wxStrcmp(weight, wxT("Light")) == 0)
447 return wxLIGHT;
448 else
449 return wxNORMAL;
450 }
451
452 #endif
453 // wxUSE_FONTDLG
454