r23185 - gnucash/trunk/src/gnome-utils - After opening a file, display a statusbar message with the last modification date and time.

Christian Stimming cstim at code.gnucash.org
Fri Sep 20 17:09:46 EDT 2013


Author: cstim
Date: 2013-09-20 17:09:46 -0400 (Fri, 20 Sep 2013)
New Revision: 23185
Trac: http://svn.gnucash.org/trac/changeset/23185

Modified:
   gnucash/trunk/src/gnome-utils/gnc-main-window.c
Log:
After opening a file, display a statusbar message with the last modification date and time.

Modified: gnucash/trunk/src/gnome-utils/gnc-main-window.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-main-window.c	2013-09-20 21:09:33 UTC (rev 23184)
+++ gnucash/trunk/src/gnome-utils/gnc-main-window.c	2013-09-20 21:09:46 UTC (rev 23185)
@@ -72,6 +72,10 @@
 #ifdef MAC_INTEGRATION
 #include <gtkmacintegration/gtkosxapplication.h>
 #endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/types.h>
+# include <sys/stat.h> // for stat(2)
+#endif
 
 /** Names of signals generated by the main window. */
 enum
@@ -156,6 +160,8 @@
 
 static void do_popup_menu(GncPluginPage *page, GdkEventButton *event);
 static gboolean gnc_main_window_popup_menu_cb (GtkWidget *widget, GncPluginPage *page);
+static GtkWidget *gnc_main_window_get_statusbar (GncWindow *window_in);
+static void statusbar_notification_lastmodified(void);
 
 #ifdef MAC_INTEGRATION
 static void gnc_quartz_shutdown(GtkosxApplication *theApp, gpointer data);
@@ -890,6 +896,8 @@
         gnc_main_window_restore_window(window, &data);
     }
     gnc_unset_busy_cursor (NULL);
+
+    statusbar_notification_lastmodified();
 }
 
 void
@@ -1500,7 +1508,127 @@
 #endif
 }
 
+static guint gnc_statusbar_notification_messageid = 0;
+//#define STATUSBAR_NOTIFICATION_AUTOREMOVAL
+#ifdef STATUSBAR_NOTIFICATION_AUTOREMOVAL
+/* Removes the statusbar notification again that has been pushed to the
+ * statusbar by generate_statusbar_lastmodified_message. */
+static gboolean statusbar_notification_off(gpointer user_data_unused)
+{
+    GtkWidget *widget = gnc_ui_get_toplevel();
+    //g_warning("statusbar_notification_off\n");
+    if (gnc_statusbar_notification_messageid == 0)
+        return FALSE;
 
+    if (widget && GNC_IS_MAIN_WINDOW(widget))
+    {
+        GncMainWindow *mainwindow = GNC_MAIN_WINDOW(widget);
+        GtkWidget *statusbar = gnc_main_window_get_statusbar(GNC_WINDOW(mainwindow));
+        gtk_statusbar_remove(GTK_STATUSBAR(statusbar), 0, gnc_statusbar_notification_messageid);
+        gnc_statusbar_notification_messageid = 0;
+    } else {
+        g_warning("oops, no GncMainWindow obtained\n");
+    }
+    return FALSE; // should not be called again
+}
+#endif // STATUSBAR_NOTIFICATION_AUTOREMOVAL
+
+/* Creates a statusbar message stating the last modification time of the opened
+ * data file. */
+static gchar *generate_statusbar_lastmodified_message()
+{
+    gchar *message = NULL;
+    const gchar *book_id = NULL;
+
+    if (gnc_current_session_exist())
+    {
+        book_id = qof_session_get_url (gnc_get_current_session ());
+    }
+
+    if (!book_id)
+        return NULL;
+    else
+    {
+        if ( gnc_uri_is_file_uri ( book_id ) )
+        {
+#ifdef HAVE_SYS_STAT_H
+            /* The filename is a true file. */
+            gchar *filepath = gnc_uri_get_path ( book_id );
+            gchar *filename = g_path_get_basename ( filepath );
+            {
+                // Access the mtime information through stat(2)
+                struct stat statbuf;
+                int r = stat(filepath, &statbuf);
+                if (r == 0)
+                {
+                    // File mtime could be accessed ok
+                    gint64 mtime = statbuf.st_mtime;
+                    GDateTime *gdt = gnc_g_date_time_new_from_unix_local (mtime);
+                    /* Translators: This is the date and time that is shown in
+                    the status bar after opening a file, the date and time of
+                    last modification. */
+                    gchar *time_string = g_date_time_format (gdt, _("%a %b %e %Y %H:%M:%S"));
+                    g_date_time_unref (gdt);
+
+                    //g_warning("got time %ld, str=%s\n", mtime, time_string);
+                    /* Translators: This message appears in the status bar after opening the file. */
+                    message = g_strdup_printf(_("File %s opened. Last modified: %s"),
+                                              filename, time_string);
+                    g_free(time_string);
+                }
+                else
+                {
+                    g_warning("Unable to read mtime for file %s\n", filepath);
+                    // message is still NULL
+                }
+            }
+            g_free(filename);
+            g_free(filepath);
+#else
+            return NULL;
+#endif
+        }
+        // If the URI is not a file but a database, we can maybe also show
+        // something useful, but I have no idea how to obtain this information.
+    }
+    return message;
+}
+
+static void
+statusbar_notification_lastmodified()
+{
+    // First look up the first GncMainWindow to set the statusbar there
+    GList *iter;
+    GtkWidget *widget = NULL;
+    for (iter = active_windows; iter && !(widget && GNC_IS_MAIN_WINDOW(widget));
+         iter = g_list_next(iter))
+    {
+        widget = iter->data;
+    }
+    if (widget && GNC_IS_MAIN_WINDOW(widget))
+    {
+        // Ok, we found a mainwindow where we can set a statusbar message
+        GncMainWindow *mainwindow = GNC_MAIN_WINDOW(widget);
+        GtkWidget *statusbar = gnc_main_window_get_statusbar(GNC_WINDOW(mainwindow));
+
+        gchar *msg = generate_statusbar_lastmodified_message();
+        if (msg)
+        {
+            gnc_statusbar_notification_messageid = gtk_statusbar_push(GTK_STATUSBAR(statusbar), 0, msg);
+        }
+        g_free(msg);
+
+#ifdef STATUSBAR_NOTIFICATION_AUTOREMOVAL
+        // Also register a timeout callback to remove that statusbar
+        // notification again after 10 seconds
+        g_timeout_add(10 * 1000, statusbar_notification_off, NULL); // maybe not needed anyway?
+#endif
+    } else {
+        g_warning("uh oh, no GNC_IS_MAIN_WINDOW\n");
+    }
+}
+
+
 /** This data structure is used to describe the requested state of a
  *  GtkRadioAction, and us used to pass data among several
  *  functions. */



More information about the gnucash-changes mailing list