]> git.saurik.com Git - wxWidgets.git/blame - src/generic/fontdlgg.cpp
Redid parts of wxScroledWindow
[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
c801d85f
KB
338 int fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
339 int fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
340 int fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
341 int fontSize = atoi(pointSizeChoice->GetStringSelection());
342 int fontUnderline = underLineCheckBox->GetValue();
343
344 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
345 if (colourChoice->GetStringSelection() != "")
346 {
347 wxColour *col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
348 if (col)
349 {
350 fontData.fontColour = *col;
351 }
352 }
353 wxClientDC dc(this);
354 PaintFontBackground(dc);
355 PaintFont(dc);
356}
357
358char *wxFontWeightIntToString(int weight)
359{
360 switch (weight)
361 {
362 case wxLIGHT:
363 return "Light";
364 case wxBOLD:
365 return "Bold";
366 case wxNORMAL:
367 default:
368 return "Normal";
369 }
370 return "Normal";
371}
372
373char *wxFontStyleIntToString(int style)
374{
375 switch (style)
376 {
377 case wxITALIC:
378 return "Italic";
379 case wxSLANT:
380 return "Slant";
381 case wxNORMAL:
382 default:
383 return "Normal";
384 }
385 return "Normal";
386}
387
388char *wxFontFamilyIntToString(int family)
389{
390 switch (family)
391 {
392 case wxROMAN:
393 return "Roman";
394 case wxDECORATIVE:
395 return "Decorative";
396 case wxMODERN:
397 return "Modern";
398 case wxSCRIPT:
399 return "Script";
400 case wxSWISS:
401 default:
402 return "Swiss";
403 }
404 return "Swiss";
405}
406
407int wxFontFamilyStringToInt(char *family)
408{
409 if (!family)
410 return wxSWISS;
411
412 if (strcmp(family, "Roman") == 0)
413 return wxROMAN;
414 else if (strcmp(family, "Decorative") == 0)
415 return wxDECORATIVE;
416 else if (strcmp(family, "Modern") == 0)
417 return wxMODERN;
418 else if (strcmp(family, "Script") == 0)
419 return wxSCRIPT;
420 else return wxSWISS;
421}
422
423int wxFontStyleStringToInt(char *style)
424{
425 if (!style)
426 return wxNORMAL;
427 if (strcmp(style, "Italic") == 0)
428 return wxITALIC;
429 else if (strcmp(style, "Slant") == 0)
430 return wxSLANT;
431 else
432 return wxNORMAL;
433}
434
435int wxFontWeightStringToInt(char *weight)
436{
437 if (!weight)
438 return wxNORMAL;
439 if (strcmp(weight, "Bold") == 0)
440 return wxBOLD;
441 else if (strcmp(weight, "Light") == 0)
442 return wxLIGHT;
443 else
444 return wxNORMAL;
445}
446
447