f80ea77b4a
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27745 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
447 lines
11 KiB
C++
447 lines
11 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Author: Vaclav Slavik
|
|
// Created: 2000/05/05
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2000 Vaclav Slavik
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef __GNUG__
|
|
#pragma implementation "pe_basic.h"
|
|
#endif
|
|
|
|
// For compilers that support precompilation, includes "wx/wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#include "wx/wx.h"
|
|
#include "wx/xml/xml.h"
|
|
#include "wx/tokenzr.h"
|
|
#include "pe_basic.h"
|
|
#include "xmlhelpr.h"
|
|
#include "editor.h"
|
|
#include "preview.h"
|
|
#include "nodehnd.h"
|
|
|
|
|
|
BEGIN_EVENT_TABLE(PropEditCtrlTxt, PropEditCtrl)
|
|
EVT_TEXT(wxID_ANY, PropEditCtrlTxt::OnText)
|
|
END_EVENT_TABLE()
|
|
|
|
|
|
wxWindow *PropEditCtrlTxt::CreateEditCtrl()
|
|
{
|
|
return (m_TextCtrl = new wxTextCtrl(this, wxID_ANY));
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlTxt::OnText(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
if (CanSave())
|
|
{
|
|
WriteValue();
|
|
EditorFrame::Get()->NotifyChanged(CHANGED_PROPS);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlTxt::ReadValue()
|
|
{
|
|
m_TextCtrl->SetValue(XmlReadValue(GetNode(), m_PropInfo->Name));
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlTxt::WriteValue()
|
|
{
|
|
wxString newv = m_TextCtrl->GetValue();
|
|
XmlWriteValue(GetNode(), m_PropInfo->Name, newv);
|
|
m_TreeCtrl->SetItemBold(m_TreeItem, true);
|
|
}
|
|
|
|
|
|
|
|
wxWindow *PropEditCtrlInt::CreateEditCtrl()
|
|
{
|
|
PropEditCtrlTxt::CreateEditCtrl();
|
|
#if wxUSE_VALIDATORS
|
|
m_TextCtrl->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
|
|
#endif
|
|
return m_TextCtrl;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BEGIN_EVENT_TABLE(PropEditCtrlBool, PropEditCtrl)
|
|
EVT_CHOICE(wxID_ANY, PropEditCtrlBool::OnChoice)
|
|
END_EVENT_TABLE()
|
|
|
|
wxWindow *PropEditCtrlBool::CreateEditCtrl()
|
|
{
|
|
m_Choice = new wxChoice(this, wxID_ANY);
|
|
m_Choice->Append(_T("false"));
|
|
m_Choice->Append(_T("true"));
|
|
return m_Choice;
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlBool::ReadValue()
|
|
{
|
|
int sel;
|
|
if (XmlReadValue(GetNode(), m_PropInfo->Name) == _T("0")) sel = 0;
|
|
else sel = 1;
|
|
m_Choice->SetSelection(sel);
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlBool::WriteValue()
|
|
{
|
|
wxString newv = m_Choice->GetSelection() == 0 ? _T("0") : _T("1");
|
|
|
|
XmlWriteValue(GetNode(), m_PropInfo->Name, newv);
|
|
m_TreeCtrl->SetItemBold(m_TreeItem, true);
|
|
}
|
|
|
|
|
|
|
|
wxString PropEditCtrlBool::GetValueAsText(wxTreeItemId ti)
|
|
{
|
|
PropertyInfo& pir = ((PETreeData*)m_TreeCtrl->GetItemData(ti))->PropInfo;
|
|
wxString x = XmlReadValue(GetNode(), pir.Name);
|
|
if (x == _T("1")) x = _T("true");
|
|
else if (x == _T("0")) x = _T("false");
|
|
return x;
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlBool::OnChoice(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
if (CanSave())
|
|
{
|
|
WriteValue();
|
|
EditorFrame::Get()->NotifyChanged(CHANGED_PROPS);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
// --------------------------- PropEditCtrlCoord -----------------------
|
|
|
|
class PropEditCtrlCoordXY : public PropEditCtrlInt
|
|
{
|
|
public:
|
|
PropEditCtrlCoordXY(PropertiesFrame *propFrame, int which)
|
|
: PropEditCtrlInt(propFrame), m_which(which) {}
|
|
|
|
virtual void ReadValue()
|
|
{
|
|
wxString s = XmlReadValue(GetNode(), m_PropInfo->Name);
|
|
if (s.IsEmpty())
|
|
{
|
|
m_c[0] = m_c[1] = _T("-1");
|
|
}
|
|
else
|
|
{
|
|
wxStringTokenizer tkn(s.BeforeFirst(_T('d')), _T(","));
|
|
m_c[0] = tkn.GetNextToken();
|
|
m_c[1] = tkn.GetNextToken();
|
|
}
|
|
m_TextCtrl->SetValue(m_c[m_which]);
|
|
}
|
|
|
|
virtual void WriteValue()
|
|
{
|
|
m_c[m_which] = m_TextCtrl->GetValue();
|
|
if (m_c[0].IsEmpty()) m_c[0] = _T("-1");
|
|
if (m_c[1].IsEmpty()) m_c[1] = _T("-1");
|
|
wxString s;
|
|
s << m_c[0] << _T(',') << m_c[1];
|
|
wxString prev = XmlReadValue(GetNode(), m_PropInfo->Name);
|
|
if (prev[prev.Len()-1] == _T('d')) s << _T('d');
|
|
XmlWriteValue(GetNode(), m_PropInfo->Name, s);
|
|
m_TreeCtrl->SetItemBold(m_TreeCtrl->GetItemParent(m_TreeItem), true);
|
|
}
|
|
|
|
virtual wxString GetValueAsText(wxTreeItemId ti)
|
|
{
|
|
PropertyInfo *pi = &(((PETreeData*)m_TreeCtrl->GetItemData(ti))->PropInfo);
|
|
wxString s = XmlReadValue(GetNode(), pi->Name);
|
|
if (s.IsEmpty())
|
|
{
|
|
m_c[0] = m_c[1] = _T("-1");
|
|
}
|
|
else
|
|
{
|
|
wxStringTokenizer tkn(s.BeforeFirst(_T('d')), _T(","));
|
|
m_c[0] = tkn.GetNextToken();
|
|
m_c[1] = tkn.GetNextToken();
|
|
}
|
|
return m_c[m_which];
|
|
}
|
|
|
|
virtual wxString GetPropName(const PropertyInfo& WXUNUSED(pinfo))
|
|
{
|
|
if (m_which == 0) return _T("x"); else return _T("y");
|
|
}
|
|
|
|
virtual bool HasClearButton() { return false; }
|
|
virtual bool IsPresent(const PropertyInfo& WXUNUSED(pinfo)) { return false; }
|
|
|
|
|
|
protected:
|
|
wxString m_c[2];
|
|
int m_which;
|
|
};
|
|
|
|
|
|
class PropEditCtrlCoordDlg : public PropEditCtrlBool
|
|
{
|
|
public:
|
|
PropEditCtrlCoordDlg(PropertiesFrame *propFrame)
|
|
: PropEditCtrlBool(propFrame) {}
|
|
|
|
virtual void ReadValue()
|
|
{
|
|
wxString s = XmlReadValue(GetNode(), m_PropInfo->Name);
|
|
if (s.IsEmpty()) m_Choice->SetSelection(1);
|
|
else if (s[s.Length()-1] == _T('d'))
|
|
m_Choice->SetSelection(1);
|
|
else
|
|
m_Choice->SetSelection(0);
|
|
}
|
|
|
|
virtual void WriteValue()
|
|
{
|
|
wxString s = XmlReadValue(GetNode(), m_PropInfo->Name).BeforeFirst(_T('d'));
|
|
if (m_Choice->GetSelection() == 1) s << _T('d');
|
|
XmlWriteValue(GetNode(), m_PropInfo->Name, s);
|
|
m_TreeCtrl->SetItemBold(m_TreeCtrl->GetItemParent(m_TreeItem), true);
|
|
}
|
|
|
|
virtual wxString GetValueAsText(wxTreeItemId ti)
|
|
{
|
|
PropertyInfo *pi = &(((PETreeData*)m_TreeCtrl->GetItemData(ti))->PropInfo);
|
|
wxString s = XmlReadValue(GetNode(), pi->Name);
|
|
if (s.IsEmpty())
|
|
return _("true");
|
|
else if (s[s.Length()-1] != _T('d'))
|
|
return _("false");
|
|
else
|
|
return _("true");
|
|
}
|
|
|
|
virtual wxString GetPropName(const PropertyInfo& WXUNUSED(pinfo))
|
|
{
|
|
return _T("dlg");
|
|
}
|
|
|
|
virtual bool HasClearButton() { return false; }
|
|
virtual bool IsPresent(const PropertyInfo& WXUNUSED(pinfo)) { return false; }
|
|
};
|
|
|
|
|
|
|
|
|
|
PropEditCtrlCoord::PropEditCtrlCoord(PropertiesFrame *propFrame)
|
|
: PropEditCtrlTxt(propFrame)
|
|
{
|
|
m_CtrlX = new PropEditCtrlCoordXY(propFrame, 0);
|
|
m_CtrlY = new PropEditCtrlCoordXY(propFrame, 1);
|
|
m_CtrlDlg = new PropEditCtrlCoordDlg(propFrame);
|
|
}
|
|
|
|
PropEditCtrlCoord::~PropEditCtrlCoord()
|
|
{
|
|
delete m_CtrlX;
|
|
delete m_CtrlY;
|
|
delete m_CtrlDlg;
|
|
}
|
|
|
|
|
|
|
|
wxTreeItemId PropEditCtrlCoord::CreateTreeEntry(wxTreeItemId parent, const PropertyInfo& pinfo)
|
|
{
|
|
wxTreeItemId id = PropEditCtrlTxt::CreateTreeEntry(parent, pinfo);
|
|
m_CtrlX->CreateTreeEntry(id, PropertyInfo(_T("text"), pinfo.Name, _T("")));
|
|
m_CtrlY->CreateTreeEntry(id, PropertyInfo(_T("text"), pinfo.Name, _T("")));
|
|
m_CtrlDlg->CreateTreeEntry(id, PropertyInfo(_T("bool"), pinfo.Name, _T("")));
|
|
return id;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// --------------------------- PropEditCtrlDim -----------------------
|
|
|
|
class PropEditCtrlDimX : public PropEditCtrlInt
|
|
{
|
|
public:
|
|
PropEditCtrlDimX(PropertiesFrame *propFrame)
|
|
: PropEditCtrlInt(propFrame){}
|
|
|
|
virtual void ReadValue()
|
|
{
|
|
wxString s = XmlReadValue(GetNode(), m_PropInfo->Name);
|
|
m_c = s.BeforeFirst(_T('d'));
|
|
m_TextCtrl->SetValue(m_c);
|
|
}
|
|
|
|
virtual void WriteValue()
|
|
{
|
|
wxString s = XmlReadValue(GetNode(), m_PropInfo->Name);
|
|
bool dlg = !s.IsEmpty() && s[s.Length()-1] == _T('d');
|
|
m_c = m_TextCtrl->GetValue();
|
|
s = m_c;
|
|
if (dlg) s << _T('d');
|
|
XmlWriteValue(GetNode(), m_PropInfo->Name, s);
|
|
m_TreeCtrl->SetItemBold(m_TreeCtrl->GetItemParent(m_TreeItem), true);
|
|
}
|
|
|
|
virtual wxString GetValueAsText(wxTreeItemId ti)
|
|
{
|
|
PropertyInfo *pi = &(((PETreeData*)m_TreeCtrl->GetItemData(ti))->PropInfo);
|
|
return XmlReadValue(GetNode(), pi->Name).BeforeFirst(_T('d'));
|
|
}
|
|
|
|
virtual wxString GetPropName(const PropertyInfo& WXUNUSED(pinfo))
|
|
{
|
|
return _T("val");
|
|
}
|
|
|
|
virtual bool HasClearButton() { return false; }
|
|
virtual bool IsPresent(const PropertyInfo& WXUNUSED(pinfo)) { return false; }
|
|
|
|
|
|
protected:
|
|
wxString m_c;
|
|
};
|
|
|
|
|
|
|
|
PropEditCtrlDim::PropEditCtrlDim(PropertiesFrame *propFrame)
|
|
: PropEditCtrlTxt(propFrame)
|
|
{
|
|
m_CtrlX = new PropEditCtrlDimX(propFrame);
|
|
m_CtrlDlg = new PropEditCtrlCoordDlg(propFrame);
|
|
}
|
|
|
|
PropEditCtrlDim::~PropEditCtrlDim()
|
|
{
|
|
delete m_CtrlX;
|
|
delete m_CtrlDlg;
|
|
}
|
|
|
|
|
|
|
|
wxTreeItemId PropEditCtrlDim::CreateTreeEntry(wxTreeItemId parent, const PropertyInfo& pinfo)
|
|
{
|
|
wxTreeItemId id = PropEditCtrlTxt::CreateTreeEntry(parent, pinfo);
|
|
m_CtrlX->CreateTreeEntry(id, PropertyInfo(_T("text"), pinfo.Name, _T("")));
|
|
m_CtrlDlg->CreateTreeEntry(id, PropertyInfo(_T("bool"), pinfo.Name, _T("")));
|
|
return id;
|
|
}
|
|
|
|
|
|
|
|
|
|
// --------------------- PropEditCtrlXRCID -----------------------------
|
|
|
|
#define REAL_NODE (NodeHandler::Find(GetNode())->GetRealNode(GetNode()))
|
|
|
|
|
|
void PropEditCtrlXRCID::ReadValue()
|
|
{
|
|
m_TextCtrl->SetValue(REAL_NODE->GetPropVal(_T("name"), wxEmptyString));
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlXRCID::WriteValue()
|
|
{
|
|
wxString s =m_TextCtrl->GetValue();
|
|
if (s.IsEmpty()) s = _T("-1");
|
|
|
|
REAL_NODE->DeleteProperty(_T("name"));
|
|
REAL_NODE->AddProperty(_T("name"), s);
|
|
|
|
m_TreeCtrl->SetItemBold(m_TreeItem, true);
|
|
EditorFrame::Get()->NotifyChanged(CHANGED_TREE_SELECTED);
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlXRCID::Clear()
|
|
{
|
|
EndEdit();
|
|
REAL_NODE->DeleteProperty(_T("name"));
|
|
m_TreeCtrl->SetItemBold(m_TreeItem, false);
|
|
EditorFrame::Get()->NotifyChanged(CHANGED_TREE_SELECTED);
|
|
}
|
|
|
|
|
|
|
|
void PropEditCtrlXRCID::OnDetails()
|
|
{
|
|
wxString choices[] = {wxString(_T("-1"))
|
|
#define stdID(id) , wxString(_T(#id))
|
|
stdID(wxID_OK) stdID(wxID_CANCEL)
|
|
stdID(wxID_YES) stdID(wxID_NO)
|
|
stdID(wxID_APPLY) stdID(wxID_HELP)
|
|
stdID(wxID_HELP_CONTEXT)
|
|
|
|
stdID(wxID_OPEN) stdID(wxID_CLOSE) stdID(wxID_NEW)
|
|
stdID(wxID_SAVE) stdID(wxID_SAVEAS) stdID(wxID_REVERT)
|
|
stdID(wxID_EXIT) stdID(wxID_UNDO) stdID(wxID_REDO)
|
|
stdID(wxID_PRINT) stdID(wxID_PRINT_SETUP)
|
|
stdID(wxID_PREVIEW) stdID(wxID_ABOUT) stdID(wxID_HELP_CONTENTS)
|
|
stdID(wxID_HELP_COMMANDS) stdID(wxID_HELP_PROCEDURES)
|
|
stdID(wxID_CUT) stdID(wxID_COPY) stdID(wxID_PASTE)
|
|
stdID(wxID_CLEAR) stdID(wxID_FIND) stdID(wxID_DUPLICATE)
|
|
stdID(wxID_SELECTALL)
|
|
stdID(wxID_STATIC) stdID(wxID_FORWARD) stdID(wxID_BACKWARD)
|
|
stdID(wxID_DEFAULT) stdID(wxID_MORE) stdID(wxID_SETUP)
|
|
stdID(wxID_RESET)
|
|
#undef stdID
|
|
};
|
|
|
|
wxString s =
|
|
wxGetSingleChoice(_("Choose from predefined IDs:"), _("XRCID"),
|
|
38/*sizeof choices*/, choices);
|
|
if (!s) return;
|
|
m_TextCtrl->SetValue(s);
|
|
WriteValue();
|
|
EditorFrame::Get()->NotifyChanged(CHANGED_PROPS);
|
|
}
|
|
|
|
|
|
|
|
wxString PropEditCtrlXRCID::GetValueAsText(wxTreeItemId WXUNUSED(ti))
|
|
{
|
|
return REAL_NODE->GetPropVal(_T("name"), wxEmptyString);
|
|
}
|
|
|
|
|
|
|
|
bool PropEditCtrlXRCID::IsPresent(const PropertyInfo& WXUNUSED(pinfo))
|
|
{
|
|
return REAL_NODE->HasProp(_T("name"));
|
|
}
|
|
|
|
#undef REAL_NODE
|
|
|