]> git.saurik.com Git - wxWidgets.git/blob - src/generic/fontdlgg.cpp
Fixed nasty bug wxFont
[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 END_EVENT_TABLE()
55
56 #endif
57
58 #define NUM_COLS 48
59 static wxString wxColourDialogNames[NUM_COLS]={"ORANGE",
60 "GOLDENROD",
61 "WHEAT",
62 "SPRING GREEN",
63 "SKY BLUE",
64 "SLATE BLUE",
65 "MEDIUM VIOLET RED",
66 "PURPLE",
67
68 "RED",
69 "YELLOW",
70 "MEDIUM SPRING GREEN",
71 "PALE GREEN",
72 "CYAN",
73 "LIGHT STEEL BLUE",
74 "ORCHID",
75 "LIGHT MAGENTA",
76
77 "BROWN",
78 "YELLOW",
79 "GREEN",
80 "CADET BLUE",
81 "MEDIUM BLUE",
82 "MAGENTA",
83 "MAROON",
84 "ORANGE RED",
85
86 "FIREBRICK",
87 "CORAL",
88 "FOREST GREEN",
89 "AQUARAMINE",
90 "BLUE",
91 "NAVY",
92 "THISTLE",
93 "MEDIUM VIOLET RED",
94
95 "INDIAN RED",
96 "GOLD",
97 "MEDIUM SEA GREEN",
98 "MEDIUM BLUE",
99 "MIDNIGHT BLUE",
100 "GREY",
101 "PURPLE",
102 "KHAKI",
103
104 "BLACK",
105 "MEDIUM FOREST GREEN",
106 "KHAKI",
107 "DARK GREY",
108 "SEA GREEN",
109 "LIGHT GREY",
110 "MEDIUM SLATE BLUE",
111 "WHITE"
112 };
113
114 /*
115 * Generic wxFontDialog
116 */
117
118 wxGenericFontDialog::wxGenericFontDialog(void)
119 {
120 m_useEvents = FALSE;
121 dialogParent = NULL;
122 }
123
124 wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, wxFontData *data):
125 wxDialog(parent, -1, _("Font"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
126 {
127 m_useEvents = FALSE;
128 Create(parent, data);
129 }
130
131 wxGenericFontDialog::~wxGenericFontDialog(void)
132 {
133 }
134
135 bool wxGenericFontDialog::OnClose(void)
136 {
137 Show(FALSE);
138 return FALSE;
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& event)
168 {
169 wxDialog::OnPaint(event);
170
171 wxPaintDC dc(this);
172 PaintFontBackground(dc);
173 PaintFont(dc);
174 }
175
176 /*
177 static void wxGenericChangeFontText(wxTextCtrl& text, wxCommandEvent& event)
178 {
179 if (event.GetEventType() == wxEVENT_TYPE_TEXT_ENTER_COMMAND)
180 {
181 wxGenericFontDialog *dialog = (wxGenericFontDialog *)text.GetParent();
182 dialog->OnChangeFont();
183 }
184 }
185 */
186
187 void wxGenericFontDialog::CreateWidgets(void)
188 {
189 wxBeginBusyCursor();
190
191 fontRect.x = 10;
192 #ifdef __X__
193 fontRect.y = 125;
194 #else
195 fontRect.y = 115;
196 #endif
197 fontRect.width = 430;
198 fontRect.height = 100;
199
200 /*
201 static char *families[] = { "Roman", "Decorative", "Modern", "Script", "Swiss" };
202 static char *styles[] = { "Normal", "Italic", "Slant" };
203 static char *weights[] = { "Normal", "Light", "Bold" };
204 */
205
206 wxString
207 *families = new wxString[5],
208 *styles = new wxString[3],
209 *weights = new wxString[3];
210 families[0] = _("Roman");
211 families[1] = _("Decorative");
212 families[2] = _("Modern");
213 families[3] = _("Script");
214 families[4] = _("Swiss" );
215 styles[0] = _("Normal");
216 styles[1] = _("Italic");
217 styles[2] = _("Slant");
218 weights[0] = _("Normal");
219 weights[1] = _("Light");
220 weights[2] = _("Bold");
221
222 int x=-1;
223 int y=40;
224 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxPoint(10, 10), wxSize(120, -1), 5, families);
225 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(160, 10), wxSize(120, -1), 3, styles);
226 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(310, 10), wxSize(120, -1), 3, weights);
227
228 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(190, -1), NUM_COLS, wxColourDialogNames);
229 #if 0 // def __WXMOTIF__ // TODO: This necessary now?
230 // We want the pointSizeText to line up on the y axis with the colourChoice
231 colourChoice->GetPosition(&fontRect.x, &y); //NL mod
232 y+=3; //NL mod
233 #endif
234
235 wxString *pointSizes = new wxString[40];
236 int i;
237 for ( i = 0; i < 40; i++)
238 {
239 char buf[5];
240 sprintf(buf, "%d", i + 1);
241 pointSizes[i] = buf;
242 }
243
244 pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(230, y), wxSize(50, -1), 40, pointSizes);
245 underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(320, y));
246
247 int rectY;
248 pointSizeChoice->GetPosition(&x, &rectY); //NL mod
249 fontRect.y = rectY;
250 pointSizeChoice->GetSize(&x, &y); //NL mod
251
252 // Calculate the position of the bottom of the pointSizeChoice, and place
253 // the fontRect there (+5 for a nice gap)
254
255 fontRect.y+=y+5; //NL mod
256
257 int by = (fontRect.y + fontRect.height + 10);
258
259 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(220, by), wxSize(100,-1));
260 (void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(340, by), wxSize(100,-1));
261
262 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
263 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
264 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
265 wxString name(wxTheColourDatabase->FindName(fontData.fontColour));
266 colourChoice->SetStringSelection(name);
267
268 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
269 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
270
271 okButton->SetDefault();
272
273 SetClientSize(450, by + 40);
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 = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
339 int fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
340 int fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
341 int fontSize = atoi(pointSizeChoice->GetStringSelection());
342 int fontUnderline = underLineCheckBox->GetValue();
343
344 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
345 if (colourChoice->GetStringSelection() != "")
346 {
347 wxColour *col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
348 if (col)
349 {
350 fontData.fontColour = *col;
351 }
352 }
353 wxClientDC dc(this);
354 PaintFontBackground(dc);
355 PaintFont(dc);
356 }
357
358 char *wxFontWeightIntToString(int weight)
359 {
360 switch (weight)
361 {
362 case wxLIGHT:
363 return "Light";
364 case wxBOLD:
365 return "Bold";
366 case wxNORMAL:
367 default:
368 return "Normal";
369 }
370 return "Normal";
371 }
372
373 char *wxFontStyleIntToString(int style)
374 {
375 switch (style)
376 {
377 case wxITALIC:
378 return "Italic";
379 case wxSLANT:
380 return "Slant";
381 case wxNORMAL:
382 default:
383 return "Normal";
384 }
385 return "Normal";
386 }
387
388 char *wxFontFamilyIntToString(int family)
389 {
390 switch (family)
391 {
392 case wxROMAN:
393 return "Roman";
394 case wxDECORATIVE:
395 return "Decorative";
396 case wxMODERN:
397 return "Modern";
398 case wxSCRIPT:
399 return "Script";
400 case wxSWISS:
401 default:
402 return "Swiss";
403 }
404 return "Swiss";
405 }
406
407 int wxFontFamilyStringToInt(char *family)
408 {
409 if (!family)
410 return wxSWISS;
411
412 if (strcmp(family, "Roman") == 0)
413 return wxROMAN;
414 else if (strcmp(family, "Decorative") == 0)
415 return wxDECORATIVE;
416 else if (strcmp(family, "Modern") == 0)
417 return wxMODERN;
418 else if (strcmp(family, "Script") == 0)
419 return wxSCRIPT;
420 else return wxSWISS;
421 }
422
423 int wxFontStyleStringToInt(char *style)
424 {
425 if (!style)
426 return wxNORMAL;
427 if (strcmp(style, "Italic") == 0)
428 return wxITALIC;
429 else if (strcmp(style, "Slant") == 0)
430 return wxSLANT;
431 else
432 return wxNORMAL;
433 }
434
435 int wxFontWeightStringToInt(char *weight)
436 {
437 if (!weight)
438 return wxNORMAL;
439 if (strcmp(weight, "Bold") == 0)
440 return wxBOLD;
441 else if (strcmp(weight, "Light") == 0)
442 return wxLIGHT;
443 else
444 return wxNORMAL;
445 }
446
447