added XML resources library

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@7831 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2000-07-25 18:47:21 +00:00
parent ca7408bd9a
commit 56d2f75071
106 changed files with 8512 additions and 1 deletions

View File

@ -8,6 +8,8 @@ all:
clean:
cd src; make clean
cd samples; make clean
cd utils; make clean
samples:
cd samples; make

8
contrib/configure vendored
View File

@ -817,12 +817,16 @@ trap 'rm -fr `echo "
src/ogl/Makefile
src/mmedia/Makefile
src/stc/Makefile
src/xml/Makefile
samples/Makefile
samples/mmedia/Makefile
samples/ogl/Makefile
samples/ogl/ogledit/Makefile
samples/ogl/studio/Makefile
samples/stc/Makefile
utils/Makefile
utils/wxrc/Makefile
utils/wxrcedit/Makefile
" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF
@ -906,12 +910,16 @@ CONFIG_FILES=\${CONFIG_FILES-"Makefile
src/ogl/Makefile
src/mmedia/Makefile
src/stc/Makefile
src/xml/Makefile
samples/Makefile
samples/mmedia/Makefile
samples/ogl/Makefile
samples/ogl/ogledit/Makefile
samples/ogl/studio/Makefile
samples/stc/Makefile
utils/Makefile
utils/wxrc/Makefile
utils/wxrcedit/Makefile
"}
EOF
cat >> $CONFIG_STATUS <<\EOF

View File

@ -42,10 +42,14 @@ AC_OUTPUT([
src/ogl/Makefile
src/mmedia/Makefile
src/stc/Makefile
src/xml/Makefile
samples/Makefile
samples/mmedia/Makefile
samples/ogl/Makefile
samples/ogl/ogledit/Makefile
samples/ogl/studio/Makefile
samples/stc/Makefile
utils/Makefile
utils/wxrc/Makefile
utils/wxrcedit/Makefile
])

View File

@ -0,0 +1,37 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_all.h
// Purpose: includes all xh_*.h files
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_ALL_H_
#define _WX_XH_ALL_H_
// Existing handlers:
#include "wx/xml/xh_menu.h"
#include "wx/xml/xh_panel.h"
#include "wx/xml/xh_dlg.h"
#include "wx/xml/xh_bttn.h"
#include "wx/xml/xh_chckb.h"
#include "wx/xml/xh_gauge.h"
#include "wx/xml/xh_html.h"
#include "wx/xml/xh_spin.h"
#include "wx/xml/xh_sttxt.h"
#include "wx/xml/xh_slidr.h"
#include "wx/xml/xh_radbt.h"
#include "wx/xml/xh_radbx.h"
#include "wx/xml/xh_combo.h"
#include "wx/xml/xh_chckl.h"
#include "wx/xml/xh_choic.h"
#include "wx/xml/xh_sizer.h"
#include "wx/xml/xh_stbmp.h"
#include "wx/xml/xh_notbk.h"
#include "wx/xml/xh_text.h"
#endif // _WX_XMLRES_H_

View File

@ -0,0 +1,29 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_bttn.h
// Purpose: XML resource handler for buttons
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_BTTN_H_
#define _WX_XH_BTTN_H_
#ifdef __GNUG__
#pragma interface "xh_bttn.h"
#endif
#include "wx/xml/xmlres.h"
class wxButtonXmlHandler : public wxXmlResourceHandler
{
public:
wxButtonXmlHandler() : wxXmlResourceHandler() {}
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif // _WX_XH_BTTN_H_

View File

@ -0,0 +1,35 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_chckb.h
// Purpose: XML resource handler for wxCheckBox
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_CHCKB_H_
#define _WX_XH_CHCKB_H_
#ifdef __GNUG__
#pragma interface "xh_chckb.h"
#endif
#include "wx/xml/xmlres.h"
#include "wx/defs.h"
#if wxUSE_CHECKBOX
class wxCheckBoxXmlHandler : public wxXmlResourceHandler
{
public:
wxCheckBoxXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif
#endif // _WX_XH_CHECKBOX_H_

View File

@ -0,0 +1,33 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_chckl.h
// Purpose: XML resource handler for wxCheckListBox
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_CHCKL_H_
#define _WX_XH_CHCKL_H_
#ifdef __GNUG__
#pragma interface "xh_chckl.h"
#endif
#include "wx/xml/xmlres.h"
class wxCheckListXmlHandler : public wxXmlResourceHandler
{
public:
wxCheckListXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
private:
bool m_InsideBox;
wxArrayString strList;
};
#endif // _WX_XH_CHECKLIST_H_

View File

@ -0,0 +1,32 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_choic.h
// Purpose: XML resource handler for wxChoice
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_CHOIC_H_
#define _WX_XH_CHOIC_H_
#ifdef __GNUG__
#pragma interface "xh_choic.h"
#endif
#include "wx/xml/xmlres.h"
class wxChoiceXmlHandler : public wxXmlResourceHandler
{
public:
wxChoiceXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
private:
bool m_InsideBox;
wxArrayString strList;
};
#endif // _WX_XH_CHOIC_H_

View File

@ -0,0 +1,35 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_combo.h
// Purpose: XML resource handler for wxComboBox
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_COMBO_H_
#define _WX_XH_COMBO_H_
#ifdef __GNUG__
#pragma interface "xh_combo.h"
#endif
#include "wx/xml/xmlres.h"
#if wxUSE_COMBOBOX
class wxComboBoxXmlHandler : public wxXmlResourceHandler
{
public:
wxComboBoxXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
private:
bool m_InsideBox;
wxArrayString strList;
};
#endif
#endif // _WX_XH_COMBO_H_

View File

@ -0,0 +1,29 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_dlg.h
// Purpose: XML resource handler for dialogs
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_DLG_H_
#define _WX_XH_DLG_H_
#ifdef __GNUG__
#pragma interface "xh_dlg.h"
#endif
#include "wx/xml/xmlres.h"
class wxDialogXmlHandler : public wxXmlResourceHandler
{
public:
wxDialogXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif // _WX_XH_DLG_H_

View File

@ -0,0 +1,40 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_gauge.h
// Purpose: XML resource handler for wxGauge
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_GAUGE_H_
#define _WX_XH_GAUGE_H_
#ifdef __GNUG__
#pragma interface "xh_gauge.h"
#endif
#include "wx/defs.h"
#if wxUSE_GAUGE
#include "wx/xml/xmlres.h"
class wxGaugeXmlHandler : public wxXmlResourceHandler
{
enum
{
wxGAUGE_DEFAULT_RANGE = 100
};
public:
wxGaugeXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif
#endif // _WX_XH_GAUGE_H_

View File

@ -0,0 +1,34 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_html.h
// Purpose: XML resource handler for wxHtmlWindow
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_HTML_H_
#define _WX_XH_HTML_H_
#ifdef __GNUG__
#pragma interface "xh_html.h"
#endif
#include "wx/xml/xmlres.h"
#include "wx/defs.h"
#if wxUSE_HTML
class wxHtmlWindowXmlHandler : public wxXmlResourceHandler
{
public:
wxHtmlWindowXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif
#endif // _WX_XH_SLIDER_H_

View File

@ -0,0 +1,40 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_menu.h
// Purpose: XML resource handler for menus/menubars
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_MENU_H_
#define _WX_XH_MENU_H_
#ifdef __GNUG__
#pragma interface "xh_menu.h"
#endif
#include "wx/xml/xmlres.h"
class wxMenuXmlHandler : public wxXmlResourceHandler
{
public:
wxMenuXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
private:
bool m_InsideMenu;
};
class wxMenuBarXmlHandler : public wxXmlResourceHandler
{
public:
wxMenuBarXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif // _WX_XH_MENU_H_

View File

@ -0,0 +1,37 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_notbk.h
// Purpose: XML resource handler for wxNotebook
// Author: Vaclav Slavik
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_NOTBK_H_
#define _WX_XH_NOTBK_H_
#ifdef __GNUG__
#pragma interface "xh_notbk.h"
#endif
#include "wx/xml/xmlres.h"
#if wxUSE_NOTEBOOK
class wxNotebook;
class wxNotebookXmlHandler : public wxXmlResourceHandler
{
public:
wxNotebookXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
private:
bool m_IsInside;
wxNotebook *m_Notebook;
};
#endif
#endif // _WX_XH_NOTBK_H_

View File

@ -0,0 +1,29 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_panel.h
// Purpose: XML resource handler for panels
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_PANEL_H_
#define _WX_XH_PANEL_H_
#ifdef __GNUG__
#pragma interface "xh_panel.h"
#endif
#include "wx/xml/xmlres.h"
class wxPanelXmlHandler : public wxXmlResourceHandler
{
public:
wxPanelXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif // _WX_XH_PANEL_H_

View File

@ -0,0 +1,33 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_radbt.h
// Purpose: XML resource handler for radio buttons
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_RADBT_H_
#define _WX_XH_RADBT_H_
#ifdef __GNUG__
#pragma interface "xh_radbt.h"
#endif
#include "wx/xml/xmlres.h"
#include "wx/defs.h"
#if wxUSE_RADIOBOX
class wxRadioButtonXmlHandler : public wxXmlResourceHandler
{
public:
wxRadioButtonXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif
#endif // _WX_XH_RADIOBUTTON_H_

View File

@ -0,0 +1,35 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_radbx.h
// Purpose: XML resource handler for radio box
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_RADBX_H_
#define _WX_XH_RADBX_H_
#ifdef __GNUG__
#pragma interface "xh_radbx.h"
#endif
#include "wx/xml/xmlres.h"
#if wxUSE_RADIOBOX
class wxRadioBoxXmlHandler : public wxXmlResourceHandler
{
public:
wxRadioBoxXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
private:
bool m_InsideBox;
wxArrayString strList;
};
#endif
#endif // _WX_XH_RADBX_H_

View File

@ -0,0 +1,36 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_sizer.h
// Purpose: XML resource handler for wxBoxSizer
// Author: Vaclav Slavik
// Created: 2000/04/24
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_SIZER_H_
#define _WX_XH_SIZER_H_
#ifdef __GNUG__
#pragma interface "xh_sizer.h"
#endif
#include "wx/xml/xmlres.h"
class wxSizer;
class wxSizerXmlHandler : public wxXmlResourceHandler
{
public:
wxSizerXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
private:
bool m_IsInside;
wxSizer *m_ParentSizer;
};
#endif // _WX_XH_BOXSIZER_H_

View File

@ -0,0 +1,40 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_slidr.h
// Purpose: XML resource handler for wxSlider
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_SLIDR_H_
#define _WX_XH_SLIDR_H_
#ifdef __GNUG__
#pragma interface "xh_slidr.h"
#endif
#include "wx/xml/xmlres.h"
#include "wx/defs.h"
#if wxUSE_SLIDER
class wxSliderXmlHandler : public wxXmlResourceHandler
{
enum
{
wxSL_DEFAULT_VALUE = 0,
wxSL_DEFAULT_MIN = 0,
wxSL_DEFAULT_MAX = 100
};
public:
wxSliderXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif
#endif // _WX_XH_SLIDER_H_

View File

@ -0,0 +1,55 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_spin.h
// Purpose: XML resource handler for wxSpinButton
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_SPIN_H_
#define _WX_XH_SPIN_H_
#ifdef __GNUG__
#pragma interface "xh_spin.h"
#endif
#include "wx/xml/xmlres.h"
#include "wx/defs.h"
#if wxUSE_SPINBTN
class wxSpinButtonXmlHandler : public wxXmlResourceHandler
{
enum
{
wxSP_DEFAULT_VALUE = 0,
wxSP_DEFAULT_MIN = 0,
wxSP_DEFAULT_MAX = 100
};
public:
wxSpinButtonXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif
#if wxUSE_SPINCTRL
class wxSpinCtrlXmlHandler : public wxXmlResourceHandler
{
enum
{
wxSP_DEFAULT_VALUE = 0,
wxSP_DEFAULT_MIN = 0,
wxSP_DEFAULT_MAX = 100
};
public:
wxSpinCtrlXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif
#endif // _WX_XH_SPIN_H_

View File

@ -0,0 +1,30 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_stbmp.h
// Purpose: XML resource handler for wxStaticBitmap
// Author: Vaclav Slavik
// Created: 2000/04/22
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_STBMP_H_
#define _WX_XH_STBMP_H_
#ifdef __GNUG__
#pragma interface "xh_stbmp.h"
#endif
#include "wx/xml/xmlres.h"
class wxStaticBitmapXmlHandler : public wxXmlResourceHandler
{
public:
wxStaticBitmapXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif // _WX_XH_STBMP_H_

View File

@ -0,0 +1,30 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_sttxt.h
// Purpose: XML resource handler for wxStaticBitmap
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_STTXT_H_
#define _WX_XH_STTXT_H_
#ifdef __GNUG__
#pragma interface "xh_sttxt.h"
#endif
#include "wx/xml/xmlres.h"
class wxStaticTextXmlHandler : public wxXmlResourceHandler
{
public:
wxStaticTextXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif // _WX_XH_STBMP_H_

View File

@ -0,0 +1,30 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_text.h
// Purpose: XML resource handler for wxTextCtrl
// Author: Aleksandras Gluchovas
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Aleksandras Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XH_TEXT_H_
#define _WX_XH_TEXT_H_
#ifdef __GNUG__
#pragma interface "xh_text.h"
#endif
#include "wx/xml/xmlres.h"
class wxTextCtrlXmlHandler : public wxXmlResourceHandler
{
public:
wxTextCtrlXmlHandler();
virtual wxObject *DoCreateResource();
virtual bool CanHandle(wxXmlNode *node);
};
#endif // _WX_XH_TEXT_H_

View File

@ -0,0 +1,241 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xml.h
// Purpose: wxXmlDocument - XML parser & data holder class
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XML_H_
#define _WX_XML_H_
#ifdef __GNUG__
#pragma interface "xml.h"
#endif
#include "wx/defs.h"
#include "wx/string.h"
#include "wx/object.h"
#include "wx/list.h"
class wxXmlNode;
class wxXmlProperty;
class wxXmlDocument;
class wxXmlIOHandler;
class wxInputStream;
class wxOutputStream;
// Represents XML node type.
enum wxXmlNodeType
{
// note: values are synchronized with xmlElementType from libxml
wxXML_ELEMENT_NODE = 1,
wxXML_ATTRIBUTE_NODE = 2,
wxXML_TEXT_NODE = 3,
wxXML_CDATA_SECTION_NODE = 4,
wxXML_ENTITY_REF_NODE = 5,
wxXML_ENTITY_NODE = 6,
wxXML_PI_NODE = 7,
wxXML_COMMENT_NODE = 8,
wxXML_DOCUMENT_NODE = 9,
wxXML_DOCUMENT_TYPE_NODE = 10,
wxXML_DOCUMENT_FRAG_NODE = 11,
wxXML_NOTATION_NODE = 12,
wxXML_HTML_DOCUMENT_NODE = 13
};
// Types of XML files:
enum wxXmlIOType
{
wxXML_IO_AUTO = 0, // detect it automatically
wxXML_IO_LIBXML, // use libxml2 to parse/save XML document
wxXML_IO_BIN, // save in binary uncompressed proprietary format
wxXML_IO_BINZ // svae in binary zlib-compressed proprietary format
};
// Represents node property(ies).
// Example: in <img src="hello.gif" id="3"/> "src" is property with value
// "hello.gif" and "id" is prop. with value "3".
class WXDLLEXPORT wxXmlProperty
{
public:
wxXmlProperty() : m_Next(NULL) {}
wxXmlProperty(const wxString& name, const wxString& value, wxXmlProperty *next)
: m_Name(name), m_Value(value), m_Next(next) {}
~wxXmlProperty() { delete m_Next; }
wxString GetName() const { return m_Name; }
wxString GetValue() const { return m_Value; }
wxXmlProperty *GetNext() const { return m_Next; }
void SetName(const wxString& name) { m_Name = name; }
void SetValue(const wxString& value) { m_Value = value; }
void SetNext(wxXmlProperty *next) { m_Next = next; }
private:
wxString m_Name;
wxString m_Value;
wxXmlProperty *m_Next;
};
// Represents node in XML document. Node has name and may have content
// and properties. Most common node types are wxXML_TEXT_NODE (name and props
// are irrelevant) and wxXML_ELEMENT_NODE (e.g. in <title>hi</title> there is
// element with name="title", irrelevant content and one child (wxXML_TEXT_NODE
// with content="hi").
class WXDLLEXPORT wxXmlNode
{
public:
wxXmlNode() : m_Properties(NULL), m_Parent(NULL),
m_Children(NULL), m_Next(NULL) {}
wxXmlNode(wxXmlNode *parent,wxXmlNodeType type,
const wxString& name, const wxString& content,
wxXmlProperty *props, wxXmlNode *next);
~wxXmlNode() { delete m_Properties; delete m_Next; delete m_Children; }
// copy ctor & operator=. Note that this does NOT copy syblings
// and parent pointer, i.e. m_Parent and m_Next will be NULL
// after using copy ctor and are never unmodified by operator=.
// On the other hand, it DOES copy children and properties.
wxXmlNode(const wxXmlNode& node);
wxXmlNode& operator=(const wxXmlNode& node);
// user-friendly creation:
wxXmlNode(wxXmlNodeType type, const wxString& name,
const wxString& content = wxEmptyString);
void AddChild(wxXmlNode *child);
void InsertChild(wxXmlNode *child, wxXmlNode *before_node);
bool RemoveChild(wxXmlNode *child);
void AddProperty(const wxString& name, const wxString& value);
bool DeleteProperty(const wxString& name);
// access methods:
wxXmlNodeType GetType() const { return m_Type; }
wxString GetName() const { return m_Name; }
wxString GetContent() const { return m_Content; }
wxXmlNode *GetParent() const { return m_Parent; }
wxXmlNode *GetNext() const { return m_Next; }
wxXmlNode *GetChildren() const { return m_Children; }
wxXmlProperty *GetProperties() const { return m_Properties; }
bool GetPropVal(const wxString& propName, wxString *value) const;
wxString GetPropVal(const wxString& propName, const wxString& defaultVal) const;
bool HasProp(const wxString& propName) const;
void SetType(wxXmlNodeType type) { m_Type = type; }
void SetName(const wxString& name) { m_Name = name; }
void SetContent(const wxString& con) { m_Content = con; }
void SetParent(wxXmlNode *parent) { m_Parent = parent; }
void SetNext(wxXmlNode *next) { m_Next = next; }
void SetChildren(wxXmlNode *child) { m_Children = child; }
void SetProperties(wxXmlProperty *prop) { m_Properties = prop; }
void AddProperty(wxXmlProperty *prop);
private:
wxXmlNodeType m_Type;
wxString m_Name;
wxString m_Content;
wxXmlProperty *m_Properties;
wxXmlNode *m_Parent, *m_Children, *m_Next;
void DoCopy(const wxXmlNode& node);
};
// This class holds XML data/document as parsed by libxml. Note that
// internal representation is independant on libxml and you can use
// it without libxml (see Load/SaveBinary).
class WXDLLEXPORT wxXmlDocument : public wxObject
{
public:
wxXmlDocument() : wxObject(), m_Version(_T("1.0")), m_Root(NULL) {}
wxXmlDocument(const wxString& filename, wxXmlIOType io_type = wxXML_IO_AUTO);
wxXmlDocument(wxInputStream& stream, wxXmlIOType io_type = wxXML_IO_AUTO);
~wxXmlDocument() { delete m_Root; }
wxXmlDocument(const wxXmlDocument& doc);
wxXmlDocument& operator=(const wxXmlDocument& doc);
// Parses .xml file and loads data. Returns TRUE on success, FALSE
// otherwise.
// NOTE: Any call to this method will result into linking against libxml
// and app's binary size will grow by ca. 250kB
bool Load(const wxString& filename, wxXmlIOType io_type = wxXML_IO_AUTO);
bool Load(wxInputStream& stream, wxXmlIOType io_type = wxXML_IO_AUTO);
// Saves document as .xml file.
// NOTE: Any call to this method will result into linking against libxml
// and app's binary size will grow by ca. 250kB
bool Save(const wxString& filename, wxXmlIOType io_type) const;
bool Save(wxOutputStream& stream, wxXmlIOType io_type) const;
// Returns root node of the document.
wxXmlNode *GetRoot() const { return m_Root; }
// Returns version of document (may be empty).
wxString GetVersion() const { return m_Version; }
// Returns encoding of document (may be empty).
wxString GetEncoding() const { return m_Encoding; }
// Write-access methods:
void SetRoot(wxXmlNode *node) { delete m_Root ; m_Root = node; }
void SetVersion(const wxString& version) { m_Version = version; }
void SetEncoding(const wxString& encoding) { m_Encoding = encoding; }
static void AddHandler(wxXmlIOHandler *handler);
static void CleanUpHandlers();
static void InitStandardHandlers();
protected:
static wxList *sm_Handlers;
private:
wxString m_Version, m_Encoding;
wxXmlNode *m_Root;
void DoCopy(const wxXmlDocument& doc);
};
// wxXmlIOHandler takes care of loading and/or saving XML data.
// see xmlio.h for available handlers
class WXDLLEXPORT wxXmlIOHandler : public wxObject
{
public:
wxXmlIOHandler() {}
virtual wxXmlIOType GetType() = 0;
virtual bool CanLoad(wxInputStream& stream) = 0;
virtual bool CanSave() = 0;
virtual bool Load(wxInputStream& stream, wxXmlDocument& doc) = 0;
virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc) = 0;
};
#endif // _WX_XML_H_

View File

@ -0,0 +1,72 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xmlio.h
// Purpose: wxXmlIOHandler - XML I/O classes
// Author: Vaclav Slavik
// Created: 2000/07/24
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XMLIO_H_
#define _WX_XMLIO_H_
#ifdef __GNUG__
#pragma interface "xmlio.h"
#endif
#include "wx/defs.h"
#include "wx/string.h"
#include "wx/xml/xml.h"
class WXDLLEXPORT wxXmlIOHandlerBin : public wxXmlIOHandler
{
public:
wxXmlIOHandlerBin() {}
virtual wxXmlIOType GetType() { return wxXML_IO_BIN; }
virtual bool CanLoad(wxInputStream& stream);
virtual bool CanSave() { return TRUE; }
virtual bool Load(wxInputStream& stream, wxXmlDocument& doc);
virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc);
protected:
wxString ReadHeader(wxInputStream& stream);
void WriteHeader(wxOutputStream& stream, const wxString& header);
};
#if wxUSE_ZLIB
class WXDLLEXPORT wxXmlIOHandlerBinZ : public wxXmlIOHandlerBin
{
public:
wxXmlIOHandlerBinZ() {}
virtual wxXmlIOType GetType() { return wxXML_IO_BINZ; }
virtual bool CanLoad(wxInputStream& stream);
virtual bool Load(wxInputStream& stream, wxXmlDocument& doc);
virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc);
};
#endif
class WXDLLEXPORT wxXmlIOHandlerLibxml : public wxXmlIOHandler
{
public:
virtual wxXmlIOType GetType() { return wxXML_IO_LIBXML; }
virtual bool CanLoad(wxInputStream& stream);
virtual bool CanSave();
virtual bool Load(wxInputStream& stream, wxXmlDocument& doc);
virtual bool Save(wxOutputStream& stream, const wxXmlDocument& doc);
};
#endif // _WX_XMLIO_H_

View File

@ -0,0 +1,255 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xmlres.h
// Purpose: XML resources
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_XMLRES_H_
#define _WX_XMLRES_H_
#ifdef __GNUG__
#pragma interface "xmlres.h"
#endif
#include "wx/defs.h"
#include "wx/string.h"
#include "wx/dynarray.h"
#include "wx/datetime.h"
#include "wx/list.h"
#include "wx/gdicmn.h"
class wxMenu;
class wxMenuBar;
class wxDialog;
class wxPanel;
class wxWindow;
class wxXmlResourceHandler;
#include "wx/xml/xml.h"
enum
{
wxXML_BINARY,
wxXML_ARCHIVE
};
class WXDLLEXPORT wxXmlResourceDataRecord
{
public:
wxXmlResourceDataRecord() : Doc(NULL), Time(wxDateTime::Now()) {}
~wxXmlResourceDataRecord() {delete Doc;}
wxString File;
wxXmlDocument *Doc;
wxDateTime Time;
};
WX_DECLARE_OBJARRAY(wxXmlResourceDataRecord, wxXmlResourceDataRecords);
// This class holds XML resources from one or more .xml files
// (or derived forms, either binary or zipped -- see manual for
// details).
class WXDLLEXPORT wxXmlResource : public wxObject
{
public:
wxXmlResource();
wxXmlResource(const wxString& filemask, int type);
~wxXmlResource();
// Loads resources from XML files that match given filemask.
// This method understands VFS (see filesys.h). Type is one of
// wxXML_TEXT, wxXML_BINARY, wxXML_ARCHIVE and specifies type of
// data to be expected:
// wxXML_BINARY - binary version of .xml file, as produced
// by wxXmlDocument::SaveBinary
// wxXML_ARCHIVE - ZIP archive that contains arbitrary number
// of files with .xmb extension
// (this kind of ZIP archive is produced by
// XML resources compiler that ships with wxWin)
bool Load(const wxString& filemask, int type = wxXML_ARCHIVE);
// Initialize handlers for all supported controls/windows. This will
// make the executable quite big because it forces linking against
// most of wxWin library
void InitAllHandlers();
// Initialize only specific handler (or custom handler). Convention says
// that handler name is equal to control's name plus 'XmlHandler', e.g.
// wxTextCtrlXmlHandler, wxHtmlWindowXmlHandler. XML resource compiler
// (xmlres) can create include file that contains initialization code for
// all controls used within the resource.
void AddHandler(wxXmlResourceHandler *handler);
// Removes all handlers
void ClearHandlers();
// Loads menu from resource. Returns NULL on failure.
wxMenu *LoadMenu(const wxString& name);
// Loads menubar from resource. Returns NULL on failure.
wxMenuBar *LoadMenuBar(const wxString& name);
// Loads dialog. dlg points to parent window (if any). Second form
// is used to finish creation of already existing instance (main reason
// for this is that you may want to use derived class with new event table)
// Example (typical usage):
// MyDialog dlg;
// wxTheXmlResource->LoadDialog(&dlg, mainFrame, "my_dialog");
// dlg->ShowModal();
wxDialog *LoadDialog(wxWindow *parent, const wxString& name);
bool LoadDialog(wxDialog *dlg, wxWindow *parent, const wxString& name);
// Loads panel. panel points to parent window (if any). Second form
// is used to finish creation of already existing instance.
wxPanel *LoadPanel(wxWindow *parent, const wxString& name);
bool LoadPanel(wxPanel *panel, wxWindow *parent, const wxString& name);
// Returns numeric ID that is equivalent to string id used in XML
// resource. To be used in event tables
// Macro XMLID is provided for convenience
static int GetXMLID(const char *str_id);
protected:
// Scans resources list for unloaded files and loads them. Also reloads
// files that have been modified since last loading.
void UpdateResources();
// Finds resource (calls UpdateResources) and returns node containing it
wxXmlNode *FindResource(const wxString& name, const wxString& type);
// Creates resource from info in given node:
wxObject *CreateResFromNode(wxXmlNode *node, wxObject *parent, wxObject *instance = NULL);
private:
wxList m_Handlers;
wxXmlResourceDataRecords m_Data;
friend class wxXmlResourceHandler;
};
// Global instance of resource class. For your convenience.
extern wxXmlResource *wxTheXmlResource;
// This macro translates string identifier (as used in XML resource,
// e.g. <menuitem id="my_menu">...</menuitem>) to integer id that is needed by
// wxWindows event tables.
// Example:
// BEGIN_EVENT_TABLE(MyFrame, wxFrame)
// EVT_MENU(XMLID("quit"), MyFrame::OnQuit)
// EVT_MENU(XMLID("about"), MyFrame::OnAbout)
// EVT_MENU(XMLID("new"), MyFrame::OnNew)
// EVT_MENU(XMLID("open"), MyFrame::OnOpen)
// END_EVENT_TABLE()
#define XMLID(str_id) wxXmlResource::GetXMLID(str_id)
class WXDLLEXPORT wxXmlResourceHandler : public wxObject
{
public:
wxXmlResourceHandler();
virtual ~wxXmlResourceHandler() {}
// Creates object (menu, dialog, control, ...) from XML node.
// Should check for validity.
// parent is higher-level object (usually window, dialog or panel)
// that is often neccessary to create resource
// if instance != NULL it should not create new instance via 'new' but
// rather use this one and call its Create method
wxObject *CreateResource(wxXmlNode *node, wxObject *parent, wxObject *instance);
// This one is called from CreateResource after variables
// were filled
virtual wxObject *DoCreateResource() = 0;
// Returns TRUE if it understands this node and can create
// resource from it, FALSE otherwise.
virtual bool CanHandle(wxXmlNode *node) = 0;
// Check "platform" property if it matches this platform
// that is, if this node 'exists' under this platform
static bool CheckPlatform(wxXmlNode *node);
void SetParentResource(wxXmlResource *res) { m_Resource = res; }
protected:
wxXmlResource *m_Resource;
wxArrayString m_StyleNames;
wxArrayInt m_StyleValues;
// Variables (filled by CreateResource)
wxXmlNode *m_Node;
wxObject *m_Parent, *m_Instance;
wxWindow *m_ParentAsWindow, *m_InstanceAsWindow;
// --- Handy methods:
// Gets node content from wxXML_ENTITY_NODE
// (the problem is, <tag>content<tag> is represented as
// wxXML_ENTITY_NODE name="tag", content=""
// |-- wxXML_TEXT_NODE or
// wxXML_CDATA_SECTION_NODE name="" content="content"
wxString GetNodeContent(wxXmlNode *node);
// Check to see if a param exists
bool HasParam(const wxString& param);
// Finds the node or returns NULL
wxXmlNode *GetParamNode(const wxString& param);
wxString GetParamValue(const wxString& param);
// Add style flag (e.g. wxMB_DOCKABLE) to list of flags
// understood by this handler
void AddStyle(const wxString& name, int value);
// Gets style flags from text in form "flag | flag2| flag3 |..."
// Only understads flags added with AddStyle
int GetStyle(const wxString& param = _T("style"), int defaults = 0);
// Gets text from param and does some convertions:
// - replaces \n, \r, \t by respective chars (according to C syntax)
// - replaces $ by & and $$ by $ (needed for $File => &File because of XML)
// - converts encodings if neccessary
wxString GetText(const wxString& param);
// Return XMLID
int GetID();
wxString GetName();
// Get bool flag (1,t,yes,on,true are TRUE, everything else is FALSE)
bool GetBool(const wxString& param, bool defaultv = FALSE);
// Get integer value from param
long GetLong( const wxString& param, long defaultv = 0 );
// Get colour in HTML syntax (#RRGGBB)
wxColour GetColour(const wxString& param);
wxSize GetSize(const wxString& param = _T("size"));
wxPoint GetPosition(const wxString& param = _T("pos"));
// Sets common window options:
void SetupWindow(wxWindow *wnd);
void CreateChildren(wxObject *parent, bool only_this_handler = FALSE,
wxXmlNode *children_node = NULL /*stands for
GetParamNode("children")*/);
wxObject *CreateResFromNode(wxXmlNode *node, wxObject *parent, wxObject *instance = NULL)
{ return m_Resource->CreateResFromNode(node, parent, instance); }
};
#define ADD_STYLE(style) AddStyle(_T(#style), style)
#endif // _WX_XMLRES_H_

View File

@ -1,6 +1,6 @@
# $Id$
CONTRIB_SUBDIRS=ogl mmedia stc
CONTRIB_SUBDIRS=ogl mmedia stc xml
all:
@for d in $(CONTRIB_SUBDIRS); do (cd $$d && $(MAKE)); done

View File

@ -0,0 +1,31 @@
# $Id$
top_srcdir = @top_srcdir@/..
top_builddir = ../../..
libsrc_dir = contrib/src/xml
TARGET_LIBNAME=libwxxml
LIBVERSION_CURRENT=0
LIBVERSION_REVISION=1
LIBVERSION_AGE=0
HEADER_PATH=$(top_srcdir)/contrib/include/wx
HEADER_SUBDIR=xml
HEADERS=xh_all.h xh_bttn.h xh_chckb.h xh_chckl.h xh_choic.h xh_combo.h \
xh_dlg.h xh_gauge.h xh_html.h xh_menu.h xh_notbk.h xh_panel.h \
xh_radbt.h xh_radbx.h xh_sizer.h xh_slidr.h xh_spin.h xh_stbmp.h \
xh_sttxt.h xh_text.h xml.h xmlio.h xmlres.h
OBJECTS=xml.o xmlbin.o xmlbinz.o xmlpars.o xmlres.o xmlrsall.o \
xh_bttn.o xh_chckb.o xh_chckl.o xh_choic.o xh_combo.o xh_dlg.o \
xh_gauge.o xh_html.o xh_menu.o xh_notbk.o xh_panel.o xh_radbt.o \
xh_radbx.o xh_sizer.o xh_slidr.o xh_spin.o xh_stbmp.o xh_sttxt.o \
xh_text.o \
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
include $(top_builddir)/src/makelib.env

View File

@ -0,0 +1,47 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_bttn.cpp
// Purpose: XML resource for buttons
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_bttn.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_bttn.h"
#include "wx/button.h"
wxObject *wxButtonXmlHandler::DoCreateResource()
{
wxButton *button = new wxButton(m_ParentAsWindow,
GetID(),
GetText(_T("label")),
GetPosition(), GetSize(),
GetStyle());
button->SetName(GetName());
if (GetBool(_T("default"), 0) == 1) button->SetDefault();
SetupWindow(button);
return button;
}
bool wxButtonXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("button");
}

View File

@ -0,0 +1,56 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_chckb.cpp
// Purpose: XML resource for wxCheckBox
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_chckb.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_chckb.h"
#include "wx/checkbox.h"
#if wxUSE_CHECKBOX
wxCheckBoxXmlHandler::wxCheckBoxXmlHandler()
: wxXmlResourceHandler()
{
}
wxObject *wxCheckBoxXmlHandler::DoCreateResource()
{
wxCheckBox *control = new wxCheckBox(m_ParentAsWindow,
GetID(),
GetText(_T("label")),
GetPosition(), GetSize(),
GetStyle(),
wxDefaultValidator,
GetName()
);
control->SetValue( GetBool( _T("checked")));
SetupWindow(control);
return control;
}
bool wxCheckBoxXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("checkbox");
}
#endif

View File

@ -0,0 +1,115 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_chckl.cpp
// Purpose: XML resource for wxCheckList
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_chckl.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_chckl.h"
#include "wx/checklst.h"
wxCheckListXmlHandler::wxCheckListXmlHandler()
: wxXmlResourceHandler(), m_InsideBox(FALSE)
{
// no styles
}
wxObject *wxCheckListXmlHandler::DoCreateResource()
{
if( m_Node->GetName() == _T("checklist"))
{
// need to build the list of strings from children
m_InsideBox = TRUE;
CreateChildren( NULL, TRUE /* only this handler */);
wxString *strings = (wxString *) NULL;
if( strList.GetCount() > 0 )
{
strings = new wxString[strList.GetCount()];
int count = strList.GetCount();
for( int i = 0; i < count; i++ )
strings[i]=strList[i];
}
wxCheckListBox *control = new wxCheckListBox(m_ParentAsWindow,
GetID(),
GetPosition(), GetSize(),
strList.GetCount(),
strings,
GetStyle(),
wxDefaultValidator,
GetName()
);
// step through children myself (again.)
wxXmlNode *n = GetParamNode(_T("children"));
if (n) n = n->GetChildren();
int i = 0;
while (n)
{
if (n->GetType() != wxXML_ELEMENT_NODE ||
n->GetName() != _T("item" ))
{ n = n->GetNext(); continue; }
// checking boolean is a bit ugly here (see GetBool() )
wxString v = n->GetPropVal(_T("checked"), wxEmptyString);
v.MakeLower();
if (v)
{
if( v == _T("1") || v == _T("t") || v == _T("yes") ||
v == _T("on") || v == _T("true") )
{
control->Check( i, TRUE );
}
}
i++;
n = n->GetNext();
}
SetupWindow(control);
if( strings != NULL )
delete [] strings;
strList.Clear(); // dump the strings
return control;
}
else
{
// on the inside now.
// handle <item checked="boolean">Label</item>
// add to the list
strList.Add( GetNodeContent(m_Node) );
return NULL;
}
}
bool wxCheckListXmlHandler::CanHandle(wxXmlNode *node)
{
return( node->GetName() == _T("checklist") ||
( m_InsideBox &&
node->GetName() == _T("item" ))
);
}

View File

@ -0,0 +1,95 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_choic.cpp
// Purpose: XML resource for wxChoice
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_choic.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_choic.h"
#include "wx/choice.h"
wxChoiceXmlHandler::wxChoiceXmlHandler()
: wxXmlResourceHandler() , m_InsideBox(FALSE)
{
ADD_STYLE(wxCB_SORT);
}
wxObject *wxChoiceXmlHandler::DoCreateResource()
{
if( m_Node->GetName() == _T("choice"))
{
// find the selection
long selection = GetLong( _T("selection"), -1 );
// need to build the list of strings from children
m_InsideBox = TRUE;
CreateChildren( NULL, TRUE /* only this handler */);
wxString *strings = (wxString *) NULL;
if( strList.GetCount() > 0 )
{
strings = new wxString[strList.GetCount()];
int count = strList.GetCount();
for( int i = 0; i < count; i++ )
strings[i]=strList[i];
}
wxChoice *control = new wxChoice(m_ParentAsWindow,
GetID(),
GetPosition(), GetSize(),
strList.GetCount(),
strings,
GetStyle(),
wxDefaultValidator,
GetName()
);
if( selection != -1 )
control->SetSelection( selection );
SetupWindow(control);
if( strings != NULL )
delete [] strings;
strList.Clear(); // dump the strings
return control;
}
else
{
// on the inside now.
// handle <item>Label</item>
// add to the list
strList.Add( GetNodeContent(m_Node) );
return NULL;
}
}
bool wxChoiceXmlHandler::CanHandle(wxXmlNode *node)
{
return( node->GetName() == _T("choice") ||
( m_InsideBox &&
node->GetName() == _T("item" ))
);
}

View File

@ -0,0 +1,101 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_combo.cpp
// Purpose: XML resource for wxRadioBox
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_combo.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_combo.h"
#include "wx/combobox.h"
#if wxUSE_COMBOBOX
wxComboBoxXmlHandler::wxComboBoxXmlHandler()
: wxXmlResourceHandler() , m_InsideBox(FALSE)
{
ADD_STYLE(wxCB_SIMPLE);
ADD_STYLE(wxCB_SORT);
ADD_STYLE(wxCB_READONLY);
ADD_STYLE(wxCB_DROPDOWN);
}
wxObject *wxComboBoxXmlHandler::DoCreateResource()
{
if( m_Node->GetName() == _T("combobox"))
{
// find the selection
long selection = GetLong( _T("selection"), -1 );
// need to build the list of strings from children
m_InsideBox = TRUE;
CreateChildren( NULL, TRUE /* only this handler */);
wxString *strings = (wxString *) NULL;
if( strList.GetCount() > 0 )
{
strings = new wxString[strList.GetCount()];
int count = strList.GetCount();
for( int i = 0; i < count; i++ )
strings[i]=strList[i];
}
wxComboBox *control = new wxComboBox(m_ParentAsWindow,
GetID(),
GetText(_T("value")),
GetPosition(), GetSize(),
strList.GetCount(),
strings,
GetStyle(),
wxDefaultValidator,
GetName()
);
if( selection != -1 )
control->SetSelection( selection );
SetupWindow(control);
if( strings != NULL )
delete [] strings;
strList.Clear(); // dump the strings
return control;
}
else
{
// on the inside now.
// handle <item>Label</item>
// add to the list
strList.Add( GetNodeContent(m_Node) );
return NULL;
}
}
bool wxComboBoxXmlHandler::CanHandle(wxXmlNode *node)
{
return( node->GetName() == _T("combobox") ||
( m_InsideBox &&
node->GetName() == _T("item" ))
);
}
#endif

View File

@ -0,0 +1,75 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_dlg.cpp
// Purpose: XML resource for dialogs
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_dlg.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_dlg.h"
#include "wx/dialog.h"
#include "wx/log.h"
#include "wx/intl.h"
wxDialogXmlHandler::wxDialogXmlHandler() : wxXmlResourceHandler()
{
ADD_STYLE(wxSTAY_ON_TOP);
ADD_STYLE(wxCAPTION);
ADD_STYLE(wxDEFAULT_DIALOG_STYLE);
ADD_STYLE(wxTHICK_FRAME);
ADD_STYLE(wxSYSTEM_MENU);
ADD_STYLE(wxRESIZE_BORDER);
ADD_STYLE(wxRESIZE_BOX);
ADD_STYLE(wxDIALOG_MODAL);
ADD_STYLE(wxDIALOG_MODELESS);
ADD_STYLE(wxNO_3D);
ADD_STYLE(wxTAB_TRAVERSAL);
ADD_STYLE(wxWS_EX_VALIDATE_RECURSIVELY);
}
wxObject *wxDialogXmlHandler::DoCreateResource()
{
wxDialog *dlg = wxDynamicCast(m_Instance, wxDialog);
wxASSERT_MSG(dlg, _("XML resource: Cannot create dialog without instance."));
dlg->Create(m_ParentAsWindow,
GetID(),
GetText(_T("title")),
wxDefaultPosition, wxDefaultSize,
GetStyle(_T("style"), wxDEFAULT_DIALOG_STYLE),
GetName());
dlg->SetClientSize(GetSize());
dlg->Move(GetPosition());
SetupWindow(dlg);
CreateChildren(dlg);
return dlg;
}
bool wxDialogXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("dialog");
}

View File

@ -0,0 +1,73 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_gauge.cpp
// Purpose: XML resource for wxGauge
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_gauge.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_gauge.h"
#include "wx/gauge.h"
#if wxUSE_GAUGE
wxGaugeXmlHandler::wxGaugeXmlHandler()
: wxXmlResourceHandler()
{
ADD_STYLE( wxGA_HORIZONTAL );
ADD_STYLE( wxGA_VERTICAL );
ADD_STYLE( wxGA_PROGRESSBAR );
ADD_STYLE( wxGA_SMOOTH ); // windows only
}
wxObject *wxGaugeXmlHandler::DoCreateResource()
{
wxGauge *control = new wxGauge(m_ParentAsWindow,
GetID(),
GetLong( _T("range"), wxGAUGE_DEFAULT_RANGE),
GetPosition(), GetSize(),
GetStyle(),
wxDefaultValidator,
GetName()
);
if( HasParam( _T("value") ))
{
control->SetValue( GetLong( _T("value") ));
}
if( HasParam( _T("shadow") ))
{
control->SetShadowWidth( GetLong( _T("shadow") ));
}
if( HasParam( _T("bezel") ))
{
control->SetBezelFace( GetLong( _T("bezel") ));
}
SetupWindow(control);
return control;
}
bool wxGaugeXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("gauge");
}
#endif // wxUSE_GAUGE

View File

@ -0,0 +1,71 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_html.cpp
// Purpose: XML resource for wxHtmlWindow
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_html.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_html.h"
#if wxUSE_HTML
#include "wx/html/htmlwin.h"
wxHtmlWindowXmlHandler::wxHtmlWindowXmlHandler()
: wxXmlResourceHandler()
{
ADD_STYLE( wxHW_SCROLLBAR_NEVER );
ADD_STYLE( wxHW_SCROLLBAR_AUTO );
}
wxObject *wxHtmlWindowXmlHandler::DoCreateResource()
{
wxHtmlWindow *control = new wxHtmlWindow(m_ParentAsWindow,
GetID(),
GetPosition(), GetSize(),
GetStyle( _T("style" ), wxHW_SCROLLBAR_AUTO),
GetName()
);
if( HasParam( _T("borders") ))
{
control->SetBorders( GetLong( _T("borders" )));
}
if( HasParam( _T("url") ))
{
control->LoadPage( GetParamValue( _T("url" )));
}
else if( HasParam( _T("htmlcode") ))
{
control->SetPage( GetText(_T("htmlcode")) );
}
SetupWindow(control);
return control;
}
bool wxHtmlWindowXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("htmlwindow");
}
#endif // wxUSE_HTML

126
contrib/src/xml/xh_menu.cpp Normal file
View File

@ -0,0 +1,126 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_menu.cpp
// Purpose: XML resource for menus and menubars
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_menu.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_menu.h"
#include "wx/menu.h"
wxMenuXmlHandler::wxMenuXmlHandler() :
wxXmlResourceHandler(), m_InsideMenu(FALSE)
{
ADD_STYLE(wxMENU_TEAROFF);
}
wxObject *wxMenuXmlHandler::DoCreateResource()
{
if (m_Node->GetName() == _T("menu"))
{
wxMenu *menu = new wxMenu(GetStyle());
wxString title = GetText(_T("label"));
wxString help = GetText(_T("help"));
bool oldins = m_InsideMenu;
m_InsideMenu = TRUE;
CreateChildren(menu, TRUE/*only this handler*/);
m_InsideMenu = oldins;
wxMenuBar *p_bar = wxDynamicCast(m_Parent, wxMenuBar);
if (p_bar)
p_bar->Append(menu, title);
else
{
wxMenu *p_menu = wxDynamicCast(m_Parent, wxMenu);
if (p_menu)
p_menu->Append(GetID(), title, menu, help);
}
return menu;
}
else
{
wxMenu *p_menu = wxDynamicCast(m_Parent, wxMenu);
if (m_Node->GetName() == _T("separator"))
p_menu->AppendSeparator();
else if (m_Node->GetName() == _T("break"))
p_menu->Break();
else
{
int id = GetID();
bool checkable = GetBool(_T("checkable"));
p_menu->Append(id, GetText(_T("label")),
GetText(_T("help")), checkable);
if (id != -1)
{
p_menu->Enable(id, GetBool(_T("enabled"), TRUE));
if (checkable) p_menu->Check(id, GetBool(_T("checked")));
}
}
return NULL;
}
}
bool wxMenuXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("menu") ||
(m_InsideMenu &&
(node->GetName() == _T("menuitem") ||
node->GetName() == _T("break") ||
node->GetName() == _T("separator"))
);
}
wxMenuBarXmlHandler::wxMenuBarXmlHandler() : wxXmlResourceHandler()
{
ADD_STYLE(wxMB_DOCKABLE);
}
wxObject *wxMenuBarXmlHandler::DoCreateResource()
{
wxMenuBar *menubar = new wxMenuBar(GetStyle());
CreateChildren(menubar);
return menubar;
}
bool wxMenuBarXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("menubar");
}

View File

@ -0,0 +1,95 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_notbk.cpp
// Purpose: XML resource for wxBoxSizer
// Author: Vaclav Slavik
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_notbk.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_notbk.h"
#if wxUSE_NOTEBOOK
#include "wx/log.h"
#include "wx/notebook.h"
wxNotebookXmlHandler::wxNotebookXmlHandler()
: wxXmlResourceHandler(), m_IsInside(FALSE), m_Notebook(NULL)
{
ADD_STYLE(wxNB_FIXEDWIDTH);
ADD_STYLE(wxNB_LEFT);
ADD_STYLE(wxNB_RIGHT);
ADD_STYLE(wxNB_BOTTOM);
}
wxObject *wxNotebookXmlHandler::DoCreateResource()
{
if (m_Node->GetName() == _T("page"))
{
wxXmlNode *n = GetParamNode(_T("child"))->GetChildren();
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE)
{
bool old_ins = m_IsInside;
m_IsInside = FALSE;
m_IsInside = old_ins;
wxObject *item = CreateResFromNode(n, m_Notebook, NULL);
wxWindow *wnd = wxDynamicCast(item, wxWindow);
if (wnd)
m_Notebook->AddPage(wnd, GetText(_T("label")),
GetBool(_T("selected"), 0));
else
wxLogError(_T("Error in resource."));
return wnd;
}
n = n->GetNext();
}
wxLogError(_T("Error in resource: no control within notebook's <page> tag."));
return NULL;
}
else {
wxNotebook *nb = new wxNotebook(m_ParentAsWindow,
GetID(),
GetPosition(), GetSize(),
GetStyle( _T("style" )),
GetName());
wxNotebook *old_par = m_Notebook;
m_Notebook = nb;
bool old_ins = m_IsInside;
m_IsInside = TRUE;
CreateChildren(m_Notebook, TRUE/*only this handler*/);
m_IsInside = old_ins;
m_Notebook = old_par;
return nb;
}
}
bool wxNotebookXmlHandler::CanHandle(wxXmlNode *node)
{
return ((!m_IsInside && node->GetName() == _T("notebook")) ||
(m_IsInside && node->GetName() == _T("page")));
}
#endif

View File

@ -0,0 +1,52 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_panel.cpp
// Purpose: XML resource for panels
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_panel.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_panel.h"
#include "wx/panel.h"
wxPanelXmlHandler::wxPanelXmlHandler() : wxXmlResourceHandler()
{
ADD_STYLE(wxNO_3D);
ADD_STYLE(wxTAB_TRAVERSAL);
ADD_STYLE(wxWS_EX_VALIDATE_RECURSIVELY);
}
wxObject *wxPanelXmlHandler::DoCreateResource()
{
wxPanel *panel = new wxPanel(m_ParentAsWindow,
GetID(),
GetPosition(), GetSize(),
GetStyle(_T("style"), 0),
GetName());
SetupWindow(panel);
CreateChildren(panel);
return panel;
}
bool wxPanelXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("panel");
}

View File

@ -0,0 +1,65 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_radbt.cpp
// Purpose: XML resource for wxRadioButton
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_radbt.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_radbt.h"
#include "wx/radiobut.h"
#if wxUSE_RADIOBOX
wxRadioButtonXmlHandler::wxRadioButtonXmlHandler()
: wxXmlResourceHandler()
{
ADD_STYLE( wxRB_GROUP );
}
wxObject *wxRadioButtonXmlHandler::DoCreateResource()
{
/* BOBM - implementation note.
* once the wxBitmapRadioButton is implemented.
* look for a bitmap property. If not null,
* make it a wxBitmapRadioButton instead of the
* normal radio button.
*/
wxRadioButton *control = new wxRadioButton(m_ParentAsWindow,
GetID(),
GetText(_T("label")),
GetPosition(), GetSize(),
GetStyle(),
wxDefaultValidator,
GetName()
);
control->SetValue( GetBool(_T("value"), 0));
SetupWindow(control);
return control;
}
bool wxRadioButtonXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("radiobutton");
}
#endif

View File

@ -0,0 +1,102 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_radbx.cpp
// Purpose: XML resource for wxRadioBox
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_radbx.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_radbx.h"
#include "wx/radiobox.h"
#if wxUSE_RADIOBOX
wxRadioBoxXmlHandler::wxRadioBoxXmlHandler()
: wxXmlResourceHandler() , m_InsideBox(FALSE)
{
ADD_STYLE(wxRA_SPECIFY_COLS);
ADD_STYLE(wxRA_HORIZONTAL);
ADD_STYLE(wxRA_SPECIFY_ROWS);
ADD_STYLE(wxRA_VERTICAL);
}
wxObject *wxRadioBoxXmlHandler::DoCreateResource()
{
if( m_Node->GetName() == _T("radiobox"))
{
// find the selection
long selection = GetLong( _T("selection"), -1 );
// need to build the list of strings from children
m_InsideBox = TRUE;
CreateChildren( NULL, TRUE /* only this handler */, GetParamNode(_T("buttons")));
wxString *strings = (wxString *) NULL;
if( strList.GetCount() > 0 )
{
strings = new wxString[strList.GetCount()];
int count = strList.GetCount();
for( int i = 0; i < count; i++ )
strings[i]=strList[i];
}
wxRadioBox *control = new wxRadioBox(m_ParentAsWindow,
GetID(),
GetText(_T("label")),
GetPosition(), GetSize(),
strList.GetCount(),
strings,
GetLong( _T("dimension"), 0 ),
GetStyle(),
wxDefaultValidator,
GetName()
);
if( selection != -1 )
control->SetSelection( selection );
SetupWindow(control);
if( strings != NULL )
delete [] strings;
strList.Clear(); // dump the strings
return control;
}
else
{
// on the inside now.
// handle <item selected="boolean">Label</item>
// add to the list
strList.Add( GetNodeContent(m_Node) );
return NULL;
}
}
bool wxRadioBoxXmlHandler::CanHandle(wxXmlNode *node)
{
return( node->GetName() == _T("radiobox") ||
( m_InsideBox &&
node->GetName() == _T("item" ))
);
}
#endif

