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
 | |
| 
 |