]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/generic/fontdlgg.cpp
bug fix for m_parent == NULL
[wxWidgets.git] / src / generic / fontdlgg.cpp
... / ...
CommitLineData
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
44IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog, wxDialog)
45
46BEGIN_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)
55END_EVENT_TABLE()
56
57#endif
58
59#define NUM_COLS 48
60static 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
119wxGenericFontDialog::wxGenericFontDialog(void)
120{
121 m_useEvents = FALSE;
122 dialogParent = NULL;
123}
124
125wxGenericFontDialog::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
132wxGenericFontDialog::~wxGenericFontDialog(void)
133{
134}
135
136void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
137{
138 EndModal(wxID_CANCEL);
139}
140
141bool 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
154int 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
167void wxGenericFontDialog::OnPaint(wxPaintEvent& event)
168{
169 wxPaintDC dc(this);
170 PaintFontBackground(dc);
171 PaintFont(dc);
172}
173
174/*
175static 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
185void 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
286void 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
304void 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
314void 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
334void 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
362wxChar *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
377wxChar *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
392wxChar *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
413int 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
431int 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
443int 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