[lasem] svg: move element registering by id to SvgDocument.



commit 1575002237599ff92eec7ae3501729664dcc7bd8
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Tue Apr 2 23:19:42 2013 +0200

    svg: move element registering by id to SvgDocument.
    
    It's specific to SVG, no need to have this at the DOM level.
    I know it breaks the API. But hopefully nobody cares.

 docs/reference/lasem/lasem-sections.txt |    2 -
 src/lsmdomdocument.c                    |   49 -------------------
 src/lsmdomdocument.h                    |    7 ---
 src/lsmsvgdocument.c                    |   77 ++++++++++++++++++++++++++++--
 src/lsmsvgdocument.h                    |    6 ++
 src/lsmsvgelement.c                     |    4 +-
 src/lsmsvglineargradientelement.c       |   12 ++--
 src/lsmsvgpatternelement.c              |   12 ++--
 src/lsmsvgradialgradientelement.c       |   12 ++--
 src/lsmsvguseelement.c                  |    4 +-
 10 files changed, 99 insertions(+), 86 deletions(-)
---
diff --git a/docs/reference/lasem/lasem-sections.txt b/docs/reference/lasem/lasem-sections.txt
index c86915e..9e1d036 100644
--- a/docs/reference/lasem/lasem-sections.txt
+++ b/docs/reference/lasem/lasem-sections.txt
@@ -105,8 +105,6 @@ lsm_dom_document_save_to_url
 lsm_dom_document_get_document_element
 lsm_dom_document_create_element
 lsm_dom_document_create_text_node
-lsm_dom_document_get_element_by_id
-lsm_dom_document_register_element
 lsm_dom_document_create_view
 lsm_dom_document_get_url
 lsm_dom_document_set_url
diff --git a/src/lsmdomdocument.c b/src/lsmdomdocument.c
index fdba500..f112e51 100644
--- a/src/lsmdomdocument.c
+++ b/src/lsmdomdocument.c
@@ -139,50 +139,6 @@ lsm_dom_document_create_view (LsmDomDocument *self)
        return LSM_DOM_DOCUMENT_GET_CLASS (self)->create_view (self);
 }
 
-/**
- * lsm_dom_document_get_element_by_id:
- * @self: a #LsmDomDocument
- * @id: id of the element to find
- *
- * Returns: (transfer none): the requested element, NULL if not found.
- */
-
-LsmDomElement *
-lsm_dom_document_get_element_by_id (LsmDomDocument *self, const char *id)
-{
-       g_return_val_if_fail (LSM_IS_DOM_DOCUMENT (self), NULL);
-       g_return_val_if_fail (id != NULL, NULL);
-
-       lsm_debug_dom ("[LsmDomDocument::get_element_by_id] Lookup '%s'", id);
-
-       return g_hash_table_lookup (self->ids, id);
-}
-
-void
-lsm_dom_document_register_element (LsmDomDocument *self, LsmDomElement *element, const char *id)
-{
-       char *old_id;
-
-       g_return_if_fail (LSM_IS_DOM_DOCUMENT (self));
-
-       old_id = g_hash_table_lookup (self->elements, element);
-       if (old_id != NULL) {
-               lsm_debug_dom ("[LsmDomDocument::register_element] Unregister '%s'", old_id);
-
-               g_hash_table_remove (self->elements, element);
-               g_hash_table_remove (self->ids, old_id);
-       }
-
-       if (id != NULL) {
-               char *new_id = g_strdup (id);
-
-               lsm_debug_dom ("[LsmDomDocument::register_element] Register '%s'", id);
-
-               g_hash_table_replace (self->ids, new_id, element);
-               g_hash_table_replace (self->elements, element, new_id);
-       }
-}
-
 const char *
 lsm_dom_document_get_url (LsmDomDocument *self)
 {
@@ -265,8 +221,6 @@ lsm_dom_document_get_href_data (LsmDomDocument *self, const char *href, gsize *s
 static void
 lsm_dom_document_init (LsmDomDocument *document)
 {
-       document->ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
-       document->elements = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL);
 }
 
 static void
@@ -274,9 +228,6 @@ lsm_dom_document_finalize (GObject *object)
 {
        LsmDomDocument *document = LSM_DOM_DOCUMENT (object);
 
-       g_hash_table_unref (document->elements);
-       g_hash_table_unref (document->ids);
-
        g_free (document->url);
 
        parent_class->finalize (object);
diff --git a/src/lsmdomdocument.h b/src/lsmdomdocument.h
index 597631a..bbea1be 100644
--- a/src/lsmdomdocument.h
+++ b/src/lsmdomdocument.h
@@ -43,11 +43,7 @@ typedef struct _LsmDomDocumentClass LsmDomDocumentClass;
 struct _LsmDomDocument {
        LsmDomNode node;
 
-       GHashTable *    ids;
-       GHashTable *    elements;
-
        char *          url;
-
 };
 
 struct _LsmDomDocumentClass {
@@ -65,9 +61,6 @@ GType lsm_dom_document_get_type (void);
 LsmDomElement*         lsm_dom_document_get_document_element   (LsmDomDocument* self);
 LsmDomElement*         lsm_dom_document_create_element         (LsmDomDocument* self, const char *tag_name);
 LsmDomText*    lsm_dom_document_create_text_node       (LsmDomDocument* self, const char *data);
-LsmDomElement *        lsm_dom_document_get_element_by_id      (LsmDomDocument *self, const char *id);
-
-void           lsm_dom_document_register_element       (LsmDomDocument *self, LsmDomElement *element, const 
char *id);
 
 LsmDomView*    lsm_dom_document_create_view            (LsmDomDocument *self);
 
diff --git a/src/lsmsvgdocument.c b/src/lsmsvgdocument.c
index d80c3df..502e227 100644
--- a/src/lsmsvgdocument.c
+++ b/src/lsmsvgdocument.c
@@ -60,6 +60,8 @@
 #include <lsmsvgview.h>
 #include <string.h>
 
+static GObjectClass *parent_class;
+
 /* LsmDomNode implementation */
 
 static gboolean
@@ -73,7 +75,7 @@ lsm_svg_document_can_append_child (LsmDomNode *self, LsmDomNode *child)
 LsmSvgElement *
 lsm_svg_document_get_element_by_url (LsmSvgDocument *document, const char *url)
 {
-       LsmDomElement *element;
+       LsmSvgElement *element;
        char *end;
        char *id;
 
@@ -86,11 +88,11 @@ lsm_svg_document_get_element_by_url (LsmSvgDocument *document, const char *url)
        for (end = id; *end != '\0' && *end != ')'; end++);
        *end = '\0';
 
-       element = lsm_dom_document_get_element_by_id (LSM_DOM_DOCUMENT (document), id);
+       element = lsm_svg_document_get_element_by_id (document, id);
 
        g_free (id);
 
-       return LSM_SVG_ELEMENT (element);
+       return element;
 }
 
 static LsmDomElement *
@@ -196,6 +198,51 @@ lsm_svg_document_create_view (LsmDomDocument *document)
 
 /* LsmSvgDocument implementation */
 
+/**
+ * lsm_svg_document_get_element_by_id:
+ * @self: a #LsmSvgDocument
+ * @id: id of the element to find
+ *
+ * Returns: (transfer none): the requested element, NULL if not found.
+ */
+
+LsmSvgElement *
+lsm_svg_document_get_element_by_id (LsmSvgDocument *self, const char *id)
+{
+       g_return_val_if_fail (LSM_IS_SVG_DOCUMENT (self), NULL);
+       g_return_val_if_fail (id != NULL, NULL);
+
+       lsm_debug_dom ("[LsmSvgDocument::get_element_by_id] Lookup '%s'", id);
+
+       return g_hash_table_lookup (self->ids, id);
+}
+
+void
+lsm_svg_document_register_element (LsmSvgDocument *self, LsmSvgElement *element, const char *id)
+{
+       char *old_id;
+
+       g_return_if_fail (LSM_IS_SVG_DOCUMENT (self));
+       g_return_if_fail (LSM_IS_SVG_ELEMENT (element));
+
+       old_id = g_hash_table_lookup (self->elements, element);
+       if (old_id != NULL) {
+               lsm_debug_dom ("[LsmSvgDocument::register_element] Unregister '%s'", old_id);
+
+               g_hash_table_remove (self->elements, element);
+               g_hash_table_remove (self->ids, old_id);
+       }
+
+       if (id != NULL) {
+               char *new_id = g_strdup (id);
+
+               lsm_debug_dom ("[LsmSvgDocument::register_element] Register '%s'", id);
+
+               g_hash_table_replace (self->ids, new_id, element);
+               g_hash_table_replace (self->elements, element, new_id);
+       }
+}
+
 LsmDomDocument *
 lsm_svg_document_new (void)
 {
@@ -205,6 +252,19 @@ lsm_svg_document_new (void)
 static void
 lsm_svg_document_init (LsmSvgDocument *document)
 {
+       document->ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+       document->elements = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL);
+}
+
+static void
+lsm_svg_document_finalize (GObject *object)
+{
+       LsmSvgDocument *document = LSM_SVG_DOCUMENT (object);
+
+       g_hash_table_unref (document->elements);
+       g_hash_table_unref (document->ids);
+
+       parent_class->finalize (object);
 }
 
 LsmSvgSvgElement *
@@ -216,10 +276,15 @@ lsm_svg_document_get_root_element (const LsmSvgDocument *document)
 /* LsmSvgDocument class */
 
 static void
-lsm_svg_document_class_init (LsmSvgDocumentClass *m_document_class)
+lsm_svg_document_class_init (LsmSvgDocumentClass *this_class)
 {
-       LsmDomNodeClass *d_node_class = LSM_DOM_NODE_CLASS (m_document_class);
-       LsmDomDocumentClass *d_document_class = LSM_DOM_DOCUMENT_CLASS (m_document_class);
+       GObjectClass *object_class = G_OBJECT_CLASS (this_class);
+       LsmDomNodeClass *d_node_class = LSM_DOM_NODE_CLASS (this_class);
+       LsmDomDocumentClass *d_document_class = LSM_DOM_DOCUMENT_CLASS (this_class);
+
+       parent_class = g_type_class_peek_parent (this_class);
+
+       object_class->finalize = lsm_svg_document_finalize;
 
        d_node_class->can_append_child = lsm_svg_document_can_append_child;
 
diff --git a/src/lsmsvgdocument.h b/src/lsmsvgdocument.h
index 6f106d6..6e2961f 100644
--- a/src/lsmsvgdocument.h
+++ b/src/lsmsvgdocument.h
@@ -40,6 +40,9 @@ typedef struct _LsmSvgDocumentClass LsmSvgDocumentClass;
 
 struct _LsmSvgDocument {
        LsmDomDocument  document;
+
+       GHashTable *    ids;
+       GHashTable *    elements;
 };
 
 struct _LsmSvgDocumentClass {
@@ -49,8 +52,11 @@ struct _LsmSvgDocumentClass {
 GType lsm_svg_document_get_type (void);
 
 LsmDomDocument *       lsm_svg_document_new                    (void);
+
 LsmSvgSvgElement *     lsm_svg_document_get_root_element       (const LsmSvgDocument *document);
 LsmSvgElement *        lsm_svg_document_get_element_by_url     (LsmSvgDocument *document, const char *url);
+LsmSvgElement *                lsm_svg_document_get_element_by_id      (LsmSvgDocument *self, const char 
*id);
+void                   lsm_svg_document_register_element       (LsmSvgDocument *self, LsmSvgElement 
*element, const char *id);
 
 G_END_DECLS
 
diff --git a/src/lsmsvgelement.c b/src/lsmsvgelement.c
index 50b60fe..4189e5b 100644
--- a/src/lsmsvgelement.c
+++ b/src/lsmsvgelement.c
@@ -24,7 +24,7 @@
 #include <lsmdebug.h>
 #include <lsmattributes.h>
 #include <lsmproperties.h>
-#include <lsmdomdocument.h>
+#include <lsmsvgdocument.h>
 #include <lsmsvgelement.h>
 #include <lsmsvgtransformable.h>
 #include <lsmsvgpatternelement.h>
@@ -81,7 +81,7 @@ lsm_svg_element_set_attribute (LsmDomElement *self, const char* name, const char
 
                document = lsm_dom_node_get_owner_document (LSM_DOM_NODE (self));
                if (document != NULL)
-                       lsm_dom_document_register_element (document, LSM_DOM_ELEMENT (self), value);
+                       lsm_svg_document_register_element (LSM_SVG_DOCUMENT (document), LSM_SVG_ELEMENT 
(self), value);
        }
 }
 
diff --git a/src/lsmsvglineargradientelement.c b/src/lsmsvglineargradientelement.c
index 447b7c2..1665bc3 100644
--- a/src/lsmsvglineargradientelement.c
+++ b/src/lsmsvglineargradientelement.c
@@ -23,7 +23,7 @@
 
 #include <lsmsvglineargradientelement.h>
 #include <lsmsvgview.h>
-#include <lsmdomdocument.h>
+#include <lsmsvgdocument.h>
 #include <lsmdebug.h>
 #include <stdio.h>
 
@@ -60,13 +60,13 @@ lsm_svg_linear_gradient_element_get_node_name (LsmDomNode *node)
 /* LsmSvgElement implementation */
 
 static LsmSvgGradientElement *
-lsm_svg_linear_gradient_element_inherit_referenced (LsmDomDocument *owner,
+lsm_svg_linear_gradient_element_inherit_referenced (LsmSvgDocument *owner,
                                                    LsmSvgGradientElement *gradient,
                                                    LsmSvgLinearGradientElementAttributes *attributes,
                                                    GSList **elements)
 {
        LsmSvgGradientElement *referenced_gradient = gradient;
-       LsmDomElement *element;
+       LsmSvgElement *element;
 
        *elements = g_slist_prepend (*elements, gradient);
 
@@ -81,7 +81,7 @@ lsm_svg_linear_gradient_element_inherit_referenced (LsmDomDocument *owner,
                if (*id == '#')
                        id++;
 
-               element = lsm_dom_document_get_element_by_id (owner, id);
+               element = lsm_svg_document_get_element_by_id (owner, id);
 
                for (iter = *elements; iter != NULL; iter = iter->next)
                        if (iter->data == element) {
@@ -142,11 +142,11 @@ lsm_svg_linear_gradient_element_create_gradient (LsmSvgElement *self,
 
        if (lsm_attribute_is_defined (&gradient->base.href)) {
                LsmSvgLinearGradientElementAttributes attributes;
-               LsmDomDocument *owner;
+               LsmSvgDocument *owner;
                attributes = default_attributes;
                GSList *elements = NULL;
 
-               owner = lsm_dom_node_get_owner_document (LSM_DOM_NODE (self));
+               owner = LSM_SVG_DOCUMENT (lsm_dom_node_get_owner_document (LSM_DOM_NODE (self)));
 
                referenced_gradient = lsm_svg_linear_gradient_element_inherit_referenced
                        (owner, LSM_SVG_GRADIENT_ELEMENT (gradient), &attributes, &elements);
diff --git a/src/lsmsvgpatternelement.c b/src/lsmsvgpatternelement.c
index 2239d23..efd6f68 100644
--- a/src/lsmsvgpatternelement.c
+++ b/src/lsmsvgpatternelement.c
@@ -24,7 +24,7 @@
 #include <lsmsvgpatternelement.h>
 #include <lsmsvgview.h>
 #include <lsmdebug.h>
-#include <lsmdomdocument.h>
+#include <lsmsvgdocument.h>
 #include <stdio.h>
 
 typedef struct {
@@ -68,13 +68,13 @@ _pattern_element_get_node_name (LsmDomNode *node)
 /* LsmSvgElement implementation */
 
 static LsmSvgPatternElement *
-lsm_svg_pattern_element_inherit_referenced (LsmDomDocument *owner,
+lsm_svg_pattern_element_inherit_referenced (LsmSvgDocument *owner,
                                            LsmSvgPatternElement *pattern,
                                            LsmSvgPatternElementAttributes *attributes,
                                            GSList **elements)
 {
        LsmSvgPatternElement *referenced_pattern = pattern;
-       LsmDomElement *element;
+       LsmSvgElement *element;
 
        *elements = g_slist_prepend (*elements, pattern);
 
@@ -89,7 +89,7 @@ lsm_svg_pattern_element_inherit_referenced (LsmDomDocument *owner,
                if (*id == '#')
                        id++;
 
-               element = lsm_dom_document_get_element_by_id (owner, id);
+               element = lsm_svg_document_get_element_by_id (owner, id);
 
                for (iter = *elements; iter != NULL; iter = iter->next)
                        if (iter->data == element) {
@@ -160,11 +160,11 @@ lsm_svg_pattern_element_render (LsmSvgElement *self, LsmSvgView *view)
 
        if (lsm_attribute_is_defined (&pattern->href)) {
                LsmSvgPatternElementAttributes attributes;
-               LsmDomDocument *owner;
+               LsmSvgDocument *owner;
                attributes = default_attributes;
                GSList *elements = NULL;
 
-               owner = lsm_dom_node_get_owner_document (LSM_DOM_NODE (self));
+               owner = LSM_SVG_DOCUMENT (lsm_dom_node_get_owner_document (LSM_DOM_NODE (self)));
 
                referenced_pattern = lsm_svg_pattern_element_inherit_referenced (owner, pattern,
                                                                                 &attributes, &elements);
diff --git a/src/lsmsvgradialgradientelement.c b/src/lsmsvgradialgradientelement.c
index 5f81dde..6634eb1 100644
--- a/src/lsmsvgradialgradientelement.c
+++ b/src/lsmsvgradialgradientelement.c
@@ -23,7 +23,7 @@
 
 #include <lsmsvgradialgradientelement.h>
 #include <lsmsvgview.h>
-#include <lsmdomdocument.h>
+#include <lsmsvgdocument.h>
 #include <lsmdebug.h>
 #include <stdio.h>
 #include <math.h>
@@ -67,13 +67,13 @@ lsm_svg_radial_gradient_element_get_node_name (LsmDomNode *node)
 /* LsmSvgGradientElement implementation */
 
 static LsmSvgGradientElement *
-lsm_svg_radial_gradient_element_inherit_referenced (LsmDomDocument *owner,
+lsm_svg_radial_gradient_element_inherit_referenced (LsmSvgDocument *owner,
                                                    LsmSvgGradientElement *gradient,
                                                    LsmSvgRadialGradientElementAttributes *attributes,
                                                    GSList **elements)
 {
        LsmSvgGradientElement *referenced_gradient = gradient;
-       LsmDomElement *element;
+       LsmSvgElement *element;
 
        *elements = g_slist_prepend (*elements, gradient);
 
@@ -88,7 +88,7 @@ lsm_svg_radial_gradient_element_inherit_referenced (LsmDomDocument *owner,
                if (*id == '#')
                        id++;
 
-               element = lsm_dom_document_get_element_by_id (owner, id);
+               element = lsm_svg_document_get_element_by_id (owner, id);
 
                for (iter = *elements; iter != NULL; iter = iter->next)
                        if (iter->data == element) {
@@ -159,11 +159,11 @@ lsm_svg_radial_gradient_element_create_gradient (LsmSvgElement *self,
 
        if (lsm_attribute_is_defined (&gradient->base.href)) {
                LsmSvgRadialGradientElementAttributes attributes;
-               LsmDomDocument *owner;
+               LsmSvgDocument *owner;
                attributes = default_attributes;
                GSList *elements = NULL;
 
-               owner = lsm_dom_node_get_owner_document (LSM_DOM_NODE (self));
+               owner = LSM_SVG_DOCUMENT (lsm_dom_node_get_owner_document (LSM_DOM_NODE (self)));
 
                referenced_gradient = lsm_svg_radial_gradient_element_inherit_referenced
                        (owner, LSM_SVG_GRADIENT_ELEMENT (gradient), &attributes, &elements);
diff --git a/src/lsmsvguseelement.c b/src/lsmsvguseelement.c
index 1ed8f69..22adfd3 100644
--- a/src/lsmsvguseelement.c
+++ b/src/lsmsvguseelement.c
@@ -24,7 +24,7 @@
 #include <lsmsvguseelement.h>
 #include <lsmsvgview.h>
 #include <lsmdebug.h>
-#include <lsmdomdocument.h>
+#include <lsmsvgdocument.h>
 #include <stdio.h>
 
 static GObjectClass *parent_class;
@@ -67,7 +67,7 @@ _get_used_element (LsmSvgUseElement *use_element)
        if (*id == '#')
                id++;
 
-       element = lsm_dom_document_get_element_by_id (document, id);
+       element = LSM_DOM_ELEMENT (lsm_svg_document_get_element_by_id (LSM_SVG_DOCUMENT (document), id));
        if (!LSM_IS_SVG_ELEMENT (element)) {
                lsm_debug_dom ("[LsmSvgUseElement::_get_used_element] Target '%s' not found", id);
                return NULL;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]