]> git.saurik.com Git - wxWidgets.git/blame - src/generic/fontdlgg.cpp
bug fix for m_parent == NULL
[wxWidgets.git] / src / generic / fontdlgg.cpp
CommitLineData
c801d85f
KB
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
c35414db 9// Licence: wxWindows license
c801d85f
KB
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"
1a5a8367 34#include <wx/intl.h>
c801d85f
KB
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)
c35414db
VZ
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)
c801d85f
KB
55END_EVENT_TABLE()
56
57#endif
58
59#define NUM_COLS 48
6836fded 60static wxString wxColourDialogNames[NUM_COLS]={_T("ORANGE"),
c35414db
VZ
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 };
c801d85f
KB
114
115/*
116 * Generic wxFontDialog
117 */
118
119wxGenericFontDialog::wxGenericFontDialog(void)
120{
66bd6b93 121 m_useEvents = FALSE;
c801d85f
KB
122 dialogParent = NULL;
123}
124
125wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, wxFontData *data):
1a5a8367 126 wxDialog(parent, -1, _("Font"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
c801d85f 127{
66bd6b93 128 m_useEvents = FALSE;
c801d85f
KB
129 Create(parent, data);
130}
131
132wxGenericFontDialog::~wxGenericFontDialog(void)
133{
134}
135
74e3313b 136void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
c801d85f 137{
e3065973 138 EndModal(wxID_CANCEL);
c801d85f 139}
c35414db 140
c801d85f
KB
141bool wxGenericFontDialog::Create(wxWindow *parent, wxFontData *data)
142{
143 dialogParent = parent;
c35414db 144
c801d85f
KB
145 if (data)
146 fontData = *data;
147
148 InitializeFont();
149 CreateWidgets();
c35414db 150
c801d85f
KB
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
c35414db 163 return ret;
c801d85f
KB
164}
165
166
167void wxGenericFontDialog::OnPaint(wxPaintEvent& event)
168{
c801d85f
KB
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
b527aac5 189 fontRect.x = 10;
c801d85f
KB
190#ifdef __X__
191 fontRect.y = 125;
192#else
193 fontRect.y = 115;
194#endif
b527aac5 195 fontRect.width = 430;
c801d85f
KB
196 fontRect.height = 100;
197
59043ba2
KB
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 */
c35414db 203
59043ba2 204 wxString
36b3b54a 205 *families = new wxString[6],
59043ba2
KB
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" );
36b3b54a 213 families[5] = _("Teletype" );
59043ba2
KB
214 styles[0] = _("Normal");
215 styles[1] = _("Italic");
216 styles[2] = _("Slant");
217 weights[0] = _("Normal");
218 weights[1] = _("Light");
219 weights[2] = _("Bold");
c35414db 220
c801d85f
KB
221 int x=-1;
222 int y=40;
223 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxPoint(10, 10), wxSize(120, -1), 5, families);
98ffbab9
JS
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);
c801d85f 226
98ffbab9 227 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(180, -1), NUM_COLS, wxColourDialogNames);
c030b70f 228#if 0 // def __WXMOTIF__ // TODO: This necessary now?
c801d85f
KB
229 // We want the pointSizeText to line up on the y axis with the colourChoice
230 colourChoice->GetPosition(&fontRect.x, &y); //NL mod
c35414db 231 y+=3; //NL mod
c801d85f
KB
232#endif
233
59043ba2 234 wxString *pointSizes = new wxString[40];
c801d85f
KB
235 int i;
236 for ( i = 0; i < 40; i++)
237 {
c35414db
VZ
238 char buf[5];
239 sprintf(buf, "%d", i + 1);
240 pointSizes[i] = buf;
c801d85f
KB
241 }
242
55acd85e
JS
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));
c801d85f
KB
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
c35414db 252 // the fontRect there (+5 for a nice gap)
c801d85f
KB
253
254 fontRect.y+=y+5; //NL mod
255
3502e687 256 int by = (fontRect.y + fontRect.height + 15);
c801d85f 257
3502e687
RR
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));
c801d85f 260
66bd6b93 261 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
c801d85f
KB
262 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
263 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
264 wxString name(wxTheColourDatabase->FindName(fontData.fontColour));
265 colourChoice->SetStringSelection(name);
c35414db 266
c801d85f 267 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
66bd6b93 268 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
c801d85f
KB
269
270 okButton->SetDefault();
271
98ffbab9
JS
272 // SetClientSize(450, by + 40);
273 Fit();
c801d85f
KB
274
275 Centre(wxBOTH);
276
277 wxEndBusyCursor();
59043ba2
KB
278
279 delete[] families;
280 delete[] styles;
281 delete[] weights;
282 delete[] pointSizes;
66bd6b93 283 m_useEvents = TRUE;
c801d85f
KB
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));
c801d85f
KB
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));
1a5a8367 327 dc.DrawText(_("ABCDEFGabcdefg12345"), (long)cx, (long)cy);
c801d85f 328 dc.DestroyClippingRegion();
c35414db 329 dc.SetFont(wxNullFont);
c801d85f
KB
330 }
331 dc.EndDrawing();
332}
333
334void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
335{
66bd6b93 336 if (!m_useEvents) return;
c35414db 337
bbe0af5b
RR
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());
87138c52 344 int fontSize = wxAtoi(pointSizeChoice->GetStringSelection());
c801d85f
KB
345 int fontUnderline = underLineCheckBox->GetValue();
346
347 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
87138c52 348 if (colourChoice->GetStringSelection() != _T(""))
c801d85f 349 {
bbe0af5b
RR
350 wxColour *col = (wxColour*) NULL;
351 col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
c801d85f
KB
352 if (col)
353 {
354 fontData.fontColour = *col;
355 }
356 }
357 wxClientDC dc(this);
358 PaintFontBackground(dc);
359 PaintFont(dc);
360}
361
87138c52 362wxChar *wxFontWeightIntToString(int weight)
c801d85f
KB
363{
364 switch (weight)
365 {
366 case wxLIGHT:
87138c52 367 return _T("Light");
c801d85f 368 case wxBOLD:
87138c52 369 return _T("Bold");
c801d85f
KB
370 case wxNORMAL:
371 default:
87138c52 372 return _T("Normal");
c801d85f 373 }
87138c52 374 return _T("Normal");
c801d85f
KB
375}
376
87138c52 377wxChar *wxFontStyleIntToString(int style)
c801d85f
KB
378{
379 switch (style)
380 {
381 case wxITALIC:
87138c52 382 return _T("Italic");
c801d85f 383 case wxSLANT:
87138c52 384 return _T("Slant");
c801d85f
KB
385 case wxNORMAL:
386 default:
87138c52 387 return _T("Normal");
c801d85f 388 }
87138c52 389 return _T("Normal");
c801d85f
KB
390}
391
87138c52 392wxChar *wxFontFamilyIntToString(int family)
c801d85f
KB
393{
394 switch (family)
395 {
396 case wxROMAN:
87138c52 397 return _T("Roman");
c801d85f 398 case wxDECORATIVE:
87138c52 399 return _T("Decorative");
c801d85f 400 case wxMODERN:
87138c52 401 return _T("Modern");
c801d85f 402 case wxSCRIPT:
87138c52 403 return _T("Script");
36b3b54a 404 case wxTELETYPE:
87138c52 405 return _T("Teletype");
c801d85f
KB
406 case wxSWISS:
407 default:
87138c52 408 return _T("Swiss");
c801d85f 409 }
87138c52 410 return _T("Swiss");
c801d85f
KB
411}
412
87138c52 413int wxFontFamilyStringToInt(wxChar *family)
c801d85f
KB
414{
415 if (!family)
416 return wxSWISS;
c35414db 417
87138c52 418 if (wxStrcmp(family, _T("Roman")) == 0)
c801d85f 419 return wxROMAN;
87138c52 420 else if (wxStrcmp(family, _T("Decorative")) == 0)
c801d85f 421 return wxDECORATIVE;
87138c52 422 else if (wxStrcmp(family, _T("Modern")) == 0)
c801d85f 423 return wxMODERN;
87138c52 424 else if (wxStrcmp(family, _T("Script")) == 0)
c801d85f 425 return wxSCRIPT;
87138c52 426 else if (wxStrcmp(family, _T("Teletype")) == 0)
36b3b54a 427 return wxTELETYPE;
c801d85f
KB
428 else return wxSWISS;
429}
430
87138c52 431int wxFontStyleStringToInt(wxChar *style)
c801d85f
KB
432{
433 if (!style)
434 return wxNORMAL;
87138c52 435 if (wxStrcmp(style, _T("Italic")) == 0)
c801d85f 436 return wxITALIC;
87138c52 437 else if (wxStrcmp(style, _T("Slant")) == 0)
c801d85f
KB
438 return wxSLANT;
439 else
440 return wxNORMAL;
441}
442
87138c52 443int wxFontWeightStringToInt(wxChar *weight)
c801d85f
KB
444{
445 if (!weight)
446 return wxNORMAL;
87138c52 447 if (wxStrcmp(weight, _T("Bold")) == 0)
c801d85f 448 return wxBOLD;
87138c52 449 else if (wxStrcmp(weight, _T("Light")) == 0)
c801d85f
KB
450 return wxLIGHT;
451 else
452 return wxNORMAL;
453}
454
455