gnome-utils r8226 - trunk/logview
- From: cosimoc svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-utils r8226 - trunk/logview
- Date: Tue, 23 Dec 2008 13:25:22 +0000 (UTC)
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]