void sp_tref_update_text(SPTRef *tref) { if (tref) { // Get the character data that will be used with this tref Glib::ustring charData = ""; build_string_from_root(SP_OBJECT_REPR(tref->getObjectReferredTo()), &charData); // Create the node and SPString to be the tref's child (if it doesn't exist yet) if (!tref->stringChild) { Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(tref)); Inkscape::XML::Node *newStringRepr = xml_doc->createTextNode(charData.c_str()); tref->stringChild = SP_OBJECT(g_object_new(sp_repr_type_lookup(newStringRepr), NULL)); // Add this SPString as a child of the tref sp_object_attach(SP_OBJECT(tref), tref->stringChild, tref->lastChild()); sp_object_unref(tref->stringChild, NULL); sp_object_invoke_build(tref->stringChild, SP_OBJECT(tref)->document, newStringRepr, TRUE); Inkscape::GC::release(newStringRepr); } else { // Set the string content for the existing node Inkscape::XML::Node *stringRepr = SP_OBJECT_REPR(tref->stringChild); stringRepr->setContent(charData.c_str()); } } }