[evolution] Bug 593881 - Category icons do not appear in preview pane



commit d0841e7c2490436c664cfec87099b86d54d4127d
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Sep 3 08:29:15 2009 -0400

    Bug 593881 - Category icons do not appear in preview pane

 calendar/gui/e-cal-component-preview.c       |  101 ++++++++++++++++----------
 modules/calendar/e-memo-shell-view-private.c |   25 +++++++
 modules/calendar/e-task-shell-view-private.c |   27 +++++++-
 3 files changed, 115 insertions(+), 38 deletions(-)
---
diff --git a/calendar/gui/e-cal-component-preview.c b/calendar/gui/e-cal-component-preview.c
index de6f6fc..633eb56 100644
--- a/calendar/gui/e-cal-component-preview.c
+++ b/calendar/gui/e-cal-component-preview.c
@@ -46,31 +46,6 @@ struct _ECalComponentPreviewPrivate {
 
 static gpointer parent_class;
 
-static void
-cal_component_preview_link_clicked (GtkHTML *html,
-                                    const gchar *uri)
-{
-	/* FIXME Pass a parent window. */
-	e_show_uri (NULL, uri);
-}
-
-static void
-cal_component_preview_on_url (GtkHTML *html,
-                              const gchar *url)
-{
-#if 0
-	gchar *msg;
-	ECalComponentPreview *preview = data;
-
-	if (url && *url) {
-		msg = g_strdup_printf (_("Click to open %s"), url);
-		e_calendar_table_set_status_message (e_tasks_get_calendar_table (tasks), msg);
-		g_free (msg);
-	} else
-		e_calendar_table_set_status_message (e_tasks_get_calendar_table (tasks), NULL);
-#endif
-}
-
 /* Converts a time_t to a string, relative to the specified timezone */
 static gchar *
 timet_to_str_with_zone (ECalComponentDateTime *dt,
@@ -159,7 +134,9 @@ cal_component_preview_write_html (GtkHTMLStream *stream,
 		}
 	}
 	if (string->len > 0)
-		gtk_html_stream_printf (stream, "%s</H3>", string->str);
+		gtk_html_stream_printf (stream, "%s", string->str);
+	if (list != NULL)
+		gtk_html_stream_printf (stream, "</H3>");
 	e_cal_component_free_categories_list (list);
 	g_string_free (string, TRUE);
 
@@ -294,33 +271,83 @@ cal_component_preview_write_html (GtkHTMLStream *stream,
 }
 
 static void
-cal_component_preview_finalize (GObject *object)
+cal_component_preview_url_requested (GtkHTML *html,
+                                     const gchar *url,
+                                     GtkHTMLStream *html_stream)
 {
-	ECalComponentPreviewPrivate *priv;
+	GFile *file;
+	GFileInputStream *input_stream;
+	gchar buffer[4096];
+	gssize bytes_read;
+	GError *error = NULL;
+
+	file = g_file_new_for_uri (url);
+
+	/* XXX We only handle native files, which I guess minimizes
+	 *     the damage from doing blocking reads here.  Annoying
+	 *     that GtkHTML does not handle this itself. */
+	if (!g_file_is_native (file))
+		goto exit;
+
+	input_stream = g_file_read (file, NULL, &error);
+
+	if (error != NULL)
+		goto fail;
+
+	do {
+		bytes_read = g_input_stream_read (
+			G_INPUT_STREAM (input_stream),
+			buffer, sizeof (buffer), NULL, &error);
 
-	priv = E_CAL_COMPONENT_PREVIEW_GET_PRIVATE (object);
+		if (bytes_read > 0)
+			gtk_html_stream_write (
+				html_stream, buffer, bytes_read);
 
-	/* XXX Nothing to do? */
+	} while (bytes_read > 0);
 
-	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	if (error != NULL)
+		goto fail;
+
+	gtk_html_stream_close (html_stream, GTK_HTML_STREAM_OK);
+
+	goto exit;
+
+fail:
+	g_warning ("%s", error->message);
+	g_error_free (error);
+
+	gtk_html_stream_close (html_stream, GTK_HTML_STREAM_ERROR);
+
+exit:
+	if (input_stream != NULL)
+		g_object_unref (input_stream);
+
+	g_object_unref (file);
+}
+
+static void
+cal_component_preview_link_clicked (GtkHTML *html,
+                                    const gchar *uri)
+{
+	gpointer parent;
+
+	parent = gtk_widget_get_toplevel (GTK_WIDGET (html));
+	parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL;
+
+	e_show_uri (parent, uri);
 }
 
 static void
 cal_component_preview_class_init (ECalComponentPreviewClass *class)
 {
-	GObjectClass *object_class;
 	GtkHTMLClass *gtkhtml_class;
 
 	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (ECalComponentPreviewPrivate));
 
-	object_class = G_OBJECT_CLASS (class);
-	object_class->finalize = cal_component_preview_finalize;
-
 	gtkhtml_class = GTK_HTML_CLASS (class);
+	gtkhtml_class->url_requested = cal_component_preview_url_requested;
 	gtkhtml_class->link_clicked = cal_component_preview_link_clicked;
-	gtkhtml_class->on_url = cal_component_preview_on_url;
 }
 
 static void
