gnome-utils r8346 - trunk/logview



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

Log:
Implement infrastructure to handle multiple errors at once (e.g. when
loading multiple files at startup).

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

Modified: trunk/logview/logview-app.c
==============================================================================
--- trunk/logview/logview-app.c	(original)
+++ trunk/logview/logview-app.c	Tue Dec 23 13:29:05 2008
@@ -133,9 +133,13 @@
 }
 
 void
-logview_app_initialize (LogviewApp *app, const char **log_files)
+logview_app_initialize (LogviewApp *app, char **log_files)
 {
-  LogviewAppPrivate *priv = app->priv;
+  LogviewAppPrivate *priv;
+
+  g_assert (LOGVIEW_IS_APP (app));
+
+  priv = app->priv;
 
   /* open regular logs and add each log passed as a parameter */
 
@@ -146,42 +150,51 @@
     active_log = logview_prefs_get_active_logfile (priv->prefs);
     logs = logview_prefs_get_stored_logfiles (priv->prefs);
 
-    logview_manager_add_logs_from_names (priv->manager,
-                                         logs, active_log);
+    logview_manager_add_logs_from_name_list (priv->manager,
+                                             logs, active_log);
 
     g_free (active_log);
     g_slist_foreach (logs, (GFunc) g_free, NULL);
     g_slist_free (logs);
   } else {
-    gint i;
-
-    for (i = 0; log_files[i]; i++)
-      logview_manager_add_log_from_name (priv->manager, log_files[i], FALSE);
+    logview_manager_add_logs_from_names (priv->manager, log_files);
   }
 
   gtk_widget_show (GTK_WIDGET (priv->window));
 }
 
-#if 0
 void
-logview_show_error (const char *primary,
-                    const char *secondary)
+logview_app_add_error (LogviewApp *app,
+                       const char *primary,
+                       const char *secondary)
 {
-  GtkWidget *message_dialog;
+  LogviewWindow *window;
 
-  message_dialog = gtk_message_dialog_new (GTK_WINDOW (main_window),
-                                           GTK_DIALOG_DESTROY_WITH_PARENT,
-                                           GTK_MESSAGE_ERROR,
-                                           GTK_BUTTONS_OK,
-                                           "%s", primary);
-  if (secondary) {
-    gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog),
-                                              "%s", secondary);
-  };
+  g_assert (LOGVIEW_IS_APP (app));
 
-  gtk_dialog_run (GTK_DIALOG (message_dialog));
-  gtk_widget_destroy (message_dialog);
+  window = app->priv->window;
+
+  logview_window_add_error (window, primary, secondary);
 }
 
-#endif
+void
+logview_app_add_errors (LogviewApp *app,
+                        GPtrArray *errors)
+{
+  LogviewWindow *window;
 
+  g_assert (LOGVIEW_IS_APP (app));
+
+  window = app->priv->window;
+
+  if (errors->len == 0) {
+    return;
+  } else if (errors->len == 1) {
+    char **err;
+
+    err = g_ptr_array_index (errors, 0);
+    logview_window_add_error (window, err[0], err[1]);
+  } else {
+    logview_window_add_errors (window, errors);
+  }
+}
\ No newline at end of file

Modified: trunk/logview/logview-app.h
==============================================================================
--- trunk/logview/logview-app.h	(original)
+++ trunk/logview/logview-app.h	Tue Dec 23 13:29:05 2008
@@ -59,9 +59,15 @@
 GType logview_app_get_type (void);
 
 /* public methods */
-LogviewApp* logview_app_get (void);
+LogviewApp * logview_app_get (void);
+void         logview_app_initialize (LogviewApp *app,
+                                     char **log_files);
+void         logview_app_add_error  (LogviewApp *app,
+                                     const char *primary,
+                                     const char *secondary);
+void         logview_app_add_errors (LogviewApp *app,
+                                     GPtrArray *errors);
 
 G_END_DECLS
 
 #endif /* __LOGVIEW_APP_H__ */
-

Modified: trunk/logview/logview-manager.c
==============================================================================
--- trunk/logview/logview-manager.c	(original)
+++ trunk/logview/logview-manager.c	Tue Dec 23 13:29:05 2008
@@ -35,25 +35,33 @@
   LAST_SIGNAL
 };
 
