[Xfce4-commits] <mousepad:master> * mousepad/mousepad-dialogs.{c, h}: Add response actions for Mousepad so it's easier to understand what happens. * mousepad/mousepad-window.c, * mousepad/mousepad-screen.{c, h}: Basic support for document reloading.

Nick Schermer noreply at xfce.org
Sat May 5 21:30:10 CEST 2012


Updating branch refs/heads/master
         to cab0d1a984369283d99376e364e216e7fff04bc3 (commit)
       from 8a1670c4888db706b49b21c32d78786bf9ed2780 (commit)

commit cab0d1a984369283d99376e364e216e7fff04bc3
Author: Nick Schermer <nick at xfce.org>
Date:   Sat Mar 3 13:26:35 2007 +0000

    	* mousepad/mousepad-dialogs.{c,h}: Add response actions for Mousepad so it's
    	  easier to understand what happens.
    	* mousepad/mousepad-window.c, * mousepad/mousepad-screen.{c,h}: Basic
    	  support for document reloading.
    
    (Old svn revision: 25072)

 ChangeLog                       |    7 +++
 mousepad/mousepad-dialogs.c     |   81 +++++++++++++++++++++++++++-----------
 mousepad/mousepad-dialogs.h     |   15 ++++++-
 mousepad/mousepad-private.h     |    3 +
 mousepad/mousepad-screen.c      |   32 +++++++++++++++
 mousepad/mousepad-screen.h      |    3 +
 mousepad/mousepad-window-ui.xml |    2 +
 mousepad/mousepad-window.c      |   84 ++++++++++++++++++++++++++++++++++-----
 8 files changed, 193 insertions(+), 34 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 940a971..ab7c9cd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2007-03-03	Nick Schermer <nick at xfce.org>
 
+	* mousepad/mousepad-dialogs.{c,h}: Add response actions for Mousepad so it's
+	  easier to understand what happens.
+	* mousepad/mousepad-window.c, * mousepad/mousepad-screen.{c,h}: Basic
+	  support for document reloading.
+
+2007-03-03	Nick Schermer <nick at xfce.org>
+
 	* configure.in.in, mousepad/Makefile.am: Remove the PCRE dependency.
 	  I should have removed this earier after some testing.
 
diff --git a/mousepad/mousepad-dialogs.c b/mousepad/mousepad-dialogs.c
index dbd9f5c..a26a478 100644
--- a/mousepad/mousepad-dialogs.c
+++ b/mousepad/mousepad-dialogs.c
@@ -22,6 +22,7 @@
 #endif
 
 #include <mousepad/mousepad-private.h>
+#include <mousepad/mousepad-dialogs.h>
 #include <mousepad/mousepad-file.h>
 
 
@@ -117,8 +118,8 @@ mousepad_dialogs_jump_to (GtkWindow *parent,
   dialog = gtk_dialog_new_with_buttons (_("Jump To"),
                                         parent,
                                         GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
-                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                        GTK_STOCK_JUMP_TO, GTK_RESPONSE_OK,
+                                        GTK_STOCK_CANCEL, MOUSEPAD_RESPONSE_CANCEL,
+                                        GTK_STOCK_JUMP_TO, MOUSEPAD_RESPONSE_JUMP_TO,
                                         NULL);
   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
   gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
@@ -146,7 +147,7 @@ mousepad_dialogs_jump_to (GtkWindow *parent,
   gtk_widget_show (button);
 
   /* run the dialog */
-  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
+  if (gtk_dialog_run (GTK_DIALOG (dialog)) == MOUSEPAD_RESPONSE_JUMP_TO)
     line_number = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (button));
 
   /* destroy the dialog */
@@ -174,13 +175,13 @@ mousepad_dialogs_clear_recent (GtkWindow *parent)
                                               "history owned by Mousepad."));
 
   gtk_dialog_add_buttons (GTK_DIALOG (dialog),
-                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                          GTK_STOCK_CLEAR, GTK_RESPONSE_OK,
+                          GTK_STOCK_CANCEL, MOUSEPAD_RESPONSE_CANCEL,
+                          GTK_STOCK_CLEAR, MOUSEPAD_RESPONSE_CLEAR,
                           NULL);
