]> git.saurik.com Git - wxWidgets.git/blame - src/common/fontpickercmn.cpp
Check for decimal separator inconsistency in wxLocale::GetInfo().
[wxWidgets.git] / src / common / fontpickercmn.cpp
CommitLineData
ec376c8f
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: src/common/fontpickercmn.cpp
3// Purpose: wxFontPickerCtrl class implementation
4// Author: Francesco Montorsi
5// Modified by:
6// Created: 15/04/2006
7// RCS-ID: $Id$
8// Copyright: (c) Francesco Montorsi
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
4ce7b1e4
WS
27#if wxUSE_FONTPICKERCTRL
28
ec376c8f 29#include "wx/fontpicker.h"
c757b5fe 30
fec9cc08
WS
31#ifndef WX_PRECOMP
32 #include "wx/textctrl.h"
33#endif
34
ec376c8f
VZ
35#include "wx/fontenum.h"
36#include "wx/tokenzr.h"
37
ec376c8f
VZ
38// ============================================================================
39// implementation
40// ============================================================================
41
f36e602b
VZ
42const char wxFontPickerCtrlNameStr[] = "fontpicker";
43const char wxFontPickerWidgetNameStr[] = "fontpickerwidget";
43af39c8 44
9b11752c 45wxDEFINE_EVENT(wxEVT_COMMAND_FONTPICKER_CHANGED, wxFontPickerEvent);
ec376c8f
VZ
46IMPLEMENT_DYNAMIC_CLASS(wxFontPickerCtrl, wxPickerBase)
47IMPLEMENT_DYNAMIC_CLASS(wxFontPickerEvent, wxCommandEvent)
48
49// ----------------------------------------------------------------------------
50// wxFontPickerCtrl
51// ----------------------------------------------------------------------------
52
53#define M_PICKER ((wxFontPickerWidget*)m_picker)
54
55bool wxFontPickerCtrl::Create( wxWindow *parent, wxWindowID id,
56 const wxFont &initial,
57 const wxPoint &pos, const wxSize &size,
58 long style, const wxValidator& validator,
59 const wxString &name )
60{
305329c2
VZ
61 if (!wxPickerBase::CreateBase(parent, id,
62 Font2String(initial.IsOk() ? initial
63 : *wxNORMAL_FONT),
ec376c8f
VZ
64 pos, size, style, validator, name))
65 return false;
66
67 // the picker of a wxFontPickerCtrl is a wxFontPickerWidget
68 m_picker = new wxFontPickerWidget(this, wxID_ANY, initial,
69 wxDefaultPosition, wxDefaultSize,
70 GetPickerStyle(style));
a65ffcb2
VZ
71 // complete sizer creation
72 wxPickerBase::PostCreation();
73
ec376c8f
VZ
74 m_picker->Connect(wxEVT_COMMAND_FONTPICKER_CHANGED,
75 wxFontPickerEventHandler(wxFontPickerCtrl::OnFontChange),
76 NULL, this);
77
78 return true;
79}
80
81wxString wxFontPickerCtrl::Font2String(const wxFont &f)
82{
83 wxString ret = f.GetNativeFontInfoUserDesc();
84#ifdef __WXMSW__
85 // on wxMSW the encoding of the font is appended at the end of the string;
86 // since encoding is not very user-friendly we remove it.
87 wxFontEncoding enc = f.GetEncoding();
88 if ( enc != wxFONTENCODING_DEFAULT && enc != wxFONTENCODING_SYSTEM )
89 ret = ret.BeforeLast(wxT(' '));
90#endif
91 return ret;
92}
93
94wxFont wxFontPickerCtrl::String2Font(const wxString &s)
95{
96 wxString str(s);
97 wxFont ret;
98 double n;
99
100 // put a limit on the maximum point size which the user can enter
101 // NOTE: we suppose the last word of given string is the pointsize
102 wxString size = str.AfterLast(wxT(' '));
103 if (size.ToDouble(&n))
104 {
105 if (n < 1)
4ce7b1e4 106 str = str.Left(str.length() - size.length()) + wxT("1");
ec376c8f 107 else if (n >= m_nMaxPointSize)
4ce7b1e4 108 str = str.Left(str.length() - size.length()) +
ec376c8f
VZ
109 wxString::Format(wxT("%d"), m_nMaxPointSize);
110 }
111
112 if (!ret.SetNativeFontInfoUserDesc(str))
113 return wxNullFont;
114
115 return ret;
116}
117
118void wxFontPickerCtrl::SetSelectedFont(const wxFont &f)
119{
120 M_PICKER->SetSelectedFont(f);
121 UpdateTextCtrlFromPicker();
122}
123
124void wxFontPickerCtrl::UpdatePickerFromTextCtrl()
125{
126 wxASSERT(m_text);
127
128 if (m_bIgnoreNextTextCtrlUpdate)
129 {
130 // ignore this update
131 m_bIgnoreNextTextCtrlUpdate = false;
132 return;
133 }
134
135 // NB: we don't use the wxFont::wxFont(const wxString &) constructor
136 // since that constructor expects the native font description
137 // string returned by wxFont::GetNativeFontInfoDesc() and not
138 // the user-friendly one returned by wxFont::GetNativeFontInfoUserDesc()
139 wxFont f = String2Font(m_text->GetValue());
a1b806b9 140 if (!f.IsOk())
ec376c8f
VZ
141 return; // invalid user input
142
143 if (M_PICKER->GetSelectedFont() != f)
144 {
145 M_PICKER->SetSelectedFont(f);
146
147 // fire an event
148 wxFontPickerEvent event(this, GetId(), f);
149 GetEventHandler()->ProcessEvent(event);
150 }
151}
152
153void wxFontPickerCtrl::UpdateTextCtrlFromPicker()
154{
155 if (!m_text)
156 return; // no textctrl to update
157
158 // NOTE: this SetValue() will generate an unwanted wxEVT_COMMAND_TEXT_UPDATED
159 // which will trigger a unneeded UpdateFromTextCtrl(); thus before using
160 // SetValue() we set the m_bIgnoreNextTextCtrlUpdate flag...
161 m_bIgnoreNextTextCtrlUpdate = true;
162 m_text->SetValue(Font2String(M_PICKER->GetSelectedFont()));
163}
164
165
166
167// ----------------------------------------------------------------------------
168// wxFontPickerCtrl - event handlers
169// ----------------------------------------------------------------------------
170
171void wxFontPickerCtrl::OnFontChange(wxFontPickerEvent &ev)
172{
173 UpdateTextCtrlFromPicker();
174
175 // the wxFontPickerWidget sent us a colour-change notification.
176 // forward this event to our parent
177 wxFontPickerEvent event(this, GetId(), ev.GetFont());
178 GetEventHandler()->ProcessEvent(event);
179}
180
181#endif // wxUSE_FONTPICKERCTRL