]> git.saurik.com Git - wxWidgets.git/blame - src/generic/fontdlgg.cpp
no need to update default colours and refresh if syscolours change, wxWindow does it
[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$
6aa89a22 8// Copyright: (c) Julian Smart
65571936 9// Licence: wxWindows licence
c801d85f
KB
10/////////////////////////////////////////////////////////////////////////////
11
14f355c2 12#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
c801d85f
KB
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
47e118ba 23#if wxUSE_FONTDLG && (!defined(__WXGTK__) || defined(__WXGPE__) || defined(__WXUNIVERSAL__))
4234ea8b 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"
23c47bc1 45#include "wx/generic/fontdlgg.h"
47e118ba 46#include "wx/settings.h"
c801d85f 47
53cf79fa
VS
48//-----------------------------------------------------------------------------
49// helper class - wxFontPreviewer
50//-----------------------------------------------------------------------------
51
52class WXDLLEXPORT wxFontPreviewer : public wxWindow
53{
54public:
dabbc6a5 55 wxFontPreviewer(wxWindow *parent) : wxWindow(parent, wxID_ANY) {}
53cf79fa
VS
56
57private:
58 void OnPaint(wxPaintEvent& event);
59 DECLARE_EVENT_TABLE()
60};
61
62BEGIN_EVENT_TABLE(wxFontPreviewer, wxWindow)
63 EVT_PAINT(wxFontPreviewer::OnPaint)
64END_EVENT_TABLE()
65
66void wxFontPreviewer::OnPaint(wxPaintEvent& WXUNUSED(event))
67{
68 wxPaintDC dc(this);
69
70 wxSize size = GetSize();
71 wxFont font = GetFont();
72
73 dc.SetPen(*wxBLACK_PEN);
74 dc.SetBrush(*wxWHITE_BRUSH);
75 dc.DrawRectangle(0, 0, size.x, size.y);
76
77 if ( font.Ok() )
78 {
2b5f62a0 79 dc.SetFont(font);
53cf79fa
VS
80 // Calculate vertical centre
81 long w, h;
2b5f62a0 82 dc.GetTextExtent( wxT("X"), &w, &h);
53cf79fa
VS
83 dc.SetTextForeground(GetForegroundColour());
84 dc.SetClippingRegion(2, 2, size.x-4, size.y-4);
dabbc6a5 85 dc.DrawText(_("ABCDEFGabcdefg12345"),
2b5f62a0 86 10, size.y/2 - h/2);
53cf79fa
VS
87 dc.DestroyClippingRegion();
88 }
89}
90
91//-----------------------------------------------------------------------------
92// wxGenericFontDialog
93//-----------------------------------------------------------------------------
94
c801d85f
KB
95IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog, wxDialog)
96
97BEGIN_EVENT_TABLE(wxGenericFontDialog, wxDialog)
c35414db
VZ
98 EVT_CHECKBOX(wxID_FONT_UNDERLINE, wxGenericFontDialog::OnChangeFont)
99 EVT_CHOICE(wxID_FONT_STYLE, wxGenericFontDialog::OnChangeFont)
100 EVT_CHOICE(wxID_FONT_WEIGHT, wxGenericFontDialog::OnChangeFont)
101 EVT_CHOICE(wxID_FONT_FAMILY, wxGenericFontDialog::OnChangeFont)
102 EVT_CHOICE(wxID_FONT_COLOUR, wxGenericFontDialog::OnChangeFont)
103 EVT_CHOICE(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont)
c35414db 104 EVT_CLOSE(wxGenericFontDialog::OnCloseWindow)
c801d85f
KB
105END_EVENT_TABLE()
106
c801d85f
KB
107
108#define NUM_COLS 48
223d09f6
KB
109static wxString wxColourDialogNames[NUM_COLS]={wxT("ORANGE"),
110 wxT("GOLDENROD"),
111 wxT("WHEAT"),
112 wxT("SPRING GREEN"),
113 wxT("SKY BLUE"),
114 wxT("SLATE BLUE"),
115 wxT("MEDIUM VIOLET RED"),
116 wxT("PURPLE"),
117
118 wxT("RED"),
119 wxT("YELLOW"),
120 wxT("MEDIUM SPRING GREEN"),
121 wxT("PALE GREEN"),
122 wxT("CYAN"),
123 wxT("LIGHT STEEL BLUE"),
124 wxT("ORCHID"),
125 wxT("LIGHT MAGENTA"),
126
127 wxT("BROWN"),
128 wxT("YELLOW"),
129 wxT("GREEN"),
130 wxT("CADET BLUE"),
131 wxT("MEDIUM BLUE"),
132 wxT("MAGENTA"),
133 wxT("MAROON"),
134 wxT("ORANGE RED"),
135
136 wxT("FIREBRICK"),
137 wxT("CORAL"),
138 wxT("FOREST GREEN"),
139 wxT("AQUARAMINE"),
140 wxT("BLUE"),
141 wxT("NAVY"),
142 wxT("THISTLE"),
143 wxT("MEDIUM VIOLET RED"),
144
145 wxT("INDIAN RED"),
146 wxT("GOLD"),
147 wxT("MEDIUM SEA GREEN"),
148 wxT("MEDIUM BLUE"),
149 wxT("MIDNIGHT BLUE"),
150 wxT("GREY"),
151 wxT("PURPLE"),
152 wxT("KHAKI"),
153
154 wxT("BLACK"),
155 wxT("MEDIUM FOREST GREEN"),
156 wxT("KHAKI"),
157 wxT("DARK GREY"),
158 wxT("SEA GREEN"),
159 wxT("LIGHT GREY"),
160 wxT("MEDIUM SLATE BLUE"),
161 wxT("WHITE")
c35414db 162 };
c801d85f
KB
163
164/*
165 * Generic wxFontDialog
166 */
167
c2c59b22 168void wxGenericFontDialog::Init()
c801d85f 169{
dabbc6a5 170 m_useEvents = false;
53cf79fa 171 m_previewer = NULL;
1bab9242 172 Create( m_parent ) ;
c801d85f
KB
173}
174
c2c59b22 175wxGenericFontDialog::~wxGenericFontDialog()
c801d85f
KB
176{
177}
178
74e3313b 179void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
c801d85f 180{
47e118ba 181 EndModal(wxID_CANCEL);
c801d85f 182}
c35414db 183
c2c59b22 184bool wxGenericFontDialog::DoCreate(wxWindow *parent)
c801d85f 185{
dabbc6a5 186 if ( !wxDialog::Create( parent , wxID_ANY , _T("Choose Font") , wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE,
1bab9242
SC
187 _T("fontdialog") ) )
188 {
189 wxFAIL_MSG( wxT("wxFontDialog creation failed") );
dabbc6a5 190 return false;
1bab9242 191 }
fc8eba27 192
47e118ba
RR
193 InitializeFont();
194 CreateWidgets();
dabbc6a5 195
47e118ba
RR
196 // sets initial font in preview area
197 wxCommandEvent dummy;
198 OnChangeFont(dummy);
dabbc6a5
DS
199
200 return true;
c801d85f
KB
201}
202
c2c59b22 203int wxGenericFontDialog::ShowModal()
c801d85f 204{
1bab9242 205 int ret = wxDialog::ShowModal();
c801d85f
KB
206
207 if (ret != wxID_CANCEL)
208 {
ae500232 209 m_fontData.m_chosenFont = dialogFont;
c801d85f
KB
210 }
211
c35414db 212 return ret;
c801d85f
KB
213}
214
c2c59b22 215void wxGenericFontDialog::CreateWidgets()
c801d85f 216{
47e118ba 217 wxString
36b3b54a 218 *families = new wxString[6],
59043ba2
KB
219 *styles = new wxString[3],
220 *weights = new wxString[3];
47e118ba
RR
221 families[0] = _("Roman");
222 families[1] = _("Decorative");
223 families[2] = _("Modern");
224 families[3] = _("Script");
225 families[4] = _("Swiss" );
226 families[5] = _("Teletype" );
227 styles[0] = _("Normal");
228 styles[1] = _("Italic");
229 styles[2] = _("Slant");
230 weights[0] = _("Normal");
231 weights[1] = _("Light");
232 weights[2] = _("Bold");
233
234 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxDefaultPosition, wxDefaultSize, 5, families);
235 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxDefaultPosition, wxDefaultSize, 3, styles);
236 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxDefaultPosition, wxDefaultSize, 3, weights);
237
238 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxDefaultPosition, wxDefaultSize, NUM_COLS, wxColourDialogNames);
239
240 wxString *pointSizes = new wxString[40];
241 int i;
242 for ( i = 0; i < 40; i++)
243 {
244 wxChar buf[5];
245 wxSprintf(buf, wxT("%d"), i + 1);
246 pointSizes[i] = buf;
247 }
c801d85f 248
47e118ba
RR
249 pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxDefaultPosition, wxDefaultSize, 40, pointSizes);
250 underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"));
c801d85f 251
47e118ba 252 m_previewer = new wxFontPreviewer(this);
c801d85f 253
47e118ba
RR
254 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"));
255 wxButton *cancelButton = new wxButton(this, wxID_CANCEL, _("Cancel"));
c801d85f 256
47e118ba
RR
257 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
258 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
259 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
260 wxString name(wxTheColourDatabase->FindName(m_fontData.GetColour()));
261 colourChoice->SetStringSelection(name);
c35414db 262
47e118ba
RR
263 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
264 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
c801d85f 265
47e118ba 266 okButton->SetDefault();
c801d85f 267
47e118ba 268 // layout
53cf79fa 269
47e118ba 270 bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA);
53cf79fa 271
47e118ba
RR
272
273 wxSizer *topsizer, *sizer;
274 topsizer = new wxBoxSizer(wxVERTICAL);
275
276 if (!is_pda)
277 {
278 // 2 row design
279 sizer = new wxBoxSizer(wxHORIZONTAL);
280 sizer->Add(familyChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
281 sizer->Add(styleChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
282 sizer->Add(weightChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
283 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
284
285 sizer = new wxBoxSizer(wxHORIZONTAL);
286 sizer->Add(colourChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
287 sizer->Add(pointSizeChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
288 sizer->Add(underLineCheckBox, 0, wxALIGN_CENTER | wxLEFT, 10);
289 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
290 }
291 else
292 {
293 // 3 row design
294 sizer = new wxBoxSizer(wxHORIZONTAL);
295 sizer->Add(familyChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
296 sizer->Add(styleChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
297 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
298
299 sizer = new wxBoxSizer(wxHORIZONTAL);
300 sizer->Add(weightChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
301 sizer->Add(colourChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
302 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
dabbc6a5 303
47e118ba
RR
304 sizer = new wxBoxSizer(wxHORIZONTAL);
305 sizer->Add(pointSizeChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
306 sizer->Add(underLineCheckBox, 0, wxALIGN_CENTER | wxLEFT, 10);
307 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
308 }
dabbc6a5 309
47e118ba
RR
310 topsizer->Add(m_previewer, 1, wxALL | wxEXPAND, 10);
311 topsizer->SetItemMinSize(m_previewer, 430, 100);
312
313 sizer = new wxBoxSizer(wxHORIZONTAL);
314 sizer->Add(okButton, 0, wxRIGHT, 10);
315 sizer->Add(cancelButton, 0, wxRIGHT, 10);
316 topsizer->Add(sizer, 0, wxALIGN_RIGHT | wxBOTTOM, 10);
317
47e118ba
RR
318 SetSizer(topsizer);
319 topsizer->SetSizeHints(this);
320 topsizer->Fit(this);
321
322 Centre(wxBOTH);
323
324 delete[] families;
325 delete[] styles;
326 delete[] weights;
327 delete[] pointSizes;
dabbc6a5 328
47e118ba 329 // Don't block events any more
dabbc6a5 330 m_useEvents = true;
c801d85f
KB
331}
332
c2c59b22 333void wxGenericFontDialog::InitializeFont()
c801d85f 334{
47e118ba
RR
335 int fontFamily = wxSWISS;
336 int fontWeight = wxNORMAL;
337 int fontStyle = wxNORMAL;
338 int fontSize = 12;
dabbc6a5 339 bool fontUnderline = false;
53cf79fa 340
47e118ba
RR
341 if (m_fontData.m_initialFont.Ok())
342 {
343 fontFamily = m_fontData.m_initialFont.GetFamily();
344 fontWeight = m_fontData.m_initialFont.GetWeight();
345 fontStyle = m_fontData.m_initialFont.GetStyle();
346 fontSize = m_fontData.m_initialFont.GetPointSize();
347 fontUnderline = m_fontData.m_initialFont.GetUnderlined();
348 }
c801d85f 349
dabbc6a5
DS
350 dialogFont = wxFont(fontSize, fontFamily, fontStyle,
351 fontWeight, fontUnderline);
c801d85f 352
47e118ba
RR
353 if (m_previewer)
354 m_previewer->SetFont(dialogFont);
c801d85f
KB
355}
356
357void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
358{
47e118ba 359 if (!m_useEvents) return;
c35414db 360
47e118ba
RR
361 int fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
362 int fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
363 int fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
364 int fontSize = wxAtoi(pointSizeChoice->GetStringSelection());
365 int fontUnderline = underLineCheckBox->GetValue();
c801d85f 366
47e118ba
RR
367 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
368 m_previewer->SetFont(dialogFont);
dabbc6a5 369 if ( !colourChoice->GetStringSelection().empty() )
c801d85f 370 {
47e118ba
RR
371 wxColour col = wxTheColourDatabase->Find(colourChoice->GetStringSelection());
372 if (col.Ok())
373 {
374 m_fontData.m_fontColour = col;
375 m_previewer->SetForegroundColour(col);
376 }
c801d85f 377 }
47e118ba 378 m_previewer->Refresh();
c801d85f
KB
379}
380
d0060e77 381const wxChar *wxFontWeightIntToString(int weight)
c801d85f
KB
382{
383 switch (weight)
384 {
385 case wxLIGHT:
223d09f6 386 return wxT("Light");
c801d85f 387 case wxBOLD:
223d09f6 388 return wxT("Bold");
c801d85f
KB
389 case wxNORMAL:
390 default:
223d09f6 391 return wxT("Normal");
c801d85f 392 }
c801d85f
KB
393}
394
d0060e77 395const wxChar *wxFontStyleIntToString(int style)
c801d85f
KB
396{
397 switch (style)
398 {
399 case wxITALIC:
223d09f6 400 return wxT("Italic");
c801d85f 401 case wxSLANT:
223d09f6 402 return wxT("Slant");
c801d85f
KB
403 case wxNORMAL:
404 default:
223d09f6 405 return wxT("Normal");
c801d85f 406 }
c801d85f
KB
407}
408
d0060e77 409const wxChar *wxFontFamilyIntToString(int family)
c801d85f
KB
410{
411 switch (family)
412 {
413 case wxROMAN:
223d09f6 414 return wxT("Roman");
c801d85f 415 case wxDECORATIVE:
223d09f6 416 return wxT("Decorative");
c801d85f 417 case wxMODERN:
223d09f6 418 return wxT("Modern");
c801d85f 419 case wxSCRIPT:
223d09f6 420 return wxT("Script");
36b3b54a 421 case wxTELETYPE:
223d09f6 422 return wxT("Teletype");
c801d85f
KB
423 case wxSWISS:
424 default:
223d09f6 425 return wxT("Swiss");
c801d85f 426 }
c801d85f
KB
427}
428
87138c52 429int wxFontFamilyStringToInt(wxChar *family)
c801d85f
KB
430{
431 if (!family)
432 return wxSWISS;
c35414db 433
223d09f6 434 if (wxStrcmp(family, wxT("Roman")) == 0)
c801d85f 435 return wxROMAN;
223d09f6 436 else if (wxStrcmp(family, wxT("Decorative")) == 0)
c801d85f 437 return wxDECORATIVE;
223d09f6 438 else if (wxStrcmp(family, wxT("Modern")) == 0)
c801d85f 439 return wxMODERN;
223d09f6 440 else if (wxStrcmp(family, wxT("Script")) == 0)
c801d85f 441 return wxSCRIPT;
223d09f6 442 else if (wxStrcmp(family, wxT("Teletype")) == 0)
36b3b54a 443 return wxTELETYPE;
c801d85f
KB
444 else return wxSWISS;
445}
446
87138c52 447int wxFontStyleStringToInt(wxChar *style)
c801d85f
KB
448{
449 if (!style)
450 return wxNORMAL;
223d09f6 451 if (wxStrcmp(style, wxT("Italic")) == 0)
c801d85f 452 return wxITALIC;
223d09f6 453 else if (wxStrcmp(style, wxT("Slant")) == 0)
c801d85f
KB
454 return wxSLANT;
455 else
456 return wxNORMAL;
457}
458
87138c52 459int wxFontWeightStringToInt(wxChar *weight)
c801d85f
KB
460{
461 if (!weight)
462 return wxNORMAL;
223d09f6 463 if (wxStrcmp(weight, wxT("Bold")) == 0)
c801d85f 464 return wxBOLD;
223d09f6 465 else if (wxStrcmp(weight, wxT("Light")) == 0)
c801d85f
KB
466 return wxLIGHT;
467 else
468 return wxNORMAL;
469}
470
3808e191
JS
471#endif
472 // wxUSE_FONTDLG
c801d85f 473