diff --git a/modules/calendar/e-memo-shell-view-private.c b/modules/calendar/e-memo-shell-view-private.c
index f1d331f..0a96d29 100644
--- a/modules/calendar/e-memo-shell-view-private.c
+++ b/modules/calendar/e-memo-shell-view-private.c
@@ -24,6 +24,24 @@
 #include "widgets/menus/gal-view-factory-etable.h"
 
 static void
+memo_shell_view_preview_on_url_cb (EShellView *shell_view,
+                                   const gchar *url)
+{
+	EShellTaskbar *shell_taskbar;
+	gchar *message;
+
+	shell_taskbar = e_shell_view_get_shell_taskbar (shell_view);
+
+	if (url == NULL || *url == '\0')
+		e_shell_taskbar_set_message (shell_taskbar, NULL);
+	else {
+		message = g_strdup_printf (_("Click to open %s"), url);
+		e_shell_taskbar_set_message (shell_taskbar, message);
+		g_free (message);
+	}
+}
+
+static void
 memo_shell_view_table_popup_event_cb (EShellView *shell_view,
                                       GdkEventButton *event)
 {
@@ -171,6 +189,7 @@ e_memo_shell_view_private_constructed (EMemoShellView *memo_shell_view)
 	EShellContent *shell_content;
 	EShellSidebar *shell_sidebar;
 	EShellWindow *shell_window;
+	ECalComponentPreview *memo_preview;
 	EMemoTable *memo_table;
 	ECalModel *model;
 	ETable *table;
@@ -191,6 +210,7 @@ e_memo_shell_view_private_constructed (EMemoShellView *memo_shell_view)
 	priv->memo_shell_sidebar = g_object_ref (shell_sidebar);
 
 	memo_shell_content = E_MEMO_SHELL_CONTENT (shell_content);
+	memo_preview = e_memo_shell_content_get_memo_preview (memo_shell_content);
 	memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
 	model = e_memo_table_get_model (memo_table);
 	table = e_memo_table_get_table (memo_table);
@@ -204,6 +224,11 @@ e_memo_shell_view_private_constructed (EMemoShellView *memo_shell_view)
 		memo_shell_view);
 
 	g_signal_connect_swapped (
+		memo_preview, "on-url",
+		G_CALLBACK (memo_shell_view_preview_on_url_cb),
+		memo_shell_view);
+
+	g_signal_connect_swapped (
 		memo_table, "open-component",
 		G_CALLBACK (e_memo_shell_view_open_memo),
 		memo_shell_view);
diff --git a/modules/calendar/e-task-shell-view-private.c b/modules/calendar/e-task-shell-view-private.c
index 87bb698..380d54e 100644
--- a/modules/calendar/e-task-shell-view-private.c
+++ b/modules/calendar/e-task-shell-view-private.c
@@ -47,6 +47,24 @@ task_shell_view_process_completed_tasks (ETaskShellView *task_shell_view)
 }
 
 static void
+task_shell_view_preview_on_url_cb (EShellView *shell_view,
+                                   const gchar *url)
+{
+	EShellTaskbar *shell_taskbar;
+	gchar *message;
+
+	shell_taskbar = e_shell_view_get_shell_taskbar (shell_view);
+
+	if (url == NULL || *url == '\0')
+		e_shell_taskbar_set_message (shell_taskbar, NULL);
+	else {
+		message = g_strdup_printf (_("Click to open %s"), url);
+		e_shell_taskbar_set_message (shell_taskbar, message);
+		g_free (message);
+	}
+}
+
+static void
 task_shell_view_table_popup_event_cb (EShellView *shell_view,
                                       GdkEventButton *event)
 {
@@ -214,12 +232,13 @@ e_task_shell_view_private_constructed (ETaskShellView *task_shell_view)
 	ETaskShellContent *task_shell_content;
 	ETaskShellSidebar *task_shell_sidebar;
 	EShell *shell;
+	EShellView *shell_view;
 	EShellBackend *shell_backend;
 	EShellContent *shell_content;
 	EShellSettings *shell_settings;
 	EShellSidebar *shell_sidebar;
 	EShellWindow *shell_window;
-	EShellView *shell_view;
+	ECalComponentPreview *task_preview;
 	ECalendarTable *task_table;
 	ECalModel *model;
 	ETable *table;
@@ -243,6 +262,7 @@ e_task_shell_view_private_constructed (ETaskShellView *task_shell_view)
 	priv->task_shell_sidebar = g_object_ref (shell_sidebar);
 
 	task_shell_content = E_TASK_SHELL_CONTENT (shell_content);
+	task_preview = e_task_shell_content_get_task_preview (task_shell_content);
 	task_table = e_task_shell_content_get_task_table (task_shell_content);
 	model = e_calendar_table_get_model (task_table);
 	table = e_calendar_table_get_table (task_table);
@@ -256,6 +276,11 @@ e_task_shell_view_private_constructed (ETaskShellView *task_shell_view)
 		task_shell_view);
 
 	g_signal_connect_swapped (
+		task_preview, "on-url",
+		G_CALLBACK (task_shell_view_preview_on_url_cb),
+		task_shell_view);
+
+	g_signal_connect_swapped (
 		task_table, "open-component",
 		G_CALLBACK (e_task_shell_view_open_task),
 		task_shell_view);



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