diff --git a/src/sp-object.cpp b/src/sp-object.cpp
index b97aa4513abecefe7f7171c4a9c98cc62313434f..99d73970061b9389ebdca9848c2bb8b5814991ac 100644 (file)
--- a/src/sp-object.cpp
+++ b/src/sp-object.cpp
* dictionary and so on. Source: doc/architecture.txt
*/
* dictionary and so on. Source: doc/architecture.txt
*/
+#include <cstring>
+#include <string>
#include "helper/sp-marshal.h"
#include "xml/node-event-vector.h"
#include "helper/sp-marshal.h"
#include "xml/node-event-vector.h"
object->repr = NULL;
object->id = NULL;
object->repr = NULL;
object->id = NULL;
- object->style = sp_style_new_from_object(object);
-
object->_collection_policy = SPObject::COLLECT_WITH_PARENT;
new (&object->_release_signal) sigc::signal<void, SPObject *>();
object->_collection_policy = SPObject::COLLECT_WITH_PARENT;
new (&object->_release_signal) sigc::signal<void, SPObject *>();
new (&object->_position_changed_signal) sigc::signal<void, SPObject *>();
object->_successor = NULL;
new (&object->_position_changed_signal) sigc::signal<void, SPObject *>();
object->_successor = NULL;
+ // FIXME: now we create style for all objects, but per SVG, only the following can have style attribute:
+ // vg, g, defs, desc, title, symbol, use, image, switch, path, rect, circle, ellipse, line, polyline,
+ // polygon, text, tspan, tref, textPath, altGlyph, glyphRef, marker, linearGradient, radialGradient,
+ // stop, pattern, clipPath, mask, filter, feImage, a, font, glyph, missing-glyph, foreignObject
+ object->style = sp_style_new_from_object(object);
+
object->_label = NULL;
object->_default_label = NULL;
}
object->_label = NULL;
object->_default_label = NULL;
}
* \pre object points to real object
*/
SPObject *
* \pre object points to real object
*/
SPObject *
-sp_object_href(SPObject *object, gpointer owner)
+sp_object_href(SPObject *object, gpointer /*owner*/)
{
g_return_val_if_fail(object != NULL, NULL);
g_return_val_if_fail(SP_IS_OBJECT(object), NULL);
{
g_return_val_if_fail(object != NULL, NULL);
g_return_val_if_fail(SP_IS_OBJECT(object), NULL);
* \pre object points to real object and hrefcount>0
*/
SPObject *
* \pre object points to real object and hrefcount>0
*/
SPObject *
-sp_object_hunref(SPObject *object, gpointer owner)
+sp_object_hunref(SPObject *object, gpointer /*owner*/)
{
g_return_val_if_fail(object != NULL, NULL);
g_return_val_if_fail(SP_IS_OBJECT(object), NULL);
{
g_return_val_if_fail(object != NULL, NULL);
g_return_val_if_fail(SP_IS_OBJECT(object), NULL);
* Invoked whenever the given mutation event happens in the XML tree.
* \param old_ref Ignored
*/
* Invoked whenever the given mutation event happens in the XML tree.
* \param old_ref Ignored
*/
-static void sp_object_order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref,
+static void sp_object_order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node */*old_ref*/,
Inkscape::XML::Node *new_ref)
{
SPObject *ochild = sp_object_get_child_by_repr(object, child);
Inkscape::XML::Node *new_ref)
{
SPObject *ochild = sp_object_get_child_by_repr(object, child);
@@ -817,20 +823,26 @@ sp_object_invoke_build(SPObject *object, SPDocument *document, Inkscape::XML::No
object->document->bindObjectToRepr(object->repr, object);
if (Inkscape::XML::id_permitted(object->repr)) {
object->document->bindObjectToRepr(object->repr, object);
if (Inkscape::XML::id_permitted(object->repr)) {
- /* If we are not cloned, force unique id */
+ /* If we are not cloned, and not seeking, force unique id */
gchar const *id = object->repr->attribute("id");
gchar const *id = object->repr->attribute("id");
- gchar *realid = sp_object_get_unique_id(object, id);
- g_assert(realid != NULL);
-
- object->document->bindObjectToId(realid, object);
- object->id = realid;
-
- /* Redefine ID, if required */
- if ((id == NULL) || (strcmp(id, realid) != 0)) {
- bool saved = sp_document_get_undo_sensitive(document);
- sp_document_set_undo_sensitive(document, false);
- object->repr->setAttribute("id", realid);
- sp_document_set_undo_sensitive(document, saved);
+ if (!document->isSeeking()) {
+ gchar *realid = sp_object_get_unique_id(object, id);
+ g_assert(realid != NULL);
+
+ object->document->bindObjectToId(realid, object);
+ object->id = realid;
+
+ /* Redefine ID, if required */
+ if ((id == NULL) || (strcmp(id, realid) != 0)) {
+ object->repr->setAttribute("id", realid);
+ }
+ } else if (id) {
+ // bind if id, but no conflict -- otherwise, we can expect
+ // a subsequent setting of the id attribute
+ if (!object->document->getObjectById(id)) {
+ object->document->bindObjectToId(id, object);
+ object->id = g_strdup(id);
+ }
}
}
} else {
}
}
} else {
@@ -838,7 +850,6 @@ sp_object_invoke_build(SPObject *object, SPDocument *document, Inkscape::XML::No
}
/* Invoke derived methods, if any */
}
/* Invoke derived methods, if any */
-
if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->build) {
(*((SPObjectClass *) G_OBJECT_GET_CLASS(object))->build)(object, document, repr);
}
if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->build) {
(*((SPObjectClass *) G_OBJECT_GET_CLASS(object))->build)(object, document, repr);
}
* Callback for child_added node event.
*/
static void
* Callback for child_added node event.
*/
static void
-sp_object_repr_child_added(Inkscape::XML::Node *repr, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, gpointer data)
+sp_object_repr_child_added(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, gpointer data)
{
SPObject *object = SP_OBJECT(data);
{
SPObject *object = SP_OBJECT(data);
@@ -903,7 +914,7 @@ sp_object_repr_child_added(Inkscape::XML::Node *repr, Inkscape::XML::Node *child
* Callback for remove_child node event.
*/
static void
* Callback for remove_child node event.
*/
static void
-sp_object_repr_child_removed(Inkscape::XML::Node *repr, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, gpointer data)
+sp_object_repr_child_removed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node */*ref*/, gpointer data)
{
SPObject *object = SP_OBJECT(data);
{
SPObject *object = SP_OBJECT(data);
@@ -918,7 +929,7 @@ sp_object_repr_child_removed(Inkscape::XML::Node *repr, Inkscape::XML::Node *chi
* \todo fixme:
*/
static void
* \todo fixme:
*/
static void
-sp_object_repr_order_changed(Inkscape::XML::Node *repr, Inkscape::XML::Node *child, Inkscape::XML::Node *old, Inkscape::XML::Node *newer, gpointer data)
+sp_object_repr_order_changed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node *old, Inkscape::XML::Node *newer, gpointer data)
{
SPObject *object = SP_OBJECT(data);
{
SPObject *object = SP_OBJECT(data);
SPDocument *document=object->document;
SPObject *conflict=NULL;
SPDocument *document=object->document;
SPObject *conflict=NULL;
- if (value) {
- conflict = document->getObjectById((char const *)value);
+ gchar const *new_id = value;
+
+ if (new_id) {
+ conflict = document->getObjectById((char const *)new_id);
}
}
+
if ( conflict && conflict != object ) {
if ( conflict && conflict != object ) {
- sp_object_ref(conflict, NULL);
- // give the conflicting object a new ID
- gchar *new_conflict_id = sp_object_get_unique_id(conflict, NULL);
- SP_OBJECT_REPR(conflict)->setAttribute("id", new_conflict_id);
- g_free(new_conflict_id);
- sp_object_unref(conflict, NULL);
+ if (!document->isSeeking()) {
+ sp_object_ref(conflict, NULL);
+ // give the conflicting object a new ID
+ gchar *new_conflict_id = sp_object_get_unique_id(conflict, NULL);
+ SP_OBJECT_REPR(conflict)->setAttribute("id", new_conflict_id);
+ g_free(new_conflict_id);
+ sp_object_unref(conflict, NULL);
+ } else {
+ new_id = NULL;
+ }
}
if (object->id) {
}
if (object->id) {
g_free(object->id);
}
g_free(object->id);
}
- if (value) {
- object->id = g_strdup((char const*)value);
+ if (new_id) {
+ object->id = g_strdup((char const*)new_id);
document->bindObjectToId(object->id, object);
} else {
object->id = NULL;
document->bindObjectToId(object->id, object);
} else {
object->id = NULL;
* Callback for attr_changed node event.
*/
static void
* Callback for attr_changed node event.
*/
static void
-sp_object_repr_attr_changed(Inkscape::XML::Node *repr, gchar const *key, gchar const *oldval, gchar const *newval, bool is_interactive, gpointer data)
+sp_object_repr_attr_changed(Inkscape::XML::Node *repr, gchar const *key, gchar const */*oldval*/, gchar const */*newval*/, bool is_interactive, gpointer data)
{
SPObject *object = SP_OBJECT(data);
{
SPObject *object = SP_OBJECT(data);
@@ -1065,7 +1083,7 @@ sp_object_repr_attr_changed(Inkscape::XML::Node *repr, gchar const *key, gchar c
* Callback for content_changed node event.
*/
static void
* Callback for content_changed node event.
*/
static void
-sp_object_repr_content_changed(Inkscape::XML::Node *repr, gchar const *oldcontent, gchar const *newcontent, gpointer data)
+sp_object_repr_content_changed(Inkscape::XML::Node */*repr*/, gchar const */*oldcontent*/, gchar const */*newcontent*/, gpointer data)
{
SPObject *object = SP_OBJECT(data);
{
SPObject *object = SP_OBJECT(data);
sp_object_private_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
{
if (!repr && (flags & SP_OBJECT_WRITE_BUILD)) {
sp_object_private_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
{
if (!repr && (flags & SP_OBJECT_WRITE_BUILD)) {
- repr = SP_OBJECT_REPR(object)->duplicate();
+ repr = SP_OBJECT_REPR(object)->duplicate(NULL); // FIXME
if (!( flags & SP_OBJECT_WRITE_EXT )) {
repr->setAttribute("inkscape:collect", NULL);
}
if (!( flags & SP_OBJECT_WRITE_EXT )) {
repr->setAttribute("inkscape:collect", NULL);
}
}
}
}
}
+/** Used both to create reprs in the original document, and to create
+ * reprs in another document (e.g. a temporary document used when
+ * saving as "Plain SVG"
+ */
Inkscape::XML::Node *
SPObject::updateRepr(Inkscape::XML::Node *repr, unsigned int flags) {
if (SP_OBJECT_IS_CLONED(this)) {
Inkscape::XML::Node *
SPObject::updateRepr(Inkscape::XML::Node *repr, unsigned int flags) {
if (SP_OBJECT_IS_CLONED(this)) {
g_warning("Class %s does not implement ::write", G_OBJECT_TYPE_NAME(this));
if (!repr) {
if (flags & SP_OBJECT_WRITE_BUILD) {
g_warning("Class %s does not implement ::write", G_OBJECT_TYPE_NAME(this));
if (!repr) {
if (flags & SP_OBJECT_WRITE_BUILD) {
- repr = SP_OBJECT_REPR(this)->duplicate();
+ /// \todo FIXME: Plumb an appropriate XML::Document into this
+ repr = SP_OBJECT_REPR(this)->duplicate(NULL);
}
}
- /// \todo fixme: else probably error (Lauris) */
+ /// \todo FIXME: else probably error (Lauris) */
} else {
repr->mergeFrom(SP_OBJECT_REPR(this), "id");
}
} else {
repr->mergeFrom(SP_OBJECT_REPR(this), "id");
}
*/
gchar const *
*/
gchar const *
-sp_object_title_get(SPObject *object)
+sp_object_title_get(SPObject */*object*/)
{
return NULL;
}
gchar const *
{
return NULL;
}
gchar const *
-sp_object_description_get(SPObject *object)
+sp_object_description_get(SPObject */*object*/)
{
return NULL;
}
unsigned int
{
return NULL;
}
unsigned int
-sp_object_title_set(SPObject *object, gchar const *title)
+sp_object_title_set(SPObject */*object*/, gchar const */*title*/)
{
return FALSE;
}
unsigned int
{
return FALSE;
}
unsigned int
-sp_object_description_set(SPObject *object, gchar const *desc)
+sp_object_description_set(SPObject */*object*/, gchar const */*desc*/)
{
return FALSE;
}
{
return FALSE;
}