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()
173 wxGenericFontDialog::~wxGenericFontDialog()
177 void wxGenericFontDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
179 EndModal(wxID_CANCEL
);
182 bool wxGenericFontDialog::DoCreate(wxWindow
*parent
)
185 if ( !wxDialog::Create( parent
, -1 , _T("Choose Font") , wxDefaultPosition
, wxDefaultSize
, wxDEFAULT_DIALOG_STYLE
,
188 wxFAIL_MSG( wxT("wxFontDialog creation failed") );
198 int wxGenericFontDialog::ShowModal()
200 int ret
= wxDialog::ShowModal();
202 if (ret
!= wxID_CANCEL
)
204 m_fontData
.chosenFont
= dialogFont
;
210 void wxGenericFontDialog::CreateWidgets()
215 *families
= new wxString
[6],
216 *styles
= new wxString
[3],
217 *weights
= new wxString
[3];
218 families
[0] = _("Roman");
219 families
[1] = _("Decorative");
220 families
[2] = _("Modern");
221 families
[3] = _("Script");
222 families
[4] = _("Swiss" );
223 families
[5] = _("Teletype" );
224 styles
[0] = _("Normal");
225 styles
[1] = _("Italic");
226 styles
[2] = _("Slant");
227 weights
[0] = _("Normal");
228 weights
[1] = _("Light");
229 weights
[2] = _("Bold");
231 familyChoice
= new wxChoice(this, wxID_FONT_FAMILY
, wxDefaultPosition
, wxDefaultSize
, 5, families
);
232 styleChoice
= new wxChoice(this, wxID_FONT_STYLE
, wxDefaultPosition
, wxDefaultSize
, 3, styles
);
233 weightChoice
= new wxChoice(this, wxID_FONT_WEIGHT
, wxDefaultPosition
, wxDefaultSize
, 3, weights
);
235 colourChoice
= new wxChoice(this, wxID_FONT_COLOUR
, wxDefaultPosition
, wxDefaultSize
, NUM_COLS
, wxColourDialogNames
);
237 wxString
*pointSizes
= new wxString
[40];
239 for ( i
= 0; i
< 40; i
++)
242 sprintf(buf
, "%d", i
+ 1);
246 pointSizeChoice
= new wxChoice(this, wxID_FONT_SIZE
, wxDefaultPosition
, wxDefaultSize
, 40, pointSizes
);
247 underLineCheckBox
= new wxCheckBox(this, wxID_FONT_UNDERLINE
, _("Underline"));
249 m_previewer
= new wxFontPreviewer(this);
251 wxButton
*okButton
= new wxButton(this, wxID_OK
, _("OK"));
252 wxButton
*cancelButton
= new wxButton(this, wxID_OK
, _("Cancel"));
254 familyChoice
->SetStringSelection( wxFontFamilyIntToString(dialogFont
.GetFamily()) );
255 styleChoice
->SetStringSelection(wxFontStyleIntToString(dialogFont
.GetStyle()));
256 weightChoice
->SetStringSelection(wxFontWeightIntToString(dialogFont
.GetWeight()));
257 wxString
name(wxTheColourDatabase
->FindName(m_fontData
.fontColour
));
258 colourChoice
->SetStringSelection(name
);
260 underLineCheckBox
->SetValue(dialogFont
.GetUnderlined());
261 pointSizeChoice
->SetSelection(dialogFont
.GetPointSize()-1);
263 okButton
->SetDefault();
265 wxSizer
*topsizer
, *sizer
;
266 topsizer
= new wxBoxSizer(wxVERTICAL
);
268 sizer
= new wxBoxSizer(wxHORIZONTAL
);
269 sizer
->Add(familyChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
270 sizer
->Add(styleChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
271 sizer
->Add(weightChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
272 topsizer
->Add(sizer
, 0, wxLEFT
| wxTOP
| wxRIGHT
, 10);
274 sizer
= new wxBoxSizer(wxHORIZONTAL
);
275 sizer
->Add(colourChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
276 sizer
->Add(pointSizeChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
277 sizer
->Add(underLineCheckBox
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
278 topsizer
->Add(sizer
, 0, wxLEFT
| wxTOP
| wxRIGHT
, 10);
280 topsizer
->Add(m_previewer
, 1, wxALL
| wxEXPAND
, 10);
281 topsizer
->SetItemMinSize(m_previewer
, 430, 100);
283 sizer
= new wxBoxSizer(wxHORIZONTAL
);
284 sizer
->Add(okButton
, 0, wxRIGHT
, 10);
285 sizer
->Add(cancelButton
, 0, wxRIGHT
, 10);
286 topsizer
->Add(sizer
, 0, wxALIGN_RIGHT
| wxBOTTOM
, 10);
290 topsizer
->SetSizeHints(this);
302 void wxGenericFontDialog::InitializeFont()
304 int fontFamily
= wxSWISS
;
305 int fontWeight
= wxNORMAL
;
306 int fontStyle
= wxNORMAL
;
308 int fontUnderline
= FALSE
;
310 if (m_fontData
.initialFont
.Ok())
312 fontFamily
= m_fontData
.initialFont
.GetFamily();
313 fontWeight
= m_fontData
.initialFont
.GetWeight();
314 fontStyle
= m_fontData
.initialFont
.GetStyle();
315 fontSize
= m_fontData
.initialFont
.GetPointSize();
316 fontUnderline
= m_fontData
.initialFont
.GetUnderlined();
319 dialogFont
= wxFont(fontSize
, fontFamily
, fontStyle
, fontWeight
, (fontUnderline
!= 0));
322 m_previewer
->SetFont(dialogFont
);
325 void wxGenericFontDialog::OnChangeFont(wxCommandEvent
& WXUNUSED(event
))
327 if (!m_useEvents
) return;
329 int fontFamily
= 0; /* shut up buggy egcs warnings */
330 fontFamily
= wxFontFamilyStringToInt(WXSTRINGCAST familyChoice
->GetStringSelection());
332 fontWeight
= wxFontWeightStringToInt(WXSTRINGCAST weightChoice
->GetStringSelection());
334 fontStyle
= wxFontStyleStringToInt(WXSTRINGCAST styleChoice
->GetStringSelection());
335 int fontSize
= wxAtoi(pointSizeChoice
->GetStringSelection());
336 int fontUnderline
= underLineCheckBox
->GetValue();
338 dialogFont
= wxFont(fontSize
, fontFamily
, fontStyle
, fontWeight
, (fontUnderline
!= 0));
339 m_previewer
->SetFont(dialogFont
);
340 if (colourChoice
->GetStringSelection() != wxT(""))
342 wxColour
*col
= (wxColour
*) NULL
;
343 col
= wxTheColourDatabase
->FindColour(colourChoice
->GetStringSelection());
346 m_fontData
.fontColour
= *col
;
347 m_previewer
->SetForegroundColour(*col
);
350 m_previewer
->Refresh();
353 const wxChar
*wxFontWeightIntToString(int weight
)
363 return wxT("Normal");
367 const wxChar
*wxFontStyleIntToString(int style
)
372 return wxT("Italic");
377 return wxT("Normal");
381 const wxChar
*wxFontFamilyIntToString(int family
)
388 return wxT("Decorative");
390 return wxT("Modern");
392 return wxT("Script");
394 return wxT("Teletype");
401 int wxFontFamilyStringToInt(wxChar
*family
)
406 if (wxStrcmp(family
, wxT("Roman")) == 0)
408 else if (wxStrcmp(family
, wxT("Decorative")) == 0)
410 else if (wxStrcmp(family
, wxT("Modern")) == 0)
412 else if (wxStrcmp(family
, wxT("Script")) == 0)
414 else if (wxStrcmp(family
, wxT("Teletype")) == 0)
419 int wxFontStyleStringToInt(wxChar
*style
)
423 if (wxStrcmp(style
, wxT("Italic")) == 0)
425 else if (wxStrcmp(style
, wxT("Slant")) == 0)
431 int wxFontWeightStringToInt(wxChar
*weight
)
435 if (wxStrcmp(weight
, wxT("Bold")) == 0)
437 else if (wxStrcmp(weight
, wxT("Light")) == 0)