added wx{Colour|File|Dir|Font}PickerCtrl (patch 1472329 by Francesco)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39495 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
172
src/common/fontpickercmn.cpp
Normal file
172
src/common/fontpickercmn.cpp
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user