diff options
| author | John Smith <john.smith7545@yahoo.com> | 2012-02-16 05:38:08 +0000 |
|---|---|---|
| committer | John Smith <removethis.john.q.public@bigmail.com> | 2012-02-16 05:38:08 +0000 |
| commit | 9a48c58cd01c6ab3909fc0fa4b883d2fd15e48ee (patch) | |
| tree | fe4b71445f19cdb3a421eb079464eba6454eaccc /src/dialogs | |
| parent | Prevent false gtk deprecation warnings in canvas-grid and tidy headers (diff) | |
| download | inkscape-9a48c58cd01c6ab3909fc0fa4b883d2fd15e48ee.tar.gz inkscape-9a48c58cd01c6ab3909fc0fa4b883d2fd15e48ee.zip | |
Fix for 930535 : Convert Font and Text dialog to a dockable dialog
(bzr r10989)
Diffstat (limited to 'src/dialogs')
| -rw-r--r-- | src/dialogs/Makefile_insert | 2 | ||||
| -rw-r--r-- | src/dialogs/text-edit.cpp | 1032 | ||||
| -rw-r--r-- | src/dialogs/text-edit.h | 31 |
3 files changed, 0 insertions, 1065 deletions
diff --git a/src/dialogs/Makefile_insert b/src/dialogs/Makefile_insert index 342eba137..6a3d33f07 100644 --- a/src/dialogs/Makefile_insert +++ b/src/dialogs/Makefile_insert @@ -11,7 +11,5 @@ ink_common_sources += \ dialogs/find.h \ dialogs/spellcheck.cpp \ dialogs/spellcheck.h \ - dialogs/text-edit.cpp \ - dialogs/text-edit.h \ dialogs/xml-tree.cpp \ dialogs/xml-tree.h diff --git a/src/dialogs/text-edit.cpp b/src/dialogs/text-edit.cpp deleted file mode 100644 index a9a7d7a31..000000000 --- a/src/dialogs/text-edit.cpp +++ /dev/null @@ -1,1032 +0,0 @@ -/** - * @file - * Text editing dialog. - */ -/* Authors: - * Lauris Kaplinski <lauris@ximian.com> - * bulia byak <buliabyak@users.sf.net> - * Johan Engelen <goejendaagh@zonnet.nl> - * Abhishek Sharma - * - * Copyright (C) 1999-2007 Authors - * Copyright (C) 2000-2001 Ximian, Inc. - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <libnrtype/font-instance.h> -#include <gtk/gtk.h> - -#ifdef WITH_GTKSPELL -extern "C" { -# include <gtkspell/gtkspell.h> -} -#endif - -#include "macros.h" -#include <glibmm/i18n.h> -#include "helper/window.h" -#include "../widgets/font-selector.h" -#include "../inkscape.h" -#include "../document.h" -#include "../document-undo.h" -#include "../desktop-style.h" -#include "../desktop-handles.h" -#include "../selection.h" -#include "../style.h" -#include "../sp-text.h" -#include "../sp-flowtext.h" -#include "../text-editing.h" -#include "../ui/icon-names.h" -#include <libnrtype/font-style-to-pos.h> - -#include "dialog-events.h" -#include "../preferences.h" -#include "../verbs.h" -#include "../interface.h" -#include "svg/css-ostringstream.h" -#include "widgets/icon.h" -#include <xml/repr.h> -#include "util/ege-appear-time-tracker.h" - -using Inkscape::DocumentUndo; -using ege::AppearTimeTracker; - -#define VB_MARGIN 4 -#define MIN_ONSCREEN_DISTANCE 50 - -static void sp_text_edit_dialog_selection_modified (Inkscape::Application *inkscape, Inkscape::Selection *sel, guint flags, GtkWidget *dlg); -static void sp_text_edit_dialog_selection_changed (Inkscape::Application *inkscape, Inkscape::Selection *sel, GtkWidget *dlg); -static void sp_text_edit_dialog_subselection_changed ( Inkscape::Application *inkscape, SPDesktop *desktop, GtkWidget *dlg); - -static void sp_text_edit_dialog_set_default (GtkButton *button, GtkWidget *dlg); -static void sp_text_edit_dialog_apply (GtkButton *button, GtkWidget *dlg); -static void sp_text_edit_dialog_close (GtkButton *button, GtkWidget *dlg); - -static void sp_text_edit_dialog_read_selection (GtkWidget *dlg, gboolean style, gboolean content); - -static void sp_text_edit_dialog_text_changed (GtkTextBuffer *tb, GtkWidget *dlg); -static void sp_text_edit_dialog_font_changed (SPFontSelector *fontsel, font_instance *font, GtkWidget *dlg); -static void sp_text_edit_dialog_any_toggled (GtkToggleButton *tb, GtkWidget *dlg); -static void sp_text_edit_dialog_line_spacing_changed (GtkEditable *editable, GtkWidget *dlg); - -static SPItem *sp_ted_get_selected_text_item (void); -static unsigned sp_ted_get_selected_text_count (void); - - -static const gchar *spacings[] = {"50%", "80%", "90%", "100%", "110%", "120%", "130%", "140%", "150%", "200%", "300%", NULL}; - -static GtkWidget *dlg = NULL; -static win_data wd; -// impossible original values to make sure they are read from prefs -static gint x = -1000, y = -1000, w = 0, h = 0; -static Glib::ustring const prefs_path = "/dialogs/textandfont/"; - - - - -static void -sp_text_edit_dialog_destroy( GtkObject */*object*/, gpointer /*data*/ ) -{ - sp_signal_disconnect_by_data (INKSCAPE, dlg); - wd.win = dlg = NULL; - wd.stop = 0; -} - - - -static gboolean -sp_text_edit_dialog_delete( GtkObject */*object*/, GdkEvent */*event*/, gpointer /*data*/ ) -{ - gtk_window_get_position ((GtkWindow *) dlg, &x, &y); - gtk_window_get_size ((GtkWindow *) dlg, &w, &h); - - if (x<0) x=0; - if (y<0) y=0; - - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt(prefs_path + "x", x); - prefs->setInt(prefs_path + "y", y); - prefs->setInt(prefs_path + "w", w); - prefs->setInt(prefs_path + "h", h); - - return FALSE; // which means, go ahead and destroy it -} - - -/** - These callbacks set the eatkeys flag when the text editor is entered and cancel it when it's left. - This flag is used to prevent passing keys from the dialog to canvas, so that the text editor - can handle keys like Esc and Ctrl+Z itself. - */ -gboolean -text_view_focus_in( GtkWidget */*w*/, GdkEventKey */*event*/, gpointer data ) -{ - GObject *dlg = (GObject *) data; - g_object_set_data (dlg, "eatkeys", GINT_TO_POINTER (TRUE)); - return FALSE; -} - -gboolean -text_view_focus_out (GtkWidget */*w*/, GdkEventKey */*event*/, gpointer data) -{ - GObject *dlg = (GObject *) data; - g_object_set_data (dlg, "eatkeys", GINT_TO_POINTER (FALSE)); - return FALSE; -} - - -void -sp_text_edit_dialog (void) -{ - bool wantTiming = Inkscape::Preferences::get()->getBool("/dialogs/debug/trackAppear", false); - GTimer *timer = wantTiming ? g_timer_new() : 0; - - if (!dlg) { - - gchar title[500]; - sp_ui_dialog_title_string (Inkscape::Verb::get(SP_VERB_DIALOG_TEXT), title); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - - dlg = sp_window_new (title, TRUE); - if (x == -1000 || y == -1000) { - x = prefs->getInt(prefs_path + "x", -1000); - y = prefs->getInt(prefs_path + "y", -1000); - } - if (w ==0 || h == 0) { - w = prefs->getInt(prefs_path + "w", 0); - h = prefs->getInt(prefs_path + "h", 0); - } - -// if (x<0) x=0; -// if (y<0) y=0; - - if (w && h) - gtk_window_resize ((GtkWindow *) dlg, w, h); - if (x >= 0 && y >= 0 && (x < (gdk_screen_width()-MIN_ONSCREEN_DISTANCE)) && (y < (gdk_screen_height()-MIN_ONSCREEN_DISTANCE))) { - gtk_window_move ((GtkWindow *) dlg, x, y); - } else { - gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER); - } - - - sp_transientize (dlg); - wd.win = dlg; - wd.stop = 0; - g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd ); - - g_signal_connect ( G_OBJECT (dlg), "event", G_CALLBACK (sp_dialog_event_handler), dlg ); - - g_signal_connect ( G_OBJECT (dlg), "destroy", G_CALLBACK (sp_text_edit_dialog_destroy), dlg ); - g_signal_connect ( G_OBJECT (dlg), "delete_event", G_CALLBACK (sp_text_edit_dialog_delete), dlg ); - g_signal_connect ( G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_text_edit_dialog_delete), dlg ); - - g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg ); - g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg ); - - // box containing the notebook and the bottom buttons - GtkWidget *mainvb = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (dlg), mainvb); - - // notebook - GtkWidget *nb = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX (mainvb), nb, TRUE, TRUE, 0); - g_object_set_data (G_OBJECT (dlg), "notebook", nb); - - - - // Font tab - { - GtkWidget *l = gtk_label_new_with_mnemonic (_("_Font")); - GtkWidget *vb = gtk_vbox_new (FALSE, VB_MARGIN); - gtk_container_set_border_width (GTK_CONTAINER (vb), VB_MARGIN); - gtk_notebook_append_page (GTK_NOTEBOOK (nb), vb, l); - - /* HBox containing font selection and layout */ - GtkWidget *hb = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vb), hb, TRUE, TRUE, 0); - - // font and style selector - GtkWidget *fontsel = sp_font_selector_new (); - g_signal_connect ( G_OBJECT (fontsel), "font_set", G_CALLBACK (sp_text_edit_dialog_font_changed), dlg ); - - g_signal_connect_swapped ( G_OBJECT (g_object_get_data (G_OBJECT(fontsel), "family-treeview")), - "row-activated", - G_CALLBACK (gtk_window_activate_default), - dlg); - - gtk_box_pack_start (GTK_BOX (hb), fontsel, TRUE, TRUE, 0); - g_object_set_data (G_OBJECT (dlg), "fontsel", fontsel); - - // Layout - { - GtkWidget *f = gtk_frame_new (_("Layout")); - gtk_box_pack_start (GTK_BOX (hb), f, FALSE, FALSE, 4); - GtkWidget *l_vb = gtk_vbox_new (FALSE, VB_MARGIN); - gtk_container_add (GTK_CONTAINER (f), l_vb); - - { - GtkWidget *row = gtk_hbox_new (FALSE, VB_MARGIN); - GtkWidget *group; - - // align left - { - // TODO - replace with Inkscape-specific call - GtkWidget *px = gtk_image_new_from_stock ( GTK_STOCK_JUSTIFY_LEFT, GTK_ICON_SIZE_LARGE_TOOLBAR ); - GtkWidget *b = group = gtk_radio_button_new (NULL); - gtk_widget_set_tooltip_text (b, _("Align lines left")); - gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE); - g_signal_connect ( G_OBJECT (b), "toggled", G_CALLBACK (sp_text_edit_dialog_any_toggled), dlg); - gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE ); - gtk_container_add (GTK_CONTAINER (b), px); - gtk_box_pack_start (GTK_BOX (row), b, FALSE, FALSE, 0); - g_object_set_data (G_OBJECT (dlg), "text_anchor_start", b); - } - - // align center - { - // TODO - replace with Inkscape-specific call - GtkWidget *px = gtk_image_new_from_stock ( GTK_STOCK_JUSTIFY_CENTER, GTK_ICON_SIZE_LARGE_TOOLBAR ); - GtkWidget *b = gtk_radio_button_new (gtk_radio_button_get_group (GTK_RADIO_BUTTON (group))); - /* TRANSLATORS: `Center' here is a verb. */ - gtk_widget_set_tooltip_text (b, _("Center lines")); - gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE); - g_signal_connect ( G_OBJECT (b), "toggled", G_CALLBACK (sp_text_edit_dialog_any_toggled), dlg ); - gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE); - gtk_container_add (GTK_CONTAINER (b), px); - gtk_box_pack_start (GTK_BOX (row), b, FALSE, FALSE, 0); - g_object_set_data (G_OBJECT (dlg), "text_anchor_middle", b); - } - - // align right - { - // TODO - replace with Inkscape-specific call - GtkWidget *px = gtk_image_new_from_stock ( GTK_STOCK_JUSTIFY_RIGHT, GTK_ICON_SIZE_LARGE_TOOLBAR ); - GtkWidget *b = gtk_radio_button_new (gtk_radio_button_get_group (GTK_RADIO_BUTTON (group))); - gtk_widget_set_tooltip_text (b, _("Align lines right")); - gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE); - g_signal_connect ( G_OBJECT (b), "toggled", G_CALLBACK (sp_text_edit_dialog_any_toggled), dlg ); - gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE); - gtk_container_add (GTK_CONTAINER (b), px); - gtk_box_pack_start (GTK_BOX (row), b, FALSE, FALSE, 0); - g_object_set_data (G_OBJECT (dlg), "text_anchor_end", b); - } - - // align justify - { - // TODO - replace with Inkscape-specific call - GtkWidget *px = gtk_image_new_from_stock ( GTK_STOCK_JUSTIFY_FILL, GTK_ICON_SIZE_LARGE_TOOLBAR ); - GtkWidget *b = gtk_radio_button_new (gtk_radio_button_get_group (GTK_RADIO_BUTTON (group))); - gtk_widget_set_tooltip_text (b, _("Justify lines")); - gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE); - g_signal_connect ( G_OBJECT (b), "toggled", G_CALLBACK (sp_text_edit_dialog_any_toggled), dlg ); - gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE); - gtk_container_add (GTK_CONTAINER (b), px); - gtk_box_pack_start (GTK_BOX (row), b, FALSE, FALSE, 0); - g_object_set_data (G_OBJECT (dlg), "text_anchor_justify", b); - } - - gtk_box_pack_start (GTK_BOX (l_vb), row, FALSE, FALSE, 0); - } - - - { - GtkWidget *row = gtk_hbox_new (FALSE, VB_MARGIN); - GtkWidget *group; - - // horizontal - { - GtkWidget *px = sp_icon_new( Inkscape::ICON_SIZE_LARGE_TOOLBAR, - INKSCAPE_ICON("format-text-direction-horizontal") ); - GtkWidget *b = group = gtk_radio_button_new (NULL); - gtk_widget_set_tooltip_text (b, _("Horizontal text")); - gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE); - g_signal_connect ( G_OBJECT (b), "toggled", G_CALLBACK (sp_text_edit_dialog_any_toggled), dlg ); - gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE); - gtk_container_add (GTK_CONTAINER (b), px); - gtk_box_pack_start (GTK_BOX (row), b, FALSE, FALSE, 0); - g_object_set_data (G_OBJECT (dlg), INKSCAPE_ICON("format-text-direction-horizontal"), b); - } - - // vertical - { - GtkWidget *px = sp_icon_new( Inkscape::ICON_SIZE_LARGE_TOOLBAR, - INKSCAPE_ICON("format-text-direction-vertical") ); - GtkWidget *b = gtk_radio_button_new (gtk_radio_button_get_group (GTK_RADIO_BUTTON (group))); - gtk_widget_set_tooltip_text (b, _("Vertical text")); - gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE); - g_signal_connect ( G_OBJECT (b), "toggled", G_CALLBACK (sp_text_edit_dialog_any_toggled), dlg ); - gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE); - gtk_container_add (GTK_CONTAINER (b), px); - gtk_box_pack_start (GTK_BOX (row), b, FALSE, FALSE, 0); - g_object_set_data (G_OBJECT (dlg), INKSCAPE_ICON("format-text-direction-vertical"), b); - } - - gtk_box_pack_start (GTK_BOX (l_vb), row, FALSE, FALSE, 0); - } - - { - GtkWidget *row = gtk_hbox_new (FALSE, VB_MARGIN); - - l = gtk_label_new (_("Line spacing:")); - gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5); - gtk_box_pack_start (GTK_BOX (row), l, FALSE, FALSE, VB_MARGIN); - - gtk_box_pack_start (GTK_BOX (l_vb), row, FALSE, FALSE, 0); - } - - { - GtkWidget *row = gtk_hbox_new (FALSE, VB_MARGIN); - -//This would introduce dependency on gtk version 2.24 which is currently not available in -// Trisquel GNU/Linux 4.5.1 (released on May 25th, 2011) -//This conditional and its #else block can be deleted in the future. -#if GTK_CHECK_VERSION(2, 24,0) - GtkWidget *c = gtk_combo_box_text_new_with_entry (); -#else - GtkWidget *c = gtk_combo_box_entry_new_text (); -#endif - gtk_widget_set_size_request (c, 90, -1); - - { /* Setup strings */ - for (int i = 0; spacings[i]; i++) { -//This would introduce dependency on gtk version 2.24 which is currently not available in -// Trisquel GNU/Linux 4.5.1 (released on May 25th, 2011) -//This conditional and its #else block can be deleted in the future. -#if GTK_CHECK_VERSION(2, 24,0) - gtk_combo_box_text_append_text((GtkComboBoxText *) c, spacings[i]); -#else - gtk_combo_box_append_text((GtkComboBox *) c, spacings[i]); -#endif - } - } - - g_signal_connect ( (GObject *) c, - "changed", - (GCallback) sp_text_edit_dialog_line_spacing_changed, - dlg ); - gtk_box_pack_start (GTK_BOX (row), c, FALSE, FALSE, VB_MARGIN); - g_object_set_data (G_OBJECT (dlg), "line_spacing", c); - - gtk_box_pack_start (GTK_BOX (l_vb), row, FALSE, FALSE, VB_MARGIN); - } - } - - /* Font preview */ - GtkLabel *preview = (GtkLabel*) gtk_label_new(NULL); - gtk_label_set_ellipsize(preview, PANGO_ELLIPSIZE_END); - gtk_label_set_justify(preview, GTK_JUSTIFY_CENTER); - gtk_label_set_line_wrap(preview, FALSE); - gtk_box_pack_start (GTK_BOX (vb), (GtkWidget*) preview, TRUE, TRUE, 4); - g_object_set_data (G_OBJECT (dlg), "preview", preview); - } - - - // Text tab - { - GtkWidget *l = gtk_label_new_with_mnemonic (_("_Text")); - GtkWidget *vb = gtk_vbox_new (FALSE, VB_MARGIN); - gtk_container_set_border_width (GTK_CONTAINER (vb), VB_MARGIN); - gtk_notebook_append_page (GTK_NOTEBOOK (nb), vb, l); - - GtkWidget *scroller = gtk_scrolled_window_new ( NULL, NULL ); - gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW (scroller), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC ); - gtk_scrolled_window_set_shadow_type ( GTK_SCROLLED_WINDOW(scroller), GTK_SHADOW_IN ); - gtk_widget_show (scroller); - - GtkTextBuffer *tb = gtk_text_buffer_new (NULL); - GtkWidget *txt = gtk_text_view_new_with_buffer (tb); - gtk_text_view_set_wrap_mode ((GtkTextView *) txt, GTK_WRAP_WORD); -#ifdef WITH_GTKSPELL - GError *error = NULL; - char *errortext = NULL; - /* todo: Use computed xml:lang attribute of relevant element, if present, to specify the - language (either as 2nd arg of gtkspell_new_attach, or with explicit - gtkspell_set_language call in; see advanced.c example in gtkspell docs). - sp_text_edit_dialog_read_selection looks like a suitable place. */ - if (gtkspell_new_attach(GTK_TEXT_VIEW(txt), NULL, &error) == NULL) { - g_print("gtkspell error: %s\n", error->message); - errortext = g_strdup_printf("GtkSpell was unable to initialize.\n" - "%s", error->message); - g_error_free(error); - } -#endif - gtk_widget_set_size_request (txt, -1, 64); - gtk_text_view_set_editable (GTK_TEXT_VIEW (txt), TRUE); - gtk_container_add (GTK_CONTAINER (scroller), txt); - gtk_box_pack_start (GTK_BOX (vb), scroller, TRUE, TRUE, 0); - g_signal_connect ( G_OBJECT (tb), "changed", - G_CALLBACK (sp_text_edit_dialog_text_changed), dlg ); - g_signal_connect (G_OBJECT (txt), "focus-in-event", G_CALLBACK (text_view_focus_in), dlg); - g_signal_connect (G_OBJECT (txt), "focus-out-event", G_CALLBACK (text_view_focus_out), dlg); - g_object_set_data (G_OBJECT (dlg), "text", tb); - g_object_set_data (G_OBJECT (dlg), "textw", txt); - } - - /* Buttons */ - GtkWidget *hb = gtk_hbox_new (FALSE, VB_MARGIN); - gtk_container_set_border_width (GTK_CONTAINER (hb), 4); - gtk_box_pack_start (GTK_BOX (mainvb), hb, FALSE, FALSE, 0); - - { - GtkWidget *b = gtk_button_new_with_mnemonic (_("Set as _default")); - g_signal_connect ( G_OBJECT (b), "clicked", - G_CALLBACK (sp_text_edit_dialog_set_default), - dlg ); - gtk_box_pack_start (GTK_BOX (hb), b, FALSE, FALSE, 0); - g_object_set_data (G_OBJECT (dlg), "default", b); - } - - { - GtkWidget *b = gtk_button_new_from_stock (GTK_STOCK_CLOSE); - g_signal_connect ( G_OBJECT (b), "clicked", - G_CALLBACK (sp_text_edit_dialog_close), dlg ); - gtk_box_pack_end (GTK_BOX (hb), b, FALSE, FALSE, 0); - } - - { - GtkWidget *b = gtk_button_new_from_stock (GTK_STOCK_APPLY); - g_signal_connect ( G_OBJECT (b), "clicked", - G_CALLBACK (sp_text_edit_dialog_apply), dlg ); - gtk_box_pack_end ( GTK_BOX (hb), b, FALSE, FALSE, 0 ); - gtk_widget_set_can_default (b, TRUE); - gtk_widget_grab_default (b); - g_object_set_data (G_OBJECT (dlg), "apply", b); - } - - g_signal_connect ( G_OBJECT (INKSCAPE), "modify_selection", - G_CALLBACK (sp_text_edit_dialog_selection_modified), dlg); - g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", - G_CALLBACK (sp_text_edit_dialog_selection_changed), dlg); - g_signal_connect (INKSCAPE, "change_subselection", G_CALLBACK (sp_text_edit_dialog_subselection_changed), dlg); - - gtk_widget_show_all (dlg); - - sp_text_edit_dialog_read_selection (dlg, TRUE, TRUE); - } - - if ( wantTiming ) { - // Time tracker takes ownership of the timer. - AppearTimeTracker *tracker = new AppearTimeTracker(timer, GTK_WIDGET(dlg), "DialogText"); - tracker->setAutodelete(true); - timer = 0; - } - - gtk_window_present ((GtkWindow *) dlg); - -} // end of sp_text_edit_dialog() - - - -static void -sp_text_edit_dialog_selection_modified( Inkscape::Application */*inkscape*/, - Inkscape::Selection */*sel*/, - guint flags, - GtkWidget *dlg ) -{ - gboolean style, content; - - style = - ((flags & ( SP_OBJECT_CHILD_MODIFIED_FLAG | - SP_OBJECT_STYLE_MODIFIED_FLAG )) != 0 ); - - content = - ((flags & ( SP_OBJECT_CHILD_MODIFIED_FLAG | - SP_TEXT_CONTENT_MODIFIED_FLAG )) != 0 ); - - sp_text_edit_dialog_read_selection (dlg, style, content); - -} - - - -static void -sp_text_edit_dialog_selection_changed( Inkscape::Application */*inkscape*/, - Inkscape::Selection */*sel*/, - GtkWidget *dlg ) -{ - sp_text_edit_dialog_read_selection (dlg, TRUE, TRUE); -} - -static void sp_text_edit_dialog_subselection_changed( Inkscape::Application */*inkscape*/, SPDesktop */*desktop*/, GtkWidget *dlg ) -{ - sp_text_edit_dialog_read_selection (dlg, TRUE, FALSE); -} - -static void -sp_text_edit_dialog_update_object_text ( SPItem *text ) -{ - GtkTextBuffer *tb; - GtkTextIter start, end; - gchar *str; - - tb = (GtkTextBuffer*)g_object_get_data (G_OBJECT (dlg), "text"); - - /* write text */ - if (gtk_text_buffer_get_modified (tb)) { - gtk_text_buffer_get_bounds (tb, &start, &end); - str = gtk_text_buffer_get_text (tb, &start, &end, TRUE); - sp_te_set_repr_text_multiline (text, str); - g_free (str); - gtk_text_buffer_set_modified (tb, FALSE); - } -} - -SPCSSAttr * -sp_get_text_dialog_style () -{ - GtkWidget *fontsel = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "fontsel"); - - SPCSSAttr *css = sp_repr_css_attr_new (); - - /* font */ - font_instance *font = sp_font_selector_get_font (SP_FONT_SELECTOR (fontsel)); - - if ( font ) { - Glib::ustring fontName = font_factory::Default()->ConstructFontSpecification(font); - sp_repr_css_set_property (css, "-inkscape-font-specification", fontName.c_str()); - - gchar c[256]; - - font->Family(c, 256); - sp_repr_css_set_property (css, "font-family", c); - - font->Attribute( "weight", c, 256); - sp_repr_css_set_property (css, "font-weight", c); - - font->Attribute("style", c, 256); - sp_repr_css_set_property (css, "font-style", c); - - font->Attribute("stretch", c, 256); - sp_repr_css_set_property (css, "font-stretch", c); - - font->Attribute("variant", c, 256); - sp_repr_css_set_property (css, "font-variant", c); - - Inkscape::CSSOStringStream os; - os << sp_font_selector_get_size (SP_FONT_SELECTOR (fontsel)) << "px"; // must specify px, see inkscape bug 1221626 and 1610103 - sp_repr_css_set_property (css, "font-size", os.str().c_str()); - - font->Unref(); - font=NULL; - } - - /* Layout */ - GtkWidget *b = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "text_anchor_start"); - - // Align Left - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (b))) { - sp_repr_css_set_property (css, "text-anchor", "start"); - sp_repr_css_set_property (css, "text-align", "start"); - } else { - // Align Center - b = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), - "text_anchor_middle"); - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (b))) { - sp_repr_css_set_property (css, "text-anchor", "middle"); - sp_repr_css_set_property (css, "text-align", "center"); - } else { - // Align Right - b = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), - "text_anchor_end"); - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (b))) { - sp_repr_css_set_property (css, "text-anchor", "end"); - sp_repr_css_set_property (css, "text-align", "end"); - } else { - // Align Justify - sp_repr_css_set_property (css, "text-anchor", "start"); - sp_repr_css_set_property (css, "text-align", "justify"); - } - } - } - - b = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), INKSCAPE_ICON("format-text-direction-horizontal") ); - - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (b))) { - sp_repr_css_set_property (css, "writing-mode", "lr"); - } else { - sp_repr_css_set_property (css, "writing-mode", "tb"); - } - - // Note that CSS 1.1 does not support line-height; we set it for consistency, but also set - // sodipodi:linespacing for backwards compatibility; in 1.2 we use line-height for flowtext - GtkWidget *combo = (GtkWidget*)g_object_get_data ((GObject *) dlg, "line_spacing"); - -//This would introduce dependency on gtk version 2.24 which is currently not available in -// Trisquel GNU/Linux 4.5.1 (released on May 25th, 2011) -//This conditional and its #else block can be deleted in the future. -#if GTK_CHECK_VERSION(2, 24,0) - const gchar *sstr = gtk_combo_box_text_get_active_text ((GtkComboBoxText *) combo); -#else - const gchar *sstr = gtk_entry_get_text ((GtkEntry *) (gtk_bin_get_child (GTK_BIN (combo)))); -#endif - sp_repr_css_set_property (css, "line-height", sstr); - - return css; -} - - -static void -sp_text_edit_dialog_set_default( GtkButton */*button*/, GtkWidget *dlg ) -{ - GtkWidget *def = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "default"); - - SPCSSAttr *css = sp_get_text_dialog_style (); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - - g_object_set_data (G_OBJECT (dlg), "blocked", GINT_TO_POINTER (TRUE)); - prefs->mergeStyle("/tools/text/style", css); - g_object_set_data (G_OBJECT (dlg), "blocked", GINT_TO_POINTER (FALSE)); - - sp_repr_css_attr_unref (css); - - gtk_widget_set_sensitive (def, FALSE); -} - - - -static void -sp_text_edit_dialog_apply( GtkButton */*button*/, GtkWidget *dlg ) -{ - g_object_set_data (G_OBJECT (dlg), "blocked", GINT_TO_POINTER (TRUE)); - - GtkWidget *apply = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "apply"); - GtkWidget *def = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "default"); - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - - unsigned items = 0; - const GSList *item_list = sp_desktop_selection(desktop)->itemList(); - SPCSSAttr *css = sp_get_text_dialog_style (); - sp_desktop_set_style(desktop, css, true); - - for (; item_list != NULL; item_list = item_list->next) { - // apply style to the reprs of all text objects in the selection - if (SP_IS_TEXT (item_list->data)) { - - // backwards compatibility: - reinterpret_cast<SPObject*>(item_list->data)->getRepr()->setAttribute("sodipodi:linespacing", sp_repr_css_property (css, "line-height", NULL)); - - ++items; - } - else if (SP_IS_FLOWTEXT (item_list->data)) - // no need to set sodipodi:linespacing, because Inkscape never supported it on flowtext - ++items; - } - - if (items == 0) { - // no text objects; apply style to prefs for new objects - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->mergeStyle("/tools/text/style", css); - gtk_widget_set_sensitive (def, FALSE); - } else if (items == 1) { - /* exactly one text object; now set its text, too */ - SPItem *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem(); - if (SP_IS_TEXT (item) || SP_IS_FLOWTEXT(item)) { - sp_text_edit_dialog_update_object_text (item); - } - } - - // complete the transaction - DocumentUndo::done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT, - _("Set text style")); - gtk_widget_set_sensitive (apply, FALSE); - sp_repr_css_attr_unref (css); - g_object_set_data (G_OBJECT (dlg), "blocked", GINT_TO_POINTER (FALSE)); -} - -static void -sp_text_edit_dialog_close( GtkButton */*button*/, GtkWidget *dlg ) -{ - gtk_widget_destroy (GTK_WIDGET (dlg)); -} - -static void -sp_text_edit_dialog_read_selection ( GtkWidget *dlg, - gboolean dostyle, - gboolean docontent ) -{ - if (g_object_get_data (G_OBJECT (dlg), "blocked")) - return; - - g_object_set_data (G_OBJECT (dlg), "blocked", GINT_TO_POINTER (TRUE)); - - //GtkWidget *notebook = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "notebook"); - GtkWidget *textw = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "textw"); - GtkWidget *fontsel = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "fontsel"); - GtkWidget *preview = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "preview"); - GtkWidget *apply = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "apply"); - GtkWidget *def = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "default"); - - GtkTextBuffer *tb = (GtkTextBuffer*)g_object_get_data (G_OBJECT (dlg), "text"); - - SPItem *text = sp_ted_get_selected_text_item (); - - /* TRANSLATORS: Test string used in text and font dialog (when no - * text has been entered) to get a preview of the font. Choose - * some representative characters that users of your locale will be - * interested in. */ - gchar *phrase = g_strdup(_("AaBbCcIiPpQq12369$\342\202\254\302\242?.;/()")); - - if (text) - { - guint items = sp_ted_get_selected_text_count (); - if (items == 1) { - gtk_widget_set_sensitive (textw, TRUE); - } else { - gtk_widget_set_sensitive (textw, FALSE); - } - gtk_widget_set_sensitive (apply, FALSE); - gtk_widget_set_sensitive (def, TRUE); - - if (docontent) { - gchar *str; - str = sp_te_get_string_multiline (text); - - if (str) { - if (items == 1) { - gtk_text_buffer_set_text (tb, str, strlen (str)); - gtk_text_buffer_set_modified (tb, FALSE); - } - g_free(phrase); - phrase = str; - - } else { - gtk_text_buffer_set_text (tb, "", 0); - } - } // end of if (docontent) - text->getRepr(); // was being called but result ignored. Check this. - } else { - gtk_widget_set_sensitive (textw, FALSE); - gtk_widget_set_sensitive (apply, FALSE); - gtk_widget_set_sensitive (def, FALSE); - } - - if (dostyle) { - - // create temporary style - SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT); - // query style from desktop into it. This returns a result flag and fills query with the style of subselection, if any, or selection - //int result_fontspec = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONT_SPECIFICATION); - int result_family = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTFAMILY); - int result_style = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTSTYLE); - int result_numbers = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTNUMBERS); - - // If querying returned nothing, read the style from the text tool prefs (default style for new texts) - // (Ok to not get a font specification - must just rely on the family and style in that case) - if (result_family == QUERY_STYLE_NOTHING || result_style == QUERY_STYLE_NOTHING - || result_numbers == QUERY_STYLE_NOTHING) { - sp_style_read_from_prefs(query, "/tools/text"); - } - - // FIXME: process result_family/style == QUERY_STYLE_MULTIPLE_DIFFERENT by showing "Many" in the lists - - // Get a font_instance using the font-specification attribute stored in SPStyle if available - font_instance *font = font_factory::Default()->FaceFromStyle(query); - - - if (font) { - // the font is oversized, so we need to pass the true size separately - sp_font_selector_set_font (SP_FONT_SELECTOR (fontsel), font, query->font_size.computed); - char *desc = pango_font_description_to_string(font->descr); - double size = sp_font_selector_get_size(SP_FONT_SELECTOR(fontsel)); - gchar *markup = g_strdup_printf("<span font=\"%s\" size=\"%d\">%s</span>", - desc, (int) size * PANGO_SCALE, phrase); - gtk_label_set_markup(GTK_LABEL(preview), markup); - g_free(desc); - g_free(markup); - font->Unref(); - font=NULL; - } - - GtkWidget *b; - if (query->text_anchor.computed == SP_CSS_TEXT_ANCHOR_START) { - if (query->text_align.computed == SP_CSS_TEXT_ALIGN_JUSTIFY) { - b = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), "text_anchor_justify" ); - } else { - b = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), "text_anchor_start" ); - } - } else if (query->text_anchor.computed == SP_CSS_TEXT_ANCHOR_MIDDLE) { - b = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), "text_anchor_middle" ); - } else { - b = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), "text_anchor_end" ); - } - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b), TRUE); - - if (query->writing_mode.computed == SP_CSS_WRITING_MODE_LR_TB) { - b = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), INKSCAPE_ICON("format-text-direction-horizontal") ); - } else { - b = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), INKSCAPE_ICON("format-text-direction-vertical") ); - } - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b), TRUE); - - GtkWidget *combo = (GtkWidget*)g_object_get_data ( G_OBJECT (dlg), "line_spacing" ); - double height; - if (query->line_height.normal) height = Inkscape::Text::Layout::LINE_HEIGHT_NORMAL; - else if (query->line_height.unit == SP_CSS_UNIT_PERCENT) - height = query->line_height.value; - else height = query->line_height.computed; - gchar *sstr = g_strdup_printf ("%d%%", (int) floor(height * 100 + 0.5)); - - gtk_entry_set_text ((GtkEntry *) gtk_bin_get_child ((GtkBin *) (combo)), sstr); - g_free(sstr); - - sp_style_unref(query); - } - g_free(phrase); - g_object_set_data (G_OBJECT (dlg), "blocked", NULL); -} - - -static void -sp_text_edit_dialog_text_changed (GtkTextBuffer *tb, GtkWidget *dlg) -{ - if (g_object_get_data (G_OBJECT (dlg), "blocked")) { - return; - } - - SPItem *text = sp_ted_get_selected_text_item(); - - //GtkWidget *textw = reinterpret_cast<GtkWidget*>(g_object_get_data(G_OBJECT (dlg), "textw")); - GtkWidget *preview = reinterpret_cast<GtkWidget*>(g_object_get_data(G_OBJECT (dlg), "preview")); - GtkWidget *apply = reinterpret_cast<GtkWidget*>(g_object_get_data(G_OBJECT (dlg), "apply")); - GtkWidget *def = reinterpret_cast<GtkWidget*>(g_object_get_data(G_OBJECT (dlg), "default")); - GtkWidget *fontsel = reinterpret_cast<GtkWidget*>(g_object_get_data(G_OBJECT (dlg), "fontsel")); - - GtkTextIter start; - GtkTextIter end; - gtk_text_buffer_get_bounds (tb, &start, &end); - gchar *str = gtk_text_buffer_get_text(tb, &start, &end, TRUE); - font_instance *font = sp_font_selector_get_font(SP_FONT_SELECTOR(fontsel)); - - if (font) { - gchar *phrase = str && *str ? str : _("AaBbCcIiPpQq12369$\342\202\254\302\242?.;/()"); - char *desc = pango_font_description_to_string(font->descr); - double size = sp_font_selector_get_size(SP_FONT_SELECTOR(fontsel)); - gchar *markup = g_strdup_printf("<span font=\"%s\" size=\"%d\">%s</span>", - desc, (int) size * PANGO_SCALE, phrase); - gtk_label_set_markup(GTK_LABEL(preview), markup); - g_free(desc); - g_free(markup); - } else { - gtk_label_set_markup(GTK_LABEL(preview), NULL); - } - g_free (str); - - if (text) { - gtk_widget_set_sensitive (apply, TRUE); - } - gtk_widget_set_sensitive (def, TRUE); - -} // end of sp_text_edit_dialog_text_changed() - -void -sp_text_edit_dialog_default_set_insensitive () -{ - if (!dlg) return; - gpointer data = g_object_get_data (G_OBJECT (dlg), "default"); - if (!data) return; - gtk_widget_set_sensitive (GTK_WIDGET (data), FALSE); -} - -static void -sp_text_edit_dialog_font_changed ( SPFontSelector * /*fsel*/, - font_instance *font, - GtkWidget *dlg ) -{ - GtkWidget *preview, *apply, *def, *fontsel; - GtkTextIter start, end; - gchar *str; - - if (g_object_get_data (G_OBJECT (dlg), "blocked")) - return; - - SPItem *text = sp_ted_get_selected_text_item (); - - preview = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "preview"); - apply = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "apply"); - def = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "default"); - fontsel = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "fontsel"); - - GtkTextBuffer *tb = (GtkTextBuffer*)g_object_get_data (G_OBJECT (dlg), "text"); - gtk_text_buffer_get_bounds (tb, &start, &end); - str = gtk_text_buffer_get_text (tb, &start, &end, TRUE); - - if (font) { - gchar *phrase = str && *str ? str : _("AaBbCcIiPpQq12369$\342\202\254\302\242?.;/()"); - char *desc = pango_font_description_to_string(font->descr); - double size = sp_font_selector_get_size(SP_FONT_SELECTOR(fontsel)); - gchar *markup = g_strdup_printf("<span font=\"%s\" size=\"%d\">%s</span>", - desc, (int) size * PANGO_SCALE, phrase); - gtk_label_set_markup(GTK_LABEL(preview), markup); - g_free(desc); - g_free(markup); - } else { - gtk_label_set_markup(GTK_LABEL(preview), NULL); - } - g_free(str); - - if (text) { - gtk_widget_set_sensitive (apply, TRUE); - } - gtk_widget_set_sensitive (def, TRUE); - -} // end of sp_text_edit_dialog_font_changed() - - - -static void -sp_text_edit_dialog_any_toggled( GtkToggleButton */*tb*/, GtkWidget *dlg ) -{ - GtkWidget *apply, *def; - - if (g_object_get_data (G_OBJECT (dlg), "blocked")) - return; - - SPItem *text = sp_ted_get_selected_text_item (); - - apply = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "apply"); - def = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "default"); - - if (text) { - gtk_widget_set_sensitive (apply, TRUE); - } - gtk_widget_set_sensitive (def, TRUE); -} - - - -static void -sp_text_edit_dialog_line_spacing_changed( GtkEditable */*editable*/, GtkWidget *dlg ) -{ - GtkWidget *apply, *def; - - if (g_object_get_data ((GObject *) dlg, "blocked")) - return; - - SPItem *text = sp_ted_get_selected_text_item (); - - apply = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "apply"); - def = (GtkWidget*)g_object_get_data (G_OBJECT (dlg), "default"); - - if (text) { - gtk_widget_set_sensitive (apply, TRUE); - } - gtk_widget_set_sensitive (def, TRUE); -} - - - -static SPItem * -sp_ted_get_selected_text_item (void) -{ - if (!SP_ACTIVE_DESKTOP) - return NULL; - - for (const GSList *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList(); - item != NULL; - item = item->next) - { - if (SP_IS_TEXT(item->data) || SP_IS_FLOWTEXT(item->data)) - return SP_ITEM (item->data); - } - - return NULL; -} - - - -static unsigned -sp_ted_get_selected_text_count (void) -{ - if (!SP_ACTIVE_DESKTOP) - return 0; - - unsigned int items = 0; - - for (const GSList *item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList(); - item != NULL; - item = item->next) - { - if (SP_IS_TEXT(item->data) || SP_IS_FLOWTEXT(item->data)) - ++items; - } - - return items; -} - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/dialogs/text-edit.h b/src/dialogs/text-edit.h deleted file mode 100644 index 84f914728..000000000 --- a/src/dialogs/text-edit.h +++ /dev/null @@ -1,31 +0,0 @@ -/** @file - * @brief Text-edit - */ -/* Authors: - * Lauris Kaplinski <lauris@ximian.com> - * bulia byak <buliabyak@users.sf.net> - * Johan Engelen <goejendaagh@zonnet.nl> - * - * Copyright (C) 1999-2007 Authors - * Copyright (C) 2000-2001 Ximian, Inc. - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ -#ifndef SEEN_DIALOGS_TEXT_EDIT_H -#define SEEN_DIALOGS_TEXT_EDIT_H - -void sp_text_edit_dialog (void); -void sp_text_edit_dialog_default_set_insensitive (); //FIXME: Replace trough a verb - -#endif - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : |
