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