Code

Translations. French translation minor update.
[inkscape.git] / src / live_effects / lpeobject.cpp
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 :