Main Page   Modules   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

Fl_XmlNode.h

00001 #ifndef _FL_XMLNODE_H_
00002 #define _FL_XMLNODE_H_
00003 
00004 #include <efltk/Fl_Buffer.h>
00005 #include <efltk/Fl_Map.h>
00006 #include "Fl_XmlNode_List.h"
00007 
00008 class Fl_XmlDoc;
00009 class Fl_XmlNode;
00010 
00015 
00019 class Fl_XmlAttributes : public Fl_String_String_Map {
00020 public:
00021     typedef Fl_String_String_Iterator Iterator;
00022 
00026     Fl_XmlAttributes() { }
00027 
00032     Fl_XmlAttributes& operator = (const Fl_XmlAttributes& src);
00033 
00039     bool has_attribute(const char *attr) const { return contains(attr); }
00040 
00047     Fl_String &get_attribute(const char *attr) const { return get_value(attr); }
00048 
00055     void set_attribute(const char *attr, const char *value) { set_value(attr, value); }
00056 
00063     void set_attribute(const char *attr, const Fl_String &value) { set_value(attr, value); }
00064 };
00065 
00067 class Fl_XmlNode
00068 {    
00069 public:
00071     enum NodeTypes {        
00072         DOM_DOCUMENT = 1,   
00073         DOM_ELEMENT,        
00074         DOM_PI,             
00075         DOM_TEXT,           
00076         DOM_CDATA_SECTION,  
00077         DOM_COMMENT         
00078     };
00079 
00083     virtual ~Fl_XmlNode();
00084 
00088     virtual void clear();
00089 
00094     Fl_XmlNode *parent() const { return m_parent; }
00095 
00099     Fl_XmlDoc *document() const { return m_document; }
00100 
00104     int type() const { return m_nodetype; }
00105 
00107     bool is_document()      const { return (type()==DOM_DOCUMENT);  }
00109     bool is_element()       const { return (type()==DOM_ELEMENT); }
00111     bool is_leaf()          const { return (type()==DOM_ELEMENT) && !has_child_nodes(); }
00113     bool is_pi()            const { return (type()==DOM_PI); }
00115     bool is_comment()       const { return (type()==DOM_COMMENT); }
00117     bool is_text()          const { return (type()==DOM_TEXT); }
00119     bool is_cdata_section() const { return (type()==DOM_CDATA_SECTION); }
00120 
00133     const Fl_String &name() const { return m_name; }
00135     void name(const Fl_String &name) { m_name = name; }
00137     void name(const char *name) { m_name = name; }
00138 
00151     Fl_String &value() { return m_value; }
00152 
00158     void value(const Fl_String &new_value) { m_value = new_value; }
00159 
00165     void value(const char *new_value) { m_value = new_value; }
00166 
00172     void text(Fl_String &ret);
00173 
00179     Fl_XmlNode *child(const char *name, bool recursive=true) const;
00180 
00185     Fl_XmlNode_List nodes(const char *name);
00186 
00192     Fl_XmlNode *clone_node(bool deep=false);
00193 
00199     Fl_XmlNode *remove_child(Fl_XmlNode *old_child);
00200     
00206     Fl_XmlNode *replace_child(Fl_XmlNode *new_child, Fl_XmlNode *old_child);
00207 
00213     Fl_XmlNode *append_child(Fl_XmlNode *new_child);
00214 
00221     Fl_XmlNode *insert_before(Fl_XmlNode *new_child, Fl_XmlNode *ref_child);                                         
00222     
00224     // Child node access
00225 
00229     const Fl_XmlNode_List &child_nodes() const { return m_child_nodes; }
00230 
00234     unsigned children() const { return m_child_nodes.size(); }
00235 
00239     bool has_child_nodes() const { return m_child_nodes.size()>0; }
00240 
00244     Fl_XmlNode *child(int index) const { return m_child_nodes.item(index); }
00245 
00247     // Attributes
00248 
00249     /*
00250      * Returns reference to attribute map.
00251      * @see Fl_XmlAttributes
00252      */
00253     const Fl_XmlAttributes &attributes() const { return m_attributes; }
00254 
00258     bool has_attributes() const { return (m_attributes.size()>0); }
00259 
00264     bool has_attribute(const char *attr) const { return m_attributes.has_attribute(attr); }
00265 
00272     Fl_String &get_attribute(const char *attr) const { return m_attributes.get_attribute(attr); }
00273     
00280     void set_attribute(const char *attr, const char *value) { m_attributes.set_attribute(attr, value); }
00281     
00288     void set_attribute(const char *attr, const Fl_String &value) { m_attributes.set_attribute(attr, value); }
00289 
00295     virtual void save(Fl_Buffer &buffer, int indent=0);
00296 
00297 protected:
00298 
00299     Fl_String m_name;
00300     Fl_String m_value;
00301 
00302     // Attributes of the tag
00303     Fl_XmlAttributes m_attributes;
00304 
00305     // Nodetype
00306     uchar m_nodetype;
00307 
00308     // Document pointer
00309     Fl_XmlDoc *m_document;
00310     
00311     // Parent pointer
00312     Fl_XmlNode *m_parent;
00313 
00314     // List of subnodes
00315     Fl_XmlNode_List m_child_nodes;  
00316 
00317 private:
00318     friend class Fl_XmlParser;
00319     friend class Fl_XmlDoc;
00320 
00321     //Needed by Fl_XmlParser
00322     void parent(Fl_XmlNode *p) { m_parent = p; }
00323     void type(int type) { m_nodetype = (uchar)type; }
00324     Fl_XmlNode(Fl_XmlDoc *doc); 
00325 
00326     //Needed by Fl_XmlDoc
00327     Fl_XmlNode(const Fl_String &name, int type, Fl_XmlDoc *doc) { m_name = name; m_nodetype = (uchar)type; m_document = doc; m_parent = 0; }
00328 
00329     // Un-implement these.    
00330     Fl_XmlNode(const Fl_XmlNode &node) { }
00331     Fl_XmlNode& operator = (const Fl_XmlNode& s) { return *this; }
00332 };
00333 
00334 #define FL_XML_TYPE_DOC             Fl_XmlNode::DOM_DOCUMENT
00335 #define FL_XML_TYPE_ELEMENT         Fl_XmlNode::DOM_ELEMENT
00336 #define FL_XML_TYPE_PI              Fl_XmlNode::DOM_PI
00337 #define FL_XML_TYPE_TEXT            Fl_XmlNode::DOM_TEXT
00338 #define FL_XML_TYPE_CDATA_SECTION   Fl_XmlNode::DOM_CDATA_SECTION
00339 #define FL_XML_TYPE_COMMENT         Fl_XmlNode::DOM_COMMENT
00340 
00343 #endif

Generated on Thu Jul 31 15:33:45 2003 for eFLTK by doxygen1.2.15