index de2baa4708063977224bcfdbb2c194bef86a9c60..389e18d20cf56d9cb5cbcb887c02206629f91a65 100644 (file)
-#define INKSCAPE_LIVEPATHEFFECT_OBJECT_CPP\r
-\r
-/*\r
- * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>\r
- *\r
- * Released under GNU GPL, read the file 'COPYING' for more information\r
- */\r
-\r
-#include "xml/repr.h"\r
-#include "xml/node-event-vector.h"\r
-#include "sp-object.h"\r
-#include "attributes.h"\r
-\r
-#include "document.h"\r
-#include <glibmm/i18n.h>\r
-\r
-#include "live_effects/lpeobject.h"\r
-#include "live_effects/effect.h"\r
-\r
-//#define LIVEPATHEFFECT_VERBOSE\r
-\r
-static void livepatheffect_class_init(LivePathEffectObjectClass *klass);\r
-static void livepatheffect_init(LivePathEffectObject *stop);\r
-\r
-static void livepatheffect_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);\r
-static void livepatheffect_release(SPObject *object);\r
-\r
-static void livepatheffect_set(SPObject *object, unsigned key, gchar const *value);\r
-static Inkscape::XML::Node *livepatheffect_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);\r
-\r
-static void livepatheffect_on_repr_attr_changed (Inkscape::XML::Node * repr, const gchar *key, const gchar *oldval, const gchar *newval, bool is_interactive, void * data);\r
-\r
-static SPObjectClass *livepatheffect_parent_class;\r
-/**\r
- * Registers the LivePathEffect class with Gdk and returns its type number.\r
- */\r
-GType\r
-livepatheffect_get_type ()\r
-{\r
- static GType livepatheffect_type = 0;\r
-\r
- if (!livepatheffect_type) {\r
- GTypeInfo livepatheffect_info = {\r
- sizeof (LivePathEffectObjectClass),\r
- NULL, NULL,\r
- (GClassInitFunc) livepatheffect_class_init,\r
- NULL, NULL,\r
- sizeof (LivePathEffectObject),\r
- 16,\r
- (GInstanceInitFunc) livepatheffect_init,\r
- NULL,\r
- };\r
- livepatheffect_type = g_type_register_static (SP_TYPE_OBJECT, "LivePathEffectObject", &livepatheffect_info, (GTypeFlags)0);\r
- }\r
- return livepatheffect_type;\r
-}\r
-\r
-static Inkscape::XML::NodeEventVector const livepatheffect_repr_events = {\r
- NULL, /* child_added */\r
- NULL, /* child_removed */\r
- livepatheffect_on_repr_attr_changed,\r
- NULL, /* content_changed */\r
- NULL /* order_changed */\r
-};\r
-\r
-\r
-/**\r
- * Callback to initialize livepatheffect vtable.\r
- */\r
-static void \r
-livepatheffect_class_init(LivePathEffectObjectClass *klass)\r
-{\r
- SPObjectClass *sp_object_class = (SPObjectClass *) klass;\r
-\r
- livepatheffect_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT);\r
-\r
- sp_object_class->build = livepatheffect_build;\r
- sp_object_class->release = livepatheffect_release;\r
-\r
- sp_object_class->set = livepatheffect_set;\r
- sp_object_class->write = livepatheffect_write;\r
-}\r
-\r
-/**\r
- * Callback to initialize livepatheffect object.\r
- */\r
-static void\r
-livepatheffect_init(LivePathEffectObject *lpeobj)\r
-{\r
-#ifdef LIVEPATHEFFECT_VERBOSE\r
- g_message("Init livepatheffectobject");\r
-#endif\r
- lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;\r
- lpeobj->lpe = NULL;\r
-\r
- lpeobj->effecttype_set = false;\r
-}\r
-\r
-/**\r
- * Virtual build: set livepatheffect attributes from its associated XML node.\r
- */\r
-static void \r
-livepatheffect_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)\r
-{\r
-#ifdef LIVEPATHEFFECT_VERBOSE\r
- g_message("Build livepatheffect");\r
-#endif\r
-\r
- if (((SPObjectClass *) livepatheffect_parent_class)->build)\r
- (* ((SPObjectClass *) livepatheffect_parent_class)->build)(object, document, repr);\r
-\r
- sp_object_read_attr(object, "effect");\r
-\r
- if (repr) {\r
- repr->addListener (&livepatheffect_repr_events, object);\r
- }\r
-\r
- /* Register ourselves */\r
-// sp_document_add_resource(document, "path-effect", object);\r
-}\r
-\r
-/**\r
- * Virtual release of livepatheffect members before destruction.\r
- */\r
-static void\r
-livepatheffect_release(SPObject *object)\r
-{\r
- LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
-\r
-#ifdef LIVEPATHEFFECT_VERBOSE\r
- g_print("Releasing livepatheffect");\r
-#endif\r
-\r
-/*\r
- if (SP_OBJECT_DOCUMENT(object)) {\r
- // Unregister ourselves\r
- sp_document_remove_resource(SP_OBJECT_DOCUMENT(object), "livepatheffect", SP_OBJECT(object));\r
- }\r
-\r
- if (gradient->ref) {\r
- gradient->modified_connection.disconnect();\r
- gradient->ref->detach();\r
- delete gradient->ref;\r
- gradient->ref = NULL;\r
- }\r
-\r
- gradient->modified_connection.~connection();\r
-\r
-*/\r
-\r
- if (lpeobj->lpe) {\r
- delete lpeobj->lpe;\r
- lpeobj->lpe = NULL;\r
- }\r
- lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;\r
-\r
- if (((SPObjectClass *) livepatheffect_parent_class)->release)\r
- ((SPObjectClass *) livepatheffect_parent_class)->release(object);\r
-}\r
-\r
-/**\r
- * Virtual set: set attribute to value.\r
- */\r
-static void\r
-livepatheffect_set(SPObject *object, unsigned key, gchar const *value)\r
-{\r
- LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
-#ifdef LIVEPATHEFFECT_VERBOSE\r
- g_print("Set livepatheffect");\r
-#endif\r
- switch (key) {\r
- case SP_PROP_PATH_EFFECT:\r
- if (lpeobj->lpe) {\r
- delete lpeobj->lpe;\r
- lpeobj->lpe = NULL;\r
- }\r
-\r
- if (value) {\r
- lpeobj->effecttype = Inkscape::LivePathEffect::LPETypeConverter.get_id_from_key(value);\r
- if (lpeobj->effecttype != Inkscape::LivePathEffect::INVALID_LPE) {\r
- lpeobj->lpe = Inkscape::LivePathEffect::Effect::New(lpeobj->effecttype, lpeobj);\r
- }\r
- lpeobj->effecttype_set = true;\r
- } else {\r
- lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;\r
- lpeobj->effecttype_set = false;\r
- }\r
- object->requestModified(SP_OBJECT_MODIFIED_FLAG);\r
- break;\r
- }\r
-\r
- if (((SPObjectClass *) livepatheffect_parent_class)->set) {\r
- ((SPObjectClass *) livepatheffect_parent_class)->set(object, key, value);\r
- }\r
-}\r
-\r
-/**\r
- * Virtual write: write object attributes to repr.\r
- */\r
-static Inkscape::XML::Node *\r
-livepatheffect_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)\r
-{\r
-#ifdef LIVEPATHEFFECT_VERBOSE\r
- g_print("Write livepatheffect");\r
-#endif\r
-\r
- LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
-\r
- if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {\r
- Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(object));\r
- repr = xml_doc->createElement("inkscape:path-effect");\r
- }\r
-\r
- if ((flags & SP_OBJECT_WRITE_ALL) || lpeobj->effecttype_set)\r
- repr->setAttribute("effect", Inkscape::LivePathEffect::LPETypeConverter.get_key(lpeobj->effecttype).c_str());\r
-\r
-// lpeobj->lpe->write(repr); something like this.\r
-\r
- if (((SPObjectClass *) livepatheffect_parent_class)->write)\r
- (* ((SPObjectClass *) livepatheffect_parent_class)->write)(object, repr, flags);\r
-\r
- return repr;\r
-}\r
-\r
-static void \r
-livepatheffect_on_repr_attr_changed ( Inkscape::XML::Node * repr, \r
- const gchar *key, \r
- const gchar *oldval, \r
- const gchar *newval, \r
- bool is_interactive, \r
- void * data )\r
-{\r
-#ifdef LIVEPATHEFFECT_VERBOSE\r
- g_print("livepatheffect_on_repr_attr_changed");\r
-#endif\r
-\r
- if (!data)\r
- return;\r
-\r
- LivePathEffectObject *lpeobj = (LivePathEffectObject*) data;\r
- if (!lpeobj->lpe) \r
- return;\r
-\r
- lpeobj->lpe->setParameter(repr, key, oldval, newval);\r
-\r
- lpeobj->requestModified(SP_OBJECT_MODIFIED_FLAG);\r
-}\r
-\r
-\r
-/*\r
- Local Variables:\r
- mode:c++\r
- c-file-style:"stroustrup"\r
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
- indent-tabs-mode:nil\r
- fill-column:99\r
- End:\r
-*/\r
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
+/*
+ * Copyright (C) Johan Engelen 2007-2008 <j.b.c.engelen@utwente.nl>
+ * Abhishek Sharma
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/lpeobject.h"
+
+#include "live_effects/effect.h"
+
+#include "xml/repr.h"
+#include "xml/node-event-vector.h"
+#include "sp-object.h"
+#include "attributes.h"
+#include "document.h"
+#include "document-private.h"
+
+#include <glibmm/i18n.h>
+
+//#define LIVEPATHEFFECT_VERBOSE
+
+static void livepatheffect_on_repr_attr_changed (Inkscape::XML::Node * repr, const gchar *key, const gchar *oldval, const gchar *newval, bool is_interactive, void * data);
+
+static SPObjectClass *livepatheffect_parent_class;
+/**
+ * Registers the LivePathEffect class with Gdk and returns its type number.
+ */
+GType
+LivePathEffectObject::livepatheffect_get_type ()
+{
+ static GType livepatheffect_type = 0;
+
+ if (!livepatheffect_type) {
+ GTypeInfo livepatheffect_info = {
+ sizeof (LivePathEffectObjectClass),
+ NULL, NULL,
+ (GClassInitFunc) LivePathEffectObject::livepatheffect_class_init,
+ NULL, NULL,
+ sizeof (LivePathEffectObject),
+ 16,
+ (GInstanceInitFunc) LivePathEffectObject::livepatheffect_init,
+ NULL,
+ };
+ livepatheffect_type = g_type_register_static (SP_TYPE_OBJECT, "LivePathEffectObject", &livepatheffect_info, (GTypeFlags)0);
+ }
+ return livepatheffect_type;
+}
+
+static Inkscape::XML::NodeEventVector const livepatheffect_repr_events = {
+ NULL, /* child_added */
+ NULL, /* child_removed */
+ livepatheffect_on_repr_attr_changed,
+ NULL, /* content_changed */
+ NULL /* order_changed */
+};
+
+
+/**
+ * Callback to initialize livepatheffect vtable.
+ */
+void
+LivePathEffectObject::livepatheffect_class_init(LivePathEffectObjectClass *klass)
+{
+ SPObjectClass *sp_object_class = (SPObjectClass *) klass;
+
+ livepatheffect_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT);
+
+ sp_object_class->build = livepatheffect_build;
+ sp_object_class->release = livepatheffect_release;
+
+ sp_object_class->set = livepatheffect_set;
+ sp_object_class->write = livepatheffect_write;
+}
+
+/**
+ * Callback to initialize livepatheffect object.
+ */
+void
+LivePathEffectObject::livepatheffect_init(LivePathEffectObject *lpeobj)
+{
+#ifdef LIVEPATHEFFECT_VERBOSE
+ g_message("Init livepatheffectobject");
+#endif
+ lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;
+ lpeobj->lpe = NULL;
+
+ lpeobj->effecttype_set = false;
+}
+
+/**
+ * Virtual build: set livepatheffect attributes from its associated XML node.
+ */
+void
+LivePathEffectObject::livepatheffect_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
+{
+#ifdef LIVEPATHEFFECT_VERBOSE
+ g_message("Build livepatheffect");
+#endif
+ g_assert(object != NULL);
+ g_assert(SP_IS_OBJECT(object));
+
+ if (((SPObjectClass *) livepatheffect_parent_class)->build)
+ (* ((SPObjectClass *) livepatheffect_parent_class)->build)(object, document, repr);
+
+ object->readAttr( "effect" );
+
+ if (repr) {
+ repr->addListener (&livepatheffect_repr_events, object);
+ }
+
+ /* Register ourselves, is this necessary? */
+// document->addResource("path-effect", object);
+}
+
+/**
+ * Virtual release of livepatheffect members before destruction.
+ */
+void
+LivePathEffectObject::livepatheffect_release(SPObject *object)
+{
+#ifdef LIVEPATHEFFECT_VERBOSE
+ g_print("Releasing livepatheffect");
+#endif
+
+ LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);
+
+ SP_OBJECT_REPR(object)->removeListenerByData(object);
+
+
+/*
+ if (SP_OBJECT_DOCUMENT(object)) {
+ // Unregister ourselves
+ sp_document_removeResource(SP_OBJECT_DOCUMENT(object), "livepatheffect", SP_OBJECT(object));
+ }
+
+ if (gradient->ref) {
+ gradient->modified_connection.disconnect();
+ gradient->ref->detach();
+ delete gradient->ref;
+ gradient->ref = NULL;
+ }
+
+ gradient->modified_connection.~connection();
+
+*/
+
+ if (lpeobj->lpe) {
+ delete lpeobj->lpe;
+ lpeobj->lpe = NULL;
+ }
+ lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;
+
+ if (((SPObjectClass *) livepatheffect_parent_class)->release)
+ ((SPObjectClass *) livepatheffect_parent_class)->release(object);
+}
+
+/**
+ * Virtual set: set attribute to value.
+ */
+void
+LivePathEffectObject::livepatheffect_set(SPObject *object, unsigned key, gchar const *value)
+{
+ LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);
+#ifdef LIVEPATHEFFECT_VERBOSE
+ g_print("Set livepatheffect");
+#endif
+ switch (key) {
+ case SP_PROP_PATH_EFFECT:
+ if (lpeobj->lpe) {
+ delete lpeobj->lpe;
+ lpeobj->lpe = NULL;
+ }
+
+ if ( value && Inkscape::LivePathEffect::LPETypeConverter.is_valid_key(value) ) {
+ lpeobj->effecttype = Inkscape::LivePathEffect::LPETypeConverter.get_id_from_key(value);
+ lpeobj->lpe = Inkscape::LivePathEffect::Effect::New(lpeobj->effecttype, lpeobj);
+ lpeobj->effecttype_set = true;
+ } else {
+ lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;
+ lpeobj->effecttype_set = false;
+ }
+ object->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ break;
+ }
+
+ if (((SPObjectClass *) livepatheffect_parent_class)->set) {
+ ((SPObjectClass *) livepatheffect_parent_class)->set(object, key, value);
+ }
+}
+
+/**
+ * Virtual write: write object attributes to repr.
+ */
+Inkscape::XML::Node *
+LivePathEffectObject::livepatheffect_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags)
+{
+#ifdef LIVEPATHEFFECT_VERBOSE
+ g_print("Write livepatheffect");
+#endif
+
+ LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);
+
+ if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
+ repr = xml_doc->createElement("inkscape:path-effect");
+ }
+
+ if ((flags & SP_OBJECT_WRITE_ALL) || lpeobj->lpe) {
+ repr->setAttribute("effect", Inkscape::LivePathEffect::LPETypeConverter.get_key(lpeobj->effecttype).c_str());
+
+ lpeobj->lpe->writeParamsToSVG();
+ }
+
+ if (((SPObjectClass *) livepatheffect_parent_class)->write)
+ (* ((SPObjectClass *) livepatheffect_parent_class)->write)(object, xml_doc, repr, flags);
+
+ return repr;
+}
+
+static void
+livepatheffect_on_repr_attr_changed ( Inkscape::XML::Node * /*repr*/,
+ const gchar *key,
+ const gchar */*oldval*/,
+ const gchar *newval,
+ bool /*is_interactive*/,
+ void * data )
+{
+#ifdef LIVEPATHEFFECT_VERBOSE
+ g_print("livepatheffect_on_repr_attr_changed");
+#endif
+
+ if (!data)
+ return;
+
+ LivePathEffectObject *lpeobj = (LivePathEffectObject*) data;
+ if (!lpeobj->get_lpe())
+ return;
+
+ lpeobj->get_lpe()->setParameter(key, newval);
+
+ lpeobj->requestModified(SP_OBJECT_MODIFIED_FLAG);
+}
+
+/**
+ * If this has other users, create a new private duplicate and return it
+ * returns 'this' when no forking was necessary (and therefore no duplicate was made)
+ * Check out sp_lpe_item_fork_path_effects_if_necessary !
+ */
+LivePathEffectObject *LivePathEffectObject::fork_private_if_necessary(unsigned int nr_of_allowed_users)
+{
+ if (hrefcount > nr_of_allowed_users) {
+ SPDocument *doc = SP_OBJECT_DOCUMENT(this);
+ Inkscape::XML::Document *xml_doc = doc->getReprDoc();
+ Inkscape::XML::Node *dup_repr = SP_OBJECT_REPR (this)->duplicate(xml_doc);
+
+ SP_OBJECT_REPR (SP_DOCUMENT_DEFS (doc))->addChild(dup_repr, NULL);
+ LivePathEffectObject *lpeobj_new = LIVEPATHEFFECT( doc->getObjectByRepr(dup_repr) );
+
+ Inkscape::GC::release(dup_repr);
+ return lpeobj_new;
+ }
+ return this;
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :