📄 proplist.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Name: contrib/src/deprecated/proplist.cpp
// Purpose: Property list classes
// Author: Julian Smart
// Modified by:
// Created: 04/01/98
// RCS-ID: $Id: proplist.cpp,v 1.14 2006/03/28 11:02:19 ABX Exp $
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/deprecated/setup.h"
#if wxUSE_PROPSHEET
#ifndef WX_PRECOMP
#include "wx/window.h"
#include "wx/font.h"
#include "wx/button.h"
#include "wx/bmpbuttn.h"
#include "wx/textctrl.h"
#include "wx/listbox.h"
#include "wx/settings.h"
#include "wx/msgdlg.h"
#include "wx/filedlg.h"
#endif
#include "wx/sizer.h"
#include "wx/module.h"
#include "wx/intl.h"
#include "wx/artprov.h"
#include "wx/colordlg.h"
#include "wx/deprecated/proplist.h"
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#if !WXWIN_COMPATIBILITY_2_4
static inline wxChar* copystring(const wxChar* s)
{ return wxStrcpy(new wxChar[wxStrlen(s) + 1], s); }
#endif
// ----------------------------------------------------------------------------
// Property text edit control
// ----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxPropertyTextEdit, wxTextCtrl)
wxPropertyTextEdit::wxPropertyTextEdit(wxPropertyListView *v, wxWindow *parent,
const wxWindowID id, const wxString& value,
const wxPoint& pos, const wxSize& size,
long style, const wxString& name):
wxTextCtrl(parent, id, value, pos, size, style, wxDefaultValidator, name)
{
m_view = v;
}
void wxPropertyTextEdit::OnSetFocus()
{
}
void wxPropertyTextEdit::OnKillFocus()
{
}
// ----------------------------------------------------------------------------
// Property list view
// ----------------------------------------------------------------------------
bool wxPropertyListView::sm_dialogCancelled = false;
IMPLEMENT_DYNAMIC_CLASS(wxPropertyListView, wxPropertyView)
BEGIN_EVENT_TABLE(wxPropertyListView, wxPropertyView)
EVT_BUTTON(wxID_OK, wxPropertyListView::OnOk)
EVT_BUTTON(wxID_CANCEL, wxPropertyListView::OnCancel)
EVT_BUTTON(wxID_HELP, wxPropertyListView::OnHelp)
EVT_BUTTON(wxID_PROP_CROSS, wxPropertyListView::OnCross)
EVT_BUTTON(wxID_PROP_CHECK, wxPropertyListView::OnCheck)
EVT_BUTTON(wxID_PROP_EDIT, wxPropertyListView::OnEdit)
EVT_TEXT_ENTER(wxID_PROP_TEXT, wxPropertyListView::OnText)
EVT_LISTBOX(wxID_PROP_SELECT, wxPropertyListView::OnPropertySelect)
EVT_COMMAND(wxID_PROP_SELECT, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED,
wxPropertyListView::OnPropertyDoubleClick)
EVT_LISTBOX(wxID_PROP_VALUE_SELECT, wxPropertyListView::OnValueListSelect)
END_EVENT_TABLE()
wxPropertyListView::wxPropertyListView(wxPanel *propPanel, long flags):wxPropertyView(flags)
{
m_propertyScrollingList = NULL;
m_valueList = NULL;
m_valueText = NULL;
m_editButton = NULL;
m_confirmButton = NULL;
m_cancelButton = NULL;
m_propertyWindow = propPanel;
m_managedWindow = NULL;
m_windowCloseButton = NULL;
m_windowCancelButton = NULL;
m_windowHelpButton = NULL;
m_detailedEditing = false;
}
wxPropertyListView::~wxPropertyListView()
{
}
void wxPropertyListView::ShowView(wxPropertySheet *ps, wxPanel *panel)
{
m_propertySheet = ps;
AssociatePanel(panel);
CreateControls();
UpdatePropertyList();
panel->Layout();
}
// Update this view of the viewed object, called e.g. by
// the object itself.
bool wxPropertyListView::OnUpdateView()
{
return true;
}
bool wxPropertyListView::UpdatePropertyList(bool clearEditArea)
{
if (!m_propertyScrollingList || !m_propertySheet)
return false;
m_propertyScrollingList->Clear();
if (clearEditArea)
{
m_valueList->Clear();
m_valueText->SetValue(wxEmptyString);
}
wxNode *node = m_propertySheet->GetProperties().GetFirst();
// Should sort them... later...
while (node)
{
wxProperty *property = (wxProperty *)node->GetData();
wxString stringValueRepr(property->GetValue().GetStringRepresentation());
wxString paddedString(MakeNameValueString(property->GetName(), stringValueRepr));
m_propertyScrollingList->Append(paddedString.GetData(), (void *)property);
node = node->GetNext();
}
return true;
}
bool wxPropertyListView::UpdatePropertyDisplayInList(wxProperty *property)
{
if (!m_propertyScrollingList || !m_propertySheet)
return false;
#ifdef __WXMSW__
int currentlySelected = m_propertyScrollingList->GetSelection();
#endif
// #ifdef __WXMSW__
wxString stringValueRepr(property->GetValue().GetStringRepresentation());
wxString paddedString(MakeNameValueString(property->GetName(), stringValueRepr));
int sel = FindListIndexForProperty(property);
if (sel > -1)
{
// Don't update the listbox unnecessarily because it can cause
// ugly flashing.
if (paddedString != m_propertyScrollingList->GetString(sel))
m_propertyScrollingList->SetString(sel, paddedString.GetData());
}
//#else
// UpdatePropertyList(false);
//#endif
// TODO: why is this necessary?
#ifdef __WXMSW__
if (currentlySelected > -1)
m_propertyScrollingList->SetSelection(currentlySelected);
#endif
return true;
}
// Find the wxListBox index corresponding to this property
int wxPropertyListView::FindListIndexForProperty(wxProperty *property)
{
int n = m_propertyScrollingList->GetCount();
for (int i = 0; i < n; i++)
{
if (property == (wxProperty *)m_propertyScrollingList->wxListBox::GetClientData(i))
return i;
}
return wxNOT_FOUND;
}
wxString wxPropertyListView::MakeNameValueString(wxString name, wxString value)
{
wxString theString(name);
int nameWidth = 25;
int padWith = nameWidth - theString.length();
if (padWith < 0)
padWith = 0;
if (GetFlags() & wxPROP_SHOWVALUES)
{
// Want to pad with spaces
theString.Append( wxT(' '), padWith);
theString += value;
}
return theString;
}
// Select and show string representation in validator the given
// property. NULL resets to show no property.
bool wxPropertyListView::ShowProperty(wxProperty *property, bool select)
{
if (m_currentProperty)
{
EndShowingProperty(m_currentProperty);
m_currentProperty = NULL;
}
m_valueList->Clear();
m_valueText->SetValue(wxEmptyString);
if (property)
{
m_currentProperty = property;
BeginShowingProperty(property);
}
if (select)
{
int sel = FindListIndexForProperty(property);
if (sel != wxNOT_FOUND)
m_propertyScrollingList->SetSelection(sel);
}
return true;
}
// Find appropriate validator and load property into value controls
bool wxPropertyListView::BeginShowingProperty(wxProperty *property)
{
m_currentValidator = FindPropertyValidator(property);
if (!m_currentValidator)
return false;
if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
return false;
wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
listValidator->OnPrepareControls(property, this, m_propertyWindow);
DisplayProperty(property);
return true;
}
// Find appropriate validator and unload property from value controls
bool wxPropertyListView::EndShowingProperty(wxProperty *property)
{
if (!m_currentValidator)
return false;
RetrieveProperty(property);
if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
return false;
wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
listValidator->OnClearControls(property, this, m_propertyWindow);
if (m_detailedEditing)
{
listValidator->OnClearDetailControls(property, this, m_propertyWindow);
m_detailedEditing = false;
}
return true;
}
void wxPropertyListView::BeginDetailedEditing()
{
if (!m_currentValidator)
return;
if (!m_currentProperty)
return;
if (m_detailedEditing)
return;
if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
return;
if (!m_currentProperty->IsEnabled())
return;
wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
if (listValidator->OnPrepareDetailControls(m_currentProperty, this, m_propertyWindow))
m_detailedEditing = true;
}
void wxPropertyListView::EndDetailedEditing()
{
if (!m_currentValidator)
return;
if (!m_currentProperty)
return;
RetrieveProperty(m_currentProperty);
if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
return;
wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
if (m_detailedEditing)
{
listValidator->OnClearDetailControls(m_currentProperty, this, m_propertyWindow);
m_detailedEditing = false;
}
}
bool wxPropertyListView::DisplayProperty(wxProperty *property)
{
if (!m_currentValidator)
return false;
if (((m_currentValidator->GetFlags() & wxPROP_ALLOW_TEXT_EDITING) == 0) || !property->IsEnabled())
m_valueText->SetEditable(false);
else
m_valueText->SetEditable(true);
if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
return false;
wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
listValidator->OnDisplayValue(property, this, m_propertyWindow);
return true;
}
bool wxPropertyListView::RetrieveProperty(wxProperty *property)
{
if (!m_currentValidator)
return false;
if (!property->IsEnabled())
return false;
if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
return false;
wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
if (listValidator->OnCheckValue(property, this, m_propertyWindow))
{
if (listValidator->OnRetrieveValue(property, this, m_propertyWindow))
{
UpdatePropertyDisplayInList(property);
OnPropertyChanged(property);
}
}
else
{
// Revert to old value
listValidator->OnDisplayValue(property, this, m_propertyWindow);
}
return true;
}
bool wxPropertyListView::EditProperty(wxProperty *WXUNUSED(property))
{
return true;
}
// Called by the listbox callback
void wxPropertyListView::OnPropertySelect(wxCommandEvent& WXUNUSED(event))
{
int sel = m_propertyScrollingList->GetSelection();
if (sel != wxNOT_FOUND)
{
wxProperty *newSel = (wxProperty *)m_propertyScrollingList->wxListBox::GetClientData(sel);
if (newSel && newSel != m_currentProperty)
{
ShowProperty(newSel, false);
}
}
}
bool wxPropertyListView::CreateControls()
{
wxPanel *panel = (wxPanel *)m_propertyWindow;
wxSize largeButtonSize( 70, 25 );
wxSize smallButtonSize( 23, 23 );
if (m_valueText)
return true;
if (!panel)
return false;
wxFont guiFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
#ifdef __WXMSW__
wxFont *boringFont =
wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxMODERN,
wxNORMAL, wxNORMAL, false, _T("Courier New"));
#else
wxFont *boringFont = wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxTELETYPE, wxNORMAL, wxNORMAL);
#endif
// May need to be changed in future to eliminate clashes with app.
// WHAT WAS THIS FOR?
// panel->SetClientData((char *)this);
wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL );
// top row with optional buttons and input line
wxBoxSizer *topsizer = new wxBoxSizer( wxHORIZONTAL );
int buttonborder = 3;
if (m_buttonFlags & wxPROP_BUTTON_CHECK_CROSS)
{
wxBitmap tickBitmap = wxArtProvider::GetBitmap(wxART_TICK_MARK);
wxBitmap crossBitmap = wxArtProvider::GetBitmap(wxART_CROSS_MARK);
if ( tickBitmap.Ok() && crossBitmap.Ok() )
{
m_confirmButton = new wxBitmapButton(panel, wxID_PROP_CHECK, tickBitmap, wxDefaultPosition, smallButtonSize );
m_cancelButton = new wxBitmapButton(panel, wxID_PROP_CROSS, crossBitmap, wxDefaultPosition, smallButtonSize );
}
else
{
m_confirmButton = new wxButton(panel, wxID_PROP_CHECK, _T(":-)"), wxDefaultPosition, smallButtonSize );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -