Moved GetParent into WX_COMPAT_2_2 and exposed base GetParent in that case too. Replaced all lib/sample uses of wxTC::GetParent with GetItemParent. Updated docs to suit. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18448 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/xrc/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(-1, PropEditCtrlTxt::OnText)
 | 
						|
END_EVENT_TABLE()
 | 
						|
 | 
						|
 | 
						|
wxWindow *PropEditCtrlTxt::CreateEditCtrl()
 | 
						|
{
 | 
						|
    return (m_TextCtrl = new wxTextCtrl(this, -1));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void PropEditCtrlTxt::OnText(wxCommandEvent& 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(-1, PropEditCtrlBool::OnChoice)
 | 
						|
END_EVENT_TABLE()
 | 
						|
 | 
						|
wxWindow *PropEditCtrlBool::CreateEditCtrl()
 | 
						|
{
 | 
						|
    m_Choice = new wxChoice(this, -1);
 | 
						|
    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& 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& pinfo)
 | 
						|
        {
 | 
						|
            if (m_which == 0) return _T("x"); else return _T("y");
 | 
						|
        }
 | 
						|
 | 
						|
        virtual bool HasClearButton() { return FALSE; }
 | 
						|
        virtual bool IsPresent(const PropertyInfo& 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& pinfo)
 | 
						|
        {
 | 
						|
            return _T("dlg");
 | 
						|
        }
 | 
						|
 | 
						|
        virtual bool HasClearButton() { return FALSE; }
 | 
						|
        virtual bool IsPresent(const PropertyInfo& 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& pinfo)
 | 
						|
        {
 | 
						|
            return _T("val");
 | 
						|
        }
 | 
						|
 | 
						|
        virtual bool HasClearButton() { return FALSE; }
 | 
						|
        virtual bool IsPresent(const PropertyInfo& 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(#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 ti)
 | 
						|
{
 | 
						|
    return REAL_NODE->GetPropVal(_T("name"), wxEmptyString);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
bool PropEditCtrlXRCID::IsPresent(const PropertyInfo& pinfo)
 | 
						|
{
 | 
						|
    return REAL_NODE->HasProp(_T("name"));
 | 
						|
}
 | 
						|
 | 
						|
#undef REAL_NODE
 | 
						|
 |