-static LogviewManager *singleton = NULL;
-static guint signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (LogviewManager, logview_manager, G_TYPE_OBJECT);
-
-#define GET_PRIVATE(o) \
-  (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_TYPE_MANAGER, LogviewManagerPrivate))
-
 typedef struct {
   LogviewManager *manager;
   gboolean set_active;
+  gboolean is_multiple;
   GFile *file;
 } CreateCBData;
 
+typedef struct {
+  int total;
+  int current;
+  GPtrArray *errors;
+} MultipleCreation;
+
 struct _LogviewManagerPrivate {
   GHashTable *logs;
   LogviewLog *active_log;
 };
 
+static LogviewManager *singleton = NULL;
+static MultipleCreation *op = NULL;
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (LogviewManager, logview_manager, G_TYPE_OBJECT);
+
+#define GET_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_TYPE_MANAGER, LogviewManagerPrivate))
+
 static void
 logview_manager_finalize (GObject *object)
 {
@@ -118,6 +126,28 @@
                                       (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref);
 }
 
+static MultipleCreation *
+multiple_creation_op_new (int total)
+{
+  MultipleCreation *retval;
+
+  retval = g_slice_new0 (MultipleCreation);
+  retval->total = total;
+  retval->current = 0;
+  retval->errors = g_ptr_array_new ();
+
+  return retval;
+}
+
+static void
+multiple_creation_op_free (MultipleCreation *mc)
+{
+  g_ptr_array_foreach (mc->errors, (GFunc) g_strfreev, NULL);
+  g_ptr_array_free (mc->errors, TRUE);
+
+  g_slice_free (MultipleCreation, mc);
+}
+
 static void
 create_log_cb (LogviewLog *log,
                GError *error,
@@ -154,16 +184,87 @@
     path = g_file_get_path (data->file);
     primary = g_strdup_printf (_("Impossible to open the file %s."), path);
 
-    //logview_show_error (primary, error->message);
+    if (!data->is_multiple) {
+      logview_app_add_error (logview_app_get (),
+                             primary, error->message);
+    } else {
+      char **error_arr = g_new0 (char *, 3);
+
+      error_arr[0] = g_strdup (primary);
+      error_arr[1] = g_strdup (error->message);
+      error_arr[2] = NULL;
+
+      g_ptr_array_add (op->errors, error_arr);
+    }
 
     g_free (path);
     g_free (primary);
+    g_error_free (error);
+  }
+  
+  if (data->is_multiple) {
+    op->current++;
+
+    if (op->total == op->current) {
+      logview_app_add_errors (logview_app_get (), op->errors);
+      multiple_creation_op_free (op);
+      op = NULL;
+    }
   }
 
   g_object_unref (data->file);
   g_slice_free (CreateCBData, data);
 }
 
+static void
+add_log_from_gfile_internal (LogviewManager *manager,
+                             GFile *file,
+                             gboolean set_active,
+                             gboolean is_multiple)
+{
+  char *file_uri;
+  LogviewLog *log;
+  CreateCBData *data;
+
+  file_uri = g_file_get_uri (file);
+
+  if (set_active == FALSE) {
+    /* if it's the first log being added, set it as active anyway */
+    set_active = (manager->priv->logs == NULL);
+  }
+
+  if ((log = g_hash_table_lookup (manager->priv->logs, file_uri)) != NULL) {
+    /* log already exists, don't load it */
+    if (set_active) {
+      logview_manager_set_active_log (manager, log);
+    }
+  } else {
+    data = g_slice_new0 (CreateCBData);
+    data->manager = manager;
+    data->set_active = set_active;
+    data->is_multiple = is_multiple;
+    data->file = g_object_ref (file);
+
+    logview_log_create_from_gfile (file, create_log_cb, data);
+  }
+
+  g_free (file_uri);
+}
+
+static void
+logview_manager_add_log_from_name (LogviewManager *manager,
+                                   const char *filename, gboolean set_active,
+                                   gboolean is_multiple)
+{
+  GFile *file;
+
+  file = g_file_new_for_path (filename);
+
+  add_log_from_gfile_internal (manager, file, set_active, is_multiple);
+
+  g_object_unref (file);
+}
+
 /* public methods */
 
 LogviewManager*
