misc minor fixes I forgot to commit before
[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]={_T("ORANGE"),
61 _T("GOLDENROD"),
62 _T("WHEAT"),
63 _T("SPRING GREEN"),
64 _T("SKY BLUE"),
65 _T("SLATE BLUE"),
66 _T("MEDIUM VIOLET RED"),
67 _T("PURPLE"),
68
69 _T("RED"),
70 _T("YELLOW"),
71 _T("MEDIUM SPRING GREEN"),
72 _T("PALE GREEN"),
73 _T("CYAN"),
74 _T("LIGHT STEEL BLUE"),
75 _T("ORCHID"),
76 _T("LIGHT MAGENTA"),
77
78 _T("BROWN"),
79 _T("YELLOW"),
80 _T("GREEN"),
81 _T("CADET BLUE"),
82 _T("MEDIUM BLUE"),
83 _T("MAGENTA"),
84 _T("MAROON"),
85 _T("ORANGE RED"),
86
87 _T("FIREBRICK"),
88 _T("CORAL"),
89 _T("FOREST GREEN"),
90 _T("AQUARAMINE"),
91 _T("BLUE"),
92 _T("NAVY"),
93 _T("THISTLE"),
94 _T("MEDIUM VIOLET RED"),
95
96 _T("INDIAN RED"),
97 _T("GOLD"),
98 _T("MEDIUM SEA GREEN"),
99 _T("MEDIUM BLUE"),
100 _T("MIDNIGHT BLUE"),
101 _T("GREY"),
102 _T("PURPLE"),
103 _T("KHAKI"),
104
105 _T("BLACK"),
106 _T("MEDIUM FOREST GREEN"),
107 _T("KHAKI"),
108 _T("DARK GREY"),
109 _T("SEA GREEN"),
110 _T("LIGHT GREY"),
111 _T("MEDIUM SLATE BLUE"),
112 _T("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& 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() != _T(""))
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 _T("Light");
368 case wxBOLD:
369 return _T("Bold");
370 case wxNORMAL:
371 default:
372 return _T("Normal");
373 }
374 return _T("Normal");
375 }
376
377 wxChar *wxFontStyleIntToString(int style)
378 {
379 switch (style)
380 {
381 case wxITALIC:
382 return _T("Italic");
383 case wxSLANT:
384 return _T("Slant");
385 case wxNORMAL:
386 default:
387 return _T("Normal");
388 }
389 return _T("Normal");
390 }
391
392 wxChar *wxFontFamilyIntToString(int family)
393 {
394 switch (family)
395 {
396 case wxROMAN:
397 return _T("Roman");
398 case wxDECORATIVE:
399 return _T("Decorative");
400 case wxMODERN:
401 return _T("Modern");
402 case wxSCRIPT:
403 return _T("Script");
404 case wxTELETYPE:
405 return _T("Teletype");
406 case wxSWISS:
407 default:
408 return _T("Swiss");
409 }
410 return _T("Swiss");
411 }
412
413 int wxFontFamilyStringToInt(wxChar *family)
414 {
415 if (!family)
416 return wxSWISS;
417
418 if (wxStrcmp(family, _T("Roman")) == 0)
419 return wxROMAN;
420 else if (wxStrcmp(family, _T("Decorative")) == 0)
421 return wxDECORATIVE;
422 else if (wxStrcmp(family, _T("Modern")) == 0)
423 return wxMODERN;
424 else if (wxStrcmp(family, _T("Script")) == 0)
425 return wxSCRIPT;
426 else if (wxStrcmp(family, _T("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, _T("Italic")) == 0)
436 return wxITALIC;
437 else if (wxStrcmp(style, _T("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, _T("Bold")) == 0)
448 return wxBOLD;
449 else if (wxStrcmp(weight, _T("Light")) == 0)
450 return wxLIGHT;
451 else
452 return wxNORMAL;
453 }
454
455