]> git.saurik.com Git - wxWidgets.git/blame - src/generic/fontdlgg.cpp
implemented menu drawing in the GTK theme
[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
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"
c801d85f
KB
44#include "wx/generic/fontdlgg.h"
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
166wxGenericFontDialog::wxGenericFontDialog(void)
167{
66bd6b93 168 m_useEvents = FALSE;
53cf79fa 169 m_previewer = NULL;
c801d85f
KB
170 dialogParent = NULL;
171}
172
173wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, wxFontData *data):
53cf79fa
VS
174 wxDialog(parent, -1, _("Font"), wxDefaultPosition, wxDefaultSize,
175 wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL|wxRESIZE_BORDER)
c801d85f 176{
66bd6b93 177 m_useEvents = FALSE;
53cf79fa 178 m_previewer = NULL;
c801d85f
KB
179 Create(parent, data);
180}
181
182wxGenericFontDialog::~wxGenericFontDialog(void)
183{
184}
185
74e3313b 186void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
c801d85f 187{
e3065973 188 EndModal(wxID_CANCEL);
c801d85f 189}
c35414db 190
c801d85f
KB
191bool wxGenericFontDialog::Create(wxWindow *parent, wxFontData *data)
192{
193 dialogParent = parent;
c35414db 194
c801d85f
KB
195 if (data)
196 fontData = *data;
197
198 InitializeFont();
199 CreateWidgets();
53cf79fa 200
c801d85f
KB
201 return TRUE;
202}
203
204int wxGenericFontDialog::ShowModal(void)
205{
206 int ret = wxDialog::ShowModal();
207
208 if (ret != wxID_CANCEL)
209 {
210 fontData.chosenFont = dialogFont;
211 }
212
c35414db 213 return ret;
c801d85f
KB
214}
215
c801d85f
KB
216void wxGenericFontDialog::CreateWidgets(void)
217{
53cf79fa 218 wxBusyCursor bcur;
c35414db 219
59043ba2 220 wxString
36b3b54a 221 *families = new wxString[6],
59043ba2
KB
222 *styles = new wxString[3],
223 *weights = new wxString[3];
224 families[0] = _("Roman");
225 families[1] = _("Decorative");
226 families[2] = _("Modern");
227 families[3] = _("Script");
228 families[4] = _("Swiss" );
36b3b54a 229 families[5] = _("Teletype" );
59043ba2
KB
230 styles[0] = _("Normal");
231 styles[1] = _("Italic");
232 styles[2] = _("Slant");
233 weights[0] = _("Normal");
234 weights[1] = _("Light");
235 weights[2] = _("Bold");
c35414db 236
53cf79fa
VS
237 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxDefaultPosition, wxDefaultSize, 5, families);
238 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxDefaultPosition, wxDefaultSize, 3, styles);
239 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxDefaultPosition, wxDefaultSize, 3, weights);
240
241 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxDefaultPosition, wxDefaultSize, NUM_COLS, wxColourDialogNames);
c801d85f 242
59043ba2 243 wxString *pointSizes = new wxString[40];
c801d85f
KB
244 int i;
245 for ( i = 0; i < 40; i++)
246 {
c35414db
VZ
247 char buf[5];
248 sprintf(buf, "%d", i + 1);
249 pointSizes[i] = buf;
c801d85f
KB
250 }
251
53cf79fa
VS
252 pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxDefaultPosition, wxDefaultSize, 40, pointSizes);
253 underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"));
c801d85f 254
53cf79fa 255 m_previewer = new wxFontPreviewer(this);
c801d85f 256
53cf79fa
VS
257 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"));
258 wxButton *cancelButton = new wxButton(this, wxID_OK, _("Cancel"));
c801d85f 259
66bd6b93 260 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
c801d85f
KB
261 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
262 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
263 wxString name(wxTheColourDatabase->FindName(fontData.fontColour));
264 colourChoice->SetStringSelection(name);
c35414db 265
c801d85f 266 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
66bd6b93 267 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
c801d85f
KB
268
269 okButton->SetDefault();
270
53cf79fa
VS
271 wxSizer *topsizer, *sizer;
272 topsizer = new wxBoxSizer(wxVERTICAL);
273
274 sizer = new wxBoxSizer(wxHORIZONTAL);
275 sizer->Add(familyChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
276 sizer->Add(styleChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
277 sizer->Add(weightChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
278 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
279
280 sizer = new wxBoxSizer(wxHORIZONTAL);
281 sizer->Add(colourChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
282 sizer->Add(pointSizeChoice, 0, wxALIGN_CENTER | wxLEFT, 10);
283 sizer->Add(underLineCheckBox, 0, wxALIGN_CENTER | wxLEFT, 10);
284 topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10);
285
286 topsizer->Add(m_previewer, 1, wxALL | wxEXPAND, 10);
287 topsizer->SetItemMinSize(m_previewer, 430, 100);
288
289 sizer = new wxBoxSizer(wxHORIZONTAL);
290 sizer->Add(okButton, 0, wxRIGHT, 10);
291 sizer->Add(cancelButton, 0, wxRIGHT, 10);
292 topsizer->Add(sizer, 0, wxALIGN_RIGHT | wxBOTTOM, 10);
293
294 SetAutoLayout(TRUE);
295 SetSizer(topsizer);
296 topsizer->SetSizeHints(this);
297 topsizer->Fit(this);
c801d85f
KB
298
299 Centre(wxBOTH);
300
59043ba2
KB
301 delete[] families;
302 delete[] styles;
303 delete[] weights;
304 delete[] pointSizes;
66bd6b93 305 m_useEvents = TRUE;
c801d85f
KB
306}
307
308void wxGenericFontDialog::InitializeFont(void)
309{
310 int fontFamily = wxSWISS;
311 int fontWeight = wxNORMAL;
312 int fontStyle = wxNORMAL;
313 int fontSize = 12;
314 int fontUnderline = FALSE;
53cf79fa 315
c801d85f
KB
316 if (fontData.initialFont.Ok())
317 {
53cf79fa
VS
318 fontFamily = fontData.initialFont.GetFamily();
319 fontWeight = fontData.initialFont.GetWeight();
320 fontStyle = fontData.initialFont.GetStyle();
321 fontSize = fontData.initialFont.GetPointSize();
322 fontUnderline = fontData.initialFont.GetUnderlined();
c801d85f 323 }
c801d85f 324
53cf79fa 325 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
c801d85f 326
53cf79fa
VS
327 if (m_previewer)
328 m_previewer->SetFont(dialogFont);
c801d85f
KB
329}
330
331void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
332{
66bd6b93 333 if (!m_useEvents) return;
c35414db 334
bbe0af5b
RR
335 int fontFamily = 0; /* shut up buggy egcs warnings */
336 fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
337 int fontWeight = 0;
338 fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
339 int fontStyle = 0;
340 fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
87138c52 341 int fontSize = wxAtoi(pointSizeChoice->GetStringSelection());
c801d85f
KB
342 int fontUnderline = underLineCheckBox->GetValue();
343
344 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
53cf79fa 345 m_previewer->SetFont(dialogFont);
223d09f6 346 if (colourChoice->GetStringSelection() != wxT(""))
c801d85f 347 {
bbe0af5b
RR
348 wxColour *col = (wxColour*) NULL;
349 col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
c801d85f
KB
350 if (col)
351 {
352 fontData.fontColour = *col;
53cf79fa 353 m_previewer->SetForegroundColour(*col);
c801d85f
KB
354 }
355 }
53cf79fa 356 m_previewer->Refresh();
c801d85f
KB
357}
358
87138c52 359wxChar *wxFontWeightIntToString(int weight)
c801d85f
KB
360{
361 switch (weight)
362 {
363 case wxLIGHT:
223d09f6 364 return wxT("Light");
c801d85f 365 case wxBOLD:
223d09f6 366 return wxT("Bold");
c801d85f
KB
367 case wxNORMAL:
368 default:
223d09f6 369 return wxT("Normal");
c801d85f 370 }
c801d85f
KB
371}
372
87138c52 373wxChar *wxFontStyleIntToString(int style)
c801d85f
KB
374{
375 switch (style)
376 {
377 case wxITALIC:
223d09f6 378 return wxT("Italic");
c801d85f 379 case wxSLANT:
223d09f6 380 return wxT("Slant");
c801d85f
KB
381 case wxNORMAL:
382 default:
223d09f6 383 return wxT("Normal");
c801d85f 384 }
c801d85f
KB
385}
386
87138c52 387wxChar *wxFontFamilyIntToString(int family)
c801d85f
KB
388{
389 switch (family)
390 {
391 case wxROMAN:
223d09f6 392 return wxT("Roman");
c801d85f 393 case wxDECORATIVE:
223d09f6 394 return wxT("Decorative");
c801d85f 395 case wxMODERN:
223d09f6 396 return wxT("Modern");
c801d85f 397 case wxSCRIPT:
223d09f6 398 return wxT("Script");
36b3b54a 399 case wxTELETYPE:
223d09f6 400 return wxT("Teletype");
c801d85f
KB
401 case wxSWISS:
402 default:
223d09f6 403 return wxT("Swiss");
c801d85f 404 }
c801d85f
KB
405}
406
87138c52 407int wxFontFamilyStringToInt(wxChar *family)
c801d85f
KB
408{
409 if (!family)
410 return wxSWISS;
c35414db 411
223d09f6 412 if (wxStrcmp(family, wxT("Roman")) == 0)
c801d85f 413 return wxROMAN;
223d09f6 414 else if (wxStrcmp(family, wxT("Decorative")) == 0)
c801d85f 415 return wxDECORATIVE;
223d09f6 416 else if (wxStrcmp(family, wxT("Modern")) == 0)
c801d85f 417 return wxMODERN;
223d09f6 418 else if (wxStrcmp(family, wxT("Script")) == 0)
c801d85f 419 return wxSCRIPT;
223d09f6 420 else if (wxStrcmp(family, wxT("Teletype")) == 0)
36b3b54a 421 return wxTELETYPE;
c801d85f
KB
422 else return wxSWISS;
423}
424
87138c52 425int wxFontStyleStringToInt(wxChar *style)
c801d85f
KB
426{
427 if (!style)
428 return wxNORMAL;
223d09f6 429 if (wxStrcmp(style, wxT("Italic")) == 0)
c801d85f 430 return wxITALIC;
223d09f6 431 else if (wxStrcmp(style, wxT("Slant")) == 0)
c801d85f
KB
432 return wxSLANT;
433 else
434 return wxNORMAL;
435}
436
87138c52 437int wxFontWeightStringToInt(wxChar *weight)
c801d85f
KB
438{
439 if (!weight)
440 return wxNORMAL;
223d09f6 441 if (wxStrcmp(weight, wxT("Bold")) == 0)
c801d85f 442 return wxBOLD;
223d09f6 443 else if (wxStrcmp(weight, wxT("Light")) == 0)
c801d85f
KB
444 return wxLIGHT;
445 else
446 return wxNORMAL;
447}
448
3808e191
JS
449#endif
450 // wxUSE_FONTDLG
c801d85f 451