1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/generic/fontdlgg.cpp
3 // Purpose: Generic font dialog
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "fontdlgg.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
23 #if wxUSE_FONTDLG && (!defined(__WXGTK__) || defined(__WXUNIVERSAL__))
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"
42 #include "wx/cmndata.h"
44 #include "wx/fontdlg.h"
46 //-----------------------------------------------------------------------------
47 // helper class - wxFontPreviewer
48 //-----------------------------------------------------------------------------
50 class WXDLLEXPORT wxFontPreviewer
: public wxWindow
53 wxFontPreviewer(wxWindow
*parent
) : wxWindow(parent
, -1) {}
56 void OnPaint(wxPaintEvent
& event
);
60 BEGIN_EVENT_TABLE(wxFontPreviewer
, wxWindow
)
61 EVT_PAINT(wxFontPreviewer::OnPaint
)
64 void wxFontPreviewer::OnPaint(wxPaintEvent
& WXUNUSED(event
))
68 wxSize size
= GetSize();
69 wxFont font
= GetFont();
71 dc
.SetPen(*wxBLACK_PEN
);
72 dc
.SetBrush(*wxWHITE_BRUSH
);
73 dc
.DrawRectangle(0, 0, size
.x
, size
.y
);
77 dc
.SetFont(GetFont());
78 // Calculate vertical centre
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"),
85 dc
.DestroyClippingRegion();
89 //-----------------------------------------------------------------------------
90 // wxGenericFontDialog
91 //-----------------------------------------------------------------------------
93 IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog
, wxDialog
)
95 BEGIN_EVENT_TABLE(wxGenericFontDialog
, wxDialog
)
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
)
102 EVT_CLOSE(wxGenericFontDialog::OnCloseWindow
)
107 static wxString wxColourDialogNames
[NUM_COLS
]={wxT("ORANGE"),
113 wxT("MEDIUM VIOLET RED"),
118 wxT("MEDIUM SPRING GREEN"),
121 wxT("LIGHT STEEL BLUE"),
123 wxT("LIGHT MAGENTA"),
141 wxT("MEDIUM VIOLET RED"),
145 wxT("MEDIUM SEA GREEN"),
147 wxT("MIDNIGHT BLUE"),
153 wxT("MEDIUM FOREST GREEN"),
158 wxT("MEDIUM SLATE BLUE"),
163 * Generic wxFontDialog
166 void wxGenericFontDialog::Init()
175 wxGenericFontDialog::~wxGenericFontDialog()
179 void wxGenericFontDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
181 EndModal(wxID_CANCEL
);
184 bool wxGenericFontDialog::DoCreate(wxWindow
*parent
)
187 if ( !wxDialog::Create( parent
, -1 , _T("Choose Font") , wxDefaultPosition
, wxDefaultSize
, wxDEFAULT_DIALOG_STYLE
,
190 wxFAIL_MSG( wxT("wxFontDialog creation failed") );
200 int wxGenericFontDialog::ShowModal()
202 int ret
= wxDialog::ShowModal();
204 if (ret
!= wxID_CANCEL
)
206 m_fontData
.chosenFont
= dialogFont
;
212 void wxGenericFontDialog::CreateWidgets()
217 *families
= new wxString
[6],
218 *styles
= new wxString
[3],
219 *weights
= new wxString
[3];
220 families
[0] = _("Roman");
221 families
[1] = _("Decorative");
222 families
[2] = _("Modern");
223 families
[3] = _("Script");
224 families
[4] = _("Swiss" );
225 families
[5] = _("Teletype" );
226 styles
[0] = _("Normal");
227 styles
[1] = _("Italic");
228 styles
[2] = _("Slant");
229 weights
[0] = _("Normal");
230 weights
[1] = _("Light");
231 weights
[2] = _("Bold");
233 familyChoice
= new wxChoice(this, wxID_FONT_FAMILY
, wxDefaultPosition
, wxDefaultSize
, 5, families
);
234 styleChoice
= new wxChoice(this, wxID_FONT_STYLE
, wxDefaultPosition
, wxDefaultSize
, 3, styles
);
235 weightChoice
= new wxChoice(this, wxID_FONT_WEIGHT
, wxDefaultPosition
, wxDefaultSize
, 3, weights
);
237 colourChoice
= new wxChoice(this, wxID_FONT_COLOUR
, wxDefaultPosition
, wxDefaultSize
, NUM_COLS
, wxColourDialogNames
);
239 wxString
*pointSizes
= new wxString
[40];
241 for ( i
= 0; i
< 40; i
++)
244 sprintf(buf
, "%d", i
+ 1);
248 pointSizeChoice
= new wxChoice(this, wxID_FONT_SIZE
, wxDefaultPosition
, wxDefaultSize
, 40, pointSizes
);
249 underLineCheckBox
= new wxCheckBox(this, wxID_FONT_UNDERLINE
, _("Underline"));
251 m_previewer
= new wxFontPreviewer(this);
253 wxButton
*okButton
= new wxButton(this, wxID_OK
, _("OK"));
254 wxButton
*cancelButton
= new wxButton(this, wxID_OK
, _("Cancel"));
256 familyChoice
->SetStringSelection( wxFontFamilyIntToString(dialogFont
.GetFamily()) );
257 styleChoice
->SetStringSelection(wxFontStyleIntToString(dialogFont
.GetStyle()));
258 weightChoice
->SetStringSelection(wxFontWeightIntToString(dialogFont
.GetWeight()));
259 wxString
name(wxTheColourDatabase
->FindName(m_fontData
.fontColour
));
260 colourChoice
->SetStringSelection(name
);
262 underLineCheckBox
->SetValue(dialogFont
.GetUnderlined());
263 pointSizeChoice
->SetSelection(dialogFont
.GetPointSize()-1);
265 okButton
->SetDefault();
267 wxSizer
*topsizer
, *sizer
;
268 topsizer
= new wxBoxSizer(wxVERTICAL
);
270 sizer
= new wxBoxSizer(wxHORIZONTAL
);
271 sizer
->Add(familyChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
272 sizer
->Add(styleChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
273 sizer
->Add(weightChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
274 topsizer
->Add(sizer
, 0, wxLEFT
| wxTOP
| wxRIGHT
, 10);
276 sizer
= new wxBoxSizer(wxHORIZONTAL
);
277 sizer
->Add(colourChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
278 sizer
->Add(pointSizeChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
279 sizer
->Add(underLineCheckBox
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
280 topsizer
->Add(sizer
, 0, wxLEFT
| wxTOP
| wxRIGHT
, 10);
282 topsizer
->Add(m_previewer
, 1, wxALL
| wxEXPAND
, 10);
283 topsizer
->SetItemMinSize(m_previewer
, 430, 100);
285 sizer
= new wxBoxSizer(wxHORIZONTAL
);
286 sizer
->Add(okButton
, 0, wxRIGHT
, 10);
287 sizer
->Add(cancelButton
, 0, wxRIGHT
, 10);
288 topsizer
->Add(sizer
, 0, wxALIGN_RIGHT
| wxBOTTOM
, 10);
292 topsizer
->SetSizeHints(this);
304 void wxGenericFontDialog::InitializeFont()
306 int fontFamily
= wxSWISS
;
307 int fontWeight
= wxNORMAL
;
308 int fontStyle
= wxNORMAL
;
310 int fontUnderline
= FALSE
;
312 if (m_fontData
.initialFont
.Ok())
314 fontFamily
= m_fontData
.initialFont
.GetFamily();
315 fontWeight
= m_fontData
.initialFont
.GetWeight();
316 fontStyle
= m_fontData
.initialFont
.GetStyle();
317 fontSize
= m_fontData
.initialFont
.GetPointSize();
318 fontUnderline
= m_fontData
.initialFont
.GetUnderlined();
321 dialogFont
= wxFont(fontSize
, fontFamily
, fontStyle
, fontWeight
, (fontUnderline
!= 0));
324 m_previewer
->SetFont(dialogFont
);
327 void wxGenericFontDialog::OnChangeFont(wxCommandEvent
& WXUNUSED(event
))
329 if (!m_useEvents
) return;
331 int fontFamily
= 0; /* shut up buggy egcs warnings */
332 fontFamily
= wxFontFamilyStringToInt(WXSTRINGCAST familyChoice
->GetStringSelection());
334 fontWeight
= wxFontWeightStringToInt(WXSTRINGCAST weightChoice
->GetStringSelection());
336 fontStyle
= wxFontStyleStringToInt(WXSTRINGCAST styleChoice
->GetStringSelection());
337 int fontSize
= wxAtoi(pointSizeChoice
->GetStringSelection());
338 int fontUnderline
= underLineCheckBox
->GetValue();
340 dialogFont
= wxFont(fontSize
, fontFamily
, fontStyle
, fontWeight
, (fontUnderline
!= 0));
341 m_previewer
->SetFont(dialogFont
);
342 if (colourChoice
->GetStringSelection() != wxT(""))
344 wxColour
*col
= (wxColour
*) NULL
;
345 col
= wxTheColourDatabase
->FindColour(colourChoice
->GetStringSelection());
348 m_fontData
.fontColour
= *col
;
349 m_previewer
->SetForegroundColour(*col
);
352 m_previewer
->Refresh();
355 const wxChar
*wxFontWeightIntToString(int weight
)
365 return wxT("Normal");
369 const wxChar
*wxFontStyleIntToString(int style
)
374 return wxT("Italic");
379 return wxT("Normal");
383 const wxChar
*wxFontFamilyIntToString(int family
)
390 return wxT("Decorative");
392 return wxT("Modern");
394 return wxT("Script");
396 return wxT("Teletype");
403 int wxFontFamilyStringToInt(wxChar
*family
)
408 if (wxStrcmp(family
, wxT("Roman")) == 0)
410 else if (wxStrcmp(family
, wxT("Decorative")) == 0)
412 else if (wxStrcmp(family
, wxT("Modern")) == 0)
414 else if (wxStrcmp(family
, wxT("Script")) == 0)
416 else if (wxStrcmp(family
, wxT("Teletype")) == 0)
421 int wxFontStyleStringToInt(wxChar
*style
)
425 if (wxStrcmp(style
, wxT("Italic")) == 0)
427 else if (wxStrcmp(style
, wxT("Slant")) == 0)
433 int wxFontWeightStringToInt(wxChar
*weight
)
437 if (wxStrcmp(weight
, wxT("Bold")) == 0)
439 else if (wxStrcmp(weight
, wxT("Light")) == 0)