X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ftext-chemistry.cpp;h=4853258596d82d74c539e119585d06b964a0f728;hb=f9cb5a9e9d6ea60cd2e8e3dc63cb070fa10f9650;hp=4ea47fd278fd4caf19e1d9616d5e28126be4c798;hpb=e7a5f3e4a4758ac8353e070265e9bf03ed7228c9;p=inkscape.git diff --git a/src/text-chemistry.cpp b/src/text-chemistry.cpp index 4ea47fd27..485325859 100644 --- a/src/text-chemistry.cpp +++ b/src/text-chemistry.cpp @@ -20,6 +20,7 @@ #include "sp-rect.h" #include "sp-textpath.h" #include "inkscape.h" +#include "desktop.h" #include "document.h" #include "message-stack.h" #include "selection.h" @@ -92,6 +93,8 @@ text_put_on_path() SPItem *text = text_or_flowtext_in_selection(selection); SPItem *shape = shape_in_selection(selection); + Inkscape::XML::Document *xml_doc = sp_document_repr_doc(desktop->doc()); + if (!text || !shape || g_slist_length((GSList *) selection->itemList()) != 2) { sp_desktop_message_stack(desktop)->flash(Inkscape::WARNING_MESSAGE, _("Select a text and a path to put text on path.")); return; @@ -110,7 +113,17 @@ text_put_on_path() // if a flowed text is selected, convert it to a regular text object if (SP_IS_FLOWTEXT(text)) { + + if (!SP_FLOWTEXT(text)->layout.outputExists()) { + sp_desktop_message_stack(desktop)-> + flash(Inkscape::WARNING_MESSAGE, + _("The flowed text(s) must be visible in order to be put on a path.")); + } + Inkscape::XML::Node *repr = SP_FLOWTEXT(text)->getAsText(); + + if (!repr) return; + Inkscape::XML::Node *parent = SP_OBJECT_REPR(text)->parent(); parent->appendChild(repr); @@ -142,7 +155,7 @@ text_put_on_path() } // create textPath and put it into the text - Inkscape::XML::Node *textpath = sp_repr_new("svg:textPath"); + Inkscape::XML::Node *textpath = xml_doc->createElement("svg:textPath"); // reference the shape textpath->setAttribute("xlink:href", g_strdup_printf("#%s", SP_OBJECT_REPR(shape)->attribute("id"))); if (text_alignment == Inkscape::Text::Layout::RIGHT) @@ -152,8 +165,8 @@ text_put_on_path() SP_OBJECT_REPR(text)->addChild(textpath, NULL); for ( GSList *i = text_reprs ; i ; i = i->next ) { - // make a copy of each text child - Inkscape::XML::Node *copy = ((Inkscape::XML::Node *) i->data)->duplicate(); + // Make a copy of each text child + Inkscape::XML::Node *copy = ((Inkscape::XML::Node *) i->data)->duplicate(xml_doc); // We cannot have multiline in textpath, so remove line attrs from tspans if (!strcmp(copy->name(), "svg:tspan")) { copy->setAttribute("sodipodi:role", NULL); @@ -269,6 +282,7 @@ text_flow_into_shape() return; SPDocument *doc = sp_desktop_document (desktop); + Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc); Inkscape::Selection *selection = sp_desktop_selection(desktop); @@ -286,14 +300,14 @@ text_flow_into_shape() SP_OBJECT_REPR(text)->setAttribute("transform", NULL); } - Inkscape::XML::Node *root_repr = sp_repr_new("svg:flowRoot"); + Inkscape::XML::Node *root_repr = xml_doc->createElement("svg:flowRoot"); root_repr->setAttribute("xml:space", "preserve"); // we preserve spaces in the text objects we create root_repr->setAttribute("style", SP_OBJECT_REPR(text)->attribute("style")); // fixme: transfer style attrs too SP_OBJECT_REPR(SP_OBJECT_PARENT(shape))->appendChild(root_repr); SPObject *root_object = doc->getObjectByRepr(root_repr); g_return_if_fail(SP_IS_FLOWTEXT(root_object)); - Inkscape::XML::Node *region_repr = sp_repr_new("svg:flowRegion"); + Inkscape::XML::Node *region_repr = xml_doc->createElement("svg:flowRegion"); root_repr->appendChild(region_repr); SPObject *object = doc->getObjectByRepr(region_repr); g_return_if_fail(SP_IS_FLOWREGION(object)); @@ -304,7 +318,7 @@ text_flow_into_shape() items = items->next) { SPItem *item = SP_ITEM(items->data); if (SP_IS_SHAPE(item)){ - Inkscape::XML::Node *clone = sp_repr_new("svg:use"); + Inkscape::XML::Node *clone = xml_doc->createElement("svg:use"); clone->setAttribute("x", "0"); clone->setAttribute("y", "0"); clone->setAttribute("xlink:href", g_strdup_printf("#%s", SP_OBJECT_REPR(item)->attribute("id"))); @@ -315,7 +329,7 @@ text_flow_into_shape() } if (SP_IS_TEXT(text)) { // flow from text, as string - Inkscape::XML::Node *para_repr = sp_repr_new("svg:flowPara"); + Inkscape::XML::Node *para_repr = xml_doc->createElement("svg:flowPara"); root_repr->appendChild(para_repr); object = doc->getObjectByRepr(para_repr); g_return_if_fail(SP_IS_FLOWPARA(object)); @@ -323,7 +337,7 @@ text_flow_into_shape() Inkscape::Text::Layout const *layout = te_get_layout(text); Glib::ustring text_ustring = sp_te_get_string_multiline(text, layout->begin(), layout->end()); - Inkscape::XML::Node *text_repr = sp_repr_new_text(text_ustring.c_str()); // FIXME: transfer all formatting! and convert newlines into flowParas! + Inkscape::XML::Node *text_repr = xml_doc->createTextNode(text_ustring.c_str()); // FIXME: transfer all formatting! and convert newlines into flowParas! para_repr->appendChild(text_repr); Inkscape::GC::release(para_repr); @@ -332,7 +346,7 @@ text_flow_into_shape() } else { // reflow an already flowed text, preserving paras for (SPObject *o = SP_OBJECT(text)->children; o != NULL; o = o->next) { if (SP_IS_FLOWPARA(o)) { - Inkscape::XML::Node *para_repr = SP_OBJECT_REPR(o)->duplicate(); + Inkscape::XML::Node *para_repr = SP_OBJECT_REPR(o)->duplicate(xml_doc); root_repr->appendChild(para_repr); object = doc->getObjectByRepr(para_repr); g_return_if_fail(SP_IS_FLOWPARA(object)); @@ -360,6 +374,7 @@ text_unflow () return; SPDocument *doc = sp_desktop_document (desktop); + Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc); Inkscape::Selection *selection = sp_desktop_selection(desktop); @@ -382,8 +397,12 @@ text_unflow () SPItem *flowtext = SP_ITEM(items->data); + if (sp_te_get_string_multiline(flowtext) == NULL) { // flowtext is empty + continue; + } + /* Create */ - Inkscape::XML::Node *rtext = sp_repr_new("svg:text"); + Inkscape::XML::Node *rtext = xml_doc->createElement("svg:text"); rtext->setAttribute("xml:space", "preserve"); // we preserve spaces in the text objects we create /* Set style */ @@ -398,12 +417,12 @@ text_unflow () } /* Create */ - Inkscape::XML::Node *rtspan = sp_repr_new("svg:tspan"); + Inkscape::XML::Node *rtspan = xml_doc->createElement("svg:tspan"); rtspan->setAttribute("sodipodi:role", "line"); // otherwise, why bother creating the tspan? rtext->addChild(rtspan, NULL); gchar *text_string = sp_te_get_string_multiline(flowtext); - Inkscape::XML::Node *text_repr = sp_repr_new_text(text_string); // FIXME: transfer all formatting!!! + Inkscape::XML::Node *text_repr = xml_doc->createTextNode(text_string); // FIXME: transfer all formatting!!! free(text_string); rtspan->appendChild(text_repr); @@ -455,9 +474,19 @@ flowtext_to_text() if (!SP_IS_FLOWTEXT(item)) continue; - did = true; + if (!SP_FLOWTEXT(item)->layout.outputExists()) { + sp_desktop_message_stack(desktop)-> + flash(Inkscape::WARNING_MESSAGE, + _("The flowed text(s) must be visible in order to be converted.")); + return; + } Inkscape::XML::Node *repr = SP_FLOWTEXT(item)->getAsText(); + + if (!repr) break; + + did = true; + Inkscape::XML::Node *parent = SP_OBJECT_REPR(item)->parent(); parent->appendChild(repr);