@@ -213,64 +314,44 @@
                                     GFile *file,
                                     gboolean set_active)
 {
-  char *file_uri;
-  LogviewLog *log;
-  CreateCBData *data;
-
   g_assert (LOGVIEW_IS_MANAGER (manager));
 
-  file_uri = g_file_get_uri (file);
-
-  if (set_active == FALSE) {
-    /* if it's the first log being added, set it as active anyway */
-    set_active = (manager->priv->logs == NULL);
-  }
-
-  if ((log = g_hash_table_lookup (manager->priv->logs, file_uri)) != NULL) {
-    /* log already exists, don't load it */
-    if (set_active) {
-      logview_manager_set_active_log (manager, log);
-    }
-  } else {
-    data = g_slice_new0 (CreateCBData);
-    data->manager = manager;
-    data->set_active = set_active;
-    data->file = g_object_ref (file);
-
-    logview_log_create_from_gfile (file, create_log_cb, data);
-  }
-
-  g_free (file_uri);
+  add_log_from_gfile_internal (manager, file, set_active, FALSE);
 }
 
 void
-logview_manager_add_logs_from_names (LogviewManager *manager,
-                                     GSList *names,
-                                     const char *active)
+logview_manager_add_logs_from_name_list (LogviewManager *manager,
+                                         GSList *names,
+                                         const char *active)
 {
   GSList *l;
 
   g_assert (LOGVIEW_IS_MANAGER (manager));
+  g_assert (op == NULL);
+
+  op = multiple_creation_op_new (g_slist_length (names));
 
   for (l = names; l; l = l->next) {
     logview_manager_add_log_from_name (manager, l->data,
-                                        (g_ascii_strcasecmp (active, l->data) == 0));
+                                       (g_ascii_strcasecmp (active, l->data) == 0),
+                                       TRUE);
   }
 }
 
 void
-logview_manager_add_log_from_name (LogviewManager *manager,
-                                   const char *filename, gboolean set_active)
+logview_manager_add_logs_from_names (LogviewManager *manager,
+                                     char ** names)
 {
-  GFile *file;
+  int i;
 
   g_assert (LOGVIEW_IS_MANAGER (manager));
+  g_assert (op == NULL);
 
-  file = g_file_new_for_path (filename);
-
-  logview_manager_add_log_from_gfile (manager, file, set_active);
+  op = multiple_creation_op_new (G_N_ELEMENTS (names));
 
-  g_object_unref (file);
+  for (i = 0; names[i]; i++) {
+    logview_manager_add_log_from_name (manager, names[i], FALSE, TRUE);
+  }
 }
 
 int

Modified: trunk/logview/logview-manager.h
==============================================================================
--- trunk/logview/logview-manager.h	(original)
+++ trunk/logview/logview-manager.h	Tue Dec 23 13:29:05 2008
@@ -66,12 +66,14 @@
 
 /* public methods */
 LogviewManager* logview_manager_get                 (void);
-void            logview_manager_add_log_from_name   (LogviewManager *manager,
-                                                     const char *filename,
+void            logview_manager_add_logs_from_name_list (LogviewManager *manager,
+                                                         GSList *names,
+                                                         const char *active);
+void            logview_manager_add_log_from_gfile  (LogviewManager *manager,
+                                                     GFile *file,
                                                      gboolean set_active);
 void            logview_manager_add_logs_from_names (LogviewManager *manager,
-                                                     GSList *names,
-                                                     const char *active);
+                                                     char ** names);
 void            logview_manager_set_active_log      (LogviewManager *manager,
                                                      LogviewLog *log);
 LogviewLog *    logview_manager_get_active_log      (LogviewManager *manager);

Modified: trunk/logview/logview-window.c
==============================================================================
--- trunk/logview/logview-window.c	(original)
+++ trunk/logview/logview-window.c	Tue Dec 23 13:29:05 2008
@@ -26,13 +26,15 @@
 #include <glib/gi18n.h>
 
 #include "logview-window.h"
-#include "logview-loglist.h"
 
+#include "logview-loglist.h"
 #include "logview-findbar.h"
 #include "logview-about.h"
 #include "logview-prefs.h"
 #include "logview-manager.h"
 
+#include "gtkmessagearea.h"
+
 #define APP_NAME _("System Log Viewer")
 #define SEARCH_START_MARK "lw-search-start-mark"
 #define SEARCH_END_MARK "lw-search-end-mark"