View File

@ -0,0 +1,195 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_sizer.cpp
// Purpose: XML resource for wxBoxSizer
// Author: Vaclav Slavik
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_sizer.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_sizer.h"
#include "wx/sizer.h"
#include "wx/log.h"
#include "wx/statbox.h"
#include "wx/notebook.h"
wxSizerXmlHandler::wxSizerXmlHandler()
: wxXmlResourceHandler(), m_IsInside(FALSE), m_ParentSizer(NULL)
{
ADD_STYLE(wxHORIZONTAL);
ADD_STYLE(wxVERTICAL);
// and flags
ADD_STYLE(wxLEFT);
ADD_STYLE(wxRIGHT);
ADD_STYLE(wxTOP);
ADD_STYLE(wxBOTTOM);
ADD_STYLE(wxNORTH);
ADD_STYLE(wxSOUTH);
ADD_STYLE(wxEAST);
ADD_STYLE(wxWEST);
ADD_STYLE(wxALL);
ADD_STYLE(wxGROW);
ADD_STYLE(wxEXPAND);
ADD_STYLE(wxSHAPED);
ADD_STYLE(wxSTRETCH_NOT);
ADD_STYLE(wxALIGN_CENTER);
ADD_STYLE(wxALIGN_CENTRE);
ADD_STYLE(wxALIGN_LEFT);
ADD_STYLE(wxALIGN_TOP);
ADD_STYLE(wxALIGN_RIGHT);
ADD_STYLE(wxALIGN_BOTTOM);
ADD_STYLE(wxALIGN_CENTER_HORIZONTAL);
ADD_STYLE(wxALIGN_CENTRE_HORIZONTAL);
ADD_STYLE(wxALIGN_CENTER_VERTICAL);
ADD_STYLE(wxALIGN_CENTRE_VERTICAL);
}
wxObject *wxSizerXmlHandler::DoCreateResource()
{
if (m_Node->GetName() == _T("sizeritem"))
{
wxXmlNode *n = GetParamNode(_T("window"))->GetChildren();
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE)
{
bool old_ins = m_IsInside;
m_IsInside = FALSE;
wxObject *item = CreateResFromNode(n, m_Parent, NULL);
m_IsInside = old_ins;
wxSizer *sizer = wxDynamicCast(item, wxSizer);
wxWindow *wnd = wxDynamicCast(item, wxWindow);
if (sizer)
m_ParentSizer->Add(sizer, GetLong(_T("option")),
GetStyle(_T("flag")), GetLong(_T("border")));
else if (wnd)
m_ParentSizer->Add(wnd, GetLong(_T("option")),
GetStyle(_T("flag")), GetLong(_T("border")));
else
wxLogError(_T("Error in resource."));
return item;
}
n = n->GetNext();
}
wxLogError(_T("Error in resource: no control/sizer within sizer's <item> tag."));
return NULL;
}
else if (m_Node->GetName() == _T("spacer"))
{
wxCHECK_MSG(m_ParentSizer, NULL, _T("Incorrect syntax of XML resource: spacer not within sizer!"));
wxSize sz = GetSize();
m_ParentSizer->Add(sz.x, sz.y,
GetLong(_T("option")), GetStyle(_T("flag")), GetLong(_T("border")));
return NULL;
}
#if wxUSE_NOTEBOOK
else if (m_Node->GetName() == _T("notebooksizer"))
{
wxCHECK_MSG(m_ParentSizer, NULL, _T("Incorrect syntax of XML resource: notebooksizer not within sizer!"));
wxSizer *old_par = m_ParentSizer;
m_ParentSizer = NULL;
wxNotebook *nb = NULL;
wxObject *item;
wxXmlNode *n = GetParamNode(_T("window"))->GetChildren();
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE)
{
item = CreateResFromNode(n, m_Parent, NULL);
nb = wxDynamicCast(item, wxNotebook);
break;
}
n = n->GetNext();
}
m_ParentSizer = old_par;
wxCHECK_MSG(nb, NULL, _T("Incorrect syntax of XML resource: notebooksizer must contain a notebook!"));
return new wxNotebookSizer(nb);
}
#endif
else {
wxSizer *sizer = NULL;
wxXmlNode *parentNode = m_Node->GetParent()->GetParent();
wxCHECK_MSG(m_ParentSizer != NULL ||
((parentNode->GetName() == _T("panel") ||
parentNode->GetName() == _T("dialog")) &&
parentNode->GetType() == wxXML_ELEMENT_NODE), NULL,
_T("Incorrect use of sizer: parent is not 'dialog' or 'panel'."));
if (m_Node->GetName() == _T("boxsizer"))
sizer = new wxBoxSizer(GetStyle(_T("orient"), wxHORIZONTAL));
else if (m_Node->GetName() == _T("staticboxsizer"))
{
sizer = new wxStaticBoxSizer(
new wxStaticBox(m_ParentAsWindow, -1, GetText(_T("label"))),
GetStyle(_T("orient"), wxHORIZONTAL));
}
wxSizer *old_par = m_ParentSizer;
m_ParentSizer = sizer;
bool old_ins = m_IsInside;
m_IsInside = TRUE;
CreateChildren(m_Parent, TRUE/*only this handler*/);
m_IsInside = old_ins;
m_ParentSizer = old_par;
if (m_ParentSizer == NULL) // setup window:
{
m_ParentAsWindow->SetAutoLayout(TRUE);
m_ParentAsWindow->SetSizer(sizer);
wxXmlNode *nd = m_Node;
m_Node = parentNode;
if (GetSize() == wxDefaultSize)
sizer->Fit(m_ParentAsWindow);
m_Node = nd;
if (m_ParentAsWindow->GetWindowStyle() & (wxRESIZE_BOX | wxRESIZE_BORDER))
sizer->SetSizeHints(m_ParentAsWindow);
}
return sizer;
}
}
bool wxSizerXmlHandler::CanHandle(wxXmlNode *node)
{
return ((!m_IsInside && node->GetName() == _T("boxsizer")) ||
(!m_IsInside && node->GetName() == _T("staticboxsizer")) ||
#if wxUSE_NOTEBOOK
(!m_IsInside && node->GetName() == _T("notebooksizer")) ||
#endif
(m_IsInside && node->GetName() == _T("sizeritem")) ||
(m_IsInside && node->GetName() == _T("spacer")));
}

View File

@ -0,0 +1,93 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_slidr.cpp
// Purpose: XML resource for wxSlider
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_slidr.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_slidr.h"
#include "wx/slider.h"
#if wxUSE_SLIDER
wxSliderXmlHandler::wxSliderXmlHandler()
: wxXmlResourceHandler()
{
ADD_STYLE( wxSL_HORIZONTAL );
ADD_STYLE( wxSL_VERTICAL );
ADD_STYLE( wxSL_AUTOTICKS );
ADD_STYLE( wxSL_LABELS );
ADD_STYLE( wxSL_LEFT );
ADD_STYLE( wxSL_TOP );
ADD_STYLE( wxSL_RIGHT );
ADD_STYLE( wxSL_BOTTOM );
ADD_STYLE( wxSL_BOTH );
ADD_STYLE( wxSL_SELRANGE );
}
wxObject *wxSliderXmlHandler::DoCreateResource()
{
wxSlider *control = new wxSlider(m_ParentAsWindow,
GetID(),
GetLong( _T("value"), wxSL_DEFAULT_VALUE),
GetLong( _T("min"), wxSL_DEFAULT_MIN),
GetLong( _T("max"), wxSL_DEFAULT_MAX),
GetPosition(), GetSize(),
GetStyle(),
wxDefaultValidator,
GetName()
);
if( HasParam( _T("tickfreq") ))
{
control->SetTickFreq( GetLong( _T("tickfreq") ), 0 );
}
if( HasParam( _T("pagesize") ))
{
control->SetPageSize( GetLong( _T("pagesize") ) );
}
if( HasParam( _T("linesize") ))
{
control->SetLineSize( GetLong( _T("linesize") ));
}
if( HasParam( _T("thumb") ))
{
control->SetThumbLength( GetLong( _T("thumb") ));
}
if( HasParam( _T("tick") ))
{
control->SetTick( GetLong( _T("tick") ));
}
if( HasParam( _T("selmin") ) && HasParam( _T("selmax")) )
{
control->SetSelection( GetLong( _T("selmin") ), GetLong( _T("selmax")) );
}
SetupWindow(control);
return control;
}
bool wxSliderXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("slider");
}
#endif

View File

@ -0,0 +1,98 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_spin.cpp
// Purpose: XML resource for wxSpinButton
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_spin.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_spin.h"
#include "wx/spinctrl.h"
#if wxUSE_SPINBTN
wxSpinButtonXmlHandler::wxSpinButtonXmlHandler()
: wxXmlResourceHandler()
{
ADD_STYLE( wxSP_HORIZONTAL );
ADD_STYLE( wxSP_VERTICAL );
ADD_STYLE( wxSP_ARROW_KEYS );
ADD_STYLE( wxSP_WRAP );
}
wxObject *wxSpinButtonXmlHandler::DoCreateResource()
{
wxSpinButton *control = new wxSpinButton(m_ParentAsWindow,
GetID(),
GetPosition(), GetSize(),
GetStyle( _T("style"), wxSP_VERTICAL | wxSP_ARROW_KEYS ),
GetName()
);
control->SetValue( GetLong( _T("value"), wxSP_DEFAULT_VALUE) );
control->SetRange( GetLong( _T("min"), wxSP_DEFAULT_MIN),
GetLong( _T("max"), wxSP_DEFAULT_MAX) );
SetupWindow(control);
return control;
}
bool wxSpinButtonXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("spinbutton");
}
#endif // wxUSE_SPINBTN
#if wxUSE_SPINCTRL
wxSpinCtrlXmlHandler::wxSpinCtrlXmlHandler()
: wxXmlResourceHandler()
{
ADD_STYLE( wxSP_HORIZONTAL );
ADD_STYLE( wxSP_VERTICAL );
ADD_STYLE( wxSP_ARROW_KEYS );
ADD_STYLE( wxSP_WRAP );
}
wxObject *wxSpinCtrlXmlHandler::DoCreateResource()
{
wxSpinCtrl *control = new wxSpinCtrl(m_ParentAsWindow,
GetID(),
GetText(_T("label")),
GetPosition(), GetSize(),
GetStyle( _T("style"), wxSP_ARROW_KEYS ),
GetLong( _T("min"), wxSP_DEFAULT_MIN),
GetLong( _T("max"), wxSP_DEFAULT_MAX),
GetLong( _T("value"), wxSP_DEFAULT_VALUE),
GetName()
);
SetupWindow(control);
return control;
}
bool wxSpinCtrlXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("spinctrl");
}
#endif // wxUSE_SPINCTRL

View File

@ -0,0 +1,58 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_stbmp.cpp
// Purpose: XML resource for wxStaticBitmap
// Author: Vaclav Slavik
// Created: 2000/04/22
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_stbmp.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_stbmp.h"
#include "wx/statbmp.h"
#include "wx/image.h"
#include "wx/bitmap.h"
wxStaticBitmapXmlHandler::wxStaticBitmapXmlHandler()
: wxXmlResourceHandler()
{
}
wxObject *wxStaticBitmapXmlHandler::DoCreateResource()
{
wxImage img(GetParamValue(_T("bitmap")));
wxSize sz = GetSize();
if (!(sz == wxDefaultSize)) img.Rescale(sz.x, sz.y);
wxStaticBitmap *bmp = new wxStaticBitmap(m_ParentAsWindow,
GetID(),
img.ConvertToBitmap(),
GetPosition(), GetSize(),
GetStyle(),
GetName()
);
SetupWindow(bmp);
return bmp;
}
bool wxStaticBitmapXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("staticbitmap");
}

View File

@ -0,0 +1,52 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_sttxt.cpp
// Purpose: XML resource for wxStaticText
// Author: Bob Mitchell
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Bob Mitchell and Verant Interactive
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_sttxt.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_sttxt.h"
#include "wx/stattext.h"
wxStaticTextXmlHandler::wxStaticTextXmlHandler()
: wxXmlResourceHandler()
{
ADD_STYLE( wxST_NO_AUTORESIZE );
}
wxObject *wxStaticTextXmlHandler::DoCreateResource()
{
wxStaticText *text = new wxStaticText(m_ParentAsWindow,
GetID(),
GetText(_T("label")),
GetPosition(), GetSize(),
GetStyle(),
GetName()
);
SetupWindow(text);
return text;
}
bool wxStaticTextXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("statictext");
}

View File

@ -0,0 +1,57 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xh_text.cpp
// Purpose: XML resource for wxTextCtrl
// Author: Aleksandras Gluchovas
// Created: 2000/03/21
// RCS-ID: $Id$
// Copyright: (c) 2000 Aleksandras Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xh_text.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xh_text.h"
#include "wx/textctrl.h"
wxTextCtrlXmlHandler::wxTextCtrlXmlHandler() : wxXmlResourceHandler()
{
ADD_STYLE(wxTE_PROCESS_ENTER);
ADD_STYLE(wxTE_PROCESS_TAB);
ADD_STYLE(wxTE_MULTILINE);
ADD_STYLE(wxTE_PASSWORD);
ADD_STYLE(wxTE_READONLY);
ADD_STYLE(wxHSCROLL);
}
wxObject *wxTextCtrlXmlHandler::DoCreateResource()
{
wxTextCtrl *text = new wxTextCtrl(m_ParentAsWindow,
GetID(),
GetText(_T("value")),
GetPosition(), GetSize(),
GetStyle(),
wxDefaultValidator,
GetText(_T("name"))
);
SetupWindow(text);
return text;
}
bool wxTextCtrlXmlHandler::CanHandle(wxXmlNode *node)
{
return node->GetName() == _T("textctrl");
}

424
contrib/src/xml/xml.cpp Normal file
View File

@ -0,0 +1,424 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xml.cpp
// Purpose: wxXmlDocument - XML parser & data holder class
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xml.h"
#pragma implementation "xmlio.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/wfstream.h"
#include "wx/datstrm.h"
#include "wx/zstream.h"
#include "wx/log.h"
#include "wx/intl.h"
#include "wx/xml/xml.h"
#include "wx/xml/xmlio.h"
wxXmlNode::wxXmlNode(wxXmlNode *parent,wxXmlNodeType type,
const wxString& name, const wxString& content,
wxXmlProperty *props, wxXmlNode *next)
: m_Type(type), m_Name(name), m_Content(content),
m_Properties(props), m_Parent(parent),
m_Children(NULL), m_Next(next)
{
if (m_Parent)
{
if (m_Parent->m_Children)
{
m_Next = m_Parent->m_Children;
m_Parent->m_Children = this;
}
else
m_Parent->m_Children = this;
}
}
wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name,
const wxString& content)
: m_Type(type), m_Name(name), m_Content(content),
m_Properties(NULL), m_Parent(NULL),
m_Children(NULL), m_Next(NULL)
{}
wxXmlNode::wxXmlNode(const wxXmlNode& node)
{
m_Next = NULL;
m_Parent = NULL;
DoCopy(node);
}
wxXmlNode& wxXmlNode::operator=(const wxXmlNode& node)
{
delete m_Properties;
delete m_Children;
DoCopy(node);
return *this;
}
void wxXmlNode::DoCopy(const wxXmlNode& node)
{
m_Type = node.m_Type;
m_Name = node.m_Name;
m_Content = node.m_Content;
m_Children = NULL;
wxXmlNode *n = node.m_Children;
while (n)
{
AddChild(new wxXmlNode(*n));
n = n->GetNext();
}
m_Properties = NULL;
wxXmlProperty *p = node.m_Properties;
while (p)
{
AddProperty(p->GetName(), p->GetValue());
p = p->GetNext();
}
}
bool wxXmlNode::HasProp(const wxString& propName) const
{
wxXmlProperty *prop = GetProperties();
while (prop)
{
if (prop->GetName() == propName) return TRUE;
prop = prop->GetNext();
}
return FALSE;
}
bool wxXmlNode::GetPropVal(const wxString& propName, wxString *value) const
{
wxXmlProperty *prop = GetProperties();
while (prop)
{
if (prop->GetName() == propName)
{
*value = prop->GetValue();
return TRUE;
}
prop = prop->GetNext();
}
return FALSE;
}
wxString wxXmlNode::GetPropVal(const wxString& propName, const wxString& defaultVal) const
{
wxString tmp;
if (GetPropVal(propName, &tmp))
return tmp;
else
return defaultVal;
}
void wxXmlNode::AddChild(wxXmlNode *child)
{
if (m_Children == NULL)
m_Children = child;
else
{
wxXmlNode *ch = m_Children;
while (ch->m_Next) ch = ch->m_Next;
ch->m_Next = child;
}
child->m_Next = NULL;
child->m_Parent = this;
}
void wxXmlNode::InsertChild(wxXmlNode *child, wxXmlNode *before_node)
{
wxASSERT_MSG(before_node->GetParent() == this, _T("wxXmlNode::InsertChild - the node has incorrect parent"));
if (m_Children == before_node)
m_Children = child;
else
{
wxXmlNode *ch = m_Children;
while (ch->m_Next != before_node) ch = ch->m_Next;
ch->m_Next = child;
}
child->m_Parent = this;
child->m_Next = before_node;
}
bool wxXmlNode::RemoveChild(wxXmlNode *child)
{
if (m_Children == NULL)
return FALSE;
else if (m_Children == child)
{
m_Children = child->m_Next;
child->m_Parent = NULL;
child->m_Next = NULL;
return TRUE;
}
else
{
wxXmlNode *ch = m_Children;
while (ch->m_Next)
{
if (ch->m_Next == child)
{
ch->m_Next = child->m_Next;
child->m_Parent = NULL;
child->m_Next = NULL;
return TRUE;
}
ch = ch->m_Next;
}
return FALSE;
}
}
void wxXmlNode::AddProperty(const wxString& name, const wxString& value)
{
AddProperty(new wxXmlProperty(name, value, NULL));
}
void wxXmlNode::AddProperty(wxXmlProperty *prop)
{
if (m_Properties == NULL)
m_Properties = prop;
else
{
wxXmlProperty *p = m_Properties;
while (p->GetNext()) p = p->GetNext();
p->SetNext(prop);
}
}
bool wxXmlNode::DeleteProperty(const wxString& name)
{
if (m_Properties == NULL)
return FALSE;
else if (m_Properties->GetName() == name)
{
wxXmlProperty *prop = m_Properties;
m_Properties = prop->GetNext();
prop->SetNext(NULL);
delete prop;
return TRUE;
}
else
{
wxXmlProperty *p = m_Properties;
while (p->GetNext())
{
if (p->GetNext()->GetName() == name)
{
wxXmlProperty *prop = p->GetNext();
p->SetNext(prop->GetNext());
prop->SetNext(NULL);
delete prop;
return TRUE;
}
p = p->GetNext();
}
return FALSE;
}
}
wxXmlDocument::wxXmlDocument(const wxString& filename, wxXmlIOType io_type)
: wxObject(), m_Root(NULL)
{
if (!Load(filename, io_type))
{
delete m_Root;
m_Root = NULL;
}
}
wxXmlDocument::wxXmlDocument(wxInputStream& stream, wxXmlIOType io_type)
: wxObject(), m_Root(NULL)
{
if (!Load(stream, io_type))
{
delete m_Root;
m_Root = NULL;
}
}
wxXmlDocument::wxXmlDocument(const wxXmlDocument& doc)
{
DoCopy(doc);
}
wxXmlDocument& wxXmlDocument::operator=(const wxXmlDocument& doc)
{
delete m_Root;
DoCopy(doc);
return *this;
}
void wxXmlDocument::DoCopy(const wxXmlDocument& doc)
{
m_Version = doc.m_Version;
m_Encoding = doc.m_Encoding;
m_Root = new wxXmlNode(*doc.m_Root);
}
bool wxXmlDocument::Load(const wxString& filename, wxXmlIOType io_type)
{
wxFileInputStream stream(filename);
return Load(stream, io_type);
}
bool wxXmlDocument::Load(wxInputStream& stream, wxXmlIOType io_type)
{
wxNode *n = sm_Handlers->GetFirst();
while (n)
{
wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData();
if ((io_type == wxXML_IO_AUTO || io_type == h->GetType()) &&
h->CanLoad(stream))
{
return h->Load(stream, *this);
}
n = n->GetNext();
}
wxLogError(_("Cannot find XML I/O handler capable of loading this format."));
return FALSE;
}
bool wxXmlDocument::Save(const wxString& filename, wxXmlIOType io_type) const
{
wxFileOutputStream stream(filename);
return Save(stream, io_type);
}
bool wxXmlDocument::Save(wxOutputStream& stream, wxXmlIOType io_type) const
{
wxNode *n = sm_Handlers->GetFirst();
while (n)
{
wxXmlIOHandler *h = (wxXmlIOHandler*) n->GetData();
if (io_type == h->GetType() && h->CanSave())
{
return h->Save(stream, *this);
}
n = n->GetNext();
}
wxLogError(_("Cannot find XML I/O handler capable of saving in this format."));
return FALSE;
}
wxList *wxXmlDocument::sm_Handlers = NULL;
void wxXmlDocument::AddHandler(wxXmlIOHandler *handler)
{
if (sm_Handlers == NULL)
{
sm_Handlers = new wxList;
sm_Handlers->DeleteContents(TRUE);
}
sm_Handlers->Append(handler);
}
void wxXmlDocument::CleanUpHandlers()
{
delete sm_Handlers;
sm_Handlers = NULL;
}
void wxXmlDocument::InitStandardHandlers()
{
AddHandler(new wxXmlIOHandlerBin);
AddHandler(new wxXmlIOHandlerLibxml);
}
#include "wx/module.h"
class wxXmlModule: public wxModule
{
DECLARE_DYNAMIC_CLASS(wxXmlModule)
public:
wxXmlModule() {}
bool OnInit() { wxXmlDocument::InitStandardHandlers(); return TRUE; };
void OnExit() { wxXmlDocument::CleanUpHandlers(); };
};
IMPLEMENT_DYNAMIC_CLASS(wxXmlModule, wxModule)

161
contrib/src/xml/xmlbin.cpp Normal file
View File

