]> git.saurik.com Git - wxWidgets.git/blame - src/generic/fontdlgg.cpp
latest CW additions
[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
36b3b54a 207 *families = new wxString[6],
59043ba2
KB
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" );
36b3b54a 215 families[5] = _("Teletype" );
59043ba2
KB
216 styles[0] = _("Normal");
217 styles[1] = _("Italic");
218 styles[2] = _("Slant");
219 weights[0] = _("Normal");
220 weights[1] = _("Light");
221 weights[2] = _("Bold");
222
c801d85f
KB
223 int x=-1;
224 int y=40;
225 familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxPoint(10, 10), wxSize(120, -1), 5, families);
55acd85e
JS
226 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(160, 10), wxSize(120, -1), 3, styles);
227 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(310, 10), wxSize(120, -1), 3, weights);
c801d85f
KB
228
229 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(190, -1), NUM_COLS, wxColourDialogNames);
c030b70f 230#if 0 // def __WXMOTIF__ // TODO: This necessary now?
c801d85f
KB
231 // We want the pointSizeText to line up on the y axis with the colourChoice
232 colourChoice->GetPosition(&fontRect.x, &y); //NL mod
233 y+=3; //NL mod
234#endif
235
59043ba2 236 wxString *pointSizes = new wxString[40];
c801d85f
KB
237 int i;
238 for ( i = 0; i < 40; i++)
239 {
240 char buf[5];
241 sprintf(buf, "%d", i + 1);
242 pointSizes[i] = buf;
243 }
244
55acd85e
JS
245 pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(230, y), wxSize(50, -1), 40, pointSizes);
246 underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(320, y));
c801d85f
KB
247
248 int rectY;
249 pointSizeChoice->GetPosition(&x, &rectY); //NL mod
250 fontRect.y = rectY;
251 pointSizeChoice->GetSize(&x, &y); //NL mod
252
253 // Calculate the position of the bottom of the pointSizeChoice, and place
254 // the fontRect there (+5 for a nice gap)
255
256 fontRect.y+=y+5; //NL mod
257
b527aac5 258 int by = (fontRect.y + fontRect.height + 10);
c801d85f 259
b527aac5
RR
260 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(220, by), wxSize(100,-1));
261 (void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(340, by), wxSize(100,-1));
c801d85f 262
66bd6b93 263 familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) );
c801d85f
KB
264 styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle()));
265 weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight()));
266 wxString name(wxTheColourDatabase->FindName(fontData.fontColour));
267 colourChoice->SetStringSelection(name);
268
269 underLineCheckBox->SetValue(dialogFont.GetUnderlined());
66bd6b93 270 pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
c801d85f
KB
271
272 okButton->SetDefault();
273
55acd85e 274 SetClientSize(450, by + 40);
c801d85f
KB
275
276 Centre(wxBOTH);
277
278 wxEndBusyCursor();
59043ba2
KB
279
280 delete[] families;
281 delete[] styles;
282 delete[] weights;
283 delete[] pointSizes;
66bd6b93 284 m_useEvents = TRUE;
c801d85f
KB
285}
286
287void wxGenericFontDialog::InitializeFont(void)
288{
289 int fontFamily = wxSWISS;
290 int fontWeight = wxNORMAL;
291 int fontStyle = wxNORMAL;
292 int fontSize = 12;
293 int fontUnderline = FALSE;
294 if (fontData.initialFont.Ok())
295 {
296 fontFamily = fontData.initialFont.GetFamily();
297 fontWeight = fontData.initialFont.GetWeight();
298 fontStyle = fontData.initialFont.GetStyle();
299 fontSize = fontData.initialFont.GetPointSize();
300 fontUnderline = fontData.initialFont.GetUnderlined();
301 }
302 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
c801d85f
KB
303}
304
305void wxGenericFontDialog::PaintFontBackground(wxDC& dc)
306{
307 dc.BeginDrawing();
308
309 dc.SetPen(*wxBLACK_PEN);
310 dc.SetBrush(*wxWHITE_BRUSH);
311 dc.DrawRectangle( fontRect.x, fontRect.y, fontRect.width, fontRect.height);
312 dc.EndDrawing();
313}
314
315void wxGenericFontDialog::PaintFont(wxDC& dc)
316{
317 dc.BeginDrawing();
318 if (dialogFont.Ok())
319 {
320 dc.SetFont(dialogFont);
321 // Calculate vertical centre
322 long w, h;
323 dc.GetTextExtent("X", &w, &h);
324 float cx = (float)(fontRect.x + 10);
325 float cy = (float)(fontRect.y + (fontRect.height/2.0) - (h/2.0));
326 dc.SetTextForeground(fontData.fontColour);
327 dc.SetClippingRegion( fontRect.x, fontRect.y, (long)(fontRect.width-2.0), (long)(fontRect.height-2.0));
1a5a8367 328 dc.DrawText(_("ABCDEFGabcdefg12345"), (long)cx, (long)cy);
c801d85f
KB
329 dc.DestroyClippingRegion();
330 dc.SetFont(wxNullFont);
331 }
332 dc.EndDrawing();
333}
334
335void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
336{
66bd6b93
RR
337 if (!m_useEvents) return;
338
bbe0af5b
RR
339 int fontFamily = 0; /* shut up buggy egcs warnings */
340 fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
341 int fontWeight = 0;
342 fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
343 int fontStyle = 0;
344 fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
c801d85f
KB
345 int fontSize = atoi(pointSizeChoice->GetStringSelection());
346 int fontUnderline = underLineCheckBox->GetValue();
347
348 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
349 if (colourChoice->GetStringSelection() != "")
350 {
bbe0af5b
RR
351 wxColour *col = (wxColour*) NULL;
352 col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
c801d85f
KB
353 if (col)
354 {
355 fontData.fontColour = *col;
356 }
357 }
358 wxClientDC dc(this);
359 PaintFontBackground(dc);
360 PaintFont(dc);
361}
362
363char *wxFontWeightIntToString(int weight)
364{
365 switch (weight)
366 {
367 case wxLIGHT:
368 return "Light";
369 case wxBOLD:
370 return "Bold";
371 case wxNORMAL:
372 default:
373 return "Normal";
374 }
375 return "Normal";
376}
377
378char *wxFontStyleIntToString(int style)
379{
380 switch (style)
381 {
382 case wxITALIC:
383 return "Italic";
384 case wxSLANT:
385 return "Slant";
386 case wxNORMAL:
387 default:
388 return "Normal";
389 }
390 return "Normal";
391}
392
393char *wxFontFamilyIntToString(int family)
394{
395 switch (family)
396 {
397 case wxROMAN:
398 return "Roman";
399 case wxDECORATIVE:
400 return "Decorative";
401 case wxMODERN:
402 return "Modern";
403 case wxSCRIPT:
404 return "Script";
36b3b54a
RR
405 case wxTELETYPE:
406 return "Teletype";
c801d85f
KB
407 case wxSWISS:
408 default:
409 return "Swiss";
410 }
411 return "Swiss";
412}
413
414int wxFontFamilyStringToInt(char *family)
415{
416 if (!family)
417 return wxSWISS;
418
419 if (strcmp(family, "Roman") == 0)
420 return wxROMAN;
421 else if (strcmp(family, "Decorative") == 0)
422 return wxDECORATIVE;
423 else if (strcmp(family, "Modern") == 0)
424 return wxMODERN;
425 else if (strcmp(family, "Script") == 0)
426 return wxSCRIPT;
36b3b54a
RR
427 else if (strcmp(family, "Teletype") == 0)
428 return wxTELETYPE;
c801d85f
KB
429 else return wxSWISS;
430}
431
432int wxFontStyleStringToInt(char *style)
433{
434 if (!style)
435 return wxNORMAL;
436 if (strcmp(style, "Italic") == 0)
437 return wxITALIC;
438 else if (strcmp(style, "Slant") == 0)
439 return wxSLANT;
440 else
441 return wxNORMAL;
442}
443
444int wxFontWeightStringToInt(char *weight)
445{
446 if (!weight)
447 return wxNORMAL;
448 if (strcmp(weight, "Bold") == 0)
449 return wxBOLD;
450 else if (strcmp(weight, "Light") == 0)
451 return wxLIGHT;
452 else
453 return wxNORMAL;
454}
455
456