minor Configure / makefiles updates
[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 = 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 = atoi(pointSizeChoice->GetStringSelection());
345 int fontUnderline = underLineCheckBox->GetValue();
346
347 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
348 if (colourChoice->GetStringSelection() != "")
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 char *wxFontWeightIntToString(int weight)
363 {
364 switch (weight)
365 {
366 case wxLIGHT:
367 return "Light";
368 case wxBOLD:
369 return "Bold";
370 case wxNORMAL:
371 default:
372 return "Normal";
373 }
374 return "Normal";
375 }
376
377 char *wxFontStyleIntToString(int style)
378 {
379 switch (style)
380 {
381 case wxITALIC:
382 return "Italic";
383 case wxSLANT:
384 return "Slant";
385 case wxNORMAL:
386 default:
387 return "Normal";
388 }
389 return "Normal";
390 }
391
392 char *wxFontFamilyIntToString(int family)
393 {
394 switch (family)
395 {
396 case wxROMAN:
397 return "Roman";
398 case wxDECORATIVE:
399 return "Decorative";
400 case wxMODERN:
401 return "Modern";
402 case wxSCRIPT:
403 return "Script";
404 case wxSWISS:
405 default:
406 return "Swiss";
407 }
408 return "Swiss";
409 }
410
411 int wxFontFamilyStringToInt(char *family)
412 {
413 if (!family)
414 return wxSWISS;
415
416 if (strcmp(family, "Roman") == 0)
417 return wxROMAN;
418 else if (strcmp(family, "Decorative") == 0)
419 return wxDECORATIVE;
420 else if (strcmp(family, "Modern") == 0)
421 return wxMODERN;
422 else if (strcmp(family, "Script") == 0)
423 return wxSCRIPT;
424 else return wxSWISS;
425 }
426
427 int wxFontStyleStringToInt(char *style)
428 {
429 if (!style)
430 return wxNORMAL;
431 if (strcmp(style, "Italic") == 0)
432 return wxITALIC;
433 else if (strcmp(style, "Slant") == 0)
434 return wxSLANT;
435 else
436 return wxNORMAL;
437 }
438
439 int wxFontWeightStringToInt(char *weight)
440 {
441 if (!weight)
442 return wxNORMAL;
443 if (strcmp(weight, "Bold") == 0)
444 return wxBOLD;
445 else if (strcmp(weight, "Light") == 0)
446 return wxLIGHT;
447 else
448 return wxNORMAL;
449 }
450
451