]> git.saurik.com Git - wxWidgets.git/blame - src/generic/fontdlgg.cpp
fix crash when the user code refuses to validate the new text when editing the item...
[wxWidgets.git] / src / generic / fontdlgg.cpp
CommitLineData
c801d85f 1/////////////////////////////////////////////////////////////////////////////
c2c59b22 2// Name: src/generic/fontdlgg.cpp
c801d85f
KB
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
4234ea8b
VZ
23#if wxUSE_FONTDLG && (!defined(__WXGTK__) || defined(__WXUNIVERSAL__))
24
c801d85f 25#ifndef WX_PRECOMP
53cf79fa
VS
26 #include <stdio.h>
27 #include "wx/utils.h"
28 #include "wx/dialog.h"
29 #include "wx/listbox.h"
30 #include "wx/button.h"
31 #include "wx/stattext.h"
32 #include "wx/layout.h"
33 #include "wx/dcclient.h"
34 #include "wx/choice.h"
35 #include "wx/checkbox.h"
36 #include "wx/intl.h"
c801d85f
KB
37#endif
38
39#include <string.h>
40#include <stdlib.h>
41
42#include "wx/cmndata.h"
53cf79fa 43#include "wx/sizer.h"
c2c59b22 44#include "wx/fontdlg.h"
c801d85f 45
53cf79fa
VS
46//-----------------------------------------------------------------------------
47// helper class - wxFontPreviewer
48//-----------------------------------------------------------------------------
49
50class WXDLLEXPORT wxFontPreviewer : public wxWindow
51{
52public:
53 wxFontPreviewer(wxWindow *parent) : wxWindow(parent, -1) {}
54
55private:
56 void OnPaint(wxPaintEvent& event);
57 DECLARE_EVENT_TABLE()
58};
59
60BEGIN_EVENT_TABLE(wxFontPreviewer, wxWindow)
61 EVT_PAINT(wxFontPreviewer::OnPaint)
62END_EVENT_TABLE()
63
64void wxFontPreviewer::OnPaint(wxPaintEvent& WXUNUSED(event))
65{
66 wxPaintDC dc(this);
67
68 wxSize size = GetSize();
69 wxFont font = GetFont();
70
71 dc.SetPen(*wxBLACK_PEN);
72 dc.SetBrush(*wxWHITE_BRUSH);
73 dc.DrawRectangle(0, 0, size.x, size.y);
74
75 if ( font.Ok() )
76 {
77 dc.SetFont(GetFont());
78 // Calculate vertical centre
79 long w, h;
80 dc.GetTextExtent("X", &w, &h);
81 dc.SetTextForeground(GetForegroundColour());
82 dc.SetClippingRegion(2, 2, size.x-4, size.y-4);
83 dc.DrawText(_("ABCDEFGabcdefg12345"),
84 10, h/2 + size.y/2);
85 dc.DestroyClippingRegion();
86 }
87}
88
89//-----------------------------------------------------------------------------
90// wxGenericFontDialog
91//-----------------------------------------------------------------------------
92
c801d85f
KB
93IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog, wxDialog)
94
95BEGIN_EVENT_TABLE(wxGenericFontDialog, wxDialog)
c35414db
VZ
96 EVT_CHECKBOX(wxID_FONT_UNDERLINE, wxGenericFontDialog::OnChangeFont)
97 EVT_CHOICE(wxID_FONT_STYLE, wxGenericFontDialog::OnChangeFont)
98 EVT_CHOICE(wxID_FONT_WEIGHT, wxGenericFontDialog::OnChangeFont)
99 EVT_CHOICE(wxID_FONT_FAMILY, wxGenericFontDialog::OnChangeFont)
100 EVT_CHOICE(wxID_FONT_COLOUR, wxGenericFontDialog::OnChangeFont)
101 EVT_CHOICE(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont)
c35414db 102 EVT_CLOSE(wxGenericFontDialog::OnCloseWindow)
c801d85f
KB
103END_EVENT_TABLE()
104
c801d85f
KB
105
106#define NUM_COLS 48
223d09f6
KB
107static wxString wxColourDialogNames[NUM_COLS]={wxT("ORANGE"),
108 wxT("GOLDENROD"),
109 wxT("WHEAT"),
110 wxT("SPRING GREEN"),
111 wxT("SKY BLUE"),
112 wxT("SLATE BLUE"),
113 wxT("MEDIUM VIOLET RED"),
114 wxT("PURPLE"),
115
116 wxT("RED"),
117 wxT("YELLOW"),
118 wxT("MEDIUM SPRING GREEN"),
119 wxT("PALE GREEN"),
120 wxT("CYAN"),
121 wxT("LIGHT STEEL BLUE"),
122 wxT("ORCHID"),
123 wxT("LIGHT MAGENTA"),
124
125 wxT("BROWN"),
126 wxT("YELLOW"),
127 wxT("GREEN"),
128 wxT("CADET BLUE"),
129 wxT("MEDIUM BLUE"),
130 wxT("MAGENTA"),
131 wxT("MAROON"),
132 wxT("ORANGE RED"),
133
134 wxT("FIREBRICK"),
135 wxT("CORAL"),
136 wxT("FOREST GREEN"),
137 wxT("AQUARAMINE"),
138 wxT("BLUE"),
139 wxT("NAVY"),
140 wxT("THISTLE"),
141 wxT("MEDIUM VIOLET RED"),
142
143 wxT("INDIAN RED"),
144 wxT("GOLD"),
145 wxT("MEDIUM SEA GREEN"),
146 wxT("MEDIUM BLUE"),
147 wxT("MIDNIGHT BLUE"),
148 wxT("GREY"),
149 wxT("PURPLE"),
150 wxT("KHAKI"),
151
152 wxT("BLACK"),
153 wxT("MEDIUM FOREST GREEN"),
154 wxT("KHAKI"),
155 wxT("DARK GREY"),
156 wxT("SEA GREEN"),
157 wxT("LIGHT GREY"),
158 wxT("MEDIUM SLATE BLUE"),
159 wxT("WHITE")
c35414db 160 };
c801d85f
KB
161
162/*
163 * Generic wxFontDialog
164 */
165
c2c59b22 166void wxGenericFontDialog::Init()
c801d85f 167{
66bd6b93 168 m_useEvents = FALSE;
53cf79fa 169 m_previewer = NULL;
c801d85f
KB
170}
171
c2c59b22 172wxGenericFontDialog::~wxGenericFontDialog()
c801d85f
KB
173{
174}
175
74e3313b 176void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
c801d85f 177{
e3065973 178 EndModal(wxID_CANCEL);
c801d85f 179}
c35414db 180
c2c59b22 181bool wxGenericFontDialog::DoCreate(wxWindow *parent)
c801d85f 182{
c801d85f
KB
183 InitializeFont();
184 CreateWidgets();
53cf79fa 185
c801d85f
KB
186 return TRUE;
187}
188
c2c59b22 189int wxGenericFontDialog::ShowModal()
c801d85f
KB
190{
191 int ret = wxDialog::ShowModal();
192
193 if (ret != wxID_CANCEL)
194 {
c2c59b22 195 m_fontData.chosenFont = dialogFont;
c801d85f
KB
196 }
197
c35414db 198 return ret;
c801d85f
KB
199}
200
c2c59b22 201void wxGenericFontDialog::CreateWidgets()
c801d85f 202{
53cf79fa 203 wxBusyCursor bcur;
c35414db 204
59043ba2 205 wxString
36b3b54a 206 *families = new wxString[6],
59043ba2
KB
207 *styles = new wxString[3],
208 *weights = new wxString[3];
209 families[0] = _("Roman");
210 families[1] = _("Decorative");
211 families[2] = _("Modern");
212 families[3] = _("Script");
213 families[4] = _("Swiss" );
36b3b54a 214 families[5] = _("Teletype" );
59043ba2
KB
215 styles[0] = _("Normal");
216 styles[1] = _("Italic");
217 styles[2] = _("Slant");
218 weights[0] = _("Normal");
219 weights[1] = _("Light");
220 weights[2] = _("Bold");
c35414db 221
53cf79fa
VS
222 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxDefaultPosition, wxDefaultSize, 5, families);
223 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxDefaultPosition, wxDefaultSize, 3, styles);
224 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxDefaultPosition, wxDefaultSize, 3, weights);
225
226 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxDefaultPosition, wxDefaultSize, NUM_COLS, wxColourDialogNames);
c801d85f 227
59043ba2 228 wxString *pointSizes = new wxString[40];
c801d85f
KB
229 int i;
230 for ( i = 0; i < 40; i++)
231 {
c35414db
VZ
232 char buf[5];
233 sprintf(buf, "%d", i + 1);
234 pointSizes[i] = buf;
c801d85f
KB
235 }
236
53cf79fa
VS
237 pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxDefaultPosition, wxDefaultSize, 40, pointSizes);
238 underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"));
c801d85f 239
53cf79fa 240 m_previewer = new wxFontPreviewer(this);
c801d85f 241
53cf79fa
VS
242 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"));
243 wxButton *cancelButton = new wxButton(this, wxID_OK, _("Cancel"));
c801d85f 244
66bd6b93 245 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
c801d85f
KB
246 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
247 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
c2c59b22 248 wxString name(wxTheColourDatabase->FindName(m_fontData.fontColour));
c801d85f 249 colourChoice->SetStringSelection(name);
c35414db 250
c801d85f 251 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
66bd6b93 252 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
c801d85f
KB
253
254 okButton->SetDefault();
255
53cf79fa
VS
256 wxSizer *topsizer, *sizer;
257 topsizer = new wxBoxSizer(wxVERTICAL);
258
259 sizer = new wxBoxSizer(wxHORIZONTAL);
260 sizer->Add(familyChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
261 sizer->Add(styleChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
262 sizer->Add(weightChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
263 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
264
265 sizer = new wxBoxSizer(wxHORIZONTAL);
266 sizer->Add(colourChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
267 sizer->Add(pointSizeChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
268 sizer->Add(underLineCheckBox, 0, wxALIGN_CENTER | wxLEFT, 10);
269 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
270
271 topsizer->Add(m_previewer, 1, wxALL | wxEXPAND, 10);
272 topsizer->SetItemMinSize(m_previewer, 430, 100);
273
274 sizer = new wxBoxSizer(wxHORIZONTAL);
275 sizer->Add(okButton, 0, wxRIGHT, 10);
276 sizer->Add(cancelButton, 0, wxRIGHT, 10);
277 topsizer->Add(sizer, 0, wxALIGN_RIGHT | wxBOTTOM, 10);
278
279 SetAutoLayout(TRUE);
280 SetSizer(topsizer);
281 topsizer->SetSizeHints(this);
282 topsizer->Fit(this);
c801d85f
KB
283
284 Centre(wxBOTH);
285
59043ba2
KB
286 delete[] families;
287 delete[] styles;
288 delete[] weights;
289 delete[] pointSizes;
66bd6b93 290 m_useEvents = TRUE;
c801d85f
KB
291}
292
c2c59b22 293void wxGenericFontDialog::InitializeFont()
c801d85f
KB
294{
295 int fontFamily = wxSWISS;
296 int fontWeight = wxNORMAL;
297 int fontStyle = wxNORMAL;
298 int fontSize = 12;
299 int fontUnderline = FALSE;
53cf79fa 300
c2c59b22 301 if (m_fontData.initialFont.Ok())
c801d85f 302 {
c2c59b22
VZ
303 fontFamily = m_fontData.initialFont.GetFamily();
304 fontWeight = m_fontData.initialFont.GetWeight();
305 fontStyle = m_fontData.initialFont.GetStyle();
306 fontSize = m_fontData.initialFont.GetPointSize();
307 fontUnderline = m_fontData.initialFont.GetUnderlined();
c801d85f 308 }
c801d85f 309
53cf79fa 310 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
c801d85f 311
53cf79fa
VS
312 if (m_previewer)
313 m_previewer->SetFont(dialogFont);
c801d85f
KB
314}
315
316void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
317{
66bd6b93 318 if (!m_useEvents) return;
c35414db 319
bbe0af5b
RR
320 int fontFamily = 0; /* shut up buggy egcs warnings */
321 fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
322 int fontWeight = 0;
323 fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
324 int fontStyle = 0;
325 fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
87138c52 326 int fontSize = wxAtoi(pointSizeChoice->GetStringSelection());
c801d85f
KB
327 int fontUnderline = underLineCheckBox->GetValue();
328
329 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
53cf79fa 330 m_previewer->SetFont(dialogFont);
223d09f6 331 if (colourChoice->GetStringSelection() != wxT(""))
c801d85f 332 {
bbe0af5b
RR
333 wxColour *col = (wxColour*) NULL;
334 col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
c801d85f
KB
335 if (col)
336 {
c2c59b22 337 m_fontData.fontColour = *col;
53cf79fa 338 m_previewer->SetForegroundColour(*col);
c801d85f
KB
339 }
340 }
53cf79fa 341 m_previewer->Refresh();
c801d85f
KB
342}
343
d0060e77 344const wxChar *wxFontWeightIntToString(int weight)
c801d85f
KB
345{
346 switch (weight)
347 {
348 case wxLIGHT:
223d09f6 349 return wxT("Light");
c801d85f 350 case wxBOLD:
223d09f6 351 return wxT("Bold");
c801d85f
KB
352 case wxNORMAL:
353 default:
223d09f6 354 return wxT("Normal");
c801d85f 355 }
c801d85f
KB
356}
357
d0060e77 358const wxChar *wxFontStyleIntToString(int style)
c801d85f
KB
359{
360 switch (style)
361 {
362 case wxITALIC:
223d09f6 363 return wxT("Italic");
c801d85f 364 case wxSLANT:
223d09f6 365 return wxT("Slant");
c801d85f
KB
366 case wxNORMAL:
367 default:
223d09f6 368 return wxT("Normal");
c801d85f 369 }
c801d85f
KB
370}
371
d0060e77 372const wxChar *wxFontFamilyIntToString(int family)
c801d85f
KB
373{
374 switch (family)
375 {
376 case wxROMAN:
223d09f6 377 return wxT("Roman");
c801d85f 378 case wxDECORATIVE:
223d09f6 379 return wxT("Decorative");
c801d85f 380 case wxMODERN:
223d09f6 381 return wxT("Modern");
c801d85f 382 case wxSCRIPT:
223d09f6 383 return wxT("Script");
36b3b54a 384 case wxTELETYPE:
223d09f6 385 return wxT("Teletype");
c801d85f
KB
386 case wxSWISS:
387 default:
223d09f6 388 return wxT("Swiss");
c801d85f 389 }
c801d85f
KB
390}
391
87138c52 392int wxFontFamilyStringToInt(wxChar *family)
c801d85f
KB
393{
394 if (!family)
395 return wxSWISS;
c35414db 396
223d09f6 397 if (wxStrcmp(family, wxT("Roman")) == 0)
c801d85f 398 return wxROMAN;
223d09f6 399 else if (wxStrcmp(family, wxT("Decorative")) == 0)
c801d85f 400 return wxDECORATIVE;
223d09f6 401 else if (wxStrcmp(family, wxT("Modern")) == 0)
c801d85f 402 return wxMODERN;
223d09f6 403 else if (wxStrcmp(family, wxT("Script")) == 0)
c801d85f 404 return wxSCRIPT;
223d09f6 405 else if (wxStrcmp(family, wxT("Teletype")) == 0)
36b3b54a 406 return wxTELETYPE;
c801d85f
KB
407 else return wxSWISS;
408}
409
87138c52 410int wxFontStyleStringToInt(wxChar *style)
c801d85f
KB
411{
412 if (!style)
413 return wxNORMAL;
223d09f6 414 if (wxStrcmp(style, wxT("Italic")) == 0)
c801d85f 415 return wxITALIC;
223d09f6 416 else if (wxStrcmp(style, wxT("Slant")) == 0)
c801d85f
KB
417 return wxSLANT;
418 else
419 return wxNORMAL;
420}
421
87138c52 422int wxFontWeightStringToInt(wxChar *weight)
c801d85f
KB
423{
424 if (!weight)
425 return wxNORMAL;
223d09f6 426 if (wxStrcmp(weight, wxT("Bold")) == 0)
c801d85f 427 return wxBOLD;
223d09f6 428 else if (wxStrcmp(weight, wxT("Light")) == 0)
c801d85f
KB
429 return wxLIGHT;
430 else
431 return wxNORMAL;
432}
433
3808e191
JS
434#endif
435 // wxUSE_FONTDLG
c801d85f 436