SPItem *SPFlowtext::get_frame(SPItem *after) { SPItem *frame = 0; SPObject *region = 0; for (SPObject *o = firstChild() ; o ; o = o->getNext() ) { if (SP_IS_FLOWREGION(o)) { region = o; break; } } if (region) { bool past = false; for (SPObject *o = region->firstChild() ; o ; o = o->getNext() ) { if (SP_IS_ITEM(o)) { if ( (after == NULL) || past ) { frame = SP_ITEM(o); } else { if (SP_ITEM(o) == after) { past = true; } } } } if ( frame && SP_IS_USE(frame) ) { frame = SP_USE(frame)->get_original(); } } return frame; }
bool SPObject::setTitleOrDesc(gchar const *value, gchar const *svg_tagname, bool verbatim) { if (!verbatim) { // If the new title/description is just whitespace, // treat it as though it were NULL. if (value) { bool just_whitespace = true; for (const gchar *cp = value; *cp; ++cp) { if (!std::strchr("\r\n \t", *cp)) { just_whitespace = false; break; } } if (just_whitespace) { value = NULL; } } // Don't stomp on mark-up if there is no real change. if (value) { gchar *current_value = getTitleOrDesc(svg_tagname); if (current_value) { bool different = std::strcmp(current_value, value); g_free(current_value); if (!different) { return false; } } } } SPObject *elem = findFirstChild(svg_tagname); if (value == NULL) { if (elem == NULL) { return false; } // delete the title/description(s) while (elem) { elem->deleteObject(); elem = findFirstChild(svg_tagname); } return true; } Inkscape::XML::Document *xml_doc = document->getReprDoc(); if (elem == NULL) { // create a new 'title' or 'desc' element, putting it at the // beginning (in accordance with the spec's recommendations) Inkscape::XML::Node *xml_elem = xml_doc->createElement(svg_tagname); repr->addChild(xml_elem, NULL); elem = document->getObjectByRepr(xml_elem); Inkscape::GC::release(xml_elem); } else { // remove the current content of the 'text' or 'desc' element SPObject *child; while (NULL != (child = elem->firstChild())) child->deleteObject(); } // add the new content elem->appendChildRepr(xml_doc->createTextNode(value)); return true; }