@ -0,0 +1,161 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xmlbin.cpp
// Purpose: wxXmlIOHandlerBin
// Author: Vaclav Slavik
// Created: 2000/07/24
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
// nothing, already in xml.cpp
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/datstrm.h"
#include "wx/log.h"
#include "wx/intl.h"
#include "wx/xml/xmlio.h"
bool wxXmlIOHandlerBin::CanLoad(wxInputStream& stream)
{
bool canread;
canread = (ReadHeader(stream) == _T("XMLBIN "));
stream.SeekI(-9, wxFromCurrent);
return canread;
}
wxString wxXmlIOHandlerBin::ReadHeader(wxInputStream& stream)
{
wxUint8 version;
char cheader[8];
stream.Read(cheader, 8);
cheader[7] = 0;
stream.Read(&version, 1);
if (version != 1) return wxEmptyString;
else return wxString(cheader);
}
void wxXmlIOHandlerBin::WriteHeader(wxOutputStream& stream, const wxString& header)
{
char cheader[8];
size_t i;
wxUint8 version = 1;
for (i = 0; i < header.Length(); i++) cheader[i] = header[i];
for (; i < 7; i++) cheader[i] = ' ';
cheader[7] = 0;
stream.Write(cheader, 8);
stream.Write(&version, 1);
}
static bool SaveBinNode(wxDataOutputStream& ds, wxXmlNode *node)
{
if (node)
{
ds << (wxUint8)1 <<
(wxUint8)node->GetType() <<
node->GetName() << node->GetContent();
wxXmlProperty *prop = node->GetProperties();
while (prop)
{
ds << (wxUint8)1;
ds << prop->GetName() << prop->GetValue();
prop = prop->GetNext();
}
ds << (wxUint8)0;
SaveBinNode(ds, node->GetNext());
SaveBinNode(ds, node->GetChildren());
}
else
ds << (wxUint8)0;
return TRUE;
}
bool wxXmlIOHandlerBin::Save(wxOutputStream& stream, const wxXmlDocument& doc)
{
WriteHeader(stream, "XMLBIN ");
wxDataOutputStream ds(stream);
ds << doc.GetVersion() << doc.GetEncoding();
SaveBinNode(ds, doc.GetRoot());
return stream.LastError() == wxSTREAM_NOERROR;
}
static wxXmlProperty *LoadBinProp(wxDataInputStream& ds)
{
wxUint8 dummy;
ds >> dummy;
if (dummy == 0) return NULL;
wxString name, value;
ds >> name >> value;
return new wxXmlProperty(name, value, LoadBinProp(ds));
}
static wxXmlNode *LoadBinNode(wxDataInputStream& ds, wxXmlNode *parent)
{
wxUint8 type;
wxString name, content;
wxUint8 dummy;
ds >> dummy;
if (dummy == 0) return NULL;
ds >> type >> name >> content;
wxXmlProperty *prop = LoadBinProp(ds);
wxXmlNode *nd = new wxXmlNode(parent, (wxXmlNodeType)type, name, content,
prop, LoadBinNode(ds, parent));
LoadBinNode(ds, nd);
return nd;
}
bool wxXmlIOHandlerBin::Load(wxInputStream& stream, wxXmlDocument& doc)
{
ReadHeader(stream);
wxDataInputStream ds(stream);
wxString tmp;
ds >> tmp;
doc.SetVersion(tmp);
ds >> tmp;
doc.SetEncoding(tmp);
doc.SetRoot(LoadBinNode(ds, NULL));
return (doc.GetRoot() != NULL);
}

View File

@ -0,0 +1,59 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xmlbinz.cpp
// Purpose: wxXmlIOHandlerBinZ
// Author: Vaclav Slavik
// Created: 2000/07/24
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
// nothing, already in xml.cpp
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/datstrm.h"
#include "wx/log.h"
#include "wx/zstream.h"
#include "wx/xml/xmlio.h"
#if wxUSE_ZLIB
bool wxXmlIOHandlerBinZ::CanLoad(wxInputStream& stream)
{
bool canread;
canread = (ReadHeader(stream) == _T("XMLBINZ"));
stream.SeekI(-9, wxFromCurrent);
return canread;
}
bool wxXmlIOHandlerBinZ::Save(wxOutputStream& stream, const wxXmlDocument& doc)
{
WriteHeader(stream, "XMLBINZ");
wxZlibOutputStream costr(stream, 9);
return wxXmlIOHandlerBin::Save(costr, doc);
}
bool wxXmlIOHandlerBinZ::Load(wxInputStream& stream, wxXmlDocument& doc)
{
ReadHeader(stream);
wxZlibInputStream costr(stream);
return wxXmlIOHandlerBin::Load(stream, doc);
}
#endif

283
contrib/src/xml/xmlpars.cpp Normal file
View File

@ -0,0 +1,283 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xmlpars.cpp
// Purpose: wxXmlDocument - XML parser
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
// nothing - already in xml.cpp
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/wfstream.h"
#include "wx/intl.h"
#include "wx/log.h"
#include "wx/dynlib.h"
#include "wx/xml/xmlio.h"
#include <libxml/parser.h>
// dynamically loaded functions from libxml:
typedef xmlParserCtxtPtr (*type_xmlCreatePushParserCtxt)
(xmlSAXHandlerPtr sax, void *, const char *, int, const char *);
typedef xmlNodePtr (*type_xmlNewText)(const xmlChar *);
typedef xmlAttrPtr (*type_xmlSetProp)(xmlNodePtr, const xmlChar *, const xmlChar *);
typedef int (*type_xmlParseChunk)(xmlParserCtxtPtr, const char *, int, int);
typedef void (*type_xmlFreeParserCtxt)(xmlParserCtxtPtr);
typedef xmlDocPtr (*type_xmlNewDoc)(const xmlChar *);
typedef void (*type_xmlFreeDoc)(xmlDocPtr);
typedef xmlNodePtr (*type_xmlNewDocNode)(xmlDocPtr, xmlNsPtr, const xmlChar *, const xmlChar *);
typedef void (*type_xmlDocDumpMemory)(xmlDocPtr, xmlChar**, int *);
typedef xmlNodePtr (*type_xmlAddChild)(xmlNodePtr, xmlNodePtr);
typedef xmlNodePtr (*type_xmlNewChild)(xmlNodePtr, xmlNsPtr, const xmlChar *, const xmlChar *);
typedef xmlChar * (*type_xmlNodeListGetString)(xmlDocPtr, xmlNodePtr, int);
typedef xmlNodePtr (*type_xmlDocGetRootElement)(xmlDocPtr);
typedef xmlNodePtr (*type_xmlDocSetRootElement)(xmlDocPtr doc, xmlNodePtr root);
static struct
{
wxDllType Handle;
type_xmlCreatePushParserCtxt xmlCreatePushParserCtxt;
type_xmlNewText xmlNewText;
type_xmlSetProp xmlSetProp;
type_xmlParseChunk xmlParseChunk;
type_xmlFreeParserCtxt xmlFreeParserCtxt;
type_xmlNewDoc xmlNewDoc;
type_xmlFreeDoc xmlFreeDoc;
type_xmlNewDocNode xmlNewDocNode;
type_xmlDocDumpMemory xmlDocDumpMemory;
type_xmlAddChild xmlAddChild;
type_xmlNewChild xmlNewChild;
type_xmlNodeListGetString xmlNodeListGetString;
type_xmlDocGetRootElement xmlDocGetRootElement;
type_xmlDocSetRootElement xmlDocSetRootElement;
} gs_libxmlDLL;
static bool gs_libxmlLoaded = FALSE;
static bool gs_libxmlLoadFailed = FALSE;
static void ReleaseLibxml()
{
if (gs_libxmlLoaded)
{
wxLogDebug("Releasing libxml.so.2");
wxDllLoader::UnloadLibrary(gs_libxmlDLL.Handle);
}
gs_libxmlLoaded = FALSE;
gs_libxmlLoadFailed = FALSE;
}
static bool LoadLibxml()
{
if (gs_libxmlLoaded) return TRUE;
if (gs_libxmlLoadFailed) return FALSE;
gs_libxmlLoadFailed = TRUE;
wxLogDebug("Loading libxml.so.2...");
#ifdef __UNIX__
gs_libxmlDLL.Handle =
wxDllLoader::LoadLibrary(_T("libxml.so.2"), &gs_libxmlLoaded);
#endif
if (!gs_libxmlLoaded) return FALSE;
#define LOAD_SYMBOL(sym) \
gs_libxmlDLL.sym = \
(type_##sym)wxDllLoader::GetSymbol(gs_libxmlDLL.Handle, _T(#sym)); \
if (!gs_libxmlDLL.sym) { ReleaseLibxml(); return FALSE; }
LOAD_SYMBOL(xmlCreatePushParserCtxt)
LOAD_SYMBOL(xmlNewText)
LOAD_SYMBOL(xmlSetProp)
LOAD_SYMBOL(xmlParseChunk)
LOAD_SYMBOL(xmlFreeParserCtxt)
LOAD_SYMBOL(xmlNewDoc)
LOAD_SYMBOL(xmlFreeDoc)
LOAD_SYMBOL(xmlNewDocNode)
LOAD_SYMBOL(xmlDocDumpMemory)
LOAD_SYMBOL(xmlAddChild)
LOAD_SYMBOL(xmlNewChild)
LOAD_SYMBOL(xmlNodeListGetString)
LOAD_SYMBOL(xmlDocGetRootElement)
LOAD_SYMBOL(xmlDocSetRootElement)
#undef LOAD_SYMBOL
gs_libxmlLoadFailed = FALSE;
wxLogDebug("...succeed");
return TRUE;
}
bool wxXmlIOHandlerLibxml::CanLoad(wxInputStream& stream)
{
if (!LoadLibxml()) return FALSE;
char cheader[7];
cheader[6] = 0;
stream.Read(cheader, 6);
stream.SeekI(-6, wxFromCurrent);
return strcmp(cheader, "<?xml ") == 0;
}
bool wxXmlIOHandlerLibxml::CanSave()
{
return LoadLibxml();
}
static wxXmlProperty *CreateWXProperty(xmlDocPtr doc, xmlAttrPtr attr)
{
if (attr == NULL) return NULL;
unsigned char *val =
gs_libxmlDLL.xmlNodeListGetString(doc, attr->children, 1);
wxXmlProperty *prop =
new wxXmlProperty(attr->name, val, CreateWXProperty(doc, attr->next));
free(val);
return prop;
}
static wxXmlNode *CreateWXNode(xmlDocPtr doc, wxXmlNode *parent, xmlNodePtr node)
{
if (node == NULL) return NULL;
wxXmlNode *nd = new wxXmlNode(parent, (wxXmlNodeType)node->type,
node->name, node->content,
CreateWXProperty(doc, node->properties),
CreateWXNode(doc, parent, node->next));
CreateWXNode(doc, nd, node->children);
return nd;
}
bool wxXmlIOHandlerLibxml::Load(wxInputStream& stream, wxXmlDocument& doc)
{
if (!LoadLibxml()) return FALSE;
xmlDocPtr dc;
xmlParserCtxtPtr ctxt;
char buffer[1024];
int res;
res = stream.Read(buffer, 4).LastRead();
if (res > 0)
{
bool okay = TRUE;
ctxt = gs_libxmlDLL.xmlCreatePushParserCtxt(NULL, NULL,
buffer, res, ""/*docname*/);
while ((res = stream.Read(buffer, 1024).LastRead()) > 0)
if (gs_libxmlDLL.xmlParseChunk(ctxt, buffer, res, 0) != 0)
okay = FALSE;
if (gs_libxmlDLL.xmlParseChunk(ctxt, buffer, 0, 1) != 0) okay = FALSE;
dc = ctxt->myDoc;
gs_libxmlDLL.xmlFreeParserCtxt(ctxt);
doc.SetVersion(dc->version);
doc.SetEncoding(dc->encoding);
doc.SetRoot(CreateWXNode(dc, NULL, gs_libxmlDLL.xmlDocGetRootElement(dc)));
gs_libxmlDLL.xmlFreeDoc(dc);
return okay;
}
else return FALSE;
}
static void CreateLibxmlNode(xmlNodePtr node, wxXmlNode *wxnode)
{
node->type = (xmlElementType)wxnode->GetType();
wxXmlProperty *prop = wxnode->GetProperties();
while (prop)
{
gs_libxmlDLL.xmlSetProp(node, (xmlChar*)prop->GetName().mb_str(),
(xmlChar*)prop->GetValue().mb_str());
prop = prop->GetNext();
}
wxXmlNode *child = wxnode->GetChildren();
xmlNodePtr n;
xmlChar *content, *name;
while (child)
{
name = (xmlChar*)child->GetName().mb_str();
if (!child->GetContent()) content = NULL;
else content = (xmlChar*)child->GetContent().mb_str();
if (child->GetType() == wxXML_TEXT_NODE)
gs_libxmlDLL.xmlAddChild(node, n = gs_libxmlDLL.xmlNewText(content));
else
n = gs_libxmlDLL.xmlNewChild(node, NULL, name, content);
CreateLibxmlNode(n, child);
child = child->GetNext();
}
}
bool wxXmlIOHandlerLibxml::Save(wxOutputStream& stream, const wxXmlDocument& doc)
{
if (!LoadLibxml()) return FALSE;
xmlDocPtr dc;
wxASSERT_MSG(doc.GetRoot() != NULL, _("Trying to save empty document!"));
dc = gs_libxmlDLL.xmlNewDoc((xmlChar*)doc.GetVersion().mb_str());
gs_libxmlDLL.xmlDocSetRootElement(dc,
gs_libxmlDLL.xmlNewDocNode(dc, NULL,
(xmlChar*)doc.GetRoot()->GetName().mb_str(), NULL));
CreateLibxmlNode(gs_libxmlDLL.xmlDocGetRootElement(dc), doc.GetRoot());
xmlChar *buffer;
int size;
gs_libxmlDLL.xmlDocDumpMemory(dc, &buffer, &size);
gs_libxmlDLL.xmlFreeDoc(dc);
stream.Write(buffer, size);
free(buffer);
return stream.LastWrite() == (unsigned)size;
}
#include "wx/module.h"
class wxXmlLibxmlModule: public wxModule
{
DECLARE_DYNAMIC_CLASS(wxXmlLibxmlModule)
public:
wxXmlLibxmlModule() {}
bool OnInit() { return TRUE; }
void OnExit() { ReleaseLibxml(); }
};
IMPLEMENT_DYNAMIC_CLASS(wxXmlLibxmlModule, wxModule)

688
contrib/src/xml/xmlres.cpp Normal file
View File

@ -0,0 +1,688 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xmlres.cpp
// Purpose: XML resources
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "xmlres.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/dialog.h"
#include "wx/panel.h"
#include "wx/wfstream.h"
#include "wx/filesys.h"
#include "wx/log.h"
#include "wx/intl.h"
#include "wx/tokenzr.h"
#include "wx/module.h"
#include "wx/xml/xml.h"
#include "wx/xml/xmlres.h"
#include "wx/arrimpl.cpp"
WX_DEFINE_OBJARRAY(wxXmlResourceDataRecords);
wxXmlResource::wxXmlResource()
{
m_Handlers.DeleteContents(TRUE);
}
wxXmlResource::wxXmlResource(const wxString& filemask, int type)
{
m_Handlers.DeleteContents(TRUE);
Load(filemask, type);
}
wxXmlResource::~wxXmlResource()
{
ClearHandlers();
}
bool wxXmlResource::Load(const wxString& filemask, int type)
{
wxString fnd;
wxXmlResourceDataRecord *drec;
#if wxUSE_FILESYSTEM
wxFileSystem fsys;
# define wxXmlFindFirst fsys.FindFirst(filemask, wxFILE)
# define wxXmlFindNext fsys.FindNext()
#else
# define wxXmlFindFirst wxFindFirstFile(filemask, wxFILE)
# define wxXmlFindNext wxFindNextFile()
wxASSERT_MSG(type != wxXML_ARCHIVE, wxT("ZIP archive XML resources supported only with wxUSE_FILESYSTEM set to 1!"));
#endif
fnd = wxXmlFindFirst;
while (!!fnd)
{
#if wxUSE_FILESYSTEM
if (type == wxXML_ARCHIVE)
{
wxFileSystem fs2;
wxString fnd2;
fnd2 = fs2.FindFirst(fnd + wxT("#zip:*.xmb"), wxFILE);
while (!!fnd2)
{
drec = new wxXmlResourceDataRecord;
drec->File = fnd2;
m_Data.Add(drec);
fnd2 = fs2.FindNext();
}
}
else
#endif
{
drec = new wxXmlResourceDataRecord;
drec->File = fnd;
m_Data.Add(drec);
}
fnd = wxXmlFindNext;
}
# undef wxXmlFindFirst
# undef wxXmlFindNext
return TRUE;
}
void wxXmlResource::AddHandler(wxXmlResourceHandler *handler)
{
m_Handlers.Append(handler);
handler->SetParentResource(this);
}
void wxXmlResource::ClearHandlers()
{
m_Handlers.Clear();
}
wxMenu *wxXmlResource::LoadMenu(const wxString& name)
{
return (wxMenu*)CreateResFromNode(FindResource(name, wxT("menu")), NULL, NULL);
}
wxMenuBar *wxXmlResource::LoadMenuBar(const wxString& name)
{
return (wxMenuBar*)CreateResFromNode(FindResource(name, wxT("menubar")), NULL, NULL);
}
wxDialog *wxXmlResource::LoadDialog(wxWindow *parent, const wxString& name)
{
wxDialog *dialog = new wxDialog;
if (!LoadDialog(dialog, parent, name))
{ delete dialog; return NULL; }
else return dialog;
}
bool wxXmlResource::LoadDialog(wxDialog *dlg, wxWindow *parent, const wxString& name)
{
return CreateResFromNode(FindResource(name, wxT("dialog")), parent, dlg) != NULL;
}
wxPanel *wxXmlResource::LoadPanel(wxWindow *parent, const wxString& name)
{
wxPanel *panel = new wxPanel;
if (!LoadPanel(panel, parent, name))
{ delete panel; return NULL; }
else return panel;
}
bool wxXmlResource::LoadPanel(wxPanel *panel, wxWindow *parent, const wxString& name)
{
return CreateResFromNode(FindResource(name, wxT("panel")), parent, panel) != NULL;
}
void wxXmlResource::UpdateResources()
{
bool modif;
# if wxUSE_FILESYSTEM
wxFSFile *file;
wxFileSystem fsys;
# endif
for (size_t i = 0; i < m_Data.GetCount(); i++)
{
modif = (m_Data[i].Doc == NULL);
if (!modif)
{
# if wxUSE_FILESYSTEM
file = fsys.OpenFile(m_Data[i].File);
modif = file && file->GetModificationTime() > m_Data[i].Time;
if (!file)
wxLogError(_("Cannot open file '%s'."), m_Data[i].File.c_str());
delete file;
# else
modif = wxDateTime(wxFileModificationTime(m_Data[i].File)) > m_Data[i].Time;
# endif
}
if (modif)
{
wxInputStream *stream;
# if wxUSE_FILESYSTEM
file = fsys.OpenFile(m_Data[i].File);
stream = file->GetStream();
# else
stream = new wxFileInputStream(m_Data[i].File);
# endif
if (stream)
{
delete m_Data[i].Doc;
m_Data[i].Doc = new wxXmlDocument;
}
if (!stream || !m_Data[i].Doc->Load(*stream))
wxLogError(_("Cannot load resources from file '%s'."), m_Data[i].File.c_str());
if (m_Data[i].Doc->GetRoot()->GetName() != _T("resource"))
wxLogError(_("Invalid XML resource '%s': doesn't have root node 'resource'."), m_Data[i].File.c_str());
# if wxUSE_FILESYSTEM
delete file;
# else
delete stream;
# endif
}
}
}
wxXmlNode *wxXmlResource::FindResource(const wxString& name, const wxString& type)
{
UpdateResources(); //ensure everything is up-to-date
wxString dummy;
for (size_t f = 0; f < m_Data.GetCount(); f++)
{
for (wxXmlNode *node = m_Data[f].Doc->GetRoot()->GetChildren();
node; node = node->GetNext())
if ( node->GetType() == wxXML_ELEMENT_NODE &&
(!type || node->GetName() == type) &&
node->GetPropVal(wxT("name"), &dummy) &&
dummy == name &&
wxXmlResourceHandler::CheckPlatform(node))
return node;
}
wxLogError(_("XML resource '%s' (type '%s') not found!"),
name.c_str(), type.c_str());
return NULL;
}
wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent, wxObject *instance)
{
if (node == NULL) return NULL;
wxXmlResourceHandler *handler;
wxObject *ret;
wxNode * ND = m_Handlers.GetFirst();
while (ND)
{
handler = (wxXmlResourceHandler*)ND->GetData();
if (handler->CanHandle(node))
{
ret = handler->CreateResource(node, parent, instance);
if (ret) return ret;
}
ND = ND->GetNext();
}
wxLogError(_("No handler found for XML node '%s'!"), node->GetName().c_str());
return NULL;
}
wxXmlResourceHandler::wxXmlResourceHandler()
: m_Node(NULL), m_Parent(NULL), m_Instance(NULL),
m_ParentAsWindow(NULL), m_InstanceAsWindow(NULL)
{}
wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent, wxObject *instance)
{
if (!CheckPlatform(node)) return NULL;
wxXmlNode *myNode = m_Node;
wxObject *myParent = m_Parent, *myInstance = m_Instance;
wxWindow *myParentAW = m_ParentAsWindow, *myInstanceAW = m_InstanceAsWindow;
m_Node = node;
m_Parent = parent;
m_Instance = instance;
m_ParentAsWindow = wxDynamicCast(m_Parent, wxWindow);
m_InstanceAsWindow = wxDynamicCast(m_Instance, wxWindow);
wxObject *returned = DoCreateResource();
m_Node = myNode;
m_Parent = myParent; m_ParentAsWindow = myParentAW;
m_Instance = myInstance; m_InstanceAsWindow = myInstanceAW;
return returned;
}
/*static*/ bool wxXmlResourceHandler::CheckPlatform(wxXmlNode *node)
{
wxString s;
if (!node->GetPropVal(_T("platform"), &s)) return TRUE;
#ifdef __WXMSW__
return s == wxString(_T("win"));
#elif defined(__UNIX__)
return s == wxString(_T("unix"));
#elif defined(__MAC__)
return s == wxString(_T("mac"));
#elif defined(__OS2__)
return s == wxString(_T("os2"));
#else
wxLogWarning(_("You're running the application on unknown platform, check for platfrom '%s' failed."), s.mb_str());
return TRUE; // unknown platform
#endif
}
void wxXmlResourceHandler::AddStyle(const wxString& name, int value)
{
m_StyleNames.Add(name);
m_StyleValues.Add(value);
}
bool wxXmlResourceHandler::HasParam(const wxString& param)
{
return (GetParamNode(param) != NULL);
}
int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults)
{
wxString s = GetParamValue(param);
if (!s) return defaults;
wxStringTokenizer tkn(s, _T("| "), wxTOKEN_STRTOK);
int style = 0;
int index;
wxString fl;
while (tkn.HasMoreTokens())
{
fl = tkn.GetNextToken();
index = m_StyleNames.Index(fl);
if (index != wxNOT_FOUND)
style |= m_StyleValues[index];
else
wxLogError(_("Unknown style flag ") + fl);
}
return style;
}
wxString wxXmlResourceHandler::GetText(const wxString& param)
{
wxString str1 = GetParamValue(param);
wxString str2;
const wxChar *dt;
for (dt = str1.c_str(); *dt; dt++)
{
// Remap $ to &, map $$ to $ (for things like "&File..." --
// this is illegal in XML, so we use "$File..."):
if (*dt == '$')
switch (*(++dt))
{
case '$' : str2 << '$'; break;
default : str2 << '&' << *dt; break;
}
// Remap \n to CR, \r LF, \t to TAB:
else if (*dt == '\\')
switch (*(++dt))
{
case 'n' : str2 << '\n'; break;
case 't' : str2 << '\t'; break;
case 'r' : str2 << '\r'; break;
default : str2 << '\\' << *dt; break;
}
else str2 << *dt;
}
return str2;
}
long wxXmlResourceHandler::GetLong(const wxString& param, long defaultv)
{
long value;
wxString str1 = GetParamValue(param);
if (!str1.ToLong(&value))
value = defaultv;
return value;
}
int wxXmlResourceHandler::GetID()
{
wxString sid = GetName();
long num;
if (sid == _T("-1")) return -1;
else if (sid.IsNumber() && sid.ToLong(&num)) return num;
#define stdID(id) else if (sid == _T(#id)) return id
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_HELP); 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_OK); stdID(wxID_CANCEL);
stdID(wxID_APPLY); stdID(wxID_YES); stdID(wxID_NO);
stdID(wxID_STATIC); stdID(wxID_FORWARD); stdID(wxID_BACKWARD);
stdID(wxID_DEFAULT); stdID(wxID_MORE); stdID(wxID_SETUP);
stdID(wxID_RESET); stdID(wxID_HELP_CONTEXT);
#undef stdID
else return XMLID(sid.c_str());
}
wxString wxXmlResourceHandler::GetName()
{
return m_Node->GetPropVal(_T("name"), _T("-1"));
}
bool wxXmlResourceHandler::GetBool(const wxString& param, bool defaultv)
{
wxString v = GetParamValue(param);
v.MakeLower();
if (!v) return defaultv;
else return v == _T("1") || v == _T("t") || v == _T("yes") ||
v == _T("on") || v == _T("true");
}
wxColour wxXmlResourceHandler::GetColour(const wxString& param)
{
wxString v = GetParamValue(param);
unsigned long tmp = 0;
if (v.Length() != 7 || v[0] != _T('#') ||
wxSscanf(v.c_str(), _T("#%lX"), &tmp) != 1)
{
wxLogError(_("XML resource: Incorrect colour specification '%s' for property '%s'."),
v.c_str(), param.c_str());
return wxNullColour;
}
return wxColour((tmp & 0xFF0000) >> 16 ,
(tmp & 0x00FF00) >> 8,
(tmp & 0x0000FF));
}
wxXmlNode *wxXmlResourceHandler::GetParamNode(const wxString& param)
{
wxXmlNode *n = m_Node->GetChildren();
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE && n->GetName() == param)
return n;
n = n->GetNext();
}
return NULL;
}
wxString wxXmlResourceHandler::GetNodeContent(wxXmlNode *node)
{
wxXmlNode *n = node;
if (n == NULL) return wxEmptyString;
n = n->GetChildren();
while (n)
{
if (n->GetType() == wxXML_TEXT_NODE ||
n->GetType() == wxXML_CDATA_SECTION_NODE)
return n->GetContent();
n = n->GetNext();
}
return wxEmptyString;
}
wxString wxXmlResourceHandler::GetParamValue(const wxString& param)
{
return GetNodeContent(GetParamNode(param));
}
wxSize wxXmlResourceHandler::GetSize(const wxString& param)
{
wxString s = GetParamValue(param);
if (!s) s = _T("-1,-1");
bool is_dlg;
long sx, sy;
is_dlg = s[s.Length()-1] == _T('d');
if (is_dlg) s.RemoveLast();
if (!s.BeforeFirst(_T(',')).ToLong(&sx) ||
!s.AfterLast(_T(',')).ToLong(&sy))
{
wxLogError(_("Cannot parse coordinates from '%s'."), s.mb_str());
return wxDefaultSize;
}
if (is_dlg)
{
if (m_InstanceAsWindow)
return wxDLG_UNIT(m_InstanceAsWindow, wxSize(sx, sy));
else if (m_ParentAsWindow)
return wxDLG_UNIT(m_ParentAsWindow, wxSize(sx, sy));
else
{
wxLogError(_("Cannot convert dialog units: dialog unknown."));
return wxDefaultSize;
}
}
else return wxSize(sx, sy);
}
wxPoint wxXmlResourceHandler::GetPosition(const wxString& param)
{
wxSize sz = GetSize(param);
return wxPoint(sz.x, sz.y);
}
void wxXmlResourceHandler::SetupWindow(wxWindow *wnd)
{
//FIXME : add font, cursor
if (HasParam(_T("exstyle")))
wnd->SetExtraStyle(GetStyle(_T("exstyle")));
if (HasParam(_T("bg")))
wnd->SetBackgroundColour(GetColour(_T("bg")));
if (HasParam(_T("fg")))
wnd->SetForegroundColour(GetColour(_T("fg")));
if (GetBool(_T("enabled"), 1) == 0)
wnd->Enable(FALSE);
if (GetBool(_T("focused"), 0) == 1)
wnd->SetFocus();
if (GetBool(_T("hidden"), 0) == 1)
wnd->Show(FALSE);
#if wxUSE_TOOLTIPS
if (HasParam(_T("tooltip")))
wnd->SetToolTip(GetText(_T("tooltip")));
#endif
}
void wxXmlResourceHandler::CreateChildren(wxObject *parent,
bool only_this_handler, wxXmlNode *children_node)
{
if (children_node == NULL) children_node = GetParamNode(_T("children"));
if (children_node == NULL) return;
wxXmlNode *n = children_node->GetChildren();
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE)
{
if (only_this_handler)
{
if (CanHandle(n))
CreateResource(n, parent, NULL);
}
else
m_Resource->CreateResFromNode(n, parent, NULL);
}
n = n->GetNext();
}
}
// --------------- XMLID implementation -----------------------------
#define XMLID_TABLE_SIZE 1024
struct XMLID_record
{
int id;
const char *key;
XMLID_record *next;
};
static XMLID_record *XMLID_Records[XMLID_TABLE_SIZE] = {NULL};
static int XMLID_LastID = wxID_HIGHEST;
/*static*/ int wxXmlResource::GetXMLID(const char *str_id)
{
int index = 0;
for (const char *c = str_id; *c != '\0'; c++) index += (int)*c;
index %= XMLID_TABLE_SIZE;
XMLID_record *oldrec = NULL;
for (XMLID_record *rec = XMLID_Records[index]; rec; rec = rec->next)
{
if (strcmp(rec->key, str_id) == 0) return rec->id;
oldrec = rec;
}
XMLID_record **rec_var = (oldrec == NULL) ?
&XMLID_Records[index] : &oldrec->next;
*rec_var = new XMLID_record;
(*rec_var)->id = ++XMLID_LastID;
(*rec_var)->key = str_id;
(*rec_var)->next = NULL;
return (*rec_var)->id;
}
static void CleanXMLID_Record(XMLID_record *rec)
{
if (rec)
{
CleanXMLID_Record(rec->next);
delete rec;
}
}
static void CleanXMLID_Records()
{
for (int i = 0; i < XMLID_TABLE_SIZE; i++)
CleanXMLID_Record(XMLID_Records[i]);
}
// --------------- module and globals -----------------------------
static wxXmlResource gs_XmlResource;
wxXmlResource *wxTheXmlResource = &gs_XmlResource;
class wxXmlResourceModule: public wxModule
{
DECLARE_DYNAMIC_CLASS(wxXmlResourceModule)
public:
wxXmlResourceModule() {}
bool OnInit() {return TRUE;}
void OnExit()
{
wxTheXmlResource->ClearHandlers();
CleanXMLID_Records();
}
};
IMPLEMENT_DYNAMIC_CLASS(wxXmlResourceModule, wxModule)