@@ -48,6 +50,7 @@
   GtkWidget *version_selector;
   GtkWidget *hpaned;
   GtkWidget *text_view;
+  GtkWidget *message_area;
 
   GtkTextTagTable *tag_table;
 
@@ -921,6 +924,64 @@
   populate_style_tag_table (style, logview->priv->tag_table);
 }
 
+/* copy-paste from GEdit */
+
+static void
+set_message_area_text_and_icon (GtkWidget *message_area,
+                                const char *icon_stock_id,
+                                const char *primary_text,
+                                const char *secondary_text)
+{
+  GtkWidget *hbox_content;
+  GtkWidget *image;
+  GtkWidget *vbox;
+  char *primary_markup;
+  char *secondary_markup;
+  GtkWidget *primary_label;
+  GtkWidget *secondary_label;
+
+  hbox_content = gtk_hbox_new (FALSE, 8);
+  gtk_widget_show (hbox_content);
+
+  image = gtk_image_new_from_stock (icon_stock_id, GTK_ICON_SIZE_DIALOG);
+  gtk_widget_show (image);
+  gtk_box_pack_start (GTK_BOX (hbox_content), image, FALSE, FALSE, 0);
+  gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0);
+
+  vbox = gtk_vbox_new (FALSE, 6);
+  gtk_widget_show (vbox);
+  gtk_box_pack_start (GTK_BOX (hbox_content), vbox, TRUE, TRUE, 0);
+
+  primary_markup = g_strdup_printf ("<b>%s</b>", primary_text);
+  primary_label = gtk_label_new (primary_markup);
+  g_free (primary_markup);
+  gtk_widget_show (primary_label);
+  gtk_box_pack_start (GTK_BOX (vbox), primary_label, TRUE, TRUE, 0);
+  gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE);
+  gtk_label_set_line_wrap (GTK_LABEL (primary_label), TRUE);
+  gtk_misc_set_alignment (GTK_MISC (primary_label), 0, 0.5);
+  GTK_WIDGET_SET_FLAGS (primary_label, GTK_CAN_FOCUS);
+  gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE);
+
+  if (secondary_text != NULL) {
+      secondary_markup = g_strdup_printf ("<small>%s</small>",
+                                          secondary_text);
+      secondary_label = gtk_label_new (secondary_markup);
+      g_free (secondary_markup);
+      gtk_widget_show (secondary_label);
+      gtk_box_pack_start (GTK_BOX (vbox), secondary_label, TRUE, TRUE, 0);
+      GTK_WIDGET_SET_FLAGS (secondary_label, GTK_CAN_FOCUS);
+      gtk_label_set_use_markup (GTK_LABEL (secondary_label), TRUE);
+      gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE);
+      gtk_label_set_selectable (GTK_LABEL (secondary_label), TRUE);
+      gtk_misc_set_alignment (GTK_MISC (secondary_label), 0, 0.5);
+  }
+
+  gtk_message_area_set_contents (GTK_MESSAGE_AREA (message_area),
+                                 hbox_content);
+}
+
+
 static void
 logview_window_finalize (GObject *object)
 {
@@ -1015,10 +1076,14 @@
   g_signal_connect (priv->loglist, "day_cleared",
                     G_CALLBACK (loglist_day_cleared_cb), logview);
 
-  /* second pane : log */
+  /* second pane: log */
   main_view = gtk_vbox_new (FALSE, 0);
   gtk_paned_pack2 (GTK_PANED (hpaned), main_view, TRUE, TRUE);
 
+  /* second pane: error message area */
+  priv->message_area = gtk_message_area_new ();
+  gtk_box_pack_start (GTK_BOX (main_view), priv->message_area, FALSE, FALSE, 0);
+
   /* second pane: text view */
   w = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w),
@@ -1119,3 +1184,22 @@
 
   return GTK_WIDGET (logview);
 }
+
+void
+logview_window_add_error (LogviewWindow *window,
+                          const char *primary,
+                          const char *secondary)
+{
+  g_assert (LOGVIEW_IS_WINDOW (window));
+
+  /* TODO: */
+}
+
+void
+logview_window_add_errors (LogviewWindow *window,
+                           GPtrArray *errors)
+{
+  g_assert (LOGVIEW_IS_WINDOW (window));
+
+  /* TODO: */
+}
\ No newline at end of file



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