1 /////////////////////////////////////////////////////////////////////////////
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/generic/fontdlgg.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 wxGenericFontDialog::wxGenericFontDialog(void)
173 wxGenericFontDialog::wxGenericFontDialog(wxWindow
*parent
, wxFontData
*data
):
174 wxDialog(parent
, -1, _("Font"), wxDefaultPosition
, wxDefaultSize
,
175 wxDEFAULT_DIALOG_STYLE
|wxDIALOG_MODAL
|wxRESIZE_BORDER
)
179 Create(parent
, data
);
182 wxGenericFontDialog::~wxGenericFontDialog(void)
186 void wxGenericFontDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
188 EndModal(wxID_CANCEL
);
191 bool wxGenericFontDialog::Create(wxWindow
*parent
, wxFontData
*data
)
193 dialogParent
= parent
;
204 int wxGenericFontDialog::ShowModal(void)
206 int ret
= wxDialog::ShowModal();
208 if (ret
!= wxID_CANCEL
)
210 fontData
.chosenFont
= dialogFont
;
216 void wxGenericFontDialog::CreateWidgets(void)
221 *families
= new wxString
[6],
222 *styles
= new wxString
[3],
223 *weights
= new wxString
[3];
224 families
[0] = _("Roman");
225 families
[1] = _("Decorative");
226 families
[2] = _("Modern");
227 families
[3] = _("Script");
228 families
[4] = _("Swiss" );
229 families
[5] = _("Teletype" );
230 styles
[0] = _("Normal");
231 styles
[1] = _("Italic");
232 styles
[2] = _("Slant");
233 weights
[0] = _("Normal");
234 weights
[1] = _("Light");
235 weights
[2] = _("Bold");
237 familyChoice
= new wxChoice(this, wxID_FONT_FAMILY
, wxDefaultPosition
, wxDefaultSize
, 5, families
);
238 styleChoice
= new wxChoice(this, wxID_FONT_STYLE
, wxDefaultPosition
, wxDefaultSize
, 3, styles
);
239 weightChoice
= new wxChoice(this, wxID_FONT_WEIGHT
, wxDefaultPosition
, wxDefaultSize
, 3, weights
);
241 colourChoice
= new wxChoice(this, wxID_FONT_COLOUR
, wxDefaultPosition
, wxDefaultSize
, NUM_COLS
, wxColourDialogNames
);
243 wxString
*pointSizes
= new wxString
[40];
245 for ( i
= 0; i
< 40; i
++)
248 sprintf(buf
, "%d", i
+ 1);
252 pointSizeChoice
= new wxChoice(this, wxID_FONT_SIZE
, wxDefaultPosition
, wxDefaultSize
, 40, pointSizes
);
253 underLineCheckBox
= new wxCheckBox(this, wxID_FONT_UNDERLINE
, _("Underline"));
255 m_previewer
= new wxFontPreviewer(this);
257 wxButton
*okButton
= new wxButton(this, wxID_OK
, _("OK"));
258 wxButton
*cancelButton
= new wxButton(this, wxID_OK
, _("Cancel"));
260 familyChoice
->SetStringSelection( wxFontFamilyIntToString(dialogFont
.GetFamily()) );
261 styleChoice
->SetStringSelection(wxFontStyleIntToString(dialogFont
.GetStyle()));
262 weightChoice
->SetStringSelection(wxFontWeightIntToString(dialogFont
.GetWeight()));
263 wxString
name(wxTheColourDatabase
->FindName(fontData
.fontColour
));
264 colourChoice
->SetStringSelection(name
);
266 underLineCheckBox
->SetValue(dialogFont
.GetUnderlined());
267 pointSizeChoice
->SetSelection(dialogFont
.GetPointSize()-1);
269 okButton
->SetDefault();
271 wxSizer
*topsizer
, *sizer
;
272 topsizer
= new wxBoxSizer(wxVERTICAL
);
274 sizer
= new wxBoxSizer(wxHORIZONTAL
);
275 sizer
->Add(familyChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
276 sizer
->Add(styleChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
277 sizer
->Add(weightChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
278 topsizer
->Add(sizer
, 0, wxLEFT
| wxTOP
| wxRIGHT
, 10);
280 sizer
= new wxBoxSizer(wxHORIZONTAL
);
281 sizer
->Add(colourChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
282 sizer
->Add(pointSizeChoice
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
283 sizer
->Add(underLineCheckBox
, 0, wxALIGN_CENTER
| wxLEFT
, 10);
284 topsizer
->Add(sizer
, 0, wxLEFT
| wxTOP
| wxRIGHT
, 10);
286 topsizer
->Add(m_previewer
, 1, wxALL
| wxEXPAND
, 10);
287 topsizer
->SetItemMinSize(m_previewer
, 430, 100);
289 sizer
= new wxBoxSizer(wxHORIZONTAL
);
290 sizer
->Add(okButton
, 0, wxRIGHT
, 10);
291 sizer
->Add(cancelButton
, 0, wxRIGHT
, 10);
292 topsizer
->Add(sizer
, 0, wxALIGN_RIGHT
| wxBOTTOM
, 10);
296 topsizer
->SetSizeHints(this);
308 void wxGenericFontDialog::InitializeFont(void)
310 int fontFamily
= wxSWISS
;
311 int fontWeight
= wxNORMAL
;
312 int fontStyle
= wxNORMAL
;
314 int fontUnderline
= FALSE
;
316 if (fontData
.initialFont
.Ok())
318 fontFamily
= fontData
.initialFont
.GetFamily();
319 fontWeight
= fontData
.initialFont
.GetWeight();
320 fontStyle
= fontData
.initialFont
.GetStyle();
321 fontSize
= fontData
.initialFont
.GetPointSize();
322 fontUnderline
= fontData
.initialFont
.GetUnderlined();
325 dialogFont
= wxFont(fontSize
, fontFamily
, fontStyle
, fontWeight
, (fontUnderline
!= 0));
328 m_previewer
->SetFont(dialogFont
);
331 void wxGenericFontDialog::OnChangeFont(wxCommandEvent
& WXUNUSED(event
))
333 if (!m_useEvents
) return;
335 int fontFamily
= 0; /* shut up buggy egcs warnings */
336 fontFamily
= wxFontFamilyStringToInt(WXSTRINGCAST familyChoice
->GetStringSelection());
338 fontWeight
= wxFontWeightStringToInt(WXSTRINGCAST weightChoice
->GetStringSelection());
340 fontStyle
= wxFontStyleStringToInt(WXSTRINGCAST styleChoice
->GetStringSelection());
341 int fontSize
= wxAtoi(pointSizeChoice
->GetStringSelection());
342 int fontUnderline
= underLineCheckBox
->GetValue();
344 dialogFont
= wxFont(fontSize
, fontFamily
, fontStyle
, fontWeight
, (fontUnderline
!= 0));
345 m_previewer
->SetFont(dialogFont
);
346 if (colourChoice
->GetStringSelection() != wxT(""))
348 wxColour
*col
= (wxColour
*) NULL
;
349 col
= wxTheColourDatabase
->FindColour(colourChoice
->GetStringSelection());
352 fontData
.fontColour
= *col
;
353 m_previewer
->SetForegroundColour(*col
);
356 m_previewer
->Refresh();
359 const wxChar
*wxFontWeightIntToString(int weight
)
369 return wxT("Normal");
373 const wxChar
*wxFontStyleIntToString(int style
)
378 return wxT("Italic");
383 return wxT("Normal");
387 const wxChar
*wxFontFamilyIntToString(int family
)
394 return wxT("Decorative");
396 return wxT("Modern");
398 return wxT("Script");
400 return wxT("Teletype");
407 int wxFontFamilyStringToInt(wxChar
*family
)
412 if (wxStrcmp(family
, wxT("Roman")) == 0)
414 else if (wxStrcmp(family
, wxT("Decorative")) == 0)
416 else if (wxStrcmp(family
, wxT("Modern")) == 0)
418 else if (wxStrcmp(family
, wxT("Script")) == 0)
420 else if (wxStrcmp(family
, wxT("Teletype")) == 0)
425 int wxFontStyleStringToInt(wxChar
*style
)
429 if (wxStrcmp(style
, wxT("Italic")) == 0)
431 else if (wxStrcmp(style
, wxT("Slant")) == 0)
437 int wxFontWeightStringToInt(wxChar
*weight
)
441 if (wxStrcmp(weight
, wxT("Bold")) == 0)
443 else if (wxStrcmp(weight
, wxT("Light")) == 0)