1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/richtext/richeditfontpage.cpp
3 // Purpose: Font page for wxRichTextFormattingDialog
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
15 #include "../../include/wx/richtext/richtextfontpage.h"
21 * wxRichTextFontPage type definition
24 IMPLEMENT_DYNAMIC_CLASS( wxRichTextFontPage
, wxPanel
)
27 * wxRichTextFontPage event table definition
30 BEGIN_EVENT_TABLE( wxRichTextFontPage
, wxPanel
)
31 EVT_LISTBOX( ID_RICHTEXTFONTPAGE_FACELISTBOX
, wxRichTextFontPage::OnFaceListBoxSelected
)
32 EVT_BUTTON( ID_RICHTEXTFONTPAGE_COLOURCTRL
, wxRichTextFontPage::OnColourClicked
)
34 ////@begin wxRichTextFontPage event table entries
35 EVT_TEXT( ID_RICHTEXTFONTPAGE_FACETEXTCTRL
, wxRichTextFontPage::OnFaceTextCtrlUpdated
)
37 EVT_TEXT( ID_RICHTEXTFONTPAGE_SIZETEXTCTRL
, wxRichTextFontPage::OnSizeTextCtrlUpdated
)
39 EVT_LISTBOX( ID_RICHTEXTFONTPAGE_SIZELISTBOX
, wxRichTextFontPage::OnSizeListBoxSelected
)
41 EVT_COMBOBOX( ID_RICHTEXTFONTPAGE_STYLECTRL
, wxRichTextFontPage::OnStyleCtrlSelected
)
43 EVT_COMBOBOX( ID_RICHTEXTFONTPAGE_WEIGHTCTRL
, wxRichTextFontPage::OnWeightCtrlSelected
)
45 EVT_COMBOBOX( ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL
, wxRichTextFontPage::OnUnderliningCtrlSelected
)
47 ////@end wxRichTextFontPage event table entries
52 * wxRichTextFontPage constructors
55 wxRichTextFontPage::wxRichTextFontPage( )
60 wxRichTextFontPage::wxRichTextFontPage( wxWindow
* parent
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
, long style
)
63 Create(parent
, id
, pos
, size
, style
);
70 void wxRichTextFontPage::Init()
73 m_colourPresent
= false;
75 ////@begin wxRichTextFontPage member initialisation
76 m_faceTextCtrl
= NULL
;
78 m_sizeTextCtrl
= NULL
;
82 m_underliningCtrl
= NULL
;
85 ////@end wxRichTextFontPage member initialisation
89 * wxRichTextFontPage creator
92 bool wxRichTextFontPage::Create( wxWindow
* parent
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
, long style
)
94 ////@begin wxRichTextFontPage creation
95 wxPanel::Create( parent
, id
, pos
, size
, style
);
100 GetSizer()->SetSizeHints(this);
103 ////@end wxRichTextFontPage creation
108 * Control creation for wxRichTextFontPage
111 void wxRichTextFontPage::CreateControls()
113 ////@begin wxRichTextFontPage content construction
114 wxRichTextFontPage
* itemPanel1
= this;
116 wxBoxSizer
* itemBoxSizer2
= new wxBoxSizer(wxVERTICAL
);
117 itemPanel1
->SetSizer(itemBoxSizer2
);
119 wxBoxSizer
* itemBoxSizer3
= new wxBoxSizer(wxVERTICAL
);
120 itemBoxSizer2
->Add(itemBoxSizer3
, 1, wxGROW
|wxALL
, 5);
122 wxBoxSizer
* itemBoxSizer4
= new wxBoxSizer(wxHORIZONTAL
);
123 itemBoxSizer3
->Add(itemBoxSizer4
, 1, wxGROW
, 5);
125 wxBoxSizer
* itemBoxSizer5
= new wxBoxSizer(wxVERTICAL
);
126 itemBoxSizer4
->Add(itemBoxSizer5
, 1, wxGROW
, 5);
128 wxStaticText
* itemStaticText6
= new wxStaticText( itemPanel1
, wxID_STATIC
, _("&Font:"), wxDefaultPosition
, wxDefaultSize
, 0 );
129 itemBoxSizer5
->Add(itemStaticText6
, 0, wxALIGN_LEFT
|wxLEFT
|wxRIGHT
|wxTOP
|wxADJUST_MINSIZE
, 5);
131 m_faceTextCtrl
= new wxTextCtrl( itemPanel1
, ID_RICHTEXTFONTPAGE_FACETEXTCTRL
, _T(""), wxDefaultPosition
, wxDefaultSize
, 0 );
132 m_faceTextCtrl
->SetHelpText(_("Type a font name."));
134 m_faceTextCtrl
->SetToolTip(_("Type a font name."));
135 itemBoxSizer5
->Add(m_faceTextCtrl
, 0, wxGROW
|wxLEFT
|wxRIGHT
|wxTOP
, 5);
137 m_faceListBox
= new wxRichTextFontListBox( itemPanel1
, ID_RICHTEXTFONTPAGE_FACELISTBOX
, wxDefaultPosition
, wxSize(200, 140), wxSIMPLE_BORDER
);
138 m_faceListBox
->SetHelpText(_("Lists the available fonts."));
140 m_faceListBox
->SetToolTip(_("Lists the available fonts."));
141 itemBoxSizer5
->Add(m_faceListBox
, 1, wxGROW
|wxALL
|wxFIXED_MINSIZE
, 5);
143 wxBoxSizer
* itemBoxSizer9
= new wxBoxSizer(wxVERTICAL
);
144 itemBoxSizer4
->Add(itemBoxSizer9
, 0, wxGROW
, 5);
146 wxStaticText
* itemStaticText10
= new wxStaticText( itemPanel1
, wxID_STATIC
, _("&Size:"), wxDefaultPosition
, wxDefaultSize
, 0 );
147 itemBoxSizer9
->Add(itemStaticText10
, 0, wxALIGN_LEFT
|wxLEFT
|wxRIGHT
|wxTOP
|wxADJUST_MINSIZE
, 5);
149 m_sizeTextCtrl
= new wxTextCtrl( itemPanel1
, ID_RICHTEXTFONTPAGE_SIZETEXTCTRL
, _T(""), wxDefaultPosition
, wxSize(50, -1), 0 );
150 m_sizeTextCtrl
->SetHelpText(_("Type a size in points."));
152 m_sizeTextCtrl
->SetToolTip(_("Type a size in points."));
153 itemBoxSizer9
->Add(m_sizeTextCtrl
, 0, wxGROW
|wxLEFT
|wxRIGHT
|wxTOP
, 5);
155 wxString
* m_sizeListBoxStrings
= NULL
;
156 m_sizeListBox
= new wxListBox( itemPanel1
, ID_RICHTEXTFONTPAGE_SIZELISTBOX
, wxDefaultPosition
, wxSize(50, -1), 0, m_sizeListBoxStrings
, wxLB_SINGLE
);
157 m_sizeListBox
->SetHelpText(_("Lists font sizes in points."));
159 m_sizeListBox
->SetToolTip(_("Lists font sizes in points."));
160 itemBoxSizer9
->Add(m_sizeListBox
, 1, wxALIGN_CENTER_HORIZONTAL
|wxALL
|wxFIXED_MINSIZE
, 5);
162 wxBoxSizer
* itemBoxSizer13
= new wxBoxSizer(wxHORIZONTAL
);
163 itemBoxSizer3
->Add(itemBoxSizer13
, 0, wxGROW
, 5);
165 wxBoxSizer
* itemBoxSizer14
= new wxBoxSizer(wxVERTICAL
);
166 itemBoxSizer13
->Add(itemBoxSizer14
, 1, wxGROW
, 5);
168 wxStaticText
* itemStaticText15
= new wxStaticText( itemPanel1
, wxID_STATIC
, _("Font st&yle:"), wxDefaultPosition
, wxDefaultSize
, 0 );
169 itemBoxSizer14
->Add(itemStaticText15
, 0, wxALIGN_LEFT
|wxLEFT
|wxRIGHT
|wxTOP
|wxADJUST_MINSIZE
, 5);
171 wxString
* m_styleCtrlStrings
= NULL
;
172 m_styleCtrl
= new wxComboBox( itemPanel1
, ID_RICHTEXTFONTPAGE_STYLECTRL
, _T(""), wxDefaultPosition
, wxDefaultSize
, 0, m_styleCtrlStrings
, wxCB_READONLY
);
173 m_styleCtrl
->SetHelpText(_("Select regular or italic style."));
175 m_styleCtrl
->SetToolTip(_("Select regular or italic style."));
176 itemBoxSizer14
->Add(m_styleCtrl
, 0, wxGROW
|wxALL
, 5);
178 wxBoxSizer
* itemBoxSizer17
= new wxBoxSizer(wxVERTICAL
);
179 itemBoxSizer13
->Add(itemBoxSizer17
, 1, wxGROW
, 5);
181 wxStaticText
* itemStaticText18
= new wxStaticText( itemPanel1
, wxID_STATIC
, _("Font &weight:"), wxDefaultPosition
, wxDefaultSize
, 0 );
182 itemBoxSizer17
->Add(itemStaticText18
, 0, wxALIGN_LEFT
|wxLEFT
|wxRIGHT
|wxTOP
|wxADJUST_MINSIZE
, 5);
184 wxString
* m_weightCtrlStrings
= NULL
;
185 m_weightCtrl
= new wxComboBox( itemPanel1
, ID_RICHTEXTFONTPAGE_WEIGHTCTRL
, _T(""), wxDefaultPosition
, wxDefaultSize
, 0, m_weightCtrlStrings
, wxCB_READONLY
);
186 m_weightCtrl
->SetHelpText(_("Select regular or bold."));
188 m_weightCtrl
->SetToolTip(_("Select regular or bold."));
189 itemBoxSizer17
->Add(m_weightCtrl
, 0, wxGROW
|wxALL
, 5);
191 wxBoxSizer
* itemBoxSizer20
= new wxBoxSizer(wxVERTICAL
);
192 itemBoxSizer13
->Add(itemBoxSizer20
, 1, wxGROW
, 5);
194 wxStaticText
* itemStaticText21
= new wxStaticText( itemPanel1
, wxID_STATIC
, _("&Underlining:"), wxDefaultPosition
, wxDefaultSize
, 0 );
195 itemBoxSizer20
->Add(itemStaticText21
, 0, wxALIGN_LEFT
|wxLEFT
|wxRIGHT
|wxTOP
|wxADJUST_MINSIZE
, 5);
197 wxString
* m_underliningCtrlStrings
= NULL
;
198 m_underliningCtrl
= new wxComboBox( itemPanel1
, ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL
, _T(""), wxDefaultPosition
, wxDefaultSize
, 0, m_underliningCtrlStrings
, wxCB_READONLY
);
199 m_underliningCtrl
->SetHelpText(_("Select underlining or no underlining."));
201 m_underliningCtrl
->SetToolTip(_("Select underlining or no underlining."));
202 itemBoxSizer20
->Add(m_underliningCtrl
, 0, wxGROW
|wxALL
, 5);
204 wxBoxSizer
* itemBoxSizer23
= new wxBoxSizer(wxVERTICAL
);
205 itemBoxSizer13
->Add(itemBoxSizer23
, 0, wxGROW
, 5);
207 wxStaticText
* itemStaticText24
= new wxStaticText( itemPanel1
, wxID_STATIC
, _("&Colour:"), wxDefaultPosition
, wxDefaultSize
, 0 );
208 itemBoxSizer23
->Add(itemStaticText24
, 0, wxALIGN_LEFT
|wxLEFT
|wxRIGHT
|wxTOP
|wxADJUST_MINSIZE
, 5);
210 m_colourCtrl
= new wxRichTextColourSwatchCtrl( itemPanel1
, ID_RICHTEXTFONTPAGE_COLOURCTRL
, wxDefaultPosition
, wxSize(40, 20), wxSIMPLE_BORDER
);
211 m_colourCtrl
->SetHelpText(_("Click to change the text colour."));
213 m_colourCtrl
->SetToolTip(_("Click to change the text colour."));
214 itemBoxSizer23
->Add(m_colourCtrl
, 0, wxALIGN_LEFT
|wxALL
, 5);
216 itemBoxSizer3
->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL
|wxALL
, 5);
218 m_previewCtrl
= new wxRichTextFontPreviewCtrl( itemPanel1
, ID_RICHTEXTFONTPAGE_PREVIEWCTRL
, wxDefaultPosition
, wxSize(100, 80), wxSIMPLE_BORDER
);
219 m_previewCtrl
->SetHelpText(_("Shows a preview of the font settings."));
221 m_previewCtrl
->SetToolTip(_("Shows a preview of the font settings."));
222 itemBoxSizer3
->Add(m_previewCtrl
, 0, wxGROW
|wxALL
, 5);
224 ////@end wxRichTextFontPage content construction
226 m_faceListBox
->UpdateFonts();
228 m_styleCtrl
->Append(_("Regular"));
229 m_styleCtrl
->Append(_("Italic"));
231 m_weightCtrl
->Append(_("Regular"));
232 m_weightCtrl
->Append(_("Bold"));
234 m_underliningCtrl
->Append(_("Not underlined"));
235 m_underliningCtrl
->Append(_("Underlined"));
239 for (i
= 8; i
< 40; i
++)
241 nStr
.Printf(wxT("%d"), i
);
242 m_sizeListBox
->Append(nStr
);
244 m_sizeListBox
->Append(wxT("48"));
245 m_sizeListBox
->Append(wxT("72"));
248 /// Transfer data from/to window
249 bool wxRichTextFontPage::TransferDataFromWindow()
251 wxPanel::TransferDataFromWindow();
253 wxTextAttrEx
* attr
= GetAttributes();
255 if (m_faceListBox
->GetSelection() != wxNOT_FOUND
)
257 wxString faceName
= m_faceListBox
->GetFaceName(m_faceListBox
->GetSelection());
258 if (!faceName
.IsEmpty())
260 wxFont
font(attr
->GetFont().Ok() ? attr
->GetFont() : *wxNORMAL_FONT
);
261 font
.SetFaceName(faceName
);
262 wxSetFontPreservingStyles(*attr
, font
);
263 attr
->SetFlags(attr
->GetFlags() | wxTEXT_ATTR_FONT_FACE
);
267 attr
->SetFlags(attr
->GetFlags() & (~ wxTEXT_ATTR_FONT_FACE
));
269 wxString strSize
= m_sizeTextCtrl
->GetValue();
270 if (!strSize
.IsEmpty())
272 int sz
= wxAtoi(strSize
);
275 wxFont
font(attr
->GetFont().Ok() ? attr
->GetFont() : *wxNORMAL_FONT
);
276 font
.SetPointSize(sz
);
277 wxSetFontPreservingStyles(*attr
, font
);
278 attr
->SetFlags(attr
->GetFlags() | wxTEXT_ATTR_FONT_SIZE
);
282 attr
->SetFlags(attr
->GetFlags() & (~ wxTEXT_ATTR_FONT_SIZE
));
284 if (m_styleCtrl
->GetSelection() != wxNOT_FOUND
)
287 if (m_styleCtrl
->GetStringSelection() == _("Italic"))
292 wxFont
font(attr
->GetFont().Ok() ? attr
->GetFont() : *wxNORMAL_FONT
);
293 font
.SetStyle(style
);
294 wxSetFontPreservingStyles(*attr
, font
);
295 attr
->SetFlags(attr
->GetFlags() | wxTEXT_ATTR_FONT_ITALIC
);
298 attr
->SetFlags(attr
->GetFlags() & (~ wxTEXT_ATTR_FONT_ITALIC
));
300 if (m_weightCtrl
->GetSelection() != wxNOT_FOUND
)
303 if (m_weightCtrl
->GetStringSelection() == _("Bold"))
308 wxFont
font(attr
->GetFont().Ok() ? attr
->GetFont() : *wxNORMAL_FONT
);
309 font
.SetWeight(weight
);
310 wxSetFontPreservingStyles(*attr
, font
);
311 attr
->SetFlags(attr
->GetFlags() | wxTEXT_ATTR_FONT_WEIGHT
);
314 attr
->SetFlags(attr
->GetFlags() & (~ wxTEXT_ATTR_FONT_WEIGHT
));
316 if (m_underliningCtrl
->GetSelection() != wxNOT_FOUND
)
319 if (m_underliningCtrl
->GetStringSelection() == _("Underlined"))
324 wxFont
font(attr
->GetFont().Ok() ? attr
->GetFont() : *wxNORMAL_FONT
);
325 font
.SetUnderlined(underlined
);
326 wxSetFontPreservingStyles(*attr
, font
);
327 attr
->SetFlags(attr
->GetFlags() | wxTEXT_ATTR_FONT_UNDERLINE
);
330 attr
->SetFlags(attr
->GetFlags() & (~ wxTEXT_ATTR_FONT_UNDERLINE
));
334 attr
->SetTextColour(m_colourCtrl
->GetBackgroundColour());
337 attr
->SetFlags(attr
->GetFlags() & (~ wxTEXT_ATTR_TEXT_COLOUR
));
342 bool wxRichTextFontPage::TransferDataToWindow()
344 wxPanel::TransferDataToWindow();
347 wxTextAttrEx
* attr
= GetAttributes();
349 if (attr
->HasFont() && attr
->HasFaceName())
351 m_faceTextCtrl
->SetValue(attr
->GetFont().GetFaceName());
352 m_faceListBox
->SetFaceNameSelection(attr
->GetFont().GetFaceName());
356 m_faceTextCtrl
->SetValue(wxEmptyString
);
357 m_faceListBox
->SetFaceNameSelection(wxEmptyString
);
360 if (attr
->HasFont() && attr
->HasSize())
362 wxString strSize
= wxString::Format(wxT("%d"), attr
->GetFont().GetPointSize());
363 m_sizeTextCtrl
->SetValue(strSize
);
364 if (m_sizeListBox
->FindString(strSize
) != wxNOT_FOUND
)
365 m_sizeListBox
->SetStringSelection(strSize
);
369 m_sizeTextCtrl
->SetValue(wxEmptyString
);
370 m_sizeListBox
->SetSelection(wxNOT_FOUND
);
373 if (attr
->HasFont() && attr
->HasWeight())
375 if (attr
->GetFont().GetWeight() == wxBOLD
)
376 m_weightCtrl
->SetSelection(1);
378 m_weightCtrl
->SetSelection(0);
382 m_weightCtrl
->SetSelection(wxNOT_FOUND
);
385 if (attr
->HasFont() && attr
->HasItalic())
387 if (attr
->GetFont().GetStyle() == wxITALIC
)
388 m_styleCtrl
->SetSelection(1);
390 m_styleCtrl
->SetSelection(0);
394 m_styleCtrl
->SetSelection(wxNOT_FOUND
);
397 if (attr
->HasFont() && attr
->HasUnderlined())
399 if (attr
->GetFont().GetUnderlined())
400 m_underliningCtrl
->SetSelection(1);
402 m_underliningCtrl
->SetSelection(0);
406 m_underliningCtrl
->SetSelection(wxNOT_FOUND
);
409 if (attr
->HasTextColour())
411 m_colourCtrl
->SetBackgroundColour(attr
->GetTextColour());
412 m_colourPresent
= true;
417 m_dontUpdate
= false;
422 wxTextAttrEx
* wxRichTextFontPage::GetAttributes()
424 return wxRichTextFormattingDialog::GetDialogAttributes(this);
427 /// Updates the font preview
428 void wxRichTextFontPage::UpdatePreview()
430 wxFont
font(*wxNORMAL_FONT
);
433 m_previewCtrl
->SetForegroundColour(m_colourCtrl
->GetBackgroundColour());
435 if (m_faceListBox
->GetSelection() != wxNOT_FOUND
)
437 wxString faceName
= m_faceListBox
->GetFaceName(m_faceListBox
->GetSelection());
438 font
.SetFaceName(faceName
);
441 wxString strSize
= m_sizeTextCtrl
->GetValue();
442 if (!strSize
.IsEmpty())
444 int sz
= wxAtoi(strSize
);
446 font
.SetPointSize(sz
);
449 if (m_styleCtrl
->GetSelection() != wxNOT_FOUND
)
452 if (m_styleCtrl
->GetStringSelection() == _("Italic"))
457 font
.SetStyle(style
);
460 if (m_weightCtrl
->GetSelection() != wxNOT_FOUND
)
463 if (m_weightCtrl
->GetStringSelection() == _("Bold"))
468 font
.SetWeight(weight
);
471 if (m_underliningCtrl
->GetSelection() != wxNOT_FOUND
)
474 if (m_underliningCtrl
->GetStringSelection() == _("Underlined"))
479 font
.SetUnderlined(underlined
);
482 m_previewCtrl
->SetFont(font
);
483 m_previewCtrl
->Refresh();
487 * Should we show tooltips?
490 bool wxRichTextFontPage::ShowToolTips()
496 * Get bitmap resources
499 wxBitmap
wxRichTextFontPage::GetBitmapResource( const wxString
& name
)
502 ////@begin wxRichTextFontPage bitmap retrieval
505 ////@end wxRichTextFontPage bitmap retrieval
512 wxIcon
wxRichTextFontPage::GetIconResource( const wxString
& name
)
515 ////@begin wxRichTextFontPage icon retrieval
518 ////@end wxRichTextFontPage icon retrieval
522 * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTFONTPAGE_FACETEXTCTRL
525 void wxRichTextFontPage::OnFaceTextCtrlUpdated( wxCommandEvent
& WXUNUSED(event
) )
530 wxString facename
= m_faceTextCtrl
->GetValue();
531 if (!facename
.IsEmpty())
533 if (m_faceListBox
->HasFaceName(facename
))
535 m_faceListBox
->SetFaceNameSelection(facename
);
540 // Try to find a partial match
541 const wxArrayString
& arr
= m_faceListBox
->GetFaceNames();
543 for (i
= 0; i
< arr
.GetCount(); i
++)
545 if (arr
[i
].Mid(0, facename
.Length()).Lower() == facename
.Lower())
547 m_faceListBox
->ScrollToLine(i
);
557 * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTFONTPAGE_SIZETEXTCTRL
560 void wxRichTextFontPage::OnSizeTextCtrlUpdated( wxCommandEvent
& WXUNUSED(event
) )
565 wxString strSize
= m_sizeTextCtrl
->GetValue();
566 if (!strSize
.IsEmpty() && m_sizeListBox
->FindString(strSize
) != wxNOT_FOUND
)
567 m_sizeListBox
->SetStringSelection(strSize
);
573 * wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_SIZELISTBOX
576 void wxRichTextFontPage::OnSizeListBoxSelected( wxCommandEvent
& event
)
580 m_sizeTextCtrl
->SetValue(event
.GetString());
582 m_dontUpdate
= false;
588 * wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_FACELISTBOX
591 void wxRichTextFontPage::OnFaceListBoxSelected( wxCommandEvent
& WXUNUSED(event
) )
595 m_faceTextCtrl
->SetValue(m_faceListBox
->GetFaceName(m_faceListBox
->GetSelection()));
597 m_dontUpdate
= false;
603 * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_STYLECTRL
606 void wxRichTextFontPage::OnStyleCtrlSelected( wxCommandEvent
& WXUNUSED(event
) )
613 * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL
616 void wxRichTextFontPage::OnUnderliningCtrlSelected( wxCommandEvent
& WXUNUSED(event
) )
623 * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_WEIGHTCTRL
626 void wxRichTextFontPage::OnWeightCtrlSelected( wxCommandEvent
& WXUNUSED(event
) )
631 void wxRichTextFontPage::OnColourClicked( wxCommandEvent
& WXUNUSED(event
) )
633 m_colourPresent
= true;