evolution r36735 - trunk/e-util



Author: lakhil
Date: Tue Nov  4 04:44:03 2008
New Revision: 36735
URL: http://svn.gnome.org/viewvc/evolution?rev=36735&view=rev

Log:
2008-11-04  Akhil Laddha  <lakhil novell com>              

        * e-non-intrusive-error-dialog.c (eni_query_tooltip_cb),
        (eni_render_pixbuf), (eni_render_date), (eni_append_logs),
        (eni_config_get_error_level), (eni_config_get_error_timeout),
        (eni_error_timeout_changed), (eni_error_level_value_changed),
        (eni_show_logger):
        * e-non-intrusive-error-dialog.h:
        Missed commiting these files in the previous commit. 



Added:
   trunk/e-util/e-non-intrusive-error-dialog.c
   trunk/e-util/e-non-intrusive-error-dialog.h
Modified:
   trunk/e-util/ChangeLog

Added: trunk/e-util/e-non-intrusive-error-dialog.c
==============================================================================
--- (empty file)
+++ trunk/e-util/e-non-intrusive-error-dialog.c	Tue Nov  4 04:44:03 2008
@@ -0,0 +1,306 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ *  Authors: Ashish Shrivastava <shashish novell com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <glib/gstdio.h>
+#include "e-non-intrusive-error-dialog.h"
+
+/* eni - non intrusive error */
+
+static gboolean
+eni_query_tooltip_cb (GtkTreeView *view,
+                  gint x,
+                  gint y,
+                  gboolean keyboard_mode,
+                  GtkTooltip *tooltip)
+{
+        GtkTreeViewColumn *column;
+        GtkTreeModel *model;
+        GtkTreePath *path;
+        GtkTreeIter iter;
+        gint level;
+
+        if (!gtk_tree_view_get_tooltip_context (
+                view, &x, &y, keyboard_mode, NULL, &path, &iter))
+                return FALSE;
+
+        /* Figure out which column we're pointing at. */
+        if (keyboard_mode)
+                gtk_tree_view_get_cursor (view, NULL, &column);
+        else
+                gtk_tree_view_get_path_at_pos (
+                        view, x, y, NULL, &column, NULL, NULL);
+
+        /* Restrict the tip area to a single cell. */
+        gtk_tree_view_set_tooltip_cell (view, tooltip, path, column, NULL);
+
+        /* This only works if the tree view is NOT reorderable. */
+        if (column != gtk_tree_view_get_column (view, 0))
+                return FALSE;
+
+        model = gtk_tree_view_get_model (view);
+        gtk_tree_model_get (model, &iter, COL_LEVEL, &level, -1);
+        gtk_tooltip_set_text (tooltip, ldata[level].key);
+
+        return TRUE;
+}
+
+static void
+eni_render_pixbuf (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
+               GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
+{
+        gint level;
+
+        gtk_tree_model_get (model, iter, COL_LEVEL, &level, -1);
+        g_object_set (
+                renderer, "stock-id", ldata[level].stock_id,
+                "stock-size", GTK_ICON_SIZE_MENU, NULL);
+}
+
+static void
+eni_render_date (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
+              GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
+{
+        time_t t;
+        char sdt[100]; /* Should be sufficient? */
+
+        gtk_tree_model_get (model, iter, COL_TIME, &t, -1);
+        strftime (sdt, 100, "%x %X", localtime (&t));
+        g_object_set (renderer, "text", sdt, NULL);
+}
+
+static void
+eni_append_logs (const char *txt, GtkListStore *store)
+{
+        char **str;
+
+        str = g_strsplit (txt,  ":", 3);
+        if (str[0] && str[1] && str[2]) {
+                GtkTreeIter iter;
+
+                gtk_list_store_append (store, &iter);
+                gtk_list_store_set (
+                        store, &iter,
+                        COL_LEVEL, atoi (str[0]),
+                        COL_TIME, atol (str[1]),
+                        COL_DATA, g_strstrip (str[2]),
+                        -1);
+        } else
+                g_printerr ("Unable to decode error log: %s\n", txt);
+
+        g_strfreev (str);
+}
+
+static guint
+eni_config_get_error_level (const char *path)
+{
+        GConfClient *gconf_client;
+        guint error_level;
+
+        gconf_client = gconf_client_get_default ();
+        error_level = gconf_client_get_int (gconf_client, path, NULL);
+
+        g_object_unref (gconf_client);
+        return error_level;
+}
+
+guint
+eni_config_get_error_timeout (const char *path)
+{
+        GConfClient *gconf_client;
+        guint error_time;
+
+        gconf_client = gconf_client_get_default ();
+        error_time = gconf_client_get_int (gconf_client, path, NULL);
+
+        g_object_unref (gconf_client);
+        return error_time;
+}
+
+static void
+eni_error_timeout_changed (GtkSpinButton *b, void *data)
+{
+        GConfClient *gconf_client;
+        int value = gtk_spin_button_get_value_as_int (b);
+
+        gconf_client = gconf_client_get_default ();
+
+        gconf_client_set_int (gconf_client, (char *) data, value, NULL);
+        g_object_unref (gconf_client);
+}
+
+static void
+eni_error_level_value_changed (GtkComboBox *w, gpointer *data)
+{
+        GConfClient *gconf_client;
+        int value = gtk_combo_box_get_active (w);
+
+        gconf_client = gconf_client_get_default ();
+
+        gconf_client_set_int (gconf_client, (char *) data, value, NULL);
+
+        g_object_unref (gconf_client);
+}
+
+void 
+eni_show_logger(ELogger *logger, GtkWidget *top,const char *error_timeout_path, const char *error_level_path)
+{
+	GtkWidget *container;
+	GtkWidget *label;
+	GtkWidget *toplevel;
+	GtkWidget *vbox;
+	GtkWidget *widget;
+	GtkWidget *window;
+	GtkListStore *store;
+	GtkCellRenderer *renderer;
+	GtkTreeViewColumn *column;
+	int i;
+
+	toplevel = gtk_widget_get_toplevel (top);
+
+	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_default_size (GTK_WINDOW (window), 500, 400);
+	gtk_window_set_title (GTK_WINDOW (window), _("Debug Logs"));
+	gtk_window_set_transient_for (
+			GTK_WINDOW (window), GTK_WINDOW (toplevel));
+	gtk_container_set_border_width (GTK_CONTAINER (window), 12);
+
+	vbox = gtk_vbox_new (FALSE, 12);
+	gtk_container_add (GTK_CONTAINER (window), vbox);
+
+	container = gtk_hbox_new (FALSE, 6);
+	gtk_box_pack_start (GTK_BOX (vbox), container, FALSE, FALSE, 0);
+
+	/* Translators: This is the first part of the sentence
+	 * "Show _errors in the status bar for" - XXX - "second(s)." */
+	widget = gtk_label_new_with_mnemonic (
+			_("Show _errors in the status bar for"));
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+	label = widget;
+
+	widget = gtk_spin_button_new_with_range (1.0, 60.0, 1.0);
+	gtk_spin_button_set_value (
+			GTK_SPIN_BUTTON (widget),
+			(gdouble) eni_config_get_error_timeout (error_timeout_path));
+	g_signal_connect (
+			widget, "value-changed",
+			G_CALLBACK (eni_error_timeout_changed), error_timeout_path);
+
+	gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+
+	/* Translators: This is the second part of the sentence
+	 * "Show _errors in the status bar for" - XXX - "second(s)." */
+	widget = gtk_label_new_with_mnemonic (_("second(s)."));
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+
+	container = gtk_hbox_new (FALSE, 6);
+	gtk_box_pack_start (GTK_BOX (vbox), container, FALSE, FALSE, 0);
+
+	widget = gtk_label_new_with_mnemonic (_("Log Messages:"));
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+	label = widget;
+
+	widget = gtk_combo_box_new_text ();
+	for (i = E_LOG_ERROR; i <= E_LOG_DEBUG; i++)
+		gtk_combo_box_append_text (
+				GTK_COMBO_BOX (widget), ldata[i].text);
+	gtk_combo_box_set_active ((GtkComboBox *) widget, eni_config_get_error_level(error_level_path));
+
+	g_signal_connect (
+			widget, "changed",
+			G_CALLBACK (eni_error_level_value_changed), error_level_path);
+
+	gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+
+	store = gtk_list_store_new (3, G_TYPE_INT, G_TYPE_LONG, G_TYPE_STRING);
+	e_logger_get_logs (logger, (ELogFunction) eni_append_logs, store);
+	gtk_tree_sortable_set_sort_column_id (
+			GTK_TREE_SORTABLE (store), COL_TIME, GTK_SORT_DESCENDING);
+
+	container = gtk_scrolled_window_new (NULL, NULL);
+	gtk_scrolled_window_set_policy (
+			GTK_SCROLLED_WINDOW (container),
+			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	gtk_scrolled_window_set_shadow_type (
+			GTK_SCROLLED_WINDOW (container), GTK_SHADOW_IN);
+	gtk_box_pack_start (GTK_BOX (vbox), container, TRUE, TRUE, 0);
+
+	widget = gtk_tree_view_new();
+	gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (widget), TRUE);
+	gtk_tree_view_set_reorderable (GTK_TREE_VIEW (widget), FALSE);
+	gtk_tree_view_set_model (GTK_TREE_VIEW (widget), GTK_TREE_MODEL (store));
+	gtk_tree_view_set_search_column (GTK_TREE_VIEW (widget), COL_DATA);
+	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (widget), TRUE);
+	gtk_widget_set_has_tooltip (widget, TRUE);
+	gtk_container_add (GTK_CONTAINER (container), widget);
+
+	g_signal_connect (
+			widget, "query-tooltip",
+			G_CALLBACK (eni_query_tooltip_cb), NULL);
+
+	column = gtk_tree_view_column_new ();
+	gtk_tree_view_column_set_title (column, _("Log Level"));
+	gtk_tree_view_append_column (GTK_TREE_VIEW (widget), column);
+	renderer = gtk_cell_renderer_pixbuf_new ();
+	gtk_tree_view_column_pack_start (column, renderer, TRUE);
+	gtk_tree_view_column_set_cell_data_func (
+			column, renderer, eni_render_pixbuf, NULL, NULL);
+
+	column = gtk_tree_view_column_new ();
+	gtk_tree_view_column_set_title (column, _("Time"));
+	gtk_tree_view_append_column (GTK_TREE_VIEW (widget), column);
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_column_pack_start (column, renderer, FALSE);
+	gtk_tree_view_column_set_cell_data_func (
+			column, renderer, eni_render_date, NULL, NULL);
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_insert_column_with_attributes(
+			GTK_TREE_VIEW (widget), -1, _("Messages"),
+			renderer, "markup", COL_DATA, NULL);
+
+	container = gtk_hbutton_box_new ();
+	gtk_button_box_set_layout (
+			GTK_BUTTON_BOX (container), GTK_BUTTONBOX_END);
+	gtk_box_pack_start (GTK_BOX (vbox), container, FALSE, FALSE, 0);
+
+	widget = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
+	gtk_widget_set_tooltip_text (widget, _("Close this window"));
+	g_signal_connect_swapped (
+			widget, "clicked",
+			G_CALLBACK (gtk_widget_destroy), window);
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+
+	gtk_widget_show_all (window);
+}
+

Added: trunk/e-util/e-non-intrusive-error-dialog.h
==============================================================================
--- (empty file)
+++ trunk/e-util/e-non-intrusive-error-dialog.h	Tue Nov  4 04:44:03 2008
@@ -0,0 +1,68 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ *  Authors: Ashish Shrivastava <shashish novell com>
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __E_ERROR_DIALOG_H__
+#define __E_ERROR_DIALOG_H__
+
+#include <glib-object.h>
+#include "e-error.h"
+#include "e-icon-factory.h"
+#include "e-logger.h"
+#include "e-util/gconf-bridge.h"
+
+G_BEGIN_DECLS
+
+struct _log_data {
+        int level;
+        char *key;
+        char *text;
+        char *stock_id;
+        GdkPixbuf *pbuf;
+} ldata [] = {
+        { E_LOG_ERROR, N_("Error"), N_("Errors"), GTK_STOCK_DIALOG_ERROR },
+        { E_LOG_WARNINGS, N_("Warning"), N_("Warnings and Errors"), GTK_STOCK_DIALOG_WARNING },
+        { E_LOG_DEBUG, N_("Debug"), N_("Error, Warnings and Debug messages"), GTK_STOCK_DIALOG_INFO }
+};
+
+enum
+{
+        COL_LEVEL = 0,
+        COL_TIME,
+        COL_DATA
+};
+
+/* eni - error non intrusive*/
+static gboolean eni_query_tooltip_cb (GtkTreeView *view,gint x,gint y,gboolean keyboard_mode,GtkTooltip *tooltip);
+
+static void eni_render_pixbuf (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data);
+
+static void eni_render_date (GtkTreeViewColumn *column, GtkCellRenderer *renderer,GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data);
+
+static void eni_append_logs (const char *txt, GtkListStore *store);
+static void eni_error_timeout_changed (GtkSpinButton *b, void *data);
+static void eni_error_level_value_changed (GtkComboBox *w, gpointer *data);
+static guint eni_config_get_error_level (const char *path);
+guint eni_config_get_error_timeout (const char *path);
+void eni_show_logger(ELogger *logger, GtkWidget *widget, const char *error_timeout_path, const char *error_level_path);
+
+G_END_DECLS
+
+#endif /* __E_ERROR_DIALOG_H__ */



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