1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/richtext/richeditfontpage.cpp
3 // Purpose:     Font page for wxRichTextFormattingDialog
4 // Author:      Julian Smart
5 // Modified by:
6 // Created:     2006-10-02
7 // RCS-ID:      $Id: richtextfontpage.cpp 62052 2009-09-24 07:36:00Z JS $
8 // Copyright:   (c) Julian Smart
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #include "wx/richtext/richtextfontpage.h"
13 
14 /*!
15  * wxRichTextFontPage type definition
16  */
17 
IMPLEMENT_DYNAMIC_CLASS(wxRichTextFontPage,wxPanel)18 IMPLEMENT_DYNAMIC_CLASS( wxRichTextFontPage, wxPanel )
19 
20 /*!
21  * wxRichTextFontPage event table definition
22  */
23 
24 BEGIN_EVENT_TABLE( wxRichTextFontPage, wxPanel )
25     EVT_LISTBOX( ID_RICHTEXTFONTPAGE_FACELISTBOX, wxRichTextFontPage::OnFaceListBoxSelected )
26     EVT_BUTTON( ID_RICHTEXTFONTPAGE_COLOURCTRL, wxRichTextFontPage::OnColourClicked )
27     EVT_BUTTON( ID_RICHTEXTFONTPAGE_BGCOLOURCTRL, wxRichTextFontPage::OnColourClicked )
28 
29 ////@begin wxRichTextFontPage event table entries
30     EVT_TEXT( ID_RICHTEXTFONTPAGE_FACETEXTCTRL, wxRichTextFontPage::OnFaceTextCtrlUpdated )
31 
32     EVT_TEXT( ID_RICHTEXTFONTPAGE_SIZETEXTCTRL, wxRichTextFontPage::OnSizeTextCtrlUpdated )
33 
34     EVT_LISTBOX( ID_RICHTEXTFONTPAGE_SIZELISTBOX, wxRichTextFontPage::OnSizeListBoxSelected )
35 
36     EVT_COMBOBOX( ID_RICHTEXTFONTPAGE_STYLECTRL, wxRichTextFontPage::OnStyleCtrlSelected )
37 
38     EVT_COMBOBOX( ID_RICHTEXTFONTPAGE_WEIGHTCTRL, wxRichTextFontPage::OnWeightCtrlSelected )
39 
40     EVT_COMBOBOX( ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL, wxRichTextFontPage::OnUnderliningCtrlSelected )
41 
42     EVT_CHECKBOX( ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL, wxRichTextFontPage::OnStrikethroughctrlClick )
43 
44     EVT_CHECKBOX( ID_RICHTEXTFONTPAGE_CAPSCTRL, wxRichTextFontPage::OnCapsctrlClick )
45 
46     EVT_CHECKBOX( ID_RICHTEXTFONTPAGE_SUPERSCRIPT, wxRichTextFontPage::OnRichtextfontpageSuperscriptClick )
47 
48     EVT_CHECKBOX( ID_RICHTEXTFONTPAGE_SUBSCRIPT, wxRichTextFontPage::OnRichtextfontpageSubscriptClick )
49 
50 ////@end wxRichTextFontPage event table entries
51 
52 END_EVENT_TABLE()
53 
54 /*!
55  * wxRichTextFontPage constructors
56  */
57 
58 wxRichTextFontPage::wxRichTextFontPage( )
59 {
60     Init();
61 }
62 
wxRichTextFontPage(wxWindow * parent,wxWindowID id,const wxPoint & pos,const wxSize & size,long style)63 wxRichTextFontPage::wxRichTextFontPage( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
64 {
65     Init();
66     Create(parent, id, pos, size, style);
67 }
68 
69 /*!
70  * Initialise members
71  */
72 
Init()73 void wxRichTextFontPage::Init()
74 {
75     m_dontUpdate = false;
76     m_colourPresent = false;
77     m_bgColourPresent = false;
78 
79 ////@begin wxRichTextFontPage member initialisation
80     m_faceTextCtrl = NULL;
81     m_faceListBox = NULL;
82     m_sizeTextCtrl = NULL;
83     m_sizeListBox = NULL;
84     m_styleCtrl = NULL;
85     m_weightCtrl = NULL;
86     m_underliningCtrl = NULL;
87     m_colourCtrl = NULL;
88     m_bgColourCtrl = NULL;
89     m_strikethroughCtrl = NULL;
90     m_capitalsCtrl = NULL;
91     m_superscriptCtrl = NULL;
92     m_subscriptCtrl = NULL;
93     m_previewCtrl = NULL;
94 ////@end wxRichTextFontPage member initialisation
95 }
96 
97 /*!
98  * wxRichTextFontPage creator
99  */
100 
Create(wxWindow * parent,wxWindowID id,const wxPoint & pos,const wxSize & size,long style)101 bool wxRichTextFontPage::Create( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
102 {
103 ////@begin wxRichTextFontPage creation
104     wxPanel::Create( parent, id, pos, size, style );
105 
106     CreateControls();
107     if (GetSizer())
108     {
109         GetSizer()->SetSizeHints(this);
110     }
111     Centre();
112 ////@end wxRichTextFontPage creation
113     return true;
114 }
115 
116 /*!
117  * Control creation for wxRichTextFontPage
118  */
119 
CreateControls()120 void wxRichTextFontPage::CreateControls()
121 {
122 ////@begin wxRichTextFontPage content construction
123     wxRichTextFontPage* itemPanel1 = this;
124 
125     wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
126     itemPanel1->SetSizer(itemBoxSizer2);
127 
128     wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL);
129     itemBoxSizer2->Add(itemBoxSizer3, 1, wxGROW|wxALL, 5);
130 
131     wxBoxSizer* itemBoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
132     itemBoxSizer3->Add(itemBoxSizer4, 1, wxGROW, 5);
133 
134     wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxVERTICAL);
135     itemBoxSizer4->Add(itemBoxSizer5, 1, wxGROW, 5);
136 
137     wxStaticText* itemStaticText6 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Font:"), wxDefaultPosition, wxDefaultSize, 0 );
138     itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
139 
140     m_faceTextCtrl = new wxTextCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_FACETEXTCTRL, _T(""), wxDefaultPosition, wxDefaultSize, 0 );
141     m_faceTextCtrl->SetHelpText(_("Type a font name."));
142     if (wxRichTextFontPage::ShowToolTips())
143         m_faceTextCtrl->SetToolTip(_("Type a font name."));
144     itemBoxSizer5->Add(m_faceTextCtrl, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5);
145 
146     m_faceListBox = new wxRichTextFontListBox( itemPanel1, ID_RICHTEXTFONTPAGE_FACELISTBOX, wxDefaultPosition, wxSize(200, 100), 0 );
147     m_faceListBox->SetHelpText(_("Lists the available fonts."));
148     if (wxRichTextFontPage::ShowToolTips())
149         m_faceListBox->SetToolTip(_("Lists the available fonts."));
150     itemBoxSizer5->Add(m_faceListBox, 1, wxGROW|wxALL|wxFIXED_MINSIZE, 5);
151 
152     wxBoxSizer* itemBoxSizer9 = new wxBoxSizer(wxVERTICAL);
153     itemBoxSizer4->Add(itemBoxSizer9, 0, wxGROW, 5);
154 
155     wxStaticText* itemStaticText10 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Size:"), wxDefaultPosition, wxDefaultSize, 0 );
156     itemBoxSizer9->Add(itemStaticText10, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
157 
158     m_sizeTextCtrl = new wxTextCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_SIZETEXTCTRL, _T(""), wxDefaultPosition, wxSize(50, -1), 0 );
159     m_sizeTextCtrl->SetHelpText(_("Type a size in points."));
160     if (wxRichTextFontPage::ShowToolTips())
161         m_sizeTextCtrl->SetToolTip(_("Type a size in points."));
162     itemBoxSizer9->Add(m_sizeTextCtrl, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5);
163 
164     wxArrayString m_sizeListBoxStrings;
165     m_sizeListBox = new wxListBox( itemPanel1, ID_RICHTEXTFONTPAGE_SIZELISTBOX, wxDefaultPosition, wxSize(50, -1), m_sizeListBoxStrings, wxLB_SINGLE );
166     m_sizeListBox->SetHelpText(_("Lists font sizes in points."));
167     if (wxRichTextFontPage::ShowToolTips())
168         m_sizeListBox->SetToolTip(_("Lists font sizes in points."));
169     itemBoxSizer9->Add(m_sizeListBox, 1, wxALIGN_CENTER_HORIZONTAL|wxALL|wxFIXED_MINSIZE, 5);
170 
171     wxBoxSizer* itemBoxSizer13 = new wxBoxSizer(wxHORIZONTAL);
172     itemBoxSizer3->Add(itemBoxSizer13, 0, wxGROW, 5);
173 
174     wxBoxSizer* itemBoxSizer14 = new wxBoxSizer(wxVERTICAL);
175     itemBoxSizer13->Add(itemBoxSizer14, 0, wxGROW, 5);
176 
177     wxStaticText* itemStaticText15 = new wxStaticText( itemPanel1, wxID_STATIC, _("Font st&yle:"), wxDefaultPosition, wxDefaultSize, 0 );
178     itemBoxSizer14->Add(itemStaticText15, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
179 
180     wxArrayString m_styleCtrlStrings;
181     m_styleCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_STYLECTRL, _T(""), wxDefaultPosition, wxSize(110, -1), m_styleCtrlStrings, wxCB_READONLY );
182     m_styleCtrl->SetHelpText(_("Select regular or italic style."));
183     if (wxRichTextFontPage::ShowToolTips())
184         m_styleCtrl->SetToolTip(_("Select regular or italic style."));
185     itemBoxSizer14->Add(m_styleCtrl, 0, wxGROW|wxALL, 5);
186 
187     wxBoxSizer* itemBoxSizer17 = new wxBoxSizer(wxVERTICAL);
188     itemBoxSizer13->Add(itemBoxSizer17, 0, wxGROW, 5);
189 
190     wxStaticText* itemStaticText18 = new wxStaticText( itemPanel1, wxID_STATIC, _("Font &weight:"), wxDefaultPosition, wxDefaultSize, 0 );
191     itemBoxSizer17->Add(itemStaticText18, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
192 
193     wxArrayString m_weightCtrlStrings;
194     m_weightCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_WEIGHTCTRL, _T(""), wxDefaultPosition, wxSize(110, -1), m_weightCtrlStrings, wxCB_READONLY );
195     m_weightCtrl->SetHelpText(_("Select regular or bold."));
196     if (wxRichTextFontPage::ShowToolTips())
197         m_weightCtrl->SetToolTip(_("Select regular or bold."));
198     itemBoxSizer17->Add(m_weightCtrl, 0, wxGROW|wxALL, 5);
199 
200     wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxVERTICAL);
201     itemBoxSizer13->Add(itemBoxSizer20, 0, wxGROW, 5);
202 
203     wxStaticText* itemStaticText21 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Underlining:"), wxDefaultPosition, wxDefaultSize, 0 );
204     itemBoxSizer20->Add(itemStaticText21, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
205 
206     wxArrayString m_underliningCtrlStrings;
207     m_underliningCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL, _T(""), wxDefaultPosition, wxSize(110, -1), m_underliningCtrlStrings, wxCB_READONLY );
208     m_underliningCtrl->SetHelpText(_("Select underlining or no underlining."));
209     if (wxRichTextFontPage::ShowToolTips())
210         m_underliningCtrl->SetToolTip(_("Select underlining or no underlining."));
211     itemBoxSizer20->Add(m_underliningCtrl, 0, wxGROW|wxALL, 5);
212 
213     itemBoxSizer13->Add(0, 0, 1, wxALIGN_CENTER_VERTICAL, 5);
214 
215     wxBoxSizer* itemBoxSizer24 = new wxBoxSizer(wxVERTICAL);
216     itemBoxSizer13->Add(itemBoxSizer24, 0, wxGROW, 5);
217 
218     wxStaticText* itemStaticText25 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Colour:"), wxDefaultPosition, wxDefaultSize, 0 );
219     itemBoxSizer24->Add(itemStaticText25, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
220 
221     m_colourCtrl = new wxRichTextColourSwatchCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_COLOURCTRL, wxDefaultPosition, wxSize(40, 20), 0 );
222     m_colourCtrl->SetHelpText(_("Click to change the text colour."));
223     if (wxRichTextFontPage::ShowToolTips())
224         m_colourCtrl->SetToolTip(_("Click to change the text colour."));
225     itemBoxSizer24->Add(m_colourCtrl, 0, wxGROW|wxALL, 5);
226 
227     wxBoxSizer* itemBoxSizer27 = new wxBoxSizer(wxVERTICAL);
228     itemBoxSizer13->Add(itemBoxSizer27, 0, wxGROW, 5);
229 
230     wxStaticText* itemStaticText28 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Bg colour:"), wxDefaultPosition, wxDefaultSize, 0 );
231     itemBoxSizer27->Add(itemStaticText28, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
232 
233     m_bgColourCtrl = new wxRichTextColourSwatchCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_BGCOLOURCTRL, wxDefaultPosition, wxSize(40, 20), 0 );
234     m_bgColourCtrl->SetHelpText(_("Click to change the text background colour."));
235     if (wxRichTextFontPage::ShowToolTips())
236         m_bgColourCtrl->SetToolTip(_("Click to change the text background colour."));
237     itemBoxSizer27->Add(m_bgColourCtrl, 0, wxGROW|wxALL, 5);
238 
239     wxBoxSizer* itemBoxSizer30 = new wxBoxSizer(wxHORIZONTAL);
240     itemBoxSizer3->Add(itemBoxSizer30, 0, wxGROW, 5);
241 
242     m_strikethroughCtrl = new wxCheckBox( itemPanel1, ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL, _("&Strikethrough"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
243     m_strikethroughCtrl->SetValue(false);
244     m_strikethroughCtrl->SetHelpText(_("Check to show a line through the text."));
245     if (wxRichTextFontPage::ShowToolTips())
246         m_strikethroughCtrl->SetToolTip(_("Check to show a line through the text."));
247     itemBoxSizer30->Add(m_strikethroughCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
248 
249     m_capitalsCtrl = new wxCheckBox( itemPanel1, ID_RICHTEXTFONTPAGE_CAPSCTRL, _("Ca&pitals"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
250     m_capitalsCtrl->SetValue(false);
251     m_capitalsCtrl->SetHelpText(_("Check to show the text in capitals."));
252     if (wxRichTextFontPage::ShowToolTips())
253         m_capitalsCtrl->SetToolTip(_("Check to show the text in capitals."));
254     itemBoxSizer30->Add(m_capitalsCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
255 
256     m_superscriptCtrl = new wxCheckBox( itemPanel1, ID_RICHTEXTFONTPAGE_SUPERSCRIPT, _("Supe&rscript"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
257     m_superscriptCtrl->SetValue(false);
258     m_superscriptCtrl->SetHelpText(_("Check to show the text in superscript."));
259     if (wxRichTextFontPage::ShowToolTips())
260         m_superscriptCtrl->SetToolTip(_("Check to show the text in superscript."));
261     itemBoxSizer30->Add(m_superscriptCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
262 
263     m_subscriptCtrl = new wxCheckBox( itemPanel1, ID_RICHTEXTFONTPAGE_SUBSCRIPT, _("Subscrip&t"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
264     m_subscriptCtrl->SetValue(false);
265     m_subscriptCtrl->SetHelpText(_("Check to show the text in subscript."));
266     if (wxRichTextFontPage::ShowToolTips())
267         m_subscriptCtrl->SetToolTip(_("Check to show the text in subscript."));
268     itemBoxSizer30->Add(m_subscriptCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
269 
270     itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL, 5);
271 
272     m_previewCtrl = new wxRichTextFontPreviewCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_PREVIEWCTRL, wxDefaultPosition, wxSize(100, 60), 0 );
273     m_previewCtrl->SetHelpText(_("Shows a preview of the font settings."));
274     if (wxRichTextFontPage::ShowToolTips())
275         m_previewCtrl->SetToolTip(_("Shows a preview of the font settings."));
276     itemBoxSizer3->Add(m_previewCtrl, 0, wxGROW|wxALL, 5);
277 
278 ////@end wxRichTextFontPage content construction
279 
280     m_faceListBox->UpdateFonts();
281 
282     m_styleCtrl->Append(_("Regular"));
283     m_styleCtrl->Append(_("Italic"));
284 
285     m_weightCtrl->Append(_("Regular"));
286     m_weightCtrl->Append(_("Bold"));
287 
288     m_underliningCtrl->Append(_("Not underlined"));
289     m_underliningCtrl->Append(_("Underlined"));
290 
291     wxString nStr;
292     int i;
293     for (i = 8; i < 40; i++)
294     {
295         nStr.Printf(wxT("%d"), i);
296         m_sizeListBox->Append(nStr);
297     }
298     m_sizeListBox->Append(wxT("48"));
299     m_sizeListBox->Append(wxT("72"));
300 }
301 
302 /// Transfer data from/to window
TransferDataFromWindow()303 bool wxRichTextFontPage::TransferDataFromWindow()
304 {
305     wxPanel::TransferDataFromWindow();
306 
307     wxTextAttrEx* attr = GetAttributes();
308 
309     if (m_faceListBox->GetSelection() != wxNOT_FOUND)
310     {
311         wxString faceName = m_faceListBox->GetFaceName(m_faceListBox->GetSelection());
312         if (!faceName.IsEmpty())
313         {
314             wxFont font(attr->GetFont().Ok() ? attr->GetFont() : *wxNORMAL_FONT);
315             font.SetFaceName(faceName);
316             wxSetFontPreservingStyles(*attr, font);
317             attr->SetFlags(attr->GetFlags() | wxTEXT_ATTR_FONT_FACE);
318         }
319     }
320     else
321         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_FONT_FACE));
322 
323     wxString strSize = m_sizeTextCtrl->GetValue();
324     if (!strSize.IsEmpty())
325     {
326         int sz = wxAtoi(strSize);
327         if (sz > 0)
328         {
329             wxFont font(attr->GetFont().Ok() ? attr->GetFont() : *wxNORMAL_FONT);
330             font.SetPointSize(sz);
331             wxSetFontPreservingStyles(*attr, font);
332             attr->SetFlags(attr->GetFlags() | wxTEXT_ATTR_FONT_SIZE);
333         }
334     }
335     else
336         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_FONT_SIZE));
337 
338     if (m_styleCtrl->GetSelection() != wxNOT_FOUND)
339     {
340         int style;
341         if (m_styleCtrl->GetStringSelection() == _("Italic"))
342             style = wxITALIC;
343         else
344             style = wxNORMAL;
345 
346         wxFont font(attr->GetFont().Ok() ? attr->GetFont() : *wxNORMAL_FONT);
347         font.SetStyle(style);
348         wxSetFontPreservingStyles(*attr, font);
349         attr->SetFlags(attr->GetFlags() | wxTEXT_ATTR_FONT_ITALIC);
350     }
351     else
352         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_FONT_ITALIC));
353 
354     if (m_weightCtrl->GetSelection() != wxNOT_FOUND)
355     {
356         int weight;
357         if (m_weightCtrl->GetStringSelection() == _("Bold"))
358             weight = wxBOLD;
359         else
360             weight = wxNORMAL;
361 
362         wxFont font(attr->GetFont().Ok() ? attr->GetFont() : *wxNORMAL_FONT);
363         font.SetWeight(weight);
364         wxSetFontPreservingStyles(*attr, font);
365         attr->SetFlags(attr->GetFlags() | wxTEXT_ATTR_FONT_WEIGHT);
366     }
367     else
368         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_FONT_WEIGHT));
369 
370     if (m_underliningCtrl->GetSelection() != wxNOT_FOUND)
371     {
372         bool underlined;
373         if (m_underliningCtrl->GetStringSelection() == _("Underlined"))
374             underlined = true;
375         else
376             underlined = false;
377 
378         wxFont font(attr->GetFont().Ok() ? attr->GetFont() : *wxNORMAL_FONT);
379         font.SetUnderlined(underlined);
380         wxSetFontPreservingStyles(*attr, font);
381         attr->SetFlags(attr->GetFlags() | wxTEXT_ATTR_FONT_UNDERLINE);
382     }
383     else
384         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_FONT_UNDERLINE));
385 
386     if (m_colourPresent)
387     {
388         attr->SetTextColour(m_colourCtrl->GetBackgroundColour());
389     }
390     else
391         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_TEXT_COLOUR));
392 
393     if (m_bgColourPresent)
394     {
395         attr->SetBackgroundColour(m_bgColourCtrl->GetBackgroundColour());
396     }
397     else
398         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_BACKGROUND_COLOUR));
399 
400     if (m_strikethroughCtrl->Get3StateValue() != wxCHK_UNDETERMINED)
401     {
402         attr->SetTextEffectFlags(attr->GetTextEffectFlags() | wxTEXT_ATTR_EFFECT_STRIKETHROUGH);
403 
404         if (m_strikethroughCtrl->Get3StateValue() == wxCHK_CHECKED)
405             attr->SetTextEffects(attr->GetTextEffects() | wxTEXT_ATTR_EFFECT_STRIKETHROUGH);
406         else
407             attr->SetTextEffects(attr->GetTextEffects() & ~wxTEXT_ATTR_EFFECT_STRIKETHROUGH);
408     }
409 
410     if (m_capitalsCtrl->Get3StateValue() != wxCHK_UNDETERMINED)
411     {
412         attr->SetTextEffectFlags(attr->GetTextEffectFlags() | wxTEXT_ATTR_EFFECT_CAPITALS);
413 
414         if (m_capitalsCtrl->Get3StateValue() == wxCHK_CHECKED)
415             attr->SetTextEffects(attr->GetTextEffects() | wxTEXT_ATTR_EFFECT_CAPITALS);
416         else
417             attr->SetTextEffects(attr->GetTextEffects() & ~wxTEXT_ATTR_EFFECT_CAPITALS);
418     }
419 
420     if (m_superscriptCtrl->Get3StateValue() == wxCHK_CHECKED)
421     {
422         attr->SetTextEffectFlags(attr->GetTextEffectFlags() | wxTEXT_ATTR_EFFECT_SUPERSCRIPT);
423         attr->SetTextEffects(attr->GetTextEffects() | wxTEXT_ATTR_EFFECT_SUPERSCRIPT);
424         attr->SetTextEffects(attr->GetTextEffects() & ~wxTEXT_ATTR_EFFECT_SUBSCRIPT);
425     }
426     else if (m_subscriptCtrl->Get3StateValue() == wxCHK_CHECKED)
427     {
428         attr->SetTextEffectFlags(attr->GetTextEffectFlags() | wxTEXT_ATTR_EFFECT_SUBSCRIPT);
429         attr->SetTextEffects(attr->GetTextEffects() | wxTEXT_ATTR_EFFECT_SUBSCRIPT);
430         attr->SetTextEffects(attr->GetTextEffects() & ~wxTEXT_ATTR_EFFECT_SUPERSCRIPT);
431     }
432     else
433     {
434         // If they are undetermined, we don't want to include these flags in the text effects - the objects
435         // should retain their original style.
436         attr->SetTextEffectFlags(attr->GetTextEffectFlags() & ~(wxTEXT_ATTR_EFFECT_SUBSCRIPT|wxTEXT_ATTR_EFFECT_SUPERSCRIPT) );
437     }
438 
439     return true;
440 }
441 
TransferDataToWindow()442 bool wxRichTextFontPage::TransferDataToWindow()
443 {
444     wxPanel::TransferDataToWindow();
445 
446     m_dontUpdate = true;
447     wxTextAttrEx* attr = GetAttributes();
448 
449     if (attr->HasFont() && attr->HasFontFaceName())
450     {
451         m_faceTextCtrl->SetValue(attr->GetFont().GetFaceName());
452         m_faceListBox->SetFaceNameSelection(attr->GetFont().GetFaceName());
453     }
454     else
455     {
456         m_faceTextCtrl->SetValue(wxEmptyString);
457         m_faceListBox->SetFaceNameSelection(wxEmptyString);
458     }
459 
460     if (attr->HasFont() && attr->HasFontSize())
461     {
462         wxString strSize = wxString::Format(wxT("%d"), attr->GetFont().GetPointSize());
463         m_sizeTextCtrl->SetValue(strSize);
464         if (m_sizeListBox->FindString(strSize) != wxNOT_FOUND)
465             m_sizeListBox->SetStringSelection(strSize);
466     }
467     else
468     {
469         m_sizeTextCtrl->SetValue(wxEmptyString);
470         m_sizeListBox->SetSelection(wxNOT_FOUND);
471     }
472 
473     if (attr->HasFont() && attr->HasFontWeight())
474     {
475         if (attr->GetFont().GetWeight() == wxBOLD)
476             m_weightCtrl->SetSelection(1);
477         else
478             m_weightCtrl->SetSelection(0);
479     }
480     else
481     {
482         m_weightCtrl->SetSelection(wxNOT_FOUND);
483     }
484 
485     if (attr->HasFont() && attr->HasFontItalic())
486     {
487         if (attr->GetFont().GetStyle() == wxITALIC)
488             m_styleCtrl->SetSelection(1);
489         else
490             m_styleCtrl->SetSelection(0);
491     }
492     else
493     {
494         m_styleCtrl->SetSelection(wxNOT_FOUND);
495     }
496 
497     if (attr->HasFont() && attr->HasFontUnderlined())
498     {
499         if (attr->GetFont().GetUnderlined())
500             m_underliningCtrl->SetSelection(1);
501         else
502             m_underliningCtrl->SetSelection(0);
503     }
504     else
505     {
506         m_underliningCtrl->SetSelection(wxNOT_FOUND);
507     }
508 
509     if (attr->HasTextColour())
510     {
511         m_colourCtrl->SetColour(attr->GetTextColour());
512         m_colourPresent = true;
513     }
514 
515     if (attr->HasBackgroundColour())
516     {
517         m_bgColourCtrl->SetColour(attr->GetBackgroundColour());
518         m_bgColourPresent = true;
519     }
520 
521     if (attr->HasTextEffects())
522     {
523         if (attr->GetTextEffectFlags() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH)
524         {
525             if (attr->GetTextEffects() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH)
526                 m_strikethroughCtrl->Set3StateValue(wxCHK_CHECKED);
527             else
528                 m_strikethroughCtrl->Set3StateValue(wxCHK_UNCHECKED);
529         }
530         else
531             m_strikethroughCtrl->Set3StateValue(wxCHK_UNDETERMINED);
532 
533         if (attr->GetTextEffectFlags() & wxTEXT_ATTR_EFFECT_CAPITALS)
534         {
535             if (attr->GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)
536                 m_capitalsCtrl->Set3StateValue(wxCHK_CHECKED);
537             else
538                 m_capitalsCtrl->Set3StateValue(wxCHK_UNCHECKED);
539         }
540         else
541             m_capitalsCtrl->Set3StateValue(wxCHK_UNDETERMINED);
542 
543         if ( attr->GetTextEffectFlags() & (wxTEXT_ATTR_EFFECT_SUPERSCRIPT | wxTEXT_ATTR_EFFECT_SUBSCRIPT) )
544         {
545             if (attr->GetTextEffects() & wxTEXT_ATTR_EFFECT_SUPERSCRIPT)
546             {
547                 m_superscriptCtrl->Set3StateValue(wxCHK_CHECKED);
548                 m_subscriptCtrl->Set3StateValue(wxCHK_UNCHECKED);
549             }
550             else if (attr->GetTextEffects() & wxTEXT_ATTR_EFFECT_SUBSCRIPT)
551             {
552                 m_superscriptCtrl->Set3StateValue(wxCHK_UNCHECKED);
553                 m_subscriptCtrl->Set3StateValue(wxCHK_CHECKED);
554             }
555             else
556             {
557                 m_superscriptCtrl->Set3StateValue(wxCHK_UNCHECKED);
558                 m_subscriptCtrl->Set3StateValue(wxCHK_UNCHECKED);
559             }
560         }
561         else
562         {
563             m_superscriptCtrl->Set3StateValue(wxCHK_UNDETERMINED);
564             m_subscriptCtrl->Set3StateValue(wxCHK_UNDETERMINED);
565         }
566     }
567     else
568     {
569         m_strikethroughCtrl->Set3StateValue(wxCHK_UNDETERMINED);
570         m_capitalsCtrl->Set3StateValue(wxCHK_UNDETERMINED);
571         m_superscriptCtrl->Set3StateValue(wxCHK_UNDETERMINED);
572         m_subscriptCtrl->Set3StateValue(wxCHK_UNDETERMINED);
573     }
574 
575     UpdatePreview();
576 
577     m_dontUpdate = false;
578 
579     return true;
580 }
581 
GetAttributes()582 wxTextAttrEx* wxRichTextFontPage::GetAttributes()
583 {
584     return wxRichTextFormattingDialog::GetDialogAttributes(this);
585 }
586 
587 /// Updates the font preview
UpdatePreview()588 void wxRichTextFontPage::UpdatePreview()
589 {
590     wxRichTextAttr attr;
591 
592     if (m_colourPresent)
593         m_previewCtrl->SetForegroundColour(m_colourCtrl->GetColour());
594 
595     if (m_bgColourPresent)
596         m_previewCtrl->SetBackgroundColour(m_bgColourCtrl->GetColour());
597 
598     if (m_faceListBox->GetSelection() != wxNOT_FOUND)
599     {
600         wxString faceName = m_faceListBox->GetFaceName(m_faceListBox->GetSelection());
601         attr.SetFontFaceName(faceName);
602     }
603 
604     wxString strSize = m_sizeTextCtrl->GetValue();
605     if (!strSize.IsEmpty())
606     {
607         int sz = wxAtoi(strSize);
608         if (sz > 0)
609             attr.SetFontSize(sz);
610     }
611 
612     if (m_styleCtrl->GetSelection() != wxNOT_FOUND)
613     {
614         int style;
615         if (m_styleCtrl->GetStringSelection() == _("Italic"))
616             style = wxITALIC;
617         else
618             style = wxNORMAL;
619 
620         attr.SetFontStyle(style);
621     }
622 
623     if (m_weightCtrl->GetSelection() != wxNOT_FOUND)
624     {
625         int weight;
626         if (m_weightCtrl->GetStringSelection() == _("Bold"))
627             weight = wxBOLD;
628         else
629             weight = wxNORMAL;
630 
631         attr.SetFontWeight(weight);
632     }
633 
634     if (m_underliningCtrl->GetSelection() != wxNOT_FOUND)
635     {
636         bool underlined;
637         if (m_underliningCtrl->GetStringSelection() == _("Underlined"))
638             underlined = true;
639         else
640             underlined = false;
641 
642         attr.SetFontUnderlined(underlined);
643     }
644 
645     int textEffects = 0;
646 
647     if (m_strikethroughCtrl->Get3StateValue() == wxCHK_CHECKED)
648     {
649         textEffects |= wxTEXT_ATTR_EFFECT_STRIKETHROUGH;
650     }
651 
652     if (m_capitalsCtrl->Get3StateValue() == wxCHK_CHECKED)
653     {
654         textEffects |= wxTEXT_ATTR_EFFECT_CAPITALS;
655     }
656 
657     if ( m_superscriptCtrl->Get3StateValue() == wxCHK_CHECKED )
658         textEffects |= wxTEXT_ATTR_EFFECT_SUPERSCRIPT;
659     else if ( m_subscriptCtrl->Get3StateValue() == wxCHK_CHECKED )
660         textEffects |= wxTEXT_ATTR_EFFECT_SUBSCRIPT;
661 
662     wxFont font = attr.CreateFont();
663     m_previewCtrl->SetFont(font);
664     m_previewCtrl->SetTextEffects(textEffects);
665     m_previewCtrl->Refresh();
666 }
667 
668 /*!
669  * Should we show tooltips?
670  */
671 
ShowToolTips()672 bool wxRichTextFontPage::ShowToolTips()
673 {
674     return wxRichTextFormattingDialog::ShowToolTips();
675 }
676 
677 /*!
678  * Get bitmap resources
679  */
680 
GetBitmapResource(const wxString & name)681 wxBitmap wxRichTextFontPage::GetBitmapResource( const wxString& name )
682 {
683     // Bitmap retrieval
684 ////@begin wxRichTextFontPage bitmap retrieval
685     wxUnusedVar(name);
686     return wxNullBitmap;
687 ////@end wxRichTextFontPage bitmap retrieval
688 }
689 
690 /*!
691  * Get icon resources
692  */
693 
GetIconResource(const wxString & name)694 wxIcon wxRichTextFontPage::GetIconResource( const wxString& name )
695 {
696     // Icon retrieval
697 ////@begin wxRichTextFontPage icon retrieval
698     wxUnusedVar(name);
699     return wxNullIcon;
700 ////@end wxRichTextFontPage icon retrieval
701 }
702 
703 /*!
704  * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTFONTPAGE_FACETEXTCTRL
705  */
706 
OnFaceTextCtrlUpdated(wxCommandEvent & WXUNUSED (event))707 void wxRichTextFontPage::OnFaceTextCtrlUpdated( wxCommandEvent& WXUNUSED(event) )
708 {
709     if (m_dontUpdate)
710         return;
711 
712     wxString facename = m_faceTextCtrl->GetValue();
713     if (!facename.IsEmpty())
714     {
715         if (m_faceListBox->HasFaceName(facename))
716         {
717             m_faceListBox->SetFaceNameSelection(facename);
718             UpdatePreview();
719         }
720         else
721         {
722             // Try to find a partial match
723             const wxArrayString& arr = m_faceListBox->GetFaceNames();
724             size_t i;
725             for (i = 0; i < arr.GetCount(); i++)
726             {
727                 if (arr[i].Mid(0, facename.Length()).Lower() == facename.Lower())
728                 {
729                     m_faceListBox->ScrollToLine(i);
730                     break;
731                 }
732             }
733         }
734     }
735 }
736 
737 
738 /*!
739  * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTFONTPAGE_SIZETEXTCTRL
740  */
741 
OnSizeTextCtrlUpdated(wxCommandEvent & WXUNUSED (event))742 void wxRichTextFontPage::OnSizeTextCtrlUpdated( wxCommandEvent& WXUNUSED(event) )
743 {
744     if (m_dontUpdate)
745         return;
746 
747     wxString strSize = m_sizeTextCtrl->GetValue();
748     if (!strSize.IsEmpty() && m_sizeListBox->FindString(strSize) != wxNOT_FOUND)
749         m_sizeListBox->SetStringSelection(strSize);
750     UpdatePreview();
751 }
752 
753 
754 /*!
755  * wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_SIZELISTBOX
756  */
757 
OnSizeListBoxSelected(wxCommandEvent & event)758 void wxRichTextFontPage::OnSizeListBoxSelected( wxCommandEvent& event )
759 {
760     m_dontUpdate = true;
761 
762     m_sizeTextCtrl->SetValue(event.GetString());
763 
764     m_dontUpdate = false;
765 
766     UpdatePreview();
767 }
768 
769 /*!
770  * wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_FACELISTBOX
771  */
772 
OnFaceListBoxSelected(wxCommandEvent & WXUNUSED (event))773 void wxRichTextFontPage::OnFaceListBoxSelected( wxCommandEvent& WXUNUSED(event) )
774 {
775     m_dontUpdate = true;
776 
777     m_faceTextCtrl->SetValue(m_faceListBox->GetFaceName(m_faceListBox->GetSelection()));
778 
779     m_dontUpdate = false;
780 
781     UpdatePreview();
782 }
783 
784 /*!
785  * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_STYLECTRL
786  */
787 
OnStyleCtrlSelected(wxCommandEvent & WXUNUSED (event))788 void wxRichTextFontPage::OnStyleCtrlSelected( wxCommandEvent& WXUNUSED(event) )
789 {
790     UpdatePreview();
791 }
792 
793 
794 /*!
795  * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL
796  */
797 
OnUnderliningCtrlSelected(wxCommandEvent & WXUNUSED (event))798 void wxRichTextFontPage::OnUnderliningCtrlSelected( wxCommandEvent& WXUNUSED(event) )
799 {
800     UpdatePreview();
801 }
802 
803 
804 /*!
805  * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_WEIGHTCTRL
806  */
807 
OnWeightCtrlSelected(wxCommandEvent & WXUNUSED (event))808 void wxRichTextFontPage::OnWeightCtrlSelected( wxCommandEvent& WXUNUSED(event) )
809 {
810     UpdatePreview();
811 }
812 
OnColourClicked(wxCommandEvent & event)813 void wxRichTextFontPage::OnColourClicked( wxCommandEvent& event )
814 {
815     if (event.GetId() == m_colourCtrl->GetId())
816         m_colourPresent = true;
817     else if (event.GetId() == m_bgColourCtrl->GetId())
818         m_bgColourPresent = true;
819 
820     UpdatePreview();
821 }
822 /*!
823  * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL
824  */
825 
OnStrikethroughctrlClick(wxCommandEvent & WXUNUSED (event))826 void wxRichTextFontPage::OnStrikethroughctrlClick( wxCommandEvent& WXUNUSED(event) )
827 {
828     UpdatePreview();
829 }
830 
831 /*!
832  * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_CAPSCTRL
833  */
834 
OnCapsctrlClick(wxCommandEvent & WXUNUSED (event))835 void wxRichTextFontPage::OnCapsctrlClick( wxCommandEvent& WXUNUSED(event) )
836 {
837     UpdatePreview();
838 }
839 
840 /*!
841  * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_SUPERSCRIPT
842  */
843 
OnRichtextfontpageSuperscriptClick(wxCommandEvent & WXUNUSED (event))844 void wxRichTextFontPage::OnRichtextfontpageSuperscriptClick( wxCommandEvent& WXUNUSED(event) )
845 {
846     if ( m_superscriptCtrl->Get3StateValue() == wxCHK_CHECKED)
847         m_subscriptCtrl->Set3StateValue( wxCHK_UNCHECKED );
848 
849     UpdatePreview();
850 }
851 
852 /*!
853  * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_SUBSCRIPT
854  */
855 
OnRichtextfontpageSubscriptClick(wxCommandEvent & WXUNUSED (event))856 void wxRichTextFontPage::OnRichtextfontpageSubscriptClick( wxCommandEvent& WXUNUSED(event) )
857 {
858     if ( m_subscriptCtrl->Get3StateValue() == wxCHK_CHECKED)
859         m_superscriptCtrl->Set3StateValue( wxCHK_UNCHECKED );
860 
861     UpdatePreview();
862 }
863