wxWidgets/contrib/utils/wxrcedit/pe_basic.cpp

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