]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/xrc/xmlres.h
Use kCGBlendModeExclusion for wxCOMPOSITION_XOR operation.
[wxWidgets.git] / include / wx / xrc / xmlres.h
index e8d1424bd0bf858c2439af80315caa6c9b121291..23cbea1c518e9decce971d756b5981c06d3921e5 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "wx/string.h"
 #include "wx/dynarray.h"
+#include "wx/arrstr.h"
 #include "wx/datetime.h"
 #include "wx/list.h"
 #include "wx/gdicmn.h"
 #include "wx/icon.h"
 #include "wx/artprov.h"
 #include "wx/colour.h"
-#include "wx/animate.h"
-
-#include "wx/xml/xml.h"
-
-class WXDLLEXPORT wxMenu;
-class WXDLLEXPORT wxMenuBar;
-class WXDLLEXPORT wxDialog;
-class WXDLLEXPORT wxPanel;
-class WXDLLEXPORT wxWindow;
-class WXDLLEXPORT wxFrame;
-class WXDLLEXPORT wxToolBar;
-
-class WXDLLIMPEXP_XRC wxXmlResourceHandler;
-class WXDLLIMPEXP_XRC wxXmlSubclassFactory;
-class WXDLLIMPEXP_XRC wxXmlSubclassFactoriesList;
+#include "wx/vector.h"
+
+#include "wx/xrc/xmlreshandler.h"
+
+class WXDLLIMPEXP_FWD_BASE wxFileName;
+
+class WXDLLIMPEXP_FWD_CORE wxIconBundle;
+class WXDLLIMPEXP_FWD_CORE wxImageList;
+class WXDLLIMPEXP_FWD_CORE wxMenu;
+class WXDLLIMPEXP_FWD_CORE wxMenuBar;
+class WXDLLIMPEXP_FWD_CORE wxDialog;
+class WXDLLIMPEXP_FWD_CORE wxPanel;
+class WXDLLIMPEXP_FWD_CORE wxWindow;
+class WXDLLIMPEXP_FWD_CORE wxFrame;
+class WXDLLIMPEXP_FWD_CORE wxToolBar;
+
+class WXDLLIMPEXP_FWD_XML wxXmlDocument;
+class WXDLLIMPEXP_FWD_XML wxXmlNode;
+class WXDLLIMPEXP_FWD_XRC wxXmlSubclassFactory;
+class wxXmlSubclassFactories;
 class wxXmlResourceModule;
-
+class wxXmlResourceDataRecords;
 
 // These macros indicate current version of XML resources (this information is
 // encoded in root node of XRC file as "version" property).
@@ -59,7 +65,7 @@ class wxXmlResourceModule;
 #define WX_XMLRES_CURRENT_VERSION_MINOR            5
 #define WX_XMLRES_CURRENT_VERSION_RELEASE          3
 #define WX_XMLRES_CURRENT_VERSION_REVISION         0
-#define WX_XMLRES_CURRENT_VERSION_STRING       _T("2.5.3.0")
+#define WX_XMLRES_CURRENT_VERSION_STRING       wxT("2.5.3.0")
 
 #define WX_XMLRES_CURRENT_VERSION \
                 (WX_XMLRES_CURRENT_VERSION_MAJOR * 256*256*256 + \
@@ -67,28 +73,6 @@ class wxXmlResourceModule;
                  WX_XMLRES_CURRENT_VERSION_RELEASE * 256 + \
                  WX_XMLRES_CURRENT_VERSION_REVISION)
 
-class WXDLLIMPEXP_XRC wxXmlResourceDataRecord
-{
-public:
-    wxXmlResourceDataRecord() : Doc(NULL) {
-#if wxUSE_DATETIME
-        Time = wxDateTime::Now();
-#endif
-    }
-    ~wxXmlResourceDataRecord() {delete Doc;}
-
-    wxString File;
-    wxXmlDocument *Doc;
-#if wxUSE_DATETIME
-    wxDateTime Time;
-#endif
-};
-
-
-WX_DECLARE_USER_EXPORTED_OBJARRAY(wxXmlResourceDataRecord,
-                                  wxXmlResourceDataRecords,
-                                  WXDLLIMPEXP_XRC);
-
 enum wxXmlResourceFlags
 {
     wxXRC_USE_LOCALE     = 1,
@@ -128,12 +112,16 @@ public:
     // Destructor.
     virtual ~wxXmlResource();
 
-    wxXmlNode *GetFirstRoot();
-
     // Loads resources from XML files that match given filemask.
-    // This method understands VFS (see filesys.h).
+    // This method understands wxFileSystem URLs if wxUSE_FILESYS.
     bool Load(const wxString& filemask);
 
+    // Loads resources from single XRC file.
+    bool LoadFile(const wxFileName& file);
+
+    // Loads all XRC files from a directory.
+    bool LoadAllFiles(const wxString& dirname);
+
     // Unload resource from the given XML file (wildcards not allowed)
     bool Unload(const wxString& filename);
 
@@ -149,7 +137,7 @@ public:
     // code for all controls used within the resource.
     void AddHandler(wxXmlResourceHandler *handler);
 
-    // Add a new handler at the begining of the handler list
+    // Add a new handler at the beginning of the handler list
     void InsertHandler(wxXmlResourceHandler *handler);
 
     // Removes all handlers
@@ -200,13 +188,40 @@ public:
     // Load an object from the resource specifying both the resource name and
     // the classname.  This lets you load nonstandard container windows.
     wxObject *LoadObject(wxWindow *parent, const wxString& name,
-                         const wxString& classname);
+                         const wxString& classname)
+    {
+        return DoLoadObject(parent, name, classname, false /* !recursive */);
+    }
 
     // Load an object from the resource specifying both the resource name and
     // the classname.  This form lets you finish the creation of an existing
     // instance.
-    bool LoadObject(wxObject *instance, wxWindow *parent, const wxString& name,
-                    const wxString& classname);
+    bool LoadObject(wxObject *instance,
+                    wxWindow *parent,
+                    const wxString& name,
+                    const wxString& classname)
+    {
+        return DoLoadObject(instance, parent, name, classname, false);
+    }
+
+    // These versions of LoadObject() look for the object with the given name
+    // recursively (breadth first) and can be used to instantiate an individual
+    // control defined anywhere in an XRC file. No check is done that the name
+    // is unique, it's up to the caller to ensure this.
+    wxObject *LoadObjectRecursively(wxWindow *parent,
+                                    const wxString& name,
+                                    const wxString& classname)
+    {
+        return DoLoadObject(parent, name, classname, true /* recursive */);
+    }
+
+    bool LoadObjectRecursively(wxObject *instance,
+                               wxWindow *parent,
+                               const wxString& name,
+                               const wxString& classname)
+    {
+        return DoLoadObject(instance, parent, name, classname, true);
+    }
 
     // Loads a bitmap resource from a file.
     wxBitmap LoadBitmap(const wxString& name);
@@ -225,7 +240,20 @@ public:
     // with a number. If value_if_not_found == wxID_NONE, the number is obtained via
     // wxWindow::NewControlId(). Otherwise value_if_not_found is used.
     // Macro XRCID(name) is provided for convenient use in event tables.
-    static int GetXRCID(const wxChar *str_id, int value_if_not_found = wxID_NONE);
+    static int GetXRCID(const wxString& str_id, int value_if_not_found = wxID_NONE)
+        { return DoGetXRCID(str_id.mb_str(), value_if_not_found); }
+
+    // version for internal use only
+    static int DoGetXRCID(const char *str_id, int value_if_not_found = wxID_NONE);
+
+
+    // Find the string ID with the given numeric value, returns an empty string
+    // if no such ID is found.
+    //
+    // Notice that unlike GetXRCID(), which is fast, this operation is slow as
+    // it checks all the IDs used in XRC.
+    static wxString FindXRCIDById(int numId);
+
 
     // Returns version information (a.b.c.d = d+ 256*c + 256^2*b + 256^3*a).
     long GetVersion() const { return m_version; }
@@ -236,7 +264,7 @@ public:
         { return GetVersion() -
                  (major*256*256*256 + minor*256*256 + release*256 + revision); }
 
-//// Singleton accessors.
+    //// Singleton accessors.
 
     // Gets the global resources object or creates one if none exists.
     static wxXmlResource *Get();
@@ -254,22 +282,69 @@ public:
     const wxString& GetDomain() const { return m_domain; }
     void SetDomain(const wxString& domain);
 
+
+    // This function returns the wxXmlNode containing the definition of the
+    // object with the given name or NULL.
+    //
+    // It can be used to access additional information defined in the XRC file
+    // and not used by wxXmlResource itself.
+    const wxXmlNode *GetResourceNode(const wxString& name) const
+        { return GetResourceNodeAndLocation(name, wxString(), true); }
+
 protected:
+    // reports input error at position 'context'
+    void ReportError(const wxXmlNode *context, const wxString& message);
+
+    // override this in derived class to customize errors reporting
+    virtual void DoReportError(const wxString& xrcFile, const wxXmlNode *position,
+                               const wxString& message);
+
+    // Load the contents of a single file and returns its contents as a new
+    // wxXmlDocument (which will be owned by caller) on success or NULL.
+    wxXmlDocument *DoLoadFile(const wxString& file);
+
     // Scans the resources list for unloaded files and loads them. Also reloads
     // files that have been modified since last loading.
     bool UpdateResources();
 
-    // Finds a resource (calls UpdateResources) and returns a node containing it.
-    wxXmlNode *FindResource(const wxString& name, const wxString& classname, bool recursive = false);
 
-    // Helper function: finds a resource (calls UpdateResources) and returns a node containing it.
-    wxXmlNode *DoFindResource(wxXmlNode *parent, const wxString& name, const wxString& classname, bool recursive);
+    // Common implementation of GetResourceNode() and FindResource(): searches
+    // all top-level or all (if recursive == true) nodes if all loaded XRC
+    // files and returns the node, if found, as well as the path of the file it
+    // was found in if path is non-NULL
+    wxXmlNode *GetResourceNodeAndLocation(const wxString& name,
+                                          const wxString& classname,
+                                          bool recursive = false,
+                                          wxString *path = NULL) const;
+
+
+    // Note that these functions are used outside of wxWidgets itself, e.g.
+    // there are several known cases of inheriting from wxXmlResource just to
+    // be able to call FindResource() so we keep them for compatibility even if
+    // their names are not really consistent with GetResourceNode() public
+    // function and FindResource() is also non-const because it changes the
+    // current path of m_curFileSystem to ensure that relative paths work
+    // correctly when CreateResFromNode() is called immediately afterwards
+    // (something const public function intentionally does not do)
+
+    // Returns the node containing the resource with the given name and class
+    // name unless it's empty (then any class matches) or NULL if not found.
+    wxXmlNode *FindResource(const wxString& name, const wxString& classname,
+                            bool recursive = false);
+
+    // Helper function used by FindResource() to look under the given node.
+    wxXmlNode *DoFindResource(wxXmlNode *parent, const wxString& name,
+                              const wxString& classname, bool recursive) const;
 
     // Creates a resource from information in the given node
     // (Uses only 'handlerToUse' if != NULL)
     wxObject *CreateResFromNode(wxXmlNode *node, wxObject *parent,
                                 wxObject *instance = NULL,
-                                wxXmlResourceHandler *handlerToUse = NULL);
+                                wxXmlResourceHandler *handlerToUse = NULL)
+    {
+        return node ? DoCreateResFromNode(*node, parent, instance, handlerToUse)
+                    : NULL;
+    }
 
     // Helper of Load() and Unload(): returns the URL corresponding to the
     // given file if it's indeed a file, otherwise returns the original string
@@ -282,12 +357,34 @@ protected:
     static bool IsArchive(const wxString& filename);
 #endif // wxUSE_FILESYSTEM
 
+private:
+    wxXmlResourceDataRecords& Data() { return *m_data; }
+    const wxXmlResourceDataRecords& Data() const { return *m_data; }
+
+    // the real implementation of CreateResFromNode(): this should be only
+    // called if node is non-NULL
+    wxObject *DoCreateResFromNode(wxXmlNode& node,
+                                  wxObject *parent,
+                                  wxObject *instance,
+                                  wxXmlResourceHandler *handlerToUse = NULL);
+
+    // common part of LoadObject() and LoadObjectRecursively()
+    wxObject *DoLoadObject(wxWindow *parent,
+                           const wxString& name,
+                           const wxString& classname,
+                           bool recursive);
+    bool DoLoadObject(wxObject *instance,
+                      wxWindow *parent,
+                      const wxString& name,
+                      const wxString& classname,
+                      bool recursive);
+
 private:
     long m_version;
 
     int m_flags;
-    wxList m_handlers;
-    wxXmlResourceDataRecords m_data;
+    wxVector<wxXmlResourceHandler*> m_handlers;
+    wxXmlResourceDataRecords *m_data;
 #if wxUSE_FILESYSTEM
     wxFileSystem m_curFileSystem;
     wxFileSystem& GetCurFileSystem() { return m_curFileSystem; }
@@ -296,10 +393,12 @@ private:
     // domain to pass to translation functions, if any.
     wxString m_domain;
 
-    friend class wxXmlResourceHandler;
+    friend class wxXmlResourceHandlerImpl;
     friend class wxXmlResourceModule;
+    friend class wxIdRangeManager;
+    friend class wxIdRange;
 
-    static wxXmlSubclassFactoriesList *ms_subclassFactories;
+    static wxXmlSubclassFactories *ms_subclassFactories;
 
     // singleton instance:
     static wxXmlResource *ms_instance;
@@ -318,7 +417,7 @@ private:
 //    END_EVENT_TABLE()
 
 #define XRCID(str_id) \
-    wxXmlResource::GetXRCID(wxT(str_id))
+    wxXmlResource::DoGetXRCID(str_id)
 
 
 // This macro returns pointer to particular control in dialog
@@ -332,18 +431,32 @@ private:
 #define XRCCTRL(window, id, type) \
     (wxStaticCast((window).FindWindow(XRCID(id)), type))
 
-// wxXmlResourceHandler is an abstract base class for resource handlers
-// capable of creating a control from an XML node.
+// This macro returns pointer to sizer item
+// Example:
+//
+// <object class="spacer" name="area">
+//   <size>400, 300</size>
+// </object>
+//
+// wxSizerItem* item = XRCSIZERITEM(*this, "area")
+
+#define XRCSIZERITEM(window, id) \
+    ((window).GetSizer() ? (window).GetSizer()->GetItemById(XRCID(id)) : NULL)
+
 
