diff --git a/po/POTFILES.in b/po/POTFILES.in index 38a7810..0885337 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -9,8 +9,6 @@ xed/dialogs/xed-encodings-dialog.c [type: gettext/glade]xed/dialogs/xed-encodings-dialog.ui xed/dialogs/xed-preferences-dialog.c [type: gettext/glade]xed/dialogs/xed-preferences-dialog.ui -xed/dialogs/xed-search-dialog.c -[type: gettext/glade]xed/dialogs/xed-search-dialog.ui xed/xed.c xed/xed-app.c xed/xed-commands-file.c @@ -34,8 +32,10 @@ xed/xed-plugins-engine.c xed/xed-prefs-manager.c xed/xed-print-job.c [type: gettext/glade]xed/xed-print-preferences.ui +[type: gettext/glade]xed/xed-searchbar.ui xed/xed-print-preview.c xed/xed-smart-charset-converter.c +xed/xed-searchbar.c xed/xed-statusbar.c xed/xed-style-scheme-manager.c xed/xed-tab.c diff --git a/po/xed.pot b/po/xed.pot index 8c162a3..ade2623 100644 --- a/po/xed.pot +++ b/po/xed.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-18 20:07+0100\n" +"POT-Creation-Date: 2016-09-20 16:32+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -637,7 +637,7 @@ msgstr "" msgid "Line Numbers" msgstr "" -#: ../xed/dialogs/xed-preferences-dialog.ui.h:7 ../xed/xed-view.c:1959 +#: ../xed/dialogs/xed-preferences-dialog.ui.h:7 ../xed/xed-view.c:1011 msgid "_Display line numbers" msgstr "" @@ -741,55 +741,6 @@ msgstr "" msgid "Plugins" msgstr "" -#: ../xed/dialogs/xed-search-dialog.c:302 -#: ../xed/dialogs/xed-search-dialog.ui.h:1 ../xed/xed-window.c:1449 -msgid "Replace" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.c:313 ../xed/xed-window.c:1447 -msgid "Find" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.c:417 -msgid "Replace _All" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.c:418 ../xed/xed-commands-file.c:589 -msgid "_Replace" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.ui.h:2 -msgid "Replace All" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.ui.h:3 -msgid "_Search for: " -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.ui.h:4 -msgid "Replace _with: " -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.ui.h:5 -msgid "_Match case" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.ui.h:6 -msgid "Match _entire word only" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.ui.h:7 -msgid "Search _backwards" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.ui.h:8 -msgid "_Wrap around" -msgstr "" - -#: ../xed/dialogs/xed-search-dialog.ui.h:9 -msgid "_Parse escape sequences (e.g. \\n)" -msgstr "" - #: ../xed/xed.c:104 msgid "Show the application's version" msgstr "" @@ -863,6 +814,10 @@ msgstr "" msgid "Do you want to try to replace it with the one you are saving?" msgstr "" +#: ../xed/xed-commands-file.c:589 +msgid "_Replace" +msgstr "" + #: ../xed/xed-commands-file.c:650 ../xed/xed-commands-file.c:873 #, c-format msgid "Saving file '%s'…" @@ -950,35 +905,17 @@ msgstr "" msgid "A small and lightweight text editor" msgstr "" -#: ../xed/xed-commands-search.c:112 -#, c-format -msgid "Found and replaced %d occurrence" -msgid_plural "Found and replaced %d occurrences" -msgstr[0] "" -msgstr[1] "" - -#: ../xed/xed-commands-search.c:122 -msgid "Found and replaced one occurrence" -msgstr "" - -#. Translators: %s is replaced by the text -#. entered by the user in the search box -#: ../xed/xed-commands-search.c:143 -#, c-format -msgid "\"%s\" not found" -msgstr "" - #: ../xed/xed-document.c:1082 ../xed/xed-document.c:1102 #, c-format msgid "Unsaved Document %d" msgstr "" #: ../xed/xed-documents-panel.c:97 ../xed/xed-documents-panel.c:111 -#: ../xed/xed-window.c:2172 ../xed/xed-window.c:2177 +#: ../xed/xed-window.c:1747 ../xed/xed-window.c:1750 msgid "Read-Only" msgstr "" -#: ../xed/xed-documents-panel.c:784 ../xed/xed-window.c:3531 +#: ../xed/xed-documents-panel.c:784 ../xed/xed-window.c:2792 msgid "Documents" msgstr "" @@ -1548,6 +1485,42 @@ msgstr "" msgid "_Restore Default Fonts" msgstr "" +#: ../xed/xed-searchbar.ui.h:1 +msgid "Replace All" +msgstr "" + +#: ../xed/xed-searchbar.ui.h:2 ../xed/xed-window.c:1139 +msgid "Replace" +msgstr "" + +#: ../xed/xed-searchbar.ui.h:3 +msgid "_Search for: " +msgstr "" + +#: ../xed/xed-searchbar.ui.h:4 +msgid "Replace _with: " +msgstr "" + +#: ../xed/xed-searchbar.ui.h:5 ../xed/xed-window.c:1137 +msgid "Find" +msgstr "" + +#: ../xed/xed-searchbar.ui.h:6 +msgid "Find Prev" +msgstr "" + +#: ../xed/xed-searchbar.ui.h:7 +msgid "Case sensitive" +msgstr "" + +#: ../xed/xed-searchbar.ui.h:8 +msgid "Whole word" +msgstr "" + +#: ../xed/xed-searchbar.ui.h:9 +msgid "Wrap" +msgstr "" + #: ../xed/xed-print-preview.c:564 msgid "Show the previous page" msgstr "" @@ -1618,6 +1591,22 @@ msgstr "" msgid "It is not possible to detect the encoding automatically" msgstr "" +#: ../xed/xed-searchbar.c:70 +#, c-format +msgid "Found and replaced %d occurrence" +msgid_plural "Found and replaced %d occurrences" +msgstr[0] "" +msgstr[1] "" + +#: ../xed/xed-searchbar.c:80 +msgid "Found and replaced one occurrence" +msgstr "" + +#: ../xed/xed-searchbar.c:98 +#, c-format +msgid "\"%s\" not found" +msgstr "" + #: ../xed/xed-statusbar.c:70 ../xed/xed-statusbar.c:76 msgid "OVR" msgstr "" @@ -1758,7 +1747,7 @@ msgstr "" msgid "_Open..." msgstr "" -#: ../xed/xed-ui.h:59 ../xed/xed-window.c:1377 +#: ../xed/xed-ui.h:59 ../xed/xed-window.c:1084 msgid "Open a file" msgstr "" @@ -1891,111 +1880,95 @@ msgid "Search for and replace text" msgstr "" #: ../xed/xed-ui.h:119 -msgid "_Clear Highlight" -msgstr "" - -#: ../xed/xed-ui.h:120 -msgid "Clear highlighting of search matches" -msgstr "" - -#: ../xed/xed-ui.h:121 msgid "Go to _Line..." msgstr "" -#: ../xed/xed-ui.h:122 +#: ../xed/xed-ui.h:120 msgid "Go to a specific line" msgstr "" -#: ../xed/xed-ui.h:123 -msgid "_Incremental Search..." -msgstr "" - -#: ../xed/xed-ui.h:124 -msgid "Incrementally search for text" -msgstr "" - #. Documents menu -#: ../xed/xed-ui.h:127 +#: ../xed/xed-ui.h:123 msgid "_Save All" msgstr "" -#: ../xed/xed-ui.h:128 +#: ../xed/xed-ui.h:124 msgid "Save all open files" msgstr "" -#: ../xed/xed-ui.h:129 +#: ../xed/xed-ui.h:125 msgid "_Close All" msgstr "" -#: ../xed/xed-ui.h:130 +#: ../xed/xed-ui.h:126 msgid "Close all open files" msgstr "" -#: ../xed/xed-ui.h:131 +#: ../xed/xed-ui.h:127 msgid "_Previous Document" msgstr "" -#: ../xed/xed-ui.h:132 +#: ../xed/xed-ui.h:128 msgid "Activate previous document" msgstr "" -#: ../xed/xed-ui.h:133 +#: ../xed/xed-ui.h:129 msgid "_Next Document" msgstr "" -#: ../xed/xed-ui.h:134 +#: ../xed/xed-ui.h:130 msgid "Activate next document" msgstr "" -#: ../xed/xed-ui.h:135 +#: ../xed/xed-ui.h:131 msgid "_Move to New Window" msgstr "" -#: ../xed/xed-ui.h:136 +#: ../xed/xed-ui.h:132 msgid "Move the current document to a new window" msgstr "" -#: ../xed/xed-ui.h:143 +#: ../xed/xed-ui.h:139 msgid "Close the current file" msgstr "" -#: ../xed/xed-ui.h:150 +#: ../xed/xed-ui.h:146 msgid "Quit the program" msgstr "" -#: ../xed/xed-ui.h:155 +#: ../xed/xed-ui.h:151 msgid "_Toolbar" msgstr "" -#: ../xed/xed-ui.h:156 +#: ../xed/xed-ui.h:152 msgid "Show or hide the toolbar in the current window" msgstr "" -#: ../xed/xed-ui.h:158 +#: ../xed/xed-ui.h:154 msgid "_Statusbar" msgstr "" -#: ../xed/xed-ui.h:159 +#: ../xed/xed-ui.h:155 msgid "Show or hide the statusbar in the current window" msgstr "" -#: ../xed/xed-ui.h:162 +#: ../xed/xed-ui.h:158 msgid "Edit text in fullscreen" msgstr "" -#: ../xed/xed-ui.h:169 +#: ../xed/xed-ui.h:165 msgid "Side _Pane" msgstr "" -#: ../xed/xed-ui.h:170 +#: ../xed/xed-ui.h:166 msgid "Show or hide the side pane in the current window" msgstr "" -#: ../xed/xed-ui.h:172 +#: ../xed/xed-ui.h:168 msgid "_Bottom Pane" msgstr "" -#: ../xed/xed-ui.h:173 +#: ../xed/xed-ui.h:169 msgid "Show or hide the bottom pane in the current window" msgstr "" @@ -2019,37 +1992,11 @@ msgstr "" msgid "/ on %s" msgstr "" -#. create "Wrap Around" menu item. -#: ../xed/xed-view.c:1197 -msgid "_Wrap Around" -msgstr "" - -#. create "Match Entire Word Only" menu item. -#: ../xed/xed-view.c:1207 -msgid "Match _Entire Word Only" -msgstr "" - -#. create "Match Case" menu item. -#: ../xed/xed-view.c:1217 -msgid "_Match Case" -msgstr "" - -#. create "Parse escapes" menu item. -#: ../xed/xed-view.c:1227 -msgid "" -"_Parse escape sequences (e.g. \n" -")" -msgstr "" - -#: ../xed/xed-view.c:1341 -msgid "String you want to search for" -msgstr "" - -#: ../xed/xed-view.c:1350 +#: ../xed/xed-view.c:672 msgid "Line you want to move the cursor to" msgstr "" -#: ../xed/xed-window.c:930 +#: ../xed/xed-window.c:719 #, c-format msgid "Use %s highlight mode" msgstr "" @@ -2057,51 +2004,51 @@ msgstr "" #. add the "Plain Text" item before all the others #. Translators: "Plain Text" means that no highlight mode is selected in the #. * "View->Highlight Mode" submenu and so syntax highlighting is disabled -#: ../xed/xed-window.c:987 ../xed/xed-window.c:1877 +#: ../xed/xed-window.c:759 ../xed/xed-window.c:1500 msgid "Plain Text" msgstr "" -#: ../xed/xed-window.c:988 +#: ../xed/xed-window.c:759 msgid "Disable syntax highlighting" msgstr "" #. Translators: %s is a URI -#: ../xed/xed-window.c:1274 +#: ../xed/xed-window.c:1003 #, c-format msgid "Open '%s'" msgstr "" -#: ../xed/xed-window.c:1379 +#: ../xed/xed-window.c:1085 msgid "Open a recently used file" msgstr "" -#: ../xed/xed-window.c:1385 +#: ../xed/xed-window.c:1088 msgid "Open" msgstr "" -#: ../xed/xed-window.c:1443 +#: ../xed/xed-window.c:1133 msgid "Save" msgstr "" -#: ../xed/xed-window.c:1445 +#: ../xed/xed-window.c:1135 msgid "Print" msgstr "" #. Translators: %s is a URI -#: ../xed/xed-window.c:1602 +#: ../xed/xed-window.c:1249 #, c-format msgid "Activate '%s'" msgstr "" -#: ../xed/xed-window.c:1855 +#: ../xed/xed-window.c:1481 msgid "Use Spaces" msgstr "" -#: ../xed/xed-window.c:1926 +#: ../xed/xed-window.c:1538 msgid "Tab Width" msgstr "" -#: ../xed/xed-window.c:3812 +#: ../xed/xed-window.c:2985 msgid "Elevated Privileges" msgstr "" diff --git a/xed/Makefile.am b/xed/Makefile.am index 561e4ed..c5018fe 100644 --- a/xed/Makefile.am +++ b/xed/Makefile.am @@ -86,6 +86,7 @@ INST_H_FILES = \ xed-prefs-manager-app.h \ xed-prefs-manager.h \ xed-progress-message-area.h \ + xed-searchbar.h \ xed-statusbar.h \ xed-status-combo-box.h \ xed-tab.h \ @@ -152,6 +153,7 @@ libxed_la_SOURCES = \ xed-progress-message-area.c \ xed-session.c \ xed-smart-charset-converter.c \ + xed-searchbar.c \ xed-statusbar.c \ xed-status-combo-box.c \ xed-style-scheme-manager.c \ @@ -184,6 +186,7 @@ xed-marshal.c: xed-marshal.list $(GLIB_GENMARSHAL) uidir = $(datadir)/xed/ui/ ui_DATA = \ xed-ui.xml \ + xed-searchbar.ui \ xed-print-preferences.ui EXTRA_DIST = \ diff --git a/xed/dialogs/Makefile.am b/xed/dialogs/Makefile.am index 6b407f8..152e6ad 100755 --- a/xed/dialogs/Makefile.am +++ b/xed/dialogs/Makefile.am @@ -17,14 +17,11 @@ libdialogs_la_SOURCES = \ xed-close-confirmation-dialog.c \ xed-close-confirmation-dialog.h \ xed-encodings-dialog.c \ - xed-encodings-dialog.h \ - xed-search-dialog.h \ - xed-search-dialog.c + xed-encodings-dialog.h ui_DATA = \ xed-encodings-dialog.ui \ - xed-preferences-dialog.ui \ - xed-search-dialog.ui + xed-preferences-dialog.ui EXTRA_DIST = $(ui_DATA) diff --git a/xed/dialogs/xed-search-dialog.c b/xed/dialogs/xed-search-dialog.c deleted file mode 100755 index fc410e8..0000000 --- a/xed/dialogs/xed-search-dialog.c +++ /dev/null @@ -1,654 +0,0 @@ -/* - * xed-search-dialog.c - * This file is part of xed - * - * Copyright (C) 2005 Paolo Maggi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* - * Modified by the xed Team, 2005. See the AUTHORS file for a - * list of people on the xed Team. - * See the ChangeLog files for a list of changes. - * - * $Id$ - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include - -#include "xed-search-dialog.h" -#include "xed-history-entry.h" -#include "xed-utils.h" -#include "xed-marshal.h" -#include "xed-dirs.h" - -#define XED_SEARCH_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), \ - XED_TYPE_SEARCH_DIALOG, \ - XedSearchDialogPrivate)) - -/* Signals */ -enum -{ - SHOW_REPLACE, - LAST_SIGNAL -}; - -static guint dialog_signals [LAST_SIGNAL] = { 0 }; - -struct _XedSearchDialogPrivate -{ - gboolean show_replace; - - GtkWidget *table; - GtkWidget *search_label; - GtkWidget *search_entry; - GtkWidget *search_text_entry; - GtkWidget *replace_label; - GtkWidget *replace_entry; - GtkWidget *replace_text_entry; - GtkWidget *match_case_checkbutton; - GtkWidget *entire_word_checkbutton; - GtkWidget *backwards_checkbutton; - GtkWidget *wrap_around_checkbutton; - GtkWidget *parse_escapes_checkbutton; - GtkWidget *find_button; - GtkWidget *replace_button; - GtkWidget *replace_all_button; - - gboolean ui_error; -}; - -G_DEFINE_TYPE(XedSearchDialog, xed_search_dialog, GTK_TYPE_DIALOG) - -enum -{ - PROP_0, - PROP_SHOW_REPLACE -}; - -static void -xed_search_dialog_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - XedSearchDialog *dlg = XED_SEARCH_DIALOG (object); - - switch (prop_id) - { - case PROP_SHOW_REPLACE: - xed_search_dialog_set_show_replace (dlg, - g_value_get_boolean (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -xed_search_dialog_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - XedSearchDialog *dlg = XED_SEARCH_DIALOG (object); - - switch (prop_id) - { - case PROP_SHOW_REPLACE: - g_value_set_boolean (value, dlg->priv->show_replace); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -void -xed_search_dialog_present_with_time (XedSearchDialog *dialog, - guint32 timestamp) -{ - g_return_if_fail (XED_SEARCH_DIALOG (dialog)); - - gtk_window_present_with_time (GTK_WINDOW (dialog), timestamp); - - gtk_widget_grab_focus (dialog->priv->search_text_entry); -} - -static gboolean -show_replace (XedSearchDialog *dlg) -{ - xed_search_dialog_set_show_replace (dlg, TRUE); - - return TRUE; -} - -static void -xed_search_dialog_class_init (XedSearchDialogClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GtkBindingSet *binding_set; - - object_class->set_property = xed_search_dialog_set_property; - object_class->get_property = xed_search_dialog_get_property; - - klass->show_replace = show_replace; - - dialog_signals[SHOW_REPLACE] = - g_signal_new ("show_replace", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (XedSearchDialogClass, show_replace), - NULL, NULL, - xed_marshal_BOOLEAN__NONE, - G_TYPE_BOOLEAN, 0); - - g_object_class_install_property (object_class, PROP_SHOW_REPLACE, - g_param_spec_boolean ("show-replace", - "Show Replace", - "Whether the dialog is used for Search&Replace", - FALSE, - G_PARAM_READWRITE)); - - g_type_class_add_private (object_class, sizeof (XedSearchDialogPrivate)); - - binding_set = gtk_binding_set_by_class (klass); - - /* Note: we cannot use the keyval/modifier associated with the - * GTK_STOCK_FIND_AND_REPLACE stock item since MATE HIG suggests Ctrl+h - * for Replace while gtk+ uses Ctrl+r */ - gtk_binding_entry_add_signal (binding_set, GDK_KEY_h, GDK_CONTROL_MASK, "show_replace", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KEY_H, GDK_CONTROL_MASK, "show_replace", 0); -} - -static void -insert_text_handler (GtkEditable *editable, - const gchar *text, - gint length, - gint *position, - gpointer data) -{ - static gboolean insert_text = FALSE; - gchar *escaped_text; - gint new_len; - - /* To avoid recursive behavior */ - if (insert_text) - return; - - escaped_text = xed_utils_escape_search_text (text); - - new_len = strlen (escaped_text); - - if (new_len == length) - { - g_free (escaped_text); - return; - } - - insert_text = TRUE; - - g_signal_stop_emission_by_name (editable, "insert_text"); - - gtk_editable_insert_text (editable, escaped_text, new_len, position); - - insert_text = FALSE; - - g_free (escaped_text); -} - -static void -search_text_entry_changed (GtkEditable *editable, - XedSearchDialog *dialog) -{ - const gchar *search_string; - - search_string = gtk_entry_get_text (GTK_ENTRY (editable)); - g_return_if_fail (search_string != NULL); - - if (*search_string != '\0') - { - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_FIND_RESPONSE, TRUE); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_REPLACE_ALL_RESPONSE, TRUE); - } - else - { - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_FIND_RESPONSE, FALSE); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_REPLACE_RESPONSE, FALSE); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_REPLACE_ALL_RESPONSE, FALSE); - } -} - -static void -response_handler (XedSearchDialog *dialog, - gint response_id, - gpointer data) -{ - const gchar *str; - - switch (response_id) - { - case XED_SEARCH_DIALOG_REPLACE_RESPONSE: - case XED_SEARCH_DIALOG_REPLACE_ALL_RESPONSE: - str = gtk_entry_get_text (GTK_ENTRY (dialog->priv->replace_text_entry)); - if (*str != '\0') - { - gchar *text; - - text = xed_utils_unescape_search_text (str); - xed_history_entry_prepend_text - (XED_HISTORY_ENTRY (dialog->priv->replace_entry), - text); - - g_free (text); - } - /* fall through, so that we also save the find entry */ - case XED_SEARCH_DIALOG_FIND_RESPONSE: - str = gtk_entry_get_text (GTK_ENTRY (dialog->priv->search_text_entry)); - if (*str != '\0') - { - gchar *text; - - text = xed_utils_unescape_search_text (str); - xed_history_entry_prepend_text - (XED_HISTORY_ENTRY (dialog->priv->search_entry), - text); - - g_free (text); - } - } -} - -static void -show_replace_widgets (XedSearchDialog *dlg, - gboolean show_replace) -{ - if (show_replace) - { - gtk_widget_show (dlg->priv->replace_label); - gtk_widget_show (dlg->priv->replace_entry); - gtk_widget_show (dlg->priv->replace_all_button); - gtk_widget_show (dlg->priv->replace_button); - - gtk_table_set_row_spacings (GTK_TABLE (dlg->priv->table), 12); - - gtk_window_set_title (GTK_WINDOW (dlg), _("Replace")); - } - else - { - gtk_widget_hide (dlg->priv->replace_label); - gtk_widget_hide (dlg->priv->replace_entry); - gtk_widget_hide (dlg->priv->replace_all_button); - gtk_widget_hide (dlg->priv->replace_button); - - gtk_table_set_row_spacings (GTK_TABLE (dlg->priv->table), 0); - - gtk_window_set_title (GTK_WINDOW (dlg), _("Find")); - } - - gtk_widget_show (dlg->priv->find_button); -} - -static void -xed_search_dialog_init (XedSearchDialog *dlg) -{ - GtkWidget *content; - GtkWidget *error_widget; - gboolean ret; - gchar *file; - gchar *root_objects[] = { - "search_dialog_content", - NULL - }; - - dlg->priv = XED_SEARCH_DIALOG_GET_PRIVATE (dlg); - - gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE); - gtk_window_set_destroy_with_parent (GTK_WINDOW (dlg), TRUE); - - gtk_dialog_add_buttons (GTK_DIALOG (dlg), - GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, - NULL); - - /* HIG defaults */ - gtk_container_set_border_width (GTK_CONTAINER (dlg), 5); - gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dlg))), - 2); /* 2 * 5 + 2 = 12 */ - gtk_container_set_border_width (GTK_CONTAINER (gtk_dialog_get_action_area (GTK_DIALOG (dlg))), - 5); - gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dlg))), - 6); - - file = xed_dirs_get_ui_file ("xed-search-dialog.ui"); - ret = xed_utils_get_ui_objects (file, - root_objects, - &error_widget, - "search_dialog_content", &content, - "table", &dlg->priv->table, - "search_label", &dlg->priv->search_label, - "replace_with_label", &dlg->priv->replace_label, - "match_case_checkbutton", &dlg->priv->match_case_checkbutton, - "entire_word_checkbutton", &dlg->priv->entire_word_checkbutton, - "search_backwards_checkbutton", &dlg->priv->backwards_checkbutton, - "wrap_around_checkbutton", &dlg->priv->wrap_around_checkbutton, - "parse_escapes_checkbutton", &dlg->priv->parse_escapes_checkbutton, - NULL); - g_free (file); - - if (!ret) - { - gtk_widget_show (error_widget); - - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dlg))), - error_widget, - TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (error_widget), - 5); - - dlg->priv->ui_error = TRUE; - - return; - } - - dlg->priv->search_entry = xed_history_entry_new ("history-search-for", - TRUE); - gtk_widget_set_size_request (dlg->priv->search_entry, 300, -1); - xed_history_entry_set_escape_func - (XED_HISTORY_ENTRY (dlg->priv->search_entry), - (XedHistoryEntryEscapeFunc) xed_utils_escape_search_text); - - dlg->priv->search_text_entry = xed_history_entry_get_entry - (XED_HISTORY_ENTRY (dlg->priv->search_entry)); - gtk_entry_set_activates_default (GTK_ENTRY (dlg->priv->search_text_entry), - TRUE); - gtk_widget_show (dlg->priv->search_entry); - gtk_table_attach_defaults (GTK_TABLE (dlg->priv->table), - dlg->priv->search_entry, - 1, 2, 0, 1); - - dlg->priv->replace_entry = xed_history_entry_new ("history-replace-with", - TRUE); - xed_history_entry_set_escape_func - (XED_HISTORY_ENTRY (dlg->priv->replace_entry), - (XedHistoryEntryEscapeFunc) xed_utils_escape_search_text); - - dlg->priv->replace_text_entry = xed_history_entry_get_entry - (XED_HISTORY_ENTRY (dlg->priv->replace_entry)); - gtk_entry_set_activates_default (GTK_ENTRY (dlg->priv->replace_text_entry), - TRUE); - gtk_widget_show (dlg->priv->replace_entry); - gtk_table_attach_defaults (GTK_TABLE (dlg->priv->table), - dlg->priv->replace_entry, - 1, 2, 1, 2); - - gtk_label_set_mnemonic_widget (GTK_LABEL (dlg->priv->search_label), - dlg->priv->search_entry); - gtk_label_set_mnemonic_widget (GTK_LABEL (dlg->priv->replace_label), - dlg->priv->replace_entry); - - dlg->priv->find_button = gtk_button_new_from_stock (GTK_STOCK_FIND); - dlg->priv->replace_all_button = gtk_button_new_with_mnemonic (_("Replace _All")); - dlg->priv->replace_button = xed_gtk_button_new_with_stock_icon (_("_Replace"), - GTK_STOCK_FIND_AND_REPLACE); - - gtk_dialog_add_action_widget (GTK_DIALOG (dlg), - dlg->priv->replace_all_button, - XED_SEARCH_DIALOG_REPLACE_ALL_RESPONSE); - gtk_dialog_add_action_widget (GTK_DIALOG (dlg), - dlg->priv->replace_button, - XED_SEARCH_DIALOG_REPLACE_RESPONSE); - gtk_dialog_add_action_widget (GTK_DIALOG (dlg), - dlg->priv->find_button, - XED_SEARCH_DIALOG_FIND_RESPONSE); - g_object_set (G_OBJECT (dlg->priv->find_button), - "can-default", TRUE, - NULL); - - gtk_dialog_set_default_response (GTK_DIALOG (dlg), - XED_SEARCH_DIALOG_FIND_RESPONSE); - - /* insensitive by default */ - gtk_dialog_set_response_sensitive (GTK_DIALOG (dlg), - XED_SEARCH_DIALOG_FIND_RESPONSE, - FALSE); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dlg), - XED_SEARCH_DIALOG_REPLACE_RESPONSE, - FALSE); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dlg), - XED_SEARCH_DIALOG_REPLACE_ALL_RESPONSE, - FALSE); - - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dlg))), - content, FALSE, FALSE, 0); - g_object_unref (content); - gtk_container_set_border_width (GTK_CONTAINER (content), 5); - - g_signal_connect (dlg->priv->search_text_entry, - "insert_text", - G_CALLBACK (insert_text_handler), - NULL); - g_signal_connect (dlg->priv->replace_text_entry, - "insert_text", - G_CALLBACK (insert_text_handler), - NULL); - g_signal_connect (dlg->priv->search_text_entry, - "changed", - G_CALLBACK (search_text_entry_changed), - dlg); - - g_signal_connect (dlg, - "response", - G_CALLBACK (response_handler), - NULL); -} - -GtkWidget * -xed_search_dialog_new (GtkWindow *parent, - gboolean show_replace) -{ - XedSearchDialog *dlg; - - dlg = g_object_new (XED_TYPE_SEARCH_DIALOG, - "show-replace", show_replace, - NULL); - - if (parent != NULL) - { - gtk_window_set_transient_for (GTK_WINDOW (dlg), - parent); - - gtk_window_set_destroy_with_parent (GTK_WINDOW (dlg), - TRUE); - } - - return GTK_WIDGET (dlg); -} - -gboolean -xed_search_dialog_get_show_replace (XedSearchDialog *dialog) -{ - g_return_val_if_fail (XED_IS_SEARCH_DIALOG (dialog), FALSE); - - return dialog->priv->show_replace; -} - -void -xed_search_dialog_set_show_replace (XedSearchDialog *dialog, - gboolean show_replace) -{ - g_return_if_fail (XED_IS_SEARCH_DIALOG (dialog)); - - if (dialog->priv->ui_error) - return; - - dialog->priv->show_replace = show_replace != FALSE; - show_replace_widgets (dialog, dialog->priv->show_replace); - - g_object_notify (G_OBJECT (dialog), "show-replace"); -} - -void -xed_search_dialog_set_search_text (XedSearchDialog *dialog, - const gchar *text) -{ - g_return_if_fail (XED_IS_SEARCH_DIALOG (dialog)); - g_return_if_fail (text != NULL); - - gtk_entry_set_text (GTK_ENTRY (dialog->priv->search_text_entry), - text); - - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_FIND_RESPONSE, - (text != '\0')); - - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_REPLACE_ALL_RESPONSE, - (text != '\0')); -} - -/* - * The text must be unescaped before searching. - */ -const gchar * -xed_search_dialog_get_search_text (XedSearchDialog *dialog) -{ - g_return_val_if_fail (XED_IS_SEARCH_DIALOG (dialog), NULL); - - return gtk_entry_get_text (GTK_ENTRY (dialog->priv->search_text_entry)); -} - -void -xed_search_dialog_set_replace_text (XedSearchDialog *dialog, - const gchar *text) -{ - g_return_if_fail (XED_IS_SEARCH_DIALOG (dialog)); - g_return_if_fail (text != NULL); - - gtk_entry_set_text (GTK_ENTRY (dialog->priv->replace_text_entry), - text); -} - -const gchar * -xed_search_dialog_get_replace_text (XedSearchDialog *dialog) -{ - g_return_val_if_fail (XED_IS_SEARCH_DIALOG (dialog), NULL); - - return gtk_entry_get_text (GTK_ENTRY (dialog->priv->replace_text_entry)); -} - -void -xed_search_dialog_set_match_case (XedSearchDialog *dialog, - gboolean match_case) -{ - g_return_if_fail (XED_IS_SEARCH_DIALOG (dialog)); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->match_case_checkbutton), - match_case); -} - -gboolean -xed_search_dialog_get_match_case (XedSearchDialog *dialog) -{ - g_return_val_if_fail (XED_IS_SEARCH_DIALOG (dialog), FALSE); - - return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->match_case_checkbutton)); -} - -void -xed_search_dialog_set_entire_word (XedSearchDialog *dialog, - gboolean entire_word) -{ - g_return_if_fail (XED_IS_SEARCH_DIALOG (dialog)); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->entire_word_checkbutton), - entire_word); -} - -gboolean -xed_search_dialog_get_entire_word (XedSearchDialog *dialog) -{ - g_return_val_if_fail (XED_IS_SEARCH_DIALOG (dialog), FALSE); - - return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->entire_word_checkbutton)); -} - -void -xed_search_dialog_set_backwards (XedSearchDialog *dialog, - gboolean backwards) -{ - g_return_if_fail (XED_IS_SEARCH_DIALOG (dialog)); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->backwards_checkbutton), - backwards); -} - -gboolean -xed_search_dialog_get_backwards (XedSearchDialog *dialog) -{ - g_return_val_if_fail (XED_IS_SEARCH_DIALOG (dialog), FALSE); - - return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->backwards_checkbutton)); -} - -void -xed_search_dialog_set_wrap_around (XedSearchDialog *dialog, - gboolean wrap_around) -{ - g_return_if_fail (XED_IS_SEARCH_DIALOG (dialog)); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->wrap_around_checkbutton), - wrap_around); -} - -gboolean -xed_search_dialog_get_wrap_around (XedSearchDialog *dialog) -{ - g_return_val_if_fail (XED_IS_SEARCH_DIALOG (dialog), FALSE); - - return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->wrap_around_checkbutton)); -} - -void -xed_search_dialog_set_parse_escapes (XedSearchDialog *dialog, - gboolean parse_escapes) -{ - g_return_if_fail (XED_IS_SEARCH_DIALOG (dialog)); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->parse_escapes_checkbutton), - parse_escapes); -} - -gboolean -xed_search_dialog_get_parse_escapes (XedSearchDialog *dialog) -{ - g_return_val_if_fail (XED_IS_SEARCH_DIALOG (dialog), FALSE); - - return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->parse_escapes_checkbutton)); -} diff --git a/xed/dialogs/xed-search-dialog.h b/xed/dialogs/xed-search-dialog.h deleted file mode 100755 index c2443a7..0000000 --- a/xed/dialogs/xed-search-dialog.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * xed-search-dialog.h - * This file is part of xed - * - * Copyright (C) 2005 Paolo Maggi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* - * Modified by the xed Team, 2005. See the AUTHORS file for a - * list of people on the xed Team. - * See the ChangeLog files for a list of changes. - * - * $Id$ - */ - -#ifndef __XED_SEARCH_DIALOG_H__ -#define __XED_SEARCH_DIALOG_H__ - -#include - -G_BEGIN_DECLS - -/* - * Type checking and casting macros - */ -#define XED_TYPE_SEARCH_DIALOG (xed_search_dialog_get_type()) -#define XED_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_SEARCH_DIALOG, XedSearchDialog)) -#define XED_SEARCH_DIALOG_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_SEARCH_DIALOG, XedSearchDialog const)) -#define XED_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XED_TYPE_SEARCH_DIALOG, XedSearchDialogClass)) -#define XED_IS_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XED_TYPE_SEARCH_DIALOG)) -#define XED_IS_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XED_TYPE_SEARCH_DIALOG)) -#define XED_SEARCH_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XED_TYPE_SEARCH_DIALOG, XedSearchDialogClass)) - -/* Private structure type */ -typedef struct _XedSearchDialogPrivate XedSearchDialogPrivate; - -/* - * Main object structure - */ -typedef struct _XedSearchDialog XedSearchDialog; - -struct _XedSearchDialog -{ - GtkDialog dialog; - - /*< private > */ - XedSearchDialogPrivate *priv; -}; - -/* - * Class definition - */ -typedef struct _XedSearchDialogClass XedSearchDialogClass; - -struct _XedSearchDialogClass -{ - GtkDialogClass parent_class; - - /* Key bindings */ - gboolean (* show_replace) (XedSearchDialog *dlg); -}; - -enum -{ - XED_SEARCH_DIALOG_FIND_RESPONSE = 100, - XED_SEARCH_DIALOG_REPLACE_RESPONSE, - XED_SEARCH_DIALOG_REPLACE_ALL_RESPONSE -}; - -/* - * Public methods - */ -GType xed_search_dialog_get_type (void) G_GNUC_CONST; - -GtkWidget *xed_search_dialog_new (GtkWindow *parent, - gboolean show_replace); - -void xed_search_dialog_present_with_time (XedSearchDialog *dialog, - guint32 timestamp); - -gboolean xed_search_dialog_get_show_replace (XedSearchDialog *dialog); - -void xed_search_dialog_set_show_replace (XedSearchDialog *dialog, - gboolean show_replace); - - -void xed_search_dialog_set_search_text (XedSearchDialog *dialog, - const gchar *text); -const gchar *xed_search_dialog_get_search_text (XedSearchDialog *dialog); - -void xed_search_dialog_set_replace_text (XedSearchDialog *dialog, - const gchar *text); -const gchar *xed_search_dialog_get_replace_text (XedSearchDialog *dialog); - -void xed_search_dialog_set_match_case (XedSearchDialog *dialog, - gboolean match_case); -gboolean xed_search_dialog_get_match_case (XedSearchDialog *dialog); - -void xed_search_dialog_set_entire_word (XedSearchDialog *dialog, - gboolean entire_word); -gboolean xed_search_dialog_get_entire_word (XedSearchDialog *dialog); - -void xed_search_dialog_set_backwards (XedSearchDialog *dialog, - gboolean backwards); -gboolean xed_search_dialog_get_backwards (XedSearchDialog *dialog); - -void xed_search_dialog_set_wrap_around (XedSearchDialog *dialog, - gboolean wrap_around); -gboolean xed_search_dialog_get_wrap_around (XedSearchDialog *dialog); - - -void xed_search_dialog_set_parse_escapes (XedSearchDialog *dialog, - gboolean parse_escapes); -gboolean xed_search_dialog_get_parse_escapes (XedSearchDialog *dialog); - -G_END_DECLS - -#endif /* __XED_SEARCH_DIALOG_H__ */ diff --git a/xed/dialogs/xed-search-dialog.ui b/xed/dialogs/xed-search-dialog.ui deleted file mode 100755 index 73f6455..0000000 --- a/xed/dialogs/xed-search-dialog.ui +++ /dev/null @@ -1,272 +0,0 @@ - - - - - Replace - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - False - False - True - False - False - GDK_WINDOW_TYPE_HINT_DIALOG - GDK_GRAVITY_NORTH_WEST - True - False - - - True - False - 8 - - - True - GTK_BUTTONBOX_DEFAULT_STYLE - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - True - True - True - Replace All - True - GTK_RELIEF_NORMAL - True - - - - - True - True - True - Replace - True - GTK_RELIEF_NORMAL - True - - - - - True - True - True - gtk-find - True - GTK_RELIEF_NORMAL - True - - - - - 0 - False - False - GTK_PACK_END - - - - - 5 - True - False - 18 - - - True - 2 - 2 - False - 12 - 12 - - - True - _Search for: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - True - Replace _with: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - 0 - True - True - - - - - True - False - 12 - - - True - True - _Match case - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - True - True - Match _entire word only - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - True - True - Search _backwards - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - True - True - _Wrap around - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 0 - False - False - - - - - True - True - _Parse escape sequences (e.g. \n) - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 0 - False - False - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - close_button - replace_all_button - replace_button - find_next_button - - - diff --git a/xed/xed-commands-search.c b/xed/xed-commands-search.c index fc55456..e7c473f 100644 --- a/xed/xed-commands-search.c +++ b/xed/xed-commands-search.c @@ -1,35 +1,3 @@ -/* - * xed-search-commands.c - * This file is part of xed - * - * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence - * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi - * Copyright (C) 2002-2006 Paolo Maggi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* - * Modified by the xed Team, 1998-2006. See the AUTHORS file for a - * list of people on the xed Team. - * See the ChangeLog files for a list of changes. - * - * $Id$ - */ - #ifdef HAVE_CONFIG_H #include #endif @@ -41,750 +9,63 @@ #include "xed-commands.h" #include "xed-debug.h" -#include "xed-statusbar.h" #include "xed-window.h" -#include "xed-window-private.h" #include "xed-utils.h" -#include "dialogs/xed-search-dialog.h" +#include "xed-searchbar.h" -#define XED_SEARCH_DIALOG_KEY "xed-search-dialog-key" -#define XED_LAST_SEARCH_DATA_KEY "xed-last-search-data-key" - -typedef struct _LastSearchData LastSearchData; -struct _LastSearchData +void +_xed_cmd_search_find (GtkAction *action, XedWindow *window) { - gint x; - gint y; -}; - -static void -last_search_data_free (LastSearchData *data) -{ - g_slice_free (LastSearchData, data); -} - -static void -last_search_data_restore_position (XedSearchDialog *dlg) -{ - LastSearchData *data; - - data = g_object_get_data (G_OBJECT (dlg), XED_LAST_SEARCH_DATA_KEY); - - if (data != NULL) - { - gtk_window_move (GTK_WINDOW (dlg), - data->x, - data->y); - } -} - -static void -last_search_data_store_position (XedSearchDialog *dlg) -{ - LastSearchData *data; - - data = g_object_get_data (G_OBJECT (dlg), XED_LAST_SEARCH_DATA_KEY); - - if (data == NULL) - { - data = g_slice_new (LastSearchData); - - g_object_set_data_full (G_OBJECT (dlg), - XED_LAST_SEARCH_DATA_KEY, - data, - (GDestroyNotify) last_search_data_free); - } - - gtk_window_get_position (GTK_WINDOW (dlg), - &data->x, - &data->y); -} - -/* Use occurrences only for Replace All */ -static void -text_found (XedWindow *window, - gint occurrences) -{ - if (occurrences > 1) - { - xed_statusbar_flash_message (XED_STATUSBAR (window->priv->statusbar), - window->priv->generic_message_cid, - ngettext("Found and replaced %d occurrence", - "Found and replaced %d occurrences", - occurrences), - occurrences); - } - else - { - if (occurrences == 1) - xed_statusbar_flash_message (XED_STATUSBAR (window->priv->statusbar), - window->priv->generic_message_cid, - _("Found and replaced one occurrence")); - else - xed_statusbar_flash_message (XED_STATUSBAR (window->priv->statusbar), - window->priv->generic_message_cid, - " "); - } -} - -#define MAX_MSG_LENGTH 40 -static void -text_not_found (XedWindow *window, - const gchar *text) -{ - gchar *searched; - - searched = xed_utils_str_end_truncate (text, MAX_MSG_LENGTH); - - xed_statusbar_flash_message (XED_STATUSBAR (window->priv->statusbar), - window->priv->generic_message_cid, - /* Translators: %s is replaced by the text - entered by the user in the search box */ - _("\"%s\" not found"), searched); - g_free (searched); -} - -static gboolean -run_search (XedView *view, - gboolean wrap_around, - gboolean search_backwards) -{ - XedDocument *doc; - GtkTextIter start_iter; - GtkTextIter match_start; - GtkTextIter match_end; - gboolean found = FALSE; - - doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - - if (!search_backwards) - { - gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), - NULL, - &start_iter); - - found = xed_document_search_forward (doc, - &start_iter, - NULL, - &match_start, - &match_end); - } - else - { - gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), - &start_iter, - NULL); - - found = xed_document_search_backward (doc, - NULL, - &start_iter, - &match_start, - &match_end); - } - - if (!found && wrap_around) - { - if (!search_backwards) - found = xed_document_search_forward (doc, - NULL, - NULL, /* FIXME: set the end_inter */ - &match_start, - &match_end); - else - found = xed_document_search_backward (doc, - NULL, /* FIXME: set the start_inter */ - NULL, - &match_start, - &match_end); - } - - if (found) - { - gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), - &match_start); - - gtk_text_buffer_move_mark_by_name (GTK_TEXT_BUFFER (doc), - "selection_bound", - &match_end); - - xed_view_scroll_to_cursor (view); - } - else - { - gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), - &start_iter); - } - - return found; -} - -static void -do_find (XedSearchDialog *dialog, - XedWindow *window) -{ - XedView *active_view; - XedDocument *doc; - gchar *search_text; - const gchar *entry_text; - gboolean match_case; - gboolean entire_word; - gboolean wrap_around; - gboolean search_backwards; - gboolean parse_escapes; - guint flags = 0; - guint old_flags = 0; - gboolean found; - - /* TODO: make the dialog insensitive when all the tabs are closed - * and assert here that the view is not NULL */ - active_view = xed_window_get_active_view (window); - if (active_view == NULL) - return; - - doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view))); - - match_case = xed_search_dialog_get_match_case (dialog); - entire_word = xed_search_dialog_get_entire_word (dialog); - search_backwards = xed_search_dialog_get_backwards (dialog); - wrap_around = xed_search_dialog_get_wrap_around (dialog); - parse_escapes = xed_search_dialog_get_parse_escapes (dialog); - - if (!parse_escapes) { - entry_text = xed_utils_escape_search_text (xed_search_dialog_get_search_text (dialog)); - } else { - entry_text = xed_search_dialog_get_search_text (dialog); - } - - XED_SEARCH_SET_CASE_SENSITIVE (flags, match_case); - XED_SEARCH_SET_ENTIRE_WORD (flags, entire_word); - - search_text = xed_document_get_search_text (doc, &old_flags); - - if ((search_text == NULL) || - (strcmp (search_text, entry_text) != 0) || - (flags != old_flags)) - { - xed_document_set_search_text (doc, entry_text, flags); - } - - g_free (search_text); - - found = run_search (active_view, - wrap_around, - search_backwards); - - if (found) - text_found (window, 0); - else { - if (!parse_escapes) { - text_not_found (window, xed_utils_unescape_search_text (entry_text)); - } else { - text_not_found (window, entry_text); - } - } - - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_REPLACE_RESPONSE, - found); -} - -/* FIXME: move in xed-document.c and share it with xed-view */ -static gboolean -get_selected_text (GtkTextBuffer *doc, - gchar **selected_text, - gint *len) -{ - GtkTextIter start, end; - - g_return_val_if_fail (selected_text != NULL, FALSE); - g_return_val_if_fail (*selected_text == NULL, FALSE); - - if (!gtk_text_buffer_get_selection_bounds (doc, &start, &end)) - { - if (len != NULL) - len = 0; - - return FALSE; - } - - *selected_text = gtk_text_buffer_get_slice (doc, &start, &end, TRUE); - - if (len != NULL) - *len = g_utf8_strlen (*selected_text, -1); - - return TRUE; -} - -static void -replace_selected_text (GtkTextBuffer *buffer, - const gchar *replace) -{ - g_return_if_fail (gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL)); - g_return_if_fail (replace != NULL); - - gtk_text_buffer_begin_user_action (buffer); - - gtk_text_buffer_delete_selection (buffer, FALSE, TRUE); - - gtk_text_buffer_insert_at_cursor (buffer, replace, strlen (replace)); - - gtk_text_buffer_end_user_action (buffer); -} - -static void -do_replace (XedSearchDialog *dialog, - XedWindow *window) -{ - XedDocument *doc; - const gchar *search_entry_text; - const gchar *replace_entry_text; - gchar *unescaped_search_text; - gchar *unescaped_replace_text; - gchar *selected_text = NULL; - gboolean match_case; - gboolean parse_escapes; - - doc = xed_window_get_active_document (window); - if (doc == NULL) - return; - - parse_escapes = xed_search_dialog_get_parse_escapes (dialog); - if (!parse_escapes) { - search_entry_text = xed_utils_escape_search_text (xed_search_dialog_get_search_text (dialog)); - } else { - search_entry_text = xed_search_dialog_get_search_text (dialog); - } - g_return_if_fail ((search_entry_text) != NULL); - g_return_if_fail ((*search_entry_text) != '\0'); - - /* replace text may be "", we just delete */ - if (!parse_escapes) { - replace_entry_text = xed_utils_escape_search_text (xed_search_dialog_get_replace_text (dialog)); - } else { - replace_entry_text = xed_search_dialog_get_replace_text (dialog); - } - g_return_if_fail ((replace_entry_text) != NULL); - - unescaped_search_text = xed_utils_unescape_search_text (search_entry_text); - - get_selected_text (GTK_TEXT_BUFFER (doc), - &selected_text, - NULL); - - match_case = xed_search_dialog_get_match_case (dialog); - - if ((selected_text == NULL) || - (match_case && (strcmp (selected_text, unescaped_search_text) != 0)) || - (!match_case && !g_utf8_caselessnmatch (selected_text, - unescaped_search_text, - strlen (selected_text), - strlen (unescaped_search_text)) != 0)) - { - do_find (dialog, window); - g_free (unescaped_search_text); - g_free (selected_text); - - return; - } - - unescaped_replace_text = xed_utils_unescape_search_text (replace_entry_text); - replace_selected_text (GTK_TEXT_BUFFER (doc), unescaped_replace_text); - - g_free (unescaped_search_text); - g_free (selected_text); - g_free (unescaped_replace_text); - - do_find (dialog, window); -} - -static void -do_replace_all (XedSearchDialog *dialog, - XedWindow *window) -{ - XedView *active_view; - XedDocument *doc; - const gchar *search_entry_text; - const gchar *replace_entry_text; - gboolean match_case; - gboolean entire_word; - gboolean parse_escapes; - guint flags = 0; - gint count; - - active_view = xed_window_get_active_view (window); - if (active_view == NULL) - return; - - doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view))); - - parse_escapes = xed_search_dialog_get_parse_escapes (dialog); - if (!parse_escapes) { - search_entry_text = xed_utils_escape_search_text(xed_search_dialog_get_search_text (dialog)); - } else { - search_entry_text = xed_search_dialog_get_search_text (dialog); - } - g_return_if_fail ((search_entry_text) != NULL); - g_return_if_fail ((*search_entry_text) != '\0'); - - /* replace text may be "", we just delete all occurrencies */ - if (!parse_escapes) { - replace_entry_text = xed_utils_escape_search_text (xed_search_dialog_get_replace_text (dialog)); - } else { - replace_entry_text = xed_search_dialog_get_replace_text (dialog); - } - g_return_if_fail ((replace_entry_text) != NULL); - - match_case = xed_search_dialog_get_match_case (dialog); - entire_word = xed_search_dialog_get_entire_word (dialog); - - XED_SEARCH_SET_CASE_SENSITIVE (flags, match_case); - XED_SEARCH_SET_ENTIRE_WORD (flags, entire_word); - - count = xed_document_replace_all (doc, - search_entry_text, - replace_entry_text, - flags); - - if (count > 0) - { - text_found (window, count); - } - else - { - if (!parse_escapes) { - text_not_found (window, xed_utils_unescape_search_text (search_entry_text)); - } else { - text_not_found (window, search_entry_text); - } - } - - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - XED_SEARCH_DIALOG_REPLACE_RESPONSE, - FALSE); -} - -static void -search_dialog_response_cb (XedSearchDialog *dialog, - gint response_id, - XedWindow *window) -{ - xed_debug (DEBUG_COMMANDS); - - switch (response_id) - { - case XED_SEARCH_DIALOG_FIND_RESPONSE: - do_find (dialog, window); - break; - case XED_SEARCH_DIALOG_REPLACE_RESPONSE: - do_replace (dialog, window); - break; - case XED_SEARCH_DIALOG_REPLACE_ALL_RESPONSE: - do_replace_all (dialog, window); - break; - default: - last_search_data_store_position (dialog); - gtk_widget_hide (GTK_WIDGET (dialog)); - } -} - -static gboolean -search_dialog_delete_event_cb (GtkWidget *widget, - GdkEventAny *event, - gpointer user_data) -{ - xed_debug (DEBUG_COMMANDS); - - /* prevent destruction */ - return TRUE; -} - -static void -search_dialog_destroyed (XedWindow *window, - XedSearchDialog *dialog) -{ - xed_debug (DEBUG_COMMANDS); - - g_object_set_data (G_OBJECT (window), - XED_SEARCH_DIALOG_KEY, - NULL); - g_object_set_data (G_OBJECT (dialog), - XED_LAST_SEARCH_DATA_KEY, - NULL); -} - -static GtkWidget * -create_dialog (XedWindow *window, gboolean show_replace) -{ - GtkWidget *dialog; - - dialog = xed_search_dialog_new (GTK_WINDOW (window), show_replace); - - g_signal_connect (dialog, - "response", - G_CALLBACK (search_dialog_response_cb), - window); - g_signal_connect (dialog, - "delete-event", - G_CALLBACK (search_dialog_delete_event_cb), - NULL); - - g_object_set_data (G_OBJECT (window), - XED_SEARCH_DIALOG_KEY, - dialog); - - g_object_weak_ref (G_OBJECT (dialog), - (GWeakNotify) search_dialog_destroyed, - window); - - return dialog; + xed_searchbar_show (xed_window_get_searchbar (window), FALSE); } void -_xed_cmd_search_find (GtkAction *action, - XedWindow *window) +_xed_cmd_search_replace (GtkAction *action, XedWindow *window) { - gpointer data; - GtkWidget *search_dialog; - XedDocument *doc; - gboolean selection_exists; - gboolean parse_escapes; - gchar *find_text = NULL; - const gchar *search_text = NULL; - gint sel_len; - - xed_debug (DEBUG_COMMANDS); - - data = g_object_get_data (G_OBJECT (window), XED_SEARCH_DIALOG_KEY); - - if (data == NULL) - { - search_dialog = create_dialog (window, FALSE); - } - else - { - g_return_if_fail (XED_IS_SEARCH_DIALOG (data)); - - search_dialog = GTK_WIDGET (data); - - /* turn the dialog into a find dialog if needed */ - if (xed_search_dialog_get_show_replace (XED_SEARCH_DIALOG (search_dialog))) - xed_search_dialog_set_show_replace (XED_SEARCH_DIALOG (search_dialog), - FALSE); - } - - doc = xed_window_get_active_document (window); - g_return_if_fail (doc != NULL); - - selection_exists = get_selected_text (GTK_TEXT_BUFFER (doc), - &find_text, - &sel_len); - - if (selection_exists && find_text != NULL && sel_len < 80) - { - /* - * Special case: if the currently selected text - * is the same as the unescaped search text and - * escape sequence parsing is activated, use the - * same old search text. (Without this, if you e.g. - * search for '\n' in escaped mode and then open - * the search dialog again, you'll get an unprintable - * single-character literal '\n' in the "search for" - * box). - */ - parse_escapes = xed_search_dialog_get_parse_escapes (XED_SEARCH_DIALOG (search_dialog)); - search_text = xed_search_dialog_get_search_text (XED_SEARCH_DIALOG (search_dialog)); - if (!(search_text != NULL - && !strcmp(xed_utils_unescape_search_text(search_text), find_text) - && parse_escapes)) { - /* General case */ - xed_search_dialog_set_search_text (XED_SEARCH_DIALOG (search_dialog), - find_text); - } - g_free (find_text); - } - else - { - g_free (find_text); - } - - gtk_widget_show (search_dialog); - last_search_data_restore_position (XED_SEARCH_DIALOG (search_dialog)); - xed_search_dialog_present_with_time (XED_SEARCH_DIALOG (search_dialog), - GDK_CURRENT_TIME); + xed_searchbar_show (xed_window_get_searchbar (window), TRUE); } void -_xed_cmd_search_replace (GtkAction *action, - XedWindow *window) +_xed_cmd_search_find_next (GtkAction *action, XedWindow *window) { - gpointer data; - GtkWidget *replace_dialog; - XedDocument *doc; - gboolean selection_exists; - gboolean parse_escapes; - gchar *find_text = NULL; - const gchar *search_text = NULL; - gint sel_len; - - xed_debug (DEBUG_COMMANDS); - - data = g_object_get_data (G_OBJECT (window), XED_SEARCH_DIALOG_KEY); - - if (data == NULL) - { - replace_dialog = create_dialog (window, TRUE); - } - else - { - g_return_if_fail (XED_IS_SEARCH_DIALOG (data)); - - replace_dialog = GTK_WIDGET (data); - - /* turn the dialog into a find dialog if needed */ - if (!xed_search_dialog_get_show_replace (XED_SEARCH_DIALOG (replace_dialog))) - xed_search_dialog_set_show_replace (XED_SEARCH_DIALOG (replace_dialog), - TRUE); - } - - doc = xed_window_get_active_document (window); - g_return_if_fail (doc != NULL); - - selection_exists = get_selected_text (GTK_TEXT_BUFFER (doc), - &find_text, - &sel_len); - - if (selection_exists && find_text != NULL && sel_len < 80) - { - /* - * Special case: if the currently selected text - * is the same as the unescaped search text and - * escape sequence parsing is activated, use the - * same old search text. (Without this, if you e.g. - * search for '\n' in escaped mode and then open - * the search dialog again, you'll get an unprintable - * single-character literal '\n' in the "search for" - * box). - */ - parse_escapes = xed_search_dialog_get_parse_escapes (XED_SEARCH_DIALOG (replace_dialog)); - search_text = xed_search_dialog_get_search_text (XED_SEARCH_DIALOG (replace_dialog)); - if (!(search_text != NULL - && !strcmp(xed_utils_unescape_search_text(search_text), find_text) - && parse_escapes)) { - /* General case */ - xed_search_dialog_set_search_text (XED_SEARCH_DIALOG (replace_dialog), - find_text); - } - g_free (find_text); - } - else - { - g_free (find_text); - } - - gtk_widget_show (replace_dialog); - last_search_data_restore_position (XED_SEARCH_DIALOG (replace_dialog)); - xed_search_dialog_present_with_time (XED_SEARCH_DIALOG (replace_dialog), - GDK_CURRENT_TIME); -} - -static void -do_find_again (XedWindow *window, - gboolean backward) -{ - XedView *active_view; - gboolean wrap_around = TRUE; - gpointer data; - - active_view = xed_window_get_active_view (window); - g_return_if_fail (active_view != NULL); - - data = g_object_get_data (G_OBJECT (window), XED_SEARCH_DIALOG_KEY); - - if (data != NULL) - wrap_around = xed_search_dialog_get_wrap_around (XED_SEARCH_DIALOG (data)); - - run_search (active_view, - wrap_around, - backward); + xed_debug (DEBUG_COMMANDS); + xed_searchbar_find_again (xed_window_get_searchbar (window), FALSE); } void -_xed_cmd_search_find_next (GtkAction *action, - XedWindow *window) +_xed_cmd_search_find_prev (GtkAction *action, XedWindow *window) { - xed_debug (DEBUG_COMMANDS); - - do_find_again (window, FALSE); + xed_debug (DEBUG_COMMANDS); + xed_searchbar_find_again (xed_window_get_searchbar (window), TRUE); } void -_xed_cmd_search_find_prev (GtkAction *action, - XedWindow *window) +_xed_cmd_search_clear_highlight (XedWindow *window) { - xed_debug (DEBUG_COMMANDS); - - do_find_again (window, TRUE); + XedDocument *doc; + xed_debug (DEBUG_COMMANDS); + doc = xed_window_get_active_document (window); + if (doc != NULL) { + xed_document_set_search_text (XED_DOCUMENT (doc), "", XED_SEARCH_DONT_SET_FLAGS); + } } void -_xed_cmd_search_clear_highlight (GtkAction *action, - XedWindow *window) +_xed_cmd_search_goto_line (GtkAction *action, XedWindow *window) { - XedDocument *doc; + XedView *active_view; + xed_debug (DEBUG_COMMANDS); - xed_debug (DEBUG_COMMANDS); + active_view = xed_window_get_active_view (window); + if (active_view == NULL) { + return; + } - doc = xed_window_get_active_document (window); - xed_document_set_search_text (XED_DOCUMENT (doc), - "", - XED_SEARCH_DONT_SET_FLAGS); -} - -void -_xed_cmd_search_goto_line (GtkAction *action, - XedWindow *window) -{ - XedView *active_view; - - xed_debug (DEBUG_COMMANDS); - - active_view = xed_window_get_active_view (window); - if (active_view == NULL) - return; - - /* Focus the view if needed: we need to focus the view otherwise - activating the binding for goto line has no effect */ - gtk_widget_grab_focus (GTK_WIDGET (active_view)); - - - /* goto line is builtin in XedView, just activate - * the corrisponding binding. - */ - gtk_bindings_activate (G_OBJECT (active_view), - GDK_KEY_i, - GDK_CONTROL_MASK); -} - -void -_xed_cmd_search_incremental_search (GtkAction *action, - XedWindow *window) -{ - XedView *active_view; - - xed_debug (DEBUG_COMMANDS); - - active_view = xed_window_get_active_view (window); - if (active_view == NULL) - return; - - /* Focus the view if needed: we need to focus the view otherwise - activating the binding for incremental search has no effect */ - gtk_widget_grab_focus (GTK_WIDGET (active_view)); - - /* incremental search is builtin in XedView, just activate - * the corrisponding binding. - */ - gtk_bindings_activate (G_OBJECT (active_view), - GDK_KEY_k, - GDK_CONTROL_MASK); + /* Focus the view if needed: we need to focus the view otherwise + activating the binding for goto line has no effect */ + gtk_widget_grab_focus (GTK_WIDGET (active_view)); + + + /* Goto line is builtin in XedView, just activate the corresponding binding. */ + gtk_bindings_activate (G_OBJECT (active_view), GDK_KEY_i, GDK_CONTROL_MASK); } diff --git a/xed/xed-commands.h b/xed/xed-commands.h index 64945f0..c053ad2 100644 --- a/xed/xed-commands.h +++ b/xed/xed-commands.h @@ -1,36 +1,3 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * xed-commands.h - * This file is part of xed - * - * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence - * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi - * Copyright (C) 2002-2005 Paolo Maggi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* - * Modified by the xed Team, 1998-2005. See the AUTHORS file for a - * list of people on the xed Team. - * See the ChangeLog files for a list of changes. - * - * $Id$ - */ - #ifndef __XED_COMMANDS_H__ #define __XED_COMMANDS_H__ @@ -40,120 +7,67 @@ G_BEGIN_DECLS /* Do nothing if URI does not exist */ -void xed_commands_load_uri (XedWindow *window, - const gchar *uri, - const XedEncoding *encoding, - gint line_pos); +void xed_commands_load_uri (XedWindow *window, const gchar *uri, const XedEncoding *encoding, gint line_pos); /* Ignore non-existing URIs */ -gint xed_commands_load_uris (XedWindow *window, - const GSList *uris, - const XedEncoding *encoding, - gint line_pos); - -void xed_commands_save_document (XedWindow *window, - XedDocument *document); - -void xed_commands_save_all_documents (XedWindow *window); +gint xed_commands_load_uris (XedWindow *window, const GSList *uris, const XedEncoding *encoding, gint line_pos); +void xed_commands_save_document (XedWindow *window, XedDocument *document); +void xed_commands_save_all_documents (XedWindow *window); /* * Non-exported functions */ /* Create titled documens for non-existing URIs */ -gint _xed_cmd_load_files_from_prompt (XedWindow *window, - GSList *files, - const XedEncoding *encoding, - gint line_pos); +gint _xed_cmd_load_files_from_prompt (XedWindow *window, GSList *files, const XedEncoding *encoding, gint line_pos); +void _xed_cmd_file_new (GtkAction *action, XedWindow *window); +void _xed_cmd_file_open (GtkAction *action, XedWindow *window); +void _xed_cmd_file_save (GtkAction *action, XedWindow *window); +void _xed_cmd_file_save_as (GtkAction *action, XedWindow *window); +void _xed_cmd_file_save_all (GtkAction *action, XedWindow *window); +void _xed_cmd_file_revert (GtkAction *action, XedWindow *window); +void _xed_cmd_file_open_uri (GtkAction *action, XedWindow *window); +void _xed_cmd_file_print_preview (GtkAction *action, XedWindow *window); +void _xed_cmd_file_print (GtkAction *action, XedWindow *window); +void _xed_cmd_file_close (GtkAction *action, XedWindow *window); +void _xed_cmd_file_close_all (GtkAction *action, XedWindow *window); +void _xed_cmd_file_quit (GtkAction *action, XedWindow *window); -void _xed_cmd_file_new (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_open (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_save (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_save_as (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_save_all (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_revert (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_open_uri (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_print_preview (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_print (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_close (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_close_all (GtkAction *action, - XedWindow *window); -void _xed_cmd_file_quit (GtkAction *action, - XedWindow *window); +void _xed_cmd_edit_undo (GtkAction *action, XedWindow *window); +void _xed_cmd_edit_redo (GtkAction *action, XedWindow *window); +void _xed_cmd_edit_cut (GtkAction *action, XedWindow *window); +void _xed_cmd_edit_copy (GtkAction *action, XedWindow *window); +void _xed_cmd_edit_paste (GtkAction *action, XedWindow *window); +void _xed_cmd_edit_delete (GtkAction *action, XedWindow *window); +void _xed_cmd_edit_select_all (GtkAction *action, XedWindow *window); +void _xed_cmd_edit_preferences (GtkAction *action, XedWindow *window); -void _xed_cmd_edit_undo (GtkAction *action, - XedWindow *window); -void _xed_cmd_edit_redo (GtkAction *action, - XedWindow *window); -void _xed_cmd_edit_cut (GtkAction *action, - XedWindow *window); -void _xed_cmd_edit_copy (GtkAction *action, - XedWindow *window); -void _xed_cmd_edit_paste (GtkAction *action, - XedWindow *window); -void _xed_cmd_edit_delete (GtkAction *action, - XedWindow *window); -void _xed_cmd_edit_select_all (GtkAction *action, - XedWindow *window); -void _xed_cmd_edit_preferences (GtkAction *action, - XedWindow *window); +void _xed_cmd_view_show_toolbar (GtkAction *action, XedWindow *window); +void _xed_cmd_view_show_statusbar (GtkAction *action, XedWindow *window); +void _xed_cmd_view_show_side_pane (GtkAction *action, XedWindow *window); +void _xed_cmd_view_show_bottom_pane (GtkAction *action, XedWindow *window); +void _xed_cmd_view_toggle_fullscreen_mode (GtkAction *action, XedWindow *window); +void _xed_cmd_view_leave_fullscreen_mode (GtkAction *action, XedWindow *window); -void _xed_cmd_view_show_toolbar (GtkAction *action, - XedWindow *window); -void _xed_cmd_view_show_statusbar (GtkAction *action, - XedWindow *window); -void _xed_cmd_view_show_side_pane (GtkAction *action, - XedWindow *window); -void _xed_cmd_view_show_bottom_pane (GtkAction *action, - XedWindow *window); -void _xed_cmd_view_toggle_fullscreen_mode (GtkAction *action, - XedWindow *window); -void _xed_cmd_view_leave_fullscreen_mode (GtkAction *action, - XedWindow *window); +void _xed_cmd_search_find (GtkAction *action, XedWindow *window); -void _xed_cmd_search_find (GtkAction *action, - XedWindow *window); -void _xed_cmd_search_find_next (GtkAction *action, - XedWindow *window); -void _xed_cmd_search_find_prev (GtkAction *action, - XedWindow *window); -void _xed_cmd_search_replace (GtkAction *action, - XedWindow *window); -void _xed_cmd_search_clear_highlight (GtkAction *action, - XedWindow *window); -void _xed_cmd_search_goto_line (GtkAction *action, - XedWindow *window); -void _xed_cmd_search_incremental_search (GtkAction *action, - XedWindow *window); - -void _xed_cmd_documents_previous_document (GtkAction *action, - XedWindow *window); -void _xed_cmd_documents_next_document (GtkAction *action, - XedWindow *window); -void _xed_cmd_documents_move_to_new_window (GtkAction *action, - XedWindow *window); +void _xed_cmd_search_find_next (GtkAction *action, XedWindow *window); +void _xed_cmd_search_find_prev (GtkAction *action, XedWindow *window); +void _xed_cmd_search_replace (GtkAction *action, XedWindow *window); +void _xed_cmd_search_clear_highlight (XedWindow *window); +void _xed_cmd_search_goto_line (GtkAction *action, XedWindow *window); -void _xed_cmd_help_contents (GtkAction *action, - XedWindow *window); -void _xed_cmd_help_about (GtkAction *action, - XedWindow *window); +void _xed_cmd_documents_previous_document (GtkAction *action, XedWindow *window); +void _xed_cmd_documents_next_document (GtkAction *action, XedWindow *window); +void _xed_cmd_documents_move_to_new_window (GtkAction *action, XedWindow *window); -void _xed_cmd_file_close_tab (XedTab *tab, - XedWindow *window); +void _xed_cmd_help_contents (GtkAction *action, XedWindow *window); +void _xed_cmd_help_about (GtkAction *action, XedWindow *window); -void _xed_cmd_file_save_documents_list (XedWindow *window, - GList *docs); +void _xed_cmd_file_close_tab (XedTab *tab, XedWindow *window); + +void _xed_cmd_file_save_documents_list (XedWindow *window, GList *docs); G_END_DECLS -#endif /* __XED_COMMANDS_H__ */ +#endif /* __XED_COMMANDS_H__ */ diff --git a/xed/xed-searchbar.c b/xed/xed-searchbar.c new file mode 100755 index 0000000..2fddc55 --- /dev/null +++ b/xed/xed-searchbar.c @@ -0,0 +1,719 @@ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "xed-searchbar.h" +#include "xed-statusbar.h" +#include "xed-history-entry.h" +#include "xed-utils.h" +#include "xed-marshal.h" +#include "xed-dirs.h" +#include "xed-commands.h" +#include "xed-window-private.h" + +#define XED_SEARCHBAR_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), XED_TYPE_SEARCHBAR, XedSearchbarPrivate)) + +/* Signals */ +enum +{ + SHOW_REPLACE, + LAST_SIGNAL +}; + +struct _XedSearchbarPrivate +{ + gboolean show_replace; + GtkWidget *revealer; + GtkWidget *grid; + GtkWidget *search_label; + GtkWidget *search_entry; + GtkWidget *search_text_entry; + GtkWidget *replace_label; + GtkWidget *replace_entry; + GtkWidget *replace_text_entry; + GtkWidget *match_case_checkbutton; + GtkWidget *entire_word_checkbutton; + GtkWidget *wrap_around_checkbutton; + GtkWidget *find_button; + GtkWidget *find_prev_button; + GtkWidget *replace_button; + GtkWidget *replace_all_button; +}; + +G_DEFINE_TYPE(XedSearchbar, xed_searchbar, GTK_TYPE_BOX) + +static void +xed_searchbar_class_init (XedSearchbarClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkBindingSet *binding_set; + g_type_class_add_private (object_class, sizeof (XedSearchbarPrivate)); + binding_set = gtk_binding_set_by_class (klass); +} + +#define XED_SEARCHBAR_KEY "xed-searchbar-key" +#define MAX_MSG_LENGTH 40 + +/* Use occurrences only for Replace All */ +static void +text_found (XedWindow *window, gint occurrences) +{ + if (occurrences > 1) { + xed_statusbar_flash_message (XED_STATUSBAR (window->priv->statusbar), + window->priv->generic_message_cid, + ngettext("Found and replaced %d occurrence", + "Found and replaced %d occurrences", + occurrences), + occurrences); + } + else + { + if (occurrences == 1) { + xed_statusbar_flash_message (XED_STATUSBAR (window->priv->statusbar), + window->priv->generic_message_cid, + _("Found and replaced one occurrence")); + } + else { + xed_statusbar_flash_message (XED_STATUSBAR (window->priv->statusbar), + window->priv->generic_message_cid, + " "); + } + } +} + +static void +text_not_found (XedWindow *window, const gchar *text) +{ + gchar *searched; + + searched = xed_utils_str_end_truncate (text, MAX_MSG_LENGTH); + xed_statusbar_flash_message (XED_STATUSBAR (window->priv->statusbar), + window->priv->generic_message_cid, + _("\"%s\" not found"), searched); + g_free (searched); +} + +static gboolean +run_search (XedView *view, gboolean wrap_around, gboolean search_backwards) +{ + XedDocument *doc; + GtkTextIter start_iter; + GtkTextIter match_start; + GtkTextIter match_end; + gboolean found = FALSE; + + doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); + + if (!search_backwards) { + gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), NULL, &start_iter); + found = xed_document_search_forward (doc, &start_iter, NULL, &match_start, &match_end); + } + else { + gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), &start_iter, NULL); + found = xed_document_search_backward (doc, NULL, &start_iter, &match_start, &match_end); + } + + if (!found && wrap_around) { + if (!search_backwards) { + found = xed_document_search_forward (doc, NULL, NULL, /* FIXME: set the end_inter */ + &match_start, &match_end); + } + else { + found = xed_document_search_backward (doc, NULL, /* FIXME: set the start_inter */ NULL, + &match_start, &match_end); + } + } + + if (found) { + gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), &match_start); + gtk_text_buffer_move_mark_by_name (GTK_TEXT_BUFFER (doc), "selection_bound", &match_end); + xed_view_scroll_to_cursor (view); + } + else { + gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), &start_iter); + } + + return found; +} + +static void +do_find (XedSearchbar *searchbar, gboolean search_backwards) +{ + XedView *active_view; + XedDocument *doc; + gchar *search_text; + const gchar *entry_text; + gboolean match_case; + gboolean entire_word; + gboolean wrap_around; + guint flags = 0; + guint old_flags = 0; + gboolean found; + + /* TODO: make the searchbar insensitive when all the tabs are closed + * and assert here that the view is not NULL */ + active_view = xed_window_get_active_view (searchbar->window); + if (active_view == NULL) { + return; + } + + doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view))); + + match_case = xed_searchbar_get_match_case (searchbar); + entire_word = xed_searchbar_get_entire_word (searchbar); + wrap_around = xed_searchbar_get_wrap_around (searchbar); + entry_text = xed_searchbar_get_search_text (searchbar); + + XED_SEARCH_SET_CASE_SENSITIVE (flags, match_case); + XED_SEARCH_SET_ENTIRE_WORD (flags, entire_word); + + search_text = xed_document_get_search_text (doc, &old_flags); + + if ((search_text == NULL) || (strcmp (search_text, entry_text) != 0) || (flags != old_flags)) { + xed_document_set_search_text (doc, entry_text, flags); + } + + g_free (search_text); + + found = run_search (active_view, wrap_around, search_backwards); + + if (found) { + text_found (searchbar->window, 0); + } + else { + text_not_found (searchbar->window, entry_text); + } +} + +void +xed_searchbar_find_again (XedSearchbar *searchbar, gboolean backward) +{ + XedView *active_view; + gboolean wrap_around = TRUE; + gpointer data; + + active_view = xed_window_get_active_view (searchbar->window); + g_return_if_fail (active_view != NULL); + + data = g_object_get_data (G_OBJECT (searchbar->window), XED_SEARCHBAR_KEY); + + if (data != NULL) { + wrap_around = xed_searchbar_get_wrap_around (XED_SEARCHBAR (data)); + } + + run_search (active_view, wrap_around, backward); +} + +static void +search_buttons_set_sensitive (XedSearchbar *searchbar, gboolean sensitive) +{ + gtk_widget_set_sensitive (searchbar->priv->find_button, sensitive); + gtk_widget_set_sensitive (searchbar->priv->find_prev_button, sensitive); + gtk_widget_set_sensitive (searchbar->priv->replace_button, sensitive); + gtk_widget_set_sensitive (searchbar->priv->replace_all_button, sensitive); +} + +/* FIXME: move in xed-document.c and share it with xed-view */ +static gboolean +get_selected_text (GtkTextBuffer *doc, gchar **selected_text, gint *len) +{ + GtkTextIter start, end; + + g_return_val_if_fail (selected_text != NULL, FALSE); + g_return_val_if_fail (*selected_text == NULL, FALSE); + + if (!gtk_text_buffer_get_selection_bounds (doc, &start, &end)) { + if (len != NULL) { + len = 0; + } + return FALSE; + } + + *selected_text = gtk_text_buffer_get_slice (doc, &start, &end, TRUE); + + if (len != NULL) { + *len = g_utf8_strlen (*selected_text, -1); + } + + return TRUE; +} + +static void +replace_selected_text (GtkTextBuffer *buffer, const gchar *replace) +{ + g_return_if_fail (gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL)); + g_return_if_fail (replace != NULL); + + gtk_text_buffer_begin_user_action (buffer); + gtk_text_buffer_delete_selection (buffer, FALSE, TRUE); + gtk_text_buffer_insert_at_cursor (buffer, replace, strlen (replace)); + gtk_text_buffer_end_user_action (buffer); +} + +static void +do_replace (XedSearchbar *searchbar) +{ + XedDocument *doc; + const gchar *search_entry_text; + const gchar *replace_entry_text; + gchar *unescaped_search_text; + gchar *unescaped_replace_text; + gchar *selected_text = NULL; + gboolean match_case; + + doc = xed_window_get_active_document (searchbar->window); + if (doc == NULL) { + return; + } + + search_entry_text = xed_searchbar_get_search_text (searchbar); + g_return_if_fail ((search_entry_text) != NULL); + g_return_if_fail ((*search_entry_text) != '\0'); + + /* replace text may be "", we just delete */ + replace_entry_text = xed_searchbar_get_replace_text (searchbar); + g_return_if_fail ((replace_entry_text) != NULL); + + unescaped_search_text = xed_utils_unescape_search_text (search_entry_text); + + get_selected_text (GTK_TEXT_BUFFER (doc), &selected_text, NULL); + + match_case = xed_searchbar_get_match_case (searchbar); + + if ((selected_text == NULL) || + (match_case && (strcmp (selected_text, unescaped_search_text) != 0)) || + (!match_case && !g_utf8_caselessnmatch (selected_text, + unescaped_search_text, + strlen (selected_text), + strlen (unescaped_search_text)) != 0)) { + do_find (searchbar, FALSE); + g_free (unescaped_search_text); + g_free (selected_text); + + return; + } + + unescaped_replace_text = xed_utils_unescape_search_text (replace_entry_text); + replace_selected_text (GTK_TEXT_BUFFER (doc), unescaped_replace_text); + + g_free (unescaped_search_text); + g_free (selected_text); + g_free (unescaped_replace_text); + + do_find (searchbar, FALSE); +} + +static void +do_replace_all (XedSearchbar *searchbar) +{ + XedView *active_view; + XedDocument *doc; + const gchar *search_entry_text; + const gchar *replace_entry_text; + gboolean match_case; + gboolean entire_word; + guint flags = 0; + gint count; + + active_view = xed_window_get_active_view (searchbar->window); + if (active_view == NULL) { + return; + } + + doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view))); + + search_entry_text = xed_searchbar_get_search_text (searchbar); + g_return_if_fail ((search_entry_text) != NULL); + g_return_if_fail ((*search_entry_text) != '\0'); + + /* replace text may be "", we just delete all occurrences */ + replace_entry_text = xed_searchbar_get_replace_text (searchbar); + g_return_if_fail ((replace_entry_text) != NULL); + + match_case = xed_searchbar_get_match_case (searchbar); + entire_word = xed_searchbar_get_entire_word (searchbar); + + XED_SEARCH_SET_CASE_SENSITIVE (flags, match_case); + XED_SEARCH_SET_ENTIRE_WORD (flags, entire_word); + + count = xed_document_replace_all (doc, search_entry_text, replace_entry_text, flags); + + if (count > 0) { + text_found (searchbar->window, count); + } + else { + text_not_found (searchbar->window, search_entry_text); + } + +} + +static void +insert_text_handler (GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer data) +{ + static gboolean insert_text = FALSE; + gchar *escaped_text; + gint new_len; + + /* To avoid recursive behavior */ + if (insert_text) { + return; + } + + escaped_text = xed_utils_escape_search_text (text); + + new_len = strlen (escaped_text); + + if (new_len == length) { + g_free (escaped_text); + return; + } + + insert_text = TRUE; + + g_signal_stop_emission_by_name (editable, "insert_text"); + + gtk_editable_insert_text (editable, escaped_text, new_len, position); + + insert_text = FALSE; + + g_free (escaped_text); +} + +static void +search_text_entry_changed (GtkEditable *editable, XedSearchbar *searchbar) +{ + const gchar *search_string; + + search_string = gtk_entry_get_text (GTK_ENTRY (editable)); + g_return_if_fail (search_string != NULL); + + if (*search_string != '\0') { + search_buttons_set_sensitive(searchbar, TRUE); + do_find (searchbar, FALSE); + } + else { + search_buttons_set_sensitive(searchbar, FALSE); + } +} + +static void +remember_search_entry (XedSearchbar *searchbar) +{ + const gchar *str; + str = gtk_entry_get_text (GTK_ENTRY (searchbar->priv->search_text_entry)); + if (*str != '\0') { + gchar *text; + text = xed_utils_unescape_search_text (str); + xed_history_entry_prepend_text (XED_HISTORY_ENTRY (searchbar->priv->search_entry), text); + g_free (text); + } +} + +static void +remember_replace_entry (XedSearchbar *searchbar) +{ + const gchar *str; + str = gtk_entry_get_text (GTK_ENTRY (searchbar->priv->replace_text_entry)); + if (*str != '\0') { + gchar *text; + text = xed_utils_unescape_search_text (str); + xed_history_entry_prepend_text (XED_HISTORY_ENTRY (searchbar->priv->replace_entry), text); + g_free (text); + } +} + +static void +find_button_clicked_callback (GtkWidget *button, XedSearchbar *searchbar) +{ + remember_search_entry (searchbar); + do_find (searchbar, FALSE); +} + +static void +find_prev_button_clicked_callback (GtkWidget *button, XedSearchbar *searchbar) +{ + remember_search_entry (searchbar); + do_find (searchbar, TRUE); +} + +static void +replace_button_clicked_callback (GtkWidget *button, XedSearchbar *searchbar) +{ + remember_search_entry (searchbar); + remember_replace_entry (searchbar); + do_replace (searchbar); +} + +static void +replace_all_button_clicked_callback (GtkWidget *button, XedSearchbar *searchbar) +{ + remember_search_entry (searchbar); + remember_replace_entry (searchbar); + do_replace_all (searchbar); +} + +static void +on_search_text_entry_activated (GtkEntry *widget, XedSearchbar *searchbar) +{ + remember_search_entry (searchbar); + do_find (searchbar, FALSE); +} + +static void +xed_searchbar_init (XedSearchbar *searchbar) +{ + GtkWidget *content; + GtkSizeGroup *size_group; + GtkWidget *error_widget; + gchar *file; + gchar *root_objects[] = {"searchbar_content", NULL}; + + searchbar->priv = XED_SEARCHBAR_GET_PRIVATE (searchbar); + + file = xed_dirs_get_ui_file ("xed-searchbar.ui"); + xed_utils_get_ui_objects (file, + root_objects, + &error_widget, + "searchbar_content", &content, + "revealer", &searchbar->priv->revealer, + "grid", &searchbar->priv->grid, + "search_label", &searchbar->priv->search_label, + "replace_with_label", &searchbar->priv->replace_label, + "match_case_checkbutton", &searchbar->priv->match_case_checkbutton, + "entire_word_checkbutton", &searchbar->priv->entire_word_checkbutton, + "wrap_around_checkbutton", &searchbar->priv->wrap_around_checkbutton, + "find_button", &searchbar->priv->find_button, + "find_prev_button", &searchbar->priv->find_prev_button, + "replace_button", &searchbar->priv->replace_button, + "replace_all_button", &searchbar->priv->replace_all_button, + NULL); + g_free (file); + + searchbar->priv->search_entry = xed_history_entry_new ("history-search-for", TRUE); + gtk_widget_set_hexpand (searchbar->priv->search_entry, TRUE); + xed_history_entry_set_escape_func ( + XED_HISTORY_ENTRY (searchbar->priv->search_entry), + (XedHistoryEntryEscapeFunc) xed_utils_escape_search_text); + + searchbar->priv->search_text_entry = xed_history_entry_get_entry ( + XED_HISTORY_ENTRY (searchbar->priv->search_entry)); + gtk_entry_set_activates_default (GTK_ENTRY (searchbar->priv->search_text_entry), TRUE); + + gtk_widget_show (searchbar->priv->search_entry); + gtk_grid_attach (GTK_GRID (searchbar->priv->grid), searchbar->priv->search_entry, 2, 0, 1, 1); + + searchbar->priv->replace_entry = xed_history_entry_new ("history-replace-with", TRUE); + xed_history_entry_set_escape_func ( + XED_HISTORY_ENTRY (searchbar->priv->replace_entry), + (XedHistoryEntryEscapeFunc) xed_utils_escape_search_text); + + searchbar->priv->replace_text_entry = xed_history_entry_get_entry ( + XED_HISTORY_ENTRY (searchbar->priv->replace_entry)); + gtk_entry_set_activates_default (GTK_ENTRY (searchbar->priv->replace_text_entry), TRUE); + + gtk_widget_show (searchbar->priv->replace_entry); + gtk_grid_attach (GTK_GRID (searchbar->priv->grid), searchbar->priv->replace_entry, 2, 1, 1, 1); + + gtk_label_set_mnemonic_widget (GTK_LABEL (searchbar->priv->search_label), searchbar->priv->search_entry); + gtk_label_set_mnemonic_widget (GTK_LABEL (searchbar->priv->replace_label), searchbar->priv->replace_entry); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, GTK_WIDGET (searchbar->priv->find_button)); + gtk_size_group_add_widget (size_group, GTK_WIDGET (searchbar->priv->find_prev_button)); + gtk_size_group_add_widget (size_group, GTK_WIDGET (searchbar->priv->replace_button)); + gtk_size_group_add_widget (size_group, GTK_WIDGET (searchbar->priv->replace_all_button)); + + /* insensitive by default */ + search_buttons_set_sensitive(searchbar, FALSE); + + xed_searchbar_hide (searchbar); + + gtk_box_pack_start (GTK_BOX (searchbar), content, TRUE, TRUE, 0); + gtk_widget_show (GTK_WIDGET (searchbar)); + + g_object_unref (content); + + g_signal_connect (searchbar->priv->search_text_entry, "insert_text", + G_CALLBACK (insert_text_handler), NULL); + + g_signal_connect (searchbar->priv->replace_text_entry, "insert_text", + G_CALLBACK (insert_text_handler), NULL); + + g_signal_connect (searchbar->priv->search_text_entry, "changed", + G_CALLBACK (search_text_entry_changed), searchbar); + + g_signal_connect (searchbar->priv->search_text_entry, "activate", + G_CALLBACK (on_search_text_entry_activated), searchbar); + + g_signal_connect (searchbar->priv->find_button, "clicked", + G_CALLBACK (find_button_clicked_callback), searchbar); + + g_signal_connect (searchbar->priv->find_prev_button, "clicked", + G_CALLBACK (find_prev_button_clicked_callback), searchbar); + + g_signal_connect (searchbar->priv->replace_button, "clicked", + G_CALLBACK (replace_button_clicked_callback), searchbar); + + g_signal_connect (searchbar->priv->replace_all_button, "clicked", + G_CALLBACK (replace_all_button_clicked_callback), searchbar); +} + +GtkWidget * +xed_searchbar_new (GtkWindow *parent, gboolean show_replace) +{ + XedSearchbar *searchbar; + searchbar = g_object_new (XED_TYPE_SEARCHBAR, NULL); + searchbar->window = parent; + return GTK_WIDGET (searchbar); +} + +void xed_searchbar_show (XedSearchbar *searchbar, gboolean show_replace) +{ + XedDocument *doc; + gboolean selection_exists; + gchar *find_text = NULL; + const gchar *search_text = NULL; + gint sel_len; + + doc = xed_window_get_active_document (searchbar->window); + g_return_if_fail (doc != NULL); + + selection_exists = get_selected_text (GTK_TEXT_BUFFER (doc), &find_text, &sel_len); + + if (selection_exists && find_text != NULL && sel_len < 80) { + /* + * Special case: if the currently selected text + * is the same as the unescaped search text, use the + * same old search text. (Without this, if you e.g. + * search for '\n' and then open the search searchbar again, + * you'll get an unprintable single-character literal '\n' in the "search for" box). + */ + search_text = xed_searchbar_get_search_text (XED_SEARCHBAR (searchbar)); + if (!(search_text != NULL && !strcmp(xed_utils_unescape_search_text(search_text), find_text))) { + /* General case */ + xed_searchbar_set_search_text (XED_SEARCHBAR (searchbar), find_text); + } + g_free (find_text); + } + else { + g_free (find_text); + } + gtk_revealer_set_transition_type (GTK_REVEALER (searchbar->priv->revealer), GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP); + gtk_revealer_set_reveal_child (GTK_REVEALER (searchbar->priv->revealer), TRUE); + if (show_replace) { + gtk_widget_show (searchbar->priv->replace_label); + gtk_widget_show (searchbar->priv->replace_entry); + gtk_widget_show (searchbar->priv->replace_all_button); + gtk_widget_show (searchbar->priv->replace_button); + gtk_grid_set_row_spacing (GTK_GRID (searchbar->priv->grid), 10); + } + else { + gtk_widget_hide (searchbar->priv->replace_label); + gtk_widget_hide (searchbar->priv->replace_entry); + gtk_widget_hide (searchbar->priv->replace_all_button); + gtk_widget_hide (searchbar->priv->replace_button); + gtk_grid_set_row_spacing (GTK_GRID (searchbar->priv->grid), 0); + } + + gtk_widget_show (searchbar->priv->find_button); + gtk_widget_grab_focus (searchbar->priv->search_text_entry); +} + +void xed_searchbar_hide (XedSearchbar *searchbar) +{ + gtk_revealer_set_transition_type (GTK_REVEALER (searchbar->priv->revealer), + GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN); + gtk_revealer_set_reveal_child (GTK_REVEALER (searchbar->priv->revealer), FALSE); + + // focus document + XedView *active_view = xed_window_get_active_view (searchbar->window); + if (active_view != NULL) { + gtk_widget_grab_focus (GTK_WIDGET (active_view)); + } + + // remove highlighting + _xed_cmd_search_clear_highlight (searchbar->window); +} + +void +xed_searchbar_set_search_text (XedSearchbar *searchbar, const gchar *text) +{ + g_return_if_fail (XED_IS_SEARCHBAR (searchbar)); + g_return_if_fail (text != NULL); + gtk_entry_set_text (GTK_ENTRY (searchbar->priv->search_text_entry), text); + search_buttons_set_sensitive(searchbar, (text != '\0')); +} + +/* + * The text must be unescaped before searching. + */ +const gchar * +xed_searchbar_get_search_text (XedSearchbar *searchbar) +{ + g_return_val_if_fail (XED_IS_SEARCHBAR (searchbar), NULL); + return gtk_entry_get_text (GTK_ENTRY (searchbar->priv->search_text_entry)); +} + +void +xed_searchbar_set_replace_text (XedSearchbar *searchbar, const gchar *text) +{ + g_return_if_fail (XED_IS_SEARCHBAR (searchbar)); + g_return_if_fail (text != NULL); + + gtk_entry_set_text (GTK_ENTRY (searchbar->priv->replace_text_entry), text); +} + +const gchar * +xed_searchbar_get_replace_text (XedSearchbar *searchbar) +{ + g_return_val_if_fail (XED_IS_SEARCHBAR (searchbar), NULL); + return gtk_entry_get_text (GTK_ENTRY (searchbar->priv->replace_text_entry)); +} + +void +xed_searchbar_set_match_case (XedSearchbar *searchbar, gboolean match_case) +{ + g_return_if_fail (XED_IS_SEARCHBAR (searchbar)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (searchbar->priv->match_case_checkbutton), match_case); +} + +gboolean +xed_searchbar_get_match_case (XedSearchbar *searchbar) +{ + g_return_val_if_fail (XED_IS_SEARCHBAR (searchbar), FALSE); + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (searchbar->priv->match_case_checkbutton)); +} + +void +xed_searchbar_set_entire_word (XedSearchbar *searchbar, gboolean entire_word) +{ + g_return_if_fail (XED_IS_SEARCHBAR (searchbar)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (searchbar->priv->entire_word_checkbutton), entire_word); +} + +gboolean +xed_searchbar_get_entire_word (XedSearchbar *searchbar) +{ + g_return_val_if_fail (XED_IS_SEARCHBAR (searchbar), FALSE); + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (searchbar->priv->entire_word_checkbutton)); +} + +void +xed_searchbar_set_wrap_around (XedSearchbar *searchbar, gboolean wrap_around) +{ + g_return_if_fail (XED_IS_SEARCHBAR (searchbar)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (searchbar->priv->wrap_around_checkbutton), wrap_around); +} + +gboolean +xed_searchbar_get_wrap_around (XedSearchbar *searchbar) +{ + g_return_val_if_fail (XED_IS_SEARCHBAR (searchbar), FALSE); + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (searchbar->priv->wrap_around_checkbutton)); +} diff --git a/xed/xed-searchbar.h b/xed/xed-searchbar.h new file mode 100755 index 0000000..d3b1af5 --- /dev/null +++ b/xed/xed-searchbar.h @@ -0,0 +1,92 @@ + +#ifndef __XED_SEARCHBAR_H__ +#define __XED_SEARCHBAR_H__ + +#include +#include "xed-window.h" + +G_BEGIN_DECLS + +/* + * Type checking and casting macros + */ +#define XED_TYPE_SEARCHBAR (xed_searchbar_get_type()) +#define XED_SEARCHBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_SEARCHBAR, XedSearchbar)) +#define XED_SEARCHBAR_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_SEARCHBAR, XedSearchbar const)) +#define XED_SEARCHBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XED_TYPE_SEARCHBAR, XedSearchbarClass)) +#define XED_IS_SEARCHBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XED_TYPE_SEARCHBAR)) +#define XED_IS_SEARCHBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XED_TYPE_SEARCHBAR)) +#define XED_SEARCHBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XED_TYPE_SEARCHBAR, XedSearchbarClass)) + +/* Private structure type */ +typedef struct _XedSearchbarPrivate XedSearchbarPrivate; + +/* + * Main object structure + */ +typedef struct _XedSearchbar XedSearchbar; + +struct _XedSearchbar +{ + GtkBox parent; + XedWindow *window; + + /*< private > */ + XedSearchbarPrivate *priv; +}; + +/* + * Class definition + */ +typedef struct _XedSearchbarClass XedSearchbarClass; + +struct _XedSearchbarClass +{ + GtkBoxClass parent_class; + + /* Key bindings */ + gboolean (* show_replace) (XedSearchbar *dlg); +}; + +enum +{ + XED_SEARCHBAR_FIND_RESPONSE = 100, + XED_SEARCHBAR_REPLACE_RESPONSE, + XED_SEARCHBAR_REPLACE_ALL_RESPONSE +}; + +/* + * Public methods + */ +GType xed_searchbar_get_type (void) G_GNUC_CONST; + +GtkWidget *xed_searchbar_new (GtkWindow *parent, gboolean show_replace); + +void xed_searchbar_hide (XedSearchbar *searchbar); +void xed_searchbar_show (XedSearchbar *searchbar, gboolean show_replace); +void xed_searchbar_find_again (XedSearchbar *searchbar, gboolean backward); + +void xed_searchbar_set_search_text (XedSearchbar *searchbar, const gchar *text); +const gchar *xed_searchbar_get_search_text (XedSearchbar *searchbar); + +void xed_searchbar_set_replace_text (XedSearchbar *searchbar, const gchar *text); +const gchar *xed_searchbar_get_replace_text (XedSearchbar *searchbar); + +void xed_searchbar_set_match_case (XedSearchbar *searchbar, gboolean match_case); +gboolean xed_searchbar_get_match_case (XedSearchbar *searchbar); + +void xed_searchbar_set_entire_word (XedSearchbar *searchbar, gboolean entire_word); +gboolean xed_searchbar_get_entire_word (XedSearchbar *searchbar); + +void xed_searchbar_set_backwards (XedSearchbar *searchbar, gboolean backwards); +gboolean xed_searchbar_get_backwards (XedSearchbar *searchbar); + +void xed_searchbar_set_wrap_around (XedSearchbar *searchbar, gboolean wrap_around); +gboolean xed_searchbar_get_wrap_around (XedSearchbar *searchbar); + +void xed_searchbar_set_parse_escapes (XedSearchbar *searchbar, gboolean parse_escapes); +gboolean xed_searchbar_get_parse_escapes (XedSearchbar *searchbar); + +G_END_DECLS + +#endif /* __XED_SEARCHBAR_H__ */ diff --git a/xed/xed-searchbar.ui b/xed/xed-searchbar.ui new file mode 100755 index 0000000..b1fb5fe --- /dev/null +++ b/xed/xed-searchbar.ui @@ -0,0 +1,208 @@ + + + + + + + False + True + + + True + False + vertical + + + True + False + crossfade + 175 + True + + + True + False + center + 6 + 3 + + + Replace All + True + True + True + + + 4 + 1 + + + + + Replace + True + True + True + + + 3 + 1 + + + + + True + False + center + False + False + _Search for: + True + 0 + + + 1 + 0 + + + + + True + False + Replace _with: + True + 0 + + + 1 + 1 + + + + + Find + True + True + True + center + False + False + + + 3 + 0 + + + + + Find Prev + True + True + True + center + False + False + + + 4 + 0 + + + + + True + False + + + True + True + True + Case sensitive + start + + + True + False + xapp-text-case-symbolic + + + + + False + False + 0 + + + + + True + True + True + Whole word + start + + + True + False + xapp-search-entire-word-symbolic + + + + + False + False + 1 + + + + + True + True + True + Wrap + True + + + True + False + xapp-search-wrap-symbolic + + + + + False + True + 2 + + + + + + 0 + 0 + + + + + + + + + + + + + + + + False + True + 0 + + + + + + diff --git a/xed/xed-ui.h b/xed/xed-ui.h index 34f4a1f..d2e11bc 100644 --- a/xed/xed-ui.h +++ b/xed/xed-ui.h @@ -116,12 +116,8 @@ static const GtkActionEntry xed_menu_entries[] = N_("Search backwards for the same text"), G_CALLBACK (_xed_cmd_search_find_prev) }, { "SearchReplace", GTK_STOCK_FIND_AND_REPLACE, N_("_Replace..."), "H", N_("Search for and replace text"), G_CALLBACK (_xed_cmd_search_replace) }, - { "SearchClearHighlight", NULL, N_("_Clear Highlight"), "K", - N_("Clear highlighting of search matches"), G_CALLBACK (_xed_cmd_search_clear_highlight) }, { "SearchGoToLine", GTK_STOCK_JUMP_TO, N_("Go to _Line..."), "I", N_("Go to a specific line"), G_CALLBACK (_xed_cmd_search_goto_line) }, - { "SearchIncrementalSearch", GTK_STOCK_FIND, N_("_Incremental Search..."), "K", - N_("Incrementally search for text"), G_CALLBACK (_xed_cmd_search_incremental_search) }, /* Documents menu */ { "FileSaveAll", GTK_STOCK_SAVE, N_("_Save All"), "L", diff --git a/xed/xed-ui.xml b/xed/xed-ui.xml index 70f9475..d859216 100644 --- a/xed/xed-ui.xml +++ b/xed/xed-ui.xml @@ -1,31 +1,3 @@ - - @@ -60,9 +32,9 @@ - + - + @@ -93,7 +65,6 @@ - @@ -103,12 +74,11 @@ - - + @@ -136,7 +106,7 @@ - + @@ -195,7 +165,7 @@ - + diff --git a/xed/xed-view.c b/xed/xed-view.c index 47556d2..0a5e8a1 100644 --- a/xed/xed-view.c +++ b/xed/xed-view.c @@ -1,45 +1,11 @@ -/* - * xed-view.c - * This file is part of xed - * - * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence - * Copyright (C) 2000, 2002 Chema Celorio, Paolo Maggi - * Copyright (C) 2003-2005 Paolo Maggi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* - * Modified by the xed Team, 1998-2005. See the AUTHORS file for a - * list of people on the xed Team. - * See the ChangeLog files for a list of changes. - * - * $Id$ - */ - #ifdef HAVE_CONFIG_H #include #endif #include #include - #include #include - #include #include "xed-view.h" @@ -52,405 +18,265 @@ #define XED_VIEW_SCROLL_MARGIN 0.02 #define XED_VIEW_SEARCH_DIALOG_TIMEOUT (30*1000) /* 30 seconds */ -#define MIN_SEARCH_COMPLETION_KEY_LEN 3 - #define XED_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), XED_TYPE_VIEW, XedViewPrivate)) -typedef enum -{ - GOTO_LINE, - SEARCH -} SearchMode; - enum { - TARGET_URI_LIST = 100 + TARGET_URI_LIST = 100 }; struct _XedViewPrivate { - SearchMode search_mode; - - GtkTextIter start_search_iter; - - /* used to restore the search state if an - * incremental search is cancelled - */ - gchar *old_search_text; - guint old_search_flags; - - /* used to remeber the state of the last - * incremental search (the document search - * state may be changed by the search dialog) - */ - guint search_flags; - gboolean wrap_around; - - GtkWidget *search_window; - GtkWidget *search_entry; - - guint typeselect_flush_timeout; - guint search_entry_changed_id; - - gboolean disable_popdown; - - GtkTextBuffer *current_buffer; + GtkTextIter start_search_iter; + GtkWidget *search_window; + GtkWidget *search_entry; + guint typeselect_flush_timeout; + guint search_entry_changed_id; + gboolean disable_popdown; + GtkTextBuffer *current_buffer; }; -/* The search entry completion is shared among all the views */ -GtkListStore *search_completion_model = NULL; - -static void xed_view_dispose (GObject *object); -static void xed_view_finalize (GObject *object); -static gint xed_view_focus_out (GtkWidget *widget, - GdkEventFocus *event); -static gboolean xed_view_drag_motion (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint timestamp); -static void xed_view_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint timestamp); -static gboolean xed_view_drag_drop (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint timestamp); -static gboolean xed_view_button_press_event (GtkWidget *widget, - GdkEventButton *event); - -static gboolean start_interactive_search (XedView *view); -static gboolean start_interactive_goto_line (XedView *view); -static gboolean reset_searched_text (XedView *view); - -static void hide_search_window (XedView *view, - gboolean cancel); - -static gboolean xed_view_draw (GtkWidget *widget, - cairo_t *cr); - -static void search_highlight_updated_cb (XedDocument *doc, - GtkTextIter *start, - GtkTextIter *end, - XedView *view); - -static void xed_view_delete_from_cursor (GtkTextView *text_view, - GtkDeleteType type, - gint count); +static void xed_view_dispose (GObject *object); +static void xed_view_finalize (GObject *object); +static gint xed_view_focus_out (GtkWidget *widget, GdkEventFocus *event); +static gboolean xed_view_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint timestamp); +static void xed_view_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, + GtkSelectionData *selection_data, guint info, guint timestamp); +static gboolean xed_view_drag_drop (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint timestamp); +static gboolean xed_view_button_press_event (GtkWidget *widget, GdkEventButton *event); +static gboolean start_interactive_goto_line (XedView *view); +static void hide_search_window (XedView *view, gboolean cancel); +static gboolean xed_view_draw (GtkWidget *widget, cairo_t *cr); +static void search_highlight_updated_cb (XedDocument *doc, GtkTextIter *start, GtkTextIter *end, XedView *view); +static void xed_view_delete_from_cursor (GtkTextView *text_view, GtkDeleteType type, gint count); G_DEFINE_TYPE(XedView, xed_view, GTK_SOURCE_TYPE_VIEW) /* Signals */ enum { - START_INTERACTIVE_SEARCH, - START_INTERACTIVE_GOTO_LINE, - RESET_SEARCHED_TEXT, - DROP_URIS, - LAST_SIGNAL + START_INTERACTIVE_GOTO_LINE, + DROP_URIS, + LAST_SIGNAL }; static guint view_signals [LAST_SIGNAL] = { 0 }; typedef enum { - XED_SEARCH_ENTRY_NORMAL, - XED_SEARCH_ENTRY_NOT_FOUND + XED_SEARCH_ENTRY_NORMAL, + XED_SEARCH_ENTRY_NOT_FOUND } XedSearchEntryState; static void -document_read_only_notify_handler (XedDocument *document, - GParamSpec *pspec, - XedView *view) +document_read_only_notify_handler (XedDocument *document, GParamSpec *pspec, XedView *view) { - xed_debug (DEBUG_VIEW); - - gtk_text_view_set_editable (GTK_TEXT_VIEW (view), - !xed_document_get_readonly (document)); + xed_debug (DEBUG_VIEW); + gtk_text_view_set_editable (GTK_TEXT_VIEW (view), !xed_document_get_readonly (document)); } static void xed_view_class_init (XedViewClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - GtkTextViewClass *text_view_class = GTK_TEXT_VIEW_CLASS (klass); - - GtkBindingSet *binding_set; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GtkTextViewClass *text_view_class = GTK_TEXT_VIEW_CLASS (klass); - object_class->dispose = xed_view_dispose; - object_class->finalize = xed_view_finalize; + GtkBindingSet *binding_set; - widget_class->focus_out_event = xed_view_focus_out; - widget_class->draw = xed_view_draw; + object_class->dispose = xed_view_dispose; + object_class->finalize = xed_view_finalize; - /* - * Override the gtk_text_view_drag_motion and drag_drop - * functions to get URIs - * - * If the mime type is text/uri-list, then we will accept - * the potential drop, or request the data (depending on the - * function). - * - * If the drag context has any other mime type, then pass the - * information onto the GtkTextView's standard handlers. - * (widget_class->function_name). - * - * See bug #89881 for details - */ - widget_class->drag_motion = xed_view_drag_motion; - widget_class->drag_data_received = xed_view_drag_data_received; - widget_class->drag_drop = xed_view_drag_drop; - widget_class->button_press_event = xed_view_button_press_event; - klass->start_interactive_search = start_interactive_search; - klass->start_interactive_goto_line = start_interactive_goto_line; - klass->reset_searched_text = reset_searched_text; + widget_class->focus_out_event = xed_view_focus_out; + widget_class->draw = xed_view_draw; - text_view_class->delete_from_cursor = xed_view_delete_from_cursor; - - view_signals[START_INTERACTIVE_SEARCH] = - g_signal_new ("start_interactive_search", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (XedViewClass, start_interactive_search), - NULL, NULL, - xed_marshal_BOOLEAN__NONE, - G_TYPE_BOOLEAN, 0); + /* + * Override the gtk_text_view_drag_motion and drag_drop + * functions to get URIs + * + * If the mime type is text/uri-list, then we will accept + * the potential drop, or request the data (depending on the + * function). + * + * If the drag context has any other mime type, then pass the + * information onto the GtkTextView's standard handlers. + * (widget_class->function_name). + * + * See bug #89881 for details + */ + widget_class->drag_motion = xed_view_drag_motion; + widget_class->drag_data_received = xed_view_drag_data_received; + widget_class->drag_drop = xed_view_drag_drop; + widget_class->button_press_event = xed_view_button_press_event; + klass->start_interactive_goto_line = start_interactive_goto_line; - view_signals[START_INTERACTIVE_GOTO_LINE] = - g_signal_new ("start_interactive_goto_line", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (XedViewClass, start_interactive_goto_line), - NULL, NULL, - xed_marshal_BOOLEAN__NONE, - G_TYPE_BOOLEAN, 0); + text_view_class->delete_from_cursor = xed_view_delete_from_cursor; - view_signals[RESET_SEARCHED_TEXT] = - g_signal_new ("reset_searched_text", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (XedViewClass, reset_searched_text), - NULL, NULL, - xed_marshal_BOOLEAN__NONE, - G_TYPE_BOOLEAN, 0); + view_signals[START_INTERACTIVE_GOTO_LINE] = g_signal_new ("start_interactive_goto_line", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (XedViewClass, start_interactive_goto_line), NULL, NULL, xed_marshal_BOOLEAN__NONE, + G_TYPE_BOOLEAN, 0); - /* A new signal DROP_URIS has been added to allow plugins to intercept - * the default dnd behaviour of 'text/uri-list'. XedView now handles - * dnd in the default handlers of drag_drop, drag_motion and - * drag_data_received. The view emits drop_uris from drag_data_received - * if valid uris have been dropped. Plugins should connect to - * drag_motion, drag_drop and drag_data_received to change this - * default behaviour. They should _NOT_ use this signal because this - * will not prevent xed from loading the uri - */ - view_signals[DROP_URIS] = - g_signal_new ("drop_uris", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (XedViewClass, drop_uris), - NULL, NULL, - g_cclosure_marshal_VOID__BOXED, - G_TYPE_NONE, 1, G_TYPE_STRV); - - g_type_class_add_private (klass, sizeof (XedViewPrivate)); - - binding_set = gtk_binding_set_by_class (klass); - - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_k, - GDK_CONTROL_MASK, - "start_interactive_search", 0); - - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_i, - GDK_CONTROL_MASK, - "start_interactive_goto_line", 0); - - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_k, - GDK_CONTROL_MASK | GDK_SHIFT_MASK, - "reset_searched_text", 0); + /* A new signal DROP_URIS has been added to allow plugins to intercept + * the default dnd behaviour of 'text/uri-list'. XedView now handles + * dnd in the default handlers of drag_drop, drag_motion and + * drag_data_received. The view emits drop_uris from drag_data_received + * if valid uris have been dropped. Plugins should connect to + * drag_motion, drag_drop and drag_data_received to change this + * default behaviour. They should _NOT_ use this signal because this + * will not prevent xed from loading the uri + */ + view_signals[DROP_URIS] = g_signal_new ("drop_uris", G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (XedViewClass, drop_uris),NULL, NULL, + g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, G_TYPE_STRV); - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_d, - GDK_CONTROL_MASK, - "delete_from_cursor", 2, - G_TYPE_ENUM, GTK_DELETE_PARAGRAPHS, - G_TYPE_INT, 1); + g_type_class_add_private (klass, sizeof (XedViewPrivate)); + + binding_set = gtk_binding_set_by_class (klass); + + gtk_binding_entry_add_signal (binding_set, GDK_KEY_i, GDK_CONTROL_MASK, "start_interactive_goto_line", 0); + + gtk_binding_entry_add_signal (binding_set, GDK_KEY_d, GDK_CONTROL_MASK, "delete_from_cursor", 2, G_TYPE_ENUM, + GTK_DELETE_PARAGRAPHS, G_TYPE_INT, 1); } static void current_buffer_removed (XedView *view) { - if (view->priv->current_buffer) - { - g_signal_handlers_disconnect_by_func (view->priv->current_buffer, - document_read_only_notify_handler, - view); - g_signal_handlers_disconnect_by_func (view->priv->current_buffer, - search_highlight_updated_cb, - view); - - g_object_unref (view->priv->current_buffer); - view->priv->current_buffer = NULL; - } + if (view->priv->current_buffer) { + g_signal_handlers_disconnect_by_func (view->priv->current_buffer, document_read_only_notify_handler, view); + g_signal_handlers_disconnect_by_func (view->priv->current_buffer, search_highlight_updated_cb, view); + g_object_unref (view->priv->current_buffer); + view->priv->current_buffer = NULL; + } } static void -on_notify_buffer_cb (XedView *view, - GParamSpec *arg1, - gpointer userdata) +on_notify_buffer_cb (XedView *view, GParamSpec *arg1, gpointer userdata) { - GtkTextBuffer *buffer; - - current_buffer_removed (view); - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - - if (buffer == NULL || !XED_IS_DOCUMENT (buffer)) - return; + GtkTextBuffer *buffer; - view->priv->current_buffer = g_object_ref (buffer); - g_signal_connect (buffer, - "notify::read-only", - G_CALLBACK (document_read_only_notify_handler), - view); + current_buffer_removed (view); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - gtk_text_view_set_editable (GTK_TEXT_VIEW (view), - !xed_document_get_readonly (XED_DOCUMENT (buffer))); + if (buffer == NULL || !XED_IS_DOCUMENT (buffer)) { + return; + } - g_signal_connect (buffer, - "search_highlight_updated", - G_CALLBACK (search_highlight_updated_cb), - view); + view->priv->current_buffer = g_object_ref (buffer); + g_signal_connect (buffer, "notify::read-only", G_CALLBACK (document_read_only_notify_handler), view); + + gtk_text_view_set_editable (GTK_TEXT_VIEW (view), !xed_document_get_readonly (XED_DOCUMENT (buffer))); + + g_signal_connect (buffer, "search_highlight_updated", G_CALLBACK (search_highlight_updated_cb), view); } -static void +static void xed_view_init (XedView *view) { - GtkTargetList *tl; - - xed_debug (DEBUG_VIEW); - - view->priv = XED_VIEW_GET_PRIVATE (view); + GtkTargetList *tl; - /* - * Set tab, fonts, wrap mode, colors, etc. according - * to preferences - */ - if (!xed_prefs_manager_get_use_default_font ()) - { - gchar *editor_font; + xed_debug (DEBUG_VIEW); - editor_font = xed_prefs_manager_get_editor_font (); + view->priv = XED_VIEW_GET_PRIVATE (view); - xed_view_set_font (view, FALSE, editor_font); + /* + * Set tab, fonts, wrap mode, colors, etc. according + * to preferences + */ + if (!xed_prefs_manager_get_use_default_font ()) { + gchar *editor_font; + editor_font = xed_prefs_manager_get_editor_font (); + xed_view_set_font (view, FALSE, editor_font); + g_free (editor_font); + } + else { + xed_view_set_font (view, TRUE, NULL); + } - g_free (editor_font); - } - else - { - xed_view_set_font (view, TRUE, NULL); - } + g_object_set (G_OBJECT (view), + "wrap_mode", xed_prefs_manager_get_wrap_mode (), + "show_line_numbers", xed_prefs_manager_get_display_line_numbers (), + "auto_indent", xed_prefs_manager_get_auto_indent (), + "tab_width", xed_prefs_manager_get_tabs_size (), + "insert_spaces_instead_of_tabs", xed_prefs_manager_get_insert_spaces (), + "show_right_margin", xed_prefs_manager_get_display_right_margin (), + "right_margin_position", xed_prefs_manager_get_right_margin_position (), + "highlight_current_line", xed_prefs_manager_get_highlight_current_line (), + "smart_home_end", xed_prefs_manager_get_smart_home_end (), + "indent_on_tab", TRUE, + NULL); - g_object_set (G_OBJECT (view), - "wrap_mode", xed_prefs_manager_get_wrap_mode (), - "show_line_numbers", xed_prefs_manager_get_display_line_numbers (), - "auto_indent", xed_prefs_manager_get_auto_indent (), - "tab_width", xed_prefs_manager_get_tabs_size (), - "insert_spaces_instead_of_tabs", xed_prefs_manager_get_insert_spaces (), - "show_right_margin", xed_prefs_manager_get_display_right_margin (), - "right_margin_position", xed_prefs_manager_get_right_margin_position (), - "highlight_current_line", xed_prefs_manager_get_highlight_current_line (), - "smart_home_end", xed_prefs_manager_get_smart_home_end (), - "indent_on_tab", TRUE, - NULL); + view->priv->typeselect_flush_timeout = 0; - view->priv->typeselect_flush_timeout = 0; - view->priv->wrap_around = TRUE; + /* Drag and drop support */ + tl = gtk_drag_dest_get_target_list (GTK_WIDGET (view)); - /* Drag and drop support */ - tl = gtk_drag_dest_get_target_list (GTK_WIDGET (view)); + if (tl != NULL) { + gtk_target_list_add_uri_targets (tl, TARGET_URI_LIST); + } - if (tl != NULL) - gtk_target_list_add_uri_targets (tl, TARGET_URI_LIST); - - /* Act on buffer change */ - g_signal_connect (view, - "notify::buffer", - G_CALLBACK (on_notify_buffer_cb), - NULL); + /* Act on buffer change */ + g_signal_connect (view, "notify::buffer", G_CALLBACK (on_notify_buffer_cb), NULL); } static void xed_view_dispose (GObject *object) { - XedView *view; + XedView *view; - view = XED_VIEW (object); + view = XED_VIEW (object); - if (view->priv->search_window != NULL) - { - gtk_widget_destroy (view->priv->search_window); - view->priv->search_window = NULL; - view->priv->search_entry = NULL; - - if (view->priv->typeselect_flush_timeout != 0) - { - g_source_remove (view->priv->typeselect_flush_timeout); - view->priv->typeselect_flush_timeout = 0; - } - } - - /* Disconnect notify buffer because the destroy of the textview will - set the buffer to NULL, and we call get_buffer in the notify which - would reinstate a GtkTextBuffer which we don't want */ - current_buffer_removed (view); - g_signal_handlers_disconnect_by_func (view, on_notify_buffer_cb, NULL); - - (* G_OBJECT_CLASS (xed_view_parent_class)->dispose) (object); + if (view->priv->search_window != NULL) { + gtk_widget_destroy (view->priv->search_window); + view->priv->search_window = NULL; + view->priv->search_entry = NULL; + if (view->priv->typeselect_flush_timeout != 0) { + g_source_remove (view->priv->typeselect_flush_timeout); + view->priv->typeselect_flush_timeout = 0; + } + } + + /* Disconnect notify buffer because the destroy of the textview will + set the buffer to NULL, and we call get_buffer in the notify which + would reinstate a GtkTextBuffer which we don't want */ + current_buffer_removed (view); + g_signal_handlers_disconnect_by_func (view, on_notify_buffer_cb, NULL); + + (* G_OBJECT_CLASS (xed_view_parent_class)->dispose) (object); } static void xed_view_finalize (GObject *object) { - XedView *view; - - view = XED_VIEW (object); - - current_buffer_removed (view); - - g_free (view->priv->old_search_text); - - (* G_OBJECT_CLASS (xed_view_parent_class)->finalize) (object); + XedView *view; + view = XED_VIEW (object); + current_buffer_removed (view); + (* G_OBJECT_CLASS (xed_view_parent_class)->finalize) (object); } static gint xed_view_focus_out (GtkWidget *widget, GdkEventFocus *event) { - XedView *view = XED_VIEW (widget); - - gtk_widget_queue_draw (widget); - - /* hide interactive search dialog */ - if (view->priv->search_window != NULL) - hide_search_window (view, FALSE); - - (* GTK_WIDGET_CLASS (xed_view_parent_class)->focus_out_event) (widget, event); - - return FALSE; + XedView *view = XED_VIEW (widget); + + gtk_widget_queue_draw (widget); + + /* hide interactive search dialog */ + if (view->priv->search_window != NULL) { + hide_search_window (view, FALSE); + } + + (* GTK_WIDGET_CLASS (xed_view_parent_class)->focus_out_event) (widget, event); + + return FALSE; } /** * xed_view_new: * @doc: a #XedDocument - * - * Creates a new #XedView object displaying the @doc document. + * + * Creates a new #XedView object displaying the @doc document. * @doc cannot be %NULL. * * Return value: a new #XedView @@ -458,183 +284,143 @@ xed_view_focus_out (GtkWidget *widget, GdkEventFocus *event) GtkWidget * xed_view_new (XedDocument *doc) { - GtkWidget *view; + GtkWidget *view; - xed_debug_message (DEBUG_VIEW, "START"); - - g_return_val_if_fail (XED_IS_DOCUMENT (doc), NULL); - - view = GTK_WIDGET (g_object_new (XED_TYPE_VIEW, "buffer", doc, NULL)); - - xed_debug_message (DEBUG_VIEW, "END: %d", G_OBJECT (view)->ref_count); - - gtk_widget_show_all (view); - - return view; + xed_debug_message (DEBUG_VIEW, "START"); + g_return_val_if_fail (XED_IS_DOCUMENT (doc), NULL); + view = GTK_WIDGET (g_object_new (XED_TYPE_VIEW, "buffer", doc, NULL)); + xed_debug_message (DEBUG_VIEW, "END: %d", G_OBJECT (view)->ref_count); + gtk_widget_show_all (view); + return view; } void xed_view_cut_clipboard (XedView *view) { - GtkTextBuffer *buffer; - GtkClipboard *clipboard; + GtkTextBuffer *buffer; + GtkClipboard *clipboard; - xed_debug (DEBUG_VIEW); + xed_debug (DEBUG_VIEW); + g_return_if_fail (XED_IS_VIEW (view)); - g_return_if_fail (XED_IS_VIEW (view)); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + g_return_if_fail (buffer != NULL); - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - g_return_if_fail (buffer != NULL); + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), GDK_SELECTION_CLIPBOARD); - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), - GDK_SELECTION_CLIPBOARD); + /* FIXME: what is default editability of a buffer? */ + gtk_text_buffer_cut_clipboard (buffer, clipboard, !xed_document_get_readonly (XED_DOCUMENT (buffer))); - /* FIXME: what is default editability of a buffer? */ - gtk_text_buffer_cut_clipboard (buffer, - clipboard, - !xed_document_get_readonly ( - XED_DOCUMENT (buffer))); - - gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view), - gtk_text_buffer_get_insert (buffer), - XED_VIEW_SCROLL_MARGIN, - FALSE, - 0.0, - 0.0); + gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view), gtk_text_buffer_get_insert (buffer), XED_VIEW_SCROLL_MARGIN, + FALSE, 0.0, 0.0); } void xed_view_copy_clipboard (XedView *view) { - GtkTextBuffer *buffer; - GtkClipboard *clipboard; + GtkTextBuffer *buffer; + GtkClipboard *clipboard; - xed_debug (DEBUG_VIEW); + xed_debug (DEBUG_VIEW); + g_return_if_fail (XED_IS_VIEW (view)); - g_return_if_fail (XED_IS_VIEW (view)); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + g_return_if_fail (buffer != NULL); - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - g_return_if_fail (buffer != NULL); - - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), - GDK_SELECTION_CLIPBOARD); - - gtk_text_buffer_copy_clipboard (buffer, clipboard); - - /* on copy do not scroll, we are already on screen */ + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), GDK_SELECTION_CLIPBOARD); + gtk_text_buffer_copy_clipboard (buffer, clipboard); } void xed_view_paste_clipboard (XedView *view) { - GtkTextBuffer *buffer; - GtkClipboard *clipboard; + GtkTextBuffer *buffer; + GtkClipboard *clipboard; - xed_debug (DEBUG_VIEW); + xed_debug (DEBUG_VIEW); - g_return_if_fail (XED_IS_VIEW (view)); + g_return_if_fail (XED_IS_VIEW (view)); - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - g_return_if_fail (buffer != NULL); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + g_return_if_fail (buffer != NULL); - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), - GDK_SELECTION_CLIPBOARD); + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (view), GDK_SELECTION_CLIPBOARD); - /* FIXME: what is default editability of a buffer? */ - gtk_text_buffer_paste_clipboard (buffer, - clipboard, - NULL, - !xed_document_get_readonly ( - XED_DOCUMENT (buffer))); + /* FIXME: what is default editability of a buffer? */ + gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, !xed_document_get_readonly (XED_DOCUMENT (buffer))); - gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view), - gtk_text_buffer_get_insert (buffer), - XED_VIEW_SCROLL_MARGIN, - FALSE, - 0.0, - 0.0); + gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view), gtk_text_buffer_get_insert (buffer), XED_VIEW_SCROLL_MARGIN, + FALSE, 0.0, 0.0); } /** * xed_view_delete_selection: * @view: a #XedView - * + * * Deletes the text currently selected in the #GtkTextBuffer associated * to the view and scroll to the cursor position. **/ void xed_view_delete_selection (XedView *view) { - GtkTextBuffer *buffer = NULL; + GtkTextBuffer *buffer = NULL; - xed_debug (DEBUG_VIEW); + xed_debug (DEBUG_VIEW); - g_return_if_fail (XED_IS_VIEW (view)); + g_return_if_fail (XED_IS_VIEW (view)); - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - g_return_if_fail (buffer != NULL); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + g_return_if_fail (buffer != NULL); - /* FIXME: what is default editability of a buffer? */ - gtk_text_buffer_delete_selection (buffer, - TRUE, - !xed_document_get_readonly ( - XED_DOCUMENT (buffer))); - - gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view), - gtk_text_buffer_get_insert (buffer), - XED_VIEW_SCROLL_MARGIN, - FALSE, - 0.0, - 0.0); + /* FIXME: what is default editability of a buffer? */ + gtk_text_buffer_delete_selection (buffer, TRUE, !xed_document_get_readonly (XED_DOCUMENT (buffer))); + + gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view), gtk_text_buffer_get_insert (buffer), XED_VIEW_SCROLL_MARGIN, + FALSE, 0.0, 0.0); } /** * xed_view_select_all: * @view: a #XedView - * + * * Selects all the text displayed in the @view. **/ void xed_view_select_all (XedView *view) { - GtkTextBuffer *buffer = NULL; - GtkTextIter start, end; + GtkTextBuffer *buffer = NULL; + GtkTextIter start, end; - xed_debug (DEBUG_VIEW); + xed_debug (DEBUG_VIEW); - g_return_if_fail (XED_IS_VIEW (view)); + g_return_if_fail (XED_IS_VIEW (view)); - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - g_return_if_fail (buffer != NULL); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + g_return_if_fail (buffer != NULL); - gtk_text_buffer_get_bounds (buffer, &start, &end); - gtk_text_buffer_select_range (buffer, &start, &end); + gtk_text_buffer_get_bounds (buffer, &start, &end); + gtk_text_buffer_select_range (buffer, &start, &end); } /** * xed_view_scroll_to_cursor: * @view: a #XedView - * + * * Scrolls the @view to the cursor position. **/ void xed_view_scroll_to_cursor (XedView *view) { - GtkTextBuffer* buffer = NULL; + GtkTextBuffer* buffer = NULL; - xed_debug (DEBUG_VIEW); + xed_debug (DEBUG_VIEW); - g_return_if_fail (XED_IS_VIEW (view)); - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - g_return_if_fail (buffer != NULL); + g_return_if_fail (XED_IS_VIEW (view)); - gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view), - gtk_text_buffer_get_insert (buffer), - 0.25, - FALSE, - 0.0, - 0.0); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + g_return_if_fail (buffer != NULL); + + gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view), gtk_text_buffer_get_insert (buffer), 0.25, FALSE, 0.0, 0.0); } /* FIXME this is an issue for introspection */ @@ -643,1519 +429,744 @@ xed_view_scroll_to_cursor (XedView *view) * @view: a #XedView * @def: whether to reset the default font * @font_name: the name of the font to use - * + * * If @def is #TRUE, resets the font of the @view to the default font * otherwise sets it to @font_name. **/ void -xed_view_set_font (XedView *view, - gboolean def, - const gchar *font_name) +xed_view_set_font (XedView *view, gboolean def, const gchar *font_name) { - PangoFontDescription *font_desc = NULL; + PangoFontDescription *font_desc = NULL; - xed_debug (DEBUG_VIEW); + xed_debug (DEBUG_VIEW); - g_return_if_fail (XED_IS_VIEW (view)); + g_return_if_fail (XED_IS_VIEW (view)); - if (def) - { - gchar *font; + if (def) { + gchar *font; + font = xed_prefs_manager_get_system_font (); + font_desc = pango_font_description_from_string (font); + g_free (font); + } + else { + g_return_if_fail (font_name != NULL); + font_desc = pango_font_description_from_string (font_name); + } - font = xed_prefs_manager_get_system_font (); - font_desc = pango_font_description_from_string (font); - g_free (font); - } - else - { - g_return_if_fail (font_name != NULL); - - font_desc = pango_font_description_from_string (font_name); - } - - g_return_if_fail (font_desc != NULL); - - gtk_widget_modify_font (GTK_WIDGET (view), font_desc); - - pango_font_description_free (font_desc); + g_return_if_fail (font_desc != NULL); + gtk_widget_modify_font (GTK_WIDGET (view), font_desc); + pango_font_description_free (font_desc); } static void -add_search_completion_entry (const gchar *str) +set_entry_state (GtkWidget *entry, XedSearchEntryState state) { - gchar *text; - gboolean valid; - GtkTreeModel *model; - GtkTreeIter iter; + GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (entry)); - if (str == NULL) - return; - - text = xed_utils_unescape_search_text (str); - - if (g_utf8_strlen (text, -1) < MIN_SEARCH_COMPLETION_KEY_LEN) - { - g_free (text); - return; - } - - g_return_if_fail (GTK_IS_TREE_MODEL (search_completion_model)); - - model = GTK_TREE_MODEL (search_completion_model); - - /* Get the first iter in the list */ - valid = gtk_tree_model_get_iter_first (model, &iter); - - while (valid) - { - /* Walk through the list, reading each row */ - gchar *str_data; - - gtk_tree_model_get (model, - &iter, - 0, - &str_data, - -1); - - if (strcmp (text, str_data) == 0) - { - g_free (text); - g_free (str_data); - gtk_list_store_move_after (GTK_LIST_STORE (model), - &iter, - NULL); - - return; - } - - g_free (str_data); - - valid = gtk_tree_model_iter_next (model, &iter); - } - - gtk_list_store_prepend (GTK_LIST_STORE (model), &iter); - gtk_list_store_set (GTK_LIST_STORE (model), - &iter, - 0, - text, - -1); - - g_free (text); -} - -static void -set_entry_state (GtkWidget *entry, - XedSearchEntryState state) -{ - GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (entry)); - - if (state == XED_SEARCH_ENTRY_NOT_FOUND) - { - gtk_style_context_add_class (context, GTK_STYLE_CLASS_ERROR); - } - else /* reset */ - { - gtk_style_context_remove_class (context, GTK_STYLE_CLASS_ERROR); - } -} - -static gboolean -run_search (XedView *view, - const gchar *entry_text, - gboolean search_backward, - gboolean wrap_around, - gboolean typing) -{ - GtkTextIter start_iter; - GtkTextIter match_start; - GtkTextIter match_end; - gboolean found = FALSE; - XedDocument *doc; - - g_return_val_if_fail (view->priv->search_mode == SEARCH, FALSE); - - doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - - start_iter = view->priv->start_search_iter; - - if (*entry_text != '\0') - { - if (!search_backward) - { - if (!typing) - { - /* forward and _NOT_ typing */ - gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), - &start_iter, - &match_end); - - gtk_text_iter_order (&match_end, &start_iter); - } - - /* run search */ - found = xed_document_search_forward (doc, - &start_iter, - NULL, - &match_start, - &match_end); - } - else if (!typing) - { - /* backward and not typing */ - gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), - &start_iter, - &match_end); - - /* run search */ - found = xed_document_search_backward (doc, - NULL, - &start_iter, - &match_start, - &match_end); - } - else - { - /* backward (while typing) */ - g_return_val_if_reached (FALSE); - - } - - if (!found && wrap_around) - { - if (!search_backward) - found = xed_document_search_forward (doc, - NULL, - NULL, /* FIXME: set the end_inter */ - &match_start, - &match_end); - else - found = xed_document_search_backward (doc, - NULL, /* FIXME: set the start_inter */ - NULL, - &match_start, - &match_end); - } - } - else - { - gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), - &start_iter, - NULL); - } - - if (found) - { - gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), - &match_start); - - gtk_text_buffer_move_mark_by_name (GTK_TEXT_BUFFER (doc), - "selection_bound", &match_end); - } - else - { - if (typing) - { - gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), - &view->priv->start_search_iter); - } - } - - if (found || (*entry_text == '\0')) - { - xed_view_scroll_to_cursor (view); - - set_entry_state (view->priv->search_entry, - XED_SEARCH_ENTRY_NORMAL); - } - else - { - set_entry_state (view->priv->search_entry, - XED_SEARCH_ENTRY_NOT_FOUND); - } - - return found; + if (state == XED_SEARCH_ENTRY_NOT_FOUND) { + gtk_style_context_add_class (context, GTK_STYLE_CLASS_ERROR); + } + else { + gtk_style_context_remove_class (context, GTK_STYLE_CLASS_ERROR); + } } /* Cut and paste from gtkwindow.c */ static void -send_focus_change (GtkWidget *widget, - gboolean in) +send_focus_change (GtkWidget *widget, gboolean in) { - GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE); + GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE); - g_object_ref (widget); + g_object_ref (widget); - fevent->focus_change.type = GDK_FOCUS_CHANGE; - fevent->focus_change.window = g_object_ref (gtk_widget_get_window (widget)); - fevent->focus_change.in = in; - - gtk_widget_event (widget, fevent); - - g_object_notify (G_OBJECT (widget), "has-focus"); + fevent->focus_change.type = GDK_FOCUS_CHANGE; + fevent->focus_change.window = g_object_ref (gtk_widget_get_window (widget)); + fevent->focus_change.in = in; - g_object_unref (widget); - gdk_event_free (fevent); + gtk_widget_event (widget, fevent); + + g_object_notify (G_OBJECT (widget), "has-focus"); + + g_object_unref (widget); + gdk_event_free (fevent); } static void hide_search_window (XedView *view, gboolean cancel) { - if (view->priv->disable_popdown) - return; + if (view->priv->disable_popdown) { + return; + } - if (view->priv->search_entry_changed_id != 0) - { - g_signal_handler_disconnect (view->priv->search_entry, - view->priv->search_entry_changed_id); - view->priv->search_entry_changed_id = 0; - } + if (view->priv->search_entry_changed_id != 0) { + g_signal_handler_disconnect (view->priv->search_entry, view->priv->search_entry_changed_id); + view->priv->search_entry_changed_id = 0; + } - if (view->priv->typeselect_flush_timeout != 0) - { - g_source_remove (view->priv->typeselect_flush_timeout); - view->priv->typeselect_flush_timeout = 0; - } + if (view->priv->typeselect_flush_timeout != 0) { + g_source_remove (view->priv->typeselect_flush_timeout); + view->priv->typeselect_flush_timeout = 0; + } - /* send focus-in event */ - send_focus_change (GTK_WIDGET (view->priv->search_entry), FALSE); - gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), TRUE); - gtk_widget_hide (view->priv->search_window); - - if (cancel) - { - GtkTextBuffer *buffer; - - buffer = GTK_TEXT_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - gtk_text_buffer_place_cursor (buffer, &view->priv->start_search_iter); - - xed_view_scroll_to_cursor (view); - } + /* send focus-in event */ + send_focus_change (GTK_WIDGET (view->priv->search_entry), FALSE); + gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), TRUE); + gtk_widget_hide (view->priv->search_window); - /* make sure a focus event is sent for the edit area */ - send_focus_change (GTK_WIDGET (view), TRUE); + if (cancel) { + GtkTextBuffer *buffer; + buffer = GTK_TEXT_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); + gtk_text_buffer_place_cursor (buffer, &view->priv->start_search_iter); + xed_view_scroll_to_cursor (view); + } + + /* make sure a focus event is sent for the edit area */ + send_focus_change (GTK_WIDGET (view), TRUE); } static gboolean search_entry_flush_timeout (XedView *view) { - view->priv->typeselect_flush_timeout = 0; - hide_search_window (view, FALSE); + view->priv->typeselect_flush_timeout = 0; + hide_search_window (view, FALSE); - return FALSE; + return FALSE; } static void update_search_window_position (XedView *view) { - gint x, y; - gint view_x, view_y; - GdkWindow *view_window = gtk_widget_get_window (GTK_WIDGET (view)); + gint x, y; + gint view_x, view_y; + GdkWindow *view_window = gtk_widget_get_window (GTK_WIDGET (view)); - gtk_widget_realize (view->priv->search_window); + gtk_widget_realize (view->priv->search_window); + gdk_window_get_origin (view_window, &view_x, &view_y); - gdk_window_get_origin (view_window, &view_x, &view_y); - - x = MAX (12, view_x + 12); - y = MAX (12, view_y - 12); - - gtk_window_move (GTK_WINDOW (view->priv->search_window), x, y); + x = MAX (12, view_x + 12); + y = MAX (12, view_y - 12); + + gtk_window_move (GTK_WINDOW (view->priv->search_window), x, y); } static gboolean -search_window_delete_event (GtkWidget *widget, - GdkEventAny *event, - XedView *view) +search_window_deleted (GtkWidget *widget, GdkEventAny *event, XedView *view) { - hide_search_window (view, FALSE); - - return TRUE; + hide_search_window (view, FALSE); + return TRUE; } static gboolean -search_window_button_press_event (GtkWidget *widget, - GdkEventButton *event, - XedView *view) +search_window_button_pressed (GtkWidget *widget, GdkEventButton *event, XedView *view) { - hide_search_window (view, FALSE); - - gtk_propagate_event (GTK_WIDGET (view), (GdkEvent *)event); - - return FALSE; -} - -static void -search_again (XedView *view, - gboolean search_backward) -{ - const gchar *entry_text; - - g_return_if_fail (view->priv->search_mode == SEARCH); - - /* SEARCH mode */ - /* renew the flush timeout */ - if (view->priv->typeselect_flush_timeout != 0) - { - g_source_remove (view->priv->typeselect_flush_timeout); - view->priv->typeselect_flush_timeout = - g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT, - (GSourceFunc)search_entry_flush_timeout, - view); - } - - entry_text = gtk_entry_get_text (GTK_ENTRY (view->priv->search_entry)); - - add_search_completion_entry (entry_text); - - run_search (view, - entry_text, - search_backward, - view->priv->wrap_around, - FALSE); + hide_search_window (view, FALSE); + gtk_propagate_event (GTK_WIDGET (view), (GdkEvent *)event); + return FALSE; } static gboolean -search_window_scroll_event (GtkWidget *widget, - GdkEventScroll *event, - XedView *view) +search_window_key_pressed (GtkWidget *widget, GdkEventKey *event, XedView *view) { - gboolean retval = FALSE; + gboolean retval = FALSE; + guint modifiers; - if (view->priv->search_mode == GOTO_LINE) - return retval; - - /* SEARCH mode */ - if (event->direction == GDK_SCROLL_UP) - { - search_again (view, TRUE); - retval = TRUE; - } - else if (event->direction == GDK_SCROLL_DOWN) - { - search_again (view, FALSE); - retval = TRUE; - } + modifiers = gtk_accelerator_get_default_mod_mask (); - return retval; -} + /* Close window */ + if (event->keyval == GDK_KEY_Tab) { + hide_search_window (view, FALSE); + retval = TRUE; + } -static gboolean -search_window_key_press_event (GtkWidget *widget, - GdkEventKey *event, - XedView *view) -{ - gboolean retval = FALSE; - guint modifiers; + /* Close window and cancel the search */ + if (event->keyval == GDK_KEY_Escape) { + hide_search_window (view, TRUE); + retval = TRUE; + } - modifiers = gtk_accelerator_get_default_mod_mask (); - - /* Close window */ - if (event->keyval == GDK_KEY_Tab) - { - hide_search_window (view, FALSE); - retval = TRUE; - } - - /* Close window and cancel the search */ - if (event->keyval == GDK_KEY_Escape) - { - if (view->priv->search_mode == SEARCH) - { - XedDocument *doc; - - /* restore document search so that Find Next does the right thing */ - doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - xed_document_set_search_text (doc, - view->priv->old_search_text, - view->priv->old_search_flags); - - } - - hide_search_window (view, TRUE); - retval = TRUE; - } - - if (view->priv->search_mode == GOTO_LINE) - return retval; - - /* SEARCH mode */ - - /* select previous matching iter */ - if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_KP_Up) - { - search_again (view, TRUE); - retval = TRUE; - } - - if (((event->state & modifiers) == (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) && - (event->keyval == GDK_KEY_g || event->keyval == GDK_KEY_G)) - { - search_again (view, TRUE); - retval = TRUE; - } - - /* select next matching iter */ - if (event->keyval == GDK_KEY_Down || event->keyval == GDK_KEY_KP_Down) - { - search_again (view, FALSE); - retval = TRUE; - } - - if (((event->state & modifiers) == GDK_CONTROL_MASK) && - (event->keyval == GDK_KEY_g || event->keyval == GDK_KEY_G)) - { - search_again (view, FALSE); - retval = TRUE; - } - - return retval; + return retval; } static void -search_entry_activate (GtkEntry *entry, - XedView *view) +search_entry_activate (GtkEntry *entry, XedView *view) { - hide_search_window (view, FALSE); -} - -static void -wrap_around_menu_item_toggled (GtkCheckMenuItem *checkmenuitem, - XedView *view) -{ - view->priv->wrap_around = gtk_check_menu_item_get_active (checkmenuitem); -} - -static void -match_entire_word_menu_item_toggled (GtkCheckMenuItem *checkmenuitem, - XedView *view) -{ - XED_SEARCH_SET_ENTIRE_WORD (view->priv->search_flags, - gtk_check_menu_item_get_active (checkmenuitem)); -} - -static void -match_case_menu_item_toggled (GtkCheckMenuItem *checkmenuitem, - XedView *view) -{ - XED_SEARCH_SET_CASE_SENSITIVE (view->priv->search_flags, - gtk_check_menu_item_get_active (checkmenuitem)); -} - -static void -parse_escapes_menu_item_toggled (GtkCheckMenuItem *checkmenuitem, - XedView *view) -{ - XED_SEARCH_SET_PARSE_ESCAPES (view->priv->search_flags, - gtk_check_menu_item_get_active (checkmenuitem)); + hide_search_window (view, FALSE); } static gboolean real_search_enable_popdown (gpointer data) { - XedView *view = (XedView *)data; - - view->priv->disable_popdown = FALSE; - - return FALSE; + XedView *view = (XedView *)data; + view->priv->disable_popdown = FALSE; + return FALSE; } static void -search_enable_popdown (GtkWidget *widget, - XedView *view) +search_enable_popdown (GtkWidget *widget, XedView *view) { - g_timeout_add (200, real_search_enable_popdown, view); - - /* renew the flush timeout */ - if (view->priv->typeselect_flush_timeout != 0) - g_source_remove (view->priv->typeselect_flush_timeout); + g_timeout_add (200, real_search_enable_popdown, view); - view->priv->typeselect_flush_timeout = - g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT, - (GSourceFunc)search_entry_flush_timeout, - view); + /* renew the flush timeout */ + if (view->priv->typeselect_flush_timeout != 0) { + g_source_remove (view->priv->typeselect_flush_timeout); + } + + view->priv->typeselect_flush_timeout = + g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT, (GSourceFunc)search_entry_flush_timeout, view); } static void -search_entry_populate_popup (GtkEntry *entry, - GtkMenu *menu, - XedView *view) +search_entry_populate_popup (GtkEntry *entry, GtkMenu *menu, XedView *view) { - GtkWidget *menu_item; - - view->priv->disable_popdown = TRUE; - g_signal_connect (menu, "hide", - G_CALLBACK (search_enable_popdown), view); - - if (view->priv->search_mode == GOTO_LINE) - return; - - /* separator */ - menu_item = gtk_menu_item_new (); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); - gtk_widget_show (menu_item); - - /* create "Wrap Around" menu item. */ - menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Wrap Around")); - g_signal_connect (G_OBJECT (menu_item), "toggled", - G_CALLBACK (wrap_around_menu_item_toggled), - view); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - view->priv->wrap_around); - gtk_widget_show (menu_item); - - /* create "Match Entire Word Only" menu item. */ - menu_item = gtk_check_menu_item_new_with_mnemonic (_("Match _Entire Word Only")); - g_signal_connect (G_OBJECT (menu_item), "toggled", - G_CALLBACK (match_entire_word_menu_item_toggled), - view); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - XED_SEARCH_IS_ENTIRE_WORD (view->priv->search_flags)); - gtk_widget_show (menu_item); - - /* create "Match Case" menu item. */ - menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Match Case")); - g_signal_connect (G_OBJECT (menu_item), "toggled", - G_CALLBACK (match_case_menu_item_toggled), - view); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - XED_SEARCH_IS_CASE_SENSITIVE (view->priv->search_flags)); - gtk_widget_show (menu_item); - - /* create "Parse escapes" menu item. */ - menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Parse escape sequences (e.g. \n)")); - g_signal_connect (G_OBJECT (menu_item), "toggled", - G_CALLBACK (parse_escapes_menu_item_toggled), - view); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), - XED_SEARCH_IS_PARSE_ESCAPES (view->priv->search_flags)); - gtk_widget_show (menu_item); + GtkWidget *menu_item; + view->priv->disable_popdown = TRUE; + g_signal_connect (menu, "hide", G_CALLBACK (search_enable_popdown), view); } static void -search_entry_insert_text (GtkEditable *editable, - const gchar *text, - gint length, - gint *position, - XedView *view) +search_entry_insert_text (GtkEditable *editable, const gchar *text, gint length, gint *position, XedView *view) { - if (view->priv->search_mode == GOTO_LINE) - { - gunichar c; - const gchar *p; - const gchar *end; - const gchar *next; + gunichar c; + const gchar *p; + const gchar *end; + const gchar *next; - p = text; - end = text + length; + p = text; + end = text + length; - if (p == end) - return; + if (p == end) { + return; + } - c = g_utf8_get_char (p); - - if (((c == '-' || c == '+') && *position == 0) || - (c == ':' && *position != 0)) - { - gchar *s = NULL; - - if (c == ':') - { - s = gtk_editable_get_chars (editable, 0, -1); - s = g_utf8_strchr (s, -1, ':'); - } - - if (s == NULL || s == p) - { - next = g_utf8_next_char (p); - p = next; - } - - g_free (s); - } + c = g_utf8_get_char (p); - while (p != end) - { - next = g_utf8_next_char (p); + if (((c == '-' || c == '+') && *position == 0) || (c == ':' && *position != 0)) { + gchar *s = NULL; + if (c == ':') { + s = gtk_editable_get_chars (editable, 0, -1); + s = g_utf8_strchr (s, -1, ':'); + } + if (s == NULL || s == p) { + next = g_utf8_next_char (p); + p = next; + } + g_free (s); + } - c = g_utf8_get_char (p); - - if (!g_unichar_isdigit (c)) { - g_signal_stop_emission_by_name (editable, "insert_text"); - gtk_widget_error_bell (view->priv->search_entry); - break; - } - - p = next; - } - } - else - { - /* SEARCH mode */ - static gboolean insert_text = FALSE; - gchar *escaped_text; - gint new_len; - - xed_debug_message (DEBUG_SEARCH, "Text: %s", text); - - /* To avoid recursive behavior */ - if (insert_text) - return; - - escaped_text = xed_utils_escape_search_text (text); - - xed_debug_message (DEBUG_SEARCH, "Escaped Text: %s", escaped_text); - - new_len = strlen (escaped_text); - - if (new_len == length) - { - g_free (escaped_text); - return; - } - - insert_text = TRUE; - - g_signal_stop_emission_by_name (editable, "insert_text"); - - gtk_editable_insert_text (editable, escaped_text, new_len, position); - - insert_text = FALSE; - - g_free (escaped_text); - } + while (p != end) { + next = g_utf8_next_char (p); + c = g_utf8_get_char (p); + if (!g_unichar_isdigit (c)) { + g_signal_stop_emission_by_name (editable, "insert_text"); + gtk_widget_error_bell (view->priv->search_entry); + break; + } + p = next; + } } static void customize_for_search_mode (XedView *view) { - if (view->priv->search_mode == SEARCH) - { - gtk_entry_set_icon_from_stock (GTK_ENTRY (view->priv->search_entry), - GTK_ENTRY_ICON_PRIMARY, - GTK_STOCK_FIND); - - gtk_widget_set_tooltip_text (view->priv->search_entry, - _("String you want to search for")); - } - else - { - gtk_entry_set_icon_from_stock (GTK_ENTRY (view->priv->search_entry), - GTK_ENTRY_ICON_PRIMARY, - GTK_STOCK_JUMP_TO); - - gtk_widget_set_tooltip_text (view->priv->search_entry, - _("Line you want to move the cursor to")); - } -} - -static gboolean -completion_func (GtkEntryCompletion *completion, - const char *key, - GtkTreeIter *iter, - gpointer data) -{ - gchar *item = NULL; - gboolean ret = FALSE; - GtkTreeModel *model; - XedViewPrivate *priv = (XedViewPrivate *)data; - const gchar *real_key; - - if (priv->search_mode == GOTO_LINE) - return FALSE; - - real_key = gtk_entry_get_text (GTK_ENTRY (gtk_entry_completion_get_entry (completion))); - - if (g_utf8_strlen (real_key, -1) <= MIN_SEARCH_COMPLETION_KEY_LEN) - return FALSE; - - model = gtk_entry_completion_get_model (completion); - g_return_val_if_fail (gtk_tree_model_get_column_type (model, 0) == G_TYPE_STRING, - FALSE); - - gtk_tree_model_get (model, - iter, - 0, - &item, - -1); - - if (item == NULL) - return FALSE; - - if (XED_SEARCH_IS_CASE_SENSITIVE (priv->search_flags)) - { - if (!strncmp (real_key, item, strlen (real_key))) - ret = TRUE; - } - else - { - gchar *normalized_string; - gchar *case_normalized_string; - - normalized_string = g_utf8_normalize (item, -1, G_NORMALIZE_ALL); - case_normalized_string = g_utf8_casefold (normalized_string, -1); - - if (!strncmp (key, case_normalized_string, strlen (key))) - ret = TRUE; - - g_free (normalized_string); - g_free (case_normalized_string); - - } - - g_free (item); - - return ret; + gtk_entry_set_icon_from_stock (GTK_ENTRY (view->priv->search_entry), GTK_ENTRY_ICON_PRIMARY, GTK_STOCK_JUMP_TO); + gtk_widget_set_tooltip_text (view->priv->search_entry, _("Line you want to move the cursor to")); } static void ensure_search_window (XedView *view) -{ - GtkWidget *frame; - GtkWidget *vbox; - GtkWidget *toplevel; - GtkEntryCompletion *completion; - GtkWindowGroup *group; - GtkWindowGroup *search_group; - - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view)); - group = gtk_window_get_group (GTK_WINDOW (toplevel)); - if (view->priv->search_window != NULL) - search_group = gtk_window_get_group (GTK_WINDOW (view->priv->search_window)); +{ + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *toplevel; + GtkWindowGroup *group; + GtkWindowGroup *search_group; - if (view->priv->search_window != NULL) - { - if (group) - gtk_window_group_add_window (group, - GTK_WINDOW (view->priv->search_window)); - else if (search_group) - gtk_window_group_remove_window (search_group, - GTK_WINDOW (view->priv->search_window)); - - customize_for_search_mode (view); - - return; - } - - view->priv->search_window = gtk_window_new (GTK_WINDOW_POPUP); + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view)); + group = gtk_window_get_group (GTK_WINDOW (toplevel)); + if (view->priv->search_window != NULL) { + search_group = gtk_window_get_group (GTK_WINDOW (view->priv->search_window)); + } - if (group) - gtk_window_group_add_window (group, - GTK_WINDOW (view->priv->search_window)); - - gtk_window_set_modal (GTK_WINDOW (view->priv->search_window), TRUE); - - g_signal_connect (view->priv->search_window, "delete_event", - G_CALLBACK (search_window_delete_event), - view); - g_signal_connect (view->priv->search_window, "key_press_event", - G_CALLBACK (search_window_key_press_event), - view); - g_signal_connect (view->priv->search_window, "button_press_event", - G_CALLBACK (search_window_button_press_event), - view); - g_signal_connect (view->priv->search_window, "scroll_event", - G_CALLBACK (search_window_scroll_event), - view); + if (view->priv->search_window != NULL) { + if (group) { + gtk_window_group_add_window (group, GTK_WINDOW (view->priv->search_window)); + } + else if (search_group) { + gtk_window_group_remove_window (search_group, GTK_WINDOW (view->priv->search_window)); + } + customize_for_search_mode (view); + return; + } - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); - gtk_widget_show (frame); - gtk_container_add (GTK_CONTAINER (view->priv->search_window), frame); + view->priv->search_window = gtk_window_new (GTK_WINDOW_POPUP); - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_show (vbox); - gtk_container_add (GTK_CONTAINER (frame), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); + if (group) { + gtk_window_group_add_window (group, GTK_WINDOW (view->priv->search_window)); + } - /* add entry */ - view->priv->search_entry = gtk_entry_new (); - gtk_widget_show (view->priv->search_entry); - - g_signal_connect (view->priv->search_entry, "populate_popup", - G_CALLBACK (search_entry_populate_popup), - view); - g_signal_connect (view->priv->search_entry, "activate", - G_CALLBACK (search_entry_activate), - view); - g_signal_connect (view->priv->search_entry, - "insert_text", - G_CALLBACK (search_entry_insert_text), - view); - - gtk_container_add (GTK_CONTAINER (vbox), - view->priv->search_entry); + gtk_window_set_modal (GTK_WINDOW (view->priv->search_window), TRUE); - if (search_completion_model == NULL) - { - /* Create a tree model and use it as the completion model */ - search_completion_model = gtk_list_store_new (1, G_TYPE_STRING); - } - - /* Create the completion object for the search entry */ - completion = gtk_entry_completion_new (); - gtk_entry_completion_set_model (completion, - GTK_TREE_MODEL (search_completion_model)); - - /* Use model column 0 as the text column */ - gtk_entry_completion_set_text_column (completion, 0); + g_signal_connect (view->priv->search_window, "delete_event", G_CALLBACK (search_window_deleted), view); + g_signal_connect (view->priv->search_window, "key_press_event", G_CALLBACK (search_window_key_pressed), view); + g_signal_connect (view->priv->search_window, "button_press_event", G_CALLBACK (search_window_button_pressed), view); - gtk_entry_completion_set_minimum_key_length (completion, - MIN_SEARCH_COMPLETION_KEY_LEN); + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); + gtk_widget_show (frame); + gtk_container_add (GTK_CONTAINER (view->priv->search_window), frame); - gtk_entry_completion_set_popup_completion (completion, FALSE); - gtk_entry_completion_set_inline_completion (completion, TRUE); - - gtk_entry_completion_set_match_func (completion, - completion_func, - view->priv, - NULL); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_show (vbox); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); - /* Assign the completion to the entry */ - gtk_entry_set_completion (GTK_ENTRY (view->priv->search_entry), - completion); - g_object_unref (completion); + /* add entry */ + view->priv->search_entry = gtk_entry_new (); + gtk_widget_show (view->priv->search_entry); - gtk_widget_realize (view->priv->search_entry); + g_signal_connect (view->priv->search_entry, "populate_popup", G_CALLBACK (search_entry_populate_popup), view); + g_signal_connect (view->priv->search_entry, "activate", G_CALLBACK (search_entry_activate), view); + g_signal_connect (view->priv->search_entry, "insert_text", G_CALLBACK (search_entry_insert_text), view); - customize_for_search_mode (view); + gtk_container_add (GTK_CONTAINER (vbox), view->priv->search_entry); + gtk_widget_realize (view->priv->search_entry); + + customize_for_search_mode (view); } static gboolean get_selected_text (GtkTextBuffer *doc, gchar **selected_text, gint *len) { - GtkTextIter start, end; + GtkTextIter start, end; - g_return_val_if_fail (selected_text != NULL, FALSE); - g_return_val_if_fail (*selected_text == NULL, FALSE); + g_return_val_if_fail (selected_text != NULL, FALSE); + g_return_val_if_fail (*selected_text == NULL, FALSE); - if (!gtk_text_buffer_get_selection_bounds (doc, &start, &end)) - { - if (len != NULL) - len = 0; + if (!gtk_text_buffer_get_selection_bounds (doc, &start, &end)) { + if (len != NULL) { + len = 0; + } + return FALSE; + } - return FALSE; - } + *selected_text = gtk_text_buffer_get_slice (doc, &start, &end, TRUE); - *selected_text = gtk_text_buffer_get_slice (doc, &start, &end, TRUE); + if (len != NULL) { + *len = g_utf8_strlen (*selected_text, -1); + } - if (len != NULL) - *len = g_utf8_strlen (*selected_text, -1); - - return TRUE; + return TRUE; } static void init_search_entry (XedView *view) { - GtkTextBuffer *buffer; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - - if (view->priv->search_mode == GOTO_LINE) - { - gint line; - gchar *line_str; - - line = gtk_text_iter_get_line (&view->priv->start_search_iter); - - line_str = g_strdup_printf ("%d", line + 1); - - gtk_entry_set_text (GTK_ENTRY (view->priv->search_entry), - line_str); - - g_free (line_str); - - return; - } - else - { - /* SEARCH mode */ - gboolean selection_exists; - gchar *find_text = NULL; - gchar *old_find_text; - guint old_find_flags = 0; - gint sel_len = 0; + gint line; + gchar *line_str; - old_find_text = xed_document_get_search_text (XED_DOCUMENT (buffer), - &old_find_flags); - if (old_find_text != NULL) - { - g_free (view->priv->old_search_text); - view->priv->old_search_text = old_find_text; - add_search_completion_entry (old_find_text); - } + line = gtk_text_iter_get_line (&view->priv->start_search_iter); + line_str = g_strdup_printf ("%d", line + 1); + gtk_entry_set_text (GTK_ENTRY (view->priv->search_entry), line_str); - if (old_find_flags != 0) - { - view->priv->old_search_flags = old_find_flags; - } - - selection_exists = get_selected_text (buffer, - &find_text, - &sel_len); - - if (selection_exists && (find_text != NULL) && (sel_len <= 160)) - { - gtk_entry_set_text (GTK_ENTRY (view->priv->search_entry), - find_text); - } - else - { - gtk_entry_set_text (GTK_ENTRY (view->priv->search_entry), - ""); - } - - g_free (find_text); - } + g_free (line_str); + return; } static void -search_init (GtkWidget *entry, - XedView *view) +search_init (GtkWidget *entry, XedView *view) { - XedDocument *doc; - const gchar *entry_text; + XedDocument *doc; + const gchar *entry_text; - /* renew the flush timeout */ - if (view->priv->typeselect_flush_timeout != 0) - { - g_source_remove (view->priv->typeselect_flush_timeout); - view->priv->typeselect_flush_timeout = - g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT, - (GSourceFunc)search_entry_flush_timeout, - view); - } - - doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - - entry_text = gtk_entry_get_text (GTK_ENTRY (entry)); - - if (view->priv->search_mode == SEARCH) - { - gchar *search_text; - guint search_flags; + /* renew the flush timeout */ + if (view->priv->typeselect_flush_timeout != 0) { + g_source_remove (view->priv->typeselect_flush_timeout); + view->priv->typeselect_flush_timeout = + g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT, (GSourceFunc)search_entry_flush_timeout, view); + } + doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - search_text = xed_document_get_search_text (doc, &search_flags); + entry_text = gtk_entry_get_text (GTK_ENTRY (entry)); - if ((search_text == NULL) || - (strcmp (search_text, entry_text) != 0) || - search_flags != view->priv->search_flags) - { - xed_document_set_search_text (doc, - entry_text, - view->priv->search_flags); - } + if (*entry_text != '\0') { + gboolean moved, moved_offset; + gint line; + gint offset_line = 0; + gint line_offset = 0; + gchar **split_text = NULL; + const gchar *text; - g_free (search_text); + split_text = g_strsplit (entry_text, ":", -1); - run_search (view, - entry_text, - FALSE, - view->priv->wrap_around, - TRUE); - } - else - { - if (*entry_text != '\0') - { - gboolean moved, moved_offset; - gint line; - gint offset_line = 0; - gint line_offset = 0; - gchar **split_text = NULL; - const gchar *text; - - split_text = g_strsplit (entry_text, ":", -1); - - if (g_strv_length (split_text) > 1) - { - text = split_text[0]; - } - else - { - text = entry_text; - } - - if (*text == '-') - { - gint cur_line = gtk_text_iter_get_line (&view->priv->start_search_iter); - - if (*(text + 1) != '\0') - offset_line = MAX (atoi (text + 1), 0); - - line = MAX (cur_line - offset_line, 0); - } - else if (*entry_text == '+') - { - gint cur_line = gtk_text_iter_get_line (&view->priv->start_search_iter); - - if (*(text + 1) != '\0') - offset_line = MAX (atoi (text + 1), 0); - - line = cur_line + offset_line; - } - else - { - line = MAX (atoi (text) - 1, 0); - } - - if (split_text[1] != NULL) - { - line_offset = atoi (split_text[1]); - } - - g_strfreev (split_text); - - moved = xed_document_goto_line (doc, line); - moved_offset = xed_document_goto_line_offset (doc, line, - line_offset); - - xed_view_scroll_to_cursor (view); + if (g_strv_length (split_text) > 1) { + text = split_text[0]; + } + else { + text = entry_text; + } - if (!moved || !moved_offset) - set_entry_state (view->priv->search_entry, - XED_SEARCH_ENTRY_NOT_FOUND); - else - set_entry_state (view->priv->search_entry, - XED_SEARCH_ENTRY_NORMAL); - } - } + if (*text == '-') { + gint cur_line = gtk_text_iter_get_line (&view->priv->start_search_iter); + + if (*(text + 1) != '\0') { + offset_line = MAX (atoi (text + 1), 0); + } + + line = MAX (cur_line - offset_line, 0); + } + else if (*entry_text == '+') { + gint cur_line = gtk_text_iter_get_line (&view->priv->start_search_iter); + + if (*(text + 1) != '\0') { + offset_line = MAX (atoi (text + 1), 0); + } + + line = cur_line + offset_line; + } + else { + line = MAX (atoi (text) - 1, 0); + } + + if (split_text[1] != NULL) + { + line_offset = atoi (split_text[1]); + } + + g_strfreev (split_text); + + moved = xed_document_goto_line (doc, line); + moved_offset = xed_document_goto_line_offset (doc, line, line_offset); + + xed_view_scroll_to_cursor (view); + + if (!moved || !moved_offset) { + set_entry_state (view->priv->search_entry, XED_SEARCH_ENTRY_NOT_FOUND); + } + else { + set_entry_state (view->priv->search_entry, XED_SEARCH_ENTRY_NORMAL); + } + } } static gboolean -start_interactive_search_real (XedView *view) -{ - GtkTextBuffer *buffer; - - if ((view->priv->search_window != NULL) && - gtk_widget_get_visible (view->priv->search_window)) - return TRUE; - - if (!gtk_widget_has_focus (GTK_WIDGET (view))) - return FALSE; - - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - - if (view->priv->search_mode == SEARCH) - gtk_text_buffer_get_selection_bounds (buffer, &view->priv->start_search_iter, NULL); - else - gtk_text_buffer_get_iter_at_mark (buffer, - &view->priv->start_search_iter, - gtk_text_buffer_get_insert (buffer)); - - ensure_search_window (view); - - /* done, show it */ - update_search_window_position (view); - gtk_widget_show (view->priv->search_window); - - if (view->priv->search_entry_changed_id == 0) - { - view->priv->search_entry_changed_id = - g_signal_connect (view->priv->search_entry, - "changed", - G_CALLBACK (search_init), - view); - } - - init_search_entry (view); - - view->priv->typeselect_flush_timeout = - g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT, - (GSourceFunc) search_entry_flush_timeout, - view); - - gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE); - gtk_widget_grab_focus (view->priv->search_entry); - - send_focus_change (view->priv->search_entry, TRUE); - - return TRUE; -} - -static gboolean -reset_searched_text (XedView *view) -{ - XedDocument *doc; - - doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - - xed_document_set_search_text (doc, "", XED_SEARCH_DONT_SET_FLAGS); - - return TRUE; -} - -static gboolean -start_interactive_search (XedView *view) -{ - view->priv->search_mode = SEARCH; - - return start_interactive_search_real (view); -} - -static gboolean start_interactive_goto_line (XedView *view) { - view->priv->search_mode = GOTO_LINE; - - return start_interactive_search_real (view); + GtkTextBuffer *buffer; + + if ((view->priv->search_window != NULL) && gtk_widget_get_visible (view->priv->search_window)) { + return TRUE; + } + + if (!gtk_widget_has_focus (GTK_WIDGET (view))) { + return FALSE; + } + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + + gtk_text_buffer_get_iter_at_mark (buffer, &view->priv->start_search_iter, gtk_text_buffer_get_insert (buffer)); + + ensure_search_window (view); + + /* done, show it */ + update_search_window_position (view); + gtk_widget_show (view->priv->search_window); + + if (view->priv->search_entry_changed_id == 0) { + view->priv->search_entry_changed_id = + g_signal_connect (view->priv->search_entry, "changed", G_CALLBACK (search_init), view); + } + + init_search_entry (view); + + view->priv->typeselect_flush_timeout = + g_timeout_add (XED_VIEW_SEARCH_DIALOG_TIMEOUT, (GSourceFunc) search_entry_flush_timeout, view); + + gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE); + gtk_widget_grab_focus (view->priv->search_entry); + + send_focus_change (view->priv->search_entry, TRUE); + + return TRUE; } static gboolean -xed_view_draw (GtkWidget *widget, - cairo_t *cr) +xed_view_draw (GtkWidget *widget, cairo_t *cr) { - GtkTextView *text_view; - XedDocument *doc; - GdkWindow *window; - - text_view = GTK_TEXT_VIEW (widget); - - doc = XED_DOCUMENT (gtk_text_view_get_buffer (text_view)); - window = gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT); - if (gtk_cairo_should_draw_window (cr, window) && - xed_document_get_enable_search_highlighting (doc)) - { - GdkRectangle visible_rect; - GtkTextIter iter1, iter2; - - gtk_text_view_get_visible_rect (text_view, &visible_rect); - gtk_text_view_get_line_at_y (text_view, &iter1, - visible_rect.y, NULL); - gtk_text_view_get_line_at_y (text_view, &iter2, - visible_rect.y - + visible_rect.height, NULL); - gtk_text_iter_forward_line (&iter2); - - _xed_document_search_region (doc, - &iter1, - &iter2); - } + GtkTextView *text_view; + XedDocument *doc; + GdkWindow *window; - return GTK_WIDGET_CLASS (xed_view_parent_class)->draw (widget, cr); + text_view = GTK_TEXT_VIEW (widget); + + doc = XED_DOCUMENT (gtk_text_view_get_buffer (text_view)); + window = gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT); + if (gtk_cairo_should_draw_window (cr, window) && xed_document_get_enable_search_highlighting (doc)) { + GdkRectangle visible_rect; + GtkTextIter iter1, iter2; + + gtk_text_view_get_visible_rect (text_view, &visible_rect); + gtk_text_view_get_line_at_y (text_view, &iter1, visible_rect.y, NULL); + gtk_text_view_get_line_at_y (text_view, &iter2, visible_rect.y + visible_rect.height, NULL); + gtk_text_iter_forward_line (&iter2); + + _xed_document_search_region (doc, &iter1, &iter2); + } + + return GTK_WIDGET_CLASS (xed_view_parent_class)->draw (widget, cr); } static GdkAtom -drag_get_uri_target (GtkWidget *widget, - GdkDragContext *context) +drag_get_uri_target (GtkWidget *widget, GdkDragContext *context) { - GdkAtom target; - GtkTargetList *tl; - - tl = gtk_target_list_new (NULL, 0); - gtk_target_list_add_uri_targets (tl, 0); - - target = gtk_drag_dest_find_target (widget, context, tl); - gtk_target_list_unref (tl); - - return target; + GdkAtom target; + GtkTargetList *tl; + + tl = gtk_target_list_new (NULL, 0); + gtk_target_list_add_uri_targets (tl, 0); + target = gtk_drag_dest_find_target (widget, context, tl); + gtk_target_list_unref (tl); + + return target; } static gboolean -xed_view_drag_motion (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint timestamp) +xed_view_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint timestamp) { - gboolean result; + gboolean result; - /* Chain up to allow textview to scroll and position dnd mark, note - * that this needs to be checked if gtksourceview or gtktextview - * changes drag_motion behaviour */ - result = GTK_WIDGET_CLASS (xed_view_parent_class)->drag_motion (widget, context, x, y, timestamp); + /* Chain up to allow textview to scroll and position dnd mark, note + * that this needs to be checked if gtksourceview or gtktextview + * changes drag_motion behaviour */ + result = GTK_WIDGET_CLASS (xed_view_parent_class)->drag_motion (widget, context, x, y, timestamp); - /* If this is a URL, deal with it here */ - if (drag_get_uri_target (widget, context) != GDK_NONE) - { - gdk_drag_status (context, - gdk_drag_context_get_suggested_action (context), - timestamp); - result = TRUE; - } + /* If this is a URL, deal with it here */ + if (drag_get_uri_target (widget, context) != GDK_NONE) { + gdk_drag_status (context, gdk_drag_context_get_suggested_action (context), timestamp); + result = TRUE; + } - return result; + return result; } static void -xed_view_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint timestamp) +xed_view_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, + GtkSelectionData *selection_data, guint info, guint timestamp) { - gchar **uri_list; - - /* If this is an URL emit DROP_URIS, otherwise chain up the signal */ - if (info == TARGET_URI_LIST) - { - uri_list = xed_utils_drop_get_uris (selection_data); - - if (uri_list != NULL) - { - g_signal_emit (widget, view_signals[DROP_URIS], 0, uri_list); - g_strfreev (uri_list); - - gtk_drag_finish (context, TRUE, FALSE, timestamp); - } - } - else - { - GTK_WIDGET_CLASS (xed_view_parent_class)->drag_data_received (widget, context, x, y, selection_data, info, timestamp); - } + gchar **uri_list; + + /* If this is an URL emit DROP_URIS, otherwise chain up the signal */ + if (info == TARGET_URI_LIST) { + uri_list = xed_utils_drop_get_uris (selection_data); + + if (uri_list != NULL) { + g_signal_emit (widget, view_signals[DROP_URIS], 0, uri_list); + g_strfreev (uri_list); + gtk_drag_finish (context, TRUE, FALSE, timestamp); + } + } + else { + GTK_WIDGET_CLASS (xed_view_parent_class)->drag_data_received (widget, context, x, y, selection_data, info, + timestamp); + } } static gboolean -xed_view_drag_drop (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint timestamp) +xed_view_drag_drop (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint timestamp) { - gboolean result; - GdkAtom target; + gboolean result; + GdkAtom target; - /* If this is a URL, just get the drag data */ - target = drag_get_uri_target (widget, context); + /* If this is a URL, just get the drag data */ + target = drag_get_uri_target (widget, context); - if (target != GDK_NONE) - { - gtk_drag_get_data (widget, context, target, timestamp); - result = TRUE; - } - else - { - /* Chain up */ - result = GTK_WIDGET_CLASS (xed_view_parent_class)->drag_drop (widget, context, x, y, timestamp); - } + if (target != GDK_NONE) { + gtk_drag_get_data (widget, context, target, timestamp); + result = TRUE; + } + else { + /* Chain up */ + result = GTK_WIDGET_CLASS (xed_view_parent_class)->drag_drop (widget, context, x, y, timestamp); + } - return result; + return result; } static void -show_line_numbers_toggled (GtkMenu *menu, - XedView *view) +show_line_numbers_toggled (GtkMenu *menu, XedView *view) { - gboolean show; + gboolean show; - show = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menu)); - - xed_prefs_manager_set_display_line_numbers (show); + show = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menu)); + xed_prefs_manager_set_display_line_numbers (show); } static GtkWidget * create_line_numbers_menu (GtkWidget *view) { - GtkWidget *menu; - GtkWidget *item; + GtkWidget *menu; + GtkWidget *item; - menu = gtk_menu_new (); + menu = gtk_menu_new (); - item = gtk_check_menu_item_new_with_mnemonic (_("_Display line numbers")); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), - gtk_source_view_get_show_line_numbers (GTK_SOURCE_VIEW (view))); - g_signal_connect (item, "toggled", - G_CALLBACK (show_line_numbers_toggled), view); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - gtk_widget_show_all (menu); - - return menu; + item = gtk_check_menu_item_new_with_mnemonic (_("_Display line numbers")); + gtk_check_menu_item_set_active ( + GTK_CHECK_MENU_ITEM (item), gtk_source_view_get_show_line_numbers (GTK_SOURCE_VIEW (view))); + g_signal_connect (item, "toggled", G_CALLBACK (show_line_numbers_toggled), view); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + gtk_widget_show_all (menu); + + return menu; } static void -show_line_numbers_menu (GtkWidget *view, - GdkEventButton *event) +show_line_numbers_menu (GtkWidget *view, GdkEventButton *event) { - GtkWidget *menu; + GtkWidget *menu; - menu = create_line_numbers_menu (view); - - gtk_menu_popup (GTK_MENU (menu), - NULL, - NULL, - NULL, - NULL, - event->button, - event->time); + menu = create_line_numbers_menu (view); + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button, event->time); } static gboolean xed_view_button_press_event (GtkWidget *widget, GdkEventButton *event) { - if ((event->type == GDK_BUTTON_PRESS) && - (event->button == 3) && - (event->window == gtk_text_view_get_window (GTK_TEXT_VIEW (widget), - GTK_TEXT_WINDOW_LEFT))) - { - show_line_numbers_menu (widget, event); + if ((event->type == GDK_BUTTON_PRESS) && (event->button == 3) && + (event->window == gtk_text_view_get_window (GTK_TEXT_VIEW (widget), GTK_TEXT_WINDOW_LEFT))) { - return TRUE; - } + show_line_numbers_menu (widget, event); - return GTK_WIDGET_CLASS (xed_view_parent_class)->button_press_event (widget, event); + return TRUE; + } + + return GTK_WIDGET_CLASS (xed_view_parent_class)->button_press_event (widget, event); } -static void -search_highlight_updated_cb (XedDocument *doc, - GtkTextIter *start, - GtkTextIter *end, - XedView *view) +static void +search_highlight_updated_cb (XedDocument *doc, GtkTextIter *start, GtkTextIter *end, XedView *view) { - GdkRectangle visible_rect; - GdkRectangle updated_rect; - GdkRectangle redraw_rect; - gint y; - gint height; - GtkTextView *text_view; - - text_view = GTK_TEXT_VIEW (view); + GdkRectangle visible_rect; + GdkRectangle updated_rect; + GdkRectangle redraw_rect; + gint y; + gint height; + GtkTextView *text_view; - g_return_if_fail (xed_document_get_enable_search_highlighting ( - XED_DOCUMENT (gtk_text_view_get_buffer (text_view)))); - - /* get visible area */ - gtk_text_view_get_visible_rect (text_view, &visible_rect); - - /* get updated rectangle */ - gtk_text_view_get_line_yrange (text_view, start, &y, &height); - updated_rect.y = y; - gtk_text_view_get_line_yrange (text_view, end, &y, &height); - updated_rect.height = y + height - updated_rect.y; - updated_rect.x = visible_rect.x; - updated_rect.width = visible_rect.width; + text_view = GTK_TEXT_VIEW (view); - /* intersect both rectangles to see whether we need to queue a redraw */ - if (gdk_rectangle_intersect (&updated_rect, &visible_rect, &redraw_rect)) - { - GdkRectangle widget_rect; - - gtk_text_view_buffer_to_window_coords (text_view, - GTK_TEXT_WINDOW_WIDGET, - redraw_rect.x, - redraw_rect.y, - &widget_rect.x, - &widget_rect.y); - - widget_rect.width = redraw_rect.width; - widget_rect.height = redraw_rect.height; - - gtk_widget_queue_draw_area (GTK_WIDGET (text_view), - widget_rect.x, - widget_rect.y, - widget_rect.width, - widget_rect.height); - } + g_return_if_fail ( + xed_document_get_enable_search_highlighting (XED_DOCUMENT (gtk_text_view_get_buffer (text_view)))); + + /* get visible area */ + gtk_text_view_get_visible_rect (text_view, &visible_rect); + + /* get updated rectangle */ + gtk_text_view_get_line_yrange (text_view, start, &y, &height); + updated_rect.y = y; + gtk_text_view_get_line_yrange (text_view, end, &y, &height); + updated_rect.height = y + height - updated_rect.y; + updated_rect.x = visible_rect.x; + updated_rect.width = visible_rect.width; + + /* intersect both rectangles to see whether we need to queue a redraw */ + if (gdk_rectangle_intersect (&updated_rect, &visible_rect, &redraw_rect)) { + GdkRectangle widget_rect; + gtk_text_view_buffer_to_window_coords (text_view, GTK_TEXT_WINDOW_WIDGET, redraw_rect.x, redraw_rect.y, + &widget_rect.x, &widget_rect.y); + + widget_rect.width = redraw_rect.width; + widget_rect.height = redraw_rect.height; + + gtk_widget_queue_draw_area (GTK_WIDGET (text_view), widget_rect.x, widget_rect.y, widget_rect.width, + widget_rect.height); + } } static void delete_line (GtkTextView *text_view, - gint count) + gint count) { - GtkTextIter start; - GtkTextIter end; - GtkTextBuffer *buffer; + GtkTextIter start; + GtkTextIter end; + GtkTextBuffer *buffer; - buffer = gtk_text_view_get_buffer (text_view); + buffer = gtk_text_view_get_buffer (text_view); - gtk_text_view_reset_im_context (text_view); + gtk_text_view_reset_im_context (text_view); - /* If there is a selection delete the selected lines and - * ignore count */ - if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) - { - gtk_text_iter_order (&start, &end); - - if (gtk_text_iter_starts_line (&end)) - { - /* Do no delete the line with the cursor if the cursor - * is at the beginning of the line */ - count = 0; - } - else - count = 1; - } - - gtk_text_iter_set_line_offset (&start, 0); + /* If there is a selection delete the selected lines and + * ignore count */ + if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) { + gtk_text_iter_order (&start, &end); + if (gtk_text_iter_starts_line (&end)) { + /* Do no delete the line with the cursor if the cursor + * is at the beginning of the line */ + count = 0; + } + else { + count = 1; + } + } - if (count > 0) - { - gtk_text_iter_forward_lines (&end, count); + gtk_text_iter_set_line_offset (&start, 0); - if (gtk_text_iter_is_end (&end)) - { - if (gtk_text_iter_backward_line (&start) && !gtk_text_iter_ends_line (&start)) - gtk_text_iter_forward_to_line_end (&start); - } - } - else if (count < 0) - { - if (!gtk_text_iter_ends_line (&end)) - gtk_text_iter_forward_to_line_end (&end); + if (count > 0) { + gtk_text_iter_forward_lines (&end, count); + if (gtk_text_iter_is_end (&end)) { + if (gtk_text_iter_backward_line (&start) && !gtk_text_iter_ends_line (&start)) { + gtk_text_iter_forward_to_line_end (&start); + } + } + } + else if (count < 0) { + if (!gtk_text_iter_ends_line (&end)) { + gtk_text_iter_forward_to_line_end (&end); + } - while (count < 0) - { - if (!gtk_text_iter_backward_line (&start)) - break; - - ++count; - } + while (count < 0) { + if (!gtk_text_iter_backward_line (&start)) { + break; + } + ++count; + } - if (count == 0) - { - if (!gtk_text_iter_ends_line (&start)) - gtk_text_iter_forward_to_line_end (&start); - } - else - gtk_text_iter_forward_line (&end); - } + if (count == 0) { + if (!gtk_text_iter_ends_line (&start)) { + gtk_text_iter_forward_to_line_end (&start); + } + } + else { + gtk_text_iter_forward_line (&end); + } + } - if (!gtk_text_iter_equal (&start, &end)) - { - GtkTextIter cur = start; - gtk_text_iter_set_line_offset (&cur, 0); - - gtk_text_buffer_begin_user_action (buffer); - - gtk_text_buffer_place_cursor (buffer, &cur); - - gtk_text_buffer_delete_interactive (buffer, - &start, - &end, - gtk_text_view_get_editable (text_view)); - - gtk_text_buffer_end_user_action (buffer); - - gtk_text_view_scroll_mark_onscreen (text_view, - gtk_text_buffer_get_insert (buffer)); - } - else - { - gtk_widget_error_bell (GTK_WIDGET (text_view)); - } + if (!gtk_text_iter_equal (&start, &end)) { + GtkTextIter cur = start; + gtk_text_iter_set_line_offset (&cur, 0); + gtk_text_buffer_begin_user_action (buffer); + gtk_text_buffer_place_cursor (buffer, &cur); + gtk_text_buffer_delete_interactive (buffer, &start, &end, gtk_text_view_get_editable (text_view)); + gtk_text_buffer_end_user_action (buffer); + gtk_text_view_scroll_mark_onscreen (text_view, gtk_text_buffer_get_insert (buffer)); + } + else { + gtk_widget_error_bell (GTK_WIDGET (text_view)); + } } static void -xed_view_delete_from_cursor (GtkTextView *text_view, - GtkDeleteType type, - gint count) +xed_view_delete_from_cursor (GtkTextView *text_view, GtkDeleteType type, gint count) { - /* We override the standard handler for delete_from_cursor since - the GTK_DELETE_PARAGRAPHS case is not implemented as we like (i.e. it - does not remove the carriage return in the previous line) - */ - switch (type) - { - case GTK_DELETE_PARAGRAPHS: - delete_line (text_view, count); - break; - default: - GTK_TEXT_VIEW_CLASS (xed_view_parent_class)->delete_from_cursor(text_view, type, count); - break; - } + /* We override the standard handler for delete_from_cursor since + the GTK_DELETE_PARAGRAPHS case is not implemented as we like (i.e. it + does not remove the carriage return in the previous line) + */ + switch (type) { + case GTK_DELETE_PARAGRAPHS: + delete_line (text_view, count); + break; + default: + GTK_TEXT_VIEW_CLASS (xed_view_parent_class)->delete_from_cursor(text_view, type, count); + break; + } } diff --git a/xed/xed-view.h b/xed/xed-view.h index 55bc425..368be30 100644 --- a/xed/xed-view.h +++ b/xed/xed-view.h @@ -1,33 +1,3 @@ -/* - * xed-view.h - * This file is part of xed - * - * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence - * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi - * Copyright (C) 2002-2005 Paolo Maggi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* - * Modified by the xed Team, 1998-2005. See the AUTHORS file for a - * list of people on the xed Team. - * See the ChangeLog files for a list of changes. - */ - #ifndef __XED_VIEW_H__ #define __XED_VIEW_H__ @@ -41,67 +11,59 @@ G_BEGIN_DECLS /* * Type checking and casting macros */ -#define XED_TYPE_VIEW (xed_view_get_type ()) -#define XED_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_VIEW, XedView)) -#define XED_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XED_TYPE_VIEW, XedViewClass)) -#define XED_IS_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XED_TYPE_VIEW)) +#define XED_TYPE_VIEW (xed_view_get_type ()) +#define XED_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_VIEW, XedView)) +#define XED_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XED_TYPE_VIEW, XedViewClass)) +#define XED_IS_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XED_TYPE_VIEW)) #define XED_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XED_TYPE_VIEW)) -#define XED_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XED_TYPE_VIEW, XedViewClass)) +#define XED_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XED_TYPE_VIEW, XedViewClass)) /* Private structure type */ -typedef struct _XedViewPrivate XedViewPrivate; +typedef struct _XedViewPrivate XedViewPrivate; /* * Main object structure */ -typedef struct _XedView XedView; +typedef struct _XedView XedView; struct _XedView { - GtkSourceView view; + GtkSourceView view; - /*< private > */ - XedViewPrivate *priv; + /*< private > */ + XedViewPrivate *priv; }; /* * Class definition */ -typedef struct _XedViewClass XedViewClass; +typedef struct _XedViewClass XedViewClass; struct _XedViewClass { - GtkSourceViewClass parent_class; + GtkSourceViewClass parent_class; - /* FIXME: Do we need placeholders ? */ + /* FIXME: Do we need placeholders ? */ - /* Key bindings */ - gboolean (* start_interactive_search) (XedView *view); - gboolean (* start_interactive_goto_line)(XedView *view); - gboolean (* reset_searched_text) (XedView *view); - - void (* drop_uris) (XedView *view, - gchar **uri_list); + /* Key bindings */ + gboolean (* start_interactive_search) (XedView *view); + gboolean (* start_interactive_goto_line)(XedView *view); + gboolean (* reset_searched_text) (XedView *view); + void (* drop_uris) (XedView *view, gchar **uri_list); }; /* * Public methods */ -GType xed_view_get_type (void) G_GNUC_CONST; - -GtkWidget *xed_view_new (XedDocument *doc); - -void xed_view_cut_clipboard (XedView *view); -void xed_view_copy_clipboard (XedView *view); -void xed_view_paste_clipboard (XedView *view); -void xed_view_delete_selection (XedView *view); -void xed_view_select_all (XedView *view); - -void xed_view_scroll_to_cursor (XedView *view); - -void xed_view_set_font (XedView *view, - gboolean def, - const gchar *font_name); +GType xed_view_get_type (void) G_GNUC_CONST; +GtkWidget *xed_view_new (XedDocument *doc); +void xed_view_cut_clipboard (XedView *view); +void xed_view_copy_clipboard (XedView *view); +void xed_view_paste_clipboard (XedView *view); +void xed_view_delete_selection (XedView *view); +void xed_view_select_all (XedView *view); +void xed_view_scroll_to_cursor (XedView *view); +void xed_view_set_font (XedView *view, gboolean def, const gchar *font_name); G_END_DECLS diff --git a/xed/xed-window-private.h b/xed/xed-window-private.h index 3af4779..2bfa028 100644 --- a/xed/xed-window-private.h +++ b/xed/xed-window-private.h @@ -61,6 +61,7 @@ struct _XedWindowPrivate /* statusbar and context ids for statusbar messages */ GtkWidget *statusbar; + GtkWidget *searchbar; guint generic_message_cid; guint tip_message_cid; guint tab_width_id; diff --git a/xed/xed-window.c b/xed/xed-window.c index a0bbb17..b717b08 100644 --- a/xed/xed-window.c +++ b/xed/xed-window.c @@ -1,33 +1,3 @@ -/* - * xed-window.c - * This file is part of xed - * - * Copyright (C) 2005 - Paolo Maggi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* - * Modified by the xed Team, 2005. See the AUTHORS file for a - * list of people on the xed Team. - * See the ChangeLog files for a list of changes. - * - * $Id$ - */ - #ifdef HAVE_CONFIG_H #include #endif @@ -35,7 +5,6 @@ #include #include #include - #include #include #include @@ -47,6 +16,7 @@ #include "xed-app.h" #include "xed-notebook.h" #include "xed-statusbar.h" +#include "xed-searchbar.h" #include "xed-utils.h" #include "xed-commands.h" #include "xed-debug.h" @@ -59,229 +29,203 @@ #include "xed-dirs.h" #include "xed-status-combo-box.h" -#define LANGUAGE_NONE (const gchar *)"LangNone" -#define XED_UIFILE "xed-ui.xml" +#define LANGUAGE_NONE (const gchar *)"LangNone" +#define XED_UIFILE "xed-ui.xml" #define TAB_WIDTH_DATA "XedWindowTabWidthData" -#define LANGUAGE_DATA "XedWindowLanguageData" +#define LANGUAGE_DATA "XedWindowLanguageData" + #define FULLSCREEN_ANIMATION_SPEED 4 -#define XED_WINDOW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object),\ - XED_TYPE_WINDOW, \ - XedWindowPrivate)) +#define XED_WINDOW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), XED_TYPE_WINDOW, XedWindowPrivate)) /* Signals */ enum { - TAB_ADDED, - TAB_REMOVED, - TABS_REORDERED, - ACTIVE_TAB_CHANGED, - ACTIVE_TAB_STATE_CHANGED, - LAST_SIGNAL + TAB_ADDED, + TAB_REMOVED, + TABS_REORDERED, + ACTIVE_TAB_CHANGED, + ACTIVE_TAB_STATE_CHANGED, + LAST_SIGNAL }; static guint signals[LAST_SIGNAL] = { 0 }; enum { - PROP_0, - PROP_STATE + PROP_0, + PROP_STATE }; enum { - TARGET_URI_LIST = 100 + TARGET_URI_LIST = 100 }; G_DEFINE_TYPE(XedWindow, xed_window, GTK_TYPE_WINDOW) -static void recent_manager_changed (GtkRecentManager *manager, - XedWindow *window); +static void recent_manager_changed (GtkRecentManager *manager, XedWindow *window); static void -xed_window_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +xed_window_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - XedWindow *window = XED_WINDOW (object); + XedWindow *window = XED_WINDOW (object); - switch (prop_id) - { - case PROP_STATE: - g_value_set_enum (value, - xed_window_get_state (window)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + switch (prop_id) { + case PROP_STATE: + g_value_set_enum (value, xed_window_get_state (window)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static void save_panes_state (XedWindow *window) { - gint pane_page; + gint pane_page; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - if (xed_prefs_manager_window_size_can_set ()) - xed_prefs_manager_set_window_size (window->priv->width, - window->priv->height); + if (xed_prefs_manager_window_size_can_set ()) { + xed_prefs_manager_set_window_size (window->priv->width, window->priv->height); + } - if (xed_prefs_manager_window_state_can_set ()) - xed_prefs_manager_set_window_state (window->priv->window_state); + if (xed_prefs_manager_window_state_can_set ()) { + xed_prefs_manager_set_window_state (window->priv->window_state); + } - if ((window->priv->side_panel_size > 0) && - xed_prefs_manager_side_panel_size_can_set ()) - xed_prefs_manager_set_side_panel_size ( - window->priv->side_panel_size); + if ((window->priv->side_panel_size > 0) && xed_prefs_manager_side_panel_size_can_set ()) { + xed_prefs_manager_set_side_panel_size (window->priv->side_panel_size); + } - pane_page = _xed_panel_get_active_item_id (XED_PANEL (window->priv->side_panel)); - if (pane_page != 0 && - xed_prefs_manager_side_panel_active_page_can_set ()) - xed_prefs_manager_set_side_panel_active_page (pane_page); + pane_page = _xed_panel_get_active_item_id (XED_PANEL (window->priv->side_panel)); + if (pane_page != 0 && xed_prefs_manager_side_panel_active_page_can_set ()) { + xed_prefs_manager_set_side_panel_active_page (pane_page); + } - if ((window->priv->bottom_panel_size > 0) && - xed_prefs_manager_bottom_panel_size_can_set ()) - xed_prefs_manager_set_bottom_panel_size ( - window->priv->bottom_panel_size); + if ((window->priv->bottom_panel_size > 0) && xed_prefs_manager_bottom_panel_size_can_set ()) { + xed_prefs_manager_set_bottom_panel_size (window->priv->bottom_panel_size); + } - pane_page = _xed_panel_get_active_item_id (XED_PANEL (window->priv->bottom_panel)); - if (pane_page != 0 && - xed_prefs_manager_bottom_panel_active_page_can_set ()) - xed_prefs_manager_set_bottom_panel_active_page (pane_page); + pane_page = _xed_panel_get_active_item_id (XED_PANEL (window->priv->bottom_panel)); + if (pane_page != 0 && xed_prefs_manager_bottom_panel_active_page_can_set ()) { + xed_prefs_manager_set_bottom_panel_active_page (pane_page); + } +} + +static gint +on_key_pressed (GtkWidget *widget, GdkEventKey *event, XedWindow *window) +{ + gint handled = FALSE; + if (event->keyval == GDK_KEY_Escape) { + xed_searchbar_hide (window->priv->searchbar); + handled = TRUE; + } + return handled; } static void xed_window_dispose (GObject *object) { - XedWindow *window; + XedWindow *window; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - window = XED_WINDOW (object); + window = XED_WINDOW (object); - /* Stop tracking removal of panes otherwise we always - * end up with thinking we had no pane active, since they - * should all be removed below */ - if (window->priv->bottom_panel_item_removed_handler_id != 0) - { - g_signal_handler_disconnect (window->priv->bottom_panel, - window->priv->bottom_panel_item_removed_handler_id); - window->priv->bottom_panel_item_removed_handler_id = 0; - } + /* Stop tracking removal of panes otherwise we always + * end up with thinking we had no pane active, since they + * should all be removed below */ + if (window->priv->bottom_panel_item_removed_handler_id != 0) { + g_signal_handler_disconnect (window->priv->bottom_panel, window->priv->bottom_panel_item_removed_handler_id); + window->priv->bottom_panel_item_removed_handler_id = 0; + } - /* First of all, force collection so that plugins - * really drop some of the references. - */ - xed_plugins_engine_garbage_collect (xed_plugins_engine_get_default ()); + /* First of all, force collection so that plugins + * really drop some of the references. + */ + xed_plugins_engine_garbage_collect (xed_plugins_engine_get_default ()); - /* save the panes position and make sure to deactivate plugins - * for this window, but only once */ - if (!window->priv->dispose_has_run) - { - save_panes_state (window); + /* save the panes position and make sure to deactivate plugins + * for this window, but only once */ + if (!window->priv->dispose_has_run) { + save_panes_state (window); + xed_plugins_engine_deactivate_plugins (xed_plugins_engine_get_default (), window); + window->priv->dispose_has_run = TRUE; + } - xed_plugins_engine_deactivate_plugins (xed_plugins_engine_get_default (), - window); - window->priv->dispose_has_run = TRUE; - } + if (window->priv->fullscreen_animation_timeout_id != 0) { + g_source_remove (window->priv->fullscreen_animation_timeout_id); + window->priv->fullscreen_animation_timeout_id = 0; + } - if (window->priv->fullscreen_animation_timeout_id != 0) - { - g_source_remove (window->priv->fullscreen_animation_timeout_id); - window->priv->fullscreen_animation_timeout_id = 0; - } + if (window->priv->fullscreen_controls != NULL) { + gtk_widget_destroy (window->priv->fullscreen_controls); + window->priv->fullscreen_controls = NULL; + } - if (window->priv->fullscreen_controls != NULL) - { - gtk_widget_destroy (window->priv->fullscreen_controls); - - window->priv->fullscreen_controls = NULL; - } + if (window->priv->recents_handler_id != 0) { + GtkRecentManager *recent_manager; + recent_manager = gtk_recent_manager_get_default (); + g_signal_handler_disconnect (recent_manager, window->priv->recents_handler_id); + window->priv->recents_handler_id = 0; + } - if (window->priv->recents_handler_id != 0) - { - GtkRecentManager *recent_manager; + if (window->priv->manager != NULL) { + g_object_unref (window->priv->manager); + window->priv->manager = NULL; + } - recent_manager = gtk_recent_manager_get_default (); - g_signal_handler_disconnect (recent_manager, - window->priv->recents_handler_id); - window->priv->recents_handler_id = 0; - } + if (window->priv->message_bus != NULL) { + g_object_unref (window->priv->message_bus); + window->priv->message_bus = NULL; + } - if (window->priv->manager != NULL) - { - g_object_unref (window->priv->manager); - window->priv->manager = NULL; - } + if (window->priv->window_group != NULL) { + g_object_unref (window->priv->window_group); + window->priv->window_group = NULL; + } - if (window->priv->message_bus != NULL) - { - g_object_unref (window->priv->message_bus); - window->priv->message_bus = NULL; - } + /* Now that there have broken some reference loops, force collection again. + */ + xed_plugins_engine_garbage_collect (xed_plugins_engine_get_default ()); - if (window->priv->window_group != NULL) - { - g_object_unref (window->priv->window_group); - window->priv->window_group = NULL; - } - - /* Now that there have broken some reference loops, - * force collection again. - */ - xed_plugins_engine_garbage_collect (xed_plugins_engine_get_default ()); - - G_OBJECT_CLASS (xed_window_parent_class)->dispose (object); + G_OBJECT_CLASS (xed_window_parent_class)->dispose (object); } static void xed_window_finalize (GObject *object) { - XedWindow *window; - - xed_debug (DEBUG_WINDOW); - - window = XED_WINDOW (object); - - if (window->priv->default_location != NULL) - g_object_unref (window->priv->default_location); - - G_OBJECT_CLASS (xed_window_parent_class)->finalize (object); + XedWindow *window; + xed_debug (DEBUG_WINDOW); + window = XED_WINDOW (object); + if (window->priv->default_location != NULL) { + g_object_unref (window->priv->default_location); + } + G_OBJECT_CLASS (xed_window_parent_class)->finalize (object); } static gboolean -xed_window_window_state_event (GtkWidget *widget, - GdkEventWindowState *event) +xed_window_window_state_event (GtkWidget *widget, GdkEventWindowState *event) { - XedWindow *window = XED_WINDOW (widget); - - window->priv->window_state = event->new_window_state; - - if (event->changed_mask & - (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)) - { - gboolean show; - - show = !(event->new_window_state & - (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)); - } - - return FALSE; + XedWindow *window = XED_WINDOW (widget); + window->priv->window_state = event->new_window_state; + if (event->changed_mask & (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)) { + gboolean show; + show = !(event->new_window_state & (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)); + } + return FALSE; } -static gboolean -xed_window_configure_event (GtkWidget *widget, - GdkEventConfigure *event) +static gboolean +xed_window_configure_event (GtkWidget *widget, GdkEventConfigure *event) { - XedWindow *window = XED_WINDOW (widget); - - window->priv->width = event->width; - window->priv->height = event->height; - - return GTK_WIDGET_CLASS (xed_window_parent_class)->configure_event (widget, event); + XedWindow *window = XED_WINDOW (widget); + window->priv->width = event->width; + window->priv->height = event->height; + return GTK_WIDGET_CLASS (xed_window_parent_class)->configure_event (widget, event); } /* @@ -293,887 +237,681 @@ xed_window_configure_event (GtkWidget *widget, * parent handler, skipping gtk_window_key_press_event. */ static gboolean -xed_window_key_press_event (GtkWidget *widget, - GdkEventKey *event) +xed_window_key_press_event (GtkWidget *widget, GdkEventKey *event) { - static gpointer grand_parent_class = NULL; - GtkWindow *window = GTK_WINDOW (widget); - gboolean handled = FALSE; + static gpointer grand_parent_class = NULL; + GtkWindow *window = GTK_WINDOW (widget); + gboolean handled = FALSE; - if (grand_parent_class == NULL) - grand_parent_class = g_type_class_peek_parent (xed_window_parent_class); + if (grand_parent_class == NULL) { + grand_parent_class = g_type_class_peek_parent (xed_window_parent_class); + } - /* handle focus widget key events */ - if (!handled) - handled = gtk_window_propagate_key_event (window, event); + /* handle focus widget key events */ + if (!handled) { + handled = gtk_window_propagate_key_event (window, event); + } - /* handle mnemonics and accelerators */ - if (!handled) - handled = gtk_window_activate_key (window, event); + /* handle mnemonics and accelerators */ + if (!handled) { + handled = gtk_window_activate_key (window, event); + } - /* Chain up, invokes binding set */ - if (!handled) - handled = GTK_WIDGET_CLASS (grand_parent_class)->key_press_event (widget, event); + /* Chain up, invokes binding set */ + if (!handled) { + handled = GTK_WIDGET_CLASS (grand_parent_class)->key_press_event (widget, event); + } - return handled; + return handled; } static void -xed_window_tab_removed (XedWindow *window, - XedTab *tab) +xed_window_tab_removed (XedWindow *window, XedTab *tab) { - xed_plugins_engine_garbage_collect (xed_plugins_engine_get_default ()); + xed_plugins_engine_garbage_collect (xed_plugins_engine_get_default ()); } static void xed_window_class_init (XedWindowClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - klass->tab_removed = xed_window_tab_removed; + klass->tab_removed = xed_window_tab_removed; - object_class->dispose = xed_window_dispose; - object_class->finalize = xed_window_finalize; - object_class->get_property = xed_window_get_property; + object_class->dispose = xed_window_dispose; + object_class->finalize = xed_window_finalize; + object_class->get_property = xed_window_get_property; - widget_class->window_state_event = xed_window_window_state_event; - widget_class->configure_event = xed_window_configure_event; - widget_class->key_press_event = xed_window_key_press_event; + widget_class->window_state_event = xed_window_window_state_event; + widget_class->configure_event = xed_window_configure_event; + widget_class->key_press_event = xed_window_key_press_event; - signals[TAB_ADDED] = - g_signal_new ("tab_added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (XedWindowClass, tab_added), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, - 1, - XED_TYPE_TAB); - signals[TAB_REMOVED] = - g_signal_new ("tab_removed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (XedWindowClass, tab_removed), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, - 1, - XED_TYPE_TAB); - signals[TABS_REORDERED] = - g_signal_new ("tabs_reordered", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (XedWindowClass, tabs_reordered), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - signals[ACTIVE_TAB_CHANGED] = - g_signal_new ("active_tab_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (XedWindowClass, active_tab_changed), - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, - 1, - XED_TYPE_TAB); - signals[ACTIVE_TAB_STATE_CHANGED] = - g_signal_new ("active_tab_state_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (XedWindowClass, active_tab_state_changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); + signals[TAB_ADDED] = g_signal_new ("tab_added", G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (XedWindowClass, tab_added), NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, XED_TYPE_TAB); - g_object_class_install_property (object_class, - PROP_STATE, - g_param_spec_flags ("state", - "State", - "The window's state", - XED_TYPE_WINDOW_STATE, - XED_WINDOW_STATE_NORMAL, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); + signals[TAB_REMOVED] = g_signal_new ("tab_removed", G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (XedWindowClass, tab_removed), NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, XED_TYPE_TAB); - g_type_class_add_private (object_class, sizeof(XedWindowPrivate)); + signals[TABS_REORDERED] = g_signal_new ("tabs_reordered", G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (XedWindowClass, tabs_reordered), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + signals[ACTIVE_TAB_CHANGED] = g_signal_new ("active_tab_changed", G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (XedWindowClass, active_tab_changed), NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, XED_TYPE_TAB); + + signals[ACTIVE_TAB_STATE_CHANGED] = g_signal_new ("active_tab_state_changed", G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (XedWindowClass, active_tab_state_changed), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + g_object_class_install_property (object_class, PROP_STATE, + g_param_spec_flags ("state", "State", "The window's state", + XED_TYPE_WINDOW_STATE, XED_WINDOW_STATE_NORMAL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_type_class_add_private (object_class, sizeof(XedWindowPrivate)); } static void -menu_item_select_cb (GtkMenuItem *proxy, - XedWindow *window) +menu_item_select_cb (GtkMenuItem *proxy, XedWindow *window) { - GtkAction *action; - char *message; + GtkAction *action; + char *message; - action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (proxy)); - g_return_if_fail (action != NULL); + action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (proxy)); + g_return_if_fail (action != NULL); - g_object_get (G_OBJECT (action), "tooltip", &message, NULL); - if (message) - { - gtk_statusbar_push (GTK_STATUSBAR (window->priv->statusbar), - window->priv->tip_message_cid, message); - g_free (message); - } + g_object_get (G_OBJECT (action), "tooltip", &message, NULL); + if (message) { + gtk_statusbar_push (GTK_STATUSBAR (window->priv->statusbar), window->priv->tip_message_cid, message); + g_free (message); + } } static void -menu_item_deselect_cb (GtkMenuItem *proxy, - XedWindow *window) +menu_item_deselect_cb (GtkMenuItem *proxy, XedWindow *window) { - gtk_statusbar_pop (GTK_STATUSBAR (window->priv->statusbar), - window->priv->tip_message_cid); + gtk_statusbar_pop (GTK_STATUSBAR (window->priv->statusbar), window->priv->tip_message_cid); } static void -connect_proxy_cb (GtkUIManager *manager, - GtkAction *action, - GtkWidget *proxy, - XedWindow *window) +connect_proxy_cb (GtkUIManager *manager, GtkAction *action, GtkWidget *proxy, XedWindow *window) { - if (GTK_IS_MENU_ITEM (proxy)) - { - g_signal_connect (proxy, "select", - G_CALLBACK (menu_item_select_cb), window); - g_signal_connect (proxy, "deselect", - G_CALLBACK (menu_item_deselect_cb), window); - } + if (GTK_IS_MENU_ITEM (proxy)) { + g_signal_connect (proxy, "select", G_CALLBACK (menu_item_select_cb), window); + g_signal_connect (proxy, "deselect", G_CALLBACK (menu_item_deselect_cb), window); + } } static void -disconnect_proxy_cb (GtkUIManager *manager, - GtkAction *action, - GtkWidget *proxy, - XedWindow *window) +disconnect_proxy_cb (GtkUIManager *manager, GtkAction *action, GtkWidget *proxy, XedWindow *window) { - if (GTK_IS_MENU_ITEM (proxy)) - { - g_signal_handlers_disconnect_by_func - (proxy, G_CALLBACK (menu_item_select_cb), window); - g_signal_handlers_disconnect_by_func - (proxy, G_CALLBACK (menu_item_deselect_cb), window); - } + if (GTK_IS_MENU_ITEM (proxy)) { + g_signal_handlers_disconnect_by_func (proxy, G_CALLBACK (menu_item_select_cb), window); + g_signal_handlers_disconnect_by_func (proxy, G_CALLBACK (menu_item_deselect_cb), window); + } } static void -apply_toolbar_style (XedWindow *window, - GtkWidget *toolbar) +apply_toolbar_style (XedWindow *window, GtkWidget *toolbar) { - switch (window->priv->toolbar_style) - { - case XED_TOOLBAR_SYSTEM: - xed_debug_message (DEBUG_WINDOW, "XED: SYSTEM"); - gtk_toolbar_unset_style ( - GTK_TOOLBAR (toolbar)); - break; + switch (window->priv->toolbar_style) { + case XED_TOOLBAR_SYSTEM: + xed_debug_message (DEBUG_WINDOW, "XED: SYSTEM"); + gtk_toolbar_unset_style (GTK_TOOLBAR (toolbar)); + break; - case XED_TOOLBAR_ICONS: - xed_debug_message (DEBUG_WINDOW, "XED: ICONS"); - gtk_toolbar_set_style ( - GTK_TOOLBAR (toolbar), - GTK_TOOLBAR_ICONS); - break; + case XED_TOOLBAR_ICONS: + xed_debug_message (DEBUG_WINDOW, "XED: ICONS"); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS); + break; - case XED_TOOLBAR_ICONS_AND_TEXT: - xed_debug_message (DEBUG_WINDOW, "XED: ICONS_AND_TEXT"); - gtk_toolbar_set_style ( - GTK_TOOLBAR (toolbar), - GTK_TOOLBAR_BOTH); - break; + case XED_TOOLBAR_ICONS_AND_TEXT: + xed_debug_message (DEBUG_WINDOW, "XED: ICONS_AND_TEXT"); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH); + break; - case XED_TOOLBAR_ICONS_BOTH_HORIZ: - xed_debug_message (DEBUG_WINDOW, "XED: ICONS_BOTH_HORIZ"); - gtk_toolbar_set_style ( - GTK_TOOLBAR (toolbar), - GTK_TOOLBAR_BOTH_HORIZ); - break; - } + case XED_TOOLBAR_ICONS_BOTH_HORIZ: + xed_debug_message (DEBUG_WINDOW, "XED: ICONS_BOTH_HORIZ"); + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + break; + } } /* Returns TRUE if toolbar is visible */ static gboolean -set_toolbar_style (XedWindow *window, - XedWindow *origin) +set_toolbar_style (XedWindow *window, XedWindow *origin) { - gboolean visible; - XedToolbarSetting style; - GtkAction *action; - - if (origin == NULL) - visible = xed_prefs_manager_get_toolbar_visible (); - else - visible = gtk_widget_get_visible (origin->priv->toolbar); - - /* Set visibility */ - if (visible) - gtk_widget_show (window->priv->toolbar); - else - gtk_widget_hide (window->priv->toolbar); + gboolean visible; + XedToolbarSetting style; + GtkAction *action; - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "ViewToolbar"); + if (origin == NULL) { + visible = xed_prefs_manager_get_toolbar_visible (); + } + else { + visible = gtk_widget_get_visible (origin->priv->toolbar); + } - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + /* Set visibility */ + if (visible) { + gtk_widget_show (window->priv->toolbar); + } + else { + gtk_widget_hide (window->priv->toolbar); + } - /* Set style */ - if (origin == NULL) - style = xed_prefs_manager_get_toolbar_buttons_style (); - else - style = origin->priv->toolbar_style; - - window->priv->toolbar_style = style; - - apply_toolbar_style (window, window->priv->toolbar); - - return visible; + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "ViewToolbar"); + + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + } + + /* Set style */ + if (origin == NULL) { + style = xed_prefs_manager_get_toolbar_buttons_style (); + } + else { + style = origin->priv->toolbar_style; + } + + window->priv->toolbar_style = style; + + apply_toolbar_style (window, window->priv->toolbar); + + return visible; } static void -update_next_prev_doc_sensitivity (XedWindow *window, - XedTab *tab) +update_next_prev_doc_sensitivity (XedWindow *window, XedTab *tab) { - gint tab_number; - GtkNotebook *notebook; - GtkAction *action; - - xed_debug (DEBUG_WINDOW); - - notebook = GTK_NOTEBOOK (_xed_window_get_notebook (window)); - - tab_number = gtk_notebook_page_num (notebook, GTK_WIDGET (tab)); - g_return_if_fail (tab_number >= 0); - - action = gtk_action_group_get_action (window->priv->action_group, - "DocumentsPreviousDocument"); - gtk_action_set_sensitive (action, tab_number != 0); - - action = gtk_action_group_get_action (window->priv->action_group, - "DocumentsNextDocument"); - gtk_action_set_sensitive (action, - tab_number < gtk_notebook_get_n_pages (notebook) - 1); + gint tab_number; + GtkNotebook *notebook; + GtkAction *action; + + xed_debug (DEBUG_WINDOW); + + notebook = GTK_NOTEBOOK (_xed_window_get_notebook (window)); + + tab_number = gtk_notebook_page_num (notebook, GTK_WIDGET (tab)); + g_return_if_fail (tab_number >= 0); + + action = gtk_action_group_get_action (window->priv->action_group, "DocumentsPreviousDocument"); + gtk_action_set_sensitive (action, tab_number != 0); + + action = gtk_action_group_get_action (window->priv->action_group, "DocumentsNextDocument"); + gtk_action_set_sensitive (action, tab_number < gtk_notebook_get_n_pages (notebook) - 1); } static void update_next_prev_doc_sensitivity_per_window (XedWindow *window) { - XedTab *tab; - GtkAction *action; - - xed_debug (DEBUG_WINDOW); - - tab = xed_window_get_active_tab (window); - if (tab != NULL) - { - update_next_prev_doc_sensitivity (window, tab); - - return; - } - - action = gtk_action_group_get_action (window->priv->action_group, - "DocumentsPreviousDocument"); - gtk_action_set_sensitive (action, FALSE); - - action = gtk_action_group_get_action (window->priv->action_group, - "DocumentsNextDocument"); - gtk_action_set_sensitive (action, FALSE); - + XedTab *tab; + GtkAction *action; + + xed_debug (DEBUG_WINDOW); + + tab = xed_window_get_active_tab (window); + if (tab != NULL) { + update_next_prev_doc_sensitivity (window, tab); + return; + } + + action = gtk_action_group_get_action (window->priv->action_group, "DocumentsPreviousDocument"); + gtk_action_set_sensitive (action, FALSE); + + action = gtk_action_group_get_action (window->priv->action_group, "DocumentsNextDocument"); + gtk_action_set_sensitive (action, FALSE); + } static void -received_clipboard_contents (GtkClipboard *clipboard, - GtkSelectionData *selection_data, - XedWindow *window) +received_clipboard_contents (GtkClipboard *clipboard, GtkSelectionData *selection_data, XedWindow *window) { - gboolean sens; - GtkAction *action; + gboolean sens; + GtkAction *action; - /* getting clipboard contents is async, so we need to - * get the current tab and its state */ + /* getting clipboard contents is async, so we need to + * get the current tab and its state */ - if (window->priv->active_tab != NULL) - { - XedTabState state; - gboolean state_normal; + if (window->priv->active_tab != NULL) { + XedTabState state; + gboolean state_normal; + state = xed_tab_get_state (window->priv->active_tab); + state_normal = (state == XED_TAB_STATE_NORMAL); + sens = state_normal && gtk_selection_data_targets_include_text (selection_data); + } + else { + sens = FALSE; + } - state = xed_tab_get_state (window->priv->active_tab); - state_normal = (state == XED_TAB_STATE_NORMAL); - - sens = state_normal && - gtk_selection_data_targets_include_text (selection_data); - } - else - { - sens = FALSE; - } - - action = gtk_action_group_get_action (window->priv->action_group, - "EditPaste"); - - gtk_action_set_sensitive (action, sens); - - g_object_unref (window); + action = gtk_action_group_get_action (window->priv->action_group, "EditPaste"); + gtk_action_set_sensitive (action, sens); + g_object_unref (window); } static void -set_paste_sensitivity_according_to_clipboard (XedWindow *window, - GtkClipboard *clipboard) +set_paste_sensitivity_according_to_clipboard (XedWindow *window, GtkClipboard *clipboard) { - GdkDisplay *display; + GdkDisplay *display; - display = gtk_clipboard_get_display (clipboard); + display = gtk_clipboard_get_display (clipboard); + if (gdk_display_supports_selection_notification (display)) { + gtk_clipboard_request_contents (clipboard, gdk_atom_intern_static_string ("TARGETS"), + (GtkClipboardReceivedFunc) received_clipboard_contents, g_object_ref (window)); + } + else { + GtkAction *action; + action = gtk_action_group_get_action (window->priv->action_group, "EditPaste"); - if (gdk_display_supports_selection_notification (display)) - { - gtk_clipboard_request_contents (clipboard, - gdk_atom_intern_static_string ("TARGETS"), - (GtkClipboardReceivedFunc) received_clipboard_contents, - g_object_ref (window)); - } - else - { - GtkAction *action; - - action = gtk_action_group_get_action (window->priv->action_group, - "EditPaste"); - - /* XFIXES extension not availbale, make - * Paste always sensitive */ - gtk_action_set_sensitive (action, TRUE); - } + /* XFIXES extension not availbale, make + * Paste always sensitive */ + gtk_action_set_sensitive (action, TRUE); + } } static void -set_sensitivity_according_to_tab (XedWindow *window, - XedTab *tab) +set_sensitivity_according_to_tab (XedWindow *window, XedTab *tab) { - XedDocument *doc; - XedView *view; - GtkAction *action; - gboolean b; - gboolean state_normal; - gboolean editable; - XedTabState state; - GtkClipboard *clipboard; + XedDocument *doc; + XedView *view; + GtkAction *action; + gboolean b; + gboolean state_normal; + gboolean editable; + XedTabState state; + GtkClipboard *clipboard; - g_return_if_fail (XED_TAB (tab)); + g_return_if_fail (XED_TAB (tab)); - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - state = xed_tab_get_state (tab); - state_normal = (state == XED_TAB_STATE_NORMAL); + state = xed_tab_get_state (tab); + state_normal = (state == XED_TAB_STATE_NORMAL); - view = xed_tab_get_view (tab); - editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (view)); + view = xed_tab_get_view (tab); + editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (view)); - doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); + doc = XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), - GDK_SELECTION_CLIPBOARD); + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_CLIPBOARD); - action = gtk_action_group_get_action (window->priv->action_group, - "FileSave"); - gtk_action_set_sensitive (action, - (state_normal || - (state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) || - (state == XED_TAB_STATE_SHOWING_PRINT_PREVIEW)) && - !xed_document_get_readonly (doc)); + action = gtk_action_group_get_action (window->priv->action_group, "FileSave"); + gtk_action_set_sensitive (action, + (state_normal || + (state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) || + (state == XED_TAB_STATE_SHOWING_PRINT_PREVIEW)) && + !xed_document_get_readonly (doc)); - action = gtk_action_group_get_action (window->priv->action_group, - "FileSaveAs"); - gtk_action_set_sensitive (action, - (state_normal || - (state == XED_TAB_STATE_SAVING_ERROR) || - (state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) || - (state == XED_TAB_STATE_SHOWING_PRINT_PREVIEW))); + action = gtk_action_group_get_action (window->priv->action_group, "FileSaveAs"); + gtk_action_set_sensitive (action, + (state_normal || + (state == XED_TAB_STATE_SAVING_ERROR) || + (state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) || + (state == XED_TAB_STATE_SHOWING_PRINT_PREVIEW))); - action = gtk_action_group_get_action (window->priv->action_group, - "FileRevert"); - gtk_action_set_sensitive (action, - (state_normal || - (state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)) && - !xed_document_is_untitled (doc)); + action = gtk_action_group_get_action (window->priv->action_group, "FileRevert"); + gtk_action_set_sensitive (action, + (state_normal || + (state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)) && + !xed_document_is_untitled (doc)); - action = gtk_action_group_get_action (window->priv->action_group, - "FilePrintPreview"); - gtk_action_set_sensitive (action, - state_normal); + action = gtk_action_group_get_action (window->priv->action_group, "FilePrintPreview"); + gtk_action_set_sensitive (action, state_normal); - action = gtk_action_group_get_action (window->priv->action_group, - "FilePrint"); - gtk_action_set_sensitive (action, - (state_normal || - (state == XED_TAB_STATE_SHOWING_PRINT_PREVIEW))); - - action = gtk_action_group_get_action (window->priv->close_action_group, - "FileClose"); + action = gtk_action_group_get_action (window->priv->action_group, "FilePrint"); + gtk_action_set_sensitive (action, + (state_normal || (state == XED_TAB_STATE_SHOWING_PRINT_PREVIEW))); - gtk_action_set_sensitive (action, - (state != XED_TAB_STATE_CLOSING) && - (state != XED_TAB_STATE_SAVING) && - (state != XED_TAB_STATE_SHOWING_PRINT_PREVIEW) && - (state != XED_TAB_STATE_PRINTING) && - (state != XED_TAB_STATE_PRINT_PREVIEWING) && - (state != XED_TAB_STATE_SAVING_ERROR)); + action = gtk_action_group_get_action (window->priv->close_action_group, "FileClose"); - action = gtk_action_group_get_action (window->priv->action_group, - "EditUndo"); - gtk_action_set_sensitive (action, - state_normal && - gtk_source_buffer_can_undo (GTK_SOURCE_BUFFER (doc))); + gtk_action_set_sensitive (action, + (state != XED_TAB_STATE_CLOSING) && + (state != XED_TAB_STATE_SAVING) && + (state != XED_TAB_STATE_SHOWING_PRINT_PREVIEW) && + (state != XED_TAB_STATE_PRINTING) && + (state != XED_TAB_STATE_PRINT_PREVIEWING) && + (state != XED_TAB_STATE_SAVING_ERROR)); - action = gtk_action_group_get_action (window->priv->action_group, - "EditRedo"); - gtk_action_set_sensitive (action, - state_normal && - gtk_source_buffer_can_redo (GTK_SOURCE_BUFFER (doc))); + action = gtk_action_group_get_action (window->priv->action_group, "EditUndo"); + gtk_action_set_sensitive (action, state_normal && gtk_source_buffer_can_undo (GTK_SOURCE_BUFFER (doc))); - action = gtk_action_group_get_action (window->priv->action_group, - "EditCut"); - gtk_action_set_sensitive (action, - state_normal && - editable && - gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); + action = gtk_action_group_get_action (window->priv->action_group, "EditRedo"); + gtk_action_set_sensitive (action, state_normal && gtk_source_buffer_can_redo (GTK_SOURCE_BUFFER (doc))); - action = gtk_action_group_get_action (window->priv->action_group, - "EditCopy"); - gtk_action_set_sensitive (action, - (state_normal || - state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && - gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); - - action = gtk_action_group_get_action (window->priv->action_group, - "EditPaste"); - if (state_normal && editable) - { - set_paste_sensitivity_according_to_clipboard (window, - clipboard); - } - else - { - gtk_action_set_sensitive (action, FALSE); - } + action = gtk_action_group_get_action (window->priv->action_group, "EditCut"); + gtk_action_set_sensitive (action, + state_normal && editable && gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); - action = gtk_action_group_get_action (window->priv->action_group, - "EditDelete"); - gtk_action_set_sensitive (action, - state_normal && - editable && - gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); + action = gtk_action_group_get_action (window->priv->action_group, "EditCopy"); + gtk_action_set_sensitive (action, + (state_normal || + state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && + gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); - action = gtk_action_group_get_action (window->priv->action_group, - "SearchFind"); - gtk_action_set_sensitive (action, - (state_normal || - state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)); + action = gtk_action_group_get_action (window->priv->action_group, "EditPaste"); + if (state_normal && editable) { + set_paste_sensitivity_according_to_clipboard (window, clipboard); + } + else { + gtk_action_set_sensitive (action, FALSE); + } - action = gtk_action_group_get_action (window->priv->action_group, - "SearchIncrementalSearch"); - gtk_action_set_sensitive (action, - (state_normal || - state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)); + action = gtk_action_group_get_action (window->priv->action_group, "EditDelete"); + gtk_action_set_sensitive (action, + state_normal && editable && gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); - action = gtk_action_group_get_action (window->priv->action_group, - "SearchReplace"); - gtk_action_set_sensitive (action, - state_normal && - editable); + action = gtk_action_group_get_action (window->priv->action_group, "SearchFind"); + gtk_action_set_sensitive (action, + (state_normal || state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)); - b = xed_document_get_can_search_again (doc); - action = gtk_action_group_get_action (window->priv->action_group, - "SearchFindNext"); - gtk_action_set_sensitive (action, - (state_normal || - state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && b); + action = gtk_action_group_get_action (window->priv->action_group, "SearchReplace"); + gtk_action_set_sensitive (action, state_normal && editable); - action = gtk_action_group_get_action (window->priv->action_group, - "SearchFindPrevious"); - gtk_action_set_sensitive (action, - (state_normal || - state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && b); + b = xed_document_get_can_search_again (doc); + action = gtk_action_group_get_action (window->priv->action_group, "SearchFindNext"); + gtk_action_set_sensitive (action, + (state_normal || state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && b); - action = gtk_action_group_get_action (window->priv->action_group, - "SearchClearHighlight"); - gtk_action_set_sensitive (action, - (state_normal || - state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && b); + action = gtk_action_group_get_action (window->priv->action_group, "SearchFindPrevious"); + gtk_action_set_sensitive (action, + (state_normal || state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && b); - action = gtk_action_group_get_action (window->priv->action_group, - "SearchGoToLine"); - gtk_action_set_sensitive (action, - (state_normal || - state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)); - - action = gtk_action_group_get_action (window->priv->action_group, - "ViewHighlightMode"); - gtk_action_set_sensitive (action, - (state != XED_TAB_STATE_CLOSING) && - xed_prefs_manager_get_enable_syntax_highlighting ()); + action = gtk_action_group_get_action (window->priv->action_group, "SearchGoToLine"); + gtk_action_set_sensitive (action, + (state_normal || state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION)); - update_next_prev_doc_sensitivity (window, tab); + action = gtk_action_group_get_action (window->priv->action_group, "ViewHighlightMode"); + gtk_action_set_sensitive (action, + (state != XED_TAB_STATE_CLOSING) && xed_prefs_manager_get_enable_syntax_highlighting ()); - xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), - window); + update_next_prev_doc_sensitivity (window, tab); + + xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), window); } static void -language_toggled (GtkToggleAction *action, - XedWindow *window) +language_toggled (GtkToggleAction *action, XedWindow *window) { - XedDocument *doc; - GtkSourceLanguage *lang; - const gchar *lang_id; + XedDocument *doc; + GtkSourceLanguage *lang; + const gchar *lang_id; - if (gtk_toggle_action_get_active (action) == FALSE) - return; + if (gtk_toggle_action_get_active (action) == FALSE) { + return; + } - doc = xed_window_get_active_document (window); - if (doc == NULL) - return; + doc = xed_window_get_active_document (window); + if (doc == NULL) { + return; + } - lang_id = gtk_action_get_name (GTK_ACTION (action)); - - if (strcmp (lang_id, LANGUAGE_NONE) == 0) - { - /* Normal (no highlighting) */ - lang = NULL; - } - else - { - lang = gtk_source_language_manager_get_language ( - xed_get_language_manager (), - lang_id); - if (lang == NULL) - { - g_warning ("Could not get language %s\n", lang_id); - } - } + lang_id = gtk_action_get_name (GTK_ACTION (action)); - xed_document_set_language (doc, lang); + if (strcmp (lang_id, LANGUAGE_NONE) == 0) { + /* Normal (no highlighting) */ + lang = NULL; + } + else { + lang = gtk_source_language_manager_get_language (xed_get_language_manager (), lang_id); + if (lang == NULL) { + g_warning ("Could not get language %s\n", lang_id); + } + } + + xed_document_set_language (doc, lang); } static gchar * escape_section_name (const gchar *name) { - gchar *ret; - - ret = g_markup_escape_text (name, -1); - - /* Replace '/' with '-' to avoid problems in xml paths */ - g_strdelimit (ret, "/", '-'); - - return ret; + gchar *ret; + ret = g_markup_escape_text (name, -1); + /* Replace '/' with '-' to avoid problems in xml paths */ + g_strdelimit (ret, "/", '-'); + return ret; } static void -create_language_menu_item (GtkSourceLanguage *lang, - gint index, - guint ui_id, - XedWindow *window) +create_language_menu_item (GtkSourceLanguage *lang, gint index, guint ui_id, XedWindow *window) { - GtkAction *section_action; - GtkRadioAction *action; - GtkAction *normal_action; - GSList *group; - const gchar *section; - gchar *escaped_section; - const gchar *lang_id; - const gchar *lang_name; - gchar *escaped_lang_name; - gchar *tip; - gchar *path; + GtkAction *section_action; + GtkRadioAction *action; + GtkAction *normal_action; + GSList *group; + const gchar *section; + gchar *escaped_section; + const gchar *lang_id; + const gchar *lang_name; + gchar *escaped_lang_name; + gchar *tip; + gchar *path; - section = gtk_source_language_get_section (lang); - escaped_section = escape_section_name (section); + section = gtk_source_language_get_section (lang); + escaped_section = escape_section_name (section); - /* check if the section submenu exists or create it */ - section_action = gtk_action_group_get_action (window->priv->languages_action_group, - escaped_section); + /* check if the section submenu exists or create it */ + section_action = gtk_action_group_get_action (window->priv->languages_action_group, escaped_section); - if (section_action == NULL) - { - gchar *section_name; - - section_name = xed_utils_escape_underscores (section, -1); - - section_action = gtk_action_new (escaped_section, - section_name, - NULL, - NULL); - - g_free (section_name); + if (section_action == NULL) { + gchar *section_name; + section_name = xed_utils_escape_underscores (section, -1); + section_action = gtk_action_new (escaped_section, section_name, NULL, NULL); - gtk_action_group_add_action (window->priv->languages_action_group, - section_action); - g_object_unref (section_action); + g_free (section_name); - gtk_ui_manager_add_ui (window->priv->manager, - ui_id, - "/MenuBar/ViewMenu/ViewHighlightModeMenu/LanguagesMenuPlaceholder", - escaped_section, - escaped_section, - GTK_UI_MANAGER_MENU, - FALSE); - } + gtk_action_group_add_action (window->priv->languages_action_group, section_action); + g_object_unref (section_action); - /* now add the language item to the section */ - lang_name = gtk_source_language_get_name (lang); - lang_id = gtk_source_language_get_id (lang); - - escaped_lang_name = xed_utils_escape_underscores (lang_name, -1); - - tip = g_strdup_printf (_("Use %s highlight mode"), lang_name); - path = g_strdup_printf ("/MenuBar/ViewMenu/ViewHighlightModeMenu/LanguagesMenuPlaceholder/%s", - escaped_section); + gtk_ui_manager_add_ui (window->priv->manager, ui_id, + "/MenuBar/ViewMenu/ViewHighlightModeMenu/LanguagesMenuPlaceholder", + escaped_section, escaped_section, GTK_UI_MANAGER_MENU, FALSE); + } - action = gtk_radio_action_new (lang_id, - escaped_lang_name, - tip, - NULL, - index); + /* now add the language item to the section */ + lang_name = gtk_source_language_get_name (lang); + lang_id = gtk_source_language_get_id (lang); - g_free (escaped_lang_name); + escaped_lang_name = xed_utils_escape_underscores (lang_name, -1); - /* Action is added with a NULL accel to make the accel overridable */ - gtk_action_group_add_action_with_accel (window->priv->languages_action_group, - GTK_ACTION (action), - NULL); - g_object_unref (action); + tip = g_strdup_printf (_("Use %s highlight mode"), lang_name); + path = g_strdup_printf ("/MenuBar/ViewMenu/ViewHighlightModeMenu/LanguagesMenuPlaceholder/%s", escaped_section); - /* add the action to the same radio group of the "Normal" action */ - normal_action = gtk_action_group_get_action (window->priv->languages_action_group, - LANGUAGE_NONE); - group = gtk_radio_action_get_group (GTK_RADIO_ACTION (normal_action)); - gtk_radio_action_set_group (action, group); + action = gtk_radio_action_new (lang_id, escaped_lang_name, tip, NULL, index); - g_signal_connect (action, - "activate", - G_CALLBACK (language_toggled), - window); + g_free (escaped_lang_name); - gtk_ui_manager_add_ui (window->priv->manager, - ui_id, - path, - lang_id, - lang_id, - GTK_UI_MANAGER_MENUITEM, - FALSE); + /* Action is added with a NULL accel to make the accel overridable */ + gtk_action_group_add_action_with_accel (window->priv->languages_action_group, GTK_ACTION (action), NULL); + g_object_unref (action); - g_free (path); - g_free (tip); - g_free (escaped_section); + /* add the action to the same radio group of the "Normal" action */ + normal_action = gtk_action_group_get_action (window->priv->languages_action_group, LANGUAGE_NONE); + group = gtk_radio_action_get_group (GTK_RADIO_ACTION (normal_action)); + gtk_radio_action_set_group (action, group); + + g_signal_connect (action, "activate", G_CALLBACK (language_toggled), window); + + gtk_ui_manager_add_ui (window->priv->manager, ui_id, path, lang_id, lang_id, GTK_UI_MANAGER_MENUITEM, FALSE); + + g_free (path); + g_free (tip); + g_free (escaped_section); } static void create_languages_menu (XedWindow *window) { - GtkRadioAction *action_none; - GSList *languages; - GSList *l; - guint id; - gint i; + GtkRadioAction *action_none; + GSList *languages; + GSList *l; + guint id; + gint i; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - /* add the "Plain Text" item before all the others */ - - /* Translators: "Plain Text" means that no highlight mode is selected in the - * "View->Highlight Mode" submenu and so syntax highlighting is disabled */ - action_none = gtk_radio_action_new (LANGUAGE_NONE, _("Plain Text"), - _("Disable syntax highlighting"), - NULL, - -1); + /* add the "Plain Text" item before all the others */ - gtk_action_group_add_action (window->priv->languages_action_group, - GTK_ACTION (action_none)); - g_object_unref (action_none); + /* Translators: "Plain Text" means that no highlight mode is selected in the + * "View->Highlight Mode" submenu and so syntax highlighting is disabled */ + action_none = gtk_radio_action_new (LANGUAGE_NONE, _("Plain Text"), _("Disable syntax highlighting"), NULL, -1); - g_signal_connect (action_none, - "activate", - G_CALLBACK (language_toggled), - window); + gtk_action_group_add_action (window->priv->languages_action_group, GTK_ACTION (action_none)); + g_object_unref (action_none); - id = gtk_ui_manager_new_merge_id (window->priv->manager); + g_signal_connect (action_none, "activate", G_CALLBACK (language_toggled), window); - gtk_ui_manager_add_ui (window->priv->manager, - id, - "/MenuBar/ViewMenu/ViewHighlightModeMenu/LanguagesMenuPlaceholder", - LANGUAGE_NONE, - LANGUAGE_NONE, - GTK_UI_MANAGER_MENUITEM, - TRUE); + id = gtk_ui_manager_new_merge_id (window->priv->manager); - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action_none), TRUE); + gtk_ui_manager_add_ui (window->priv->manager, id, + "/MenuBar/ViewMenu/ViewHighlightModeMenu/LanguagesMenuPlaceholder", + LANGUAGE_NONE, LANGUAGE_NONE, GTK_UI_MANAGER_MENUITEM, TRUE); - /* now add all the known languages */ - languages = xed_language_manager_list_languages_sorted ( - xed_get_language_manager (), - FALSE); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action_none), TRUE); - for (l = languages, i = 0; l != NULL; l = l->next, ++i) - { - create_language_menu_item (l->data, - i, - id, - window); - } + /* now add all the known languages */ + languages = xed_language_manager_list_languages_sorted (xed_get_language_manager (), FALSE); - g_slist_free (languages); + for (l = languages, i = 0; l != NULL; l = l->next, ++i) { + create_language_menu_item (l->data, i, id, window); + } + + g_slist_free (languages); } static void update_languages_menu (XedWindow *window) { - XedDocument *doc; - GList *actions; - GList *l; - GtkAction *action; - GtkSourceLanguage *lang; - const gchar *lang_id; + XedDocument *doc; + GList *actions; + GList *l; + GtkAction *action; + GtkSourceLanguage *lang; + const gchar *lang_id; - doc = xed_window_get_active_document (window); - if (doc == NULL) - return; + doc = xed_window_get_active_document (window); + if (doc == NULL) { + return; + } - lang = xed_document_get_language (doc); - if (lang != NULL) - lang_id = gtk_source_language_get_id (lang); - else - lang_id = LANGUAGE_NONE; + lang = xed_document_get_language (doc); + if (lang != NULL) { + lang_id = gtk_source_language_get_id (lang); + } + else { + lang_id = LANGUAGE_NONE; + } - actions = gtk_action_group_list_actions (window->priv->languages_action_group); + actions = gtk_action_group_list_actions (window->priv->languages_action_group); - /* prevent recursion */ - for (l = actions; l != NULL; l = l->next) - { - g_signal_handlers_block_by_func (GTK_ACTION (l->data), - G_CALLBACK (language_toggled), - window); - } + /* prevent recursion */ + for (l = actions; l != NULL; l = l->next) { + g_signal_handlers_block_by_func (GTK_ACTION (l->data), G_CALLBACK (language_toggled), window); + } - action = gtk_action_group_get_action (window->priv->languages_action_group, - lang_id); + action = gtk_action_group_get_action (window->priv->languages_action_group, lang_id); - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); - for (l = actions; l != NULL; l = l->next) - { - g_signal_handlers_unblock_by_func (GTK_ACTION (l->data), - G_CALLBACK (language_toggled), - window); - } + for (l = actions; l != NULL; l = l->next) { + g_signal_handlers_unblock_by_func (GTK_ACTION (l->data), G_CALLBACK (language_toggled), window); + } - g_list_free (actions); + g_list_free (actions); } void -_xed_recent_add (XedWindow *window, - const gchar *uri, - const gchar *mime) +_xed_recent_add (XedWindow *window, const gchar *uri, const gchar *mime) { - GtkRecentManager *recent_manager; - GtkRecentData *recent_data; + GtkRecentManager *recent_manager; + GtkRecentData *recent_data; - static gchar *groups[2] = { - "xed", - NULL - }; + static gchar *groups[2] = { "xed", NULL }; - recent_manager = gtk_recent_manager_get_default (); + recent_manager = gtk_recent_manager_get_default (); - recent_data = g_slice_new (GtkRecentData); + recent_data = g_slice_new (GtkRecentData); - recent_data->display_name = NULL; - recent_data->description = NULL; - recent_data->mime_type = (gchar *) mime; - recent_data->app_name = (gchar *) g_get_application_name (); - recent_data->app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL); - recent_data->groups = groups; - recent_data->is_private = FALSE; + recent_data->display_name = NULL; + recent_data->description = NULL; + recent_data->mime_type = (gchar *) mime; + recent_data->app_name = (gchar *) g_get_application_name (); + recent_data->app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL); + recent_data->groups = groups; + recent_data->is_private = FALSE; - gtk_recent_manager_add_full (recent_manager, - uri, - recent_data); + gtk_recent_manager_add_full (recent_manager, uri, recent_data); - g_free (recent_data->app_exec); + g_free (recent_data->app_exec); - g_slice_free (GtkRecentData, recent_data); + g_slice_free (GtkRecentData, recent_data); } void -_xed_recent_remove (XedWindow *window, - const gchar *uri) +_xed_recent_remove (XedWindow *window, const gchar *uri) { - GtkRecentManager *recent_manager; + GtkRecentManager *recent_manager; - recent_manager = gtk_recent_manager_get_default (); + recent_manager = gtk_recent_manager_get_default (); - gtk_recent_manager_remove_item (recent_manager, uri, NULL); + gtk_recent_manager_remove_item (recent_manager, uri, NULL); } static void -open_recent_file (const gchar *uri, - XedWindow *window) +open_recent_file (const gchar *uri, XedWindow *window) { - GSList *uris = NULL; + GSList *uris = NULL; - uris = g_slist_prepend (uris, (gpointer) uri); + uris = g_slist_prepend (uris, (gpointer) uri); - if (xed_commands_load_uris (window, uris, NULL, 0) != 1) - { - _xed_recent_remove (window, uri); - } + if (xed_commands_load_uris (window, uris, NULL, 0) != 1) { + _xed_recent_remove (window, uri); + } - g_slist_free (uris); + g_slist_free (uris); } static void -recent_chooser_item_activated (GtkRecentChooser *chooser, - XedWindow *window) +recent_chooser_item_activated (GtkRecentChooser *chooser, XedWindow *window) { - gchar *uri; + gchar *uri; - uri = gtk_recent_chooser_get_current_uri (chooser); + uri = gtk_recent_chooser_get_current_uri (chooser); - open_recent_file (uri, window); + open_recent_file (uri, window); - g_free (uri); + g_free (uri); } static void -recents_menu_activate (GtkAction *action, - XedWindow *window) +recents_menu_activate (GtkAction *action, XedWindow *window) { - GtkRecentInfo *info; - const gchar *uri; + GtkRecentInfo *info; + const gchar *uri; - info = g_object_get_data (G_OBJECT (action), "gtk-recent-info"); - g_return_if_fail (info != NULL); + info = g_object_get_data (G_OBJECT (action), "gtk-recent-info"); + g_return_if_fail (info != NULL); - uri = gtk_recent_info_get_uri (info); + uri = gtk_recent_info_get_uri (info); - open_recent_file (uri, window); + open_recent_file (uri, window); } static gint sort_recents_mru (GtkRecentInfo *a, GtkRecentInfo *b) { - return (gtk_recent_info_get_modified (b) - gtk_recent_info_get_modified (a)); + return (gtk_recent_info_get_modified (b) - gtk_recent_info_get_modified (a)); } -static void update_recent_files_menu (XedWindow *window); +static void update_recent_files_menu (XedWindow *window); static void -recent_manager_changed (GtkRecentManager *manager, - XedWindow *window) +recent_manager_changed (GtkRecentManager *manager, XedWindow *window) { - /* regenerate the menu when the model changes */ - update_recent_files_menu (window); + /* regenerate the menu when the model changes */ + update_recent_files_menu (window); } /* @@ -1183,2733 +921,2146 @@ recent_manager_changed (GtkRecentManager *manager, static void update_recent_files_menu (XedWindow *window) { - XedWindowPrivate *p = window->priv; - GtkRecentManager *recent_manager; - gint max_recents; - GList *actions, *l, *items; - GList *filtered_items = NULL; - gint i; + XedWindowPrivate *p = window->priv; + GtkRecentManager *recent_manager; + gint max_recents; + GList *actions, *l, *items; + GList *filtered_items = NULL; + gint i; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - max_recents = xed_prefs_manager_get_max_recents (); + max_recents = xed_prefs_manager_get_max_recents (); - g_return_if_fail (p->recents_action_group != NULL); + g_return_if_fail (p->recents_action_group != NULL); - if (p->recents_menu_ui_id != 0) - gtk_ui_manager_remove_ui (p->manager, - p->recents_menu_ui_id); + if (p->recents_menu_ui_id != 0) { + gtk_ui_manager_remove_ui (p->manager, p->recents_menu_ui_id); + } - actions = gtk_action_group_list_actions (p->recents_action_group); - for (l = actions; l != NULL; l = l->next) - { - g_signal_handlers_disconnect_by_func (GTK_ACTION (l->data), - G_CALLBACK (recents_menu_activate), - window); - gtk_action_group_remove_action (p->recents_action_group, - GTK_ACTION (l->data)); - } - g_list_free (actions); + actions = gtk_action_group_list_actions (p->recents_action_group); + for (l = actions; l != NULL; l = l->next) { + g_signal_handlers_disconnect_by_func (GTK_ACTION (l->data), G_CALLBACK (recents_menu_activate), window); + gtk_action_group_remove_action (p->recents_action_group, GTK_ACTION (l->data)); + } + g_list_free (actions); - p->recents_menu_ui_id = gtk_ui_manager_new_merge_id (p->manager); + p->recents_menu_ui_id = gtk_ui_manager_new_merge_id (p->manager); - recent_manager = gtk_recent_manager_get_default (); - items = gtk_recent_manager_get_items (recent_manager); + recent_manager = gtk_recent_manager_get_default (); + items = gtk_recent_manager_get_items (recent_manager); - /* filter */ - for (l = items; l != NULL; l = l->next) - { - GtkRecentInfo *info = l->data; + /* filter */ + for (l = items; l != NULL; l = l->next) { + GtkRecentInfo *info = l->data; + if (!gtk_recent_info_has_group (info, "xed")) { + continue; + } - if (!gtk_recent_info_has_group (info, "xed")) - continue; + filtered_items = g_list_prepend (filtered_items, info); + } - filtered_items = g_list_prepend (filtered_items, info); - } + /* sort */ + filtered_items = g_list_sort (filtered_items, (GCompareFunc) sort_recents_mru); - /* sort */ - filtered_items = g_list_sort (filtered_items, - (GCompareFunc) sort_recents_mru); + i = 0; + for (l = filtered_items; l != NULL; l = l->next) { + gchar *action_name; + const gchar *display_name; + gchar *escaped; + gchar *label; + gchar *uri; + gchar *ruri; + gchar *tip; + GtkAction *action; + GtkRecentInfo *info = l->data; - i = 0; - for (l = filtered_items; l != NULL; l = l->next) - { - gchar *action_name; - const gchar *display_name; - gchar *escaped; - gchar *label; - gchar *uri; - gchar *ruri; - gchar *tip; - GtkAction *action; - GtkRecentInfo *info = l->data; + /* clamp */ + if (i >= max_recents) { + break; + } - /* clamp */ - if (i >= max_recents) - break; + i++; - i++; + action_name = g_strdup_printf ("recent-info-%d", i); - action_name = g_strdup_printf ("recent-info-%d", i); + display_name = gtk_recent_info_get_display_name (info); + escaped = xed_utils_escape_underscores (display_name, -1); + if (i >= 10) { + label = g_strdup_printf ("%d. %s", i, escaped); + } + else + label = g_strdup_printf ("_%d. %s", i, escaped); + g_free (escaped); - display_name = gtk_recent_info_get_display_name (info); - escaped = xed_utils_escape_underscores (display_name, -1); - if (i >= 10) - label = g_strdup_printf ("%d. %s", - i, - escaped); - else - label = g_strdup_printf ("_%d. %s", - i, - escaped); - g_free (escaped); + /* gtk_recent_info_get_uri_display (info) is buggy and + * works only for local files */ + uri = xed_utils_uri_for_display (gtk_recent_info_get_uri (info)); + ruri = xed_utils_replace_home_dir_with_tilde (uri); + g_free (uri); - /* gtk_recent_info_get_uri_display (info) is buggy and - * works only for local files */ - uri = xed_utils_uri_for_display (gtk_recent_info_get_uri (info)); - ruri = xed_utils_replace_home_dir_with_tilde (uri); - g_free (uri); + /* Translators: %s is a URI */ + tip = g_strdup_printf (_("Open '%s'"), ruri); + g_free (ruri); - /* Translators: %s is a URI */ - tip = g_strdup_printf (_("Open '%s'"), ruri); - g_free (ruri); + action = gtk_action_new (action_name, label, tip, NULL); - action = gtk_action_new (action_name, - label, - tip, - NULL); + g_object_set_data_full (G_OBJECT (action), + "gtk-recent-info", gtk_recent_info_ref (info), (GDestroyNotify) gtk_recent_info_unref); - g_object_set_data_full (G_OBJECT (action), - "gtk-recent-info", - gtk_recent_info_ref (info), - (GDestroyNotify) gtk_recent_info_unref); + g_signal_connect (action, "activate", G_CALLBACK (recents_menu_activate), window); - g_signal_connect (action, - "activate", - G_CALLBACK (recents_menu_activate), - window); + gtk_action_group_add_action (p->recents_action_group, action); + g_object_unref (action); - gtk_action_group_add_action (p->recents_action_group, - action); - g_object_unref (action); + gtk_ui_manager_add_ui (p->manager, p->recents_menu_ui_id, + "/MenuBar/FileMenu/FileRecentsPlaceholder", + action_name, action_name, GTK_UI_MANAGER_MENUITEM, FALSE); - gtk_ui_manager_add_ui (p->manager, - p->recents_menu_ui_id, - "/MenuBar/FileMenu/FileRecentsPlaceholder", - action_name, - action_name, - GTK_UI_MANAGER_MENUITEM, - FALSE); + g_free (action_name); + g_free (label); + g_free (tip); + } - g_free (action_name); - g_free (label); - g_free (tip); - } + g_list_free (filtered_items); - g_list_free (filtered_items); - - g_list_foreach (items, (GFunc) gtk_recent_info_unref, NULL); - g_list_free (items); + g_list_foreach (items, (GFunc) gtk_recent_info_unref, NULL); + g_list_free (items); } static void set_non_homogeneus (GtkWidget *widget, gpointer data) { - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE); + gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE); } static void -toolbar_visibility_changed (GtkWidget *toolbar, - XedWindow *window) +toolbar_visibility_changed (GtkWidget *toolbar, XedWindow *window) { - gboolean visible; - GtkAction *action; + gboolean visible; + GtkAction *action; - visible = gtk_widget_get_visible (toolbar); + visible = gtk_widget_get_visible (toolbar); - if (xed_prefs_manager_toolbar_visible_can_set ()) - xed_prefs_manager_set_toolbar_visible (visible); + if (xed_prefs_manager_toolbar_visible_can_set ()) { + xed_prefs_manager_set_toolbar_visible (visible); + } - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "ViewToolbar"); + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "ViewToolbar"); - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + } } static GtkWidget * -setup_toolbar_open_button (XedWindow *window, - GtkWidget *toolbar) +setup_toolbar_open_button (XedWindow *window, GtkWidget *toolbar) { - GtkRecentManager *recent_manager; - GtkRecentFilter *filter; - GtkWidget *toolbar_recent_menu; - GtkToolItem *open_button; - GtkAction *action; + GtkRecentManager *recent_manager; + GtkRecentFilter *filter; + GtkWidget *toolbar_recent_menu; + GtkToolItem *open_button; + GtkAction *action; - recent_manager = gtk_recent_manager_get_default (); + recent_manager = gtk_recent_manager_get_default (); - /* recent files menu tool button */ - toolbar_recent_menu = gtk_recent_chooser_menu_new_for_manager (recent_manager); + /* recent files menu tool button */ + toolbar_recent_menu = gtk_recent_chooser_menu_new_for_manager (recent_manager); - gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER (toolbar_recent_menu), - FALSE); - gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (toolbar_recent_menu), - GTK_RECENT_SORT_MRU); - gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (toolbar_recent_menu), - xed_prefs_manager_get_max_recents ()); + gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER (toolbar_recent_menu), FALSE); + gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (toolbar_recent_menu), GTK_RECENT_SORT_MRU); + gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (toolbar_recent_menu), xed_prefs_manager_get_max_recents ()); - filter = gtk_recent_filter_new (); - gtk_recent_filter_add_group (filter, "xed"); - gtk_recent_chooser_set_filter (GTK_RECENT_CHOOSER (toolbar_recent_menu), - filter); + filter = gtk_recent_filter_new (); + gtk_recent_filter_add_group (filter, "xed"); + gtk_recent_chooser_set_filter (GTK_RECENT_CHOOSER (toolbar_recent_menu), filter); - g_signal_connect (toolbar_recent_menu, - "item_activated", - G_CALLBACK (recent_chooser_item_activated), - window); - - /* add the custom Open button to the toolbar */ - open_button = gtk_menu_tool_button_new_from_stock (GTK_STOCK_OPEN); - gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (open_button), - toolbar_recent_menu); + g_signal_connect (toolbar_recent_menu, "item_activated", G_CALLBACK (recent_chooser_item_activated), window); - gtk_tool_item_set_tooltip_text (open_button, _("Open a file")); - gtk_menu_tool_button_set_arrow_tooltip_text (GTK_MENU_TOOL_BUTTON (open_button), - _("Open a recently used file")); + /* add the custom Open button to the toolbar */ + open_button = gtk_menu_tool_button_new_from_stock (GTK_STOCK_OPEN); + gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (open_button), toolbar_recent_menu); - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "FileOpen"); - g_object_set (action, - "short_label", _("Open"), - NULL); - gtk_activatable_set_related_action (GTK_ACTIVATABLE (open_button), - action); + gtk_tool_item_set_tooltip_text (open_button, _("Open a file")); + gtk_menu_tool_button_set_arrow_tooltip_text (GTK_MENU_TOOL_BUTTON (open_button), _("Open a recently used file")); - gtk_toolbar_insert (GTK_TOOLBAR (toolbar), - open_button, - 1); - - return toolbar_recent_menu; + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "FileOpen"); + g_object_set (action, "short_label", _("Open"), NULL); + gtk_activatable_set_related_action (GTK_ACTIVATABLE (open_button), action); + + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), open_button, 1); + + return toolbar_recent_menu; } static void -create_menu_bar_and_toolbar (XedWindow *window, - GtkWidget *main_box) +create_menu_bar_and_toolbar (XedWindow *window, GtkWidget *main_box) { - GtkActionGroup *action_group; - GtkAction *action; - GtkUIManager *manager; - GtkRecentManager *recent_manager; - GError *error = NULL; - gchar *ui_file; + GtkActionGroup *action_group; + GtkAction *action; + GtkUIManager *manager; + GtkRecentManager *recent_manager; + GError *error = NULL; + gchar *ui_file; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - manager = gtk_ui_manager_new (); - window->priv->manager = manager; + manager = gtk_ui_manager_new (); + window->priv->manager = manager; - gtk_window_add_accel_group (GTK_WINDOW (window), - gtk_ui_manager_get_accel_group (manager)); + gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (manager)); - action_group = gtk_action_group_new ("XedWindowAlwaysSensitiveActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - gtk_action_group_add_actions (action_group, - xed_always_sensitive_menu_entries, - G_N_ELEMENTS (xed_always_sensitive_menu_entries), - window); - gtk_action_group_add_toggle_actions (action_group, - xed_always_sensitive_toggle_menu_entries, - G_N_ELEMENTS (xed_always_sensitive_toggle_menu_entries), - window); + action_group = gtk_action_group_new ("XedWindowAlwaysSensitiveActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + gtk_action_group_add_actions (action_group, xed_always_sensitive_menu_entries, + G_N_ELEMENTS (xed_always_sensitive_menu_entries), window); + gtk_action_group_add_toggle_actions (action_group, xed_always_sensitive_toggle_menu_entries, + G_N_ELEMENTS (xed_always_sensitive_toggle_menu_entries), window); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - g_object_unref (action_group); - window->priv->always_sensitive_action_group = action_group; + gtk_ui_manager_insert_action_group (manager, action_group, 0); + g_object_unref (action_group); + window->priv->always_sensitive_action_group = action_group; - action_group = gtk_action_group_new ("XedWindowActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - gtk_action_group_add_actions (action_group, - xed_menu_entries, - G_N_ELEMENTS (xed_menu_entries), - window); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - g_object_unref (action_group); - window->priv->action_group = action_group; + action_group = gtk_action_group_new ("XedWindowActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + gtk_action_group_add_actions (action_group, xed_menu_entries, G_N_ELEMENTS (xed_menu_entries), window); + gtk_ui_manager_insert_action_group (manager, action_group, 0); + g_object_unref (action_group); + window->priv->action_group = action_group; - /* set short labels to use in the toolbar */ - action = gtk_action_group_get_action (action_group, "FileSave"); - g_object_set (action, "short_label", _("Save"), NULL); - action = gtk_action_group_get_action (action_group, "FilePrint"); - g_object_set (action, "short_label", _("Print"), NULL); - action = gtk_action_group_get_action (action_group, "SearchFind"); - g_object_set (action, "short_label", _("Find"), NULL); - action = gtk_action_group_get_action (action_group, "SearchReplace"); - g_object_set (action, "short_label", _("Replace"), NULL); + /* set short labels to use in the toolbar */ + action = gtk_action_group_get_action (action_group, "FileSave"); + g_object_set (action, "short_label", _("Save"), NULL); + action = gtk_action_group_get_action (action_group, "FilePrint"); + g_object_set (action, "short_label", _("Print"), NULL); + action = gtk_action_group_get_action (action_group, "SearchFind"); + g_object_set (action, "short_label", _("Find"), NULL); + action = gtk_action_group_get_action (action_group, "SearchReplace"); + g_object_set (action, "short_label", _("Replace"), NULL); - action_group = gtk_action_group_new ("XedQuitWindowActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - gtk_action_group_add_actions (action_group, - xed_quit_menu_entries, - G_N_ELEMENTS (xed_quit_menu_entries), - window); + action_group = gtk_action_group_new ("XedQuitWindowActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + gtk_action_group_add_actions (action_group, xed_quit_menu_entries, G_N_ELEMENTS (xed_quit_menu_entries), window); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - g_object_unref (action_group); - window->priv->quit_action_group = action_group; + gtk_ui_manager_insert_action_group (manager, action_group, 0); + g_object_unref (action_group); + window->priv->quit_action_group = action_group; - action_group = gtk_action_group_new ("XedCloseWindowActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - gtk_action_group_add_actions (action_group, - xed_close_menu_entries, - G_N_ELEMENTS (xed_close_menu_entries), - window); + action_group = gtk_action_group_new ("XedCloseWindowActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + gtk_action_group_add_actions (action_group, xed_close_menu_entries, G_N_ELEMENTS (xed_close_menu_entries), window); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - g_object_unref (action_group); - window->priv->close_action_group = action_group; + gtk_ui_manager_insert_action_group (manager, action_group, 0); + g_object_unref (action_group); + window->priv->close_action_group = action_group; - action_group = gtk_action_group_new ("XedWindowPanesActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - gtk_action_group_add_toggle_actions (action_group, - xed_panes_toggle_menu_entries, - G_N_ELEMENTS (xed_panes_toggle_menu_entries), - window); + action_group = gtk_action_group_new ("XedWindowPanesActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + gtk_action_group_add_toggle_actions (action_group, xed_panes_toggle_menu_entries, + G_N_ELEMENTS (xed_panes_toggle_menu_entries), window); - gtk_ui_manager_insert_action_group (manager, action_group, 0); - g_object_unref (action_group); - window->priv->panes_action_group = action_group; + gtk_ui_manager_insert_action_group (manager, action_group, 0); + g_object_unref (action_group); + window->priv->panes_action_group = action_group; - /* now load the UI definition */ - ui_file = xed_dirs_get_ui_file (XED_UIFILE); - gtk_ui_manager_add_ui_from_file (manager, ui_file, &error); - if (error != NULL) - { - g_warning ("Could not merge %s: %s", ui_file, error->message); - g_error_free (error); - } - g_free (ui_file); + /* now load the UI definition */ + ui_file = xed_dirs_get_ui_file (XED_UIFILE); + gtk_ui_manager_add_ui_from_file (manager, ui_file, &error); + if (error != NULL) { + g_warning ("Could not merge %s: %s", ui_file, error->message); + g_error_free (error); + } + g_free (ui_file); - /* show tooltips in the statusbar */ - g_signal_connect (manager, - "connect_proxy", - G_CALLBACK (connect_proxy_cb), - window); - g_signal_connect (manager, - "disconnect_proxy", - G_CALLBACK (disconnect_proxy_cb), - window); + /* show tooltips in the statusbar */ + g_signal_connect (manager, "connect_proxy", G_CALLBACK (connect_proxy_cb), window); + g_signal_connect (manager, "disconnect_proxy", G_CALLBACK (disconnect_proxy_cb), window); - /* recent files menu */ - action_group = gtk_action_group_new ("RecentFilesActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - window->priv->recents_action_group = action_group; - gtk_ui_manager_insert_action_group (manager, action_group, 0); - g_object_unref (action_group); + /* recent files menu */ + action_group = gtk_action_group_new ("RecentFilesActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + window->priv->recents_action_group = action_group; + gtk_ui_manager_insert_action_group (manager, action_group, 0); + g_object_unref (action_group); - recent_manager = gtk_recent_manager_get_default (); - window->priv->recents_handler_id = g_signal_connect (recent_manager, - "changed", - G_CALLBACK (recent_manager_changed), - window); - update_recent_files_menu (window); + recent_manager = gtk_recent_manager_get_default (); + window->priv->recents_handler_id = g_signal_connect (recent_manager, "changed", + G_CALLBACK (recent_manager_changed), window); + update_recent_files_menu (window); - /* languages menu */ - action_group = gtk_action_group_new ("LanguagesActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - window->priv->languages_action_group = action_group; - gtk_ui_manager_insert_action_group (manager, action_group, 0); - g_object_unref (action_group); - create_languages_menu (window); + /* languages menu */ + action_group = gtk_action_group_new ("LanguagesActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + window->priv->languages_action_group = action_group; + gtk_ui_manager_insert_action_group (manager, action_group, 0); + g_object_unref (action_group); + create_languages_menu (window); - /* list of open documents menu */ - action_group = gtk_action_group_new ("DocumentsListActions"); - gtk_action_group_set_translation_domain (action_group, NULL); - window->priv->documents_list_action_group = action_group; - gtk_ui_manager_insert_action_group (manager, action_group, 0); - g_object_unref (action_group); + /* list of open documents menu */ + action_group = gtk_action_group_new ("DocumentsListActions"); + gtk_action_group_set_translation_domain (action_group, NULL); + window->priv->documents_list_action_group = action_group; + gtk_ui_manager_insert_action_group (manager, action_group, 0); + g_object_unref (action_group); - window->priv->menubar = gtk_ui_manager_get_widget (manager, "/MenuBar"); - gtk_box_pack_start (GTK_BOX (main_box), - window->priv->menubar, - FALSE, - FALSE, - 0); + window->priv->menubar = gtk_ui_manager_get_widget (manager, "/MenuBar"); + gtk_box_pack_start (GTK_BOX (main_box), window->priv->menubar, FALSE, FALSE, 0); - window->priv->toolbar = gtk_ui_manager_get_widget (manager, "/ToolBar"); - gtk_style_context_add_class (gtk_widget_get_style_context (window->priv->toolbar), - GTK_STYLE_CLASS_PRIMARY_TOOLBAR); - gtk_box_pack_start (GTK_BOX (main_box), - window->priv->toolbar, - FALSE, - FALSE, - 0); + window->priv->toolbar = gtk_ui_manager_get_widget (manager, "/ToolBar"); + gtk_style_context_add_class (gtk_widget_get_style_context (window->priv->toolbar), GTK_STYLE_CLASS_PRIMARY_TOOLBAR); + gtk_box_pack_start (GTK_BOX (main_box), window->priv->toolbar, FALSE, FALSE, 0); - set_toolbar_style (window, NULL); - - window->priv->toolbar_recent_menu = setup_toolbar_open_button (window, - window->priv->toolbar); + set_toolbar_style (window, NULL); - gtk_container_foreach (GTK_CONTAINER (window->priv->toolbar), - (GtkCallback)set_non_homogeneus, - NULL); + window->priv->toolbar_recent_menu = setup_toolbar_open_button (window, window->priv->toolbar); - g_signal_connect_after (G_OBJECT (window->priv->toolbar), - "show", - G_CALLBACK (toolbar_visibility_changed), - window); - g_signal_connect_after (G_OBJECT (window->priv->toolbar), - "hide", - G_CALLBACK (toolbar_visibility_changed), - window); + gtk_container_foreach (GTK_CONTAINER (window->priv->toolbar), (GtkCallback)set_non_homogeneus, NULL); + + g_signal_connect_after (G_OBJECT (window->priv->toolbar), "show", G_CALLBACK (toolbar_visibility_changed), window); + g_signal_connect_after (G_OBJECT (window->priv->toolbar), "hide", G_CALLBACK (toolbar_visibility_changed), window); } static void -documents_list_menu_activate (GtkToggleAction *action, - XedWindow *window) +documents_list_menu_activate (GtkToggleAction *action, XedWindow *window) { - gint n; - - if (gtk_toggle_action_get_active (action) == FALSE) - return; - - n = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action)); - gtk_notebook_set_current_page (GTK_NOTEBOOK (window->priv->notebook), n); + gint n; + if (gtk_toggle_action_get_active (action) == FALSE) { + return; + } + n = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action)); + gtk_notebook_set_current_page (GTK_NOTEBOOK (window->priv->notebook), n); } static gchar * get_menu_tip_for_tab (XedTab *tab) { - XedDocument *doc; - gchar *uri; - gchar *ruri; - gchar *tip; + XedDocument *doc; + gchar *uri; + gchar *ruri; + gchar *tip; - doc = xed_tab_get_document (tab); + doc = xed_tab_get_document (tab); - uri = xed_document_get_uri_for_display (doc); - ruri = xed_utils_replace_home_dir_with_tilde (uri); - g_free (uri); + uri = xed_document_get_uri_for_display (doc); + ruri = xed_utils_replace_home_dir_with_tilde (uri); + g_free (uri); - /* Translators: %s is a URI */ - tip = g_strdup_printf (_("Activate '%s'"), ruri); - g_free (ruri); - - return tip; + /* Translators: %s is a URI */ + tip = g_strdup_printf (_("Activate '%s'"), ruri); + g_free (ruri); + + return tip; } static void update_documents_list_menu (XedWindow *window) { - XedWindowPrivate *p = window->priv; - GList *actions, *l; - gint n, i; - guint id; - GSList *group = NULL; + XedWindowPrivate *p = window->priv; + GList *actions, *l; + gint n, i; + guint id; + GSList *group = NULL; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - g_return_if_fail (p->documents_list_action_group != NULL); + g_return_if_fail (p->documents_list_action_group != NULL); - if (p->documents_list_menu_ui_id != 0) - gtk_ui_manager_remove_ui (p->manager, - p->documents_list_menu_ui_id); + if (p->documents_list_menu_ui_id != 0) { + gtk_ui_manager_remove_ui (p->manager, p->documents_list_menu_ui_id); + } - actions = gtk_action_group_list_actions (p->documents_list_action_group); - for (l = actions; l != NULL; l = l->next) - { - g_signal_handlers_disconnect_by_func (GTK_ACTION (l->data), - G_CALLBACK (documents_list_menu_activate), - window); - gtk_action_group_remove_action (p->documents_list_action_group, - GTK_ACTION (l->data)); - } - g_list_free (actions); + actions = gtk_action_group_list_actions (p->documents_list_action_group); + for (l = actions; l != NULL; l = l->next) { + g_signal_handlers_disconnect_by_func (GTK_ACTION (l->data), G_CALLBACK (documents_list_menu_activate), window); + gtk_action_group_remove_action (p->documents_list_action_group, GTK_ACTION (l->data)); + } + g_list_free (actions); - n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (p->notebook)); + n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (p->notebook)); - id = (n > 0) ? gtk_ui_manager_new_merge_id (p->manager) : 0; + id = (n > 0) ? gtk_ui_manager_new_merge_id (p->manager) : 0; - for (i = 0; i < n; i++) - { - GtkWidget *tab; - GtkRadioAction *action; - gchar *action_name; - gchar *tab_name; - gchar *name; - gchar *tip; - gchar *accel; + for (i = 0; i < n; i++) { + GtkWidget *tab; + GtkRadioAction *action; + gchar *action_name; + gchar *tab_name; + gchar *name; + gchar *tip; + gchar *accel; - tab = gtk_notebook_get_nth_page (GTK_NOTEBOOK (p->notebook), i); + tab = gtk_notebook_get_nth_page (GTK_NOTEBOOK (p->notebook), i); - /* NOTE: the action is associated to the position of the tab in - * the notebook not to the tab itself! This is needed to work - * around the gtk+ bug #170727: gtk leaves around the accels - * of the action. Since the accel depends on the tab position - * the problem is worked around, action with the same name always - * get the same accel. - */ - action_name = g_strdup_printf ("Tab_%d", i); - tab_name = _xed_tab_get_name (XED_TAB (tab)); - name = xed_utils_escape_underscores (tab_name, -1); - tip = get_menu_tip_for_tab (XED_TAB (tab)); + /* NOTE: the action is associated to the position of the tab in + * the notebook not to the tab itself! This is needed to work + * around the gtk+ bug #170727: gtk leaves around the accels + * of the action. Since the accel depends on the tab position + * the problem is worked around, action with the same name always + * get the same accel. + */ + action_name = g_strdup_printf ("Tab_%d", i); + tab_name = _xed_tab_get_name (XED_TAB (tab)); + name = xed_utils_escape_underscores (tab_name, -1); + tip = get_menu_tip_for_tab (XED_TAB (tab)); - /* alt + 1, 2, 3... 0 to switch to the first ten tabs */ - accel = (i < 10) ? g_strdup_printf ("%d", (i + 1) % 10) : NULL; + /* alt + 1, 2, 3... 0 to switch to the first ten tabs */ + accel = (i < 10) ? g_strdup_printf ("%d", (i + 1) % 10) : NULL; - action = gtk_radio_action_new (action_name, - name, - tip, - NULL, - i); + action = gtk_radio_action_new (action_name, name, tip, NULL, i); - if (group != NULL) - gtk_radio_action_set_group (action, group); + if (group != NULL) { + gtk_radio_action_set_group (action, group); + } - /* note that group changes each time we add an action, so it must be updated */ - group = gtk_radio_action_get_group (action); + /* note that group changes each time we add an action, so it must be updated */ + group = gtk_radio_action_get_group (action); - gtk_action_group_add_action_with_accel (p->documents_list_action_group, - GTK_ACTION (action), - accel); + gtk_action_group_add_action_with_accel (p->documents_list_action_group, GTK_ACTION (action), accel); - g_signal_connect (action, - "activate", - G_CALLBACK (documents_list_menu_activate), - window); + g_signal_connect (action, "activate", G_CALLBACK (documents_list_menu_activate), window); - gtk_ui_manager_add_ui (p->manager, - id, - "/MenuBar/DocumentsMenu/DocumentsListPlaceholder", - action_name, action_name, - GTK_UI_MANAGER_MENUITEM, - FALSE); + gtk_ui_manager_add_ui (p->manager, id, "/MenuBar/DocumentsMenu/DocumentsListPlaceholder", + action_name, action_name, GTK_UI_MANAGER_MENUITEM, FALSE); - if (XED_TAB (tab) == p->active_tab) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + if (XED_TAB (tab) == p->active_tab) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + } - g_object_unref (action); + g_object_unref (action); - g_free (action_name); - g_free (tab_name); - g_free (name); - g_free (tip); - g_free (accel); - } + g_free (action_name); + g_free (tab_name); + g_free (name); + g_free (tip); + g_free (accel); + } - p->documents_list_menu_ui_id = id; + p->documents_list_menu_ui_id = id; } /* Returns TRUE if status bar is visible */ static gboolean -set_statusbar_style (XedWindow *window, - XedWindow *origin) +set_statusbar_style (XedWindow *window, XedWindow *origin) { - GtkAction *action; - - gboolean visible; + GtkAction *action; + gboolean visible; + if (origin == NULL) { + visible = xed_prefs_manager_get_statusbar_visible (); + } + else { + visible = gtk_widget_get_visible (origin->priv->statusbar); + } - if (origin == NULL) - visible = xed_prefs_manager_get_statusbar_visible (); - else - visible = gtk_widget_get_visible (origin->priv->statusbar); + if (visible) { + gtk_widget_show (window->priv->statusbar); + } + else { + gtk_widget_hide (window->priv->statusbar); + } - if (visible) - gtk_widget_show (window->priv->statusbar); - else - gtk_widget_hide (window->priv->statusbar); + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "ViewStatusbar"); - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "ViewStatusbar"); - - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); - - return visible; + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + } + + return visible; } static void -statusbar_visibility_changed (GtkWidget *statusbar, - XedWindow *window) +statusbar_visibility_changed (GtkWidget *statusbar, XedWindow *window) { - gboolean visible; - GtkAction *action; + gboolean visible; + GtkAction *action; - visible = gtk_widget_get_visible (statusbar); + visible = gtk_widget_get_visible (statusbar); - if (xed_prefs_manager_statusbar_visible_can_set ()) - xed_prefs_manager_set_statusbar_visible (visible); + if (xed_prefs_manager_statusbar_visible_can_set ()) { + xed_prefs_manager_set_statusbar_visible (visible); + } - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "ViewStatusbar"); + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "ViewStatusbar"); - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + } } static void -tab_width_combo_changed (XedStatusComboBox *combo, - GtkMenuItem *item, - XedWindow *window) +tab_width_combo_changed (XedStatusComboBox *combo, GtkMenuItem *item, XedWindow *window) { - XedView *view; - guint width_data = 0; - - view = xed_window_get_active_view (window); - - if (!view) - return; - - width_data = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), TAB_WIDTH_DATA)); - - if (width_data == 0) - return; - - g_signal_handler_block (view, window->priv->tab_width_id); - gtk_source_view_set_tab_width (GTK_SOURCE_VIEW (view), width_data); - g_signal_handler_unblock (view, window->priv->tab_width_id); + XedView *view; + guint width_data = 0; + + view = xed_window_get_active_view (window); + + if (!view) { + return; + } + + width_data = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), TAB_WIDTH_DATA)); + + if (width_data == 0) { + return; + } + + g_signal_handler_block (view, window->priv->tab_width_id); + gtk_source_view_set_tab_width (GTK_SOURCE_VIEW (view), width_data); + g_signal_handler_unblock (view, window->priv->tab_width_id); } static void -use_spaces_toggled (GtkCheckMenuItem *item, - XedWindow *window) +use_spaces_toggled (GtkCheckMenuItem *item, XedWindow *window) { - XedView *view; - - view = xed_window_get_active_view (window); - - g_signal_handler_block (view, window->priv->spaces_instead_of_tabs_id); - gtk_source_view_set_insert_spaces_instead_of_tabs ( - GTK_SOURCE_VIEW (view), - gtk_check_menu_item_get_active (item)); - g_signal_handler_unblock (view, window->priv->spaces_instead_of_tabs_id); + XedView *view; + + view = xed_window_get_active_view (window); + + g_signal_handler_block (view, window->priv->spaces_instead_of_tabs_id); + gtk_source_view_set_insert_spaces_instead_of_tabs (GTK_SOURCE_VIEW (view), gtk_check_menu_item_get_active (item)); + g_signal_handler_unblock (view, window->priv->spaces_instead_of_tabs_id); } static void -language_combo_changed (XedStatusComboBox *combo, - GtkMenuItem *item, - XedWindow *window) +language_combo_changed (XedStatusComboBox *combo, GtkMenuItem *item, XedWindow *window) { - XedDocument *doc; - GtkSourceLanguage *language; - - doc = xed_window_get_active_document (window); - - if (!doc) - return; - - language = GTK_SOURCE_LANGUAGE (g_object_get_data (G_OBJECT (item), LANGUAGE_DATA)); - - g_signal_handler_block (doc, window->priv->language_changed_id); - xed_document_set_language (doc, language); - g_signal_handler_unblock (doc, window->priv->language_changed_id); + XedDocument *doc; + GtkSourceLanguage *language; + + doc = xed_window_get_active_document (window); + + if (!doc) { + return; + } + + language = GTK_SOURCE_LANGUAGE (g_object_get_data (G_OBJECT (item), LANGUAGE_DATA)); + + g_signal_handler_block (doc, window->priv->language_changed_id); + xed_document_set_language (doc, language); + g_signal_handler_unblock (doc, window->priv->language_changed_id); } typedef struct { - const gchar *label; - guint width; + const gchar *label; + guint width; } TabWidthDefinition; - + static void fill_tab_width_combo (XedWindow *window) { - static TabWidthDefinition defs[] = { - {"2", 2}, - {"4", 4}, - {"8", 8}, - {"", 0}, /* custom size */ - {NULL, 0} - }; - - XedStatusComboBox *combo = XED_STATUS_COMBO_BOX (window->priv->tab_width_combo); - guint i = 0; - GtkWidget *item; - - while (defs[i].label != NULL) - { - item = gtk_menu_item_new_with_label (defs[i].label); - g_object_set_data (G_OBJECT (item), TAB_WIDTH_DATA, GINT_TO_POINTER (defs[i].width)); - - xed_status_combo_box_add_item (combo, - GTK_MENU_ITEM (item), - defs[i].label); + static TabWidthDefinition defs[] = { + {"2", 2}, + {"4", 4}, + {"8", 8}, + {"", 0}, /* custom size */ + {NULL, 0} + }; - if (defs[i].width != 0) - gtk_widget_show (item); + XedStatusComboBox *combo = XED_STATUS_COMBO_BOX (window->priv->tab_width_combo); + guint i = 0; + GtkWidget *item; - ++i; - } - - item = gtk_separator_menu_item_new (); - xed_status_combo_box_add_item (combo, GTK_MENU_ITEM (item), NULL); - gtk_widget_show (item); - - item = gtk_check_menu_item_new_with_label (_("Use Spaces")); - xed_status_combo_box_add_item (combo, GTK_MENU_ITEM (item), NULL); - gtk_widget_show (item); - - g_signal_connect (item, - "toggled", - G_CALLBACK (use_spaces_toggled), - window); + while (defs[i].label != NULL) { + item = gtk_menu_item_new_with_label (defs[i].label); + g_object_set_data (G_OBJECT (item), TAB_WIDTH_DATA, GINT_TO_POINTER (defs[i].width)); + + xed_status_combo_box_add_item (combo, GTK_MENU_ITEM (item), defs[i].label); + + if (defs[i].width != 0) { + gtk_widget_show (item); + } + + ++i; + } + + item = gtk_separator_menu_item_new (); + xed_status_combo_box_add_item (combo, GTK_MENU_ITEM (item), NULL); + gtk_widget_show (item); + + item = gtk_check_menu_item_new_with_label (_("Use Spaces")); + xed_status_combo_box_add_item (combo, GTK_MENU_ITEM (item), NULL); + gtk_widget_show (item); + + g_signal_connect (item, "toggled", G_CALLBACK (use_spaces_toggled), window); } static void fill_language_combo (XedWindow *window) { - GtkSourceLanguageManager *manager; - GSList *languages; - GSList *item; - GtkWidget *menu_item; - const gchar *name; - - manager = xed_get_language_manager (); - languages = xed_language_manager_list_languages_sorted (manager, FALSE); + GtkSourceLanguageManager *manager; + GSList *languages; + GSList *item; + GtkWidget *menu_item; + const gchar *name; - name = _("Plain Text"); - menu_item = gtk_menu_item_new_with_label (name); - gtk_widget_show (menu_item); - - g_object_set_data (G_OBJECT (menu_item), LANGUAGE_DATA, NULL); - xed_status_combo_box_add_item (XED_STATUS_COMBO_BOX (window->priv->language_combo), - GTK_MENU_ITEM (menu_item), - name); + manager = xed_get_language_manager (); + languages = xed_language_manager_list_languages_sorted (manager, FALSE); - for (item = languages; item; item = item->next) - { - GtkSourceLanguage *lang = GTK_SOURCE_LANGUAGE (item->data); - - name = gtk_source_language_get_name (lang); - menu_item = gtk_menu_item_new_with_label (name); - gtk_widget_show (menu_item); - - g_object_set_data_full (G_OBJECT (menu_item), - LANGUAGE_DATA, - g_object_ref (lang), - (GDestroyNotify)g_object_unref); + name = _("Plain Text"); + menu_item = gtk_menu_item_new_with_label (name); + gtk_widget_show (menu_item); - xed_status_combo_box_add_item (XED_STATUS_COMBO_BOX (window->priv->language_combo), - GTK_MENU_ITEM (menu_item), - name); - } - - g_slist_free (languages); + g_object_set_data (G_OBJECT (menu_item), LANGUAGE_DATA, NULL); + xed_status_combo_box_add_item ( + XED_STATUS_COMBO_BOX (window->priv->language_combo), GTK_MENU_ITEM (menu_item), name); + + for (item = languages; item; item = item->next) { + GtkSourceLanguage *lang = GTK_SOURCE_LANGUAGE (item->data); + name = gtk_source_language_get_name (lang); + menu_item = gtk_menu_item_new_with_label (name); + gtk_widget_show (menu_item); + g_object_set_data_full ( + G_OBJECT (menu_item), LANGUAGE_DATA, g_object_ref (lang), (GDestroyNotify)g_object_unref); + xed_status_combo_box_add_item ( + XED_STATUS_COMBO_BOX (window->priv->language_combo), GTK_MENU_ITEM (menu_item), name); + } + + g_slist_free (languages); } static void -create_statusbar (XedWindow *window, - GtkWidget *main_box) +create_statusbar (XedWindow *window, + GtkWidget *main_box) { - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - window->priv->statusbar = xed_statusbar_new (); + window->priv->statusbar = xed_statusbar_new (); + window->priv->searchbar = xed_searchbar_new (window, TRUE); - window->priv->generic_message_cid = gtk_statusbar_get_context_id - (GTK_STATUSBAR (window->priv->statusbar), "generic_message"); - window->priv->tip_message_cid = gtk_statusbar_get_context_id - (GTK_STATUSBAR (window->priv->statusbar), "tip_message"); + window->priv->generic_message_cid = + gtk_statusbar_get_context_id (GTK_STATUSBAR (window->priv->statusbar), "generic_message"); + window->priv->tip_message_cid = + gtk_statusbar_get_context_id(GTK_STATUSBAR (window->priv->statusbar), "tip_message"); - gtk_box_pack_end (GTK_BOX (main_box), - window->priv->statusbar, - FALSE, - TRUE, - 0); + gtk_box_pack_end (GTK_BOX (main_box), window->priv->statusbar, FALSE, TRUE, 0); - window->priv->tab_width_combo = xed_status_combo_box_new (_("Tab Width")); - gtk_widget_show (window->priv->tab_width_combo); - gtk_box_pack_end (GTK_BOX (window->priv->statusbar), - window->priv->tab_width_combo, - FALSE, - TRUE, - 0); + window->priv->tab_width_combo = xed_status_combo_box_new (_("Tab Width")); + gtk_widget_show (window->priv->tab_width_combo); + gtk_box_pack_end (GTK_BOX (window->priv->statusbar), window->priv->tab_width_combo, FALSE, TRUE, 0); - fill_tab_width_combo (window); + fill_tab_width_combo (window); - g_signal_connect (G_OBJECT (window->priv->tab_width_combo), - "changed", - G_CALLBACK (tab_width_combo_changed), - window); - - window->priv->language_combo = xed_status_combo_box_new (NULL); - gtk_widget_show (window->priv->language_combo); - gtk_box_pack_end (GTK_BOX (window->priv->statusbar), - window->priv->language_combo, - FALSE, - TRUE, - 0); + g_signal_connect (G_OBJECT (window->priv->tab_width_combo), "changed", + G_CALLBACK (tab_width_combo_changed), window); - fill_language_combo (window); + window->priv->language_combo = xed_status_combo_box_new (NULL); + gtk_widget_show (window->priv->language_combo); + gtk_box_pack_end (GTK_BOX (window->priv->statusbar), window->priv->language_combo, FALSE, TRUE, 0); - g_signal_connect (G_OBJECT (window->priv->language_combo), - "changed", - G_CALLBACK (language_combo_changed), - window); + fill_language_combo (window); - g_signal_connect_after (G_OBJECT (window->priv->statusbar), - "show", - G_CALLBACK (statusbar_visibility_changed), - window); - g_signal_connect_after (G_OBJECT (window->priv->statusbar), - "hide", - G_CALLBACK (statusbar_visibility_changed), - window); + g_signal_connect (G_OBJECT (window->priv->language_combo), "changed", + G_CALLBACK (language_combo_changed), window); + + g_signal_connect_after (G_OBJECT (window->priv->statusbar), "show", + G_CALLBACK (statusbar_visibility_changed), window); + + g_signal_connect_after (G_OBJECT (window->priv->statusbar), "hide", + G_CALLBACK (statusbar_visibility_changed), window); + + set_statusbar_style (window, NULL); + + gtk_box_pack_end (GTK_BOX (main_box), window->priv->searchbar, FALSE, FALSE, 0); - set_statusbar_style (window, NULL); } static XedWindow * clone_window (XedWindow *origin) { - XedWindow *window; - GdkScreen *screen; - XedApp *app; - gint panel_page; + XedWindow *window; + GdkScreen *screen; + XedApp *app; + gint panel_page; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - app = xed_app_get_default (); + app = xed_app_get_default (); - screen = gtk_window_get_screen (GTK_WINDOW (origin)); - window = xed_app_create_window (app, screen); + screen = gtk_window_get_screen (GTK_WINDOW (origin)); + window = xed_app_create_window (app, screen); - if ((origin->priv->window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0) - { - gint w, h; + if ((origin->priv->window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0) { + gint w, h; + xed_prefs_manager_get_default_window_size (&w, &h); + gtk_window_set_default_size (GTK_WINDOW (window), w, h); + gtk_window_maximize (GTK_WINDOW (window)); + } + else { + gtk_window_set_default_size (GTK_WINDOW (window), origin->priv->width, origin->priv->height); + gtk_window_unmaximize (GTK_WINDOW (window)); + } - xed_prefs_manager_get_default_window_size (&w, &h); - gtk_window_set_default_size (GTK_WINDOW (window), w, h); - gtk_window_maximize (GTK_WINDOW (window)); - } - else - { - gtk_window_set_default_size (GTK_WINDOW (window), - origin->priv->width, - origin->priv->height); + if ((origin->priv->window_state & GDK_WINDOW_STATE_STICKY ) != 0) { + gtk_window_stick (GTK_WINDOW (window)); + } + else { + gtk_window_unstick (GTK_WINDOW (window)); + } - gtk_window_unmaximize (GTK_WINDOW (window)); - } + /* set the panes size, the paned position will be set when + * they are mapped */ + window->priv->side_panel_size = origin->priv->side_panel_size; + window->priv->bottom_panel_size = origin->priv->bottom_panel_size; - if ((origin->priv->window_state & GDK_WINDOW_STATE_STICKY ) != 0) - gtk_window_stick (GTK_WINDOW (window)); - else - gtk_window_unstick (GTK_WINDOW (window)); + panel_page = _xed_panel_get_active_item_id (XED_PANEL (origin->priv->side_panel)); + _xed_panel_set_active_item_by_id (XED_PANEL (window->priv->side_panel), panel_page); - /* set the panes size, the paned position will be set when - * they are mapped */ - window->priv->side_panel_size = origin->priv->side_panel_size; - window->priv->bottom_panel_size = origin->priv->bottom_panel_size; + panel_page = _xed_panel_get_active_item_id (XED_PANEL (origin->priv->bottom_panel)); + _xed_panel_set_active_item_by_id (XED_PANEL (window->priv->bottom_panel), panel_page); - panel_page = _xed_panel_get_active_item_id (XED_PANEL (origin->priv->side_panel)); - _xed_panel_set_active_item_by_id (XED_PANEL (window->priv->side_panel), - panel_page); + if (gtk_widget_get_visible (origin->priv->side_panel)) { + gtk_widget_show (window->priv->side_panel); + } + else { + gtk_widget_hide (window->priv->side_panel); + } - panel_page = _xed_panel_get_active_item_id (XED_PANEL (origin->priv->bottom_panel)); - _xed_panel_set_active_item_by_id (XED_PANEL (window->priv->bottom_panel), - panel_page); + if (gtk_widget_get_visible (origin->priv->bottom_panel)) { + gtk_widget_show (window->priv->bottom_panel); + } + else { + gtk_widget_hide (window->priv->bottom_panel); + } - if (gtk_widget_get_visible (origin->priv->side_panel)) - gtk_widget_show (window->priv->side_panel); - else - gtk_widget_hide (window->priv->side_panel); + set_statusbar_style (window, origin); + set_toolbar_style (window, origin); - if (gtk_widget_get_visible (origin->priv->bottom_panel)) - gtk_widget_show (window->priv->bottom_panel); - else - gtk_widget_hide (window->priv->bottom_panel); - - set_statusbar_style (window, origin); - set_toolbar_style (window, origin); - - return window; + return window; } static void -update_cursor_position_statusbar (GtkTextBuffer *buffer, - XedWindow *window) +update_cursor_position_statusbar (GtkTextBuffer *buffer, XedWindow *window) { - gint row, col; - GtkTextIter iter; - GtkTextIter start; - guint tab_size; - XedView *view; + gint row, col; + GtkTextIter iter; + GtkTextIter start; + guint tab_size; + XedView *view; - xed_debug (DEBUG_WINDOW); - - if (buffer != GTK_TEXT_BUFFER (xed_window_get_active_document (window))) - return; - - view = xed_window_get_active_view (window); - - gtk_text_buffer_get_iter_at_mark (buffer, - &iter, - gtk_text_buffer_get_insert (buffer)); - - row = gtk_text_iter_get_line (&iter); - - start = iter; - gtk_text_iter_set_line_offset (&start, 0); - col = 0; + xed_debug (DEBUG_WINDOW); - tab_size = gtk_source_view_get_tab_width (GTK_SOURCE_VIEW (view)); + if (buffer != GTK_TEXT_BUFFER (xed_window_get_active_document (window))) { + return; + } - while (!gtk_text_iter_equal (&start, &iter)) - { - /* FIXME: Are we Unicode compliant here? */ - if (gtk_text_iter_get_char (&start) == '\t') - - col += (tab_size - (col % tab_size)); - else - ++col; + view = xed_window_get_active_view (window); - gtk_text_iter_forward_char (&start); - } - - xed_statusbar_set_cursor_position ( - XED_STATUSBAR (window->priv->statusbar), - row + 1, - col + 1); + gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer)); + + row = gtk_text_iter_get_line (&iter); + + start = iter; + gtk_text_iter_set_line_offset (&start, 0); + col = 0; + + tab_size = gtk_source_view_get_tab_width (GTK_SOURCE_VIEW (view)); + + while (!gtk_text_iter_equal (&start, &iter)) { + /* FIXME: Are we Unicode compliant here? */ + if (gtk_text_iter_get_char (&start) == '\t') { + col += (tab_size - (col % tab_size)); + } + else { + ++col; + } + gtk_text_iter_forward_char (&start); + } + + xed_statusbar_set_cursor_position (XED_STATUSBAR (window->priv->statusbar), row + 1, col + 1); } static void -update_overwrite_mode_statusbar (GtkTextView *view, - XedWindow *window) +update_overwrite_mode_statusbar (GtkTextView *view, XedWindow *window) { - if (view != GTK_TEXT_VIEW (xed_window_get_active_view (window))) - return; - - /* Note that we have to use !gtk_text_view_get_overwrite since we - are in the in the signal handler of "toggle overwrite" that is - G_SIGNAL_RUN_LAST - */ - xed_statusbar_set_overwrite ( - XED_STATUSBAR (window->priv->statusbar), - !gtk_text_view_get_overwrite (view)); + if (view != GTK_TEXT_VIEW (xed_window_get_active_view (window))) { + return; + } + + /* Note that we have to use !gtk_text_view_get_overwrite since we + are in the in the signal handler of "toggle overwrite" that is + G_SIGNAL_RUN_LAST + */ + xed_statusbar_set_overwrite (XED_STATUSBAR (window->priv->statusbar), !gtk_text_view_get_overwrite (view)); } #define MAX_TITLE_LENGTH 100 -static void +static void set_title (XedWindow *window) { - XedDocument *doc = NULL; - gchar *name; - gchar *dirname = NULL; - gchar *title = NULL; - gint len; + XedDocument *doc = NULL; + gchar *name; + gchar *dirname = NULL; + gchar *title = NULL; + gint len; - if (window->priv->active_tab == NULL) - { - gtk_window_set_title (GTK_WINDOW (window), "Xed"); - return; - } + if (window->priv->active_tab == NULL) { + gtk_window_set_title (GTK_WINDOW (window), "Xed"); + return; + } - doc = xed_tab_get_document (window->priv->active_tab); - g_return_if_fail (doc != NULL); + doc = xed_tab_get_document (window->priv->active_tab); + g_return_if_fail (doc != NULL); - name = xed_document_get_short_name_for_display (doc); + name = xed_document_get_short_name_for_display (doc); - len = g_utf8_strlen (name, -1); + len = g_utf8_strlen (name, -1); - /* if the name is awfully long, truncate it and be done with it, - * otherwise also show the directory (ellipsized if needed) - */ - if (len > MAX_TITLE_LENGTH) - { - gchar *tmp; + /* if the name is awfully long, truncate it and be done with it, + * otherwise also show the directory (ellipsized if needed) + */ + if (len > MAX_TITLE_LENGTH) { + gchar *tmp; + tmp = xed_utils_str_middle_truncate (name, MAX_TITLE_LENGTH); + g_free (name); + name = tmp; + } + else { + GFile *file; + file = xed_document_get_location (doc); + if (file != NULL) { + gchar *str; + str = xed_utils_location_get_dirname_for_display (file); + g_object_unref (file); - tmp = xed_utils_str_middle_truncate (name, - MAX_TITLE_LENGTH); - g_free (name); - name = tmp; - } - else - { - GFile *file; + /* use the remaining space for the dir, but use a min of 20 chars + * so that we do not end up with a dirname like "(a...b)". + * This means that in the worst case when the filename is long 99 + * we have a title long 99 + 20, but I think it's a rare enough + * case to be acceptable. It's justa darn title afterall :) + */ + dirname = xed_utils_str_middle_truncate (str, MAX (20, MAX_TITLE_LENGTH - len)); + g_free (str); + } + } - file = xed_document_get_location (doc); - if (file != NULL) - { - gchar *str; + if (gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (doc))) { + gchar *tmp_name; + tmp_name = g_strdup_printf ("*%s", name); + g_free (name); + name = tmp_name; + } - str = xed_utils_location_get_dirname_for_display (file); - g_object_unref (file); + if (xed_document_get_readonly (doc)) { + if (dirname != NULL) { + title = g_strdup_printf ("%s [%s] (%s)", name, _("Read-Only"), dirname); + } + else { + title = g_strdup_printf ("%s [%s]", name, _("Read-Only")); + } + } + else { + if (dirname != NULL) { + title = g_strdup_printf ("%s (%s)", name, dirname); + } + else { + title = g_strdup_printf ("%s", name); + } + } - /* use the remaining space for the dir, but use a min of 20 chars - * so that we do not end up with a dirname like "(a...b)". - * This means that in the worst case when the filename is long 99 - * we have a title long 99 + 20, but I think it's a rare enough - * case to be acceptable. It's justa darn title afterall :) - */ - dirname = xed_utils_str_middle_truncate (str, - MAX (20, MAX_TITLE_LENGTH - len)); - g_free (str); - } - } + gtk_window_set_title (GTK_WINDOW (window), title); - if (gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (doc))) - { - gchar *tmp_name; - - tmp_name = g_strdup_printf ("*%s", name); - g_free (name); - - name = tmp_name; - } - - if (xed_document_get_readonly (doc)) - { - if (dirname != NULL) - title = g_strdup_printf ("%s [%s] (%s)", - name, - _("Read-Only"), - dirname); - else - title = g_strdup_printf ("%s [%s]", - name, - _("Read-Only")); - } - else - { - if (dirname != NULL) - title = g_strdup_printf ("%s (%s)", - name, - dirname); - else - title = g_strdup_printf ("%s", - name); - } - - gtk_window_set_title (GTK_WINDOW (window), title); - - g_free (dirname); - g_free (name); - g_free (title); + g_free (dirname); + g_free (name); + g_free (title); } #undef MAX_TITLE_LENGTH static void -set_tab_width_item_blocked (XedWindow *window, - GtkMenuItem *item) +set_tab_width_item_blocked (XedWindow *window, GtkMenuItem *item) { - g_signal_handlers_block_by_func (window->priv->tab_width_combo, - tab_width_combo_changed, - window); - - xed_status_combo_box_set_item (XED_STATUS_COMBO_BOX (window->priv->tab_width_combo), - item); - - g_signal_handlers_unblock_by_func (window->priv->tab_width_combo, - tab_width_combo_changed, - window); + g_signal_handlers_block_by_func (window->priv->tab_width_combo, tab_width_combo_changed, window); + xed_status_combo_box_set_item (XED_STATUS_COMBO_BOX (window->priv->tab_width_combo), item); + g_signal_handlers_unblock_by_func (window->priv->tab_width_combo, tab_width_combo_changed, window); } static void -spaces_instead_of_tabs_changed (GObject *object, - GParamSpec *pspec, - XedWindow *window) +spaces_instead_of_tabs_changed (GObject *object, GParamSpec *pspec, XedWindow *window) { - XedView *view = XED_VIEW (object); - gboolean active = gtk_source_view_get_insert_spaces_instead_of_tabs ( - GTK_SOURCE_VIEW (view)); - GList *children = xed_status_combo_box_get_items ( - XED_STATUS_COMBO_BOX (window->priv->tab_width_combo)); - GtkCheckMenuItem *item; - - item = GTK_CHECK_MENU_ITEM (g_list_last (children)->data); - - gtk_check_menu_item_set_active (item, active); - - g_list_free (children); + XedView *view = XED_VIEW (object); + gboolean active = gtk_source_view_get_insert_spaces_instead_of_tabs (GTK_SOURCE_VIEW (view)); + GList *children = xed_status_combo_box_get_items (XED_STATUS_COMBO_BOX (window->priv->tab_width_combo)); + GtkCheckMenuItem *item; + item = GTK_CHECK_MENU_ITEM (g_list_last (children)->data); + gtk_check_menu_item_set_active (item, active); + g_list_free (children); } static void -tab_width_changed (GObject *object, - GParamSpec *pspec, - XedWindow *window) +tab_width_changed (GObject *object, GParamSpec *pspec, XedWindow *window) { - GList *items; - GList *item; - XedStatusComboBox *combo = XED_STATUS_COMBO_BOX (window->priv->tab_width_combo); - guint new_tab_width; - gboolean found = FALSE; + GList *items; + GList *item; + XedStatusComboBox *combo = XED_STATUS_COMBO_BOX (window->priv->tab_width_combo); + guint new_tab_width; + gboolean found = FALSE; - items = xed_status_combo_box_get_items (combo); + items = xed_status_combo_box_get_items (combo); - new_tab_width = gtk_source_view_get_tab_width (GTK_SOURCE_VIEW (object)); - - for (item = items; item; item = item->next) - { - guint tab_width = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item->data), TAB_WIDTH_DATA)); - - if (tab_width == new_tab_width) - { - set_tab_width_item_blocked (window, GTK_MENU_ITEM (item->data)); - found = TRUE; - } - - if (GTK_IS_SEPARATOR_MENU_ITEM (item->next->data)) - { - if (!found) - { - /* Set for the last item the custom thing */ - gchar *text; - - text = g_strdup_printf ("%u", new_tab_width); - xed_status_combo_box_set_item_text (combo, - GTK_MENU_ITEM (item->data), - text); + new_tab_width = gtk_source_view_get_tab_width (GTK_SOURCE_VIEW (object)); - gtk_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN (item->data))), - text); - - set_tab_width_item_blocked (window, GTK_MENU_ITEM (item->data)); - gtk_widget_show (GTK_WIDGET (item->data)); - } - else - { - gtk_widget_hide (GTK_WIDGET (item->data)); - } - - break; - } - } - - g_list_free (items); + for (item = items; item; item = item->next) { + guint tab_width = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item->data), TAB_WIDTH_DATA)); + + if (tab_width == new_tab_width) { + set_tab_width_item_blocked (window, GTK_MENU_ITEM (item->data)); + found = TRUE; + } + + if (GTK_IS_SEPARATOR_MENU_ITEM (item->next->data)) { + if (!found) { + /* Set for the last item the custom thing */ + gchar *text; + + text = g_strdup_printf ("%u", new_tab_width); + xed_status_combo_box_set_item_text (combo, GTK_MENU_ITEM (item->data), text); + gtk_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN (item->data))), text); + + set_tab_width_item_blocked (window, GTK_MENU_ITEM (item->data)); + gtk_widget_show (GTK_WIDGET (item->data)); + } + else { + gtk_widget_hide (GTK_WIDGET (item->data)); + } + + break; + } + } + + g_list_free (items); } static void -language_changed (GObject *object, - GParamSpec *pspec, - XedWindow *window) +language_changed (GObject *object, GParamSpec *pspec, XedWindow *window) { - GList *items; - GList *item; - XedStatusComboBox *combo = XED_STATUS_COMBO_BOX (window->priv->language_combo); - GtkSourceLanguage *new_language; - const gchar *new_id; - - items = xed_status_combo_box_get_items (combo); + GList *items; + GList *item; + XedStatusComboBox *combo = XED_STATUS_COMBO_BOX (window->priv->language_combo); + GtkSourceLanguage *new_language; + const gchar *new_id; - new_language = gtk_source_buffer_get_language (GTK_SOURCE_BUFFER (object)); - - if (new_language) - new_id = gtk_source_language_get_id (new_language); - else - new_id = NULL; - - for (item = items; item; item = item->next) - { - GtkSourceLanguage *lang = g_object_get_data (G_OBJECT (item->data), LANGUAGE_DATA); - - if ((new_id == NULL && lang == NULL) || - (new_id != NULL && lang != NULL && strcmp (gtk_source_language_get_id (lang), - new_id) == 0)) - { - g_signal_handlers_block_by_func (window->priv->language_combo, - language_combo_changed, - window); - - xed_status_combo_box_set_item (XED_STATUS_COMBO_BOX (window->priv->language_combo), - GTK_MENU_ITEM (item->data)); + items = xed_status_combo_box_get_items (combo); - g_signal_handlers_unblock_by_func (window->priv->language_combo, - language_combo_changed, - window); - } - } + new_language = gtk_source_buffer_get_language (GTK_SOURCE_BUFFER (object)); - g_list_free (items); + if (new_language) { + new_id = gtk_source_language_get_id (new_language); + } + else { + new_id = NULL; + } + + for (item = items; item; item = item->next) { + GtkSourceLanguage *lang = g_object_get_data (G_OBJECT (item->data), LANGUAGE_DATA); + if ((new_id == NULL && lang == NULL) || + (new_id != NULL && lang != NULL && strcmp (gtk_source_language_get_id (lang), new_id) == 0)) { + g_signal_handlers_block_by_func (window->priv->language_combo, language_combo_changed, window); + xed_status_combo_box_set_item ( + XED_STATUS_COMBO_BOX (window->priv->language_combo), GTK_MENU_ITEM (item->data)); + g_signal_handlers_unblock_by_func (window->priv->language_combo, language_combo_changed, window); + } + } + + g_list_free (items); } -static void -notebook_switch_page (GtkNotebook *book, - GtkWidget *pg, - gint page_num, - XedWindow *window) +static void +notebook_switch_page (GtkNotebook *book, GtkWidget *pg, gint page_num, XedWindow *window) { - XedView *view; - XedTab *tab; - GtkAction *action; - gchar *action_name; - - /* CHECK: I don't know why but it seems notebook_switch_page is called - two times every time the user change the active tab */ - - tab = XED_TAB (gtk_notebook_get_nth_page (book, page_num)); - if (tab == window->priv->active_tab) - return; - - if (window->priv->active_tab) - { - if (window->priv->tab_width_id) - { - g_signal_handler_disconnect (xed_tab_get_view (window->priv->active_tab), - window->priv->tab_width_id); - - window->priv->tab_width_id = 0; - } - - if (window->priv->spaces_instead_of_tabs_id) - { - g_signal_handler_disconnect (xed_tab_get_view (window->priv->active_tab), - window->priv->spaces_instead_of_tabs_id); - - window->priv->spaces_instead_of_tabs_id = 0; - } - } - - /* set the active tab */ - window->priv->active_tab = tab; + XedView *view; + XedTab *tab; + GtkAction *action; + gchar *action_name; - set_title (window); - set_sensitivity_according_to_tab (window, tab); + /* CHECK: I don't know why but it seems notebook_switch_page is called + two times every time the user change the active tab */ - /* activate the right item in the documents menu */ - action_name = g_strdup_printf ("Tab_%d", page_num); - action = gtk_action_group_get_action (window->priv->documents_list_action_group, - action_name); + tab = XED_TAB (gtk_notebook_get_nth_page (book, page_num)); + if (tab == window->priv->active_tab) { + return; + } - /* sometimes the action doesn't exist yet, and the proper action - * is set active during the documents list menu creation - * CHECK: would it be nicer if active_tab was a property and we monitored the notify signal? - */ - if (action != NULL) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + if (window->priv->active_tab) { + if (window->priv->tab_width_id) { + g_signal_handler_disconnect (xed_tab_get_view (window->priv->active_tab), + window->priv->tab_width_id); + window->priv->tab_width_id = 0; + } - g_free (action_name); + if (window->priv->spaces_instead_of_tabs_id) { + g_signal_handler_disconnect (xed_tab_get_view (window->priv->active_tab), + window->priv->spaces_instead_of_tabs_id); + window->priv->spaces_instead_of_tabs_id = 0; + } + } - /* update the syntax menu */ - update_languages_menu (window); + /* set the active tab */ + window->priv->active_tab = tab; - view = xed_tab_get_view (tab); + set_title (window); + set_sensitivity_according_to_tab (window, tab); - /* sync the statusbar */ - update_cursor_position_statusbar (GTK_TEXT_BUFFER (xed_tab_get_document (tab)), - window); - xed_statusbar_set_overwrite (XED_STATUSBAR (window->priv->statusbar), - gtk_text_view_get_overwrite (GTK_TEXT_VIEW (view))); + /* activate the right item in the documents menu */ + action_name = g_strdup_printf ("Tab_%d", page_num); + action = gtk_action_group_get_action (window->priv->documents_list_action_group, action_name); - gtk_widget_show (window->priv->tab_width_combo); - gtk_widget_show (window->priv->language_combo); + /* sometimes the action doesn't exist yet, and the proper action + * is set active during the documents list menu creation + * CHECK: would it be nicer if active_tab was a property and we monitored the notify signal? + */ + if (action != NULL) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE); + } - window->priv->tab_width_id = g_signal_connect (view, - "notify::tab-width", - G_CALLBACK (tab_width_changed), - window); - window->priv->spaces_instead_of_tabs_id = g_signal_connect (view, - "notify::insert-spaces-instead-of-tabs", - G_CALLBACK (spaces_instead_of_tabs_changed), - window); + g_free (action_name); - window->priv->language_changed_id = g_signal_connect (xed_tab_get_document (tab), - "notify::language", - G_CALLBACK (language_changed), - window); + /* update the syntax menu */ + update_languages_menu (window); - /* call it for the first time */ - tab_width_changed (G_OBJECT (view), NULL, window); - spaces_instead_of_tabs_changed (G_OBJECT (view), NULL, window); - language_changed (G_OBJECT (xed_tab_get_document (tab)), NULL, window); + view = xed_tab_get_view (tab); - g_signal_emit (G_OBJECT (window), - signals[ACTIVE_TAB_CHANGED], - 0, - window->priv->active_tab); + /* sync the statusbar */ + update_cursor_position_statusbar (GTK_TEXT_BUFFER (xed_tab_get_document (tab)), window); + xed_statusbar_set_overwrite (XED_STATUSBAR (window->priv->statusbar), + gtk_text_view_get_overwrite (GTK_TEXT_VIEW (view))); + + gtk_widget_show (window->priv->tab_width_combo); + gtk_widget_show (window->priv->language_combo); + + window->priv->tab_width_id = g_signal_connect (view, "notify::tab-width", + G_CALLBACK (tab_width_changed), window); + + window->priv->spaces_instead_of_tabs_id = g_signal_connect (view, "notify::insert-spaces-instead-of-tabs", + G_CALLBACK (spaces_instead_of_tabs_changed), window); + + window->priv->language_changed_id = g_signal_connect (xed_tab_get_document (tab), "notify::language", + G_CALLBACK (language_changed), window); + + /* call it for the first time */ + tab_width_changed (G_OBJECT (view), NULL, window); + spaces_instead_of_tabs_changed (G_OBJECT (view), NULL, window); + language_changed (G_OBJECT (xed_tab_get_document (tab)), NULL, window); + + g_signal_emit (G_OBJECT (window), signals[ACTIVE_TAB_CHANGED], 0, window->priv->active_tab); } static void set_sensitivity_according_to_window_state (XedWindow *window) { - GtkAction *action; + GtkAction *action; - /* We disable File->Quit/SaveAll/CloseAll while printing to avoid to have two - operations (save and print/print preview) that uses the message area at - the same time (may be we can remove this limitation in the future) */ - /* We disable File->Quit/CloseAll if state is saving since saving cannot be - cancelled (may be we can remove this limitation in the future) */ - gtk_action_group_set_sensitive (window->priv->quit_action_group, - !(window->priv->state & XED_WINDOW_STATE_SAVING) && - !(window->priv->state & XED_WINDOW_STATE_PRINTING)); + /* We disable File->Quit/SaveAll/CloseAll while printing to avoid to have two + operations (save and print/print preview) that uses the message area at + the same time (may be we can remove this limitation in the future) */ + /* We disable File->Quit/CloseAll if state is saving since saving cannot be + cancelled (may be we can remove this limitation in the future) */ + gtk_action_group_set_sensitive (window->priv->quit_action_group, + !(window->priv->state & XED_WINDOW_STATE_SAVING) && + !(window->priv->state & XED_WINDOW_STATE_PRINTING)); - action = gtk_action_group_get_action (window->priv->action_group, - "FileCloseAll"); - gtk_action_set_sensitive (action, - !(window->priv->state & XED_WINDOW_STATE_SAVING) && - !(window->priv->state & XED_WINDOW_STATE_PRINTING)); + action = gtk_action_group_get_action (window->priv->action_group, "FileCloseAll"); + gtk_action_set_sensitive (action, + !(window->priv->state & XED_WINDOW_STATE_SAVING) && + !(window->priv->state & XED_WINDOW_STATE_PRINTING)); - action = gtk_action_group_get_action (window->priv->action_group, - "FileSaveAll"); - gtk_action_set_sensitive (action, - !(window->priv->state & XED_WINDOW_STATE_PRINTING)); - - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "FileNew"); - gtk_action_set_sensitive (action, - !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); - - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "FileOpen"); - gtk_action_set_sensitive (action, - !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); + action = gtk_action_group_get_action (window->priv->action_group, "FileSaveAll"); + gtk_action_set_sensitive (action, !(window->priv->state & XED_WINDOW_STATE_PRINTING)); - gtk_action_group_set_sensitive (window->priv->recents_action_group, - !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "FileNew"); + gtk_action_set_sensitive (action, !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); - xed_notebook_set_close_buttons_sensitive (XED_NOTEBOOK (window->priv->notebook), - !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); - - xed_notebook_set_tab_drag_and_drop_enabled (XED_NOTEBOOK (window->priv->notebook), - !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "FileOpen"); + gtk_action_set_sensitive (action, !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); - if ((window->priv->state & XED_WINDOW_STATE_SAVING_SESSION) != 0) - { - /* TODO: If we really care, Find could be active - * when in SAVING_SESSION state */ + gtk_action_group_set_sensitive (window->priv->recents_action_group, + !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); - if (gtk_action_group_get_sensitive (window->priv->action_group)) - gtk_action_group_set_sensitive (window->priv->action_group, - FALSE); - if (gtk_action_group_get_sensitive (window->priv->quit_action_group)) - gtk_action_group_set_sensitive (window->priv->quit_action_group, - FALSE); - if (gtk_action_group_get_sensitive (window->priv->close_action_group)) - gtk_action_group_set_sensitive (window->priv->close_action_group, - FALSE); - } - else - { - if (!gtk_action_group_get_sensitive (window->priv->action_group)) - gtk_action_group_set_sensitive (window->priv->action_group, - window->priv->num_tabs > 0); - if (!gtk_action_group_get_sensitive (window->priv->quit_action_group)) - gtk_action_group_set_sensitive (window->priv->quit_action_group, - window->priv->num_tabs > 0); - if (!gtk_action_group_get_sensitive (window->priv->close_action_group)) - { - gtk_action_group_set_sensitive (window->priv->close_action_group, - window->priv->num_tabs > 0); - } - } + xed_notebook_set_close_buttons_sensitive (XED_NOTEBOOK (window->priv->notebook), + !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); + + xed_notebook_set_tab_drag_and_drop_enabled (XED_NOTEBOOK (window->priv->notebook), + !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); + + if ((window->priv->state & XED_WINDOW_STATE_SAVING_SESSION) != 0) { + /* TODO: If we really care, Find could be active + * when in SAVING_SESSION state */ + if (gtk_action_group_get_sensitive (window->priv->action_group)) { + gtk_action_group_set_sensitive (window->priv->action_group, FALSE); + } + if (gtk_action_group_get_sensitive (window->priv->quit_action_group)) { + gtk_action_group_set_sensitive (window->priv->quit_action_group, FALSE); + } + if (gtk_action_group_get_sensitive (window->priv->close_action_group)) { + gtk_action_group_set_sensitive (window->priv->close_action_group, FALSE); + } + } + else + { + if (!gtk_action_group_get_sensitive (window->priv->action_group)) { + gtk_action_group_set_sensitive (window->priv->action_group, window->priv->num_tabs > 0); + } + if (!gtk_action_group_get_sensitive (window->priv->quit_action_group)) { + gtk_action_group_set_sensitive (window->priv->quit_action_group, window->priv->num_tabs > 0); + } + if (!gtk_action_group_get_sensitive (window->priv->close_action_group)) {} { + gtk_action_group_set_sensitive (window->priv->close_action_group, window->priv->num_tabs > 0); + } + } } static void -update_tab_autosave (GtkWidget *widget, - gpointer data) +update_tab_autosave (GtkWidget *widget, gpointer data) { - XedTab *tab = XED_TAB (widget); - gboolean *enabled = (gboolean *) data; - - xed_tab_set_auto_save_enabled (tab, *enabled); + XedTab *tab = XED_TAB (widget); + gboolean *enabled = (gboolean *) data; + xed_tab_set_auto_save_enabled (tab, *enabled); } static void -analyze_tab_state (XedTab *tab, - XedWindow *window) +analyze_tab_state (XedTab *tab, XedWindow *window) { - XedTabState ts; - - ts = xed_tab_get_state (tab); - - switch (ts) - { - case XED_TAB_STATE_LOADING: - case XED_TAB_STATE_REVERTING: - window->priv->state |= XED_WINDOW_STATE_LOADING; - break; - - case XED_TAB_STATE_SAVING: - window->priv->state |= XED_WINDOW_STATE_SAVING; - break; - - case XED_TAB_STATE_PRINTING: - case XED_TAB_STATE_PRINT_PREVIEWING: - window->priv->state |= XED_WINDOW_STATE_PRINTING; - break; - - case XED_TAB_STATE_LOADING_ERROR: - case XED_TAB_STATE_REVERTING_ERROR: - case XED_TAB_STATE_SAVING_ERROR: - case XED_TAB_STATE_GENERIC_ERROR: - window->priv->state |= XED_WINDOW_STATE_ERROR; - ++window->priv->num_tabs_with_error; - default: - /* NOP */ - break; - } + XedTabState ts; + + ts = xed_tab_get_state (tab); + + switch (ts) { + case XED_TAB_STATE_LOADING: + case XED_TAB_STATE_REVERTING: + window->priv->state |= XED_WINDOW_STATE_LOADING; + break; + case XED_TAB_STATE_SAVING: + window->priv->state |= XED_WINDOW_STATE_SAVING; + break; + case XED_TAB_STATE_PRINTING: + case XED_TAB_STATE_PRINT_PREVIEWING: + window->priv->state |= XED_WINDOW_STATE_PRINTING; + break; + case XED_TAB_STATE_LOADING_ERROR: + case XED_TAB_STATE_REVERTING_ERROR: + case XED_TAB_STATE_SAVING_ERROR: + case XED_TAB_STATE_GENERIC_ERROR: + window->priv->state |= XED_WINDOW_STATE_ERROR; + ++window->priv->num_tabs_with_error; + break; + default: + /* NOP */ + break; + } } static void update_window_state (XedWindow *window) { - XedWindowState old_ws; - gint old_num_of_errors; - - xed_debug_message (DEBUG_WINDOW, "Old state: %x", window->priv->state); - - old_ws = window->priv->state; - old_num_of_errors = window->priv->num_tabs_with_error; - - window->priv->state = old_ws & XED_WINDOW_STATE_SAVING_SESSION; - - window->priv->num_tabs_with_error = 0; + XedWindowState old_ws; + gint old_num_of_errors; - gtk_container_foreach (GTK_CONTAINER (window->priv->notebook), - (GtkCallback)analyze_tab_state, - window); - - xed_debug_message (DEBUG_WINDOW, "New state: %x", window->priv->state); - - if (old_ws != window->priv->state) - { - set_sensitivity_according_to_window_state (window); + xed_debug_message (DEBUG_WINDOW, "Old state: %x", window->priv->state); - xed_statusbar_set_window_state (XED_STATUSBAR (window->priv->statusbar), - window->priv->state, - window->priv->num_tabs_with_error); - - g_object_notify (G_OBJECT (window), "state"); - } - else if (old_num_of_errors != window->priv->num_tabs_with_error) - { - xed_statusbar_set_window_state (XED_STATUSBAR (window->priv->statusbar), - window->priv->state, - window->priv->num_tabs_with_error); - } + old_ws = window->priv->state; + old_num_of_errors = window->priv->num_tabs_with_error; + + window->priv->state = old_ws & XED_WINDOW_STATE_SAVING_SESSION; + + window->priv->num_tabs_with_error = 0; + + gtk_container_foreach (GTK_CONTAINER (window->priv->notebook), (GtkCallback)analyze_tab_state, window); + + xed_debug_message (DEBUG_WINDOW, "New state: %x", window->priv->state); + + if (old_ws != window->priv->state) { + set_sensitivity_according_to_window_state (window); + xed_statusbar_set_window_state (XED_STATUSBAR (window->priv->statusbar), + window->priv->state, window->priv->num_tabs_with_error); + g_object_notify (G_OBJECT (window), "state"); + } + else if (old_num_of_errors != window->priv->num_tabs_with_error) { + xed_statusbar_set_window_state (XED_STATUSBAR (window->priv->statusbar), + window->priv->state, window->priv->num_tabs_with_error); + } } static void -sync_state (XedTab *tab, - GParamSpec *pspec, - XedWindow *window) +sync_state (XedTab *tab, GParamSpec *pspec, XedWindow *window) { - xed_debug (DEBUG_WINDOW); - - update_window_state (window); - - if (tab != window->priv->active_tab) - return; - - set_sensitivity_according_to_tab (window, tab); - - g_signal_emit (G_OBJECT (window), signals[ACTIVE_TAB_STATE_CHANGED], 0); + xed_debug (DEBUG_WINDOW); + update_window_state (window); + if (tab != window->priv->active_tab) { + return; + } + set_sensitivity_according_to_tab (window, tab); + g_signal_emit (G_OBJECT (window), signals[ACTIVE_TAB_STATE_CHANGED], 0); } static void -sync_name (XedTab *tab, - GParamSpec *pspec, - XedWindow *window) +sync_name (XedTab *tab, GParamSpec *pspec, XedWindow *window) { - GtkAction *action; - gchar *action_name; - gchar *tab_name; - gchar *escaped_name; - gchar *tip; - gint n; - XedDocument *doc; + GtkAction *action; + gchar *action_name; + gchar *tab_name; + gchar *escaped_name; + gchar *tip; + gint n; + XedDocument *doc; - if (tab == window->priv->active_tab) - { - set_title (window); + if (tab == window->priv->active_tab) { + set_title (window); + doc = xed_tab_get_document (tab); + action = gtk_action_group_get_action (window->priv->action_group, "FileRevert"); + gtk_action_set_sensitive (action, !xed_document_is_untitled (doc)); + } - doc = xed_tab_get_document (tab); - action = gtk_action_group_get_action (window->priv->action_group, - "FileRevert"); - gtk_action_set_sensitive (action, - !xed_document_is_untitled (doc)); - } + /* sync the item in the documents list menu */ + n = gtk_notebook_page_num (GTK_NOTEBOOK (window->priv->notebook), GTK_WIDGET (tab)); + action_name = g_strdup_printf ("Tab_%d", n); + action = gtk_action_group_get_action (window->priv->documents_list_action_group, action_name); + g_free (action_name); + g_return_if_fail (action != NULL); - /* sync the item in the documents list menu */ - n = gtk_notebook_page_num (GTK_NOTEBOOK (window->priv->notebook), - GTK_WIDGET (tab)); - action_name = g_strdup_printf ("Tab_%d", n); - action = gtk_action_group_get_action (window->priv->documents_list_action_group, - action_name); - g_free (action_name); - g_return_if_fail (action != NULL); + tab_name = _xed_tab_get_name (tab); + escaped_name = xed_utils_escape_underscores (tab_name, -1); + tip = get_menu_tip_for_tab (tab); - tab_name = _xed_tab_get_name (tab); - escaped_name = xed_utils_escape_underscores (tab_name, -1); - tip = get_menu_tip_for_tab (tab); + g_object_set (action, "label", escaped_name, NULL); + g_object_set (action, "tooltip", tip, NULL); - g_object_set (action, "label", escaped_name, NULL); - g_object_set (action, "tooltip", tip, NULL); + g_free (tab_name); + g_free (escaped_name); + g_free (tip); - g_free (tab_name); - g_free (escaped_name); - g_free (tip); - - xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), - window); + xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), window); } static XedWindow * get_drop_window (GtkWidget *widget) { - GtkWidget *target_window; + GtkWidget *target_window; + target_window = gtk_widget_get_toplevel (widget); + g_return_val_if_fail (XED_IS_WINDOW (target_window), NULL); - target_window = gtk_widget_get_toplevel (widget); - g_return_val_if_fail (XED_IS_WINDOW (target_window), NULL); + if ((XED_WINDOW(target_window)->priv->state & XED_WINDOW_STATE_SAVING_SESSION) != 0) { + return NULL; + } - if ((XED_WINDOW(target_window)->priv->state & XED_WINDOW_STATE_SAVING_SESSION) != 0) - return NULL; - - return XED_WINDOW (target_window); + return XED_WINDOW (target_window); } static void -load_uris_from_drop (XedWindow *window, - gchar **uri_list) +load_uris_from_drop (XedWindow *window, gchar **uri_list) { - GSList *uris = NULL; - gint i; - - if (uri_list == NULL) - return; - - for (i = 0; uri_list[i] != NULL; ++i) - { - uris = g_slist_prepend (uris, uri_list[i]); - } + GSList *uris = NULL; + gint i; - uris = g_slist_reverse (uris); - xed_commands_load_uris (window, - uris, - NULL, - 0); + if (uri_list == NULL) { + return; + } - g_slist_free (uris); + for (i = 0; uri_list[i] != NULL; ++i) { + uris = g_slist_prepend (uris, uri_list[i]); + } + + uris = g_slist_reverse (uris); + xed_commands_load_uris (window, uris, NULL, 0); + + g_slist_free (uris); } /* Handle drops on the XedWindow */ static void -drag_data_received_cb (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint timestamp, - gpointer data) +drag_data_received_cb (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, + guint info, guint timestamp, gpointer data) { - XedWindow *window; - gchar **uri_list; + XedWindow *window; + gchar **uri_list; - window = get_drop_window (widget); - - if (window == NULL) - return; + window = get_drop_window (widget); + if (window == NULL) { + return; + } - if (info == TARGET_URI_LIST) - { - uri_list = xed_utils_drop_get_uris(selection_data); - load_uris_from_drop (window, uri_list); - g_strfreev (uri_list); - } + if (info == TARGET_URI_LIST) { + uri_list = xed_utils_drop_get_uris(selection_data); + load_uris_from_drop (window, uri_list); + g_strfreev (uri_list); + } } /* Handle drops on the XedView */ static void -drop_uris_cb (GtkWidget *widget, - gchar **uri_list) +drop_uris_cb (GtkWidget *widget, gchar **uri_list) { - XedWindow *window; - - window = get_drop_window (widget); - - if (window == NULL) - return; - - load_uris_from_drop (window, uri_list); + XedWindow *window; + window = get_drop_window (widget); + if (window == NULL) { + return; + } + load_uris_from_drop (window, uri_list); } static void fullscreen_controls_show (XedWindow *window) { - GdkScreen *screen; - GdkRectangle fs_rect; - gint w, h; + GdkScreen *screen; + GdkRectangle fs_rect; + gint w, h; - screen = gtk_window_get_screen (GTK_WINDOW (window)); - gdk_screen_get_monitor_geometry (screen, - gdk_screen_get_monitor_at_window (screen, - gtk_widget_get_window (GTK_WIDGET (window))), - &fs_rect); + screen = gtk_window_get_screen (GTK_WINDOW (window)); + gdk_screen_get_monitor_geometry (screen, + gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (GTK_WIDGET (window))), &fs_rect); - gtk_window_get_size (GTK_WINDOW (window->priv->fullscreen_controls), &w, &h); + gtk_window_get_size (GTK_WINDOW (window->priv->fullscreen_controls), &w, &h); + gtk_window_resize (GTK_WINDOW (window->priv->fullscreen_controls), fs_rect.width, h); + gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), fs_rect.x, fs_rect.y - h + 1); - gtk_window_resize (GTK_WINDOW (window->priv->fullscreen_controls), - fs_rect.width, h); - - gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), - fs_rect.x, fs_rect.y - h + 1); - - gtk_widget_show_all (window->priv->fullscreen_controls); + gtk_widget_show_all (window->priv->fullscreen_controls); } static gboolean run_fullscreen_animation (gpointer data) { - XedWindow *window = XED_WINDOW (data); - GdkScreen *screen; - GdkRectangle fs_rect; - gint x, y; - - screen = gtk_window_get_screen (GTK_WINDOW (window)); - gdk_screen_get_monitor_geometry (screen, - gdk_screen_get_monitor_at_window (screen, - gtk_widget_get_window (GTK_WIDGET (window))), - &fs_rect); - - gtk_window_get_position (GTK_WINDOW (window->priv->fullscreen_controls), - &x, &y); - - if (window->priv->fullscreen_animation_enter) - { - if (y == fs_rect.y) - { - window->priv->fullscreen_animation_timeout_id = 0; - return FALSE; - } - else - { - gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), - x, y + 1); - return TRUE; - } - } - else - { - gint w, h; - - gtk_window_get_size (GTK_WINDOW (window->priv->fullscreen_controls), - &w, &h); - - if (y == fs_rect.y - h + 1) - { - window->priv->fullscreen_animation_timeout_id = 0; - return FALSE; - } - else - { - gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), - x, y - 1); - return TRUE; - } - } + XedWindow *window = XED_WINDOW (data); + GdkScreen *screen; + GdkRectangle fs_rect; + gint x, y; + + screen = gtk_window_get_screen (GTK_WINDOW (window)); + gdk_screen_get_monitor_geometry (screen, + gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (GTK_WIDGET (window))), &fs_rect); + + gtk_window_get_position (GTK_WINDOW (window->priv->fullscreen_controls), &x, &y); + + if (window->priv->fullscreen_animation_enter) { + if (y == fs_rect.y) { + window->priv->fullscreen_animation_timeout_id = 0; + return FALSE; + } + else { + gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), x, y + 1); + return TRUE; + } + } + else { + gint w, h; + gtk_window_get_size (GTK_WINDOW (window->priv->fullscreen_controls), &w, &h); + if (y == fs_rect.y - h + 1) { + window->priv->fullscreen_animation_timeout_id = 0; + return FALSE; + } + else { + gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), x, y - 1); + return TRUE; + } + } } static void -show_hide_fullscreen_toolbar (XedWindow *window, - gboolean show, - gint height) +show_hide_fullscreen_toolbar (XedWindow *window, gboolean show, gint height) { - GtkSettings *settings; - gboolean enable_animations; + GtkSettings *settings; + gboolean enable_animations; - settings = gtk_widget_get_settings (GTK_WIDGET (window)); - g_object_get (G_OBJECT (settings), - "gtk-enable-animations", - &enable_animations, - NULL); + settings = gtk_widget_get_settings (GTK_WIDGET (window)); + g_object_get (G_OBJECT (settings), "gtk-enable-animations", &enable_animations, NULL); - if (enable_animations) - { - window->priv->fullscreen_animation_enter = show; + if (enable_animations) { + window->priv->fullscreen_animation_enter = show; + if (window->priv->fullscreen_animation_timeout_id == 0) { + window->priv->fullscreen_animation_timeout_id = + g_timeout_add (FULLSCREEN_ANIMATION_SPEED, (GSourceFunc) run_fullscreen_animation, window); + } + } + else { + GdkRectangle fs_rect; + GdkScreen *screen; + screen = gtk_window_get_screen (GTK_WINDOW (window)); + gdk_screen_get_monitor_geometry (screen, + gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (GTK_WIDGET (window))), &fs_rect); - if (window->priv->fullscreen_animation_timeout_id == 0) - { - window->priv->fullscreen_animation_timeout_id = - g_timeout_add (FULLSCREEN_ANIMATION_SPEED, - (GSourceFunc) run_fullscreen_animation, - window); - } - } - else - { - GdkRectangle fs_rect; - GdkScreen *screen; - - screen = gtk_window_get_screen (GTK_WINDOW (window)); - gdk_screen_get_monitor_geometry (screen, - gdk_screen_get_monitor_at_window (screen, - gtk_widget_get_window (GTK_WIDGET (window))), - &fs_rect); - - if (show) - gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), - fs_rect.x, fs_rect.y); - else - gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), - fs_rect.x, fs_rect.y - height + 1); - } + if (show) { + gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), fs_rect.x, fs_rect.y); + } + else { + gtk_window_move (GTK_WINDOW (window->priv->fullscreen_controls), fs_rect.x, fs_rect.y - height + 1); + } + } } static gboolean -on_fullscreen_controls_enter_notify_event (GtkWidget *widget, - GdkEventCrossing *event, - XedWindow *window) +on_fullscreen_controls_enter_notify_event (GtkWidget *widget, GdkEventCrossing *event, XedWindow *window) { - show_hide_fullscreen_toolbar (window, TRUE, 0); - - return FALSE; + show_hide_fullscreen_toolbar (window, TRUE, 0); + return FALSE; } static gboolean -on_fullscreen_controls_leave_notify_event (GtkWidget *widget, - GdkEventCrossing *event, - XedWindow *window) +on_fullscreen_controls_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event, XedWindow *window) { - GdkDisplay *display; - GdkScreen *screen; - gint w, h; - gint x, y; + GdkDisplay *display; + GdkScreen *screen; + gint w, h; + gint x, y; - display = gdk_display_get_default (); - screen = gtk_window_get_screen (GTK_WINDOW (window)); + display = gdk_display_get_default (); + screen = gtk_window_get_screen (GTK_WINDOW (window)); - gtk_window_get_size (GTK_WINDOW (window->priv->fullscreen_controls), &w, &h); - gdk_display_get_pointer (display, &screen, &x, &y, NULL); - - /* gtk seems to emit leave notify when clicking on tool items, - * work around it by checking the coordinates - */ - if (y >= h) - { - show_hide_fullscreen_toolbar (window, FALSE, h); - } + gtk_window_get_size (GTK_WINDOW (window->priv->fullscreen_controls), &w, &h); + gdk_display_get_pointer (display, &screen, &x, &y, NULL); - return FALSE; + /* gtk seems to emit leave notify when clicking on tool items, + * work around it by checking the coordinates + */ + if (y >= h) { + show_hide_fullscreen_toolbar (window, FALSE, h); + } + + return FALSE; } static void fullscreen_controls_build (XedWindow *window) { - XedWindowPrivate *priv = window->priv; - GtkWidget *toolbar; - GtkWidget *toolbar_recent_menu; - GtkAction *action; + XedWindowPrivate *priv = window->priv; + GtkWidget *toolbar; + GtkWidget *toolbar_recent_menu; + GtkAction *action; - if (priv->fullscreen_controls != NULL) - return; - - priv->fullscreen_controls = gtk_window_new (GTK_WINDOW_POPUP); + if (priv->fullscreen_controls != NULL) { + return; + } - gtk_window_set_transient_for (GTK_WINDOW (priv->fullscreen_controls), - &window->window); - - /* popup toolbar */ - toolbar = gtk_ui_manager_get_widget (priv->manager, "/FullscreenToolBar"); - gtk_container_add (GTK_CONTAINER (priv->fullscreen_controls), - toolbar); - - action = gtk_action_group_get_action (priv->always_sensitive_action_group, - "LeaveFullscreen"); - g_object_set (action, "is-important", TRUE, NULL); - - toolbar_recent_menu = setup_toolbar_open_button (window, toolbar); + priv->fullscreen_controls = gtk_window_new (GTK_WINDOW_POPUP); - gtk_container_foreach (GTK_CONTAINER (toolbar), - (GtkCallback)set_non_homogeneus, - NULL); + gtk_window_set_transient_for (GTK_WINDOW (priv->fullscreen_controls), &window->window); - /* Set the toolbar style */ - gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), - GTK_TOOLBAR_BOTH_HORIZ); + /* popup toolbar */ + toolbar = gtk_ui_manager_get_widget (priv->manager, "/FullscreenToolBar"); + gtk_container_add (GTK_CONTAINER (priv->fullscreen_controls), toolbar); - g_signal_connect (priv->fullscreen_controls, "enter-notify-event", - G_CALLBACK (on_fullscreen_controls_enter_notify_event), - window); - g_signal_connect (priv->fullscreen_controls, "leave-notify-event", - G_CALLBACK (on_fullscreen_controls_leave_notify_event), - window); + action = gtk_action_group_get_action (priv->always_sensitive_action_group, "LeaveFullscreen"); + g_object_set (action, "is-important", TRUE, NULL); + + toolbar_recent_menu = setup_toolbar_open_button (window, toolbar); + + gtk_container_foreach (GTK_CONTAINER (toolbar), (GtkCallback)set_non_homogeneus, NULL); + + /* Set the toolbar style */ + gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH_HORIZ); + + g_signal_connect (priv->fullscreen_controls, "enter-notify-event", + G_CALLBACK (on_fullscreen_controls_enter_notify_event), window); + + g_signal_connect (priv->fullscreen_controls, "leave-notify-event", + G_CALLBACK (on_fullscreen_controls_leave_notify_event), window); } static void -can_search_again (XedDocument *doc, - GParamSpec *pspec, - XedWindow *window) +can_search_again (XedDocument *doc, GParamSpec *pspec, XedWindow *window) { - gboolean sensitive; - GtkAction *action; + gboolean sensitive; + GtkAction *action; - if (doc != xed_window_get_active_document (window)) - return; + if (doc != xed_window_get_active_document (window)) { + return; + } - sensitive = xed_document_get_can_search_again (doc); + sensitive = xed_document_get_can_search_again (doc); - action = gtk_action_group_get_action (window->priv->action_group, - "SearchFindNext"); - gtk_action_set_sensitive (action, sensitive); + action = gtk_action_group_get_action (window->priv->action_group, "SearchFindNext"); + gtk_action_set_sensitive (action, sensitive); - action = gtk_action_group_get_action (window->priv->action_group, - "SearchFindPrevious"); - gtk_action_set_sensitive (action, sensitive); - - action = gtk_action_group_get_action (window->priv->action_group, - "SearchClearHighlight"); - gtk_action_set_sensitive (action, sensitive); + action = gtk_action_group_get_action (window->priv->action_group, "SearchFindPrevious"); + gtk_action_set_sensitive (action, sensitive); } static void can_undo (XedDocument *doc, - GParamSpec *pspec, - XedWindow *window) + GParamSpec *pspec, + XedWindow *window) { - GtkAction *action; - gboolean sensitive; + GtkAction *action; + gboolean sensitive; - sensitive = gtk_source_buffer_can_undo (GTK_SOURCE_BUFFER (doc)); + sensitive = gtk_source_buffer_can_undo (GTK_SOURCE_BUFFER (doc)); - if (doc != xed_window_get_active_document (window)) - return; + if (doc != xed_window_get_active_document (window)) { + return; + } - action = gtk_action_group_get_action (window->priv->action_group, - "EditUndo"); - gtk_action_set_sensitive (action, sensitive); + action = gtk_action_group_get_action (window->priv->action_group, "EditUndo"); + gtk_action_set_sensitive (action, sensitive); } static void can_redo (XedDocument *doc, - GParamSpec *pspec, - XedWindow *window) + GParamSpec *pspec, + XedWindow *window) { - GtkAction *action; - gboolean sensitive; + GtkAction *action; + gboolean sensitive; - sensitive = gtk_source_buffer_can_redo (GTK_SOURCE_BUFFER (doc)); + sensitive = gtk_source_buffer_can_redo (GTK_SOURCE_BUFFER (doc)); - if (doc != xed_window_get_active_document (window)) - return; + if (doc != xed_window_get_active_document (window)) { + return; + } - action = gtk_action_group_get_action (window->priv->action_group, - "EditRedo"); - gtk_action_set_sensitive (action, sensitive); + action = gtk_action_group_get_action (window->priv->action_group, "EditRedo"); + gtk_action_set_sensitive (action, sensitive); } static void selection_changed (XedDocument *doc, - GParamSpec *pspec, - XedWindow *window) + GParamSpec *pspec, + XedWindow *window) { - XedTab *tab; - XedView *view; - GtkAction *action; - XedTabState state; - gboolean state_normal; - gboolean editable; + XedTab *tab; + XedView *view; + GtkAction *action; + XedTabState state; + gboolean state_normal; + gboolean editable; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - if (doc != xed_window_get_active_document (window)) - return; + if (doc != xed_window_get_active_document (window)) { + return; + } - tab = xed_tab_get_from_document (doc); - state = xed_tab_get_state (tab); - state_normal = (state == XED_TAB_STATE_NORMAL); + tab = xed_tab_get_from_document (doc); + state = xed_tab_get_state (tab); + state_normal = (state == XED_TAB_STATE_NORMAL); - view = xed_tab_get_view (tab); - editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (view)); + view = xed_tab_get_view (tab); + editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (view)); - action = gtk_action_group_get_action (window->priv->action_group, - "EditCut"); - gtk_action_set_sensitive (action, - state_normal && - editable && - gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); + action = gtk_action_group_get_action (window->priv->action_group, "EditCut"); + gtk_action_set_sensitive (action, + state_normal && editable && gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); - action = gtk_action_group_get_action (window->priv->action_group, - "EditCopy"); - gtk_action_set_sensitive (action, - (state_normal || - state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && - gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); + action = gtk_action_group_get_action (window->priv->action_group, "EditCopy"); + gtk_action_set_sensitive (action, + (state_normal || + state == XED_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION) && + gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); - action = gtk_action_group_get_action (window->priv->action_group, - "EditDelete"); - gtk_action_set_sensitive (action, - state_normal && - editable && - gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); + action = gtk_action_group_get_action (window->priv->action_group, "EditDelete"); + gtk_action_set_sensitive (action, + state_normal && editable && gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (doc))); - xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), - window); + xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), window); } static void -sync_languages_menu (XedDocument *doc, - GParamSpec *pspec, - XedWindow *window) +sync_languages_menu (XedDocument *doc, GParamSpec *pspec, XedWindow *window) { - update_languages_menu (window); - xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), - window); + update_languages_menu (window); + xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), window); } static void -readonly_changed (XedDocument *doc, - GParamSpec *pspec, - XedWindow *window) +readonly_changed (XedDocument *doc, GParamSpec *pspec, XedWindow *window) { - set_sensitivity_according_to_tab (window, window->priv->active_tab); - - sync_name (window->priv->active_tab, NULL, window); - - xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), - window); + set_sensitivity_according_to_tab (window, window->priv->active_tab); + sync_name (window->priv->active_tab, NULL, window); + xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), window); } static void -editable_changed (XedView *view, - GParamSpec *arg1, - XedWindow *window) +editable_changed (XedView *view, GParamSpec *arg1, XedWindow *window) { - xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), - window); + xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), window); } static void update_sensitivity_according_to_open_tabs (XedWindow *window) { - GtkAction *action; + GtkAction *action; - /* Set sensitivity */ - gtk_action_group_set_sensitive (window->priv->action_group, - window->priv->num_tabs != 0); + /* Set sensitivity */ + gtk_action_group_set_sensitive (window->priv->action_group, window->priv->num_tabs != 0); - action = gtk_action_group_get_action (window->priv->action_group, - "DocumentsMoveToNewWindow"); - gtk_action_set_sensitive (action, - window->priv->num_tabs > 1); - - gtk_action_group_set_sensitive (window->priv->close_action_group, - window->priv->num_tabs != 0); + action = gtk_action_group_get_action (window->priv->action_group, "DocumentsMoveToNewWindow"); + gtk_action_set_sensitive (action, window->priv->num_tabs > 1); + gtk_action_group_set_sensitive (window->priv->close_action_group, window->priv->num_tabs != 0); } static void -notebook_tab_added (XedNotebook *notebook, - XedTab *tab, - XedWindow *window) +notebook_tab_added (XedNotebook *notebook, XedTab *tab, XedWindow *window) { - XedView *view; - XedDocument *doc; + XedView *view; + XedDocument *doc; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - g_return_if_fail ((window->priv->state & XED_WINDOW_STATE_SAVING_SESSION) == 0); - - ++window->priv->num_tabs; + g_return_if_fail ((window->priv->state & XED_WINDOW_STATE_SAVING_SESSION) == 0); - update_sensitivity_according_to_open_tabs (window); + ++window->priv->num_tabs; - view = xed_tab_get_view (tab); - doc = xed_tab_get_document (tab); + update_sensitivity_according_to_open_tabs (window); - /* IMPORTANT: remember to disconnect the signal in notebook_tab_removed - * if a new signal is connected here */ + view = xed_tab_get_view (tab); + doc = xed_tab_get_document (tab); - g_signal_connect (tab, - "notify::name", - G_CALLBACK (sync_name), - window); - g_signal_connect (tab, - "notify::state", - G_CALLBACK (sync_state), - window); + /* IMPORTANT: remember to disconnect the signal in notebook_tab_removed + * if a new signal is connected here */ - g_signal_connect (doc, - "cursor-moved", - G_CALLBACK (update_cursor_position_statusbar), - window); - g_signal_connect (doc, - "notify::can-search-again", - G_CALLBACK (can_search_again), - window); - g_signal_connect (doc, - "notify::can-undo", - G_CALLBACK (can_undo), - window); - g_signal_connect (doc, - "notify::can-redo", - G_CALLBACK (can_redo), - window); - g_signal_connect (doc, - "notify::has-selection", - G_CALLBACK (selection_changed), - window); - g_signal_connect (doc, - "notify::language", - G_CALLBACK (sync_languages_menu), - window); - g_signal_connect (doc, - "notify::read-only", - G_CALLBACK (readonly_changed), - window); - g_signal_connect (view, - "toggle_overwrite", - G_CALLBACK (update_overwrite_mode_statusbar), - window); - g_signal_connect (view, - "notify::editable", - G_CALLBACK (editable_changed), - window); + g_signal_connect (tab, "notify::name", G_CALLBACK (sync_name), window); + g_signal_connect (tab, "notify::state", G_CALLBACK (sync_state), window); - update_documents_list_menu (window); - - g_signal_connect (view, - "drop_uris", - G_CALLBACK (drop_uris_cb), - NULL); + g_signal_connect (doc, "cursor-moved", G_CALLBACK (update_cursor_position_statusbar), window); + g_signal_connect (doc, "notify::can-search-again", G_CALLBACK (can_search_again), window); + g_signal_connect (doc, "notify::can-undo", G_CALLBACK (can_undo), window); + g_signal_connect (doc, "notify::can-redo", G_CALLBACK (can_redo), window); + g_signal_connect (doc, "notify::has-selection", G_CALLBACK (selection_changed), window); + g_signal_connect (doc, "notify::language", G_CALLBACK (sync_languages_menu), window); + g_signal_connect (doc, "notify::read-only", G_CALLBACK (readonly_changed), window); + g_signal_connect (view, "toggle_overwrite", G_CALLBACK (update_overwrite_mode_statusbar), window); + g_signal_connect (view, "notify::editable", G_CALLBACK (editable_changed), window); - update_window_state (window); + update_documents_list_menu (window); - g_signal_emit (G_OBJECT (window), signals[TAB_ADDED], 0, tab); + g_signal_connect (view, "drop_uris", G_CALLBACK (drop_uris_cb), NULL); + + update_window_state (window); + + g_signal_emit (G_OBJECT (window), signals[TAB_ADDED], 0, tab); } static void -notebook_tab_removed (XedNotebook *notebook, - XedTab *tab, - XedWindow *window) +notebook_tab_removed (XedNotebook *notebook, XedTab *tab, XedWindow *window) { - XedView *view; - XedDocument *doc; + XedView *view; + XedDocument *doc; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - g_return_if_fail ((window->priv->state & XED_WINDOW_STATE_SAVING_SESSION) == 0); + g_return_if_fail ((window->priv->state & XED_WINDOW_STATE_SAVING_SESSION) == 0); - --window->priv->num_tabs; + --window->priv->num_tabs; - view = xed_tab_get_view (tab); - doc = xed_tab_get_document (tab); + view = xed_tab_get_view (tab); + doc = xed_tab_get_document (tab); - g_signal_handlers_disconnect_by_func (tab, - G_CALLBACK (sync_name), - window); - g_signal_handlers_disconnect_by_func (tab, - G_CALLBACK (sync_state), - window); - g_signal_handlers_disconnect_by_func (doc, - G_CALLBACK (update_cursor_position_statusbar), - window); - g_signal_handlers_disconnect_by_func (doc, - G_CALLBACK (can_search_again), - window); - g_signal_handlers_disconnect_by_func (doc, - G_CALLBACK (can_undo), - window); - g_signal_handlers_disconnect_by_func (doc, - G_CALLBACK (can_redo), - window); - g_signal_handlers_disconnect_by_func (doc, - G_CALLBACK (selection_changed), - window); - g_signal_handlers_disconnect_by_func (doc, - G_CALLBACK (sync_languages_menu), - window); - g_signal_handlers_disconnect_by_func (doc, - G_CALLBACK (readonly_changed), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (update_overwrite_mode_statusbar), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (editable_changed), - window); - g_signal_handlers_disconnect_by_func (view, - G_CALLBACK (drop_uris_cb), - NULL); + g_signal_handlers_disconnect_by_func (tab, G_CALLBACK (sync_name), window); + g_signal_handlers_disconnect_by_func (tab, G_CALLBACK (sync_state), window); + g_signal_handlers_disconnect_by_func (doc, G_CALLBACK (update_cursor_position_statusbar), window); + g_signal_handlers_disconnect_by_func (doc, G_CALLBACK (can_search_again), window); + g_signal_handlers_disconnect_by_func (doc, G_CALLBACK (can_undo), window); + g_signal_handlers_disconnect_by_func (doc, G_CALLBACK (can_redo), window); + g_signal_handlers_disconnect_by_func (doc, G_CALLBACK (selection_changed), window); + g_signal_handlers_disconnect_by_func (doc, G_CALLBACK (sync_languages_menu), window); + g_signal_handlers_disconnect_by_func (doc, G_CALLBACK (readonly_changed), window); + g_signal_handlers_disconnect_by_func (view, G_CALLBACK (update_overwrite_mode_statusbar), window); + g_signal_handlers_disconnect_by_func (view, G_CALLBACK (editable_changed), window); + g_signal_handlers_disconnect_by_func (view, G_CALLBACK (drop_uris_cb), NULL); - if (window->priv->tab_width_id && tab == xed_window_get_active_tab (window)) - { - g_signal_handler_disconnect (view, window->priv->tab_width_id); - window->priv->tab_width_id = 0; - } - - if (window->priv->spaces_instead_of_tabs_id && tab == xed_window_get_active_tab (window)) - { - g_signal_handler_disconnect (view, window->priv->spaces_instead_of_tabs_id); - window->priv->spaces_instead_of_tabs_id = 0; - } - - if (window->priv->language_changed_id && tab == xed_window_get_active_tab (window)) - { - g_signal_handler_disconnect (doc, window->priv->language_changed_id); - window->priv->language_changed_id = 0; - } + if (window->priv->tab_width_id && tab == xed_window_get_active_tab (window)) { + g_signal_handler_disconnect (view, window->priv->tab_width_id); + window->priv->tab_width_id = 0; + } - g_return_if_fail (window->priv->num_tabs >= 0); - if (window->priv->num_tabs == 0) - { - window->priv->active_tab = NULL; - - set_title (window); - - /* Remove line and col info */ - xed_statusbar_set_cursor_position ( - XED_STATUSBAR (window->priv->statusbar), - -1, - -1); - - xed_statusbar_clear_overwrite ( - XED_STATUSBAR (window->priv->statusbar)); + if (window->priv->spaces_instead_of_tabs_id && tab == xed_window_get_active_tab (window)) { + g_signal_handler_disconnect (view, window->priv->spaces_instead_of_tabs_id); + window->priv->spaces_instead_of_tabs_id = 0; + } - /* hide the combos */ - gtk_widget_hide (window->priv->tab_width_combo); - gtk_widget_hide (window->priv->language_combo); - } + if (window->priv->language_changed_id && tab == xed_window_get_active_tab (window)) { + g_signal_handler_disconnect (doc, window->priv->language_changed_id); + window->priv->language_changed_id = 0; + } - if (!window->priv->removing_tabs) - { - update_documents_list_menu (window); - update_next_prev_doc_sensitivity_per_window (window); - } - else - { - if (window->priv->num_tabs == 0) - { - update_documents_list_menu (window); - update_next_prev_doc_sensitivity_per_window (window); - } - } + g_return_if_fail (window->priv->num_tabs >= 0); + if (window->priv->num_tabs == 0) { + window->priv->active_tab = NULL; + set_title (window); - update_sensitivity_according_to_open_tabs (window); + /* Remove line and col info */ + xed_statusbar_set_cursor_position (XED_STATUSBAR (window->priv->statusbar), -1, -1); - if (window->priv->num_tabs == 0) - { - xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), - window); - } + xed_statusbar_clear_overwrite (XED_STATUSBAR (window->priv->statusbar)); - update_window_state (window); + /* hide the combos */ + gtk_widget_hide (window->priv->tab_width_combo); + gtk_widget_hide (window->priv->language_combo); + } - g_signal_emit (G_OBJECT (window), signals[TAB_REMOVED], 0, tab); + if (!window->priv->removing_tabs) { + update_documents_list_menu (window); + update_next_prev_doc_sensitivity_per_window (window); + } + else { + if (window->priv->num_tabs == 0) { + update_documents_list_menu (window); + update_next_prev_doc_sensitivity_per_window (window); + } + } + + update_sensitivity_according_to_open_tabs (window); + + if (window->priv->num_tabs == 0) { + xed_plugins_engine_update_plugins_ui (xed_plugins_engine_get_default (), window); + } + + update_window_state (window); + + g_signal_emit (G_OBJECT (window), signals[TAB_REMOVED], 0, tab); } static void -notebook_tabs_reordered (XedNotebook *notebook, - XedWindow *window) +notebook_tabs_reordered (XedNotebook *notebook, XedWindow *window) { - update_documents_list_menu (window); - update_next_prev_doc_sensitivity_per_window (window); - - g_signal_emit (G_OBJECT (window), signals[TABS_REORDERED], 0); + update_documents_list_menu (window); + update_next_prev_doc_sensitivity_per_window (window); + g_signal_emit (G_OBJECT (window), signals[TABS_REORDERED], 0); } static void -notebook_tab_detached (XedNotebook *notebook, - XedTab *tab, - XedWindow *window) +notebook_tab_detached (XedNotebook *notebook, XedTab *tab, XedWindow *window) { - XedWindow *new_window; - - new_window = clone_window (window); - - xed_notebook_move_tab (notebook, - XED_NOTEBOOK (_xed_window_get_notebook (new_window)), - tab, 0); - - gtk_window_set_position (GTK_WINDOW (new_window), - GTK_WIN_POS_MOUSE); - - gtk_widget_show (GTK_WIDGET (new_window)); -} + XedWindow *new_window; -static void -notebook_tab_close_request (XedNotebook *notebook, - XedTab *tab, - GtkWindow *window) + new_window = clone_window (window); + + xed_notebook_move_tab (notebook, XED_NOTEBOOK (_xed_window_get_notebook (new_window)), tab, 0); + + gtk_window_set_position (GTK_WINDOW (new_window), GTK_WIN_POS_MOUSE); + + gtk_widget_show (GTK_WIDGET (new_window)); +} + +static void +notebook_tab_close_request (XedNotebook *notebook, XedTab *tab, GtkWindow *window) { - /* Note: we are destroying the tab before the default handler - * seems to be ok, but we need to keep an eye on this. */ - _xed_cmd_file_close_tab (tab, XED_WINDOW (window)); + /* Note: we are destroying the tab before the default handler + * seems to be ok, but we need to keep an eye on this. */ + _xed_cmd_file_close_tab (tab, XED_WINDOW (window)); } static gboolean -show_notebook_popup_menu (GtkNotebook *notebook, - XedWindow *window, - GdkEventButton *event) +show_notebook_popup_menu (GtkNotebook *notebook, XedWindow *window, GdkEventButton *event) { - GtkWidget *menu; -// GtkAction *action; + GtkWidget *menu; +// GtkAction *action; - menu = gtk_ui_manager_get_widget (window->priv->manager, "/NotebookPopup"); - g_return_val_if_fail (menu != NULL, FALSE); + menu = gtk_ui_manager_get_widget (window->priv->manager, "/NotebookPopup"); + g_return_val_if_fail (menu != NULL, FALSE); // CHECK do we need this? #if 0 - /* allow extensions to sync when showing the popup */ - action = gtk_action_group_get_action (window->priv->action_group, - "NotebookPopupAction"); - g_return_val_if_fail (action != NULL, FALSE); - gtk_action_activate (action); + /* allow extensions to sync when showing the popup */ + action = gtk_action_group_get_action (window->priv->action_group, + "NotebookPopupAction"); + g_return_val_if_fail (action != NULL, FALSE); + gtk_action_activate (action); #endif - if (event != NULL) - { - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, - NULL, NULL, - event->button, event->time); - } - else - { - GtkWidget *tab; - GtkWidget *tab_label; + if (event != NULL) { + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button, event->time); + } + else { + GtkWidget *tab; + GtkWidget *tab_label; - tab = GTK_WIDGET (xed_window_get_active_tab (window)); - g_return_val_if_fail (tab != NULL, FALSE); + tab = GTK_WIDGET (xed_window_get_active_tab (window)); + g_return_val_if_fail (tab != NULL, FALSE); - tab_label = gtk_notebook_get_tab_label (notebook, tab); + tab_label = gtk_notebook_get_tab_label (notebook, tab); - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, - xed_utils_menu_position_under_widget, tab_label, - 0, gtk_get_current_event_time ()); + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, + xed_utils_menu_position_under_widget, tab_label, 0, gtk_get_current_event_time ()); - gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE); - } + gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE); + } - return TRUE; + return TRUE; } static gboolean -notebook_button_press_event (GtkNotebook *notebook, - GdkEventButton *event, - XedWindow *window) +notebook_button_press_event (GtkNotebook *notebook, GdkEventButton *event, XedWindow *window) { - if (GDK_BUTTON_PRESS == event->type && 3 == event->button) - { - return show_notebook_popup_menu (notebook, window, event); - } - else if (GDK_BUTTON_PRESS == event->type && 2 == event->button) - { - XedTab *tab; - tab = xed_window_get_active_tab (window); - notebook_tab_close_request (XED_NOTEBOOK (notebook), tab, GTK_WINDOW (window)); - return FALSE; - } - - return FALSE; + if (GDK_BUTTON_PRESS == event->type && 3 == event->button) { + return show_notebook_popup_menu (notebook, window, event); + } + else if (GDK_BUTTON_PRESS == event->type && 2 == event->button) { + XedTab *tab; + tab = xed_window_get_active_tab (window); + notebook_tab_close_request (XED_NOTEBOOK (notebook), tab, GTK_WINDOW (window)); + return FALSE; + } + return FALSE; } static gboolean -notebook_popup_menu (GtkNotebook *notebook, - XedWindow *window) +notebook_popup_menu (GtkNotebook *notebook, XedWindow *window) { - /* Only respond if the notebook is the actual focus */ - if (XED_IS_NOTEBOOK (gtk_window_get_focus (GTK_WINDOW (window)))) - { - return show_notebook_popup_menu (notebook, window, NULL); - } - - return FALSE; + /* Only respond if the notebook is the actual focus */ + if (XED_IS_NOTEBOOK (gtk_window_get_focus (GTK_WINDOW (window)))) { + return show_notebook_popup_menu (notebook, window, NULL); + } + return FALSE; } static void -side_panel_size_allocate (GtkWidget *widget, - GtkAllocation *allocation, - XedWindow *window) +side_panel_size_allocate (GtkWidget *widget, GtkAllocation *allocation, XedWindow *window) { - window->priv->side_panel_size = allocation->width; + window->priv->side_panel_size = allocation->width; } static void -bottom_panel_size_allocate (GtkWidget *widget, - GtkAllocation *allocation, - XedWindow *window) +bottom_panel_size_allocate (GtkWidget *widget, GtkAllocation *allocation, XedWindow *window) { - window->priv->bottom_panel_size = allocation->height; + window->priv->bottom_panel_size = allocation->height; } static void -hpaned_restore_position (GtkWidget *widget, - XedWindow *window) +hpaned_restore_position (GtkWidget *widget, XedWindow *window) { - gint pos; + gint pos; + xed_debug_message (DEBUG_WINDOW, "Restoring hpaned position: side panel size %d", window->priv->side_panel_size); - xed_debug_message (DEBUG_WINDOW, - "Restoring hpaned position: side panel size %d", - window->priv->side_panel_size); + pos = MAX (100, window->priv->side_panel_size); + gtk_paned_set_position (GTK_PANED (window->priv->hpaned), pos); - pos = MAX (100, window->priv->side_panel_size); - gtk_paned_set_position (GTK_PANED (window->priv->hpaned), pos); + /* start monitoring the size */ + g_signal_connect (window->priv->side_panel, "size-allocate", G_CALLBACK (side_panel_size_allocate), window); - /* start monitoring the size */ - g_signal_connect (window->priv->side_panel, - "size-allocate", - G_CALLBACK (side_panel_size_allocate), - window); - - /* run this only once */ - g_signal_handlers_disconnect_by_func (widget, hpaned_restore_position, window); + /* run this only once */ + g_signal_handlers_disconnect_by_func (widget, hpaned_restore_position, window); } static void -vpaned_restore_position (GtkWidget *widget, - XedWindow *window) +vpaned_restore_position (GtkWidget *widget, XedWindow *window) { - GtkAllocation allocation; - gint pos; + GtkAllocation allocation; + gint pos; - gtk_widget_get_allocation (widget, &allocation); + gtk_widget_get_allocation (widget, &allocation); - xed_debug_message (DEBUG_WINDOW, - "Restoring vpaned position: bottom panel size %d", - window->priv->bottom_panel_size); + xed_debug_message (DEBUG_WINDOW, + "Restoring vpaned position: bottom panel size %d", window->priv->bottom_panel_size); - pos = allocation.height - - MAX (50, window->priv->bottom_panel_size); - gtk_paned_set_position (GTK_PANED (window->priv->vpaned), pos); + pos = allocation.height - MAX (50, window->priv->bottom_panel_size); + gtk_paned_set_position (GTK_PANED (window->priv->vpaned), pos); - /* start monitoring the size */ - g_signal_connect (window->priv->bottom_panel, - "size-allocate", - G_CALLBACK (bottom_panel_size_allocate), - window); + /* start monitoring the size */ + g_signal_connect (window->priv->bottom_panel, "size-allocate", G_CALLBACK (bottom_panel_size_allocate), window); - /* run this only once */ - g_signal_handlers_disconnect_by_func (widget, vpaned_restore_position, window); + /* run this only once */ + g_signal_handlers_disconnect_by_func (widget, vpaned_restore_position, window); } static void -side_panel_visibility_changed (GtkWidget *side_panel, - XedWindow *window) +side_panel_visibility_changed (GtkWidget *side_panel, XedWindow *window) { - gboolean visible; - GtkAction *action; + gboolean visible; + GtkAction *action; - visible = gtk_widget_get_visible (side_panel); + visible = gtk_widget_get_visible (side_panel); - if (xed_prefs_manager_side_pane_visible_can_set ()) - xed_prefs_manager_set_side_pane_visible (visible); + if (xed_prefs_manager_side_pane_visible_can_set ()) { + xed_prefs_manager_set_side_pane_visible (visible); + } - action = gtk_action_group_get_action (window->priv->panes_action_group, - "ViewSidePane"); + action = gtk_action_group_get_action (window->priv->panes_action_group, "ViewSidePane"); - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + } - /* focus the document */ - if (!visible && window->priv->active_tab != NULL) - gtk_widget_grab_focus (GTK_WIDGET ( - xed_tab_get_view (XED_TAB (window->priv->active_tab)))); + /* focus the document */ + if (!visible && window->priv->active_tab != NULL) { + gtk_widget_grab_focus (GTK_WIDGET (xed_tab_get_view (XED_TAB (window->priv->active_tab)))); + } } static void create_side_panel (XedWindow *window) { - GtkWidget *documents_panel; + GtkWidget *documents_panel; + xed_debug (DEBUG_WINDOW); - xed_debug (DEBUG_WINDOW); + window->priv->side_panel = xed_panel_new (GTK_ORIENTATION_VERTICAL); - window->priv->side_panel = xed_panel_new (GTK_ORIENTATION_VERTICAL); + gtk_paned_pack1 (GTK_PANED (window->priv->hpaned), window->priv->side_panel, FALSE, FALSE); - gtk_paned_pack1 (GTK_PANED (window->priv->hpaned), - window->priv->side_panel, - FALSE, - FALSE); + g_signal_connect_after (window->priv->side_panel, "show", G_CALLBACK (side_panel_visibility_changed), window); + g_signal_connect_after (window->priv->side_panel, "hide", G_CALLBACK (side_panel_visibility_changed), window); - g_signal_connect_after (window->priv->side_panel, - "show", - G_CALLBACK (side_panel_visibility_changed), - window); - g_signal_connect_after (window->priv->side_panel, - "hide", - G_CALLBACK (side_panel_visibility_changed), - window); - - documents_panel = xed_documents_panel_new (window); - xed_panel_add_item_with_stock_icon (XED_PANEL (window->priv->side_panel), - documents_panel, - _("Documents"), - GTK_STOCK_FILE); + documents_panel = xed_documents_panel_new (window); + xed_panel_add_item_with_stock_icon (XED_PANEL (window->priv->side_panel), + documents_panel, _("Documents"), GTK_STOCK_FILE); } static void -bottom_panel_visibility_changed (XedPanel *bottom_panel, - XedWindow *window) +bottom_panel_visibility_changed (XedPanel *bottom_panel, XedWindow *window) { - gboolean visible; - GtkAction *action; + gboolean visible; + GtkAction *action; - visible = gtk_widget_get_visible (GTK_WIDGET (bottom_panel)); + visible = gtk_widget_get_visible (GTK_WIDGET (bottom_panel)); - if (xed_prefs_manager_bottom_panel_visible_can_set ()) - xed_prefs_manager_set_bottom_panel_visible (visible); + if (xed_prefs_manager_bottom_panel_visible_can_set ()) { + xed_prefs_manager_set_bottom_panel_visible (visible); + } - action = gtk_action_group_get_action (window->priv->panes_action_group, - "ViewBottomPane"); + action = gtk_action_group_get_action (window->priv->panes_action_group, "ViewBottomPane"); - if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != visible) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), visible); + } - /* focus the document */ - if (!visible && window->priv->active_tab != NULL) - gtk_widget_grab_focus (GTK_WIDGET ( - xed_tab_get_view (XED_TAB (window->priv->active_tab)))); + /* focus the document */ + if (!visible && window->priv->active_tab != NULL) { + gtk_widget_grab_focus (GTK_WIDGET (xed_tab_get_view (XED_TAB (window->priv->active_tab)))); + } } static void -bottom_panel_item_removed (XedPanel *panel, - GtkWidget *item, - XedWindow *window) +bottom_panel_item_removed (XedPanel *panel, GtkWidget *item, XedWindow *window) { - if (xed_panel_get_n_items (panel) == 0) - { - GtkAction *action; - - gtk_widget_hide (GTK_WIDGET (panel)); - - action = gtk_action_group_get_action (window->priv->panes_action_group, - "ViewBottomPane"); - gtk_action_set_sensitive (action, FALSE); - } + if (xed_panel_get_n_items (panel) == 0) { + GtkAction *action; + gtk_widget_hide (GTK_WIDGET (panel)); + action = gtk_action_group_get_action (window->priv->panes_action_group, "ViewBottomPane"); + gtk_action_set_sensitive (action, FALSE); + } } static void -bottom_panel_item_added (XedPanel *panel, - GtkWidget *item, - XedWindow *window) +bottom_panel_item_added (XedPanel *panel, GtkWidget *item, XedWindow *window) { - /* if it's the first item added, set the menu item - * sensitive and if needed show the panel */ - if (xed_panel_get_n_items (panel) == 1) - { - GtkAction *action; - gboolean show; - - action = gtk_action_group_get_action (window->priv->panes_action_group, - "ViewBottomPane"); - gtk_action_set_sensitive (action, TRUE); - - show = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); - if (show) - gtk_widget_show (GTK_WIDGET (panel)); - } + /* if it's the first item added, set the menu item + * sensitive and if needed show the panel */ + if (xed_panel_get_n_items (panel) == 1) { + GtkAction *action; + gboolean show; + action = gtk_action_group_get_action (window->priv->panes_action_group, "ViewBottomPane"); + gtk_action_set_sensitive (action, TRUE); + show = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + if (show) { + gtk_widget_show (GTK_WIDGET (panel)); + } + } } static void -create_bottom_panel (XedWindow *window) +create_bottom_panel (XedWindow *window) { - xed_debug (DEBUG_WINDOW); - - window->priv->bottom_panel = xed_panel_new (GTK_ORIENTATION_HORIZONTAL); - - gtk_paned_pack2 (GTK_PANED (window->priv->vpaned), - window->priv->bottom_panel, - FALSE, - FALSE); - - g_signal_connect_after (window->priv->bottom_panel, - "show", - G_CALLBACK (bottom_panel_visibility_changed), - window); - g_signal_connect_after (window->priv->bottom_panel, - "hide", - G_CALLBACK (bottom_panel_visibility_changed), - window); + xed_debug (DEBUG_WINDOW); + window->priv->bottom_panel = xed_panel_new (GTK_ORIENTATION_HORIZONTAL); + gtk_paned_pack2 (GTK_PANED (window->priv->vpaned), window->priv->bottom_panel, FALSE, FALSE); + g_signal_connect_after (window->priv->bottom_panel, "show", G_CALLBACK (bottom_panel_visibility_changed), window); + g_signal_connect_after (window->priv->bottom_panel, "hide", G_CALLBACK (bottom_panel_visibility_changed), window); } static void init_panels_visibility (XedWindow *window) { - gint active_page; + gint active_page; + xed_debug (DEBUG_WINDOW); - xed_debug (DEBUG_WINDOW); + /* side pane */ + active_page = xed_prefs_manager_get_side_panel_active_page (); + _xed_panel_set_active_item_by_id (XED_PANEL (window->priv->side_panel), active_page); - /* side pane */ - active_page = xed_prefs_manager_get_side_panel_active_page (); - _xed_panel_set_active_item_by_id (XED_PANEL (window->priv->side_panel), - active_page); + if (xed_prefs_manager_get_side_pane_visible ()) { + gtk_widget_show (window->priv->side_panel); + } - if (xed_prefs_manager_get_side_pane_visible ()) - { - gtk_widget_show (window->priv->side_panel); - } + /* bottom pane, it can be empty */ + if (xed_panel_get_n_items (XED_PANEL (window->priv->bottom_panel)) > 0) { + active_page = xed_prefs_manager_get_bottom_panel_active_page (); + _xed_panel_set_active_item_by_id (XED_PANEL (window->priv->bottom_panel), active_page); - /* bottom pane, it can be empty */ - if (xed_panel_get_n_items (XED_PANEL (window->priv->bottom_panel)) > 0) - { - active_page = xed_prefs_manager_get_bottom_panel_active_page (); - _xed_panel_set_active_item_by_id (XED_PANEL (window->priv->bottom_panel), - active_page); + if (xed_prefs_manager_get_bottom_panel_visible ()) { + gtk_widget_show (window->priv->bottom_panel); + } + } + else { + GtkAction *action; + action = gtk_action_group_get_action (window->priv->panes_action_group, "ViewBottomPane"); + gtk_action_set_sensitive (action, FALSE); + } - if (xed_prefs_manager_get_bottom_panel_visible ()) - { - gtk_widget_show (window->priv->bottom_panel); - } - } - else - { - GtkAction *action; - action = gtk_action_group_get_action (window->priv->panes_action_group, - "ViewBottomPane"); - gtk_action_set_sensitive (action, FALSE); - } + /* start track sensitivity after the initial state is set */ + window->priv->bottom_panel_item_removed_handler_id = + g_signal_connect (window->priv->bottom_panel, "item_removed", + G_CALLBACK (bottom_panel_item_removed), window); - /* start track sensitivity after the initial state is set */ - window->priv->bottom_panel_item_removed_handler_id = - g_signal_connect (window->priv->bottom_panel, - "item_removed", - G_CALLBACK (bottom_panel_item_removed), - window); - - g_signal_connect (window->priv->bottom_panel, - "item_added", - G_CALLBACK (bottom_panel_item_added), - window); + g_signal_connect (window->priv->bottom_panel, "item_added", + G_CALLBACK (bottom_panel_item_added), window); } static void -clipboard_owner_change (GtkClipboard *clipboard, - GdkEventOwnerChange *event, - XedWindow *window) +clipboard_owner_change (GtkClipboard *clipboard, GdkEventOwnerChange *event, XedWindow *window) { - set_paste_sensitivity_according_to_clipboard (window, - clipboard); + set_paste_sensitivity_according_to_clipboard (window, clipboard); } static void -window_realized (GtkWidget *window, - gpointer *data) +window_realized (GtkWidget *window, gpointer *data) { - GtkClipboard *clipboard; - - clipboard = gtk_widget_get_clipboard (window, - GDK_SELECTION_CLIPBOARD); - - g_signal_connect (clipboard, - "owner_change", - G_CALLBACK (clipboard_owner_change), - window); + GtkClipboard *clipboard; + clipboard = gtk_widget_get_clipboard (window, GDK_SELECTION_CLIPBOARD); + g_signal_connect (clipboard, "owner_change", G_CALLBACK (clipboard_owner_change), window); } static void -window_unrealized (GtkWidget *window, - gpointer *data) +window_unrealized (GtkWidget *window, gpointer *data) { - GtkClipboard *clipboard; - - clipboard = gtk_widget_get_clipboard (window, - GDK_SELECTION_CLIPBOARD); - - g_signal_handlers_disconnect_by_func (clipboard, - G_CALLBACK (clipboard_owner_change), - window); + GtkClipboard *clipboard; + clipboard = gtk_widget_get_clipboard (window, GDK_SELECTION_CLIPBOARD); + g_signal_handlers_disconnect_by_func (clipboard, G_CALLBACK (clipboard_owner_change), window); } static void -check_window_is_active (XedWindow *window, - GParamSpec *property, - gpointer useless) +check_window_is_active (XedWindow *window, GParamSpec *property, gpointer useless) { - if (window->priv->window_state & GDK_WINDOW_STATE_FULLSCREEN) - { - if (gtk_window_is_active (GTK_WINDOW (window))) - { - gtk_widget_show (window->priv->fullscreen_controls); - } - else - { - gtk_widget_hide (window->priv->fullscreen_controls); - } - } + if (window->priv->window_state & GDK_WINDOW_STATE_FULLSCREEN) { + if (gtk_window_is_active (GTK_WINDOW (window))) { + gtk_widget_show (window->priv->fullscreen_controls); + } + else { + gtk_widget_hide (window->priv->fullscreen_controls); + } + } } static void -connect_notebook_signals (XedWindow *window, - GtkWidget *notebook) +connect_notebook_signals (XedWindow *window, GtkWidget *notebook) { - g_signal_connect (notebook, - "switch-page", - G_CALLBACK (notebook_switch_page), - window); - g_signal_connect (notebook, - "tab-added", - G_CALLBACK (notebook_tab_added), - window); - g_signal_connect (notebook, - "tab-removed", - G_CALLBACK (notebook_tab_removed), - window); - g_signal_connect (notebook, - "tabs-reordered", - G_CALLBACK (notebook_tabs_reordered), - window); - g_signal_connect (notebook, - "tab-detached", - G_CALLBACK (notebook_tab_detached), - window); - g_signal_connect (notebook, - "tab-close-request", - G_CALLBACK (notebook_tab_close_request), - window); - g_signal_connect (notebook, - "button-press-event", - G_CALLBACK (notebook_button_press_event), - window); - g_signal_connect (notebook, - "popup-menu", - G_CALLBACK (notebook_popup_menu), - window); + g_signal_connect (notebook, "switch-page", G_CALLBACK (notebook_switch_page), window); + g_signal_connect (notebook, "tab-added", G_CALLBACK (notebook_tab_added), window); + g_signal_connect (notebook, "tab-removed", G_CALLBACK (notebook_tab_removed), window); + g_signal_connect (notebook, "tabs-reordered", G_CALLBACK (notebook_tabs_reordered), window); + g_signal_connect (notebook, "tab-detached", G_CALLBACK (notebook_tab_detached), window); + g_signal_connect (notebook, "tab-close-request", G_CALLBACK (notebook_tab_close_request), window); + g_signal_connect (notebook, "button-press-event", G_CALLBACK (notebook_button_press_event), window); + g_signal_connect (notebook, "popup-menu", G_CALLBACK (notebook_popup_menu), window); } static void -add_notebook (XedWindow *window, - GtkWidget *notebook) +add_notebook (XedWindow *window, GtkWidget *notebook) { - gtk_paned_pack1 (GTK_PANED (window->priv->vpaned), - notebook, - TRUE, - TRUE); - - gtk_widget_show (notebook); - - connect_notebook_signals (window, notebook); + gtk_paned_pack1 (GTK_PANED (window->priv->vpaned), notebook, TRUE, TRUE); + gtk_widget_show (notebook); + connect_notebook_signals (window, notebook); } static void xed_window_init (XedWindow *window) { - GtkWidget *main_box; - GtkTargetList *tl; + GtkWidget *main_box; + GtkTargetList *tl; - xed_debug (DEBUG_WINDOW); + xed_debug (DEBUG_WINDOW); - window->priv = XED_WINDOW_GET_PRIVATE (window); - window->priv->active_tab = NULL; - window->priv->num_tabs = 0; - window->priv->removing_tabs = FALSE; - window->priv->state = XED_WINDOW_STATE_NORMAL; - window->priv->dispose_has_run = FALSE; - window->priv->fullscreen_controls = NULL; - window->priv->fullscreen_animation_timeout_id = 0; + window->priv = XED_WINDOW_GET_PRIVATE (window); + window->priv->active_tab = NULL; + window->priv->num_tabs = 0; + window->priv->removing_tabs = FALSE; + window->priv->state = XED_WINDOW_STATE_NORMAL; + window->priv->dispose_has_run = FALSE; + window->priv->fullscreen_controls = NULL; + window->priv->fullscreen_animation_timeout_id = 0; - window->priv->message_bus = xed_message_bus_new (); + window->priv->message_bus = xed_message_bus_new (); - window->priv->window_group = gtk_window_group_new (); - gtk_window_group_add_window (window->priv->window_group, GTK_WINDOW (window)); + window->priv->window_group = gtk_window_group_new (); + gtk_window_group_add_window (window->priv->window_group, GTK_WINDOW (window)); - main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_container_add (GTK_CONTAINER (window), main_box); - gtk_widget_show (main_box); + main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (window), main_box); + gtk_widget_show (main_box); - /* Add menu bar and toolbar bar */ - create_menu_bar_and_toolbar (window, main_box); + /* Add menu bar and toolbar bar */ + create_menu_bar_and_toolbar (window, main_box); - /* If we're running as root, add and infobar to warn about elevated privileges */ - if (geteuid() == 0) { - GtkWidget *root_bar = gtk_info_bar_new (); - gtk_info_bar_set_message_type (GTK_INFO_BAR (root_bar), GTK_MESSAGE_ERROR); - GtkWidget *content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (root_bar)); - GtkWidget *label = gtk_label_new (_("Elevated Privileges")); - gtk_widget_show (label); - gtk_container_add (GTK_CONTAINER (content_area), label); - gtk_box_pack_start (GTK_BOX (main_box), root_bar, FALSE, FALSE, 0); - gtk_widget_set_visible (root_bar, TRUE); - } + /* If we're running as root, add and infobar to warn about elevated privileges */ + if (geteuid() == 0) { + GtkWidget *root_bar = gtk_info_bar_new (); + gtk_info_bar_set_message_type (GTK_INFO_BAR (root_bar), GTK_MESSAGE_ERROR); + GtkWidget *content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (root_bar)); + GtkWidget *label = gtk_label_new (_("Elevated Privileges")); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (content_area), label); + gtk_box_pack_start (GTK_BOX (main_box), root_bar, FALSE, FALSE, 0); + gtk_widget_set_visible (root_bar, TRUE); + } - /* Add status bar */ - create_statusbar (window, main_box); + /* Add status bar */ + create_statusbar (window, main_box); - /* Add the main area */ - xed_debug_message (DEBUG_WINDOW, "Add main area"); - window->priv->hpaned = gtk_hpaned_new (); - gtk_box_pack_start (GTK_BOX (main_box), - window->priv->hpaned, - TRUE, - TRUE, - 0); + /* Add the main area */ + xed_debug_message (DEBUG_WINDOW, "Add main area"); + window->priv->hpaned = gtk_hpaned_new (); + gtk_box_pack_start (GTK_BOX (main_box), window->priv->hpaned, TRUE, TRUE, 0); - window->priv->vpaned = gtk_vpaned_new (); - gtk_paned_pack2 (GTK_PANED (window->priv->hpaned), - window->priv->vpaned, - TRUE, - FALSE); - - xed_debug_message (DEBUG_WINDOW, "Create xed notebook"); - window->priv->notebook = xed_notebook_new (); - add_notebook (window, window->priv->notebook); + window->priv->vpaned = gtk_vpaned_new (); + gtk_paned_pack2 (GTK_PANED (window->priv->hpaned), window->priv->vpaned, TRUE, FALSE); - /* side and bottom panels */ - create_side_panel (window); - create_bottom_panel (window); + xed_debug_message (DEBUG_WINDOW, "Create xed notebook"); + window->priv->notebook = xed_notebook_new (); + add_notebook (window, window->priv->notebook); - /* panes' state must be restored after panels have been mapped, - * since the bottom pane position depends on the size of the vpaned. */ - window->priv->side_panel_size = xed_prefs_manager_get_side_panel_size (); - window->priv->bottom_panel_size = xed_prefs_manager_get_bottom_panel_size (); + /* side and bottom panels */ + create_side_panel (window); + create_bottom_panel (window); - g_signal_connect_after (window->priv->hpaned, - "map", - G_CALLBACK (hpaned_restore_position), - window); - g_signal_connect_after (window->priv->vpaned, - "map", - G_CALLBACK (vpaned_restore_position), - window); + /* panes' state must be restored after panels have been mapped, + * since the bottom pane position depends on the size of the vpaned. */ + window->priv->side_panel_size = xed_prefs_manager_get_side_panel_size (); + window->priv->bottom_panel_size = xed_prefs_manager_get_bottom_panel_size (); - gtk_widget_show (window->priv->hpaned); - gtk_widget_show (window->priv->vpaned); + g_signal_connect_after (window->priv->hpaned, "map", G_CALLBACK (hpaned_restore_position), window); + g_signal_connect_after (window->priv->vpaned, "map", G_CALLBACK (vpaned_restore_position), window); - /* Drag and drop support, set targets to NULL because we add the - default uri_targets below */ - gtk_drag_dest_set (GTK_WIDGET (window), - GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_DROP, - NULL, - 0, - GDK_ACTION_COPY); + gtk_widget_show (window->priv->hpaned); + gtk_widget_show (window->priv->vpaned); - /* Add uri targets */ - tl = gtk_drag_dest_get_target_list (GTK_WIDGET (window)); - - if (tl == NULL) - { - tl = gtk_target_list_new (NULL, 0); - gtk_drag_dest_set_target_list (GTK_WIDGET (window), tl); - gtk_target_list_unref (tl); - } - - gtk_target_list_add_uri_targets (tl, TARGET_URI_LIST); + /* Drag and drop support, set targets to NULL because we add the + default uri_targets below */ + gtk_drag_dest_set (GTK_WIDGET (window), + GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, + NULL, 0, GDK_ACTION_COPY); - /* connect instead of override, so that we can - * share the cb code with the view */ - g_signal_connect (window, - "drag_data_received", - G_CALLBACK (drag_data_received_cb), - NULL); + /* Add uri targets */ + tl = gtk_drag_dest_get_target_list (GTK_WIDGET (window)); - /* we can get the clipboard only after the widget - * is realized */ - g_signal_connect (window, - "realize", - G_CALLBACK (window_realized), - NULL); - g_signal_connect (window, - "unrealize", - G_CALLBACK (window_unrealized), - NULL); + if (tl == NULL) { + tl = gtk_target_list_new (NULL, 0); + gtk_drag_dest_set_target_list (GTK_WIDGET (window), tl); + gtk_target_list_unref (tl); + } - /* Check if the window is active for fullscreen */ - g_signal_connect (window, - "notify::is-active", - G_CALLBACK (check_window_is_active), - NULL); + gtk_target_list_add_uri_targets (tl, TARGET_URI_LIST); - xed_debug_message (DEBUG_WINDOW, "Update plugins ui"); - - xed_plugins_engine_activate_plugins (xed_plugins_engine_get_default (), - window); + /* connect instead of override, so that we can + * share the cb code with the view */ + g_signal_connect (window, "drag_data_received", G_CALLBACK (drag_data_received_cb), NULL); - /* set visibility of panes. - * This needs to be done after plugins activatation */ - init_panels_visibility (window); + /* we can get the clipboard only after the widget + * is realized */ + g_signal_connect (window, "realize", G_CALLBACK (window_realized), NULL); + g_signal_connect (window, "unrealize", G_CALLBACK (window_unrealized), NULL); - update_sensitivity_according_to_open_tabs (window); + /* Check if the window is active for fullscreen */ + g_signal_connect (window, "notify::is-active", G_CALLBACK (check_window_is_active), NULL); - xed_debug_message (DEBUG_WINDOW, "END"); + g_signal_connect (GTK_WIDGET (window), "key-press-event", G_CALLBACK (on_key_pressed), window); + + xed_debug_message (DEBUG_WINDOW, "Update plugins ui"); + + xed_plugins_engine_activate_plugins (xed_plugins_engine_get_default (), window); + + /* set visibility of panes. + * This needs to be done after plugins activatation */ + init_panels_visibility (window); + + update_sensitivity_according_to_open_tabs (window); + + xed_debug_message (DEBUG_WINDOW, "END"); } /** @@ -3923,16 +3074,19 @@ xed_window_init (XedWindow *window) XedView * xed_window_get_active_view (XedWindow *window) { - XedView *view; + XedView *view; - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + if (window == NULL) { + return NULL; + } - if (window->priv->active_tab == NULL) - return NULL; + if (window->priv->active_tab == NULL) { + return NULL; + } - view = xed_tab_get_view (XED_TAB (window->priv->active_tab)); + view = xed_tab_get_view (XED_TAB (window->priv->active_tab)); - return view; + return view; } /** @@ -3940,29 +3094,32 @@ xed_window_get_active_view (XedWindow *window) * @window: a #XedWindow * * Gets the active #XedDocument. - * + * * Returns: the active #XedDocument */ XedDocument * xed_window_get_active_document (XedWindow *window) { - XedView *view; + XedView *view; - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + if (window == NULL) { + return NULL; + } - view = xed_window_get_active_view (window); - if (view == NULL) - return NULL; + view = xed_window_get_active_view (window); + if (view == NULL) { + return NULL; + } - return XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); + return XED_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); } GtkWidget * _xed_window_get_notebook (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - return window->priv->notebook; + return window->priv->notebook; } /** @@ -3976,27 +3133,22 @@ _xed_window_get_notebook (XedWindow *window) * Returns: a new #XedTab */ XedTab * -xed_window_create_tab (XedWindow *window, - gboolean jump_to) +xed_window_create_tab (XedWindow *window, gboolean jump_to) { - XedTab *tab; + XedTab *tab; - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - tab = XED_TAB (_xed_tab_new ()); - gtk_widget_show (GTK_WIDGET (tab)); + tab = XED_TAB (_xed_tab_new ()); + gtk_widget_show (GTK_WIDGET (tab)); - xed_notebook_add_tab (XED_NOTEBOOK (window->priv->notebook), - tab, - -1, - jump_to); + xed_notebook_add_tab (XED_NOTEBOOK (window->priv->notebook), tab, -1, jump_to); - if (!gtk_widget_get_visible (GTK_WIDGET (window))) - { - gtk_window_present (GTK_WINDOW (window)); - } + if (!gtk_widget_get_visible (GTK_WIDGET (window))) { + gtk_window_present (GTK_WINDOW (window)); + } - return tab; + return tab; } /** @@ -4010,46 +3162,35 @@ xed_window_create_tab (XedWindow *window, * * Creates a new #XedTab loading the document specified by @uri. * In case @jump_to is %TRUE the #XedNotebook swithes to that new #XedTab. - * Whether @create is %TRUE, creates a new empty document if location does + * Whether @create is %TRUE, creates a new empty document if location does * not refer to an existing file * * Returns: a new #XedTab */ XedTab * -xed_window_create_tab_from_uri (XedWindow *window, - const gchar *uri, - const XedEncoding *encoding, - gint line_pos, - gboolean create, - gboolean jump_to) +xed_window_create_tab_from_uri (XedWindow *window, const gchar *uri, const XedEncoding *encoding, gint line_pos, + gboolean create, gboolean jump_to) { - GtkWidget *tab; + GtkWidget *tab; - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - g_return_val_if_fail (uri != NULL, NULL); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + g_return_val_if_fail (uri != NULL, NULL); - tab = _xed_tab_new_from_uri (uri, - encoding, - line_pos, - create); - if (tab == NULL) - return NULL; + tab = _xed_tab_new_from_uri (uri, encoding, line_pos, create); + if (tab == NULL) { + return NULL; + } - gtk_widget_show (tab); - - xed_notebook_add_tab (XED_NOTEBOOK (window->priv->notebook), - XED_TAB (tab), - -1, - jump_to); + gtk_widget_show (tab); + xed_notebook_add_tab (XED_NOTEBOOK (window->priv->notebook), XED_TAB (tab), -1, jump_to); - if (!gtk_widget_get_visible (GTK_WIDGET (window))) - { - gtk_window_present (GTK_WINDOW (window)); - } + if (!gtk_widget_get_visible (GTK_WIDGET (window))) { + gtk_window_present (GTK_WINDOW (window)); + } - return XED_TAB (tab); -} + return XED_TAB (tab); +} /** * xed_window_get_active_tab: @@ -4062,20 +3203,24 @@ xed_window_create_tab_from_uri (XedWindow *window, XedTab * xed_window_get_active_tab (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - return (window->priv->active_tab == NULL) ? - NULL : XED_TAB (window->priv->active_tab); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + + if (window->priv->active_tab == NULL) { + return NULL; + } + else { + return XED_TAB (window->priv->active_tab); + } } static void add_document (XedTab *tab, GList **res) { - XedDocument *doc; - - doc = xed_tab_get_document (tab); - - *res = g_list_prepend (*res, doc); + XedDocument *doc; + + doc = xed_tab_get_document (tab); + + *res = g_list_prepend (*res, doc); } /** @@ -4091,27 +3236,19 @@ add_document (XedTab *tab, GList **res) GList * xed_window_get_documents (XedWindow *window) { - GList *res = NULL; - - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - gtk_container_foreach (GTK_CONTAINER (window->priv->notebook), - (GtkCallback)add_document, - &res); - - res = g_list_reverse (res); - - return res; + GList *res = NULL; + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + gtk_container_foreach (GTK_CONTAINER (window->priv->notebook), (GtkCallback)add_document, &res); + res = g_list_reverse (res); + return res; } static void add_view (XedTab *tab, GList **res) { - XedView *view; - - view = xed_tab_get_view (tab); - - *res = g_list_prepend (*res, view); + XedView *view; + view = xed_tab_get_view (tab); + *res = g_list_prepend (*res, view); } /** @@ -4126,17 +3263,11 @@ add_view (XedTab *tab, GList **res) GList * xed_window_get_views (XedWindow *window) { - GList *res = NULL; - - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - gtk_container_foreach (GTK_CONTAINER (window->priv->notebook), - (GtkCallback)add_view, - &res); - - res = g_list_reverse (res); - - return res; + GList *res = NULL; + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + gtk_container_foreach (GTK_CONTAINER (window->priv->notebook), (GtkCallback)add_view, &res); + res = g_list_reverse (res); + return res; } /** @@ -4147,16 +3278,14 @@ xed_window_get_views (XedWindow *window) * Closes the @tab. */ void -xed_window_close_tab (XedWindow *window, - XedTab *tab) +xed_window_close_tab (XedWindow *window, XedTab *tab) { - g_return_if_fail (XED_IS_WINDOW (window)); - g_return_if_fail (XED_IS_TAB (tab)); - g_return_if_fail ((xed_tab_get_state (tab) != XED_TAB_STATE_SAVING) && - (xed_tab_get_state (tab) != XED_TAB_STATE_SHOWING_PRINT_PREVIEW)); - - xed_notebook_remove_tab (XED_NOTEBOOK (window->priv->notebook), - tab); + g_return_if_fail (XED_IS_WINDOW (window)); + g_return_if_fail (XED_IS_TAB (tab)); + g_return_if_fail ((xed_tab_get_state (tab) != XED_TAB_STATE_SAVING) && + (xed_tab_get_state (tab) != XED_TAB_STATE_SHOWING_PRINT_PREVIEW)); + + xed_notebook_remove_tab (XED_NOTEBOOK (window->priv->notebook), tab); } /** @@ -4168,15 +3297,13 @@ xed_window_close_tab (XedWindow *window, void xed_window_close_all_tabs (XedWindow *window) { - g_return_if_fail (XED_IS_WINDOW (window)); - g_return_if_fail (!(window->priv->state & XED_WINDOW_STATE_SAVING) && - !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); + g_return_if_fail (XED_IS_WINDOW (window)); + g_return_if_fail (!(window->priv->state & XED_WINDOW_STATE_SAVING) && + !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); - window->priv->removing_tabs = TRUE; - - xed_notebook_remove_all_tabs (XED_NOTEBOOK (window->priv->notebook)); - - window->priv->removing_tabs = FALSE; + window->priv->removing_tabs = TRUE; + xed_notebook_remove_all_tabs (XED_NOTEBOOK (window->priv->notebook)); + window->priv->removing_tabs = FALSE; } /** @@ -4187,55 +3314,45 @@ xed_window_close_all_tabs (XedWindow *window) * Closes all tabs specified by @tabs. */ void -xed_window_close_tabs (XedWindow *window, - const GList *tabs) +xed_window_close_tabs (XedWindow *window, const GList *tabs) { - g_return_if_fail (XED_IS_WINDOW (window)); - g_return_if_fail (!(window->priv->state & XED_WINDOW_STATE_SAVING) && - !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); + g_return_if_fail (XED_IS_WINDOW (window)); + g_return_if_fail (!(window->priv->state & XED_WINDOW_STATE_SAVING) && + !(window->priv->state & XED_WINDOW_STATE_SAVING_SESSION)); - if (tabs == NULL) - return; + if (tabs == NULL) { + return; + } - window->priv->removing_tabs = TRUE; + window->priv->removing_tabs = TRUE; - while (tabs != NULL) - { - if (tabs->next == NULL) - window->priv->removing_tabs = FALSE; + while (tabs != NULL) { + if (tabs->next == NULL) { + window->priv->removing_tabs = FALSE; + } - xed_notebook_remove_tab (XED_NOTEBOOK (window->priv->notebook), - XED_TAB (tabs->data)); + xed_notebook_remove_tab (XED_NOTEBOOK (window->priv->notebook), XED_TAB (tabs->data)); + tabs = g_list_next (tabs); + } - tabs = g_list_next (tabs); - } - - g_return_if_fail (window->priv->removing_tabs == FALSE); + g_return_if_fail (window->priv->removing_tabs == FALSE); } XedWindow * -_xed_window_move_tab_to_new_window (XedWindow *window, - XedTab *tab) +_xed_window_move_tab_to_new_window (XedWindow *window, XedTab *tab) { - XedWindow *new_window; + XedWindow *new_window; - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - g_return_val_if_fail (XED_IS_TAB (tab), NULL); - g_return_val_if_fail (gtk_notebook_get_n_pages ( - GTK_NOTEBOOK (window->priv->notebook)) > 1, - NULL); - - new_window = clone_window (window); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + g_return_val_if_fail (XED_IS_TAB (tab), NULL); + g_return_val_if_fail (gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->priv->notebook)) > 1, NULL); - xed_notebook_move_tab (XED_NOTEBOOK (window->priv->notebook), - XED_NOTEBOOK (new_window->priv->notebook), - tab, - -1); - - gtk_widget_show (GTK_WIDGET (new_window)); - - return new_window; -} + new_window = clone_window (window); + xed_notebook_move_tab (XED_NOTEBOOK (window->priv->notebook), XED_NOTEBOOK (new_window->priv->notebook), tab, -1); + gtk_widget_show (GTK_WIDGET (new_window)); + + return new_window; +} /** * xed_window_set_active_tab: @@ -4245,20 +3362,16 @@ _xed_window_move_tab_to_new_window (XedWindow *window, * Switches to the tab that matches with @tab. */ void -xed_window_set_active_tab (XedWindow *window, - XedTab *tab) +xed_window_set_active_tab (XedWindow *window, XedTab *tab) { - gint page_num; - - g_return_if_fail (XED_IS_WINDOW (window)); - g_return_if_fail (XED_IS_TAB (tab)); - - page_num = gtk_notebook_page_num (GTK_NOTEBOOK (window->priv->notebook), - GTK_WIDGET (tab)); - g_return_if_fail (page_num != -1); - - gtk_notebook_set_current_page (GTK_NOTEBOOK (window->priv->notebook), - page_num); + gint page_num; + + g_return_if_fail (XED_IS_WINDOW (window)); + g_return_if_fail (XED_IS_TAB (tab)); + + page_num = gtk_notebook_page_num (GTK_NOTEBOOK (window->priv->notebook), GTK_WIDGET (tab)); + g_return_if_fail (page_num != -1); + gtk_notebook_set_current_page (GTK_NOTEBOOK (window->priv->notebook), page_num); } /** @@ -4272,17 +3385,15 @@ xed_window_set_active_tab (XedWindow *window, GtkWindowGroup * xed_window_get_group (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - return window->priv->window_group; + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + return window->priv->window_group; } gboolean _xed_window_is_removing_tabs (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), FALSE); - - return window->priv->removing_tabs; + g_return_val_if_fail (XED_IS_WINDOW (window), FALSE); + return window->priv->removing_tabs; } /** @@ -4296,9 +3407,8 @@ _xed_window_is_removing_tabs (XedWindow *window) GtkUIManager * xed_window_get_ui_manager (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - return window->priv->manager; + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + return window->priv->manager; } /** @@ -4312,9 +3422,8 @@ xed_window_get_ui_manager (XedWindow *window) XedPanel * xed_window_get_side_panel (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - return XED_PANEL (window->priv->side_panel); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + return XED_PANEL (window->priv->side_panel); } /** @@ -4328,9 +3437,8 @@ xed_window_get_side_panel (XedWindow *window) XedPanel * xed_window_get_bottom_panel (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - return XED_PANEL (window->priv->bottom_panel); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + return XED_PANEL (window->priv->bottom_panel); } /** @@ -4344,9 +3452,23 @@ xed_window_get_bottom_panel (XedWindow *window) GtkWidget * xed_window_get_statusbar (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), 0); + g_return_val_if_fail (XED_IS_WINDOW (window), 0); + return window->priv->statusbar; +} - return window->priv->statusbar; +/** + * xed_window_get_searchbar: + * @window: a #XedWindow + * + * Gets the #XedSearchDialog of the @window. + * + * Returns: the #XedSearchDialog of the @window. + */ +GtkWidget * +xed_window_get_searchbar (XedWindow *window) +{ + g_return_val_if_fail (XED_IS_WINDOW (window), 0); + return window->priv->searchbar; } /** @@ -4360,36 +3482,38 @@ xed_window_get_statusbar (XedWindow *window) XedWindowState xed_window_get_state (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), XED_WINDOW_STATE_NORMAL); - - return window->priv->state; + g_return_val_if_fail (XED_IS_WINDOW (window), XED_WINDOW_STATE_NORMAL); + return window->priv->state; } GFile * _xed_window_get_default_location (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - return window->priv->default_location != NULL ? - g_object_ref (window->priv->default_location) : NULL; + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + if (window->priv->default_location != NULL) { + return g_object_ref (window->priv->default_location); + } + else { + return NULL; + } } void -_xed_window_set_default_location (XedWindow *window, - GFile *location) +_xed_window_set_default_location (XedWindow *window, GFile *location) { - GFile *dir; + GFile *dir; - g_return_if_fail (XED_IS_WINDOW (window)); - g_return_if_fail (G_IS_FILE (location)); + g_return_if_fail (XED_IS_WINDOW (window)); + g_return_if_fail (G_IS_FILE (location)); - dir = g_file_get_parent (location); - g_return_if_fail (dir != NULL); + dir = g_file_get_parent (location); + g_return_if_fail (dir != NULL); - if (window->priv->default_location != NULL) - g_object_unref (window->priv->default_location); + if (window->priv->default_location != NULL) { + g_object_unref (window->priv->default_location); + } - window->priv->default_location = dir; + window->priv->default_location = dir; } /** @@ -4404,144 +3528,126 @@ _xed_window_set_default_location (XedWindow *window, GList * xed_window_get_unsaved_documents (XedWindow *window) { - GList *unsaved_docs = NULL; - GList *tabs; - GList *l; + GList *unsaved_docs = NULL; + GList *tabs; + GList *l; - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - tabs = gtk_container_get_children (GTK_CONTAINER (window->priv->notebook)); - - l = tabs; - while (l != NULL) - { - XedTab *tab; + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - tab = XED_TAB (l->data); - - if (!_xed_tab_can_close (tab)) - { - XedDocument *doc; - - doc = xed_tab_get_document (tab); - unsaved_docs = g_list_prepend (unsaved_docs, doc); - } - - l = g_list_next (l); - } - - g_list_free (tabs); + tabs = gtk_container_get_children (GTK_CONTAINER (window->priv->notebook)); - return g_list_reverse (unsaved_docs); + l = tabs; + while (l != NULL) { + XedTab *tab; + tab = XED_TAB (l->data); + if (!_xed_tab_can_close (tab)) { + XedDocument *doc; + doc = xed_tab_get_document (tab); + unsaved_docs = g_list_prepend (unsaved_docs, doc); + } + l = g_list_next (l); + } + + g_list_free (tabs); + + return g_list_reverse (unsaved_docs); } -void -_xed_window_set_saving_session_state (XedWindow *window, - gboolean saving_session) +void +_xed_window_set_saving_session_state (XedWindow *window, gboolean saving_session) { - XedWindowState old_state; + XedWindowState old_state; - g_return_if_fail (XED_IS_WINDOW (window)); - - old_state = window->priv->state; + g_return_if_fail (XED_IS_WINDOW (window)); - if (saving_session) - window->priv->state |= XED_WINDOW_STATE_SAVING_SESSION; - else - window->priv->state &= ~XED_WINDOW_STATE_SAVING_SESSION; + old_state = window->priv->state; - if (old_state != window->priv->state) - { - set_sensitivity_according_to_window_state (window); + if (saving_session) { + window->priv->state |= XED_WINDOW_STATE_SAVING_SESSION; + } + else { + window->priv->state &= ~XED_WINDOW_STATE_SAVING_SESSION; + } - g_object_notify (G_OBJECT (window), "state"); - } + if (old_state != window->priv->state) { + set_sensitivity_according_to_window_state (window); + g_object_notify (G_OBJECT (window), "state"); + } } static void -hide_notebook_tabs_on_fullscreen (GtkNotebook *notebook, - GParamSpec *pspec, - XedWindow *window) +hide_notebook_tabs_on_fullscreen (GtkNotebook *notebook, GParamSpec *pspec, XedWindow *window) { - gtk_notebook_set_show_tabs (notebook, FALSE); + gtk_notebook_set_show_tabs (notebook, FALSE); } void _xed_window_fullscreen (XedWindow *window) { - g_return_if_fail (XED_IS_WINDOW (window)); + g_return_if_fail (XED_IS_WINDOW (window)); - if (_xed_window_is_fullscreen (window)) - return; + if (_xed_window_is_fullscreen (window)) { + return; + } - /* Go to fullscreen mode and hide bars */ - gtk_window_fullscreen (&window->window); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (window->priv->notebook), FALSE); - g_signal_connect (window->priv->notebook, "notify::show-tabs", - G_CALLBACK (hide_notebook_tabs_on_fullscreen), window); - - gtk_widget_hide (window->priv->menubar); - - g_signal_handlers_block_by_func (window->priv->toolbar, - toolbar_visibility_changed, - window); - gtk_widget_hide (window->priv->toolbar); - - g_signal_handlers_block_by_func (window->priv->statusbar, - statusbar_visibility_changed, - window); - gtk_widget_hide (window->priv->statusbar); + /* Go to fullscreen mode and hide bars */ + gtk_window_fullscreen (&window->window); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (window->priv->notebook), FALSE); + g_signal_connect (window->priv->notebook, "notify::show-tabs", + G_CALLBACK (hide_notebook_tabs_on_fullscreen), window); - fullscreen_controls_build (window); - fullscreen_controls_show (window); + gtk_widget_hide (window->priv->menubar); + + g_signal_handlers_block_by_func (window->priv->toolbar, toolbar_visibility_changed, window); + gtk_widget_hide (window->priv->toolbar); + + g_signal_handlers_block_by_func (window->priv->statusbar, statusbar_visibility_changed, window); + gtk_widget_hide (window->priv->statusbar); + + fullscreen_controls_build (window); + fullscreen_controls_show (window); } void _xed_window_unfullscreen (XedWindow *window) { - gboolean visible; - GtkAction *action; + gboolean visible; + GtkAction *action; - g_return_if_fail (XED_IS_WINDOW (window)); + g_return_if_fail (XED_IS_WINDOW (window)); - if (!_xed_window_is_fullscreen (window)) - return; + if (!_xed_window_is_fullscreen (window)) { + return; + } - /* Unfullscreen and show bars */ - gtk_window_unfullscreen (&window->window); - g_signal_handlers_disconnect_by_func (window->priv->notebook, - hide_notebook_tabs_on_fullscreen, - window); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (window->priv->notebook), TRUE); - gtk_widget_show (window->priv->menubar); - - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "ViewToolbar"); - visible = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); - if (visible) - gtk_widget_show (window->priv->toolbar); - g_signal_handlers_unblock_by_func (window->priv->toolbar, - toolbar_visibility_changed, - window); - - action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, - "ViewStatusbar"); - visible = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); - if (visible) - gtk_widget_show (window->priv->statusbar); - g_signal_handlers_unblock_by_func (window->priv->statusbar, - statusbar_visibility_changed, - window); + /* Unfullscreen and show bars */ + gtk_window_unfullscreen (&window->window); + g_signal_handlers_disconnect_by_func (window->priv->notebook, hide_notebook_tabs_on_fullscreen, window); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (window->priv->notebook), TRUE); + gtk_widget_show (window->priv->menubar); - gtk_widget_hide (window->priv->fullscreen_controls); + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "ViewToolbar"); + visible = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + if (visible) { + gtk_widget_show (window->priv->toolbar); + } + g_signal_handlers_unblock_by_func (window->priv->toolbar, toolbar_visibility_changed, window); + + action = gtk_action_group_get_action (window->priv->always_sensitive_action_group, "ViewStatusbar"); + visible = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); + if (visible) { + gtk_widget_show (window->priv->statusbar); + } + g_signal_handlers_unblock_by_func (window->priv->statusbar, statusbar_visibility_changed, window); + + gtk_widget_hide (window->priv->fullscreen_controls); } gboolean _xed_window_is_fullscreen (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), FALSE); - - return window->priv->window_state & GDK_WINDOW_STATE_FULLSCREEN; + g_return_val_if_fail (XED_IS_WINDOW (window), FALSE); + return window->priv->window_state & GDK_WINDOW_STATE_FULLSCREEN; } /** @@ -4554,46 +3660,40 @@ _xed_window_is_fullscreen (XedWindow *window) * Returns: the #XedTab that matches with the given @location. */ XedTab * -xed_window_get_tab_from_location (XedWindow *window, - GFile *location) +xed_window_get_tab_from_location (XedWindow *window, GFile *location) { - GList *tabs; - GList *l; - XedTab *ret = NULL; + GList *tabs; + GList *l; + XedTab *ret = NULL; - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - g_return_val_if_fail (G_IS_FILE (location), NULL); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + g_return_val_if_fail (G_IS_FILE (location), NULL); - tabs = gtk_container_get_children (GTK_CONTAINER (window->priv->notebook)); - - for (l = tabs; l != NULL; l = g_list_next (l)) - { - XedDocument *d; - XedTab *t; - GFile *f; + tabs = gtk_container_get_children (GTK_CONTAINER (window->priv->notebook)); - t = XED_TAB (l->data); - d = xed_tab_get_document (t); + for (l = tabs; l != NULL; l = g_list_next (l)) { + XedDocument *d; + XedTab *t; + GFile *f; - f = xed_document_get_location (d); + t = XED_TAB (l->data); + d = xed_tab_get_document (t); - if ((f != NULL)) - { - gboolean found = g_file_equal (location, f); + f = xed_document_get_location (d); - g_object_unref (f); + if ((f != NULL)) { + gboolean found = g_file_equal (location, f); + g_object_unref (f); + if (found) { + ret = t; + break; + } + } + } - if (found) - { - ret = t; - break; - } - } - } - - g_list_free (tabs); - - return ret; + g_list_free (tabs); + + return ret; } /** @@ -4605,12 +3705,11 @@ xed_window_get_tab_from_location (XedWindow *window, * * Return value: (transfer none): the #XedMessageBus associated with @window */ -XedMessageBus * +XedMessageBus * xed_window_get_message_bus (XedWindow *window) { - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - - return window->priv->message_bus; + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + return window->priv->message_bus; } /** @@ -4625,18 +3724,17 @@ xed_window_get_message_bus (XedWindow *window) * Deprecated: 2.24: Use xed_window_get_tab_from_location() instead. */ XedTab * -xed_window_get_tab_from_uri (XedWindow *window, - const gchar *uri) +xed_window_get_tab_from_uri (XedWindow *window, const gchar *uri) { - GFile *f; - XedTab *tab; + GFile *f; + XedTab *tab; - g_return_val_if_fail (XED_IS_WINDOW (window), NULL); - g_return_val_if_fail (uri != NULL, NULL); + g_return_val_if_fail (XED_IS_WINDOW (window), NULL); + g_return_val_if_fail (uri != NULL, NULL); - f = g_file_new_for_uri (uri); - tab = xed_window_get_tab_from_location (window, f); - g_object_unref (f); + f = g_file_new_for_uri (uri); + tab = xed_window_get_tab_from_location (window, f); + g_object_unref (f); - return tab; + return tab; } diff --git a/xed/xed-window.h b/xed/xed-window.h index b924d70..5909d2f 100644 --- a/xed/xed-window.h +++ b/xed/xed-window.h @@ -1,33 +1,3 @@ -/* - * xed-window.h - * This file is part of xed - * - * Copyright (C) 2005 - Paolo Maggi - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANWINDOWILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/* - * Modified by the xed Team, 2005. See the AUTHORS file for a - * list of people on the xed Team. - * See the ChangeLog files for a list of changes. - * - * $Id$ - */ - #ifndef __XED_WINDOW_H__ #define __XED_WINDOW_H__ @@ -42,23 +12,23 @@ G_BEGIN_DECLS typedef enum { - XED_WINDOW_STATE_NORMAL = 0, - XED_WINDOW_STATE_SAVING = 1 << 1, - XED_WINDOW_STATE_PRINTING = 1 << 2, - XED_WINDOW_STATE_LOADING = 1 << 3, - XED_WINDOW_STATE_ERROR = 1 << 4, - XED_WINDOW_STATE_SAVING_SESSION = 1 << 5 + XED_WINDOW_STATE_NORMAL = 0, + XED_WINDOW_STATE_SAVING = 1 << 1, + XED_WINDOW_STATE_PRINTING = 1 << 2, + XED_WINDOW_STATE_LOADING = 1 << 3, + XED_WINDOW_STATE_ERROR = 1 << 4, + XED_WINDOW_STATE_SAVING_SESSION = 1 << 5 } XedWindowState; - + /* * Type checking and casting macros */ -#define XED_TYPE_WINDOW (xed_window_get_type()) -#define XED_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_WINDOW, XedWindow)) -#define XED_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XED_TYPE_WINDOW, XedWindowClass)) -#define XED_IS_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XED_TYPE_WINDOW)) -#define XED_IS_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XED_TYPE_WINDOW)) -#define XED_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XED_TYPE_WINDOW, XedWindowClass)) +#define XED_TYPE_WINDOW (xed_window_get_type()) +#define XED_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XED_TYPE_WINDOW, XedWindow)) +#define XED_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), XED_TYPE_WINDOW, XedWindowClass)) +#define XED_IS_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), XED_TYPE_WINDOW)) +#define XED_IS_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XED_TYPE_WINDOW)) +#define XED_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), XED_TYPE_WINDOW, XedWindowClass)) /* Private structure type */ typedef struct _XedWindowPrivate XedWindowPrivate; @@ -68,12 +38,12 @@ typedef struct _XedWindowPrivate XedWindowPrivate; */ typedef struct _XedWindow XedWindow; -struct _XedWindow +struct _XedWindow { - GtkWindow window; + GtkWindow window; - /*< private > */ - XedWindowPrivate *priv; + /*< private > */ + XedWindowPrivate *priv; }; /* @@ -81,115 +51,74 @@ struct _XedWindow */ typedef struct _XedWindowClass XedWindowClass; -struct _XedWindowClass +struct _XedWindowClass { - GtkWindowClass parent_class; - - /* Signals */ - void (* tab_added) (XedWindow *window, - XedTab *tab); - void (* tab_removed) (XedWindow *window, - XedTab *tab); - void (* tabs_reordered) (XedWindow *window); - void (* active_tab_changed) (XedWindow *window, - XedTab *tab); - void (* active_tab_state_changed) - (XedWindow *window); + GtkWindowClass parent_class; + + /* Signals */ + void (* tab_added) (XedWindow *window, XedTab *tab); + void (* tab_removed) (XedWindow *window, XedTab *tab); + void (* tabs_reordered) (XedWindow *window); + void (* active_tab_changed) (XedWindow *window, XedTab *tab); + void (* active_tab_state_changed) (XedWindow *window); }; /* * Public methods */ -GType xed_window_get_type (void) G_GNUC_CONST; - -XedTab *xed_window_create_tab (XedWindow *window, - gboolean jump_to); - -XedTab *xed_window_create_tab_from_uri (XedWindow *window, - const gchar *uri, - const XedEncoding *encoding, - gint line_pos, - gboolean create, - gboolean jump_to); - -void xed_window_close_tab (XedWindow *window, - XedTab *tab); - -void xed_window_close_all_tabs (XedWindow *window); - -void xed_window_close_tabs (XedWindow *window, - const GList *tabs); - -XedTab *xed_window_get_active_tab (XedWindow *window); - -void xed_window_set_active_tab (XedWindow *window, - XedTab *tab); +GType xed_window_get_type (void) G_GNUC_CONST; +XedTab *xed_window_create_tab (XedWindow *window, gboolean jump_to); +XedTab *xed_window_create_tab_from_uri (XedWindow *window, const gchar *uri, const XedEncoding *encoding, + gint line_pos, gboolean create, gboolean jump_to); +void xed_window_close_tab (XedWindow *window, XedTab *tab); +void xed_window_close_all_tabs (XedWindow *window); +void xed_window_close_tabs (XedWindow *window, const GList *tabs); +XedTab *xed_window_get_active_tab (XedWindow *window); +void xed_window_set_active_tab (XedWindow *window, XedTab *tab); /* Helper functions */ -XedView *xed_window_get_active_view (XedWindow *window); -XedDocument *xed_window_get_active_document (XedWindow *window); +XedView *xed_window_get_active_view (XedWindow *window); +XedDocument *xed_window_get_active_document (XedWindow *window); /* Returns a newly allocated list with all the documents in the window */ -GList *xed_window_get_documents (XedWindow *window); +GList *xed_window_get_documents (XedWindow *window); -/* Returns a newly allocated list with all the documents that need to be - saved before closing the window */ -GList *xed_window_get_unsaved_documents (XedWindow *window); +/* Returns a newly allocated list with all the documents that need to be + saved before closing the window */ +GList *xed_window_get_unsaved_documents (XedWindow *window); /* Returns a newly allocated list with all the views in the window */ -GList *xed_window_get_views (XedWindow *window); - -GtkWindowGroup *xed_window_get_group (XedWindow *window); - -XedPanel *xed_window_get_side_panel (XedWindow *window); - -XedPanel *xed_window_get_bottom_panel (XedWindow *window); - -GtkWidget *xed_window_get_statusbar (XedWindow *window); - -GtkUIManager *xed_window_get_ui_manager (XedWindow *window); - -XedWindowState xed_window_get_state (XedWindow *window); - -XedTab *xed_window_get_tab_from_location (XedWindow *window, - GFile *location); - -XedTab *xed_window_get_tab_from_uri (XedWindow *window, - const gchar *uri); +GList *xed_window_get_views (XedWindow *window); +GtkWindowGroup *xed_window_get_group (XedWindow *window); +XedPanel *xed_window_get_side_panel (XedWindow *window); +XedPanel *xed_window_get_bottom_panel (XedWindow *window); +GtkWidget *xed_window_get_statusbar (XedWindow *window); +GtkWidget *xed_window_get_searchbar (XedWindow *window); +GtkUIManager *xed_window_get_ui_manager (XedWindow *window); +XedWindowState xed_window_get_state (XedWindow *window); +XedTab *xed_window_get_tab_from_location (XedWindow *window, GFile *location); +XedTab *xed_window_get_tab_from_uri (XedWindow *window, const gchar *uri); /* Message bus */ -XedMessageBus *xed_window_get_message_bus (XedWindow *window); +XedMessageBus *xed_window_get_message_bus (XedWindow *window); /* * Non exported functions */ -GtkWidget *_xed_window_get_notebook (XedWindow *window); - -XedWindow *_xed_window_move_tab_to_new_window (XedWindow *window, - XedTab *tab); -gboolean _xed_window_is_removing_tabs (XedWindow *window); - -GFile *_xed_window_get_default_location (XedWindow *window); - -void _xed_window_set_default_location (XedWindow *window, - GFile *location); - -void _xed_window_set_saving_session_state (XedWindow *window, - gboolean saving_session); - -void _xed_window_fullscreen (XedWindow *window); - -void _xed_window_unfullscreen (XedWindow *window); - -gboolean _xed_window_is_fullscreen (XedWindow *window); +GtkWidget *_xed_window_get_notebook (XedWindow *window); +XedWindow *_xed_window_move_tab_to_new_window (XedWindow *window, XedTab *tab); +gboolean _xed_window_is_removing_tabs (XedWindow *window); +GFile *_xed_window_get_default_location (XedWindow *window); +void _xed_window_set_default_location (XedWindow *window, GFile *location); +void _xed_window_set_saving_session_state (XedWindow *window, gboolean saving_session); +void _xed_window_fullscreen (XedWindow *window); +void _xed_window_unfullscreen (XedWindow *window); +gboolean _xed_window_is_fullscreen (XedWindow *window); /* these are in xed-window because of screen safety */ -void _xed_recent_add (XedWindow *window, - const gchar *uri, - const gchar *mime); -void _xed_recent_remove (XedWindow *window, - const gchar *uri); +void _xed_recent_add (XedWindow *window, const gchar *uri, const gchar *mime); +void _xed_recent_remove (XedWindow *window, const gchar *uri); G_END_DECLS -#endif /* __XED_WINDOW_H__ */ +#endif /* __XED_WINDOW_H__ */