-  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
+  gtk_dialog_set_default_response (GTK_DIALOG (dialog), MOUSEPAD_RESPONSE_CANCEL);
 
   /* popup the dialog */
-  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
+  if (gtk_dialog_run (GTK_DIALOG (dialog)) == MOUSEPAD_RESPONSE_CLEAR)
     succeed = TRUE;
 
   /* destroy the dialog */
@@ -191,7 +192,7 @@ mousepad_dialogs_clear_recent (GtkWindow *parent)
 
 
 
-gboolean
+gint
 mousepad_dialogs_save_changes (GtkWindow *parent)
 {
   GtkWidget *dialog;
@@ -209,12 +210,12 @@ mousepad_dialogs_save_changes (GtkWindow *parent)
 
   gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
                                 mousepad_dialogs_image_button (GTK_STOCK_DELETE, _("_Don't Save")),
-                                GTK_RESPONSE_REJECT);
+                                MOUSEPAD_RESPONSE_DONT_SAVE);
   gtk_dialog_add_buttons (GTK_DIALOG (dialog),
-                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                          GTK_STOCK_SAVE, GTK_RESPONSE_OK,
+                          GTK_STOCK_CANCEL, MOUSEPAD_RESPONSE_CANCEL,
+                          GTK_STOCK_SAVE, MOUSEPAD_RESPONSE_SAVE,
                           NULL);
-  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+  gtk_dialog_set_default_response (GTK_DIALOG (dialog), MOUSEPAD_RESPONSE_SAVE);
 
   /* run the dialog and wait for a response */
   response = gtk_dialog_run (GTK_DIALOG (dialog));
@@ -297,16 +298,15 @@ mousepad_dialogs_save_as (GtkWindow   *parent,
 
 
 
-gboolean
+gint
 mousepad_dialogs_ask_overwrite (GtkWindow   *parent,
                                 const gchar *filename)
 {
   GtkWidget *dialog;
-  gboolean   overwrite = FALSE;
+  gint       response;
 
   dialog = gtk_message_dialog_new (parent,
-                                   GTK_DIALOG_MODAL
-                                   | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                    GTK_MESSAGE_QUESTION,
                                    GTK_BUTTONS_NONE,
                                    _("The file has been externally modified. Are you sure "
@@ -315,19 +315,54 @@ mousepad_dialogs_ask_overwrite (GtkWindow   *parent,
                                             _("If you save the file, the external changes "
                                               "to \"%s\" will be lost."), filename);
 
-  gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+  gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, MOUSEPAD_RESPONSE_CANCEL);
   gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
                                 mousepad_dialogs_image_button (GTK_STOCK_SAVE, _("_Overwrite")),
-                                GTK_RESPONSE_OK);
+                                MOUSEPAD_RESPONSE_OVERWRITE);
   gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
                                 mousepad_dialogs_image_button (GTK_STOCK_REFRESH, _("_Reload")),
-                                GTK_RESPONSE_REJECT);
-  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
+                                MOUSEPAD_RESPONSE_RELOAD);
+  gtk_dialog_set_default_response (GTK_DIALOG (dialog), MOUSEPAD_RESPONSE_CANCEL);
+
+  /* run the dialog */
+  response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+  /* destroy the dialog */
+  gtk_widget_destroy (dialog);
+
+  return response;
+}
+
 
-  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
-    overwrite = TRUE;
 
+gint
+mousepad_dialogs_ask_reload (GtkWindow *parent)
+{
+  GtkWidget *dialog;
+  gint       response;
+
+  dialog = gtk_message_dialog_new (parent,
+                                   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                   GTK_MESSAGE_QUESTION,
+                                   GTK_BUTTONS_NONE,
+                                   _("Do you want to save your changes before reloading?"));
+  gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                            _("If you reload the file, you changes will be lost."));
+
+  gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+                          GTK_STOCK_CANCEL, MOUSEPAD_RESPONSE_CANCEL,
+                          GTK_STOCK_SAVE_AS, MOUSEPAD_RESPONSE_SAVE_AS,
+                          NULL);
+  gtk_dialog_add_action_widget (GTK_DIALOG (dialog),
+                                mousepad_dialogs_image_button (GTK_STOCK_REFRESH, _("_Reload")),
+                                MOUSEPAD_RESPONSE_RELOAD);
+  gtk_dialog_set_default_response (GTK_DIALOG (dialog), MOUSEPAD_RESPONSE_CANCEL);
+
+  /* run the dialog */
+  response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+  /* destroy the dialog */
   gtk_widget_destroy (dialog);
 
-  return overwrite;
+  return response;
 }
diff --git a/mousepad/mousepad-dialogs.h b/mousepad/mousepad-dialogs.h
index b6f0310..f884fb9 100644
--- a/mousepad/mousepad-dialogs.h
+++ b/mousepad/mousepad-dialogs.h
@@ -22,6 +22,17 @@
 
 G_BEGIN_DECLS
 
+enum {
+  MOUSEPAD_RESPONSE_CANCEL,
+  MOUSEPAD_RESPONSE_CLEAR,
+  MOUSEPAD_RESPONSE_DONT_SAVE,
+  MOUSEPAD_RESPONSE_JUMP_TO,
+  MOUSEPAD_RESPONSE_OVERWRITE,
+  MOUSEPAD_RESPONSE_RELOAD,
+  MOUSEPAD_RESPONSE_SAVE,
+  MOUSEPAD_RESPONSE_SAVE_AS,
+};
+
 void      mousepad_dialogs_show_about    (GtkWindow    *parent);
 
 
@@ -40,9 +51,11 @@ gint      mousepad_dialogs_save_changes  (GtkWindow    *parent);
 gchar    *mousepad_dialogs_save_as       (GtkWindow    *parent,
                                           const gchar  *filename);
 
