gnome-utils r8226 - trunk/logview



Author: cosimoc
Date: Tue Dec 23 13:25:22 2008
New Revision: 8226
URL: http://svn.gnome.org/viewvc/gnome-utils?rev=8226&view=rev

Log:
Implement a cache of the opened logs; rework a bit the open functions in
the LogviewWindow.

Modified:
   trunk/logview/logview-manager.c
   trunk/logview/logview-manager.h
   trunk/logview/logview.c

Modified: trunk/logview/logview-manager.c
==============================================================================
--- trunk/logview/logview-manager.c	(original)
+++ trunk/logview/logview-manager.c	Tue Dec 23 13:25:22 2008
@@ -44,13 +44,23 @@
 } CreateCBData;
 
 struct _LogviewManagerPrivate {
-  GList *logs;
+  GHashTable *logs;
   LogviewLog *active_log;
 };
 
 static void
 logview_manager_finalize (GObject *object)
 {
+  LogviewManager *manager;
+
+  manager = LOGVIEW_MANAGER (object);
+
+  if (manager->priv->active_log) {
+   g_object_unref (manager->priv->active_log);
+  }
+
+  g_hash_table_destroy (manager->priv->logs);
+  
   G_OBJECT_CLASS (logview_manager_parent_class)->finalize (object);
 }
 
@@ -97,7 +107,7 @@
   self->priv = GET_PRIVATE (self);
 
   priv->active_log = NULL;
-  priv->logs = NULL;
+  priv->logs = g_hash_table_new (g_str_hash, g_str_equal);
 }
 
 static void
@@ -109,7 +119,7 @@
 
   if (log) {
     /* creation went well, store the log and notify */
-    g_slist_append (data->manager->priv->logs, log);
+    g_hash_table_insert (data->manager->priv->logs, data->filename, log);
 
     g_signal_emit (data->manager, signals[LOG_ADDED], 0, log, NULL);
 
@@ -180,6 +190,7 @@
                                    const char *filename, gboolean set_active)
 {
   CreateCBData *data = g_slice_new0 (CreateCBData);
+  LogviewLog *log;
 
   g_assert (LOGVIEW_IS_MANAGER (manager));
 
@@ -188,17 +199,40 @@
     set_active = (manager->priv->logs == NULL);
   }
 
-  data->filename = g_strdup (filename);
-  data->manager = manager;
-  data->set_active = set_active;
+  if (log = g_hash_table_lookup (manager->priv->logs, filename) != NULL) {
+    /* log already exists, don't load it */
+    if (set_active) {
+      logview_manager_set_active_log (manager, log);
+    }
+  } else {
+    data->filename = g_strdup (filename);
+    data->manager = manager;
+    data->set_active = set_active;
 
-  logview_log_create (filename, create_log_cb, data);
+    logview_log_create (filename, create_log_cb, data);
+  }
 }
 
 int
 logview_manager_get_log_count (LogviewManager *manager)
 {
+  GList *keys;
+  int retval;
+
+  g_assert (LOGVIEW_IS_MANAGER (manager));
+
+  keys = g_hash_table_get_keys (manager->priv->logs);
+  retval = g_list_length (keys);
+
+  g_list_free (keys);
+
+  return retval;
+}
+
+LogviewLog *
+logview_manager_get_if_loaded (LogviewManager *manager, char *filename)
+{
   g_assert (LOGVIEW_IS_MANAGER (manager));
 
-  return g_slist_length (manager->priv->logs);
+  return g_object_ref (g_hash_table_lookup (manager->priv->logs, filename));
 }
\ No newline at end of file

Modified: trunk/logview/logview-manager.h
==============================================================================
--- trunk/logview/logview-manager.h	(original)
+++ trunk/logview/logview-manager.h	Tue Dec 23 13:25:22 2008
@@ -71,6 +71,8 @@
                                                      LogviewLog *log);
 LogviewLog *    logview_manager_get_active_log      (LogviewManager *manager);
 int             logview_manager_get_log_count       (LogviewManager *manager);
+LogviewLog *    logview_manager_get_if_loaded       (LogviewManager *manager,
+                                                     char *filename);
 
 G_END_DECLS
 

Modified: trunk/logview/logview.c
==============================================================================
--- trunk/logview/logview.c	(original)
+++ trunk/logview/logview.c	Tue Dec 23 13:25:22 2008
@@ -218,9 +218,7 @@
     logview_update_version_bar (logview);
     logview_save_prefs (logview); 
     gtk_widget_grab_focus (logview->view);
-} 
-
-
+}
 
 void
 logview_menus_set_state (LogviewWindow *logview)
@@ -407,67 +405,6 @@
 }
 
 static void
-logview_file_selected_cb (GtkWidget *chooser, gint response, LogviewWindow *logview)
-{
-   char *f;
-
-   g_assert (LOGVIEW_IS_WINDOW (logview));
-
-   gtk_widget_hide (GTK_WIDGET (chooser));
-   if (response != GTK_RESPONSE_OK)
-	   return;
-   
-   f = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
-
-   if (f != NULL) {
-       /* Check if the log is not already opened */
-       GSList *list;
-       Log *log, *tl;
-	   for (list = logview->logs; list != NULL; list = g_slist_next (list)) {
-		   log = list->data;
-		   if (g_ascii_strncasecmp (log->name, f, 255) == 0) {
-		     loglist_select_log (LOG_LIST (logview->loglist), log);
-		     return;
-		   }
-	   }
-
-	   if ((tl = log_open (f, TRUE)) != NULL)
-	     logview_add_log (logview, tl);
-   }
-   
-   g_free (f);
-
-}
-
-static void
-logview_open_log (GtkAction *action, LogviewWindow *logview)
-{
-   static GtkWidget *chooser = NULL;
-
-   g_assert (LOGVIEW_IS_WINDOW (logview));
-   
-   if (chooser == NULL) {
-	   chooser = gtk_file_chooser_dialog_new (_("Open Log"),
-						  GTK_WINDOW (logview),
-						  GTK_FILE_CHOOSER_ACTION_OPEN,
-						  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-						  GTK_STOCK_OPEN, GTK_RESPONSE_OK,
-						  NULL);
-	   gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_OK);
-	   gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
-	   g_signal_connect (G_OBJECT (chooser), "response",
-			     G_CALLBACK (logview_file_selected_cb), logview);
-	   g_signal_connect (G_OBJECT (chooser), "destroy",
-			     G_CALLBACK (gtk_widget_destroyed), &chooser);
-	   if (prefs_get_active_log () != NULL)
-		   gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (chooser), 
-						  prefs_get_active_log ());
-   }
-
-   gtk_window_present (GTK_WINDOW (chooser));
-}
-
-static void
 logview_toggle_statusbar (GtkAction *action, LogviewWindow *logview)
 {
     g_assert (LOGVIEW_IS_WINDOW (logview));
@@ -695,6 +632,66 @@
         gtk_widget_set_sensitive (logview->calendar, FALSE);
 }
 
+/* actions callbacks */
+
+static void
+open_file_selected_cb (GtkWidget *chooser, gint response, LogviewWindow *logview)
+{
+  char *f;
+  LogviewLog *log;
+
+  g_assert (LOGVIEW_IS_WINDOW (logview));
+
+  gtk_widget_hide (GTK_WIDGET (chooser));
+  if (response != GTK_RESPONSE_OK) {
+	  return;
+  }
+
+  f = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
+
+  log = logview_manager_get_if_loaded (logview->priv->manager, f);
+
+  if (log) {
+    logview_manager_set_active_log (log);
+    g_object_unref (log);
+    goto out;
+  }
+
+  logview_manager_add_log_from_name (logview->priv->manager, f);
+
+out:
+  g_free (f);
+}
+
+static void
+logview_open_log (GtkAction *action, LogviewWindow *logview)
+{
+  static GtkWidget *chooser = NULL;
+  char *active;
+
+  if (chooser == NULL) {
+    chooser = gtk_file_chooser_dialog_new (_("Open Log"),
+                                           GTK_WINDOW (logview),
+                                           GTK_FILE_CHOOSER_ACTION_OPEN,
+                                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                           GTK_STOCK_OPEN, GTK_RESPONSE_OK,
+                                           NULL);
+    gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_OK);
+    gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
+    g_signal_connect (G_OBJECT (chooser), "response",
+                      G_CALLBACK (open_file_selected_cb), logview);
+    g_signal_connect (G_OBJECT (chooser), "destroy",
+                      G_CALLBACK (gtk_widget_destroyed), &chooser);
+    active = logview_prefs_get_active_logfile (logview->priv->prefs);
+    if (active != NULL) {
+      gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (chooser), active);
+      g_free (active);
+    }
+  }
+
+  gtk_window_present (GTK_WINDOW (chooser));
+}
+
 static void
 logview_help (GtkAction *action, GtkWidget *parent_window)
 {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]