From 179fa413b047bede6e32109e2ce82437c5fb8d34 Mon Sep 17 00:00:00 2001 From: MenTaLguY Date: Mon, 16 Jan 2006 02:36:01 +0000 Subject: moving trunk for module inkscape (bzr r1) --- src/sp-style-elem.cpp | 407 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 407 insertions(+) create mode 100644 src/sp-style-elem.cpp (limited to 'src/sp-style-elem.cpp') diff --git a/src/sp-style-elem.cpp b/src/sp-style-elem.cpp new file mode 100644 index 000000000..ff27f3de0 --- /dev/null +++ b/src/sp-style-elem.cpp @@ -0,0 +1,407 @@ +#include +#include "xml/node-event-vector.h" +#include "xml/repr.h" +#include "document.h" +#include "sp-style-elem.h" +#include "attributes.h" +using Inkscape::XML::TEXT_NODE; + +static void sp_style_elem_init(SPStyleElem *style_elem); +static void sp_style_elem_class_init(SPStyleElemClass *klass); +static void sp_style_elem_build(SPObject *object, SPDocument *doc, Inkscape::XML::Node *repr); +static void sp_style_elem_set(SPObject *object, unsigned const key, gchar const *const value); +static void sp_style_elem_read_content(SPObject *); +static Inkscape::XML::Node *sp_style_elem_write(SPObject *, Inkscape::XML::Node *, guint flags); + +static SPObjectClass *parent_class; + +GType +sp_style_elem_get_type() +{ + static GType type = 0; + if (!type) { + GTypeInfo info = { + sizeof(SPStyleElemClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) sp_style_elem_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(SPStyleElem), + 16, /* n_preallocs */ + (GInstanceInitFunc) sp_style_elem_init, + NULL, /* value_table */ + }; + type = g_type_register_static(SP_TYPE_OBJECT, "SPStyleElem", &info, (GTypeFlags) 0); + } + + return type; +} + +static void +sp_style_elem_class_init(SPStyleElemClass *klass) +{ + parent_class = (SPObjectClass *)g_type_class_ref(SP_TYPE_OBJECT); + /* FIXME */ + + klass->build = sp_style_elem_build; + klass->set = sp_style_elem_set; + klass->read_content = sp_style_elem_read_content; + klass->write = sp_style_elem_write; +} + +static void +sp_style_elem_init(SPStyleElem *style_elem) +{ + media_set_all(style_elem->media); + style_elem->is_css = false; +} + +static void +sp_style_elem_set(SPObject *object, unsigned const key, gchar const *const value) +{ + g_return_if_fail(object); + SPStyleElem &style_elem = *SP_STYLE_ELEM(object); + + switch (key) { + case SP_ATTR_TYPE: { + if (!value) { + /* TODO: `type' attribute is required. Give error message as per + http://www.w3.org/TR/SVG11/implnote.html#ErrorProcessing. */ + style_elem.is_css = false; + } else { + /* fixme: determine what whitespace is allowed. Will probably need to ask on SVG + * list; though the relevant RFC may give info on its lexer. */ + style_elem.is_css = ( g_ascii_strncasecmp(value, "text/css", 8) == 0 + && ( value[8] == '\0' || + value[8] == ';' ) ); + } + break; + } + +#if 0 /* unfinished */ + case SP_ATTR_MEDIA: { + parse_media(style_elem, value); + break; + } +#endif + + /* title is ignored. */ + default: { + if (parent_class->set) { + parent_class->set(object, key, value); + } + break; + } + } +} + +static void +child_add_rm_cb(Inkscape::XML::Node *, Inkscape::XML::Node *, Inkscape::XML::Node *, + void *const data) +{ + sp_style_elem_read_content(static_cast(data)); +} + +static void +content_changed_cb(Inkscape::XML::Node *, gchar const *, gchar const *, + void *const data) +{ + sp_style_elem_read_content(static_cast(data)); +} + +static void +child_order_changed_cb(Inkscape::XML::Node *, Inkscape::XML::Node *, + Inkscape::XML::Node *, Inkscape::XML::Node *, + void *const data) +{ + sp_style_elem_read_content(static_cast(data)); +} + +static Inkscape::XML::Node * +sp_style_elem_write(SPObject *const object, Inkscape::XML::Node *repr, guint const flags) +{ + if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { + repr = sp_repr_new("svg:style"); + } + + g_return_val_if_fail(object, repr); + SPStyleElem &style_elem = *SP_STYLE_ELEM(object); + if (flags & SP_OBJECT_WRITE_BUILD) { + g_warning("nyi: Forming