summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorLiam P. White <inkscapebronyat-signgmaildotcom>2014-03-09 02:56:07 +0000
committerLiam P. White <inkscapebronyat-signgmaildotcom>2014-03-09 02:56:07 +0000
commitc515627314d3ec501dc6de928fb60b5d7895c557 (patch)
tree8a4e5c479e8b41df87494fe555934f42aa424537 /src/ui
parentRemove all trace of the Tags dialog (diff)
parentRemove useless r variable and warning (diff)
downloadinkscape-c515627314d3ec501dc6de928fb60b5d7895c557.tar.gz
inkscape-c515627314d3ec501dc6de928fb60b5d7895c557.zip
Update to trunk
(bzr r13090.1.22)
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/dialog/export.cpp502
-rw-r--r--src/ui/dialog/export.h48
-rw-r--r--src/ui/dialog/symbols.cpp4
-rw-r--r--src/ui/dialog/undo-history.cpp130
-rw-r--r--src/ui/dialog/undo-history.h11
-rw-r--r--src/ui/tools/text-tool.cpp217
-rw-r--r--src/ui/tools/text-tool.h6
-rw-r--r--src/ui/tools/tool-base.h5
8 files changed, 493 insertions, 430 deletions
diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp
index 340a3dad0..f0a5f1bf5 100644
--- a/src/ui/dialog/export.cpp
+++ b/src/ui/dialog/export.cpp
@@ -144,11 +144,13 @@ namespace Dialog {
/** A list of strings that is used both in the preferences, and in the
data fields to describe the various values of \c selection_type. */
static const char * selection_names[SELECTION_NUMBER_OF] = {
- "page", "drawing", "selection", "custom"};
+ "page", "drawing", "selection", "custom"
+};
/** The names on the buttons for the various selection types. */
static const char * selection_labels[SELECTION_NUMBER_OF] = {
- N_("_Page"), N_("_Drawing"), N_("_Selection"), N_("_Custom")};
+ N_("_Page"), N_("_Drawing"), N_("_Selection"), N_("_Custom")
+};
Export::Export (void) :
UI::Widget::Panel ("", "/dialogs/export/", SP_VERB_DIALOG_EXPORT),
@@ -201,7 +203,7 @@ Export::Export (void) :
/* gets added to the vbox later, but the unit selector is needed
earlier than that */
unit_selector.setUnitType(Inkscape::Util::UNIT_TYPE_LINEAR);
-
+
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop) {
unit_selector.setUnit(sp_desktop_namedview(desktop)->doc_units->abbr);
@@ -232,28 +234,28 @@ Export::Export (void) :
#endif
x0_adj = createSpinbutton ( "x0", 0.0, -1000000.0, 1000000.0, 0.1, 1.0,
- t, 0, 0, _("_x0:"), "", EXPORT_COORD_PRECISION, 1,
- &Export::onAreaX0Change);
+ t, 0, 0, _("_x0:"), "", EXPORT_COORD_PRECISION, 1,
+ &Export::onAreaX0Change);
x1_adj = createSpinbutton ( "x1", 0.0, -1000000.0, 1000000.0, 0.1, 1.0,
- t, 0, 1, _("x_1:"), "", EXPORT_COORD_PRECISION, 1,
- &Export::onAreaX1Change);
+ t, 0, 1, _("x_1:"), "", EXPORT_COORD_PRECISION, 1,
+ &Export::onAreaX1Change);
width_adj = createSpinbutton ( "width", 0.0, 0.0, PNG_UINT_31_MAX, 0.1, 1.0,
- t, 0, 2, _("Wid_th:"), "", EXPORT_COORD_PRECISION, 1,
- &Export::onAreaWidthChange);
+ t, 0, 2, _("Wid_th:"), "", EXPORT_COORD_PRECISION, 1,
+ &Export::onAreaWidthChange);
y0_adj = createSpinbutton ( "y0", 0.0, -1000000.0, 1000000.0, 0.1, 1.0,
- t, 2, 0, _("_y0:"), "", EXPORT_COORD_PRECISION, 1,
- &Export::onAreaY0Change);
+ t, 2, 0, _("_y0:"), "", EXPORT_COORD_PRECISION, 1,
+ &Export::onAreaY0Change);
y1_adj = createSpinbutton ( "y1", 0.0, -1000000.0, 1000000.0, 0.1, 1.0,
- t, 2, 1, _("y_1:"), "", EXPORT_COORD_PRECISION, 1,
- &Export::onAreaY1Change);
+ t, 2, 1, _("y_1:"), "", EXPORT_COORD_PRECISION, 1,
+ &Export::onAreaY1Change);
height_adj = createSpinbutton ( "height", 0.0, 0.0, PNG_UINT_31_MAX, 0.1, 1.0,
- t, 2, 2, _("Hei_ght:"), "", EXPORT_COORD_PRECISION, 1,
- &Export::onAreaHeightChange);
+ t, 2, 2, _("Hei_ght:"), "", EXPORT_COORD_PRECISION, 1,
+ &Export::onAreaHeightChange);
area_box.pack_start(togglebox, false, false, 3);
area_box.pack_start(*t, false, false, 0);
@@ -284,27 +286,27 @@ Export::Export (void) :
size_box.pack_start(*t);
bmwidth_adj = createSpinbutton ( "bmwidth", 16.0, 1.0, 1000000.0, 1.0, 10.0,
- t, 0, 0,
- _("_Width:"), _("pixels at"), 0, 1,
- &Export::onBitmapWidthChange);
+ t, 0, 0,
+ _("_Width:"), _("pixels at"), 0, 1,
+ &Export::onBitmapWidthChange);
xdpi_adj = createSpinbutton ( "xdpi",
- prefs->getDouble("/dialogs/export/defaultxdpi/value", DPI_BASE),
- 0.01, 100000.0, 0.1, 1.0, t, 3, 0,
- "", _("dp_i"), 2, 1,
- &Export::onExportXdpiChange);
+ prefs->getDouble("/dialogs/export/defaultxdpi/value", DPI_BASE),
+ 0.01, 100000.0, 0.1, 1.0, t, 3, 0,
+ "", _("dp_i"), 2, 1,
+ &Export::onExportXdpiChange);
bmheight_adj = createSpinbutton ( "bmheight", 16.0, 1.0, 1000000.0, 1.0, 10.0,
- t, 0, 1,
- _("_Height:"), _("pixels at"), 0, 1,
- &Export::onBitmapHeightChange);
+ t, 0, 1,
+ _("_Height:"), _("pixels at"), 0, 1,
+ &Export::onBitmapHeightChange);
/** TODO
* There's no way to set ydpi currently, so we use the defaultxdpi value here, too...
*/
ydpi_adj = createSpinbutton ( "ydpi", prefs->getDouble("/dialogs/export/defaultxdpi/value", DPI_BASE),
- 0.01, 100000.0, 0.1, 1.0, t, 3, 1,
- "", _("dpi"), 2, 0, NULL );
+ 0.01, 100000.0, 0.1, 1.0, t, 3, 1,
+ "", _("dpi"), 2, 0, NULL );
singleexport_box.pack_start(size_box);
}
@@ -482,18 +484,18 @@ void Export::set_default_filename () {
#if WITH_GTKMM_3_0
Glib::RefPtr<Gtk::Adjustment> Export::createSpinbutton( gchar const * /*key*/, float val, float min, float max,
- float step, float page,
- Gtk::Grid *t, int x, int y,
- const Glib::ustring ll, const Glib::ustring lr,
- int digits, unsigned int sensitive,
- void (Export::*cb)() )
+ float step, float page,
+ Gtk::Grid *t, int x, int y,
+ const Glib::ustring& ll, const Glib::ustring& lr,
+ int digits, unsigned int sensitive,
+ void (Export::*cb)() )
#else
Gtk::Adjustment * Export::createSpinbutton( gchar const * /*key*/, float val, float min, float max,
- float step, float page,
- Gtk::Table *t, int x, int y,
- const Glib::ustring ll, const Glib::ustring lr,
- int digits, unsigned int sensitive,
- void (Export::*cb)() )
+ float step, float page,
+ Gtk::Table *t, int x, int y,
+ const Glib::ustring& ll, const Glib::ustring& lr,
+ int digits, unsigned int sensitive,
+ void (Export::*cb)() )
#endif
{
#if WITH_GTKMM_3_0
@@ -535,7 +537,9 @@ Gtk::Adjustment * Export::createSpinbutton( gchar const * /*key*/, float val, fl
sb->set_sensitive (sensitive);
pos++;
- if (!ll.empty()) { l->set_mnemonic_widget(*sb);}
+ if (!ll.empty()) {
+ l->set_mnemonic_widget(*sb);
+ }
if (!lr.empty()) {
l = new Gtk::Label(lr,true);
@@ -565,7 +569,7 @@ Gtk::Adjustment * Export::createSpinbutton( gchar const * /*key*/, float val, fl
Glib::ustring Export::create_filepath_from_id (Glib::ustring id, const Glib::ustring &file_entry_text)
{
if (id.empty())
- { /* This should never happen */
+ { /* This should never happen */
id = "bitmap";
}
@@ -678,35 +682,35 @@ void Export::onSelectionModified ( guint /*flags*/ )
{
Inkscape::Selection * Sel;
switch (current_key) {
- case SELECTION_DRAWING:
- if ( SP_ACTIVE_DESKTOP ) {
- SPDocument *doc;
- doc = sp_desktop_document (SP_ACTIVE_DESKTOP);
- Geom::OptRect bbox = doc->getRoot()->desktopVisualBounds();
- if (bbox) {
- setArea ( bbox->left(),
- bbox->top(),
- bbox->right(),
- bbox->bottom());
- }
+ case SELECTION_DRAWING:
+ if ( SP_ACTIVE_DESKTOP ) {
+ SPDocument *doc;
+ doc = sp_desktop_document (SP_ACTIVE_DESKTOP);
+ Geom::OptRect bbox = doc->getRoot()->desktopVisualBounds();
+ if (bbox) {
+ setArea ( bbox->left(),
+ bbox->top(),
+ bbox->right(),
+ bbox->bottom());
}
- break;
- case SELECTION_SELECTION:
- Sel = sp_desktop_selection(SP_ACTIVE_DESKTOP);
- if (Sel->isEmpty() == false) {
- Geom::OptRect bbox = Sel->visualBounds();
- if (bbox)
- {
- setArea ( bbox->left(),
- bbox->top(),
- bbox->right(),
- bbox->bottom());
- }
+ }
+ break;
+ case SELECTION_SELECTION:
+ Sel = sp_desktop_selection(SP_ACTIVE_DESKTOP);
+ if (Sel->isEmpty() == false) {
+ Geom::OptRect bbox = Sel->visualBounds();
+ if (bbox)
+ {
+ setArea ( bbox->left(),
+ bbox->top(),
+ bbox->right(),
+ bbox->bottom());
}
- break;
- default:
- /* Do nothing for page or for custom */
- break;
+ }
+ break;
+ default:
+ /* Do nothing for page or for custom */
+ break;
}
return;
@@ -738,39 +742,39 @@ void Export::onAreaToggled ()
various backups. If you modify this without noticing you'll
probabaly screw something up. */
switch (key) {
- case SELECTION_SELECTION:
- if ((sp_desktop_selection(SP_ACTIVE_DESKTOP))->isEmpty() == false)
- {
- bbox = sp_desktop_selection (SP_ACTIVE_DESKTOP)->visualBounds();
- /* Only if there is a selection that we can set
- do we break, otherwise we fall through to the
- drawing */
- // std::cout << "Using selection: SELECTION" << std::endl;
- key = SELECTION_SELECTION;
- break;
- }
- case SELECTION_DRAWING:
- /** \todo
- * This returns wrong values if the document has a viewBox.
- */
- bbox = doc->getRoot()->desktopVisualBounds();
- /* If the drawing is valid, then we'll use it and break
- otherwise we drop through to the page settings */
- if (bbox) {
- // std::cout << "Using selection: DRAWING" << std::endl;
- key = SELECTION_DRAWING;
- break;
- }
- case SELECTION_PAGE:
- bbox = Geom::Rect(Geom::Point(0.0, 0.0),
- Geom::Point(doc->getWidth().value("px"), doc->getHeight().value("px")));
-
- // std::cout << "Using selection: PAGE" << std::endl;
- key = SELECTION_PAGE;
+ case SELECTION_SELECTION:
+ if ((sp_desktop_selection(SP_ACTIVE_DESKTOP))->isEmpty() == false)
+ {
+ bbox = sp_desktop_selection (SP_ACTIVE_DESKTOP)->visualBounds();
+ /* Only if there is a selection that we can set
+ do we break, otherwise we fall through to the
+ drawing */
+ // std::cout << "Using selection: SELECTION" << std::endl;
+ key = SELECTION_SELECTION;
break;
- case SELECTION_CUSTOM:
- default:
+ }
+ case SELECTION_DRAWING:
+ /** \todo
+ * This returns wrong values if the document has a viewBox.
+ */
+ bbox = doc->getRoot()->desktopVisualBounds();
+ /* If the drawing is valid, then we'll use it and break
+ otherwise we drop through to the page settings */
+ if (bbox) {
+ // std::cout << "Using selection: DRAWING" << std::endl;
+ key = SELECTION_DRAWING;
break;
+ }
+ case SELECTION_PAGE:
+ bbox = Geom::Rect(Geom::Point(0.0, 0.0),
+ Geom::Point(doc->getWidth().value("px"), doc->getHeight().value("px")));
+
+ // std::cout << "Using selection: PAGE" << std::endl;
+ key = SELECTION_PAGE;
+ break;
+ case SELECTION_CUSTOM:
+ default:
+ break;
} // switch
current_key = key;
@@ -780,9 +784,9 @@ void Export::onAreaToggled ()
if ( key != SELECTION_CUSTOM && bbox ) {
setArea ( bbox->min()[Geom::X],
- bbox->min()[Geom::Y],
- bbox->max()[Geom::X],
- bbox->max()[Geom::Y]);
+ bbox->min()[Geom::Y],
+ bbox->max()[Geom::X],
+ bbox->max()[Geom::Y]);
}
} // end of if ( SP_ACTIVE_DESKTOP )
@@ -793,43 +797,43 @@ void Export::onAreaToggled ()
float xdpi = 0.0, ydpi = 0.0;
switch (key) {
- case SELECTION_PAGE:
- case SELECTION_DRAWING: {
- SPDocument * doc = SP_ACTIVE_DOCUMENT;
- sp_document_get_export_hints (doc, filename, &xdpi, &ydpi);
-
- if (filename.empty()) {
- if (!doc_export_name.empty()) {
- filename = doc_export_name;
- }
+ case SELECTION_PAGE:
+ case SELECTION_DRAWING: {
+ SPDocument * doc = SP_ACTIVE_DOCUMENT;
+ sp_document_get_export_hints (doc, filename, &xdpi, &ydpi);
+
+ if (filename.empty()) {
+ if (!doc_export_name.empty()) {
+ filename = doc_export_name;
}
- break;
}
- case SELECTION_SELECTION:
- if ((sp_desktop_selection(SP_ACTIVE_DESKTOP))->isEmpty() == false) {
-
- sp_selection_get_export_hints (sp_desktop_selection(SP_ACTIVE_DESKTOP), filename, &xdpi, &ydpi);
-
- /* If we still don't have a filename -- let's build
- one that's nice */
- if (filename.empty()) {
- const gchar * id = "object";
- const GSList * reprlst = sp_desktop_selection(SP_ACTIVE_DESKTOP)->reprList();
- for(; reprlst != NULL; reprlst = reprlst->next) {
- Inkscape::XML::Node * repr = (Inkscape::XML::Node *)reprlst->data;
- if (repr->attribute("id")) {
- id = repr->attribute("id");
- break;
- }
- }
+ break;
+ }
+ case SELECTION_SELECTION:
+ if ((sp_desktop_selection(SP_ACTIVE_DESKTOP))->isEmpty() == false) {
- filename = create_filepath_from_id (id, filename_entry.get_text());
+ sp_selection_get_export_hints (sp_desktop_selection(SP_ACTIVE_DESKTOP), filename, &xdpi, &ydpi);
+
+ /* If we still don't have a filename -- let's build
+ one that's nice */
+ if (filename.empty()) {
+ const gchar * id = "object";
+ const GSList * reprlst = sp_desktop_selection(SP_ACTIVE_DESKTOP)->reprList();
+ for(; reprlst != NULL; reprlst = reprlst->next) {
+ Inkscape::XML::Node * repr = (Inkscape::XML::Node *)reprlst->data;
+ if (repr->attribute("id")) {
+ id = repr->attribute("id");
+ break;
+ }
}
+
+ filename = create_filepath_from_id (id, filename_entry.get_text());
}
- break;
- case SELECTION_CUSTOM:
- default:
- break;
+ }
+ break;
+ case SELECTION_CUSTOM:
+ default:
+ break;
}
if (!filename.empty()) {
@@ -895,8 +899,8 @@ unsigned int Export::onProgressCallback(float value, void *dlg)
int evtcount = 0;
while ((evtcount < 16) && gdk_events_pending()) {
- gtk_main_iteration_do(FALSE);
- evtcount += 1;
+ gtk_main_iteration_do(FALSE);
+ evtcount += 1;
}
gtk_main_iteration_do(FALSE);
@@ -960,7 +964,7 @@ Glib::ustring Export::filename_add_extension (Glib::ustring filename, Glib::ustr
}
else
{
- return filename = filename + "." + extension;
+ return filename = filename + "." + extension;
}
}
}
@@ -1057,9 +1061,9 @@ void Export::onExport ()
// Do export
gchar * safeFile = Inkscape::IO::sanitizeString(path.c_str());
MessageCleaner msgCleanup(desktop->messageStack()->pushF(Inkscape::IMMEDIATE_MESSAGE,
- _("Exporting file <b>%s</b>..."), safeFile), desktop);
+ _("Exporting file <b>%s</b>..."), safeFile), desktop);
MessageCleaner msgFlashCleanup(desktop->messageStack()->flashF(Inkscape::IMMEDIATE_MESSAGE,
- _("Exporting file <b>%s</b>..."), safeFile), desktop);
+ _("Exporting file <b>%s</b>..."), safeFile), desktop);
if (!sp_export_png_file (doc, path.c_str(),
*area, width, height, dpi, dpi,
@@ -1067,7 +1071,7 @@ void Export::onExport ()
onProgressCallback, (void*)prog_dlg,
TRUE, // overwrite without asking
hide ? const_cast<GSList *>(sp_desktop_selection(desktop)->itemList()) : NULL
- )) {
+ )) {
gchar * error = g_strdup_printf(_("Could not export to filename %s.\n"), safeFile);
desktop->messageStack()->flashF(Inkscape::ERROR_MESSAGE,
@@ -1096,7 +1100,7 @@ void Export::onExport ()
} else {
Glib::ustring filename = filename_entry.get_text();
- if (filename.empty()){
+ if (filename.empty()) {
desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("You have to enter a filename."));
sp_ui_error_dialog(_("You have to enter a filename"));
return;
@@ -1125,7 +1129,7 @@ void Export::onExport ()
Glib::ustring dirname = Glib::path_get_dirname(path);
if ( dirname.empty()
- || !Inkscape::IO::file_test(dirname.c_str(), (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) )
+ || !Inkscape::IO::file_test(dirname.c_str(), (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) )
{
gchar *safeDir = Inkscape::IO::sanitizeString(dirname.c_str());
gchar *error = g_strdup_printf(_("Directory %s does not exist or is not a directory.\n"),
@@ -1151,12 +1155,12 @@ void Export::onExport ()
/* Do export */
ExportResult status = sp_export_png_file(sp_desktop_document(desktop), path.c_str(),
- Geom::Rect(Geom::Point(x0, y0), Geom::Point(x1, y1)), width, height, xdpi, ydpi,
- nv->pagecolor,
- onProgressCallback, (void*)prog_dlg,
- FALSE,
- hide ? const_cast<GSList *>(sp_desktop_selection(desktop)->itemList()) : NULL
- );
+ Geom::Rect(Geom::Point(x0, y0), Geom::Point(x1, y1)), width, height, xdpi, ydpi,
+ nv->pagecolor,
+ onProgressCallback, (void*)prog_dlg,
+ FALSE,
+ hide ? const_cast<GSList *>(sp_desktop_selection(desktop)->itemList()) : NULL
+ );
if (status == EXPORT_ERROR) {
gchar * safeFile = Inkscape::IO::sanitizeString(path.c_str());
gchar * error = g_strdup_printf(_("Could not export to filename %s.\n"), safeFile);
@@ -1189,19 +1193,65 @@ void Export::onExport ()
/* Setup the values in the document */
switch (current_key) {
- case SELECTION_PAGE:
- case SELECTION_DRAWING: {
- SPDocument * doc = SP_ACTIVE_DOCUMENT;
- Inkscape::XML::Node * repr = doc->getReprRoot();
- bool modified = false;
-
- bool saved = DocumentUndo::getUndoSensitive(doc);
- DocumentUndo::setUndoSensitive(doc, false);
-
- gchar const *temp_string = repr->attribute("inkscape:export-filename");
- if (temp_string == NULL || (filename_ext != temp_string)) {
- repr->setAttribute("inkscape:export-filename", filename_ext.c_str());
- modified = true;
+ case SELECTION_PAGE:
+ case SELECTION_DRAWING: {
+ SPDocument * doc = SP_ACTIVE_DOCUMENT;
+ Inkscape::XML::Node * repr = doc->getReprRoot();
+ bool modified = false;
+
+ bool saved = DocumentUndo::getUndoSensitive(doc);
+ DocumentUndo::setUndoSensitive(doc, false);
+
+ gchar const *temp_string = repr->attribute("inkscape:export-filename");
+ if (temp_string == NULL || (filename_ext != temp_string)) {
+ repr->setAttribute("inkscape:export-filename", filename_ext.c_str());
+ modified = true;
+ }
+ temp_string = repr->attribute("inkscape:export-xdpi");
+ if (temp_string == NULL || xdpi != atof(temp_string)) {
+ sp_repr_set_svg_double(repr, "inkscape:export-xdpi", xdpi);
+ modified = true;
+ }
+ temp_string = repr->attribute("inkscape:export-ydpi");
+ if (temp_string == NULL || ydpi != atof(temp_string)) {
+ sp_repr_set_svg_double(repr, "inkscape:export-ydpi", ydpi);
+ modified = true;
+ }
+ DocumentUndo::setUndoSensitive(doc, saved);
+
+ if (modified) {
+ doc->setModifiedSinceSave();
+ }
+ break;
+ }
+ case SELECTION_SELECTION: {
+ const GSList * reprlst;
+ SPDocument * doc = SP_ACTIVE_DOCUMENT;
+ bool modified = false;
+
+ bool saved = DocumentUndo::getUndoSensitive(doc);
+ DocumentUndo::setUndoSensitive(doc, false);
+ reprlst = sp_desktop_selection(desktop)->reprList();
+
+ for(; reprlst != NULL; reprlst = reprlst->next) {
+ Inkscape::XML::Node * repr = static_cast<Inkscape::XML::Node *>(reprlst->data);
+ const gchar * temp_string;
+ Glib::ustring dir = Glib::path_get_dirname(filename.c_str());
+ const gchar* docURI=SP_ACTIVE_DOCUMENT->getURI();
+ Glib::ustring docdir;
+ if (docURI)
+ {
+ docdir = Glib::path_get_dirname(docURI);
+ }
+ if (repr->attribute("id") == NULL ||
+ !(filename_ext.find_last_of(repr->attribute("id")) &&
+ ( !docURI ||
+ (dir == docdir)))) {
+ temp_string = repr->attribute("inkscape:export-filename");
+ if (temp_string == NULL || (filename_ext != temp_string)) {
+ repr->setAttribute("inkscape:export-filename", filename_ext.c_str());
+ modified = true;
+ }
}
temp_string = repr->attribute("inkscape:export-xdpi");
if (temp_string == NULL || xdpi != atof(temp_string)) {
@@ -1213,62 +1263,16 @@ void Export::onExport ()
sp_repr_set_svg_double(repr, "inkscape:export-ydpi", ydpi);
modified = true;
}
- DocumentUndo::setUndoSensitive(doc, saved);
-
- if (modified) {
- doc->setModifiedSinceSave();
- }
- break;
}
- case SELECTION_SELECTION: {
- const GSList * reprlst;
- SPDocument * doc = SP_ACTIVE_DOCUMENT;
- bool modified = false;
-
- bool saved = DocumentUndo::getUndoSensitive(doc);
- DocumentUndo::setUndoSensitive(doc, false);
- reprlst = sp_desktop_selection(desktop)->reprList();
-
- for(; reprlst != NULL; reprlst = reprlst->next) {
- Inkscape::XML::Node * repr = static_cast<Inkscape::XML::Node *>(reprlst->data);
- const gchar * temp_string;
- Glib::ustring dir = Glib::path_get_dirname(filename.c_str());
- const gchar* docURI=SP_ACTIVE_DOCUMENT->getURI();
- Glib::ustring docdir;
- if (docURI)
- {
- docdir = Glib::path_get_dirname(docURI);
- }
- if (repr->attribute("id") == NULL ||
- !(filename_ext.find_last_of(repr->attribute("id")) &&
- ( !docURI ||
- (dir == docdir)))) {
- temp_string = repr->attribute("inkscape:export-filename");
- if (temp_string == NULL || (filename_ext != temp_string)) {
- repr->setAttribute("inkscape:export-filename", filename_ext.c_str());
- modified = true;
- }
- }
- temp_string = repr->attribute("inkscape:export-xdpi");
- if (temp_string == NULL || xdpi != atof(temp_string)) {
- sp_repr_set_svg_double(repr, "inkscape:export-xdpi", xdpi);
- modified = true;
- }
- temp_string = repr->attribute("inkscape:export-ydpi");
- if (temp_string == NULL || ydpi != atof(temp_string)) {
- sp_repr_set_svg_double(repr, "inkscape:export-ydpi", ydpi);
- modified = true;
- }
- }
- DocumentUndo::setUndoSensitive(doc, saved);
+ DocumentUndo::setUndoSensitive(doc, saved);
- if (modified) {
- doc->setModifiedSinceSave();
- }
- break;
+ if (modified) {
+ doc->setModifiedSinceSave();
}
- default:
- break;
+ break;
+ }
+ default:
+ break;
}
}
@@ -1331,8 +1335,8 @@ void Export::onBrowse ()
// Copy the selected file name, converting from UTF-8 to UTF-16
std::string dirname = Glib::path_get_dirname(filename.raw());
if ( !Glib::file_test(dirname, Glib::FILE_TEST_EXISTS) ||
- Glib::file_test(filename, Glib::FILE_TEST_IS_DIR) ||
- dirname.empty() )
+ Glib::file_test(filename, Glib::FILE_TEST_IS_DIR) ||
+ dirname.empty() )
{
Glib::ustring tmp;
filename = create_filepath_from_id(tmp, tmp);
@@ -1407,11 +1411,11 @@ bool Export::bbox_equal(Geom::Rect const &one, Geom::Rect const &two)
{
double const epsilon = pow(10.0, -EXPORT_COORD_PRECISION);
return (
- (fabs(one.min()[Geom::X] - two.min()[Geom::X]) < epsilon) &&
- (fabs(one.min()[Geom::Y] - two.min()[Geom::Y]) < epsilon) &&
- (fabs(one.max()[Geom::X] - two.max()[Geom::X]) < epsilon) &&
- (fabs(one.max()[Geom::Y] - two.max()[Geom::Y]) < epsilon)
- );
+ (fabs(one.min()[Geom::X] - two.min()[Geom::X]) < epsilon) &&
+ (fabs(one.min()[Geom::Y] - two.min()[Geom::Y]) < epsilon) &&
+ (fabs(one.max()[Geom::X] - two.max()[Geom::X]) < epsilon) &&
+ (fabs(one.max()[Geom::Y] - two.max()[Geom::Y]) < epsilon)
+ );
}
/**
@@ -1454,48 +1458,48 @@ void Export::detectSize() {
for (int i = 0;
i < SELECTION_NUMBER_OF + 1 &&
- key == SELECTION_NUMBER_OF &&
- SP_ACTIVE_DESKTOP != NULL;
+ key == SELECTION_NUMBER_OF &&
+ SP_ACTIVE_DESKTOP != NULL;
i++) {
switch (this_test[i]) {
- case SELECTION_SELECTION:
- if ((sp_desktop_selection(SP_ACTIVE_DESKTOP))->isEmpty() == false) {
- Geom::OptRect bbox = (sp_desktop_selection (SP_ACTIVE_DESKTOP))->bounds(SPItem::VISUAL_BBOX);
+ case SELECTION_SELECTION:
+ if ((sp_desktop_selection(SP_ACTIVE_DESKTOP))->isEmpty() == false) {
+ Geom::OptRect bbox = (sp_desktop_selection (SP_ACTIVE_DESKTOP))->bounds(SPItem::VISUAL_BBOX);
- if ( bbox && bbox_equal(*bbox,current_bbox)) {
- key = SELECTION_SELECTION;
- }
+ if ( bbox && bbox_equal(*bbox,current_bbox)) {
+ key = SELECTION_SELECTION;
}
- break;
- case SELECTION_DRAWING: {
- SPDocument *doc = sp_desktop_document (SP_ACTIVE_DESKTOP);
+ }
+ break;
+ case SELECTION_DRAWING: {
+ SPDocument *doc = sp_desktop_document (SP_ACTIVE_DESKTOP);
- Geom::OptRect bbox = doc->getRoot()->desktopVisualBounds();
+ Geom::OptRect bbox = doc->getRoot()->desktopVisualBounds();
- if ( bbox && bbox_equal(*bbox,current_bbox) ) {
- key = SELECTION_DRAWING;
- }
- break;
+ if ( bbox && bbox_equal(*bbox,current_bbox) ) {
+ key = SELECTION_DRAWING;
}
+ break;
+ }
- case SELECTION_PAGE: {
- SPDocument *doc;
+ case SELECTION_PAGE: {
+ SPDocument *doc;
- doc = sp_desktop_document (SP_ACTIVE_DESKTOP);
+ doc = sp_desktop_document (SP_ACTIVE_DESKTOP);
- Geom::Point x(0.0, 0.0);
- Geom::Point y(doc->getWidth().value("px"),
- doc->getHeight().value("px"));
- Geom::Rect bbox(x, y);
+ Geom::Point x(0.0, 0.0);
+ Geom::Point y(doc->getWidth().value("px"),
+ doc->getHeight().value("px"));
+ Geom::Rect bbox(x, y);
- if (bbox_equal(bbox,current_bbox)) {
- key = SELECTION_PAGE;
- }
+ if (bbox_equal(bbox,current_bbox)) {
+ key = SELECTION_PAGE;
+ }
- break;
- }
+ break;
+ }
default:
- break;
+ break;
}
}
// std::cout << std::endl;
@@ -1579,7 +1583,7 @@ void Export::areaYChange (Gtk::Adjustment *adj)
height = SP_EXPORT_MIN_SIZE;
//key = (const gchar *)g_object_get_data(G_OBJECT (adj), "key");
if (adj == y1_adj) {
- //if (!strcmp (key, "y0")) {
+ //if (!strcmp (key, "y0")) {
y1 = y0 + height * DPI_BASE / ydpi;
setValuePx(y1_adj, y1);
} else {
diff --git a/src/ui/dialog/export.h b/src/ui/dialog/export.h
index 79e597414..6f3c0dfac 100644
--- a/src/ui/dialog/export.h
+++ b/src/ui/dialog/export.h
@@ -56,7 +56,9 @@ public:
Export ();
~Export ();
- static Export &getInstance() { return *new Export(); }
+ static Export &getInstance() {
+ return *new Export();
+ }
private:
@@ -97,7 +99,7 @@ private:
float getValue (Gtk::Adjustment *adj);
float getValuePx (Gtk::Adjustment *adj);
#endif
-
+
/**
* Helper function to create, style and pack spinbuttons for the export dialog.
*
@@ -121,20 +123,20 @@ private:
*/
#if WITH_GTKMM_3_0
Glib::RefPtr<Gtk::Adjustment> createSpinbutton( gchar const *key, float val, float min, float max,
- float step, float page,
- Gtk::Grid *t, int x, int y,
- const Glib::ustring ll, const Glib::ustring lr,
- int digits, unsigned int sensitive,
- void (Export::*cb)() );
+ float step, float page,
+ Gtk::Grid *t, int x, int y,
+ const Glib::ustring& ll, const Glib::ustring& lr,
+ int digits, unsigned int sensitive,
+ void (Export::*cb)() );
#else
Gtk::Adjustment * createSpinbutton( gchar const *key, float val, float min, float max,
- float step, float page,
- Gtk::Table *t, int x, int y,
- const Glib::ustring ll, const Glib::ustring lr,
- int digits, unsigned int sensitive,
- void (Export::*cb)() );
+ float step, float page,
+ Gtk::Table *t, int x, int y,
+ const Glib::ustring& ll, const Glib::ustring& lr,
+ int digits, unsigned int sensitive,
+ void (Export::*cb)() );
#endif
-
+
/**
* One of the area select radio buttons was pressed
*/
@@ -153,8 +155,12 @@ private:
/**
* Area X value changed callback
*/
- void onAreaX0Change() {areaXChange(x0_adj);} ;
- void onAreaX1Change() {areaXChange(x1_adj);} ;
+ void onAreaX0Change() {
+ areaXChange(x0_adj);
+ } ;
+ void onAreaX1Change() {
+ areaXChange(x1_adj);
+ } ;
#if WITH_GTKMM_3_0
void areaXChange(Glib::RefPtr<Gtk::Adjustment>& adj);
#else
@@ -164,8 +170,12 @@ private:
/**
* Area Y value changed callback
*/
- void onAreaY0Change() {areaYChange(y0_adj);} ;
- void onAreaY1Change() {areaYChange(y1_adj);} ;
+ void onAreaY0Change() {
+ areaYChange(y0_adj);
+ } ;
+ void onAreaY1Change() {
+ areaYChange(y1_adj);
+ } ;
#if WITH_GTKMM_3_0
void areaYChange(Glib::RefPtr<Gtk::Adjustment>& adj);
#else
@@ -235,14 +245,14 @@ private:
/**
* Creates progress dialog for batch exporting.
- *
+ *
* @param progress_text Text to be shown in the progress bar
*/
Gtk::Dialog * create_progress_dialog (Glib::ustring progress_text);
/**
* Callback to be used in for loop to update the progress bar.
- *
+ *
* @param value number between 0 and 1 indicating the fraction of progress (0.17 = 17 % progress)
* @param dlg void pointer to the Gtk::Dialog progress dialog
*/
diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp
index 62a2f8572..8e0d085a4 100644
--- a/src/ui/dialog/symbols.cpp
+++ b/src/ui/dialog/symbols.cpp
@@ -39,7 +39,7 @@
#include <gtkmm/treemodelcolumn.h>
#include <gtkmm/clipboard.h>
#include <glibmm/stringutils.h>
-
+#include <glibmm/markup.h>
#include <glibmm/i18n.h>
#include "path-prefix.h"
#include "io/sys.h"
@@ -687,7 +687,7 @@ void SymbolsDialog::add_symbol( SPObject* symbol ) {
if( pixbuf ) {
Gtk::ListStore::iterator row = store->append();
(*row)[columns->symbol_id] = Glib::ustring( id );
- (*row)[columns->symbol_title] = Glib::ustring( g_dpgettext2(NULL, "Symbol", title) );
+ (*row)[columns->symbol_title] = Glib::Markup::escape_text(Glib::ustring( g_dpgettext2(NULL, "Symbol", title) ));
(*row)[columns->symbol_image] = pixbuf;
}
diff --git a/src/ui/dialog/undo-history.cpp b/src/ui/dialog/undo-history.cpp
index a487eb930..2412c3ec9 100644
--- a/src/ui/dialog/undo-history.cpp
+++ b/src/ui/dialog/undo-history.cpp
@@ -5,8 +5,9 @@
/* Author:
* Gustav Broberg <broberg@kth.se>
* Abhishek Sharma
+ * Jon A. Cruz <jon@joncruz.org>
*
- * Copyright (C) 2006 Authors
+ * Copyright (C) 2014 Authors
* Released under GNU GPL. Read the file 'COPYING' for more information.
*/
@@ -24,6 +25,7 @@
#include "inkscape.h"
#include "verbs.h"
#include "desktop-handles.h"
+#include "util/signal-blocker.h"
#include "desktop.h"
#include <gtkmm/invisible.h>
@@ -131,39 +133,19 @@ UndoHistory& UndoHistory::getInstance()
return *new UndoHistory();
}
-void
-UndoHistory::setDesktop(SPDesktop* desktop)
-{
- Panel::setDesktop(desktop);
-
- if (!desktop) return;
-
- _document = sp_desktop_document(desktop);
-
- _event_log = desktop->event_log;
-
- _callback_connections[EventLog::CALLB_SELECTION_CHANGE].block();
-
- _event_list_store = _event_log->getEventListStore();
- _event_list_view.set_model(_event_list_store);
- _event_list_selection = _event_list_view.get_selection();
-
- _event_log->connectWithDialog(&_event_list_view, &_callback_connections);
- _event_list_view.scroll_to_row(_event_list_store->get_path(_event_list_selection->get_selected()));
-
- _callback_connections[EventLog::CALLB_SELECTION_CHANGE].block(false);
-}
-
UndoHistory::UndoHistory()
: UI::Widget::Panel ("", "/dialogs/undo-history", SP_VERB_DIALOG_UNDO_HISTORY),
- _document (sp_desktop_document(getDesktop())),
- _event_log (getDesktop() ? getDesktop()->event_log : NULL),
- _columns (_event_log ? &_event_log->getColumns() : NULL),
- _event_list_selection (_event_list_view.get_selection()),
- _desktop(NULL),
+ _document_replaced_connection(),
+ _desktop(getDesktop()),
+ _document(_desktop ? _desktop->doc() : NULL),
+ _event_log(_desktop ? _desktop->event_log : NULL),
+ _columns(_event_log ? &_event_log->getColumns() : NULL),
+ _scrolled_window(),
+ _event_list_store(),
+ _event_list_selection(_event_list_view.get_selection()),
_deskTrack(),
- _desktopChangeConn()
-
+ _desktopChangeConn(),
+ _callback_connections()
{
if ( !_document || !_event_log || !_columns ) return;
@@ -172,9 +154,9 @@ UndoHistory::UndoHistory()
_getContents()->pack_start(_scrolled_window);
_scrolled_window.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
- _event_list_store = _event_log->getEventListStore();
+ // connect with the EventLog
+ _connectEventLog();
- _event_list_view.set_model(_event_list_store);
_event_list_view.set_rules_hint(false);
_event_list_view.set_enable_search(false);
_event_list_view.set_headers_visible(false);
@@ -221,12 +203,12 @@ UndoHistory::UndoHistory()
_callback_connections[EventLog::CALLB_COLLAPSE] =
_event_list_view.signal_row_collapsed().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::UndoHistory::_onCollapseEvent));
- // connect with the EventLog
- _event_log->connectWithDialog(&_event_list_view, &_callback_connections);
-
_desktopChangeConn = _deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &UndoHistory::setDesktop) );
_deskTrack.connect(GTK_WIDGET(gobj()));
+ // connect to be informed of document changes
+ signalDocumentReplaced().connect(sigc::mem_fun(*this, &UndoHistory::_handleDocumentReplaced));
+
show_all_children();
// scroll to the selected row
@@ -239,6 +221,82 @@ UndoHistory::~UndoHistory()
}
+void UndoHistory::setDesktop(SPDesktop* desktop)
+{
+ Panel::setDesktop(desktop);
+
+ EventLog *newEventLog = desktop ? desktop->event_log : NULL;
+ if ((_desktop == desktop) && (_event_log == newEventLog)) {
+ // same desktop set
+ }
+ else
+ {
+ _connectDocument(desktop, desktop ? desktop->doc() : NULL);
+ }
+}
+
+void UndoHistory::_connectDocument(SPDesktop* desktop, SPDocument *document)
+{
+ // disconnect from prior
+ if (_event_log) {
+ _event_log->removeDialogConnection(&_event_list_view, &_callback_connections);
+ }
+
+ SignalBlocker blocker(&_callback_connections[EventLog::CALLB_SELECTION_CHANGE]);
+
+ _event_list_view.unset_model();
+
+ // connect to new EventLog/Desktop
+ _desktop = desktop;
+ _event_log = desktop ? desktop->event_log : NULL;
+ _document = desktop ? desktop->doc() : NULL;
+ _connectEventLog();
+}
+
+void UndoHistory::_connectEventLog()
+{
+ if (_event_log) {
+ _event_log->add_destroy_notify_callback(this, &_handleEventLogDestroyCB);
+ _event_list_store = _event_log->getEventListStore();
+
+ _event_list_view.set_model(_event_list_store);
+
+ _event_log->addDialogConnection(&_event_list_view, &_callback_connections);
+ _event_list_view.scroll_to_row(_event_list_store->get_path(_event_list_selection->get_selected()));
+ }
+}
+
+void UndoHistory::_handleDocumentReplaced(SPDesktop* desktop, SPDocument *document)
+{
+ if ((desktop != _desktop) || (document != _document)) {
+ _connectDocument(desktop, document);
+ }
+}
+
+void *UndoHistory::_handleEventLogDestroyCB(void *data)
+{
+ void *result = NULL;
+ if (data) {
+ UndoHistory *self = reinterpret_cast<UndoHistory*>(data);
+ result = self->_handleEventLogDestroy();
+ }
+ return result;
+}
+
+// called *after* _event_log has been destroyed.
+void *UndoHistory::_handleEventLogDestroy()
+{
+ if (_event_log) {
+ SignalBlocker blocker(&_callback_connections[EventLog::CALLB_SELECTION_CHANGE]);
+
+ _event_list_view.unset_model();
+ _event_list_store.reset();
+ _event_log = NULL;
+ }
+
+ return NULL;
+}
+
void
UndoHistory::_onListSelectionChange()
{
diff --git a/src/ui/dialog/undo-history.h b/src/ui/dialog/undo-history.h
index adf4f1936..b0cc283cf 100644
--- a/src/ui/dialog/undo-history.h
+++ b/src/ui/dialog/undo-history.h
@@ -3,8 +3,9 @@
*/
/* Author:
* Gustav Broberg <broberg@kth.se>
+ * Jon A. Cruz <jon@joncruz.org>
*
- * Copyright (C) 2006 Authors
+ * Copyright (C) 2014 Authors
* Released under GNU GPL. Read the file 'COPYING' for more information.
*/
@@ -134,6 +135,7 @@ public:
protected:
+ SPDesktop *_desktop;
SPDocument *_document;
EventLog *_event_log;
@@ -146,12 +148,17 @@ protected:
Gtk::TreeView _event_list_view;
Glib::RefPtr<Gtk::TreeSelection> _event_list_selection;
- SPDesktop *_desktop;
DesktopTracker _deskTrack;
sigc::connection _desktopChangeConn;
EventLog::CallbackMap _callback_connections;
+ static void *_handleEventLogDestroyCB(void *data);
+
+ void _connectDocument(SPDesktop* desktop, SPDocument *document);
+ void _connectEventLog();
+ void _handleDocumentReplaced(SPDesktop* desktop, SPDocument *document);
+ void *_handleEventLogDestroy();
void _onListSelectionChange();
void _onExpandEvent(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &path);
void _onCollapseEvent(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &path);
diff --git a/src/ui/tools/text-tool.cpp b/src/ui/tools/text-tool.cpp
index 4a171d1bd..ac830fe6b 100644
--- a/src/ui/tools/text-tool.cpp
+++ b/src/ui/tools/text-tool.cpp
@@ -61,11 +61,6 @@ namespace Inkscape {
namespace UI {
namespace Tools {
-static void sp_text_context_selection_changed(Inkscape::Selection *selection, TextTool *tc);
-static void sp_text_context_selection_modified(Inkscape::Selection *selection, guint flags, TextTool *tc);
-static bool sp_text_context_style_set(SPCSSAttr const *css, TextTool *tc);
-static int sp_text_context_style_query(SPStyle *style, int property, TextTool *tc);
-
static void sp_text_context_validate_cursor_iterators(TextTool *tc);
static void sp_text_context_update_cursor(TextTool *tc, bool scroll_to_see = true);
static void sp_text_context_update_text_selection(TextTool *tc);
@@ -77,15 +72,15 @@ static gint sptc_focus_out(GtkWidget *widget, GdkEventFocus *event, TextTool *tc
static void sptc_commit(GtkIMContext *imc, gchar *string, TextTool *tc);
namespace {
- ToolBase* createTextContext() {
- return new TextTool();
- }
+ ToolBase* createTextContext() {
+ return new TextTool();
+ }
- bool textContextRegistered = ToolFactory::instance().registerObject("/tools/text", createTextContext);
+ bool textContextRegistered = ToolFactory::instance().registerObject("/tools/text", createTextContext);
}
const std::string& TextTool::getPrefsPath() {
- return TextTool::prefsPath;
+ return TextTool::prefsPath;
}
const std::string TextTool::prefsPath = "/tools/text";
@@ -165,7 +160,7 @@ void TextTool::setup() {
*/
gtk_im_context_set_use_preedit(this->imc, FALSE);
gtk_im_context_set_client_window(this->imc,
- gtk_widget_get_window (canvas));
+ gtk_widget_get_window (canvas));
g_signal_connect(G_OBJECT(canvas), "focus_in_event", G_CALLBACK(sptc_focus_in), this);
g_signal_connect(G_OBJECT(canvas), "focus_out_event", G_CALLBACK(sptc_focus_out), this);
@@ -185,20 +180,20 @@ void TextTool::setup() {
this->shape_editor->set_item(item, SH_KNOTHOLDER);
}
- this->sel_changed_connection = sp_desktop_selection(desktop)->connectChanged(
- sigc::bind(sigc::ptr_fun(&sp_text_context_selection_changed), this)
- );
- this->sel_modified_connection = sp_desktop_selection(desktop)->connectModified(
- sigc::bind(sigc::ptr_fun(&sp_text_context_selection_modified), this)
- );
+ this->sel_changed_connection = sp_desktop_selection(desktop)->connectChangedFirst(
+ sigc::mem_fun(*this, &TextTool::_selectionChanged)
+ );
+ this->sel_modified_connection = sp_desktop_selection(desktop)->connectModifiedFirst(
+ sigc::mem_fun(*this, &TextTool::_selectionModified)
+ );
this->style_set_connection = desktop->connectSetStyle(
- sigc::bind(sigc::ptr_fun(&sp_text_context_style_set), this)
- );
+ sigc::mem_fun(*this, &TextTool::_styleSet)
+ );
this->style_query_connection = desktop->connectQueryStyle(
- sigc::bind(sigc::ptr_fun(&sp_text_context_style_query), this)
- );
+ sigc::mem_fun(*this, &TextTool::_styleQueried)
+ );
- sp_text_context_selection_changed(sp_desktop_selection(desktop), this);
+ _selectionChanged(sp_desktop_selection(desktop));
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if (prefs->getBool("/tools/text/selcue")) {
@@ -396,7 +391,7 @@ bool TextTool::item_handler(SPItem* item, GdkEvent* event) {
}
if (!ret) {
- ret = ToolBase::item_handler(item, event);
+ ret = ToolBase::item_handler(item, event);
}
return ret;
@@ -437,7 +432,7 @@ static void sp_text_context_setup_text(TextTool *tc)
text_item->updateRepr();
text_item->doWriteTransform(text_item->getRepr(), text_item->transform, NULL, true);
DocumentUndo::done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
- _("Create text"));
+ _("Create text"));
}
/**
@@ -477,7 +472,7 @@ static void insert_uni_char(TextTool *const tc)
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
DocumentUndo::done(sp_desktop_document(tc->desktop), SP_VERB_DIALOG_TRANSFORM,
- _("Insert Unicode character"));
+ _("Insert Unicode character"));
}
}
@@ -667,8 +662,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_desktop_apply_style_tool(desktop, ft->getRepr(), "/tools/text", true);
sp_desktop_selection(desktop)->set(ft);
desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Flowed text is created."));
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT,
- _("Create flowed text"));
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT, _("Create flowed text"));
} else {
desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("The frame is <b>too small</b> for the current font size. Flowed text not created."));
}
@@ -807,8 +801,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("No-break space"));
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT,
- _("Insert no-break space"));
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT, _("Insert no-break space"));
return TRUE;
}
break;
@@ -844,8 +837,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_repr_css_set_property(css, "font-weight", "normal");
sp_te_apply_style(this->text, this->text_sel_start, this->text_sel_end, css);
sp_repr_css_attr_unref(css);
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT,
- _("Make bold"));
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT, _("Make bold"));
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
return TRUE;
@@ -862,8 +854,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_repr_css_set_property(css, "font-style", "italic");
sp_te_apply_style(this->text, this->text_sel_start, this->text_sel_end, css);
sp_repr_css_attr_unref(css);
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT,
- _("Make italic"));
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT, _("Make italic"));
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
return TRUE;
@@ -901,8 +892,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT,
- _("New line"));
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT, _("New line"));
return TRUE;
}
case GDK_KEY_BackSpace:
@@ -943,8 +933,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT,
- _("Backspace"));
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT, _("Backspace"));
}
return TRUE;
case GDK_KEY_Delete:
@@ -982,8 +971,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT,
- _("Delete"));
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT, _("Delete"));
}
return TRUE;
case GDK_KEY_Left:
@@ -999,8 +987,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_te_adjust_kerning_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, Geom::Point(mul*-1, 0));
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "kern:left", SP_VERB_CONTEXT_TEXT,
- _("Kern to the left"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "kern:left", SP_VERB_CONTEXT_TEXT, _("Kern to the left"));
} else {
if (MOD__CTRL(event))
this->text_sel_end.cursorLeftWithControl();
@@ -1024,8 +1011,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_te_adjust_kerning_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, Geom::Point(mul*1, 0));
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "kern:right", SP_VERB_CONTEXT_TEXT,
- _("Kern to the right"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "kern:right", SP_VERB_CONTEXT_TEXT, _("Kern to the right"));
} else {
if (MOD__CTRL(event))
this->text_sel_end.cursorRightWithControl();
@@ -1049,8 +1035,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_te_adjust_kerning_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, Geom::Point(0, mul*-1));
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "kern:up", SP_VERB_CONTEXT_TEXT,
- _("Kern up"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "kern:up", SP_VERB_CONTEXT_TEXT, _("Kern up"));
} else {
if (MOD__CTRL(event))
this->text_sel_end.cursorUpWithControl();
@@ -1074,8 +1059,7 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_te_adjust_kerning_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, Geom::Point(0, mul*1));
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "kern:down", SP_VERB_CONTEXT_TEXT,
- _("Kern down"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "kern:down", SP_VERB_CONTEXT_TEXT, _("Kern down"));
} else {
if (MOD__CTRL(event))
this->text_sel_end.cursorDownWithControl();
@@ -1150,8 +1134,7 @@ bool TextTool::root_handler(GdkEvent* event) {
} else {
sp_te_adjust_rotation(this->text, this->text_sel_start, this->text_sel_end, desktop, -90);
}
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "textrot:ccw", SP_VERB_CONTEXT_TEXT,
- _("Rotate counterclockwise"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "textrot:ccw", SP_VERB_CONTEXT_TEXT, _("Rotate counterclockwise"));
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
return TRUE;
@@ -1171,8 +1154,7 @@ bool TextTool::root_handler(GdkEvent* event) {
} else {
sp_te_adjust_rotation(this->text, this->text_sel_start, this->text_sel_end, desktop, 90);
}
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "textrot:cw", SP_VERB_CONTEXT_TEXT,
- _("Rotate clockwise"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "textrot:cw", SP_VERB_CONTEXT_TEXT, _("Rotate clockwise"));
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
return TRUE;
@@ -1188,15 +1170,13 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_te_adjust_linespacing_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, -10);
else
sp_te_adjust_linespacing_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, -1);
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "linespacing:dec", SP_VERB_CONTEXT_TEXT,
- _("Contract line spacing"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "linespacing:dec", SP_VERB_CONTEXT_TEXT, _("Contract line spacing"));
} else {
if (MOD__SHIFT(event))
sp_te_adjust_tspan_letterspacing_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, -10);
else
sp_te_adjust_tspan_letterspacing_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, -1);
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "letterspacing:dec", SP_VERB_CONTEXT_TEXT,
- _("Contract letter spacing"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "letterspacing:dec", SP_VERB_CONTEXT_TEXT, _("Contract letter spacing"));
}
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
@@ -1213,15 +1193,13 @@ bool TextTool::root_handler(GdkEvent* event) {
sp_te_adjust_linespacing_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, 10);
else
sp_te_adjust_linespacing_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, 1);
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "linespacing:inc", SP_VERB_CONTEXT_TEXT,
- _("Expand line spacing"));
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "linespacing:inc", SP_VERB_CONTEXT_TEXT, _("Expand line spacing"));
} else {
if (MOD__SHIFT(event))
sp_te_adjust_tspan_letterspacing_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, 10);
else
sp_te_adjust_tspan_letterspacing_screen(this->text, this->text_sel_start, this->text_sel_end, desktop, 1);
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "letterspacing:inc", SP_VERB_CONTEXT_TEXT,
- _("Expand letter spacing"));\
+ DocumentUndo::maybeDone(sp_desktop_document(desktop), "letterspacing:inc", SP_VERB_CONTEXT_TEXT, _("Expand letter spacing"));\
}
sp_text_context_update_cursor(this);
sp_text_context_update_text_selection(this);
@@ -1305,32 +1283,32 @@ bool sp_text_paste_inline(ToolBase *ec)
Glib::ustring const clip_text = refClipboard->wait_for_text();
if (!clip_text.empty()) {
- // Fix for 244940
- // The XML standard defines the following as valid characters
- // (Extensible Markup Language (XML) 1.0 (Fourth Edition) paragraph 2.2)
- // char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
- // Since what comes in off the paste buffer will go right into XML, clean
- // the text here.
- Glib::ustring text(clip_text);
- Glib::ustring::iterator itr = text.begin();
- gunichar paste_string_uchar;
-
- while(itr != text.end())
- {
- paste_string_uchar = *itr;
-
- // Make sure we don't have a control character. We should really check
- // for the whole range above... Add the rest of the invalid cases from
- // above if we find additional issues
- if(paste_string_uchar >= 0x00000020 ||
- paste_string_uchar == 0x00000009 ||
- paste_string_uchar == 0x0000000A ||
- paste_string_uchar == 0x0000000D) {
- ++itr;
- } else {
- itr = text.erase(itr);
- }
- }
+ // Fix for 244940
+ // The XML standard defines the following as valid characters
+ // (Extensible Markup Language (XML) 1.0 (Fourth Edition) paragraph 2.2)
+ // char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ // Since what comes in off the paste buffer will go right into XML, clean
+ // the text here.
+ Glib::ustring text(clip_text);
+ Glib::ustring::iterator itr = text.begin();
+ gunichar paste_string_uchar;
+
+ while(itr != text.end())
+ {
+ paste_string_uchar = *itr;
+
+ // Make sure we don't have a control character. We should really check
+ // for the whole range above... Add the rest of the invalid cases from
+ // above if we find additional issues
+ if(paste_string_uchar >= 0x00000020 ||
+ paste_string_uchar == 0x00000009 ||
+ paste_string_uchar == 0x0000000A ||
+ paste_string_uchar == 0x0000000D) {
+ ++itr;
+ } else {
+ itr = text.erase(itr);
+ }
+ }
if (!tc->text) { // create text if none (i.e. if nascent_object)
sp_text_context_setup_text(tc);
@@ -1351,7 +1329,7 @@ bool sp_text_paste_inline(ToolBase *ec)
begin = end + 1;
}
DocumentUndo::done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
- _("Paste text"));
+ _("Paste text"));
return true;
}
@@ -1427,12 +1405,11 @@ bool sp_text_delete_selection(ToolBase *ec)
/**
* \param selection Should not be NULL.
*/
-static void
-sp_text_context_selection_changed(Inkscape::Selection *selection, TextTool *tc)
+void TextTool::_selectionChanged(Inkscape::Selection *selection)
{
g_assert(selection != NULL);
- ToolBase *ec = SP_EVENT_CONTEXT(tc);
+ ToolBase *ec = SP_EVENT_CONTEXT(this);
ec->shape_editor->unset_item(SH_KNOTHOLDER);
SPItem *item = selection->singleItem();
@@ -1440,70 +1417,68 @@ sp_text_context_selection_changed(Inkscape::Selection *selection, TextTool *tc)
ec->shape_editor->set_item(item, SH_KNOTHOLDER);
}
- if (tc->text && (item != tc->text)) {
- sp_text_context_forget_text(tc);
+ if (this->text && (item != this->text)) {
+ sp_text_context_forget_text(this);
}
- tc->text = NULL;
+ this->text = NULL;
if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) {
- tc->text = item;
- Inkscape::Text::Layout const *layout = te_get_layout(tc->text);
+ this->text = item;
+ Inkscape::Text::Layout const *layout = te_get_layout(this->text);
if (layout)
- tc->text_sel_start = tc->text_sel_end = layout->end();
+ this->text_sel_start = this->text_sel_end = layout->end();
} else {
- tc->text = NULL;
+ this->text = NULL;
}
// we update cursor without scrolling, because this position may not be final;
// item_handler moves cusros to the point of click immediately
- sp_text_context_update_cursor(tc, false);
- sp_text_context_update_text_selection(tc);
+ sp_text_context_update_cursor(this, false);
+ sp_text_context_update_text_selection(this);
}
-static void
-sp_text_context_selection_modified(Inkscape::Selection */*selection*/, guint /*flags*/, TextTool *tc)
+void TextTool::_selectionModified(Inkscape::Selection */*selection*/, guint /*flags*/)
{
- sp_text_context_update_cursor(tc);
- sp_text_context_update_text_selection(tc);
+ sp_text_context_update_cursor(this);
+ sp_text_context_update_text_selection(this);
}
-static bool sp_text_context_style_set(SPCSSAttr const *css, TextTool *tc)
+bool TextTool::_styleSet(SPCSSAttr const *css)
{
- if (tc->text == NULL)
+ if (this->text == NULL)
return false;
- if (tc->text_sel_start == tc->text_sel_end)
+ if (this->text_sel_start == this->text_sel_end)
return false; // will get picked up by the parent and applied to the whole text object
- sp_te_apply_style(tc->text, tc->text_sel_start, tc->text_sel_end, css);
- DocumentUndo::done(sp_desktop_document(tc->desktop), SP_VERB_CONTEXT_TEXT,
- _("Set text style"));
- sp_text_context_update_cursor(tc);
- sp_text_context_update_text_selection(tc);
+ sp_te_apply_style(this->text, this->text_sel_start, this->text_sel_end, css);
+ DocumentUndo::done(sp_desktop_document(this->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Set text style"));
+ sp_text_context_update_cursor(this);
+ sp_text_context_update_text_selection(this);
return true;
}
-static int
-sp_text_context_style_query(SPStyle *style, int property, TextTool *tc)
+int TextTool::_styleQueried(SPStyle *style, int property)
{
- if (tc->text == NULL) {
+ if (this->text == NULL) {
return QUERY_STYLE_NOTHING;
}
- const Inkscape::Text::Layout *layout = te_get_layout(tc->text);
+ const Inkscape::Text::Layout *layout = te_get_layout(this->text);
if (layout == NULL) {
return QUERY_STYLE_NOTHING;
}
- sp_text_context_validate_cursor_iterators(tc);
+ sp_text_context_validate_cursor_iterators(this);
GSList *styles_list = NULL;
Inkscape::Text::Layout::iterator begin_it, end_it;
- if (tc->text_sel_start < tc->text_sel_end) {
- begin_it = tc->text_sel_start;
- end_it = tc->text_sel_end;
+ if (this->text_sel_start < this->text_sel_end) {
+ begin_it = this->text_sel_start;
+ end_it = this->text_sel_end;
} else {
- begin_it = tc->text_sel_end;
- end_it = tc->text_sel_start;
+ begin_it = this->text_sel_end;
+ end_it = this->text_sel_start;
}
if (begin_it == end_it) {
if (!begin_it.prevCharacter()) {
@@ -1717,7 +1692,7 @@ static void sptc_commit(GtkIMContext */*imc*/, gchar *string, TextTool *tc)
sp_text_context_update_text_selection(tc);
DocumentUndo::done(tc->text->document, SP_VERB_CONTEXT_TEXT,
- _("Type text"));
+ _("Type text"));
}
void sp_text_context_place_cursor (TextTool *tc, SPObject *text, Inkscape::Text::Layout::iterator where)
diff --git a/src/ui/tools/text-tool.h b/src/ui/tools/text-tool.h
index c5336d378..ca2b3d19a 100644
--- a/src/ui/tools/text-tool.h
+++ b/src/ui/tools/text-tool.h
@@ -84,6 +84,12 @@ public:
virtual bool item_handler(SPItem* item, GdkEvent* event);
virtual const std::string& getPrefsPath();
+
+private:
+ void _selectionChanged(Inkscape::Selection *selection);
+ void _selectionModified(Inkscape::Selection *selection, guint flags);
+ bool _styleSet(SPCSSAttr const *css);
+ int _styleQueried(SPStyle *style, int property);
};
bool sp_text_paste_inline(ToolBase *ec);
diff --git a/src/ui/tools/tool-base.h b/src/ui/tools/tool-base.h
index 3a536fc2c..eb8908f3e 100644
--- a/src/ui/tools/tool-base.h
+++ b/src/ui/tools/tool-base.h
@@ -14,6 +14,7 @@
#include <glib-object.h>
#include <gdk/gdk.h>
+#include <sigc++/trackable.h>
#include "knot.h"
#include "2geom/forward.h"
@@ -104,7 +105,9 @@ void sp_event_context_snap_delay_handler(ToolBase *ec, gpointer const dse_item,
* plus few abstract base classes. Writing a new tool involves
* subclassing ToolBase.
*/
-class ToolBase {
+class ToolBase
+ : public sigc::trackable
+{
public:
void enableSelectionCue (bool enable=true);
void enableGrDrag (bool enable=true);