]> git.saurik.com Git - wxWidgets.git/blame - src/generic/fontdlgg.cpp
*** empty log message ***
[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
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"
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)
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)
54END_EVENT_TABLE()
55
56#endif
57
58#define NUM_COLS 48
59static wxString wxColourDialogNames[NUM_COLS]={"ORANGE",
60 "GOLDENROD",
61 "WHEAT",
62 "SPRING GREEN",
63 "SKY BLUE",
64 "SLATE BLUE",
65 "MEDIUM VIOLET RED",
66 "PURPLE",
67
68 "RED",
69 "YELLOW",
70 "MEDIUM SPRING GREEN",
71 "PALE GREEN",
72 "CYAN",
73 "LIGHT STEEL BLUE",
74 "ORCHID",
75 "LIGHT MAGENTA",
76
77 "BROWN",
78 "YELLOW",
79 "GREEN",
80 "CADET BLUE",
81 "MEDIUM BLUE",
82 "MAGENTA",
83 "MAROON",
84 "ORANGE RED",
85
86 "FIREBRICK",
87 "CORAL",
88 "FOREST GREEN",
89 "AQUARAMINE",
90 "BLUE",
91 "NAVY",
92 "THISTLE",
93 "MEDIUM VIOLET RED",
94
95 "INDIAN RED",
96 "GOLD",
97 "MEDIUM SEA GREEN",
98 "MEDIUM BLUE",
99 "MIDNIGHT BLUE",
100 "GREY",
101 "PURPLE",
102 "KHAKI",
103
104 "BLACK",
105 "MEDIUM FOREST GREEN",
106 "KHAKI",
107 "DARK GREY",
108 "SEA GREEN",
109 "LIGHT GREY",
110 "MEDIUM SLATE BLUE",
111 "WHITE"
112 };
113
114/*
115 * Generic wxFontDialog
116 */
117
118wxGenericFontDialog::wxGenericFontDialog(void)
119{
66bd6b93 120 m_useEvents = FALSE;
c801d85f
KB
121 dialogParent = NULL;
122}
123
124wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, wxFontData *data):
1a5a8367 125 wxDialog(parent, -1, _("Font"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
c801d85f 126{
66bd6b93 127 m_useEvents = FALSE;
c801d85f
KB
128 Create(parent, data);
129}
130
131wxGenericFontDialog::~wxGenericFontDialog(void)
132{
133}
134
135bool wxGenericFontDialog::OnClose(void)
136{
137 Show(FALSE);
138 return FALSE;
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 wxDialog::OnPaint(event);
170
171 wxPaintDC dc(this);
172 PaintFontBackground(dc);
173 PaintFont(dc);
174}
175
176/*
177static void wxGenericChangeFontText(wxTextCtrl& text, wxCommandEvent& event)
178{
179 if (event.GetEventType() == wxEVENT_TYPE_TEXT_ENTER_COMMAND)
180 {
181 wxGenericFontDialog *dialog = (wxGenericFontDialog *)text.GetParent();
182 dialog->OnChangeFont();
183 }
184}
185*/
186
187void wxGenericFontDialog::CreateWidgets(void)
188{
189 wxBeginBusyCursor();
190
b527aac5 191 fontRect.x = 10;
c801d85f
KB
192#ifdef __X__
193 fontRect.y = 125;
194#else
195 fontRect.y = 115;
196#endif
b527aac5 197 fontRect.width = 430;
c801d85f
KB
198 fontRect.height = 100;
199
59043ba2
KB
200 /*
201 static char *families[] = { "Roman", "Decorative", "Modern", "Script", "Swiss" };
202 static char *styles[] = { "Normal", "Italic", "Slant" };
203 static char *weights[] = { "Normal", "Light", "Bold" };
204 */
205
206 wxString
207 *families = new wxString[5],
208 *styles = new wxString[3],
209 *weights = new wxString[3];
210 families[0] = _("Roman");
211 families[1] = _("Decorative");
212 families[2] = _("Modern");
213 families[3] = _("Script");
214 families[4] = _("Swiss" );
215 styles[0] = _("Normal");
216 styles[1] = _("Italic");
217 styles[2] = _("Slant");
218 weights[0] = _("Normal");
219 weights[1] = _("Light");
220 weights[2] = _("Bold");
221
c801d85f
KB
222 int x=-1;
223 int y=40;
224 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxPoint(10, 10), wxSize(120, -1), 5, families);
55acd85e
JS
225 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(160, 10), wxSize(120, -1), 3, styles);
226 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(310, 10), wxSize(120, -1), 3, weights);
c801d85f
KB
227
228 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(190, -1), NUM_COLS, wxColourDialogNames);
c030b70f 229#if 0 // def __WXMOTIF__ // TODO: This necessary now?
c801d85f
KB
230 // We want the pointSizeText to line up on the y axis with the colourChoice
231 colourChoice->GetPosition(&fontRect.x, &y); //NL mod
232 y+=3; //NL mod
233#endif
234
59043ba2 235 wxString *pointSizes = new wxString[40];
c801d85f
KB
236 int i;
237 for ( i = 0; i < 40; i++)
238 {
239 char buf[5];
240 sprintf(buf, "%d", i + 1);
241 pointSizes[i] = buf;
242 }
243
55acd85e
JS
244 pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(230, y), wxSize(50, -1), 40, pointSizes);
245 underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(320, y));
c801d85f
KB
246
247 int rectY;
248 pointSizeChoice->GetPosition(&x, &rectY); //NL mod
249 fontRect.y = rectY;
250 pointSizeChoice->GetSize(&x, &y); //NL mod
251
252 // Calculate the position of the bottom of the pointSizeChoice, and place
253 // the fontRect there (+5 for a nice gap)
254
255 fontRect.y+=y+5; //NL mod
256
b527aac5 257 int by = (fontRect.y + fontRect.height + 10);
c801d85f 258
b527aac5
RR
259 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(220, by), wxSize(100,-1));
260 (void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(340, by), wxSize(100,-1));
c801d85f 261
66bd6b93 262 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
c801d85f
KB
263 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
264 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
265 wxString name(wxTheColourDatabase->FindName(fontData.fontColour));
266 colourChoice->SetStringSelection(name);
267
268 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
66bd6b93 269 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
c801d85f
KB
270
271 okButton->SetDefault();
272
55acd85e 273 SetClientSize(450, by + 40);
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
KB
328 dc.DestroyClippingRegion();
329 dc.SetFont(wxNullFont);
330 }
331 dc.EndDrawing();
332}
333
334void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
335{
66bd6b93
RR
336 if (!m_useEvents) return;
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());
c801d85f
KB
344 int fontSize = atoi(pointSizeChoice->GetStringSelection());
345 int fontUnderline = underLineCheckBox->GetValue();
346
347 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
348 if (colourChoice->GetStringSelection() != "")
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
362char *wxFontWeightIntToString(int weight)
363{
364 switch (weight)
365 {
366 case wxLIGHT:
367 return "Light";
368 case wxBOLD:
369 return "Bold";
370 case wxNORMAL:
371 default:
372 return "Normal";
373 }
374 return "Normal";
375}
376
377char *wxFontStyleIntToString(int style)
378{
379 switch (style)
380 {
381 case wxITALIC:
382 return "Italic";
383 case wxSLANT:
384 return "Slant";
385 case wxNORMAL:
386 default:
387 return "Normal";
388 }
389 return "Normal";
390}
391
392char *wxFontFamilyIntToString(int family)
393{
394 switch (family)
395 {
396 case wxROMAN:
397 return "Roman";
398 case wxDECORATIVE:
399 return "Decorative";
400 case wxMODERN:
401 return "Modern";
402 case wxSCRIPT:
403 return "Script";
404 case wxSWISS:
405 default:
406 return "Swiss";
407 }
408 return "Swiss";
409}
410
411int wxFontFamilyStringToInt(char *family)
412{
413 if (!family)
414 return wxSWISS;
415
416 if (strcmp(family, "Roman") == 0)
417 return wxROMAN;
418 else if (strcmp(family, "Decorative") == 0)
419 return wxDECORATIVE;
420 else if (strcmp(family, "Modern") == 0)
421 return wxMODERN;
422 else if (strcmp(family, "Script") == 0)
423 return wxSCRIPT;
424 else return wxSWISS;
425}
426
427int wxFontStyleStringToInt(char *style)
428{
429 if (!style)
430 return wxNORMAL;
431 if (strcmp(style, "Italic") == 0)
432 return wxITALIC;
433 else if (strcmp(style, "Slant") == 0)
434 return wxSLANT;
435 else
436 return wxNORMAL;
437}
438
439int wxFontWeightStringToInt(char *weight)
440{
441 if (!weight)
442 return wxNORMAL;
443 if (strcmp(weight, "Bold") == 0)
444 return wxBOLD;
445 else if (strcmp(weight, "Light") == 0)
446 return wxLIGHT;
447 else
448 return wxNORMAL;
449}
450
451