View File

@ -0,0 +1,66 @@
/////////////////////////////////////////////////////////////////////////////
// Name: xmlrsall.cpp
// Purpose: wxXmlResource::InitAllHandlers
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// -- Already done in xmlres.cpp
//#ifdef __GNUG__
//#pragma implementation "xmlres.h"
//#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/xml/xmlres.h"
#include "wx/xml/xh_all.h"
void wxXmlResource::InitAllHandlers()
{
AddHandler(new wxMenuXmlHandler);
AddHandler(new wxMenuBarXmlHandler);
AddHandler(new wxDialogXmlHandler);
AddHandler(new wxPanelXmlHandler);
AddHandler(new wxButtonXmlHandler);
#if wxUSE_GAUGE
AddHandler(new wxGaugeXmlHandler);
#endif
#if wxUSE_CHECKBOX
AddHandler(new wxCheckBoxXmlHandler);
#endif
#if wxUSE_HTML
AddHandler(new wxHtmlWindowXmlHandler);
#endif
#if wxUSE_SPINBTN
AddHandler(new wxSpinButtonXmlHandler);
#endif
#if wxUSE_SPINCTRL
AddHandler(new wxSpinCtrlXmlHandler);
#endif
AddHandler(new wxStaticTextXmlHandler);
AddHandler(new wxStaticBitmapXmlHandler);
AddHandler(new wxSliderXmlHandler);
#if wxUSE_RADIOBOX
AddHandler(new wxRadioBoxXmlHandler);
AddHandler(new wxRadioButtonXmlHandler);
#endif
#if wxUSE_COMBOBOX
AddHandler(new wxComboBoxXmlHandler);
#endif
AddHandler(new wxChoiceXmlHandler);
AddHandler(new wxCheckListXmlHandler);
AddHandler(new wxSizerXmlHandler);
#if wxUSE_NOTEBOOK
AddHandler(new wxNotebookXmlHandler);
#endif
AddHandler(new wxTextCtrlXmlHandler);
}

10
contrib/utils/Makefile.in Normal file
View File

@ -0,0 +1,10 @@
# $Id$
CONTRIB_UTILS=wxrc wxrcedit
all:
@for d in $(CONTRIB_UTILS); do (cd $$d && $(MAKE)); done
clean:
@for d in $(CONTRIB_UTILS); do (cd $$d && $(MAKE) clean); done

View File

@ -0,0 +1,16 @@
# $Id$
top_srcdir = @top_srcdir@/..
top_builddir = ../../..
program_dir = contrib/utils/wxrc
PROGRAM=wxrc
OBJECTS=wxrc.o
APPEXTRALIBS=$(top_builddir)/lib/libwxxml.@WX_TARGET_LIBRARY_TYPE@
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
include $(top_builddir)/src/makeprog.env

292
contrib/utils/wxrc/wxrc.cpp Normal file
View File

@ -0,0 +1,292 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wxrc.cpp
// Purpose: XML resource compiler
// Author: Vaclav Slavik
// Created: 2000/03/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation
#pragma interface
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
// for all others, include the necessary headers (this file is usually all you
// need because it includes almost all "standard" wxWindows headers
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/cmdline.h"
#include "wx/xml/xml.h"
#include "wx/ffile.h"
#if wxUSE_GUI
#error "You must compile the resource compiler with wxBase!"
#endif
class XmlResApp : public wxApp
{
public:
virtual int OnRun();
private:
void ParseParams(const wxCmdLineParser& cmdline);
void CompileRes();
wxArrayString PrepareTempFiles();
void DeleteTempFiles(const wxArrayString& flist);
void MakePackageZIP(const wxArrayString& flist);
void MakePackageCPP(const wxArrayString& flist);
bool flagVerbose, flagCPP, flagCompress;
wxString parOutput, parFuncname, parOutputPath;
wxArrayString parFiles;
int retCode;
};
IMPLEMENT_APP(XmlResApp)
int XmlResApp::OnRun()
{
static const wxCmdLineEntryDesc cmdLineDesc[] =
{
{ wxCMD_LINE_SWITCH, "v", "verbose", "be verbose" },
{ wxCMD_LINE_SWITCH, "c", "cpp-code", "output C++ source rather than .rsc file" },
{ wxCMD_LINE_SWITCH, "u", "uncompressed", "do not compress .xml files (C++ only)" },
{ wxCMD_LINE_OPTION, "n", "function", "C++ function name (with -c) [InitXmlResource]" },
{ wxCMD_LINE_OPTION, "o", "output", "output file [resource.rsc/cpp]" },
{ wxCMD_LINE_OPTION, "h", "handlers", "output list of neccessary handlers to this file" },
{ wxCMD_LINE_PARAM, NULL, NULL, "input file",
wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE },
{ wxCMD_LINE_NONE }
};
wxCmdLineParser parser(cmdLineDesc, argc, argv);
switch (parser.Parse())
{
case -1:
return 0;
break;
case 0:
retCode = 0;
ParseParams(parser);
CompileRes();
return retCode;
break;
default:
return 1;
break;
}
}
void XmlResApp::ParseParams(const wxCmdLineParser& cmdline)
{
flagVerbose = cmdline.Found("v");
flagCPP = cmdline.Found("c");
flagCompress = flagCPP && !cmdline.Found("u");
if (!cmdline.Found("o", &parOutput))
parOutput = flagCPP ? "resource.cpp" : "resource.rsc";
parOutputPath = wxPathOnly(parOutput);
if (!parOutputPath) parOutputPath = ".";
if (!cmdline.Found("n", &parFuncname))
parFuncname = "InitXmlResource";
for (size_t i = 0; i < cmdline.GetParamCount(); i++)
parFiles.Add(cmdline.GetParam(i));
}
void XmlResApp::CompileRes()
{
wxArrayString files = PrepareTempFiles();
wxRemoveFile(parOutput);
printf("TODO: include bitmaps, list of handlers\n");
if (!retCode)
{
if (flagCPP)
MakePackageCPP(files);
else
MakePackageZIP(files);
}
DeleteTempFiles(files);
}
wxArrayString XmlResApp::PrepareTempFiles()
{
wxArrayString flist;
for (size_t i = 0; i < parFiles.Count(); i++)
{
if (flagVerbose)
wxPrintf("processing " + parFiles[i] + "...\n");
wxXmlDocument doc;
if (!doc.Load(parFiles[i]))
{
wxLogError("Error parsing file " + parFiles[i]);
retCode = 1;
continue;
}
wxString name, ext;
wxSplitPath(parFiles[i], NULL, &name, &ext);
doc.Save(parOutputPath + "/" + name + ".xmb", flagCompress ? wxXML_IO_BINZ : wxXML_IO_BIN);
flist.Add(name + ".xmb");
}
return flist;
}
void XmlResApp::DeleteTempFiles(const wxArrayString& flist)
{
for (size_t i = 0; i < flist.Count(); i++)
wxRemoveFile(parOutputPath + "/" + flist[i]);
}
void XmlResApp::MakePackageZIP(const wxArrayString& flist)
{
wxString files;
for (size_t i = 0; i < flist.Count(); i++)
files += flist[i] + " ";
files.RemoveLast();
if (flagVerbose)
wxPrintf("compressing " + parOutput + "...\n");
if (wxExecute("zip -9 -j " + wxString(flagVerbose ? "" : "-q ") +
parOutput + " " + files, TRUE) == -1)
{
wxLogError("Unable to execute zip program. Make sure it is in the path.");
wxLogError("You can download it at http://www.cdrom.com/pub/infozip/");
retCode = 1;
return;
}
}
static wxString FileToCppArray(wxString filename, int num)
{
wxString output;
wxString snum;
wxString tmp;
wxFFile file(filename, "rb");
size_t lng = file.Length();
snum.Printf("%i", num);
output.Printf("static size_t xml_res_size_" + snum + " = %i;\n", lng);
output += "static unsigned char xml_res_file_" + snum + "[] = {";
unsigned char *buffer = new unsigned char[lng];
file.Read(buffer, lng);
for (size_t i = 0; i < lng; i++)
{
if (i % 16 == 0) output += "\n";
tmp.Printf("0x%02X", buffer[i]);
output += tmp;
if (i != lng-1) output += ",";
}
delete[] buffer;
output += "\n};\n\n";
return output;
}
void XmlResApp::MakePackageCPP(const wxArrayString& flist)
{
wxFFile file(parOutput, "wt");
size_t i;
if (flagVerbose)
wxPrintf("creating C++ source file " + parOutput + "...\n");
file.Write("\
#include \"wx/wxprec.h\"\n\
\n\
#ifdef __BORLANDC__\n\
#pragma hdrstop\n\
#endif\n\
\n\
#ifndef WX_PRECOMP\n\
#include \"wx/wx.h\"\n\
#endif\n\
\
#include \"wx/filesys.h\"\n\
#include \"wx/fs_mem.h\"\n\
#include \"wx/xml/xmlres.h\"\n\
#include \"wx/xml/xh_all.h\"\n\
\n");
for (i = 0; i < flist.Count(); i++)
file.Write(FileToCppArray(flist[i], i));
file.Write("\
void " + parFuncname + "()\n\
{\n\
\n\
// Check for memory FS. If not present, load the handler:\n\
{\n\
wxMemoryFSHandler::AddFile(\"xml_resource/dummy_file\", \"dummy one\");\n\
wxFileSystem fsys;\n\
wxFSFile *f = fsys.OpenFile(\"xml_resource/dummy_file\");\n\
wxMemoryFSHandler::RemoveFile(\"xml_resource/dummy_file\");\n\
if (f) delete f;\n\
else wxFileSystem::AddHandler(new wxMemoryFSHandler);\n\
}\n\
\n");
for (i = 0; i < flist.Count(); i++)
{
wxString s;
s.Printf(" wxMemoryFSHandler::AddFile(\"xml_resource/" + flist[i] +
"\", xml_res_file_%i, xml_res_size_%i);\n"
" wxTheXmlResource->Read(\"xml_resource/" + flist[i] +
"\", wxXML_BINARY);\n", i, i);
file.Write(s);
}
file.Write("\n}\n");
}

View File

@ -0,0 +1,23 @@
# $Id$
top_srcdir = @top_srcdir@/..
top_builddir = ../../..
program_dir = contrib/utils/wxrcedit
PROGRAM=wxrcedit
OBJECTS=edapp.o editor.o nodehnd.o prophnd.o xmlhelpr.o
DATADIRS = df
DATAFILES = df/boxsizer.df df/break.df df/button.df df/checkbox.df \
df/control.df df/dialog.df df/gauge.df df/htmlwindow.df \
df/menu.df df/menu_item.df df/menubar.df df/menuitem.df \
df/panel.df df/panel_item.df df/panelbase.df df/radiobutton.df \
df/separator.df df/sizer_item.df df/sizeritem.df df/slider.df \
df/spacer.df df/staticbitmap.df df/staticboxsizer.df \
df/statictext.df df/textctrl.df df/toolbar_item.df df/window.df
APPEXTRALIBS=$(top_builddir)/lib/libwxxml.@WX_TARGET_LIBRARY_TYPE@
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
include $(top_builddir)/src/makeprog.env

View File

@ -0,0 +1,33 @@
/* XPM */
static char *close_xpm[] = {
/* width height num_colors chars_per_pixel */
" 24 24 2 1",
/* colors */
". c #000000",
"# c none",
/* pixels */
"########################",
"########################",
"########################",
"########################",
"########################",
"########################",
"#######.####..##########",
"#######..##....#########",
"########..#...##########",
"########.....###########",
"#########...############",
"#########....###########",
"########......##########",
"########..#....#########",
"#######..###....########",
"#######.#####..#########",
"########################",
"########################",
"########################",
"########################",
"########################",
"########################",
"########################",
"########################"
};

View File

@ -0,0 +1,21 @@
/* XPM */
static char * control_xpm[] = {
"16 14 4 1",
" c None",
". c #008000",
"+ c #FFFFFF",
"@ c #7F7F7F",
" ",
" ",
" ",
" ",
" ... ",
" .++.. ",
" .++..@ ",
" .....@ ",
" ...@@ ",
" @@@ ",
" ",
" ",
" ",
" "};

View File

@ -0,0 +1,22 @@
/* XPM */
static char * hsizer_xpm[] = {
"16 16 3 1",
" c None",
". c #000000",
"+ c #FF0000",
" ",
" ",
" ",
" . . ",
" .. .. ",
" ..+......+.. ",
" ..++++++++++.. ",
"..++++++++++++..",
" ..++++++++++.. ",
" ..+......+.. ",
" .. .. ",
" . . ",
" ",
" ",
" ",
" "};

View File

@ -0,0 +1,229 @@
/* XPM */
static char * open_xpm[] = {
"24 24 202 2",
" c None",
". c #020202",
"+ c #5A5226",
"@ c #9A8A46",
"# c #C6AE52",
"$ c #EEDE7E",
"% c #FEB26A",
"& c #06060A",
"* c #B6AE7A",
"= c #CEA272",
"- c #E2D27E",
"; c #FEDEA2",
"> c #7A6E4E",
", c #BEAA56",
"' c #1E1E22",
") c #826A4E",
"! c #FEDEA6",
"~ c #F6F6F2",
"{ c #9A7E5A",
"] c #C2BE86",
"^ c #3E3A2A",
"/ c #7E5E3A",
"( c #EADA82",
"_ c #FEDEAE",
": c #FEBE7A",
"< c #BABAB6",
"[ c #7E7E7E",
"} c #625A3A",
"| c #E2DA9A",
"1 c #322212",
"2 c #D2BA5A",
"3 c #9E9E9E",
"4 c #9E7A52",
"5 c #EAEAE6",
"6 c #969262",
"7 c #AEAEAA",
"8 c #826E52",
"9 c #FED69A",
"0 c #DEBE8A",
"a c #DEB67E",
"b c #9E8A66",
"c c #6E5A42",
"d c #C2C2BE",
"e c #32322E",
"f c #EEA256",
"g c #664226",
"h c #BEA67A",
"i c #8A8A8A",
"j c #969692",
"k c #C68246",
"l c #CECECA",
"m c #7A7256",
"n c #DEDEDE",
"o c #362E22",
"p c #6E563A",
"q c #A66A3A",
"r c #625E4A",
"s c #DADAD6",
"t c #4A4A4A",
"u c #FEC282",
"v c #D2BE6A",
"w c #464646",
"x c #363636",
"y c #A6A6A2",
"z c #6E6E72",
"A c #666666",
"B c #261A12",
"C c #B6B6B2",
"D c #FECE92",
"E c #4E3A2A",
"F c #DECA6A",
"G c #DEAE76",
"H c #2A2A26",
"I c #CACAC6",
"J c #3E2A1A",
"K c #5E4A3A",
"L c #F2F2EE",
"M c #929292",
"N c #767676",
"O c #5A5242",
"P c #EEE692",
"Q c #D2D2CE",
"R c #766A3E",
"S c #3E2E1A",
"T c #E6E6E6",
"U c #FAFAFA",
"V c #121212",
"W c #5A5A56",
"X c #EEE69A",
"Y c #968A4E",
"Z c #3E321E",
"` c #867642",
" . c #FEC686",
".. c #423626",
"+. c #3E3E3E",
"@. c #4E4E52",
"#. c #A69246",
"$. c #4A3E36",
"%. c #6E5E3A",
"&. c #E2E2E2",
"*. c #5E5E5A",
"=. c #565246",
"-. c #BEBEBA",
";. c #DAC666",
">. c #4E422A",
",. c #E2D272",
"'. c #8E8E8A",
"). c #D6D6D2",
"!. c #AAAAA6",
"~. c #C6C6C6",
"{. c #FEBA76",
"]. c #868686",
"^. c #969266",
"/. c #F6AA62",
"(. c #9A9A96",
"_. c #5A523A",
":. c #5E5236",
"<. c #525252",
"[. c #A2A29E",
"}. c #7A7A76",
"|. c #FEFEFE",
"1. c #7E6A4E",
"2. c #FEDA9E",
"3. c #EADE8E",
"4. c #EEEEEA",
"5. c #42321E",
"6. c #7E7672",
"7. c #FED296",
"8. c #2E2E2E",
"9. c #F2EA96",
"0. c #826E56",
"a. c #7E6A42",
"b. c #FECA8A",
"c. c #3E3226",
"d. c #5E5E5E",
"e. c #82764E",
"f. c #4E4236",
"g. c #626262",
"h. c #020206",
"i. c #423A2E",
"j. c #422E1A",
"k. c #CEA672",
"l. c #7E6242",
"m. c #727272",
"n. c #6A6A6E",
"o. c #CACACA",
"p. c #F2F2F6",
"q. c #C6C286",
"r. c #828286",
"s. c #F2EAA2",
"t. c #5A564A",
"u. c #565656",
"v. c #AEAEAE",
"w. c #EEE696",
"x. c #8E8E92",
"y. c #7A7A7E",
"z. c #FEDAA6",
"A. c #423226",
"B. c #B6B6B6",
"C. c #AAAAAA",
"D. c #BABABA",
"E. c #DADADA",
"F. c #422A16",
"G. c #F2E68E",
"H. c #16120E",
"I. c #DEC666",
"J. c #EAEAEA",
"K. c #969696",
"L. c #CECECE",
"M. c #BEBEBE",
"N. c #F6F6F6",
"O. c #F2F2F2",
"P. c #C2C2C2",
"Q. c #42362A",
"R. c #FECA8E",
"S. c #8A8A8E",
"T. c #D2D2D2",
"U. c #3E3222",
"V. c #8E8E8E",
"W. c #D6D6D6",
"X. c #A2A2A2",
"Y. c #423222",
"Z. c #422E1E",
"`. c #FED69E",
" + c #323232",
".+ c #362E26",
"++ c #46464A",
"@+ c #FECE96",
"#+ c #9A9A9A",
"$+ c #7A7A7A",
"%+ c #2E2E32",
"&+ c #5E5E62",
"*+ c #CACACE",
"=+ c #9A8A4A",
"-+ c #DEBE8E",
";+ c #DECA6E",
">+ c #2A2A2A",
",+ c #5A5A5A",
"'+ c #FEDAA2",
")+ c #EEEEEE",
"!+ c #FED29A",
"~+ c #727276",
" .+i.c. ",
" 0._ -+8 o ",
" 1.9 c .k.{ h. ",
" H / S ] ^ 4 k.b.a.>. c.Q.o ",
">+x.A . g 1 - w.^.m l.G a 1.0 9 h ) ",
"x n T 3 6.8.+ F G.| * :.p b.D ! ; ; h c ",
" +*+|.L 5 E.g.} Y ,.P X ] ^ 4 = @+2.! b ",
" N N.|.N.p.T.C.+.#.;.$ 9.9.6 > l.G `.z.Q. ",
" n.O.|.|.N.J.W.K.=.R # , e.v 3.* :. .`.i. ",
" W &.U O.O.J.&.T.~.x.u.> $+@.` ;+w.Y.7.Q. ",
" . v.U L )+5 &.E.T.*+P.S.< !.W =+( U.@+i. ",
" . X.O.J.T &.n W.T.L.~.P.D.v.y.} ;.S D Q. ",
" $+4.5 &.E.s T.o.~.P.D.B.7 r._.2 S b.Q. ",
" . n &.n s Q l I ~.-.C C 7 S.O =+U. ... ",
" . T.E.W.T.l ~.d -.< C v.y K.&+%.Z b.Q. ",
" . M v.~.l ~.d D.C B.C.y y M &+%.S u .. ",
" V t ,+B.-.M.B.C v.C.y X.M ~+O S {.A. ",
" +N y v.C.!.X.X.#+M i ++S {.Y. ",
" ' z ].3 #+3 (.j i ++J % Y. ",
" . %+<.M M j j '.d.E /.Z. ",
" >+,+].i '.}.K f j.h.h. ",
" . *.m.}.$.k J . . h.",
" & %+w $.q 1 h.. ",
" H.B "};

View File

@ -0,0 +1,26 @@
/* XPM */
static char * panel_xpm[] = {
"16 16 7 1",
" c None",
". c #000000",
"+ c #808080",
"@ c #0000FF",
"# c #A0A0A4",
"$ c #FFFFFF",
"% c #595959",
" ",
"................",
".++++++++++++++.",
".+@@@@@@@@@@@@#.",
".++++++++++++++.",
".+$$$$$$$$$$$$+.",
".%$$$$$$$$$$$$+.",
".+$$$$$$$$$$$$+.",
".+$$$$$$$$$$$$+.",
".+$$$$$$$$$$$$%.",
".+$$$$$$$$$$$$+.",
".+$$$$$$$$$$$$+.",
".%$$$$$$$$$$$$+.",
".++++++++++++++.",
"................",
" "};

View File

@ -0,0 +1,267 @@
/* XPM */
static char * preview_xpm[] = {
"24 24 240 2",
" c None",
". c #060606",
"+ c #1E767E",
"@ c #2AA2A2",
"# c #92C6E6",
"$ c #0E0E12",
"% c #AADAF2",
"& c #4A8282",
"* c #5A9AEA",
"= c #0E3A3A",
"- c #52667A",
"; c #9A9A96",
"> c #D6DEE6",
", c #727272",
"' c #DEE6E6",
") c #2A3E42",
"! c #0A36BE",
"~ c #9ECAEA",
"{ c #7EB2E2",
"] c #565652",
"^ c #8A8A86",
"/ c #96B2BE",
"( c #A2CAE2",
"_ c #DEEEF6",
": c #2A36BA",
"< c #06262A",
"[ c #4A4A4A",
"} c #E6EEF2",
"| c #0E3ABA",
"1 c #2276C6",
"2 c #B2C6DE",
"3 c #6E72BA",
"4 c #566EBE",
"5 c #A6A6B2",
"6 c #9EBEDE",
"7 c #2A2A2A",
"8 c #3A72BE",
"9 c #F6F6F2",
"0 c #6E8EBE",
"a c #727E86",
"b c #0A8AFA",
"c c #3E92D6",
"d c #C6C6C2",
"e c #BADAEE",
"f c #D2D6DA",
"g c #6E76B2",
"h c #464642",
"i c #469AF2",
"j c #86A2C2",
"k c #B6B6B2",
"l c #52AADE",
"m c #BED2EA",
"n c #1252BE",
"o c #222E2E",
"p c #9696B2",
"q c #6EAADA",
"r c #126ECA",
"s c #F2FAFA",
"t c #AEBED6",
"u c #92928E",
"v c #1E1E1E",
"w c #3E7EF6",
"x c #1686F6",
"y c #3E3E3E",
"z c #C6DAE6",
"A c #4A86D2",
"B c #3AAAF6",
"C c #0A76F6",
"D c #62625E",
"E c #B2C2D6",
"F c #C2CEEA",
"G c #7E7E7E",
"H c #62BED6",
"I c #828AAE",
"J c #2E2E2E",
"K c #CAD2DE",
"L c #D2E6F2",
"M c #4E4E4E",
"N c #CECECA",
"O c #5E86C2",
"P c #6A6A6A",
"Q c #F2EEEA",
"R c #5E5E5A",
"S c #767676",
"T c #AEAEAA",
"U c #363636",
"V c #868686",
"W c #A2A2A2",
"X c #E2E2DA",
"Y c #4A6EBE",
"Z c #92AEF6",
"` c #E6E6E2",
" . c #226EFE",
".. c #F6FAFA",
"+. c #8A96AE",
"@. c #96A2BE",
"#. c #3A3A36",
"$. c #BEBEBE",
"%. c #8AD2EE",
"&. c #8AB2CE",
"*. c #3292F6",
"=. c #225ABE",
"-. c #76B6DE",
";. c #FAFEFE",
">. c #222222",
",. c #96B2DA",
"'. c #0296F6",
"). c #CACAC6",
"!. c #BAE6FA",
"~. c #9E9EAA",
"{. c #5A5A5A",
"]. c #B2B2BE",
"^. c #8E8E8E",
"/. c #7A8286",
"(. c #BABAB6",
"_. c #D2D2CE",
":. c #9E9E9A",
"<. c #DADAD6",
"[. c #D2DAEE",
"}. c #3276CA",
"|. c #AEC6EE",
"1. c #96D2EE",
"2. c #52524E",
"3. c #7A7A76",
"4. c #42423E",
"5. c #DADEDE",
"6. c #323232",
"7. c #9A9696",
"8. c #0A0A0E",
"9. c #161616",
"0. c #9AD2EE",
"a. c #B2CED6",
"b. c #3EB2F6",
"c. c #666662",
"d. c #82827E",
"e. c #B2B2AE",
"f. c #B6B6C2",
"g. c #524A4A",
"h. c #BEC2C2",
"i. c #7292CE",
"j. c #92B2DE",
"k. c #969696",
"l. c #EEEEEA",
"m. c #FAF2EE",
"n. c #EAEAEA",
"o. c #262626",
"p. c #F2F2F6",
"q. c #5E6EBA",
"r. c #76AEE6",
"s. c #FEFEFE",
"t. c #3A7AD2",
"u. c #3A3E3A",
"v. c #7A7A7A",
"w. c #86A2CE",
"x. c #76B2EA",
"y. c #DEF2FA",
"z. c #6E6E6E",
"A. c #56565A",
"B. c #E2E2DE",
"C. c #CACACE",
"D. c #464646",
"E. c #3A3A3A",
"F. c #96CAEA",
"G. c #DEEAEE",
"H. c #E6F2F6",
"I. c #AAAAAA",
"J. c #BABABA",
"K. c #828286",
"L. c #B2B2B6",
"M. c #CAC6C6",
"N. c #D6D2CE",
"O. c #464242",
"P. c #C2C2C2",
"Q. c #121212",
"R. c #AADEEE",
"S. c #9ECEEE",
"T. c #6A7AAA",
"U. c #D2EAFA",
"V. c #CEDEEA",
"W. c #DEDEDA",
"X. c #E6E2E2",
"Y. c #36363A",
"Z. c #46464A",
"`. c #3A3A3E",
" + c #FAFAF6",
".+ c #D6D6D2",
"++ c #EAE6E6",
"@+ c #DAE6EE",
"#+ c #C6C6CA",
"$+ c #5E5E62",
"%+ c #9E9EA2",
"&+ c #FAFAFE",
"*+ c #BAB6B6",
"=+ c #DEDADA",
"-+ c #9A9A9A",
";+ c #8A8A8A",
">+ c #2A2A2E",
",+ c #F6F6F6",
"'+ c #CACACA",
")+ c #565656",
"!+ c #828282",
"~+ c #7A7A7E",
"{+ c #E2E2E2",
"]+ c #DEDEDE",
"^+ c #0E36BE",
"/+ c #EAEEEE",
"(+ c #F6F2F6",
"_+ c #727276",
":+ c #525252",
"<+ c #D2D2D2",
"[+ c #424242",
"}+ c #C2C2C6",
"|+ c #C6C6C6",
"1+ c #86868A",
"2+ c #929292",
"3+ c #626262",
"4+ c #CECECE",
"5+ c #4A4A4E",
"6+ c #7E7E82",
"7+ c #A2A2A6",
"8+ c #8E8E92",
"9+ c #BABABE",
"0+ c #3E3E42",
"a+ c #4E4E52",
"b+ c #5E5E5E",
"c+ c #AEAEAE",
"d+ c #E6E6E6",
"e+ c #9E9E9E",
"f+ c #666666",
"g+ c #B2B2B2",
"h+ c #FAFAFA",
"i+ c #D6D6D6",
"j+ c #06060A",
"k+ c #B6B6B6",
"l+ c #1E1E22",
"m+ c #BEBEC2",
"n+ c #225AC2",
"o+ c #DADADA",
"p+ c #96CAEE",
"q+ c #AAAAAE",
" 3.D S v., P c.R )+:+[ h Z.Z.) 7 ",
"v.<+!+]+s.s.s.s.s.s.s.s.s.;.U.1.a ",
"3+!+c.]+s.s.s.s.s.s.s.s. +!.B i - 8.8. ",
"v.o+]+n.s.s.s.s.p.W.<.i+X F.x .T.2+; 8. ",
"3.s.s.s.s.s.9 ).^ )+2.)+M a O Z ~.;+2+8. ",
"P s.s.s.s.s.W [+3.'+#+4+J.R J I.T ^ 2+8. ",
"b+ +s.s.9 W D <+ +H.% [.n./+h.M {.G ^ 8. ",
"{.s.s.s.(.)+<+s.s.G.# 2 a.-.m c+6.f+^ 8. ",
"M s.s.p.G ^. +s.s.,+> > &.r i..+$+)+V 8. ",
"h s.s.).[+<+s.s.s.y.~ j.h.@.]._.; U V 8. ",
"h s. +).4.<+s y._ e r.}.@.j 0 ).:.7 V 8. ",
"D.h+ +P.`._._ F.S.{ A n+4 8 ! f.k.7 G 8. ",
"D.9 9 4+D.).U.l c 8 =.! g I 3 (.V U v.8. ",
"D.p.p.l.G V @+q 1 n | : 5 e.k c+2.[ 3.8. ",
"D.9 p.R./ [ $.> w.Y q.p c+L.$._+Q.g.S 8. ",
"O.m.%.'.*.+.:+e+4+_.P.m+$.c+, 7 @ = d.8. ",
"[+Q # C w f -+U M v.8+^.P 5+6.+ & :+h v ",
"[+++' |.F {+=+J.^ D.o.J )+!+7.< 7 {.:+$ ",
"[+` {+{+B.H f K <+P.(.(.g+k+h.N , 6.{.:+ ",
"4.{+B.5.~ x.6 t _.C.'+'+#+'+P.}+k.:+E.b+:+ ",
"0+{+{+z b.b * ,.E '+'+'+|+}+P.P.;+P b+7 {.)+ ",
"8.j+. >.l+6.E.y y y E.U 6.6.J >+7 4.V >.o.{.:+ ",
" . I.e+e+:.-+7.; k.u u ;+V !+G v.!+8. 7 {.v ",
" 8.E.E.E.Y.E.E.Y.#.Y.Y.E.U U Y.U J 8. Q. "};

View File

@ -0,0 +1,222 @@
/* XPM */
static char * save_xpm[] = {
"24 24 195 2",
" c None",
". c #2B2B3B",
"+ c #3F3F55",
"@ c #9191DF",
"# c #51516D",
"$ c #A4A4DF",
"% c #B2B2FF",
"& c #47479C",
"* c #525252",
"= c #28283B",
"- c #9C9CEF",
"; c #5252B0",
"> c #F2F2F2",
", c #E7E7E7",
"' c #585858",
") c #373755",
"! c #9292DF",
"~ c #9494EF",
"{ c #6969BE",
"] c #DDDDED",
"^ c #DFDFDF",
"/ c #EEEEEE",
"( c #24243B",
"_ c #8989DF",
": c #9E9EFF",
"< c #4E4EAF",
"[ c #C6C6D6",
"} c #FAFAFA",
"| c #D6D6D6",
"1 c #21213B",
"2 c #9292FF",
"3 c #8181EF",
"4 c #4C4CB0",
"5 c #F3F3F3",
"6 c #FFFFFF",
"7 c #DCDCDC",
"8 c #F0F0F0",
"9 c #FDFDFD",
"0 c #2C2C55",
"a c #7777DF",
"b c #8989FF",
"c c #4444C0",
"d c #BFBFDF",
"e c #EFEFEF",
"f c #FEFEFE",
"g c #E6E6E6",
"h c #1D1D3B",
"i c #6E6EDF",
"j c #7F7FFF",
"k c #6E6EEF",
"l c #4747B0",
"m c #FBFBFB",
"n c #D7D7D7",
"o c #19193B",
"p c #7373FF",
"q c #5F5FE7",
"r c #4444B0",
"s c #DFDFEF",
"t c #DBDBDB",
"u c #34344C",
"v c #222255",
"w c #5B5BDF",
"x c #6969FF",
"y c #5050DF",
"z c #7E7ED7",
"A c #5555A7",
"B c #5B5BEF",
"C c #5959C0",
"D c #ECECEC",
"E c #4646BF",
"F c #2B2B6D",
"G c #16163B",
"H c #5353DF",
"I c #6060FF",
"J c #4E4EE7",
"K c #5454A8",
"L c #B3B3BB",
"M c #9494A9",
"N c #5353EF",
"O c #4141B0",
"P c #E0E0E0",
"Q c #CFCFE7",
"R c #4343C0",
"S c #5959F7",
"T c #1382C7",
"U c #000060",
"V c #101C3C",
"W c #4A63F8",
"X c #4545E7",
"Y c #54549C",
"Z c #A8A8B7",
"` c #3232A1",
" . c #4949CF",
".. c #9798B2",
"+. c #5454FF",
"@. c #3E3EB0",
"#. c #2424B8",
"$. c #4A63F7",
"%. c #108CD4",
"&. c #0000C5",
"*. c #000052",
"=. c #001934",
"-. c #1445C8",
";. c #5151A7",
">. c #3F3FAD",
",. c #3636E7",
"'. c #656BD2",
"). c #9FA1BC",
"!. c #BFBFBF",
"~. c #3939DF",
"{. c #4A4AFF",
"]. c #4040EF",
"^. c #5151C0",
"/. c #3A3ABF",
"(. c #415AF8",
"_. c #1477D9",
":. c #0019D0",
"<. c #00005C",
"[. c #B3B3D3",
"}. c #A5A8BA",
"|. c #474ECB",
"1. c #5A62D2",
"2. c #B1B4BD",
"3. c #5050A8",
"4. c #3434E7",
"5. c #4040FF",
"6. c #3737EF",
"7. c #3B3BB0",
"8. c #8F8FD7",
"9. c #3737C0",
"0. c #3C3CF7",
"a. c #0D89D4",
"b. c #000056",
"c. c #666666",
"d. c #E1E1E1",
"e. c #A5AABE",
"f. c #A7A9B3",
"g. c #B3B3B3",
"h. c #A8A8B0",
"i. c #4444A4",
"j. c #0000A0",
"k. c #2B2BE7",
"l. c #3434FF",
"m. c #2E47F7",
"n. c #0A86D4",
"o. c #757575",
"p. c #D5D5D5",
"q. c #A8A8A8",
"r. c #4141A0",
"s. c #0303DF",
"t. c #0202FF",
"u. c #0606BF",
"v. c #2121DF",
"w. c #2B2BFF",
"x. c #263FF8",
"y. c #0C6FD9",
"z. c #DEDEDE",
"A. c #9C9C9C",
"B. c #46468E",
"C. c #0808E7",
"D. c #0707FF",
"E. c #0505FF",
"F. c #0202DF",
"G. c #1111C0",
"H. c #2121FF",
"I. c #0783D4",
"J. c #CBCBD2",
"K. c #393996",
"L. c #0D0DE7",
"M. c #0D0DFF",
"N. c #0C0CFF",
"O. c #0808B8",
"P. c #132CF7",
"Q. c #0480D4",
"R. c #404060",
"S. c #0536B1",
"T. c #112AF8",
"U. c #1111FF",
"V. c #0C0CDF",
"W. c #0404BF",
"X. c #0A23F8",
"Y. c #0467D9",
"Z. c #001988",
"`. c #1111E7",
" + c #0202C0",
".+ c #0101F7",
"++ c #017DD4",
"@+ c #00009D",
"#+ c #000C9C",
"$+ c #0031F0",
"%+ c #007CD4",
"&+ c #001B6A",
"*+ c #0068C2",
"=+ c #000230",
"-+ c #000032",
" . ",
" + @ # ",
" . $ % & * ",
" = % - ; > , ' ",
" ) ! ~ { ] ^ / , * ",
" ( _ : < [ > } ^ > | * ",
" 1 2 3 4 5 6 7 8 9 7 > , ' ",
" 0 a b c d ^ e 6 ^ / f ^ e g * ",
" h i j j k l m ^ 5 m ^ e } ^ 5 n * ",
" o p p p q p p r s 7 5 6 7 > 9 t 5 , u ",
" v w x y z A y x B C s ^ e 6 ^ D f , d E F ",
"G H I J K L M K J I N O m P 5 m ^ 5 Q R S T U ",
"V W X Y Z ` ...Y X +.+.@.s 7 5 6 Q #.$.%.&.*. ",
"=.-.;.Z >.,.'.).!.;.~.{.].^.s , d /.(._.:.*. ",
" <.[.}.|.1.2.!.!.L 3.4.5.6.7.8.9.0.a.:.b. ",
" c.d.e.f.g.g.g.h.i.j.k.l.l.l.m.n.&.*. ",
" o.p.g.q.q.q.r.s.t.u.v.w.x.y.:.*. ",
" o.z.A.A.B.C.D.E.F.G.H.I.:.b. ",
" c.J.K.L.M.N.C.O.P.Q.&.*. ",
" R.S.T.U.V.W.X.Y.:.*. ",
" Z.Q.`. +.+++:.b. ",
" @+#+$+%+&.*. ",
" &+*+:.*. ",
" =+-+ "};

View File

@ -0,0 +1,20 @@
/* XPM */
static char * unused_xpm[] = {
"16 16 1 1",
" c None",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "};

View File

@ -0,0 +1,21 @@
/* XPM */
static char * used_xpm[] = {
"16 16 2 1",
" c None",
". c #000000",
" ",
" ",
" ",
" ",
" . ",
" ... ",
" .... ",
" .... ",
" .. .... ",
" ....... ",
" ..... ",
" ... ",
" . ",
" ",
" ",
" "};

View File

@ -0,0 +1,22 @@
/* XPM */
static char * vsizer_xpm[] = {
"16 16 3 1",
" c None",
". c #000000",
"+ c #FF0000",
" . ",
" ... ",
" ..+.. ",
" ..+++.. ",
" ..+++++.. ",
" .+++. ",
" .+++. ",
" .+++. ",
" .+++. ",
" .+++. ",
" .+++. ",
" ..+++++.. ",
" ..+++.. ",
" ..+.. ",
" ... ",
" . "};

View File

@ -0,0 +1,6 @@
node boxsizer
type sizer
icon 2
childtype sizer_item
derived from panel_item
var orient of flags wxHORIZONTAL,wxVERTICAL

View File

@ -0,0 +1,3 @@
node break
type normal
derived from menu_item

View File

@ -0,0 +1,4 @@
node button
var label of text
var default of bool
derived from control

View File

@ -0,0 +1,4 @@
node checkbox
var label of text
var checked of bool
derived from control

View File

@ -0,0 +1,6 @@
node control
abstract
icon 0
derived from window
derived from panel_item
derived from toolbar_item

View File

@ -0,0 +1,4 @@
node dialog
var title of text
var style of flags wxSTAY_ON_TOP,wxCAPTION,wxDEFAULT_DIALOG_STYLE,wxTHICK_FRAME,wxSYSTEM_MENU,wxRESIZE_BORDER,wxRESIZE_BOX,wxDIALOG_MODAL,wxDIALOG_MODELESS
derived from panelbase

View File

@ -0,0 +1,7 @@
node gauge
var style of flags wxGA_HORIZONTAL,wxGA_VERTICAL,wxGA_PROGRESSBAR,wxGA_SMOOTH
var range of integer
var value of integer
var shadow of integer
var bezel of integer
derived from control

View File

@ -0,0 +1,6 @@
node htmlwindow
var url of text
var htmlcode of text
var borders of integer
var style of flags wxHW_SCROLLBAR_NEVER,wxHW_SCROLLBAR_AUTO
derived from control

View File

@ -0,0 +1,8 @@
node menu
type panel
icon 0
childtype menu_item
var label of text
var style of flags wxMENU_TEAROFF
var help of text
derived from menu_item

View File

@ -0,0 +1,3 @@
# anything that may be placed into menu
node menu_item
abstract

View File

@ -0,0 +1,5 @@
node menubar
type panel
icon 0
childtype menu
var style of flags wxMB_DOCKABLE

View File

@ -0,0 +1,9 @@
node menuitem
type normal
icon 0
var label of text
var help of text
var checkable of bool
var checked of bool
var enabled of bool
derived from menu_item

View File

@ -0,0 +1,3 @@
node panel
derived from panel_item
derived from panelbase

View File

@ -0,0 +1,4 @@
# anything that may be placed into panel
node panel_item
abstract
derived from sizer_item

View File

@ -0,0 +1,9 @@
# base "class" for panel and dialog
node panelbase
type panel
icon 1
childtype panel_item
abstract
var style of flags wxNO_3D,wxTAB_TRAVERSAL
var exstyle of flags wxWS_EX_VALIDATE_RECURSIVELY
derived from window

View File

@ -0,0 +1,5 @@
node radiobutton
var label of text
var value of bool
var style of flags wxRB_GROUP
derived from control

View File

@ -0,0 +1,4 @@
node separator
icon 0
type normal
derived from menu_item

View File

@ -0,0 +1,4 @@
# anything that may be placed into sizer
node sizer_item
abstract

View File

@ -0,0 +1,8 @@
# don't delete this file!
# it servers as helper df for sizer items
node sizeritem
type sizeritem
var option of integer
var flag of flags wxEXPAND,wxALL,wxLEFT,wxRIGHT,wxTOP,wxBOTTOM,wxALIGN_CENTER,wxALIGN_LEFT,wxALIGN_TOP,wxALIGN_RIGHT,wxALIGN_BOTTOM,wxALIGN_CENTER_HORIZONTAL,wxALIGN_CENTER_VERTICAL,wxNORTH,wxSOUTH,wxEAST,wxWEST,wxGROW,wxSHAPED,wxSTRETCH_NOT
var border of integer

View File

@ -0,0 +1,13 @@
node slider
var value of integer
var min of integer
var max of integer
var style of flags wxSL_HORIZONTAL,wxSL_VERTICAL,wxSL_AUTOTICKS,wxSL_LABELS,wxSL_LEFT,wxSL_TOP,wxSL_RIGHT,wxSL_BOTTOM,wxSL_BOTH,wxSL_SELRANGE
var tickfreq of integer
var pagesize of integer
var linesize of integer
var thumb of integer
var tick of integer
var selmin of integer
var selmax of integer
derived from control

View File

@ -0,0 +1,10 @@
# don't delete this file!
# it servers as helper df for sizer items
node spacer
type normal
var option of integer
var flag of flags wxEXPAND,wxALL,wxLEFT,wxRIGHT,wxTOP,wxBOTTOM,wxALIGN_CENTER,wxALIGN_LEFT,wxALIGN_TOP,wxALIGN_RIGHT,wxALIGN_BOTTOM,wxALIGN_CENTER_HORIZONTAL,wxALIGN_CENTER_VERTICAL,wxNORTH,wxSOUTH,wxEAST,wxWEST,wxGROW,wxSHAPED,wxSTRETCH_NOT
var border of integer
var size of coord
derived from sizer_item

View File

@ -0,0 +1,3 @@
node button
var bitmap of text
derived from control

View File

@ -0,0 +1,3 @@
node staticboxsizer
derived from boxsizer
var label of text

View File

@ -0,0 +1,3 @@
node statictext
var label of text
derived from control

View File

@ -0,0 +1,4 @@
node textctrl
var value of text
var style of flags wxTE_PROCESS_ENTER,wxTE_PROCESS_TAB,wxTE_MULTILINE,wxTE_PASSWORD,wxTE_READONLY,wxHSCROLL
derived from control

View File

@ -0,0 +1,3 @@
# anything that may be placed into toolbar
node toolbar_item
abstract

View File

@ -0,0 +1,11 @@
node window
type normal
abstract
var pos of coord
var size of coord
var tooltip of text
var fg of color
var bg of color
var enabled of bool
var focused of bool
var hidden of bool

View File

@ -0,0 +1,56 @@
/////////////////////////////////////////////////////////////////////////////
// Purpose: XML resources editor
// Author: Vaclav Slavik
// Created: 2000/05/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation
#pragma interface
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
// for all others, include the necessary headers (this file is usually all you
// need because it includes almost all "standard" wxWindows headers
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/xml/xml.h"
#include "wx/image.h"
#include "editor.h"
// -- Application
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
wxString arg = (argc >= 1) ? argv[1] : "";
wxInitAllImageHandlers();
wxFrame *frame = new EditorFrame(NULL, arg);
SetTopWindow(frame);
frame->Show(TRUE);
return TRUE;
}

View File

@ -0,0 +1,885 @@
/////////////////////////////////////////////////////////////////////////////
// Author: Vaclav Slavik
// Created: 2000/05/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "editor.h"
#pragma implementation "treedt.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/xml/xmlres.h"
#include "wx/splitter.h"
#include "wx/config.h"
#include "wx/dir.h"
#include "treedt.h"
#include "editor.h"
#include "nodehnd.h"
#include "xmlhelpr.h"
class EditorTreeCtrl : public wxTreeCtrl
{
public:
EditorTreeCtrl(wxWindow *parent, int id, EditorFrame *frame)
: wxTreeCtrl(parent, id), m_EdFrame(frame) {}
private:
EditorFrame *m_EdFrame;
void OnRightClick(wxMouseEvent &event)
{
wxTreeItemId item =
m_EdFrame->m_TreeCtrl->HitTest(event.GetPosition());
if (item.IsOk())
{
m_EdFrame->m_TreeCtrl->SelectItem(item);
m_EdFrame->OnRightClickTree(event.GetPosition());
}
}
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(EditorTreeCtrl, wxTreeCtrl)
EVT_RIGHT_DOWN(EditorTreeCtrl::OnRightClick)
END_EVENT_TABLE()
enum
{
ID_PREVIEW = wxID_HIGHEST + 100,
ID_NEW,
ID_OPEN,
ID_CLOSE,
ID_SAVE,
ID_SAVEAS,
ID_DELETE_NODE,
ID_EXIT,
ID_TREE,
ID_XMLIDEDIT,
ID_XMLIDPICK,
ID_EDITCODE,
ID_PROPSLIST,
ID_CLEARPROP,
ID_NEWDIALOG,
ID_NEWPANEL,
ID_NEWMENU,
ID_NEWMENUBAR,
ID_NEWTOOLBAR,
ID_NEWNODE = wxID_HIGHEST + 1000,
ID_NEWSYBNODE = ID_NEWNODE + 2000
};
#ifdef __UNIX__
#endif
BEGIN_EVENT_TABLE(EditorFrame, wxFrame)
EVT_TREE_SEL_CHANGED(ID_TREE, EditorFrame::OnTreeSel)
EVT_TOOL_RANGE(ID_PREVIEW, ID_EXIT, EditorFrame::OnToolbar)
EVT_MENU_RANGE(ID_NEWDIALOG, ID_NEWSYBNODE + 1000, EditorFrame::OnNewNode)
EVT_TEXT(ID_XMLIDEDIT, EditorFrame::OnXMLIDEdit)
EVT_BUTTON(ID_XMLIDPICK, EditorFrame::OnXMLIDPick)
EVT_BUTTON(ID_EDITCODE, EditorFrame::OnEditCode)
EVT_BUTTON(ID_CLEARPROP, EditorFrame::OnClearProp)
EVT_LIST_ITEM_SELECTED(ID_PROPSLIST, EditorFrame::OnPropSel)
END_EVENT_TABLE()
#ifdef __UNIX__
#include "bitmaps/preview.xpm"
#include "bitmaps/close.xpm"
#include "bitmaps/save.xpm"
#include "bitmaps/open.xpm"
#include "bitmaps/control.xpm"
#include "bitmaps/vsizer.xpm"
#include "bitmaps/hsizer.xpm"
#include "bitmaps/panel.xpm"
#include "bitmaps/unused.xpm"
#include "bitmaps/used.xpm"
#endif
EditorFrame *EditorFrame::ms_Instance = NULL;
EditorFrame::EditorFrame(wxFrame *parent, const wxString& filename)
: wxFrame(parent, -1, filename + _("- wxWindows resources editor"))
{
ms_Instance = this;
wxConfigBase *cfg = wxConfigBase::Get();
SetSize(wxRect(wxPoint(cfg->Read("editor_x", -1), cfg->Read("editor_y", -1)),
wxSize(cfg->Read("editor_w", 400), cfg->Read("editor_h", 400))));
m_SelectedNode = NULL;
m_Resource = NULL;
m_FileName = wxEmptyString;
m_Preview = NULL;
m_SelectedProp = -1;
wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_NEW, "&New");
menuFile->Append(ID_OPEN, "&Open\tCtrl-O");
menuFile->Append(ID_SAVE, "&Save\tCtrl-S");
menuFile->Append(ID_SAVEAS, "Save &as...");
menuFile->AppendSeparator();
menuFile->Append(ID_EXIT, "E&xit\tAlt-X");
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(menuFile, "&File");
SetMenuBar(menuBar);
// handlers:
m_Handlers.DeleteContents(TRUE);
RegisterHandlers(".");
RegisterHandlers("./df");
m_Handlers.Append(new NodeHandlerUnknown(this));
#ifdef __UNIX__
RegisterHandlers(wxGetHomeDir() + "/.wxrcedit");
//FIXME - add $(prefix)/share/wx/wxrcedit
#endif
// Create toolbar:
wxToolBar *toolBar = CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL | wxTB_FLAT);
toolBar->SetMargins(2, 2);
toolBar -> AddTool(ID_EXIT, wxBITMAP(close), wxNullBitmap,
FALSE, -1, -1, (wxObject *) NULL,
_("Quit the editor"));
toolBar -> AddTool(ID_OPEN, wxBITMAP(open), wxNullBitmap,
FALSE, -1, -1, (wxObject *) NULL,
_("Open XML resource file"));
toolBar -> AddTool(ID_SAVE, wxBITMAP(save), wxNullBitmap,
FALSE, -1, -1, (wxObject *) NULL,
_("Save XML file"));
toolBar -> AddTool(ID_PREVIEW, wxBITMAP(preview), wxNullBitmap,
FALSE, -1, -1, (wxObject *) NULL,
_("Preview"));
toolBar -> Realize();
// Create layout:
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
wxPanel *p = new wxPanel(this);
sizer->Add(p, 1, wxEXPAND);
wxSizer *sizer2 = new wxBoxSizer(wxVERTICAL);
m_Splitter = new wxSplitterWindow(p);
sizer2->Add(m_Splitter, 1, wxEXPAND);
// Create tree control:
m_TreeCtrl = new EditorTreeCtrl(m_Splitter, ID_TREE, this);
m_ImgList = new wxImageList(16, 16);
m_ImgList->Add(wxICON(control));
m_ImgList->Add(wxICON(panel));
m_ImgList->Add(wxICON(vsizer));
m_ImgList->Add(wxICON(hsizer));
m_TreeCtrl->SetImageList(m_ImgList);
// Create properties panel:
m_Splitter2 = new wxSplitterWindow(m_Splitter);
m_PropsPanel = new wxPanel(m_Splitter2, -1, wxDefaultPosition,
wxDefaultSize, wxTAB_TRAVERSAL);
wxSizer *sizer3 = new wxBoxSizer(wxVERTICAL);
wxSizer *sz = new wxBoxSizer(wxHORIZONTAL);
sizer3->Add(new wxButton(m_PropsPanel, ID_EDITCODE, "Edit XML code"),
0, wxALL | wxEXPAND, 2);
sz->Add(new wxStaticText(m_PropsPanel, -1, _("XMLID name:")),
0, wxLEFT | wxALIGN_CENTER_VERTICAL, 2);
m_XMLIDCtrl = new wxTextCtrl(m_PropsPanel, ID_XMLIDEDIT, "");
sz->Add(m_XMLIDCtrl, 1, wxLEFT|wxRIGHT, 2);
sz->Add(new wxButton(m_PropsPanel, ID_XMLIDPICK, "...", wxDefaultPosition, wxSize(16,-1)),
0, wxRIGHT, 2);
sizer3->Add(sz, 0, wxTOP|wxEXPAND, 2);
m_PropsList = new wxListCtrl(m_PropsPanel, ID_PROPSLIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_SINGLE_SEL);
m_ImgListProp = new wxImageList(16, 16);
m_ImgListProp->Add(wxICON(unused));
m_ImgListProp->Add(wxICON(used));
m_PropsList->SetImageList(m_ImgListProp, wxIMAGE_LIST_SMALL);
m_PropsList->InsertColumn(0, _("Property"));
m_PropsList->InsertColumn(1, _("Value"));
m_PropsList->SetColumnWidth(0, cfg->Read("editor_col0", wxLIST_AUTOSIZE_USEHEADER));
m_PropsList->SetColumnWidth(1, cfg->Read("editor_col1", wxLIST_AUTOSIZE_USEHEADER));
sizer3->Add(m_PropsList, 1, wxALL | wxEXPAND, 2);
m_PropsPanel->SetAutoLayout(TRUE);
m_PropsPanel->SetSizer(sizer3);
m_PropsPanel->Layout();
m_PropsEditPanel = new wxScrolledWindow(m_Splitter2, -1, wxDefaultPosition,
wxDefaultSize, wxTAB_TRAVERSAL);
m_Splitter->SplitVertically(m_TreeCtrl, m_Splitter2);
m_Splitter->SetSashPosition(cfg->Read("editor_sash", 140));
m_Splitter2->SplitHorizontally(m_PropsPanel, m_PropsEditPanel);
m_Splitter2->SetSashPosition(cfg->Read("editor_sash2", 100));
p->SetAutoLayout(TRUE);
p->SetSizer(sizer2);
SetAutoLayout(TRUE);
SetSizer(sizer);
// Load file:
if (!filename)
NewFile();
else
LoadFile(filename);
}
EditorFrame::~EditorFrame()
{
wxConfigBase *cfg = wxConfigBase::Get();
cfg->Write("editor_x", (long)GetPosition().x);
cfg->Write("editor_y", (long)GetPosition().y);
cfg->Write("editor_w", (long)GetSize().x);
cfg->Write("editor_h", (long)GetSize().y);
cfg->Write("editor_sash", (long)m_Splitter->GetSashPosition());
cfg->Write("editor_sash2", (long)m_Splitter2->GetSashPosition());
cfg->Write("editor_col0", (long)m_PropsList->GetColumnWidth(0));
cfg->Write("editor_col1", (long)m_PropsList->GetColumnWidth(1));
delete m_ImgList;
delete m_ImgListProp;
RefreshProps(NULL);
}
NodeHandler *EditorFrame::FindHandler(wxXmlNode *node)
{
wxNode *n = m_Handlers.GetFirst();
while (n)
{
NodeHandler *h = (NodeHandler*) n->GetData();
if (h->CanHandle(node))
return h;
n = n->GetNext();
}
return NULL;
}
void EditorFrame::RegisterHandlers(const wxString& dirname)
{
if (!wxDirExists(dirname)) return;
wxDir dir(dirname);
wxString filename;
bool cont;
NodeHandler *hnd;
cont = dir.GetFirst(&filename, "*.df");
while (cont)
{
hnd = NodeHandler::CreateFromFile(filename, this);
if (hnd) m_Handlers.Append(hnd);
cont = dir.GetNext(&filename);
}
}
void EditorFrame::LoadFile(const wxString& filename)
{
delete m_Resource;
m_FileName = "";
m_Resource = new wxXmlDocument;
if (!m_Resource->Load(filename))
{
delete m_Resource;
m_Resource = NULL;
NewFile();
wxLogError("Error parsing " + filename);
}
else
{
m_FileName = filename;
RefreshTree();
SetTitle(m_FileName);
}
}
void EditorFrame::SaveFile(const wxString& filename)
{
m_FileName = filename;
SetTitle(filename);
if (!m_Resource->Save(filename, wxXML_IO_LIBXML))
wxLogError("Error saving " + filename);
}
void EditorFrame::NewFile()
{
delete m_Resource;
m_FileName = "";
m_Resource = new wxXmlDocument;
m_Resource->SetRoot(new wxXmlNode(wxXML_ELEMENT_NODE, "resource"));
RefreshTree();
SetTitle("unnamed");
}
void EditorFrame::RefreshPreview(wxXmlNode *node)
{
wxBusyCursor bcur;
wxXmlResource *res = new wxXmlResource;
wxString tempfile;
wxPoint pos = wxDefaultPosition;
while (node->GetParent() != m_Resource->GetRoot())
node = node->GetParent();
if (m_Preview) pos = m_Preview->GetPosition();
res->InitAllHandlers();
wxGetTempFileName("xmleditor", tempfile);
m_Resource->Save(tempfile, wxXML_IO_BIN);
res->Load(tempfile, wxXML_BINARY);
if (node->GetName() == "dialog")
{
wxDialog *dlg = new wxDialog;
if (res->LoadDialog(dlg, this, node->GetPropVal("name", "-1")))
{
if (pos.x != -1) dlg->Move(pos);
dlg->Show(TRUE);
if (m_Preview) m_Preview->Close(TRUE);
m_Preview = dlg;
}
else
{
delete dlg;
wxLogError(_("Cannot preview the dialog -- XML resource corrupted."));
}
}
delete res;
wxRemoveFile(tempfile);
}
void EditorFrame::RefreshTree()
{
wxXmlNode *sel = m_SelectedNode;
m_TreeCtrl->DeleteAllItems();
wxTreeItemId root = m_TreeCtrl->AddRoot("Resource: " + m_FileName);
wxXmlNode *n = m_Resource->GetRoot()->GetChildren();
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE)
CreateTreeNode(m_TreeCtrl, root, n);
n = n->GetNext();
}
m_TreeCtrl->Expand(root);
SelectNode(sel);
}
void EditorFrame::RefreshProps(wxXmlNode *node)
{
m_SelectedProp = -1;
for (int i = 0; i < m_PropsList->GetItemCount(); i++)
delete (wxObject*)(m_PropsList->GetItemData(i));
m_PropsList->DeleteAllItems();
if (node == NULL) return;
m_XMLIDCtrl->SetValue(FindHandler(node)->GetRealNode(node)->
GetPropVal("name", "-1"));
CreatePropsList(m_PropsList, node);
RefreshPropsEdit();
}
void EditorFrame::RefreshPropsEdit()
{
m_PropsEditPanel->DestroyChildren();
m_PropsEditPanel->SetSizer(NULL);
if (!m_SelectedNode || m_SelectedProp == -1 ||
m_PropsList->GetItemData(m_SelectedProp) == 0) return;
wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(new wxButton(m_PropsEditPanel, ID_CLEARPROP, _("Clear")),
0, wxALL, 5);
sizer->Add(
FindHandler(m_SelectedNode)->CreatePropEditPanel(m_PropsEditPanel, m_PropsList, m_SelectedProp),
1, wxEXPAND, 0);
m_PropsEditPanel->SetAutoLayout(TRUE);
m_PropsEditPanel->SetSizer(sizer);
m_PropsEditPanel->Layout();
wxSize winsz = m_PropsEditPanel->GetSize();
sizer->SetMinSize(winsz.x, winsz.y);
wxSize minsz = sizer->GetMinSize();
m_PropsEditPanel->SetScrollbars(8, 8, 1/*minsz.x/8*/, minsz.y/8);
}
bool EditorFrame::SelectNode(wxXmlNode *node, wxTreeItemId *root)
{
if (root == NULL)
{
wxTreeItemId rootitem = m_TreeCtrl->GetRootItem();
return SelectNode(node, &rootitem);
}
wxTreeItemId item;
XmlTreeData *dt;
wxXmlNode *nd;
long cookie;
item = m_TreeCtrl->GetFirstChild(*root, cookie);
while (item.IsOk())
{
dt = (XmlTreeData*)(m_TreeCtrl->GetItemData(item));
nd = (dt) ? dt->Node : NULL;
if (nd == node)
{
m_TreeCtrl->SelectItem(item);
m_TreeCtrl->EnsureVisible(item);
return TRUE;
}
if (m_TreeCtrl->ItemHasChildren(item) && SelectNode(node, &item))
return TRUE;
item = m_TreeCtrl->GetNextChild(*root, cookie);
}
return FALSE;
}
wxTreeItemId EditorFrame::CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent, wxXmlNode *node)
{
if (!node)
{
wxTreeItemId invalid;
return invalid;
}
return FindHandler(node)->CreateTreeNode(treectrl, parent, node);
}
void EditorFrame::CreatePropsList(wxListCtrl *treectrl, wxXmlNode *node)
{
if (!node) return;
FindHandler(node)->CreatePropsList(treectrl, node);
}
void EditorFrame::NotifyChanged(int change_type)
{
if (change_type & CHANGED_TREE)
RefreshTree();
if (change_type & CHANGED_TREE_SELECTED)
{
wxTreeItemId sel = m_TreeCtrl->GetSelection();
m_TreeCtrl->SetItemText(sel,
FindHandler(m_SelectedNode)->GetTreeString(m_SelectedNode));
}
if (change_type & CHANGED_TREE_SELECTED_ICON)
{
wxTreeItemId sel = m_TreeCtrl->GetSelection();
int icon = FindHandler(m_SelectedNode)->GetTreeIcon(m_SelectedNode);
m_TreeCtrl->SetItemImage(sel, icon);
}
if (change_type & CHANGED_PROPS_PANEL)
RefreshProps(m_SelectedNode);
}
void EditorFrame::OnTreeSel(wxTreeEvent& event)
{
XmlTreeData *dt = (XmlTreeData*)(m_TreeCtrl->GetItemData(event.GetItem()));
wxXmlNode *node = (dt) ? dt->Node : NULL;
m_SelectedNode = node;
RefreshProps(node);
}
void EditorFrame::OnXMLIDEdit(wxCommandEvent& event)
{
if (!m_SelectedNode) return;
wxXmlNode *node = FindHandler(m_SelectedNode)->GetRealNode(m_SelectedNode);
node->DeleteProperty("name");
wxString s = m_XMLIDCtrl->GetValue();
if (!(s == "-1")) node->AddProperty("name", s);
NotifyChanged(CHANGED_TREE_SELECTED);
}
void EditorFrame::OnXMLIDPick(wxCommandEvent& event)
{
if (!m_SelectedNode) return;
wxXmlNode *node = FindHandler(m_SelectedNode)->GetRealNode(m_SelectedNode);
wxString choices[] = {wxString("-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:"), _("XMLID"),
38/*sizeof choices*/, choices);
if (!s) return;
m_XMLIDCtrl->SetValue(s);
node->DeleteProperty("name");
if (!(s == "-1")) node->AddProperty("name", s);
NotifyChanged(CHANGED_TREE_SELECTED);
}
void EditorFrame::OnEditCode(wxCommandEvent& event)
{
if (!m_SelectedNode) return;
wxBusyCursor bcur;
wxDialog dlg(this, -1, _("XML code editor"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
wxTextCtrl *tc = new wxTextCtrl(&dlg, -1, "", wxDefaultPosition,
wxDefaultSize, wxTE_MULTILINE);
sizer->Add(tc, 1, wxEXPAND | wxALL, 10);
wxSizer *sz2 = new wxBoxSizer(wxHORIZONTAL);
sz2->Add(new wxButton(&dlg, wxID_OK, _("Save")), 0);
sz2->Add(new wxButton(&dlg, wxID_CANCEL, _("Cancel")), 0, wxLEFT, 10);
sizer->Add(sz2, 0, wxALIGN_RIGHT | wxRIGHT|wxBOTTOM, 10);
dlg.SetAutoLayout(TRUE);
dlg.SetSizer(sizer);
wxConfigBase *cfg = wxConfigBase::Get();
dlg.SetSize(wxRect(wxPoint(cfg->Read("xmleditor_x", -1), cfg->Read("xmleditor_y", -1)),
wxSize(cfg->Read("xmleditor_w", 400), cfg->Read("xmleditor_h", 400))));
wxString tempfile;
wxGetTempFileName("xmleditor", tempfile);
{
wxXmlDocument doc;
doc.SetRoot(new wxXmlNode(*m_SelectedNode));
doc.Save(tempfile, wxXML_IO_LIBXML);
}
tc->LoadFile(tempfile);
if (dlg.ShowModal() == wxID_OK)
{
tc->SaveFile(tempfile);
wxXmlDocument doc;
if (doc.Load(tempfile))
{
(*m_SelectedNode) = *doc.GetRoot();
NotifyChanged(CHANGED_TREE);
//FIXME-instead, regenerate only children
}
else wxLogError(_("Illegal XML file, canceled."));
}
wxRemoveFile(tempfile);
cfg->Write("xmleditor_x", (long)dlg.GetPosition().x);
cfg->Write("xmleditor_y", (long)dlg.GetPosition().y);
cfg->Write("xmleditor_w", (long)dlg.GetSize().x);
cfg->Write("xmleditor_h", (long)dlg.GetSize().y);
}
void EditorFrame::OnClearProp(wxCommandEvent& event)
{
m_PropsList->SetItemImage(m_SelectedProp, 0, 0);
m_PropsList->SetItem(m_SelectedProp, 1, "");
PropsListInfo *pli = (PropsListInfo*)m_PropsList->GetItemData(m_SelectedProp);
wxXmlNode *nd = XmlFindNode(pli->m_Node, pli->m_PropInfo->Name);
if (nd == NULL) return;
nd->GetParent()->RemoveChild(nd);
delete nd;
RefreshPropsEdit();
}
void EditorFrame::OnPropSel(wxListEvent& event)
{
m_SelectedProp = event.GetIndex();
RefreshPropsEdit();
}
void EditorFrame::OnToolbar(wxCommandEvent& event)
{
switch (event.GetId())
{
case ID_PREVIEW :
{
XmlTreeData* dt = (XmlTreeData*)m_TreeCtrl->GetItemData(m_TreeCtrl->GetSelection());;
if (dt != NULL && dt->Node != NULL)
RefreshPreview(dt->Node);
break;
}
case ID_EXIT :
Close(TRUE);
break;
case ID_NEW :
NewFile();
break;
case ID_OPEN :
{
wxString name = wxFileSelector("Open XML resource", "", "", "", "XML resources|*.xml", wxOPEN | wxFILE_MUST_EXIST);
if (!name.IsEmpty())
LoadFile(name);
break;
}
case ID_SAVE :
if (m_FileName != "") { SaveFile(m_FileName); break;}
// else go to SAVEAS
case ID_SAVEAS :
{
wxString name = wxFileSelector("Save as", "", m_FileName, "", "XML resources|*.xml", wxSAVE | wxOVERWRITE_PROMPT);
if (!name.IsEmpty())
SaveFile((m_FileName = name));
break;
}
case ID_DELETE_NODE :
{
XmlTreeData *dt = (XmlTreeData*)
(m_TreeCtrl->GetItemData(m_TreeCtrl->GetParent(m_TreeCtrl->GetSelection())));
wxXmlNode *n = (dt) ? dt->Node : NULL;
m_SelectedNode->GetParent()->RemoveChild(m_SelectedNode);
NotifyChanged(CHANGED_TREE);
SelectNode(n);
break;
}
}
}
void EditorFrame::OnNewNode(wxCommandEvent& event)
{
if (event.GetId() >= ID_NEWSYBNODE)
{
XmlTreeData *pardt =
(XmlTreeData*)(m_TreeCtrl->GetItemData(
m_TreeCtrl->GetParent(m_TreeCtrl->GetSelection())));
if (pardt && pardt->Node && pardt->Node != m_Resource->GetRoot())
{
wxXmlNode *nd = pardt->Node;
wxXmlNode *realnode = FindHandler(nd)->GetRealNode(nd);
NodeHandler *hnd = FindHandler(realnode);
wxString name = hnd->GetChildTypes()[event.GetId()-ID_NEWSYBNODE];
wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, name);
hnd->InsertNode(realnode, node, m_SelectedNode);
wxTreeItemId root = m_TreeCtrl->GetSelection();
SelectNode(node, &root);
}
}
else if (event.GetId() >= ID_NEWNODE)
{
wxXmlNode *realnode = FindHandler(m_SelectedNode)->GetRealNode(m_SelectedNode);
NodeHandler *hnd = FindHandler(realnode);
wxString name = hnd->GetChildTypes()[event.GetId()-ID_NEWNODE];
wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, name);
hnd->InsertNode(realnode, node);
wxTreeItemId root = m_TreeCtrl->GetSelection();
SelectNode(node, &root);
}
else
{
wxString name;
switch (event.GetId())
{
case ID_NEWDIALOG : name = "dialog"; break;
case ID_NEWPANEL : name = "panel"; break;
case ID_NEWMENU : name = "menu"; break;
case ID_NEWMENUBAR : name = "menubar"; break;
case ID_NEWTOOLBAR : name = "toolbar"; break;
default : return; // never occurs
}
wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, name);
m_Resource->GetRoot()->AddChild(node);
NotifyChanged(CHANGED_TREE);
SelectNode(node);
}
}
void EditorFrame::OnRightClickTree(wxPoint pos)
{
wxMenu *popup = new wxMenu;
if (m_SelectedNode == NULL || m_SelectedNode == m_Resource->GetRoot())
{
popup->Append(ID_NEWDIALOG, _("New dialog"));
popup->Append(ID_NEWPANEL, _("New panel"));
popup->Append(ID_NEWMENU, _("New menu"));
popup->Append(ID_NEWMENUBAR, _("New menubar"));
popup->Append(ID_NEWTOOLBAR, _("New toolbar"));
}
else
{
{
wxArrayString& arr =
FindHandler(FindHandler(m_SelectedNode)->GetRealNode(m_SelectedNode))->
GetChildTypes();
if (!arr.IsEmpty())
{
wxMenu *news = new wxMenu;
for (size_t i = 0; i < arr.GetCount(); i++)
{
news->Append(i + ID_NEWNODE, arr[i]);
if (i % 16 == 15) news->Break();
}
popup->Append(ID_NEWNODE-1, _("New child"), news);
}
}
XmlTreeData *pardt =
(XmlTreeData*)(m_TreeCtrl->GetItemData(
m_TreeCtrl->GetParent(m_TreeCtrl->GetSelection())));
if (pardt && pardt->Node && pardt->Node != m_Resource->GetRoot())
{
wxXmlNode *nd = pardt->Node;
wxArrayString& arr =
FindHandler(FindHandler(nd)->GetRealNode(nd))->
GetChildTypes();
if (!arr.IsEmpty())
{
wxMenu *news = new wxMenu;
for (size_t i = 0; i < arr.GetCount(); i++)
{
news->Append(i + ID_NEWSYBNODE, arr[i]);
if (i % 16 == 15) news->Break();
}
popup->Append(ID_NEWSYBNODE-1, _("New sybling"), news);
}
}
popup->AppendSeparator();
popup->Append(ID_DELETE_NODE, _("Delete"));
}
m_TreeCtrl->PopupMenu(popup, pos);
delete popup;
}

View File

