📄 advprops.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Name: advprops.cpp
// Purpose: wxPropertyGrid Advanced Properties (font, colour, etc.)
// Author: Jaakko Salli
// Modified by:
// Created: Sep-25-2004
// RCS-ID: $Id:
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "advprops.h"
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/defs.h"
#include "wx/object.h"
#include "wx/hash.h"
#include "wx/string.h"
#include "wx/log.h"
#include "wx/event.h"
#include "wx/window.h"
#include "wx/panel.h"
#include "wx/dc.h"
#include "wx/button.h"
#include "wx/pen.h"
#include "wx/brush.h"
#include "wx/cursor.h"
#include "wx/dialog.h"
#include "wx/settings.h"
#include "wx/msgdlg.h"
#include "wx/choice.h"
#include "wx/stattext.h"
#include "wx/textctrl.h"
#include "wx/scrolwin.h"
#include "wx/dirdlg.h"
#include "wx/combobox.h"
#include "wx/layout.h"
#include "wx/sizer.h"
#include "wx/textdlg.h"
#include "wx/filedlg.h"
#include "wx/intl.h"
#endif
#define __wxPG_SOURCE_FILE__
#include <wx/propgrid/propgrid.h>
#if wxPG_INCLUDE_ADVPROPS
#include <wx/propgrid/propdev.h>
#include <wx/propgrid/advprops.h>
// -----------------------------------------------------------------------
#if defined(__WXMSW__)
# define wxPG_CAN_DRAW_CURSOR 1
#elif defined(__WXGTK__)
# define wxPG_CAN_DRAW_CURSOR 0
#elif defined(__WXMAC__)
# define wxPG_CAN_DRAW_CURSOR 0
#else
# define wxPG_CAN_DRAW_CURSOR 0
#endif
// -----------------------------------------------------------------------
// Value type related
// -----------------------------------------------------------------------
bool operator == (const wxFont&, const wxFont&)
{
return FALSE;
}
WX_PG_IMPLEMENT_VALUE_TYPE_WXOBJ(wxFont,wxFontProperty,(const wxFont*)NULL)
// Implement dynamic class for type value.
IMPLEMENT_DYNAMIC_CLASS(wxColourPropertyValue,wxObject)
bool operator == (const wxColourPropertyValue& a, const wxColourPropertyValue& b)
{
return ( ( a.m_colour == b.m_colour ) && (a.m_type == b.m_type) );
}
WX_PG_IMPLEMENT_VALUE_TYPE_WXOBJ(wxColourPropertyValue,wxSystemColourProperty,
(const wxColourPropertyValue*)NULL)
WX_PG_IMPLEMENT_VALUE_TYPE_WXOBJ(wxColour,wxColourProperty,
(const wxColour*)wxBLACK)
bool operator == (const wxArrayInt& array1, const wxArrayInt& array2)
{
if ( array1.GetCount() != array2.GetCount() )
return FALSE;
size_t i;
for ( i=0; i<array1.GetCount(); i++ )
{
if ( array1[i] != array2[i] )
return FALSE;
}
return TRUE;
}
WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP(wxArrayInt,wxMultiChoiceProperty,
wxArrayInt())
// -----------------------------------------------------------------------
// wxFontProperty
// -----------------------------------------------------------------------
#include <wx/fontdlg.h>
static const wxChar* gs_fp_es_family_labels[] = {
wxT("Default"), wxT("Decorative"),
wxT("Roman"), wxT("Script"),
wxT("Swiss"), wxT("Modern")
};
static long gs_fp_es_family_values[] = {
wxDEFAULT, wxDECORATIVE,
wxROMAN, wxSCRIPT,
wxSWISS, wxMODERN
};
static const wxChar* gs_fp_es_style_labels[] = {
wxT("Normal"),
wxT("Slant"),
wxT("Italic"),
};
static long gs_fp_es_style_values[] = {
wxNORMAL,
wxSLANT,
wxITALIC
};
static const wxChar* gs_fp_es_weight_labels[] = {
wxT("Normal"),
wxT("Light"),
wxT("Bold")
};
static long gs_fp_es_weight_values[] = {
wxNORMAL,
wxLIGHT,
wxBOLD
};
// Class body is in advprops.h
WX_PG_IMPLEMENT_PROPERTY_CLASS(wxFontProperty,wxFont,const wxFont&,TextCtrlAndButton)
wxFontPropertyClass::wxFontPropertyClass ( const wxString& label, const wxString& name,
const wxFont& value ) : wxPGPropertyWithChildren(label,name)
{
wxPG_INIT_REQUIRED_TYPE(wxFont)
DoSetValue(value);
AddChild( wxIntProperty( _("Point Size"),wxEmptyString,m_value_wxFont.GetPointSize() ) );
AddChild( wxEnumProperty(_("Family"),wxEmptyString,
gs_fp_es_family_labels,gs_fp_es_family_values,6,m_value_wxFont.GetFamily()) );
AddChild( wxStringProperty(_("Face Name"),wxEmptyString, m_value_wxFont.GetFaceName()) );
AddChild( wxEnumProperty(_("Style"),wxEmptyString,
gs_fp_es_style_labels,gs_fp_es_style_values,3,m_value_wxFont.GetStyle()) );
AddChild( wxEnumProperty(_("Weight"),wxEmptyString,
gs_fp_es_weight_labels,gs_fp_es_weight_values,3,m_value_wxFont.GetWeight()) );
AddChild( wxBoolProperty(_("Underlined"),wxEmptyString,
m_value_wxFont.GetUnderlined()) );
}
wxFontPropertyClass::~wxFontPropertyClass () { }
void wxFontPropertyClass::DoSetValue ( wxPGVariant value )
{
const wxFont* font = wxPGVariantToWxObjectPtr(value,wxFont);
if ( font && font->Ok() )
m_value_wxFont = *font;
else
m_value_wxFont = wxFont(10,wxSWISS,wxNORMAL,wxNORMAL);
RefreshChildren();
}
wxPGVariant wxFontPropertyClass::DoGetValue () const
{
return wxPGVariant((const wxObject*)&m_value_wxFont);
}
wxString wxFontPropertyClass::GetValueAsString ( int arg_flags ) const
{
return wxPGPropertyWithChildren::GetValueAsString(arg_flags);
}
bool wxFontPropertyClass::OnEvent ( wxPropertyGrid* propgrid, wxPGCtrlClass* primary,
wxEvent& event )
{
if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
{
// Update value from last minute changes
PrepareValueForDialogEditing(propgrid);
wxFontData data;
data.SetInitialFont(m_value_wxFont);
data.SetColour(*wxBLACK);
wxFontDialog dlg(propgrid, &data);
if ( dlg.ShowModal() == wxID_OK )
{
propgrid->EditorsValueWasModified();
wxFontData retData = dlg.GetFontData();
DoSetValue(retData.GetChosenFont());
UpdateControl(primary);
return TRUE;
}
}
return FALSE;
}
void wxFontPropertyClass::RefreshChildren()
{
if ( !GetCount() ) return;
Item(0)->DoSetValue ( (long)m_value_wxFont.GetPointSize() );
Item(1)->DoSetValue ( (long)m_value_wxFont.GetFamily() );
Item(2)->DoSetValue ( m_value_wxFont.GetFaceName() );
Item(3)->DoSetValue ( (long)m_value_wxFont.GetStyle() );
Item(4)->DoSetValue ( (long)m_value_wxFont.GetWeight() );
Item(5)->DoSetValue ( m_value_wxFont.GetUnderlined() );
}
void wxFontPropertyClass::ChildChanged ( wxPGProperty* p )
{
wxASSERT ( this == p->GetParent() );
int ind = p->GetIndexInParent();
if ( ind == 0 )
{
m_value_wxFont.SetPointSize ( p->DoGetValue().GetRawLong() );
}
else if ( ind == 1 )
{
int fam = p->DoGetValue().GetRawLong();
if ( fam < wxDEFAULT ||
fam > wxTELETYPE )
fam = wxDEFAULT;
m_value_wxFont.SetFamily ( fam );
}
else if ( ind == 2 )
{
m_value_wxFont.SetFaceName ( p->GetValueAsString(wxPG_FULL_VALUE) );
}
else if ( ind == 3 )
{
int st = p->DoGetValue().GetRawLong();
if ( st != wxFONTSTYLE_NORMAL &&
st != wxFONTSTYLE_SLANT &&
st != wxFONTSTYLE_ITALIC )
st = wxFONTWEIGHT_NORMAL;
m_value_wxFont.SetStyle ( st );
}
else if ( ind == 4 )
{
int wt = p->DoGetValue().GetRawLong();
if ( wt != wxFONTWEIGHT_NORMAL &&
wt != wxFONTWEIGHT_LIGHT &&
wt != wxFONTWEIGHT_BOLD )
wt = wxFONTWEIGHT_NORMAL;
m_value_wxFont.SetWeight ( wt );
}
else if ( ind == 5 )
{
m_value_wxFont.SetUnderlined ( p->DoGetValue().GetBool()?true:false );
}
}
// -----------------------------------------------------------------------
// wxSystemColourProperty
// -----------------------------------------------------------------------
#include <wx/colordlg.h>
#define wx_cp_es_syscolours_len 25
static const wxChar* gs_cp_es_syscolour_labels[wx_cp_es_syscolours_len] = {
wxT("AppWorkspace"),
wxT("ActiveBorder"),
wxT("ActiveCaption"),
wxT("ButtonFace"),
wxT("ButtonHighlight"),
wxT("ButtonShadow"),
wxT("ButtonText"),
wxT("CaptionText"),
wxT("ControlDark"),
wxT("ControlLight"),
wxT("Desktop"),
wxT("GrayText"),
wxT("Highlight"),
wxT("HighlightText"),
wxT("InactiveBorder"),
wxT("InactiveCaption"),
wxT("InactiveCaptionText"),
wxT("Menu"),
wxT("Scrollbar"),
wxT("Tooltip"),
wxT("TooltipText"),
wxT("Window"),
wxT("WindowFrame"),
wxT("WindowText"),
wxT("Custom")
};
static long gs_cp_es_syscolour_values[wx_cp_es_syscolours_len] = {
wxSYS_COLOUR_APPWORKSPACE,
wxSYS_COLOUR_ACTIVEBORDER,
wxSYS_COLOUR_ACTIVECAPTION,
wxSYS_COLOUR_BTNFACE,
wxSYS_COLOUR_BTNHIGHLIGHT,
wxSYS_COLOUR_BTNSHADOW,
wxSYS_COLOUR_BTNTEXT ,
wxSYS_COLOUR_CAPTIONTEXT,
wxSYS_COLOUR_3DDKSHADOW,
wxSYS_COLOUR_3DLIGHT,
wxSYS_COLOUR_BACKGROUND,
wxSYS_COLOUR_GRAYTEXT,
wxSYS_COLOUR_HIGHLIGHT,
wxSYS_COLOUR_HIGHLIGHTTEXT,
wxSYS_COLOUR_INACTIVEBORDER,
wxSYS_COLOUR_INACTIVECAPTION,
wxSYS_COLOUR_INACTIVECAPTIONTEXT,
wxSYS_COLOUR_MENU,
wxSYS_COLOUR_SCROLLBAR,
wxSYS_COLOUR_INFOBK,
wxSYS_COLOUR_INFOTEXT,
wxSYS_COLOUR_WINDOW,
wxSYS_COLOUR_WINDOWFRAME,
wxSYS_COLOUR_WINDOWTEXT,
wxPG_COLOUR_CUSTOM
};
// Class body is in advprops.h
WX_PG_IMPLEMENT_PROPERTY_CLASS(wxSystemColourProperty,wxColourPropertyValue,const wxColourPropertyValue&,Choice)
void wxSystemColourPropertyClass::Init ( int type, const wxColour& colour )
{
m_value.m_type = type;
if ( colour.Ok() )
m_value.m_colour = colour;
else
m_value.m_colour = *wxWHITE;
m_flags |= wxPG_PROP_STATIC_CHOICES; // Colour selection cannot be changed.
}
wxSystemColourPropertyClass::wxSystemColourPropertyClass( const wxString& label, const wxString& name,
const wxColourPropertyValue& value )
: wxEnumPropertyClass( label,
name,
gs_cp_es_syscolour_labels,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -