]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fontpickercmn.cpp
added wx{Colour|File|Dir|Font}PickerCtrl (patch 1472329 by Francesco)
[wxWidgets.git] / src / common / fontpickercmn.cpp
diff --git a/src/common/fontpickercmn.cpp b/src/common/fontpickercmn.cpp
new file mode 100644 (file)
index 0000000..6b2b4da
--- /dev/null
@@ -0,0 +1,172 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        src/common/fontpickercmn.cpp
+// Purpose:     wxFontPickerCtrl class implementation
+// Author:      Francesco Montorsi
+// Modified by:
+// Created:     15/04/2006
+// RCS-ID:      $Id$
+// Copyright:   (c) Francesco Montorsi
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#include "wx/fontpicker.h"
+#include "wx/fontenum.h"
+#include "wx/tokenzr.h"
+
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+#if wxUSE_FONTPICKERCTRL
+
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_FONTPICKER_CHANGED)
+IMPLEMENT_DYNAMIC_CLASS(wxFontPickerCtrl, wxPickerBase)
+IMPLEMENT_DYNAMIC_CLASS(wxFontPickerEvent, wxCommandEvent)
+
+// ----------------------------------------------------------------------------
+// wxFontPickerCtrl
+// ----------------------------------------------------------------------------
+
+#define M_PICKER     ((wxFontPickerWidget*)m_picker)
+
+bool wxFontPickerCtrl::Create( wxWindow *parent, wxWindowID id,
+                        const wxFont &initial,
+                        const wxPoint &pos, const wxSize &size,
+                        long style, const wxValidator& validator,
+                        const wxString &name )
+{
+    // by default, the textctrl is, if present, as big as the picker, for wxFontPickerCtrl
+    SetTextCtrlProportion(1);
+
+    if (!wxPickerBase::CreateBase(parent, id, Font2String(initial),
+                                  pos, size, style, validator, name))
+        return false;
+
+    // the picker of a wxFontPickerCtrl is a wxFontPickerWidget
+    m_picker = new wxFontPickerWidget(this, wxID_ANY, initial,
+                                      wxDefaultPosition, wxDefaultSize,
+                                      GetPickerStyle(style));
+    m_picker->Connect(wxEVT_COMMAND_FONTPICKER_CHANGED,
+            wxFontPickerEventHandler(wxFontPickerCtrl::OnFontChange),
+            NULL, this);
+
+    return true;
+}
+
+wxString wxFontPickerCtrl::Font2String(const wxFont &f)
+{
+    wxString ret = f.GetNativeFontInfoUserDesc();
+#ifdef __WXMSW__
+    // on wxMSW the encoding of the font is appended at the end of the string;
+    // since encoding is not very user-friendly we remove it.
+    wxFontEncoding enc = f.GetEncoding();
+    if ( enc != wxFONTENCODING_DEFAULT && enc != wxFONTENCODING_SYSTEM )
+        ret = ret.BeforeLast(wxT(' '));
+#endif
+    return ret;
+}
+
+wxFont wxFontPickerCtrl::String2Font(const wxString &s)
+{
+    wxString str(s);
+    wxFont ret;
+    double n;
+
+    // put a limit on the maximum point size which the user can enter
+    // NOTE: we suppose the last word of given string is the pointsize
+    wxString size = str.AfterLast(wxT(' '));
+    if (size.ToDouble(&n))
+    {
+        if (n < 1)
+            str = str.Left(str.Len() - size.Len()) + wxT("1");
+        else if (n >= m_nMaxPointSize)
+            str = str.Left(str.Len() - size.Len()) +
+                  wxString::Format(wxT("%d"), m_nMaxPointSize);
+    }
+
+    if (!ret.SetNativeFontInfoUserDesc(str))
+        return wxNullFont;
+
+    return ret;
+}
+
+void wxFontPickerCtrl::SetSelectedFont(const wxFont &f)
+{
+    M_PICKER->SetSelectedFont(f);
+    UpdateTextCtrlFromPicker();
+}
+
+void wxFontPickerCtrl::UpdatePickerFromTextCtrl()
+{
+    wxASSERT(m_text);
+
+    if (m_bIgnoreNextTextCtrlUpdate)
+    {
+        // ignore this update
+        m_bIgnoreNextTextCtrlUpdate = false;
+        return;
+    }
+
+    // NB: we don't use the wxFont::wxFont(const wxString &) constructor
+    //     since that constructor expects the native font description
+    //     string returned by wxFont::GetNativeFontInfoDesc() and not
+    //     the user-friendly one returned by wxFont::GetNativeFontInfoUserDesc()
+    wxFont f = String2Font(m_text->GetValue());
+    if (!f.Ok())
+        return;     // invalid user input
+
+    if (M_PICKER->GetSelectedFont() != f)
+    {
+        M_PICKER->SetSelectedFont(f);
+
+        // fire an event
+        wxFontPickerEvent event(this, GetId(), f);
+        GetEventHandler()->ProcessEvent(event);
+    }
+}
+
+void wxFontPickerCtrl::UpdateTextCtrlFromPicker()
+{
+    if (!m_text)
+        return;     // no textctrl to update
+
+    // NOTE: this SetValue() will generate an unwanted wxEVT_COMMAND_TEXT_UPDATED
+    //       which will trigger a unneeded UpdateFromTextCtrl(); thus before using
+    //       SetValue() we set the m_bIgnoreNextTextCtrlUpdate flag...
+    m_bIgnoreNextTextCtrlUpdate = true;
+    m_text->SetValue(Font2String(M_PICKER->GetSelectedFont()));
+}
+
+
+
+// ----------------------------------------------------------------------------
+// wxFontPickerCtrl - event handlers
+// ----------------------------------------------------------------------------
+
+void wxFontPickerCtrl::OnFontChange(wxFontPickerEvent &ev)
+{
+    UpdateTextCtrlFromPicker();
+
+    // the wxFontPickerWidget sent us a colour-change notification.
+    // forward this event to our parent
+    wxFontPickerEvent event(this, GetId(), ev.GetFont());
+    GetEventHandler()->ProcessEvent(event);
+}
+
+#endif  // wxUSE_FONTPICKERCTRL