From b0383b732525ab5a7a1a7dbab99a46e6ce7891af Mon Sep 17 00:00:00 2001 From: Shuhao Wu Date: Mon, 8 Jul 2013 17:58:31 -0700 Subject: [PATCH] Added ability to strip trailing line on save. This feature is useful as most developers would like it so that trailing characters in lines are automatically stripped. --- mousepad/mousepad-document.c | 22 +++++++++++++++++++- mousepad/mousepad-document.h | 5 +++++ mousepad/mousepad-preferences.c | 11 ++++++++-- mousepad/mousepad-window-ui.xml | 3 +-- mousepad/mousepad-window.c | 46 +++++++++++++++++++++++++++-------------- 5 files changed, 66 insertions(+), 21 deletions(-) diff --git a/mousepad/mousepad-document.c b/mousepad/mousepad-document.c index d248dc9..3bec596 100644 --- a/mousepad/mousepad-document.c +++ b/mousepad/mousepad-document.c @@ -99,6 +99,7 @@ struct _MousepadDocumentPrivate /* settings */ guint word_wrap : 1; + guint strip_trailing_on_save : 1; }; @@ -176,7 +177,7 @@ static void mousepad_document_init (MousepadDocument *document) { GtkTargetList *target_list; - gboolean word_wrap, auto_indent, line_numbers, insert_spaces; + gboolean word_wrap, auto_indent, line_numbers, insert_spaces, strip_trailing_on_save; gchar *font_name, *color_scheme; gint tab_size; GtkSourceStyleScheme *scheme = NULL; @@ -229,6 +230,7 @@ mousepad_document_init (MousepadDocument *document) "view-tab-size", &tab_size, "view-insert-spaces", &insert_spaces, "view-color-scheme", &color_scheme, + "view-strip-trailing-on-save", &strip_trailing_on_save, NULL); /* release the preferences */ @@ -237,6 +239,7 @@ mousepad_document_init (MousepadDocument *document) /* set all the settings */ mousepad_document_set_word_wrap (document, word_wrap); mousepad_document_set_font (document, font_name); + mousepad_document_set_strip_trailing_on_save (document, strip_trailing_on_save); mousepad_view_set_line_numbers (document->textview, line_numbers); mousepad_view_set_auto_indent (document->textview, auto_indent); mousepad_view_set_tab_size (document->textview, tab_size); @@ -497,6 +500,15 @@ mousepad_document_set_word_wrap (MousepadDocument *document, word_wrap ? GTK_WRAP_WORD : GTK_WRAP_NONE); } +void +mousepad_document_set_strip_trailing_on_save (MousepadDocument *document, + gboolean strip_trailing_on_save) +{ + mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (document)); + + document->priv->strip_trailing_on_save = strip_trailing_on_save; +} + void @@ -648,3 +660,11 @@ mousepad_document_get_word_wrap (MousepadDocument *document) return document->priv->word_wrap; } + +gboolean +mousepad_document_get_strip_trailing_on_save (MousepadDocument *document) +{ + mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (document), FALSE); + + return document->priv->strip_trailing_on_save; +} \ No newline at end of file diff --git a/mousepad/mousepad-document.h b/mousepad/mousepad-document.h index f2176c1..7556375 100644 --- a/mousepad/mousepad-document.h +++ b/mousepad/mousepad-document.h @@ -69,6 +69,9 @@ void mousepad_document_set_overwrite (MousepadDocument *document, void mousepad_document_set_word_wrap (MousepadDocument *document, gboolean word_wrap); +void mousepad_document_set_strip_trailing_on_save (MousepadDocument *document, + gboolean strip_trailing_on_save); + void mousepad_document_focus_textview (MousepadDocument *document); void mousepad_document_send_signals (MousepadDocument *document); @@ -81,6 +84,8 @@ const gchar *mousepad_document_get_filename (MousepadDocument *document); gboolean mousepad_document_get_word_wrap (MousepadDocument *document); +gboolean mousepad_document_get_strip_trailing_on_save (MousepadDocument *document); + G_END_DECLS #endif /* !__MOUSEPAD_DOCUMENT_H__ */ diff --git a/mousepad/mousepad-preferences.c b/mousepad/mousepad-preferences.c index 90a84d6..a052cf3 100644 --- a/mousepad/mousepad-preferences.c +++ b/mousepad/mousepad-preferences.c @@ -62,6 +62,7 @@ enum PROP_VIEW_TABS_AS_SPACES, PROP_VIEW_WORD_WRAP, PROP_VIEW_COLOR_SCHEME, + PROP_VIEW_STRIP_TRAILING_ON_SAVE, /* window preferences */ PROP_WINDOW_HEIGHT, @@ -223,6 +224,14 @@ mousepad_preferences_class_init (MousepadPreferencesClass *klass) "none", MOUSEPAD_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, + PROP_VIEW_STRIP_TRAILING_ON_SAVE, + g_param_spec_boolean ("view-strip-trailing-on-save", + "ViewStripTrailingOnSave", + NULL, + FALSE, + MOUSEPAD_PARAM_READWRITE)); + /** * Window Preferences @@ -613,8 +622,6 @@ mousepad_preferences_store_idle (gpointer user_data) return FALSE; } - - static void mousepad_preferences_store_idle_destroy (gpointer user_data) { diff --git a/mousepad/mousepad-window-ui.xml b/mousepad/mousepad-window-ui.xml index f960bc6..173c3af 100644 --- a/mousepad/mousepad-window-ui.xml +++ b/mousepad/mousepad-window-ui.xml @@ -85,8 +85,6 @@ - - @@ -113,6 +111,7 @@ + diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c index b789d71..762b60a 100644 --- a/mousepad/mousepad-window.c +++ b/mousepad/mousepad-window.c @@ -306,8 +306,6 @@ static void mousepad_window_action_tabs_to_spaces (GtkAction MousepadWindow *window); static void mousepad_window_action_spaces_to_tabs (GtkAction *action, MousepadWindow *window); -static void mousepad_window_action_strip_trailing_spaces (GtkAction *action, - MousepadWindow *window); static void mousepad_window_action_transpose (GtkAction *action, MousepadWindow *window); static void mousepad_window_action_move_line_up (GtkAction *action, @@ -331,6 +329,8 @@ static void mousepad_window_action_word_wrap (GtkToggle MousepadWindow *window); static void mousepad_window_action_write_bom (GtkToggleAction *action, MousepadWindow *window); +static void mousepad_window_action_strip_on_save (GtkToggleAction *action, + MousepadWindow *window); static void mousepad_window_action_language (GtkToggleAction *action, MousepadWindow *window); static void mousepad_window_action_insert_spaces (GtkToggleAction *action, @@ -445,7 +445,6 @@ static const GtkActionEntry action_entries[] = { "opposite-case", NULL, N_("to _Opposite Case"), NULL, N_("Change the case of the selection opposite case"), G_CALLBACK (mousepad_window_action_opposite_case), }, { "tabs-to-spaces", NULL, N_("_Tabs to Spaces"), NULL, N_("Convert all tabs to spaces in the selection or document"), G_CALLBACK (mousepad_window_action_tabs_to_spaces), }, { "spaces-to-tabs", NULL, N_("_Spaces to Tabs"), NULL, N_("Convert all the leading spaces to tabs in the selected line(s) or document"), G_CALLBACK (mousepad_window_action_spaces_to_tabs), }, - { "strip-trailing", NULL, N_("St_rip Trailing Spaces"), NULL, N_("Remove all the trailing spaces from the selected line(s) or document"), G_CALLBACK (mousepad_window_action_strip_trailing_spaces), }, { "transpose", NULL, N_("_Transpose"), "T", N_("Reverse the order of something"), G_CALLBACK (mousepad_window_action_transpose), }, { "move-menu", NULL, N_("_Move Selection"), NULL, NULL, NULL, }, { "line-up", NULL, N_("Line _Up"), NULL, N_("Move the selection one line up"), G_CALLBACK (mousepad_window_action_move_line_up), }, @@ -476,6 +475,7 @@ static const GtkToggleActionEntry toggle_action_entries[] = { "auto-indent", NULL, N_("_Auto Indent"), NULL, N_("Auto indent a new line"), G_CALLBACK (mousepad_window_action_auto_indent), FALSE, }, { "insert-spaces", NULL, N_("Insert _Spaces"), NULL, N_("Insert spaces when the tab button is pressed"), G_CALLBACK (mousepad_window_action_insert_spaces), FALSE, }, { "word-wrap", NULL, N_("_Word Wrap"), NULL, N_("Toggle breaking lines in between words"), G_CALLBACK (mousepad_window_action_word_wrap), FALSE, }, + { "strip-trailing-on-save", NULL, N_("Strip _Trailing Spaces on Save"), NULL, N_("Strip all trailing white spaces upon save."), G_CALLBACK (mousepad_window_action_strip_on_save), FALSE, }, { "write-bom", NULL, N_("Write Unicode _BOM"), NULL, N_("Store the byte-order mark in the file"), G_CALLBACK (mousepad_window_action_write_bom), FALSE, } }; @@ -2263,6 +2263,10 @@ mousepad_window_update_actions (MousepadWindow *window) action = gtk_action_group_get_action (window->action_group, "word-wrap"); gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active); + active = mousepad_document_get_strip_trailing_on_save (document); + action = gtk_action_group_get_action (window->action_group, "strip-trailing-on-save"); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active); + active = mousepad_view_get_line_numbers (document->textview); action = gtk_action_group_get_action (window->action_group, "line-numbers"); gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active); @@ -3715,6 +3719,9 @@ mousepad_window_action_save (GtkAction *action, mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE); mousepad_return_val_if_fail (MOUSEPAD_IS_DOCUMENT (window->active), FALSE); + if (mousepad_document_get_strip_trailing_on_save(document) == TRUE) + mousepad_view_strip_trailing_spaces(document->textview); + if (mousepad_file_get_filename (document->file) == NULL) { /* file has no filename yet, open the save as dialog */ @@ -3863,6 +3870,9 @@ mousepad_window_action_save_all (GtkAction *action, if (!gtk_text_buffer_get_modified (document->buffer)) continue; + if (mousepad_document_get_strip_trailing_on_save(document) == TRUE) + mousepad_view_strip_trailing_spaces(document->textview); + /* we try to quickly save files, without bothering the user */ if (mousepad_file_get_filename (document->file) != NULL && mousepad_file_get_read_only (document->file) == FALSE @@ -4702,19 +4712,6 @@ mousepad_window_action_spaces_to_tabs (GtkAction *action, static void -mousepad_window_action_strip_trailing_spaces (GtkAction *action, - MousepadWindow *window) -{ - mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window)); - mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active)); - - /* convert spaces to tabs */ - mousepad_view_strip_trailing_spaces (window->active->textview); -} - - - -static void mousepad_window_action_transpose (GtkAction *action, MousepadWindow *window) { @@ -4907,7 +4904,24 @@ mousepad_window_action_word_wrap (GtkToggleAction *action, } } +static void +mousepad_window_action_strip_on_save (GtkToggleAction *action, + MousepadWindow *window) +{ + gboolean active; + + mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window)); + mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active)); + /* leave when menu updates are locked */ + if (lock_menu_updates == 0) + { + active = gtk_toggle_action_get_active (action); + g_object_set (G_OBJECT (window->preferences), "view-strip-trailing-on-save", active, NULL); + + mousepad_document_set_strip_trailing_on_save (window->active, active); + } +} static void mousepad_window_action_write_bom (GtkToggleAction *action, -- 1.8.1.2