diff options
| author | Markus Engel <markus.engel@tum.de> | 2013-03-29 23:52:42 +0000 |
|---|---|---|
| committer | Markus Engel <markus.engel@tum.de> | 2013-03-29 23:52:42 +0000 |
| commit | a168040d5a452544328a1e6ad35aaac351f94d44 (patch) | |
| tree | fae1ba829f543a473da281bd5fa6e4deabbf6912 /src/sp-object.cpp | |
| parent | Removed function pointers from SPObject and subclasses. (diff) | |
| parent | Dutch translation update (diff) | |
| download | inkscape-a168040d5a452544328a1e6ad35aaac351f94d44.tar.gz inkscape-a168040d5a452544328a1e6ad35aaac351f94d44.zip | |
merged from trunk
(bzr r11608.1.56)
Diffstat (limited to 'src/sp-object.cpp')
| -rw-r--r-- | src/sp-object.cpp | 248 |
1 files changed, 83 insertions, 165 deletions
diff --git a/src/sp-object.cpp b/src/sp-object.cpp index f3da0e134..0b31d2835 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -64,11 +64,11 @@ using std::strstr; guint update_in_progress = 0; // guard against update-during-update Inkscape::XML::NodeEventVector object_event_vector = { - SPObject::sp_object_repr_child_added, - SPObject::sp_object_repr_child_removed, - SPObject::sp_object_repr_attr_changed, - SPObject::sp_object_repr_content_changed, - SPObject::sp_object_repr_order_changed + SPObject::repr_child_added, + SPObject::repr_child_removed, + SPObject::repr_attr_changed, + SPObject::repr_content_changed, + SPObject::repr_order_changed }; // A friend class used to set internal members on SPObject so as to not expose settors in SPObject's public API @@ -101,66 +101,60 @@ public: } }; +static void sp_object_child_added(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *ref); -GObjectClass * SPObjectClass::static_parent_class = 0; +static void sp_object_finalize(GObject *object); -GType SPObject::sp_object_get_type() -{ - static GType type = 0; - if (!type) { - GTypeInfo info = { - sizeof(SPObjectClass), - NULL, NULL, - (GClassInitFunc) SPObjectClass::sp_object_class_init, - NULL, NULL, - sizeof(SPObject), - 16, - (GInstanceInitFunc) sp_object_init, - NULL - }; - type = g_type_register_static(G_TYPE_OBJECT, "SPObject", &info, (GTypeFlags)0); - } - return type; -} - -void SPObjectClass::sp_object_class_init(SPObjectClass *klass) -{ - GObjectClass *object_class; +static void sp_object_remove_child(SPObject *object, + Inkscape::XML::Node *child); - object_class = (GObjectClass *) klass; +static void sp_object_order_changed(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *old_ref, + Inkscape::XML::Node *new_ref); - static_parent_class = (GObjectClass *) g_type_class_ref(G_TYPE_OBJECT); +static void sp_object_release(SPObject *object); +static void sp_object_build(SPObject *object, + SPDocument *document, + Inkscape::XML::Node *repr); - object_class->finalize = SPObject::sp_object_finalize; +static void sp_object_private_set(SPObject *object, + unsigned int key, + gchar const *value); -// klass->child_added = SPObject::sp_object_child_added; -// klass->remove_child = SPObject::sp_object_remove_child; -// klass->order_changed = SPObject::sp_object_order_changed; -// -// klass->release = SPObject::sp_object_release; -// -// //klass->build = SPObject::sp_object_build; -// -// klass->set = SPObject::sp_object_private_set; -// klass->write = SPObject::sp_object_private_write; -} +static Inkscape::XML::Node *sp_object_private_write(SPObject *object, + Inkscape::XML::Document *doc, + Inkscape::XML::Node *repr, + guint flags); +static gchar *sp_object_get_unique_id(SPObject *object, + gchar const *defid); -// CPPIFY: make pure virtual -void CObject::onReadContent() { - //throw; -} +G_DEFINE_TYPE(SPObject, sp_object, G_TYPE_OBJECT); -void CObject::onUpdate(SPCtx* ctx, unsigned int flags) { - //throw; -} +/** + * Initializes the SPObject vtable. + */ +static void +sp_object_class_init(SPObjectClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->finalize = sp_object_finalize; -void CObject::onModified(unsigned int flags) { - //throw; } +/** + * Callback to initialize the SPObject object. + */ +static void +sp_object_init(SPObject *object) + + + -void SPObject::sp_object_init(SPObject *object) { debug("id=%x, typename=%s",object, g_type_name_from_instance((GTypeInstance*)object)); @@ -195,7 +189,25 @@ void SPObject::sp_object_init(SPObject *object) object->_default_label = NULL; } -void SPObject::sp_object_finalize(GObject *object) +// CPPIFY: make pure virtual +void CObject::onReadContent() { + //throw; +} + +void CObject::onUpdate(SPCtx* ctx, unsigned int flags) { + //throw; +} + +void CObject::onModified(unsigned int flags) { + //throw; +} + + +/** + * Callback to destroy all members and connections of object and itself. + */ +static void +sp_object_finalize(GObject *object) { SPObject *spobject = (SPObject *)object; @@ -216,8 +228,8 @@ void SPObject::sp_object_finalize(GObject *object) spobject->_delete_signal.~signal(); spobject->_position_changed_signal.~signal(); - if (((GObjectClass *) (SPObjectClass::static_parent_class))->finalize) { - (* ((GObjectClass *) (SPObjectClass::static_parent_class))->finalize)(object); + if (((GObjectClass *) (sp_object_parent_class))->finalize) { + (* ((GObjectClass *) (sp_object_parent_class))->finalize)(object); } } @@ -368,7 +380,7 @@ SPObject const *SPObject::nearestCommonAncestor(SPObject const *object) const { return longest_common_suffix<SPObject::ConstParentIterator>(this, object, NULL, &same_objects); } -SPObject const *AncestorSon(SPObject const *obj, SPObject const *ancestor) { +static SPObject const *AncestorSon(SPObject const *obj, SPObject const *ancestor) { SPObject const *result = 0; if ( obj && ancestor ) { if (obj->parent == ancestor) { @@ -660,12 +672,6 @@ void CObject::onChildAdded(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) ochild->invoke_build(object->document, child, object->cloned); } -// CPPIFY: remove -void SPObject::sp_object_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) -{ - object->cobject->onChildAdded(child, ref); -} - void CObject::onRelease() { SPObject* object = this->spobject; @@ -675,12 +681,6 @@ void CObject::onRelease() { } } -// CPPIFY: remove -void SPObject::sp_object_release(SPObject *object) -{ - object->cobject->onRelease(); -} - void CObject::onRemoveChild(Inkscape::XML::Node* child) { SPObject* object = this->spobject; @@ -692,12 +692,6 @@ void CObject::onRemoveChild(Inkscape::XML::Node* child) { } } -// CPPIFY: remove -void SPObject::sp_object_remove_child(SPObject *object, Inkscape::XML::Node *child) -{ - object->cobject->onRemoveChild(child); -} - void CObject::onOrderChanged(Inkscape::XML::Node *child, Inkscape::XML::Node * old_ref, Inkscape::XML::Node *new_ref) { SPObject* object = this->spobject; @@ -708,13 +702,6 @@ void CObject::onOrderChanged(Inkscape::XML::Node *child, Inkscape::XML::Node * o ochild->_position_changed_signal.emit(ochild); } -// CPPIFY: remove -void SPObject::sp_object_order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, - Inkscape::XML::Node *new_ref) -{ - object->cobject->onOrderChanged(child, old_ref, new_ref); -} - void CObject::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { SPObject* object = this->spobject; @@ -737,12 +724,6 @@ void CObject::onBuild(SPDocument *document, Inkscape::XML::Node *repr) { } } -// CPPIFY: remove -void SPObject::sp_object_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) -{ - object->cobject->onBuild(document, repr); -} - void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, unsigned int cloned) { debug("id=%x, typename=%s", this, g_type_name_from_instance((GTypeInstance*)this)); @@ -799,9 +780,6 @@ void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, uns } /* Invoke derived methods, if any */ -// if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->build) { -// (*((SPObjectClass *) G_OBJECT_GET_CLASS(this))->build)(this, document, repr); -// } this->cobject->onBuild(document, repr); /* Signalling (should be connected AFTER processing derived methods */ @@ -841,10 +819,6 @@ void SPObject::releaseReferences() { this->_release_signal.emit(this); -// SPObjectClass *klass=(SPObjectClass *)G_OBJECT_GET_CLASS(this); -// if (klass->release) { -// klass->release(this); -// } this->cobject->onRelease(); /* all hrefs should be released by the "release" handlers */ @@ -887,33 +861,24 @@ SPObject *SPObject::getPrev() return prev; } -void SPObject::sp_object_repr_child_added(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, gpointer data) +void SPObject::repr_child_added(Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, gpointer data) { SPObject *object = SP_OBJECT(data); -// if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->child_added) { -// (*((SPObjectClass *)G_OBJECT_GET_CLASS(object))->child_added)(object, child, ref); -// } object->cobject->onChildAdded(child, ref); } -void SPObject::sp_object_repr_child_removed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node */*ref*/, gpointer data) +void SPObject::repr_child_removed(Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node * /*ref*/, gpointer data) { SPObject *object = SP_OBJECT(data); -// if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->remove_child) { -// (* ((SPObjectClass *)G_OBJECT_GET_CLASS(object))->remove_child)(object, child); -// } object->cobject->onRemoveChild(child); } -void SPObject::sp_object_repr_order_changed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node *child, Inkscape::XML::Node *old, Inkscape::XML::Node *newer, gpointer data) +void SPObject::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); -// if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->order_changed) { -// (* ((SPObjectClass *)G_OBJECT_GET_CLASS(object))->order_changed)(object, child, old, newer); -// } object->cobject->onOrderChanged(child, old, newer); } @@ -940,7 +905,7 @@ void CObject::onSet(unsigned int key, gchar const* value) { if (!document->isSeeking()) { sp_object_ref(conflict, NULL); // give the conflicting object a new ID - gchar *new_conflict_id = SPObject::sp_object_get_unique_id(conflict, NULL); + gchar *new_conflict_id = sp_object_get_unique_id(conflict, NULL); conflict->getRepr()->setAttribute("id", new_conflict_id); g_free(new_conflict_id); sp_object_unref(conflict, NULL); @@ -1003,20 +968,11 @@ void CObject::onSet(unsigned int key, gchar const* value) { } } -// CPPIFY: remove -void SPObject::sp_object_private_set(SPObject *object, unsigned int key, gchar const *value) -{ - object->cobject->onSet(key, value); -} - void SPObject::setKeyValue(unsigned int key, gchar const *value) { //g_assert(object != NULL); //g_assert(SP_IS_OBJECT(object)); -// if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->set) { -// ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->set(this, key, value); -// } this->cobject->onSet(key, value); } @@ -1038,7 +994,7 @@ void SPObject::readAttr(gchar const *key) } } -void SPObject::sp_object_repr_attr_changed(Inkscape::XML::Node */*repr*/, gchar const *key, gchar const */*oldval*/, gchar const */*newval*/, bool is_interactive, gpointer data) +void SPObject::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); @@ -1051,13 +1007,10 @@ void SPObject::sp_object_repr_attr_changed(Inkscape::XML::Node */*repr*/, gchar } } -void SPObject::sp_object_repr_content_changed(Inkscape::XML::Node */*repr*/, gchar const */*oldcontent*/, gchar const */*newcontent*/, gpointer data) +void SPObject::repr_content_changed(Inkscape::XML::Node * /*repr*/, gchar const * /*oldcontent*/, gchar const * /*newcontent*/, gpointer data) { SPObject *object = SP_OBJECT(data); -// if (((SPObjectClass *) G_OBJECT_GET_CLASS(object))->read_content) { -// (*((SPObjectClass *) G_OBJECT_GET_CLASS(object))->read_content)(object); -// } object->cobject->onReadContent(); } @@ -1111,15 +1064,9 @@ Inkscape::XML::Node* CObject::onWrite(Inkscape::XML::Document *doc, Inkscape::XM if( prefs->getBool("/options/svgoutput/check_on_editing") ) { unsigned int flags = sp_attribute_clean_get_prefs(); - gchar *s_cleaned = sp_attribute_clean_style( repr, s, flags ); - - // g_warning("SPObject::sp_object_private_write: %s", object->getId() ); - // g_warning(" old: :%s:", repr->attribute("style") ); - // g_warning(" new: :%s:", s ); - // g_warning(" cleaned: :%s:", s_cleaned ); - + Glib::ustring s_cleaned = sp_attribute_clean_style( repr, s, flags ); g_free( s ); - s = s_cleaned; + s = (s_cleaned.empty() ? NULL : g_strdup (s_cleaned.c_str())); } if( s == NULL || strcmp(s,"") == 0 ) { @@ -1160,12 +1107,6 @@ Inkscape::XML::Node* CObject::onWrite(Inkscape::XML::Document *doc, Inkscape::XM return repr; } -// CPPIFY: remove -Inkscape::XML::Node * SPObject::sp_object_private_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) -{ - return object->cobject->onWrite(doc, repr, flags); -} - Inkscape::XML::Node * SPObject::updateRepr(unsigned int flags) { if ( !cloned ) { @@ -1191,29 +1132,9 @@ Inkscape::XML::Node * SPObject::updateRepr(Inkscape::XML::Document *doc, Inkscap return NULL; } - -// if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->write) { -// if (!(flags & SP_OBJECT_WRITE_BUILD) && !repr) { -// repr = getRepr(); -// } -// return ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->write(this, doc, repr, flags); -// } else { -// g_warning("Class %s does not implement ::write", G_OBJECT_TYPE_NAME(this)); -// if (!repr) { -// if (flags & SP_OBJECT_WRITE_BUILD) { -// repr = getRepr()->duplicate(doc); -// } -// /// \todo FIXME: else probably error (Lauris) */ -// } else { -// repr->mergeFrom(getRepr(), "id"); -// } -// return repr; -// } - if (!(flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = getRepr(); } - //return ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->write(this, doc, repr, flags); return this->cobject->onWrite(doc, repr, flags); } @@ -1281,9 +1202,6 @@ void SPObject::updateDisplay(SPCtx *ctx, unsigned int flags) try { -// if (((SPObjectClass *) G_OBJECT_GET_CLASS(this))->update) { -// ((SPObjectClass *) G_OBJECT_GET_CLASS(this))->update(this, ctx, flags); -// } this->cobject->onUpdate(ctx, flags); } catch(...) @@ -1342,10 +1260,6 @@ void SPObject::emitModified(unsigned int flags) g_object_ref(G_OBJECT(this)); -// SPObjectClass *klass=(SPObjectClass *)G_OBJECT_GET_CLASS(this); -// if (klass->modified) { -// klass->modified(this, flags); -// } this->cobject->onModified(flags); _modified_signal.emit(this, flags); @@ -1405,9 +1319,10 @@ bool SPObject::storeAsDouble( gchar const *key, double *val ) const return sp_repr_get_double(((Inkscape::XML::Node *)(this->getRepr())),key,val); } -/* Helper */ - -gchar * SPObject::sp_object_get_unique_id(SPObject *object, gchar const *id) +/** Helper */ +static gchar* +sp_object_get_unique_id(SPObject *object, + gchar const *id) { static unsigned long count = 0; @@ -1514,6 +1429,9 @@ void SPObject::_requireSVGVersion(Inkscape::Version version) { be made. The same applies to 'desc' elements. Therefore, these functions ignore all but the first 'title' child element and first 'desc' child element, except when deleting a title or description. + + This will change in SVG 2, where multiple 'title' and 'desc' elements will + be allowed with different localized strings. */ gchar * SPObject::title() const |