@ -0,0 +1,107 @@
/////////////////////////////////////////////////////////////////////////////
// Purpose: XML resources editor
// Author: Vaclav Slavik
// Created: 2000/05/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma interface "editor.h"
#endif
#ifndef _EDITOR_H_
#define _EDITOR_H_
class wxXmlNode;
class wxTreeCtrl;
class wxScrolledWindow;
class wxSplitterWindow;
#include "wx/frame.h"
class NodeHandler;
class wxXmlNode;
class wxXmlDocument;
class EditorTreeCtrl;
enum ChangeType
{
CHANGED_NOTHING = 0,
CHANGED_TREE = 1,
CHANGED_TREE_SELECTED = 2,
CHANGED_TREE_SELECTED_ICON = 4,
CHANGED_PROPS = 8,
CHANGED_PROPS_PANEL = 16,
CHANGED_EVERYTHING = CHANGED_TREE | CHANGED_PROPS | CHANGED_PROPS_PANEL,
};
class EditorFrame : public wxFrame
{
public:
friend class EditorTreeCtrl;
EditorFrame(wxFrame *parent, const wxString& filename);
~EditorFrame();
void LoadFile(const wxString& filename);
void NewFile();
void SaveFile(const wxString& filename);
void RefreshTree();
void RefreshPreview(wxXmlNode *node);
void RefreshProps(wxXmlNode *node);
void RefreshPropsEdit();
bool SelectNode(wxXmlNode *node, wxTreeItemId *root = NULL);
wxTreeItemId CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent, wxXmlNode *node);
void CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node);
void NotifyChanged(int change_type);
void RegisterHandlers(const wxString& dir);
NodeHandler *FindHandler(wxXmlNode *node);
static EditorFrame *Get() { return ms_Instance; }
private:
static EditorFrame *ms_Instance;
wxTreeCtrl *m_TreeCtrl;
wxTextCtrl *m_XMLIDCtrl;
wxImageList *m_ImgList, *m_ImgListProp;
wxPanel *m_PropsPanel;
wxScrolledWindow *m_PropsEditPanel;
wxSplitterWindow *m_Splitter, *m_Splitter2;
wxListCtrl *m_PropsList;
int m_SelectedProp;
wxList m_Handlers;
wxXmlNode *m_SelectedNode;
wxString m_FileName;
wxXmlDocument *m_Resource;
wxWindow *m_Preview;
DECLARE_EVENT_TABLE()
void OnTreeSel(wxTreeEvent& event);
void OnToolbar(wxCommandEvent& event);
void OnNew(wxCommandEvent& event);
void OnXMLIDEdit(wxCommandEvent& event);
void OnXMLIDPick(wxCommandEvent& event);
void OnEditCode(wxCommandEvent& event);
void OnClearProp(wxCommandEvent& event);
void OnPropSel(wxListEvent& event);
void OnNewNode(wxCommandEvent& event);
void OnRightClickTree(wxPoint pos);
};
#endif

View File

@ -0,0 +1,437 @@
/////////////////////////////////////////////////////////////////////////////
// Author: Vaclav Slavik
// Created: 2000/05/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "nodehnd.h"
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "nodehnd.h"
#include "wx/xml/xml.h"
#include "wx/filefn.h"
#include "wx/wx.h"
#include "wx/arrimpl.cpp"
#include "wx/textfile.h"
#include "wx/tokenzr.h"
#include "wx/listctrl.h"
#include "editor.h"
#include "treedt.h"
#include "xmlhelpr.h"
WX_DEFINE_OBJARRAY(NodeInfoArray);
void NodeInfo::Read(const wxString& filename)
{
HandlerType tp = HANDLER_NONE;
wxString nd, cht;
bool ab = FALSE;
long icn = -1;
Node.Empty();
wxPathList list;
list.Add(".");
list.Add("./df");
#ifdef __UNIX__
list.Add(wxGetHomeDir() + "/.wxrcedit");
#endif
wxString path = list.FindValidPath(filename);
if (path.IsEmpty()) return;
wxTextFile tf;
tf.Open(path);
if (!tf.IsOpened()) return;
for (size_t i = 0; i < tf.GetLineCount(); i++)
{
if (tf[i].IsEmpty() || tf[i][0] == '#') continue;
wxStringTokenizer tkn(tf[i], ' ');
wxString s = tkn.GetNextToken();
if (s == "node")
nd = tkn.GetNextToken();
else if (s == "childtype")
cht = tkn.GetNextToken();
else if (s == "icon")
tkn.GetNextToken().ToLong(&icn);
else if (s == "derived")
{
if (tkn.GetNextToken() == "from")
{
s = tkn.GetNextToken();
DerivedFrom.Add(s);
Read(s + ".df");
}
}
else if (s == "abstract")
ab = true;
else if (s == "type")
{
s = tkn.GetNextToken();
if (s == "sizer") tp = HANDLER_SIZER;
else if (s == "sizeritem") tp = HANDLER_SIZERITEM;
else if (s == "panel") tp = HANDLER_PANEL;
else /*if (s == "normal")*/ tp = HANDLER_NORMAL;
}
else if (s == "var")
{
PropertyInfo pi;
pi.Name = tkn.GetNextToken();
tkn.GetNextToken();
wxString typ = tkn.GetNextToken();
if (tkn.HasMoreTokens()) pi.MoreInfo = tkn.GetNextToken();
if (typ == "color") pi.Type = PROP_COLOR;
else if (typ == "flags") pi.Type = PROP_FLAGS;
else if (typ == "bool") pi.Type = PROP_BOOL;
else if (typ == "integer") pi.Type = PROP_INTEGER;
else if (typ == "coord") pi.Type = PROP_COORD;
else /*if (typ == "text")*/ pi.Type = PROP_TEXT;
bool fnd = FALSE;
for (size_t j = 0; j < Props.GetCount(); j++)
{
if (Props[j].Name == pi.Name)
{
if (Props[j].Type == pi.Type && pi.Type == PROP_FLAGS)
Props[j].MoreInfo << ',' << pi.MoreInfo;
else
Props[j] = pi;
fnd = TRUE;
}
}
if (!fnd) Props.Add(pi);
}
}
if (!nd.IsEmpty()) Node = nd;
if (!cht.IsEmpty()) ChildType = cht;
if (tp != HANDLER_NONE) Type = tp;
if (icn != -1) Icon = icn;
Abstract = ab;
}
NodeHandler *NodeHandler::CreateFromFile(const wxString& filename, EditorFrame *frame)
{
NodeHandler *hnd = NULL;
if (s_AllNodes == NULL) s_AllNodes = new NodeInfoArray;
NodeInfo *ni = new NodeInfo;
ni->Type = HANDLER_NONE;
ni->Icon = 0;
ni->Read(filename);
s_AllNodes->Add(*ni); // add a copy
if (ni->Type == HANDLER_NONE || ni->Node.IsEmpty() || ni->Abstract)
return NULL;
switch (ni->Type)
{
case HANDLER_PANEL:
hnd = new NodeHandlerPanel(frame, ni);
break;
case HANDLER_SIZER:
hnd = new NodeHandlerSizer(frame, ni);
break;
case HANDLER_SIZERITEM:
hnd = new NodeHandlerSizerItem(frame, ni);
break;
default:
hnd = new NodeHandler(frame, ni);
break;
}
return hnd;
}
PropertyHandler* NodeHandler::s_PropHandlers[PROP_TYPES_CNT] = {NULL};
int NodeHandler::s_RefCnt = 0;
NodeInfoArray* NodeHandler::s_AllNodes = NULL;
NodeHandler::NodeHandler(EditorFrame *frame, NodeInfo *ni) :
m_NodeInfo(ni)
{
if (s_RefCnt++ == 0) CreatePropHandlers();
}
void NodeHandler::CreatePropHandlers()
{
s_PropHandlers[PROP_TEXT] = new TextPropertyHandler;
s_PropHandlers[PROP_FLAGS] = new FlagsPropertyHandler;
s_PropHandlers[PROP_COLOR] = new TextPropertyHandler;
s_PropHandlers[PROP_BOOL] = new BoolPropertyHandler;
s_PropHandlers[PROP_INTEGER] = new TextPropertyHandler;
s_PropHandlers[PROP_COORD] = new CoordPropertyHandler;
}
NodeHandler::~NodeHandler()
{
if (--s_RefCnt == 0)
{
for (int i = 0; i < PROP_TYPES_CNT; i++)
delete s_PropHandlers[i];
delete s_AllNodes; s_AllNodes = NULL;
}
delete m_NodeInfo;
}
bool NodeHandler::CanHandle(wxXmlNode *node)
{
return (m_NodeInfo->Node == node->GetName());
}
wxTreeItemId NodeHandler::CreateTreeNode(wxTreeCtrl *treectrl,
wxTreeItemId parent,
wxXmlNode *node)
{
int icon = GetTreeIcon(node);
wxTreeItemId item =
treectrl->AppendItem(parent, GetTreeString(node),
icon, icon, new XmlTreeData(node));
if (parent == treectrl->GetRootItem())
treectrl->SetItemBold(item);
return item;
}
wxString NodeHandler::GetTreeString(wxXmlNode *node)
{
wxString xmlid = node->GetPropVal("name", "");
if (xmlid.IsEmpty())
return node->GetName();
else
return (node->GetName() + " '" + xmlid + "'");
}
void NodeHandler::CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node)
{
int index;
for (size_t i = 0; i < m_NodeInfo->Props.GetCount(); i++)
{
PropertyInfo *p = &(m_NodeInfo->Props[i]);
index = s_PropHandlers[p->Type]->CreateListItem(listctrl, node, p);
listctrl->SetItemData(index, (long)new PropsListInfo(
index, s_PropHandlers[p->Type], node,
p, listctrl));
}
}
wxPanel *NodeHandler::CreatePropEditPanel(wxWindow *parent, wxListCtrl *listctrl, int index)
{
PropsListInfo *pli = (PropsListInfo*)listctrl->GetItemData(index);
return pli->m_Handler->CreateEditPanel(parent, pli);
}
wxArrayString& NodeHandler::GetChildTypes()
{
if (m_ChildTypes.IsEmpty())
{
wxString basetype = m_NodeInfo->ChildType;
for (size_t i = 0; i < s_AllNodes->GetCount(); i++)
{
NodeInfo &ni = (*s_AllNodes)[i];
if (ni.Node == basetype && !ni.Abstract)
m_ChildTypes.Add(ni.Node);
if (ni.DerivedFrom.Index(basetype) != wxNOT_FOUND && !ni.Abstract)
m_ChildTypes.Add(ni.Node);
}
m_ChildTypes.Sort();
}
return m_ChildTypes;
}
void NodeHandler::InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before)
{
delete node;
wxLogError(_("Cannot insert child into this type of node!"));
}
wxTreeItemId NodeHandlerPanel::CreateTreeNode(wxTreeCtrl *treectrl,
wxTreeItemId parent,
wxXmlNode *node)
{
wxTreeItemId root = NodeHandler::CreateTreeNode(treectrl, parent, node);
wxXmlNode *n = XmlFindNode(node, "children");
if (n) n = n->GetChildren();
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE)
EditorFrame::Get()->CreateTreeNode(treectrl, root, n);
n = n->GetNext();
}
treectrl->Expand(root);
return root;
}
void NodeHandlerPanel::InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before)
{
wxXmlNode *cnd = XmlFindNode(parent, "children");
if (cnd == NULL)
{
cnd = new wxXmlNode(wxXML_ELEMENT_NODE, "children");
parent->AddChild(cnd);
}
if (insert_before)
cnd->InsertChild(node, insert_before);
else
cnd->AddChild(node);
EditorFrame::Get()->NotifyChanged(CHANGED_TREE);
}
void NodeHandlerSizer::InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before)
{
wxXmlNode *cnd = XmlFindNode(parent, "children");
if (cnd == NULL)
{
cnd = new wxXmlNode(wxXML_ELEMENT_NODE, "children");
parent->AddChild(cnd);
}
if (node->GetName() == "spacer")
{
if (insert_before)
cnd->InsertChild(node, insert_before);
else
cnd->AddChild(node);
}
else
{
wxXmlNode *itemnode = new wxXmlNode(wxXML_ELEMENT_NODE, "sizeritem");
wxXmlNode *winnode = new wxXmlNode(wxXML_ELEMENT_NODE, "window");
itemnode->AddChild(winnode);
winnode->AddChild(node);
if (insert_before)
cnd->InsertChild(itemnode, insert_before);
else
cnd->AddChild(itemnode);
}
EditorFrame::Get()->NotifyChanged(CHANGED_TREE);
}
int NodeHandlerSizer::GetTreeIcon(wxXmlNode *node)
{
if (XmlReadValue(node, "orient") == "wxVERTICAL") return 2;
else return 3;
}
wxTreeItemId NodeHandlerSizerItem::CreateTreeNode(wxTreeCtrl *treectrl,
wxTreeItemId parent,
wxXmlNode *node)
{
wxTreeItemId root;
root = EditorFrame::Get()->CreateTreeNode(treectrl, parent, GetRealNode(node));
((XmlTreeData*)treectrl->GetItemData(root))->Node = node;
treectrl->Expand(root);
return root;
}
void NodeHandlerSizerItem::CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node)
{
NodeHandler::CreatePropsList(listctrl, node);
int item = listctrl->GetItemCount();
listctrl->InsertItem(item, "------");
listctrl->SetItemImage(item, 0, 0);
EditorFrame::Get()->CreatePropsList(listctrl, GetRealNode(node));
}
wxString NodeHandlerSizerItem::GetTreeString(wxXmlNode *node)
{
wxXmlNode *n = GetRealNode(node);
return EditorFrame::Get()->FindHandler(n)->GetTreeString(n);
}
int NodeHandlerSizerItem::GetTreeIcon(wxXmlNode *node)
{
wxXmlNode *n = GetRealNode(node);
return EditorFrame::Get()->FindHandler(n)->GetTreeIcon(n);
}
wxXmlNode *NodeHandlerSizerItem::GetRealNode(wxXmlNode *node)
{
wxXmlNode *n = XmlFindNode(node, "window");
if (n) n = n->GetChildren();
while (n)
{
if (n->GetType() == wxXML_ELEMENT_NODE)
return n;
n = n->GetNext();
}
return NULL;
}

View File

@ -0,0 +1,138 @@
/////////////////////////////////////////////////////////////////////////////
// Purpose: XML resources editor
// Author: Vaclav Slavik
// Created: 2000/05/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma interface "nodehnd.h"
#endif
#ifndef _NODEHND_H_
#define _NODEHND_H_
class wxXmlNode;
class wxList;
class wxListCtrl;
class EditorFrame;
#include "wx/treectrl.h"
#include "wx/xml/xml.h"
#include "prophnd.h"
enum HandlerType
{
HANDLER_NONE = 0,
HANDLER_PANEL = 1,
HANDLER_NORMAL,
HANDLER_SIZER,
HANDLER_SIZERITEM
};
class NodeInfo
{
public:
wxString Node;
HandlerType Type;
PropertyInfoArray Props;
wxArrayString DerivedFrom;
bool Abstract;
wxString ChildType;
int Icon;
void Read(const wxString& filename);
};
WX_DECLARE_OBJARRAY(NodeInfo, NodeInfoArray);
class NodeHandler : public wxObject
{
public:
static NodeHandler *CreateFromFile(const wxString& filename, EditorFrame *frame);
NodeHandler(EditorFrame *frame, NodeInfo *ni);
virtual ~NodeHandler();
virtual bool CanHandle(wxXmlNode *node);
virtual wxTreeItemId CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent,
wxXmlNode *node);
virtual void CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node);
virtual int GetTreeIcon(wxXmlNode * WXUNUSED(node)) {return m_NodeInfo->Icon;}
virtual wxString GetTreeString(wxXmlNode *node);
wxPanel *CreatePropEditPanel(wxWindow *parent, wxListCtrl *listctrl, int index);
wxArrayString& GetChildTypes();
virtual void InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before = NULL);
virtual wxXmlNode *GetRealNode(wxXmlNode *node) { return node; }
protected:
NodeInfo *m_NodeInfo;
wxArrayString m_ChildTypes;
static PropertyHandler* s_PropHandlers[PROP_TYPES_CNT];
static int s_RefCnt;
static NodeInfoArray* s_AllNodes;
void CreatePropHandlers();
};
// wxPanel handler
class NodeHandlerPanel : public NodeHandler
{
public:
NodeHandlerPanel(EditorFrame *frame, NodeInfo *ni) : NodeHandler(frame, ni) {}
virtual wxTreeItemId CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent,
wxXmlNode *node);
virtual void InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before = NULL);
};
// wxSizers handler
class NodeHandlerSizer : public NodeHandlerPanel
{
public:
NodeHandlerSizer(EditorFrame *frame, NodeInfo *ni) : NodeHandlerPanel(frame, ni) {}
virtual void InsertNode(wxXmlNode *parent, wxXmlNode *node, wxXmlNode *insert_before = NULL);
virtual int GetTreeIcon(wxXmlNode *node);
};
// item of wxSizer handler
class NodeHandlerSizerItem : public NodeHandler
{
public:
NodeHandlerSizerItem(EditorFrame *frame, NodeInfo *ni) : NodeHandler(frame, ni) {}
virtual wxTreeItemId CreateTreeNode(wxTreeCtrl *treectrl, wxTreeItemId parent,
wxXmlNode *node);
virtual void CreatePropsList(wxListCtrl *listctrl, wxXmlNode *node);
virtual wxString GetTreeString(wxXmlNode *node);
virtual int GetTreeIcon(wxXmlNode *node);
virtual wxXmlNode *GetRealNode(wxXmlNode *node);
};
// Generic handler which handles everything
class NodeHandlerUnknown : public NodeHandler
{
public:
NodeHandlerUnknown(EditorFrame *frame) : NodeHandler(frame, new NodeInfo) {}
virtual bool CanHandle(wxXmlNode *node) { return TRUE; }
};
#endif

View File

@ -0,0 +1,332 @@
/////////////////////////////////////////////////////////////////////////////
// Author: Vaclav Slavik
// Created: 2000/05/05
// RCS-ID: $Id$
// Copyright: (c) 2000 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "prophnd.h"
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "prophnd.h"
#include "wx/xml/xml.h"
#include "wx/wx.h"
#include "wx/arrimpl.cpp"
#include "wx/valtext.h"
#include "wx/tokenzr.h"
#include "wx/checklst.h"
#include "xmlhelpr.h"
#include "editor.h"
WX_DEFINE_OBJARRAY(PropertyInfoArray);
enum
{
ID_EDITCTRL = wxID_HIGHEST + 1000,
ID_XEDIT,
ID_YEDIT,
ID_USEDLG,
ID_BOOLVAL,
ID_CHECKLIST
};
class PropertyPanel : public wxPanel
{
public:
PropertyPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli)
: wxPanel(parent, -1), m_Handler(hnd), m_PLI(pli) {}
void Update(const wxString& value)
{
XmlWriteValue(m_PLI->m_Node, m_PLI->m_PropInfo->Name, value);
m_PLI->m_ListCtrl->SetItemImage(m_PLI->m_Index, 1, 1);
m_PLI->m_ListCtrl->SetItem(m_PLI->m_Index, 1,
m_Handler->GetBriefValue(m_PLI->m_Node, m_PLI->m_PropInfo));
}
protected:
PropertyHandler *m_Handler;
PropsListInfo *m_PLI;
};
int PropertyHandler::CreateListItem(wxListCtrl *listctrl, wxXmlNode *node, PropertyInfo *pi)
{
wxString name, value;
int iconnum;
if (XmlFindNode(node, pi->Name) == NULL) iconnum = 0; else iconnum = 1;
name = pi->Name;
value = GetBriefValue(node, pi);
long pos = listctrl->GetItemCount();
listctrl->InsertItem(pos, name, iconnum);
listctrl->SetItem(pos, 1, value);
return pos;
}
wxString PropertyHandler::GetBriefValue(wxXmlNode *node, PropertyInfo *pi)
{
return XmlReadValue(node, pi->Name);
}
class TextPropPanel : public PropertyPanel
{
public:
TextPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
{
wxSizer *sz = new wxBoxSizer(wxVERTICAL);
wxTextCtrl *tc;
sz->Add(new wxStaticText(this, -1, _("Value:")), 0, wxLEFT, 5);
sz->Add(tc = new wxTextCtrl(this, ID_EDITCTRL, XmlReadValue(pli->m_Node, pli->m_PropInfo->Name)), 0, wxALL|wxEXPAND, 5);
tc->SetFocus();
SetAutoLayout(TRUE);
SetSizer(sz);
Layout();
}
void OnEdit(wxCommandEvent &event)
{
Update(((wxTextCtrl*)event.GetEventObject())->GetValue());
}
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(TextPropPanel, PropertyPanel)
EVT_TEXT(ID_EDITCTRL, TextPropPanel::OnEdit)
END_EVENT_TABLE()
wxPanel *TextPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
{
return new TextPropPanel(parent, this, pli);
}
class CoordPropPanel : public PropertyPanel
{
public:
CoordPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
{
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
wxSizer *sz = new wxBoxSizer(wxHORIZONTAL);
m_ed1 = m_ed2 = NULL; m_chb = NULL;
sz->Add(new wxStaticText(this, -1, _("X:")), 0, wxLEFT|wxRIGHT|wxALIGN_CENTER, 5);
sz->Add(m_ed1 = new wxTextCtrl(this, ID_XEDIT, "",
wxDefaultPosition, wxDefaultSize, 0,
wxTextValidator(wxFILTER_NUMERIC)),
1, wxRIGHT, 5);
m_ed1->SetFocus();
sz->Add(new wxStaticText(this, -1, _("Y:")), 0, wxLEFT|wxRIGHT|wxALIGN_CENTER, 5);
sz->Add(m_ed2 = new wxTextCtrl(this, ID_YEDIT, "",
wxDefaultPosition, wxDefaultSize, 0,
wxTextValidator(wxFILTER_NUMERIC)),
1, wxRIGHT, 5);
sizer->Add(sz, 0, wxEXPAND|wxTOP, 5);
sizer->Add(m_chb = new wxCheckBox(this, ID_USEDLG, _("Use dialog units")), 0, wxLEFT|wxTOP, 5);
SetAutoLayout(TRUE);
SetSizer(sizer);
Layout();
wxString val = XmlReadValue(pli->m_Node, pli->m_PropInfo->Name);
m_chb->SetValue(val.Len()==0 || val[val.Len()-1] == 'd');
m_ed1->SetValue(val.BeforeFirst(','));
m_ed2->SetValue(val.AfterFirst(',').BeforeFirst('d'));
}
void OnEdit(wxCommandEvent &event)
{
wxString val, v1, v2;
if (m_ed1 == NULL || m_ed2 == NULL || m_chb == NULL) return;
v1 = m_ed1->GetValue();
v2 = m_ed2->GetValue();
if (v1.IsEmpty() || v2.IsEmpty()) return;
val = v1 + "," + v2;
if (m_chb->GetValue()) val << 'd';
Update(val);
}
wxTextCtrl *m_ed1, *m_ed2;
wxCheckBox *m_chb;
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(CoordPropPanel, PropertyPanel)
EVT_TEXT(ID_XEDIT, CoordPropPanel::OnEdit)
EVT_TEXT(ID_YEDIT, CoordPropPanel::OnEdit)
EVT_CHECKBOX(ID_USEDLG, CoordPropPanel::OnEdit)
END_EVENT_TABLE()
wxPanel *CoordPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
{
return new CoordPropPanel(parent, this, pli);
}
class BoolPropPanel : public PropertyPanel
{
public:
BoolPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
{
m_chb = NULL;
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(m_chb = new wxCheckBox(this, ID_BOOLVAL, _("On/Yes/True")), 0, wxLEFT|wxTOP, 5);
SetAutoLayout(TRUE);
SetSizer(sizer);
Layout();
m_chb->SetValue(XmlReadValue(pli->m_Node, pli->m_PropInfo->Name) == "1");
}
void OnEdit(wxCommandEvent &event)
{
if (m_chb == NULL) return;
if (m_chb->GetValue()) Update("1");
else Update("0");
}
wxCheckBox *m_chb;
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(BoolPropPanel, PropertyPanel)
EVT_CHECKBOX(ID_BOOLVAL, BoolPropPanel::OnEdit)
END_EVENT_TABLE()
wxPanel *BoolPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
{
return new BoolPropPanel(parent, this, pli);
}
wxString BoolPropertyHandler::GetBriefValue(wxXmlNode *node, PropertyInfo *pi)
{
wxString v = XmlReadValue(node, pi->Name);
if (v.IsEmpty()) return wxEmptyString;
else if (v == "1") return "true";
else return "false";
}
class FlagsPropPanel : public PropertyPanel
{
public:
FlagsPropPanel(wxWindow *parent, PropertyHandler *hnd, PropsListInfo *pli) : PropertyPanel(parent, hnd, pli)
{
m_chl = NULL;
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(m_chl = new wxCheckListBox(this, ID_CHECKLIST), 1, wxEXPAND|wxALL, 5);
SetAutoLayout(TRUE);
SetSizer(sizer);
Layout();
{
wxStringTokenizer tkn(pli->m_PropInfo->MoreInfo, ",");
wxString s;
while (tkn.HasMoreTokens())
{
s = tkn.GetNextToken();
m_chl->Append(s);
m_flags.Add(s);
}
}
{
wxStringTokenizer tkn(XmlReadValue(pli->m_Node, pli->m_PropInfo->Name), "| ");
int index;
while (tkn.HasMoreTokens())
{
index = m_flags.Index(tkn.GetNextToken());
if (index != wxNOT_FOUND)
m_chl->Check(index);
}
}
}
void OnEdit(wxCommandEvent &event)
{
wxString s;
bool first = TRUE;
for (size_t i = 0; i < m_flags.GetCount(); i++)
{
if (m_chl->IsChecked(i))
{
if (!first) s << '|';
s << m_flags[i];
first = FALSE;
}
}
Update(s);
if (m_PLI->m_PropInfo->Name == "orient")
// FIXME - dirty hack related to sizers
EditorFrame::Get()->NotifyChanged(CHANGED_TREE_SELECTED_ICON);
}
wxCheckListBox *m_chl;
wxArrayString m_flags;
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(FlagsPropPanel, PropertyPanel)
EVT_CHECKLISTBOX(ID_CHECKLIST, FlagsPropPanel::OnEdit)
END_EVENT_TABLE()
wxPanel *FlagsPropertyHandler::CreateEditPanel(wxWindow *parent, PropsListInfo *pli)
{
return new FlagsPropPanel(parent, this, pli);
}

Some files were not shown because too many files have changed in this diff Show More