]> git.saurik.com Git - wxWidgets.git/blame - src/generic/fontdlgg.cpp
Motif cell highlighting problem fixed
[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)
e3065973 54 EVT_CLOSE(wxGenericFontDialog::OnCloseWindow)
c801d85f
KB
55END_EVENT_TABLE()
56
57#endif
58
59#define NUM_COLS 48
60static wxString wxColourDialogNames[NUM_COLS]={"ORANGE",
61 "GOLDENROD",
62 "WHEAT",
63 "SPRING GREEN",
64 "SKY BLUE",
65 "SLATE BLUE",
66 "MEDIUM VIOLET RED",
67 "PURPLE",
68
69 "RED",
70 "YELLOW",
71 "MEDIUM SPRING GREEN",
72 "PALE GREEN",
73 "CYAN",
74 "LIGHT STEEL BLUE",
75 "ORCHID",
76 "LIGHT MAGENTA",
77
78 "BROWN",
79 "YELLOW",
80 "GREEN",
81 "CADET BLUE",
82 "MEDIUM BLUE",
83 "MAGENTA",
84 "MAROON",
85 "ORANGE RED",
86
87 "FIREBRICK",
88 "CORAL",
89 "FOREST GREEN",
90 "AQUARAMINE",
91 "BLUE",
92 "NAVY",
93 "THISTLE",
94 "MEDIUM VIOLET RED",
95
96 "INDIAN RED",
97 "GOLD",
98 "MEDIUM SEA GREEN",
99 "MEDIUM BLUE",
100 "MIDNIGHT BLUE",
101 "GREY",
102 "PURPLE",
103 "KHAKI",
104
105 "BLACK",
106 "MEDIUM FOREST GREEN",
107 "KHAKI",
108 "DARK GREY",
109 "SEA GREEN",
110 "LIGHT GREY",
111 "MEDIUM SLATE BLUE",
112 "WHITE"
113 };
114
115/*
116 * Generic wxFontDialog
117 */
118
119wxGenericFontDialog::wxGenericFontDialog(void)
120{
66bd6b93 121 m_useEvents = FALSE;
c801d85f
KB
122 dialogParent = NULL;
123}
124
125wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, wxFontData *data):
1a5a8367 126 wxDialog(parent, -1, _("Font"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
c801d85f 127{
66bd6b93 128 m_useEvents = FALSE;
c801d85f
KB
129 Create(parent, data);
130}
131
132wxGenericFontDialog::~wxGenericFontDialog(void)
133{
134}
135
e3065973 136void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& event)
c801d85f 137{
e3065973 138 EndModal(wxID_CANCEL);
c801d85f
KB
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);
98ffbab9
JS
226 styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(170, 10), wxSize(120, -1), 3, styles);
227 weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(330, 10), wxSize(120, -1), 3, weights);
c801d85f 228
98ffbab9 229 colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(180, -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
3502e687 258 int by = (fontRect.y + fontRect.height + 15);
c801d85f 259
3502e687
RR
260 wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(230, by), wxSize(75,-1));
261 (void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(330, by), wxSize(75,-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
98ffbab9
JS
274 // SetClientSize(450, by + 40);
275 Fit();
c801d85f
KB
276
277 Centre(wxBOTH);
278
279 wxEndBusyCursor();
59043ba2
KB
280
281 delete[] families;
282 delete[] styles;
283 delete[] weights;
284 delete[] pointSizes;
66bd6b93 285 m_useEvents = TRUE;
c801d85f
KB
286}
287
288void wxGenericFontDialog::InitializeFont(void)
289{
290 int fontFamily = wxSWISS;
291 int fontWeight = wxNORMAL;
292 int fontStyle = wxNORMAL;
293 int fontSize = 12;
294 int fontUnderline = FALSE;
295 if (fontData.initialFont.Ok())
296 {
297 fontFamily = fontData.initialFont.GetFamily();
298 fontWeight = fontData.initialFont.GetWeight();
299 fontStyle = fontData.initialFont.GetStyle();
300 fontSize = fontData.initialFont.GetPointSize();
301 fontUnderline = fontData.initialFont.GetUnderlined();
302 }
303 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
c801d85f
KB
304}
305
306void wxGenericFontDialog::PaintFontBackground(wxDC& dc)
307{
308 dc.BeginDrawing();
309
310 dc.SetPen(*wxBLACK_PEN);
311 dc.SetBrush(*wxWHITE_BRUSH);
312 dc.DrawRectangle( fontRect.x, fontRect.y, fontRect.width, fontRect.height);
313 dc.EndDrawing();
314}
315
316void wxGenericFontDialog::PaintFont(wxDC& dc)
317{
318 dc.BeginDrawing();
319 if (dialogFont.Ok())
320 {
321 dc.SetFont(dialogFont);
322 // Calculate vertical centre
323 long w, h;
324 dc.GetTextExtent("X", &w, &h);
325 float cx = (float)(fontRect.x + 10);
326 float cy = (float)(fontRect.y + (fontRect.height/2.0) - (h/2.0));
327 dc.SetTextForeground(fontData.fontColour);
328 dc.SetClippingRegion( fontRect.x, fontRect.y, (long)(fontRect.width-2.0), (long)(fontRect.height-2.0));
1a5a8367 329 dc.DrawText(_("ABCDEFGabcdefg12345"), (long)cx, (long)cy);
c801d85f
KB
330 dc.DestroyClippingRegion();
331 dc.SetFont(wxNullFont);
332 }
333 dc.EndDrawing();
334}
335
336void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
337{
66bd6b93
RR
338 if (!m_useEvents) return;
339
bbe0af5b
RR
340 int fontFamily = 0; /* shut up buggy egcs warnings */
341 fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
342 int fontWeight = 0;
343 fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
344 int fontStyle = 0;
345 fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
c801d85f
KB
346 int fontSize = atoi(pointSizeChoice->GetStringSelection());
347 int fontUnderline = underLineCheckBox->GetValue();
348
349 dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
350 if (colourChoice->GetStringSelection() != "")
351 {
bbe0af5b
RR
352 wxColour *col = (wxColour*) NULL;
353 col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection());
c801d85f
KB
354 if (col)
355 {
356 fontData.fontColour = *col;
357 }
358 }
359 wxClientDC dc(this);
360 PaintFontBackground(dc);
361 PaintFont(dc);
362}
363
364char *wxFontWeightIntToString(int weight)
365{
366 switch (weight)
367 {
368 case wxLIGHT:
369 return "Light";
370 case wxBOLD:
371 return "Bold";
372 case wxNORMAL:
373 default:
374 return "Normal";
375 }
376 return "Normal";
377}
378
379char *wxFontStyleIntToString(int style)
380{
381 switch (style)
382 {
383 case wxITALIC:
384 return "Italic";
385 case wxSLANT:
386 return "Slant";
387 case wxNORMAL:
388 default:
389 return "Normal";
390 }
391 return "Normal";
392}
393
394char *wxFontFamilyIntToString(int family)
395{
396 switch (family)
397 {
398 case wxROMAN:
399 return "Roman";
400 case wxDECORATIVE:
401 return "Decorative";
402 case wxMODERN:
403 return "Modern";
404 case wxSCRIPT:
405 return "Script";
36b3b54a
RR
406 case wxTELETYPE:
407 return "Teletype";
c801d85f
KB
408 case wxSWISS:
409 default:
410 return "Swiss";
411 }
412 return "Swiss";
413}
414
415int wxFontFamilyStringToInt(char *family)
416{
417 if (!family)
418 return wxSWISS;
419
420 if (strcmp(family, "Roman") == 0)
421 return wxROMAN;
422 else if (strcmp(family, "Decorative") == 0)
423 return wxDECORATIVE;
424 else if (strcmp(family, "Modern") == 0)
425 return wxMODERN;
426 else if (strcmp(family, "Script") == 0)
427 return wxSCRIPT;
36b3b54a
RR
428 else if (strcmp(family, "Teletype") == 0)
429 return wxTELETYPE;
c801d85f
KB
430 else return wxSWISS;
431}
432
433int wxFontStyleStringToInt(char *style)
434{
435 if (!style)
436 return wxNORMAL;
437 if (strcmp(style, "Italic") == 0)
438 return wxITALIC;
439 else if (strcmp(style, "Slant") == 0)
440 return wxSLANT;
441 else
442 return wxNORMAL;
443}
444
445int wxFontWeightStringToInt(char *weight)
446{
447 if (!weight)
448 return wxNORMAL;
449 if (strcmp(weight, "Bold") == 0)
450 return wxBOLD;
451 else if (strcmp(weight, "Light") == 0)
452 return wxLIGHT;
453 else
454 return wxNORMAL;
455}
456
457