-gboolean  mousepad_dialogs_ask_overwrite (GtkWindow    *parent,
+gint      mousepad_dialogs_ask_overwrite (GtkWindow    *parent,
                                           const gchar  *filename);
 
+gint      mousepad_dialogs_ask_reload    (GtkWindow    *parent);
+
 G_END_DECLS
 
 #endif /* !__MOUSEPAD_DIALOGS_H__ */
diff --git a/mousepad/mousepad-private.h b/mousepad/mousepad-private.h
index 7ed596e..9c4aa14 100644
--- a/mousepad/mousepad-private.h
+++ b/mousepad/mousepad-private.h
@@ -25,6 +25,9 @@
 
 G_BEGIN_DECLS
 
+#define DEBUG_LINE g_print ("%d\n", __LINE__);
+
+
 /* support macros for debugging */
 #ifndef NDEBUG
 #define _mousepad_assert(expr)                  g_assert (expr)
diff --git a/mousepad/mousepad-screen.c b/mousepad/mousepad-screen.c
index 1ac53a3..348a6a5 100644
--- a/mousepad/mousepad-screen.c
+++ b/mousepad/mousepad-screen.c
@@ -525,6 +525,38 @@ mousepad_screen_save_file (MousepadScreen  *screen,
 
 
 
+gboolean
+mousepad_screen_reload (MousepadScreen  *screen,
+                        GError         **error)
+{
+  GtkTextBuffer *buffer;
+  GtkTextIter    start, end;
+  gchar         *filename;
+  gboolean       succeed = FALSE;
+
+  _mousepad_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+  /* get the buffer */
+  buffer = mousepad_screen_get_text_buffer (screen);
+
+  /* remove the content of the textview */
+  gtk_text_buffer_get_bounds (buffer, &start, &end);
+  gtk_text_buffer_delete (buffer, &start, &end);
+
+  /* we have to copy the filename, because mousepad_screen_open_file (resets) the name */
+  filename = g_strdup (screen->filename);
+
+  /* reload the document */
+  succeed = mousepad_screen_open_file (screen, filename, error);
+
+  /* cleanup */
+  g_free (filename);
+
+  return succeed;
+}
+
+
+
 const gchar *
 mousepad_screen_get_title (MousepadScreen *screen,
                            gboolean        show_full_path)
diff --git a/mousepad/mousepad-screen.h b/mousepad/mousepad-screen.h
index c7274bc..f7a69d2 100644
--- a/mousepad/mousepad-screen.h
+++ b/mousepad/mousepad-screen.h
@@ -49,6 +49,9 @@ gboolean        mousepad_screen_save_file                (MousepadScreen  *scree
                                                           const gchar     *filename,
                                                           GError         **error);
 
+gboolean        mousepad_screen_reload                   (MousepadScreen  *screen,
+                                                          GError         **error);
+
 const gchar    *mousepad_screen_get_title                (MousepadScreen  *screen,
                                                           gboolean         show_full_path);
 
diff --git a/mousepad/mousepad-window-ui.xml b/mousepad/mousepad-window-ui.xml
index 77b6c72..9c2e2d0 100644
--- a/mousepad/mousepad-window-ui.xml
+++ b/mousepad/mousepad-window-ui.xml
@@ -23,6 +23,8 @@
       <menuitem action="save-file" />
       <menuitem action="save-file-as" />
       <separator />
+      <menuitem action="reload" />
+      <separator />
       <menuitem action="close-tab" />
       <menuitem action="close-window" />
       <menuitem action="close-all-windows" />
diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c
index b5bf592..9debbd7 100644
--- a/mousepad/mousepad-window.c
+++ b/mousepad/mousepad-window.c
@@ -130,6 +130,8 @@ static void              mousepad_window_action_save_file             (GtkAction
                                                                        MousepadWindow         *window);
 static void              mousepad_window_action_save_file_as          (GtkAction              *action,
                                                                        MousepadWindow         *window);
+static void              mousepad_window_action_reload                (GtkAction              *action,
+                                                                       MousepadWindow         *window);
 static void              mousepad_window_action_close_tab             (GtkAction              *action,
                                                                        MousepadWindow         *window);
 static void              mousepad_window_action_close                 (GtkAction              *action,
@@ -216,6 +218,7 @@ static const GtkActionEntry action_entries[] =
       { "clear-recent", GTK_STOCK_CLEAR, N_("Clear _History"), NULL, N_("Clear the recently used files history"), G_CALLBACK (mousepad_window_action_clear_recent), },
     { "save-file", GTK_STOCK_SAVE, N_("_Save"), NULL, N_("Save the current file"), G_CALLBACK (mousepad_window_action_save_file), },
     { "save-file-as", GTK_STOCK_SAVE_AS, N_("Save _As"), NULL, N_("Save current document as another file"), G_CALLBACK (mousepad_window_action_save_file_as), },
+    { "reload", GTK_STOCK_REFRESH, N_("Re_load"), NULL, N_("Reload this document."), G_CALLBACK (mousepad_window_action_reload), },
     { "close-tab", GTK_STOCK_CLOSE, N_("C_lose Tab"), "<control>W", N_("Close the current file"), G_CALLBACK (mousepad_window_action_close_tab), },
     { "close-window", GTK_STOCK_QUIT, N_("_Close Window"), "<control>Q", N_("Quit the program"), G_CALLBACK (mousepad_window_action_close), },
     { "close-all-windows", NULL, N_("Close _All Windows"), "<control><shift>W", N_("Close all Mousepad windows"), G_CALLBACK (mousepad_window_action_close_all_windows), },
@@ -790,6 +793,7 @@ mousepad_window_save (MousepadWindow  *window,
   GError      *error = NULL;
   const gchar *message;
   gint         mtime;
+  gint         action = MOUSEPAD_RESPONSE_OVERWRITE;
 
   /* get the current filename */
   filename = mousepad_screen_get_filename (screen);
@@ -826,15 +830,31 @@ mousepad_window_save (MousepadWindow  *window,
       mtime = mousepad_screen_get_mtime (screen);
 
       /* check if the file has been modified externally, if so ask the user if
-       * he or she wants to overwrite the file */
-      if (mousepad_file_get_externally_modified (filename, mtime) == FALSE ||
-          mousepad_dialogs_ask_overwrite (GTK_WINDOW (window), filename) == TRUE)
+       * he or she wants to overwrite/reload or cancel the action */
+      if (G_UNLIKELY (mousepad_file_get_externally_modified (filename, mtime)))
+        action = mousepad_dialogs_ask_overwrite (GTK_WINDOW (window), filename);
+
+      switch (action)
         {
-          /* save the file */
-          succeed = mousepad_screen_save_file (screen, filename, &error);
+          case MOUSEPAD_RESPONSE_OVERWRITE:
+            /* save the file */
+            succeed = mousepad_screen_save_file (screen, filename, &error);
+
+            /* the warning message for save */
+            message = _("Failed to save the document");
+            break;
+
+          case MOUSEPAD_RESPONSE_RELOAD:
+            /* reload the document */
+            succeed = mousepad_screen_reload (screen, &error);
 
-          /* the warning message for save */
-          message = _("Failed to save the document");
+            /* the warning message for save */
+            message = _("Failed to reload the document");
+            break;
+
+          case MOUSEPAD_RESPONSE_CANCEL:
+            /* do nothing */
+            break;
         }
     }
 
@@ -942,14 +962,14 @@ mousepad_window_close_screen (MousepadWindow *window,
 
       switch (response)
         {
-          case GTK_RESPONSE_REJECT:
+          case MOUSEPAD_RESPONSE_DONT_SAVE:
             /* don't save, only destroy the screen */
             succeed = TRUE;
             break;
-          case GTK_RESPONSE_CANCEL:
+          case MOUSEPAD_RESPONSE_CANCEL:
             /* we do nothing */
             break;
-          case GTK_RESPONSE_OK:
+          case MOUSEPAD_RESPONSE_SAVE:
             succeed = mousepad_window_save (window, screen, FALSE);
             break;
         }
@@ -1655,6 +1675,50 @@ mousepad_window_action_save_file_as (GtkAction      *action,
 
 
 static void
+mousepad_window_action_reload (GtkAction      *action,
+                               MousepadWindow *window)
+{
+  MousepadScreen *screen;
+  GError         *error = NULL;
+  const gchar    *message;
+  gint            response = MOUSEPAD_RESPONSE_RELOAD;
+
+  screen = mousepad_window_get_active (window);
+  if (G_LIKELY (screen != NULL))
+    {
+      /* ask what to do when the document still has modifications */
+      if (mousepad_screen_get_modified (screen))
+        response = mousepad_dialogs_ask_reload (GTK_WINDOW (window));
+
+      switch (response)
+        {
+          case MOUSEPAD_RESPONSE_CANCEL:
+            /* do nothing */
+            break;
+
+          case MOUSEPAD_RESPONSE_SAVE_AS:
+            /* try to save the document, break when this went wrong, else
+             * fall-though and try to reload the document */
+            if (!mousepad_window_save (window, screen, TRUE))
+              break;
+
+          case MOUSEPAD_RESPONSE_RELOAD:
+            if (!mousepad_screen_reload (screen, &error))
+              message = _("Failed to reload the document");
+            break;
+        }
+    }
+
+  if (G_UNLIKELY (error != NULL))
+    {
+      mousepad_dialogs_show_error (GTK_WINDOW (window), error, message);
+      g_error_free (error);
+    }
+}
+
+
+
+static void
 mousepad_window_action_close_tab (GtkAction      *action,
                                   MousepadWindow *window)
 {


More information about the Xfce4-commits mailing list