-class WXDLLIMPEXP_XRC wxXmlResourceHandler : public wxObject
+// wxXmlResourceHandlerImpl is the back-end of the wxXmlResourceHander class to
+// really implementing all its functionality. It is defined in the "xrc"
+// library unlike wxXmlResourceHandler itself which is defined in "core" to
+// allow inheriting from it in the code from the other libraries too.
+
+class WXDLLIMPEXP_XRC wxXmlResourceHandlerImpl : public wxXmlResourceHandlerImplBase
 {
-DECLARE_ABSTRACT_CLASS(wxXmlResourceHandler)
 public:
     // Constructor.
-    wxXmlResourceHandler();
+    wxXmlResourceHandlerImpl(wxXmlResourceHandler *handler);
 
     // Destructor.
-    virtual ~wxXmlResourceHandler() {}
+    virtual ~wxXmlResourceHandlerImpl() {}
 
     // Creates an object (menu, dialog, control, ...) from an XML node.
     // Should check for validity.
@@ -354,40 +467,19 @@ public:
     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
-    // a resource from it, false otherwise.
-    virtual bool CanHandle(wxXmlNode *node) = 0;
-
-    // Sets the parent resource.
-    void SetParentResource(wxXmlResource *res) { m_resource = res; }
-
-protected:
-    wxXmlResource *m_resource;
-    wxArrayString m_styleNames;
-    wxArrayInt m_styleValues;
-
-    // Variables (filled by CreateResource)
-    wxXmlNode *m_node;
-    wxString m_class;
-    wxObject *m_parent, *m_instance;
-    wxWindow *m_parentAsWindow;
 
     // --- Handy methods:
 
     // Returns true if the node has a property class equal to classname,
     // e.g. <object class="wxDialog">.
-    bool IsOfClass(wxXmlNode *node, const wxString& classname);
+    bool IsOfClass(wxXmlNode *node, const wxString& classname) const;
 
     // 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);
+    wxString GetNodeContent(const wxXmlNode *node);
 
     // Check to see if a parameter exists.
     bool HasParam(const wxString& param);
@@ -398,12 +490,8 @@ protected:
     // Finds the parameter value or returns the empty string.
     wxString GetParamValue(const wxString& param);
 
-    // Add a style flag (e.g. wxMB_DOCKABLE) to the list of flags
-    // understood by this handler.
-    void AddStyle(const wxString& name, int value);
-
-    // Add styles common to all wxWindow-derived classes.
-    void AddWindowStyles();
+    // Returns the parameter value from given node.
+    wxString GetParamValue(const wxXmlNode* node);
 
     // Gets style flags from text in form "flag | flag2| flag3 |..."
     // Only understands flags added with AddStyle
@@ -444,23 +532,47 @@ protected:
     wxCoord GetDimension(const wxString& param, wxCoord defaultv = 0,
                          wxWindow *windowToUse = NULL);
 
+    // Gets a direction, complains if the value is invalid.
+    wxDirection GetDirection(const wxString& param, wxDirection dir = wxLEFT);
+
     // Gets a bitmap.
     wxBitmap GetBitmap(const wxString& param = wxT("bitmap"),
                        const wxArtClient& defaultArtClient = wxART_OTHER,
                        wxSize size = wxDefaultSize);
 
+    // Gets a bitmap from an XmlNode.
+    wxBitmap GetBitmap(const wxXmlNode* node,
+                       const wxArtClient& defaultArtClient = wxART_OTHER,
+                       wxSize size = wxDefaultSize);
+
     // Gets an icon.
     wxIcon GetIcon(const wxString& param = wxT("icon"),
                    const wxArtClient& defaultArtClient = wxART_OTHER,
                    wxSize size = wxDefaultSize);
 
+    // Gets an icon from an XmlNode.
+    wxIcon GetIcon(const wxXmlNode* node,
+                   const wxArtClient& defaultArtClient = wxART_OTHER,
+                   wxSize size = wxDefaultSize);
+
+    // Gets an icon bundle.
+    wxIconBundle GetIconBundle(const wxString& param,
+                               const wxArtClient& defaultArtClient = wxART_OTHER);
+
+    // Gets an image list.
+    wxImageList *GetImageList(const wxString& param = wxT("imagelist"));
+
 #if wxUSE_ANIMATIONCTRL
     // Gets an animation.
-    wxAnimation GetAnimation(const wxString& param = wxT("animation"));
+    wxAnimation* GetAnimation(const wxString& param = wxT("animation"));
 #endif
 
     // Gets a font.
-    wxFont GetFont(const wxString& param = wxT("font"));
+    wxFont GetFont(const wxString& param = wxT("font"), wxWindow* parent = NULL);
+
+    // Gets the value of a boolean attribute (only "0" and "1" are valid values)
+    bool GetBoolAttr(const wxString& attr, bool defaultv);
+
 
     // Sets common window options.
     void SetupWindow(wxWindow *wnd);
@@ -473,20 +585,24 @@ protected:
 
     // Creates a resource from a node.
     wxObject *CreateResFromNode(wxXmlNode *node,
-                                wxObject *parent, wxObject *instance = NULL)
-        { return m_resource->CreateResFromNode(node, parent, instance); }
+                                wxObject *parent, wxObject *instance = NULL);
 
     // helper
 #if wxUSE_FILESYSTEM
-    wxFileSystem& GetCurFileSystem() { return m_resource->GetCurFileSystem(); }
+    wxFileSystem& GetCurFileSystem();
 #endif
+
+    // reports input error at position 'context'
+    void ReportError(wxXmlNode *context, const wxString& message);
+    // reports input error at m_node
+    void ReportError(const wxString& message);
+    // reports input error when parsing parameter with given name
+    void ReportParamError(const wxString& param, const wxString& message);
 };
 
 
 // Programmer-friendly macros for writing XRC handlers:
 
-#define XRC_ADD_STYLE(style) AddStyle(wxT(#style), style)
-
 #define XRC_MAKE_INSTANCE(variable, classname) \
    classname *variable = NULL; \
    if (m_instance) \