distribution things
[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]={"ORANGE",
61 "GOLDENROD",
62 "WHEAT",
63 "SPRING GREEN",
64 "SKY BLUE",
65 "SLATE BLUE",
66 "MEDIUM VIOLET RED",
67 "PURPLE",
68
69 "RED",
70 "YELLOW",
71 "MEDIUM SPRING GREEN",
72 "PALE GREEN",
73 "CYAN",
74 "LIGHT STEEL BLUE",
75 "ORCHID",
76 "LIGHT MAGENTA",
77
78 "BROWN",
79 "YELLOW",
80 "GREEN",
81 "CADET BLUE",
82 "MEDIUM BLUE",
83 "MAGENTA",
84 "MAROON",
85 "ORANGE RED",
86
87 "FIREBRICK",
88 "CORAL",
89 "FOREST GREEN",
90 "AQUARAMINE",
91 "BLUE",
92 "NAVY",
93 "THISTLE",
94 "MEDIUM VIOLET RED",
95
96 "INDIAN RED",
97 "GOLD",
98 "MEDIUM SEA GREEN",
99 "MEDIUM BLUE",
100 "MIDNIGHT BLUE",
101 "GREY",
102 "PURPLE",
103 "KHAKI",
104
105 "BLACK",
106 "MEDIUM FOREST GREEN",
107 "KHAKI",
108 "DARK GREY",
109 "SEA GREEN",
110 "LIGHT GREY",
111 "MEDIUM SLATE BLUE",
112 "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& 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 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[6],
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 families[5] = _("Teletype" );
216 styles[0] = _("Normal");
217 styles[1] = _("Italic");
218 styles[2] = _("Slant");
219 weights[0] = _("Normal");
220 weights[1] = _("Light");
221 weights[2] = _("Bold");
222
223 int x=-1;
224 int y=40;
225 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxPoint(10, 10), wxSize(120, -1), 5, families);
226 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(170, 10), wxSize(120, -1), 3, styles);
227 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(330, 10), wxSize(120, -1), 3, weights);
228
229 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(180, -1), NUM_COLS, wxColourDialogNames);
230 #if 0 // def __WXMOTIF__ // TODO: This necessary now?
231 // We want the pointSizeText to line up on the y axis with the colourChoice
232 colourChoice->GetPosition(&fontRect.x, &y); //NL mod
233 y+=3; //NL mod
234 #endif
235
236 wxString *pointSizes = new wxString[40];
237 int i;
238 for ( i = 0; i < 40; i++)
239 {
240 char buf[5];
241 sprintf(buf, "%d", i + 1);
242 pointSizes[i] = buf;
243 }
244
245 pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(230, y), wxSize(50, -1), 40, pointSizes);
246 underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(320, y));
247
248 int rectY;
249 pointSizeChoice->GetPosition(&x, &rectY); //NL mod
250 fontRect.y = rectY;
251 pointSizeChoice->GetSize(&x, &y); //NL mod
252
253 // Calculate the position of the bottom of the pointSizeChoice, and place
254 // the fontRect there (+5 for a nice gap)
255
256 fontRect.y+=y+5; //NL mod
257
258 int by = (fontRect.y + fontRect.height + 15);
259
260 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(230, by), wxSize(75,-1));
261 (void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(330, by), wxSize(75,-1));
262
263 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
264 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
265 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
266 wxString name(wxTheColourDatabase->FindName(fontData.fontColour));
267 colourChoice->SetStringSelection(name);
268
269 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
270 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
271
272 okButton->SetDefault();
273
274 // SetClientSize(450, by + 40);
275 Fit();
276
277 Centre(wxBOTH);
278
279 wxEndBusyCursor();
280
281 delete[] families;
282 delete[] styles;
283 delete[] weights;
284 delete[] pointSizes;
285 m_useEvents = TRUE;
286 }
287
288 void wxGenericFontDialog::InitializeFont(void)
289 {
290 int fontFamily = wxSWISS;
291 int fontWeight = wxNORMAL;
292 int fontStyle = wxNORMAL;
293 int fontSize = 12;
294 int fontUnderline = FALSE;
295 if (fontData.initialFont.Ok())
296 {
297 fontFamily = fontData.initialFont.GetFamily();
298 fontWeight = fontData.initialFont.GetWeight();
299 fontStyle = fontData.initialFont.GetStyle();
300 fontSize = fontData.initialFont.GetPointSize();
301 fontUnderline = fontData.initialFont.GetUnderlined();
302 }
303 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
304 }
305
306 void wxGenericFontDialog::PaintFontBackground(wxDC& dc)
307 {
308 dc.BeginDrawing();
309
310 dc.SetPen(*wxBLACK_PEN);
311 dc.SetBrush(*wxWHITE_BRUSH);
312 dc.DrawRectangle( fontRect.x, fontRect.y, fontRect.width, fontRect.height);
313 dc.EndDrawing();
314 }
315
316 void wxGenericFontDialog::PaintFont(wxDC& dc)
317 {
318 dc.BeginDrawing();
319 if (dialogFont.Ok())
320 {
321 dc.SetFont(dialogFont);
322 // Calculate vertical centre
323 long w, h;
324 dc.GetTextExtent("X", &w, &h);
325 float cx = (float)(fontRect.x + 10);
326 float cy = (float)(fontRect.y + (fontRect.height/2.0) - (h/2.0));
327 dc.SetTextForeground(fontData.fontColour);
328 dc.SetClippingRegion( fontRect.x, fontRect.y, (long)(fontRect.width-2.0), (long)(fontRect.height-2.0));
329 dc.DrawText(_("ABCDEFGabcdefg12345"), (long)cx, (long)cy);
330 dc.DestroyClippingRegion();
331 dc.SetFont(wxNullFont);
332 }
333 dc.EndDrawing();
334 }
335
336 void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
337 {
338 if (!m_useEvents) return;
339
340 int fontFamily = 0; /* shut up buggy egcs warnings */
341 fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
342 int fontWeight = 0;
343 fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
344 int fontStyle = 0;
345 fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
346 int fontSize = atoi(pointSizeChoice->GetStringSelection());
347 int fontUnderline = underLineCheckBox->GetValue();
348
349 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
350 if (colourChoice->GetStringSelection() != "")
351 {
352 wxColour *col = (wxColour*) NULL;
353 col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
354 if (col)
355 {
356 fontData.fontColour = *col;
357 }
358 }
359 wxClientDC dc(this);
360 PaintFontBackground(dc);
361 PaintFont(dc);
362 }
363
364 char *wxFontWeightIntToString(int weight)
365 {
366 switch (weight)
367 {
368 case wxLIGHT:
369 return "Light";
370 case wxBOLD:
371 return "Bold";
372 case wxNORMAL:
373 default:
374 return "Normal";
375 }
376 return "Normal";
377 }
378
379 char *wxFontStyleIntToString(int style)
380 {
381 switch (style)
382 {
383 case wxITALIC:
384 return "Italic";
385 case wxSLANT:
386 return "Slant";
387 case wxNORMAL:
388 default:
389 return "Normal";
390 }
391 return "Normal";
392 }
393
394 char *wxFontFamilyIntToString(int family)
395 {
396 switch (family)
397 {
398 case wxROMAN:
399 return "Roman";
400 case wxDECORATIVE:
401 return "Decorative";
402 case wxMODERN:
403 return "Modern";
404 case wxSCRIPT:
405 return "Script";
406 case wxTELETYPE:
407 return "Teletype";
408 case wxSWISS:
409 default:
410 return "Swiss";
411 }
412 return "Swiss";
413 }
414
415 int wxFontFamilyStringToInt(char *family)
416 {
417 if (!family)
418 return wxSWISS;
419
420 if (strcmp(family, "Roman") == 0)
421 return wxROMAN;
422 else if (strcmp(family, "Decorative") == 0)
423 return wxDECORATIVE;
424 else if (strcmp(family, "Modern") == 0)
425 return wxMODERN;
426 else if (strcmp(family, "Script") == 0)
427 return wxSCRIPT;
428 else if (strcmp(family, "Teletype") == 0)
429 return wxTELETYPE;
430 else return wxSWISS;
431 }
432
433 int wxFontStyleStringToInt(char *style)
434 {
435 if (!style)
436 return wxNORMAL;
437 if (strcmp(style, "Italic") == 0)
438 return wxITALIC;
439 else if (strcmp(style, "Slant") == 0)
440 return wxSLANT;
441 else
442 return wxNORMAL;
443 }
444
445 int wxFontWeightStringToInt(char *weight)
446 {
447 if (!weight)
448 return wxNORMAL;
449 if (strcmp(weight, "Bold") == 0)
450 return wxBOLD;
451 else if (strcmp(weight, "Light") == 0)
452 return wxLIGHT;
453 else
454 return wxNORMAL;
455 }
456
457