aboutsummaryrefslogtreecommitdiffstats
path: root/executive-summary/component/e-summary.c
diff options
context:
space:
mode:
authorIain Holmes <iain@src.gnome.org>2000-11-02 08:42:35 +0800
committerIain Holmes <iain@src.gnome.org>2000-11-02 08:42:35 +0800
commit4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c (patch)
tree6f9b76cee8d456070ca9c849c697f621ff833694 /executive-summary/component/e-summary.c
parent35162bcd8728297bff435a5592328051fd1df211 (diff)
downloadgsoc2013-evolution-4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c.tar
gsoc2013-evolution-4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c.tar.gz
gsoc2013-evolution-4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c.tar.bz2
gsoc2013-evolution-4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c.tar.lz
gsoc2013-evolution-4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c.tar.xz
gsoc2013-evolution-4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c.tar.zst
gsoc2013-evolution-4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c.zip
Moving the executive summarys now :)
mail-summary now has clickable names to change to that view executive summary remembers what components are running when you close. selection now blocks ES updating so it won't be cleared. svn path=/trunk/; revision=6330
Diffstat (limited to 'executive-summary/component/e-summary.c')
-rw-r--r--executive-summary/component/e-summary.c381
1 files changed, 349 insertions, 32 deletions
diff --git a/executive-summary/component/e-summary.c b/executive-summary/component/e-summary.c
index 736398214b..dca8f98f0f 100644
--- a/executive-summary/component/e-summary.c
+++ b/executive-summary/component/e-summary.c
@@ -32,52 +32,52 @@
#include <gtkhtml/gtkhtml-stream.h>
#include <gal/util/e-util.h>
-#include <evolution-services/executive-summary.h>
-#include <evolution-services/executive-summary-component-client.h>
-#include <evolution-services/executive-summary-component-view.h>
-
#include "e-summary.h"
+#include "e-summary-factory.h"
#include "e-summary-util.h"
#include "e-summary-url.h"
#define PARENT_TYPE (gtk_vbox_get_type ())
+/* From component-factory.c */
+extern char *evolution_dir;
+
static GtkObjectClass *e_summary_parent_class;
struct _ESummaryPrivate {
Evolution_Shell shell;
+ Evolution_ShellView shell_view_interface;
GtkWidget *html_scroller;
GtkWidget *html;
GHashTable *id_to_view;
+ GHashTable *view_to_window;
GHashTable *summary_to_window;
GList *window_list;
guint idle;
GtkHTMLStream *stream;
+ gboolean grabbed;
};
-typedef struct _ESummaryWindow {
- ExecutiveSummary *summary;
- ExecutiveSummaryComponentView *view;
-} ESummaryWindow;
-
static gboolean on_object_requested (GtkHTML *html,
GtkHTMLEmbedded *eb,
ESummary *summary);
-static void e_summary_window_free (ESummaryWindow *window,
- ESummaryPrivate *priv);
+static void e_summary_save_state (ESummary *esummary,
+ const char *path);
+static void e_summary_load_state (ESummary *esummary,
+ const char *path);
/* GtkObject methods */
static void
s2w_foreach (gpointer *key,
gpointer *value,
- ESummaryPrivate *priv)
+ ESummary *esummary)
{
- e_summary_window_free ((ESummaryWindow *) value, priv);
+ e_summary_window_free ((ESummaryWindow *) value, esummary);
g_free (value);
}
@@ -86,15 +86,21 @@ e_summary_destroy (GtkObject *object)
{
ESummary *esummary = E_SUMMARY (object);
ESummaryPrivate *priv;
+ char *prefix;
priv = esummary->private;
if (priv == NULL)
return;
+ prefix = g_concat_dir_and_file (evolution_dir, "config/Executive-Summary");
+ e_summary_save_state (esummary, prefix);
+ g_free (prefix);
+
g_hash_table_foreach (priv->summary_to_window,
- s2w_foreach, priv);
+ (GHFunc) s2w_foreach, esummary);
g_hash_table_destroy (priv->summary_to_window);
g_hash_table_destroy (priv->id_to_view);
+ g_hash_table_destroy (priv->view_to_window);
g_free (esummary->private);
esummary->private = NULL;
@@ -133,9 +139,9 @@ load_default (ESummary *summary)
ESummaryPrivate *priv;
char *def = "<table width=\"100%\"><tr><td align=\"right\">"
"<img src=\"ccsplash.png\"></td></tr></table>"
- "<table width=\"100%\"><tr><td><a href=\"exec://bug-buddy\"><img src=\"file://gnome-spider.png\">"
+ "<table><tr><td><a href=\"exec://bug-buddy\"><img src=\"file://gnome-spider.png\" width=\"24\" height=\"24\" border=\"0\">"
"</a></td><td><a href=\"exec://bug-buddy\">Submit a bug report"
- "</a></td><td>All Executive Summary comments to <a href=\"mailto:iain@helixcode.com\">Iain Holmes</a></td></tr></table><hr>";
+ "</a></td></tr></table><hr>";
g_return_if_fail (summary != NULL);
g_return_if_fail (IS_E_SUMMARY (summary));
@@ -151,7 +157,7 @@ static void
e_summary_end_load (ESummary *summary)
{
ESummaryPrivate *priv;
- char *footer = "</body></html>";
+ char *footer = "<hr><p align=\"right\">All Executive Summary comments to <a href=\"mailto:iain@helixcode.com\">Iain Holmes (iain@helixcode.com)</a></p></body></html>";
priv = summary->private;
gtk_html_write (GTK_HTML (priv->html), priv->stream,
@@ -186,7 +192,9 @@ e_summary_init (ESummary *esummary)
GTK_SIGNAL_FUNC (on_object_requested), esummary);
gtk_signal_connect (GTK_OBJECT (priv->html), "link-clicked",
GTK_SIGNAL_FUNC (e_summary_url_click), esummary);
-
+ gtk_signal_connect (GTK_OBJECT (priv->html), "on_url",
+ GTK_SIGNAL_FUNC (e_summary_url_over), esummary);
+
gtk_container_add (GTK_CONTAINER (priv->html_scroller), priv->html);
gtk_widget_show_all (priv->html_scroller);
@@ -199,6 +207,7 @@ e_summary_init (ESummary *esummary)
/* Init hashtables */
priv->summary_to_window = g_hash_table_new (NULL, NULL);
priv->id_to_view = g_hash_table_new (NULL, NULL);
+ priv->view_to_window = g_hash_table_new (NULL, NULL);
}
E_MAKE_TYPE (e_summary, "ESummary", ESummary, e_summary_class_init,
@@ -209,12 +218,19 @@ e_summary_new (const Evolution_Shell shell)
{
ESummary *esummary;
ESummaryPrivate *priv;
+ char *path;
esummary = gtk_type_new (e_summary_get_type ());
priv = esummary->private;
priv->shell = shell;
+ /* Restore services */
+ path = g_concat_dir_and_file (evolution_dir,
+ "config/Executive-Summary");
+ e_summary_load_state (esummary, path);
+ g_free (path);
+
return GTK_WIDGET (esummary);
}
@@ -250,34 +266,49 @@ on_object_requested (GtkHTML *html,
static void
e_summary_display_window (ESummary *esummary,
ESummaryWindow *window,
+ int row,
int col)
{
ESummaryPrivate *priv;
char *footer = "</td></tr></table>";
char *title_html;
+ char *control_html;
char *colour[2] = {"e6e8e4",
"edeeeb"};
char *title_colour[2] = {"bac1b6",
"cdd1c7"};
const char *title, *icon, *html;
+ int id;
priv = esummary->private;
title = executive_summary_component_view_get_title (window->view);
icon = executive_summary_component_view_get_icon (window->view);
html = executive_summary_component_view_get_html (window->view);
+ id = executive_summary_component_view_get_id (window->view);
/** FIXME: Make this faster by caching it? */
+
+ control_html = g_strdup_printf
+ ("<table width=\"32\" height=\"48\"><tr><td>"
+ "<a href=\"close://%d\"><img border=\"0\" src=\"service-close.png\"></a></td>"
+ "<td><a href=\"configure://%d\"><img border=\"0\" src=\"service-configure.png\"></a></td></tr>"
+ "<tr><td><a href=\"left://%d\"><img border=\"0\" src=\"service-left.png\"></a></td>"
+ "<td><a href=\"right://%d\"><img border=\"0\" src=\"service-right.png\"></a></td></tr>"
+ "<tr><td><a href=\"down://%d\"><img border=\"0\" src=\"service-down.png\"></a></td>"
+ "<td><a href=\"up://%d\"><img border=\"0\" src=\"service-up.png\"></a></td></tr></table>", id, id, id, id, id, id);
+
title_html = g_strdup_printf ("<table cellspacing=\"0\" "
"cellpadding=\"0\" border=\"0\" width=\"100%%\" height=\"100%%\">"
"<tr><td bgcolor=\"#%s\">"
"<table width=\"100%%\"><tr><td>"
"<img src=\"%s\"></td>"
"<td nowrap align=\"center\" width=\"100%%\">"
- "<b>%s</b></td></tr></table></td></tr><tr>"
- "<td bgcolor=\"#%s\" height=\"100%%\">",
+ "<b>%s</b></td><td>%s</td></tr></table></td></tr><tr>"
+ "<td bgcolor=\"#%s\" height=\"100%%\">",
title_colour[col % 2], icon, title,
- colour[col % 2]);
+ control_html, colour[col % 2]);
+ g_free (control_html);
gtk_html_write (GTK_HTML (priv->html), priv->stream, title_html,
strlen (title_html));
@@ -312,6 +343,12 @@ e_summary_rebuild_page (ESummary *esummary)
priv = esummary->private;
+ /* If there is a selection, don't redraw the page so that the selection
+ isn't cleared */
+ if (GTK_HTML (priv->html)->in_selection == TRUE ||
+ GTK_HTML (priv->html)->engine->active_selection == TRUE)
+ return TRUE;
+
gtk_layout_freeze (GTK_LAYOUT (priv->html));
e_summary_start_load (esummary);
load_default (esummary);
@@ -339,7 +376,8 @@ e_summary_rebuild_page (ESummary *esummary)
gtk_html_write (GTK_HTML (priv->html), priv->stream,
td, strlen (td));
- e_summary_display_window (esummary, window, (loc % 3));
+ e_summary_display_window (esummary, window,
+ (loc / 3), (loc % 3));
gtk_html_write (GTK_HTML (priv->html), priv->stream, "</td>", 5);
loc++;
@@ -357,7 +395,8 @@ e_summary_rebuild_page (ESummary *esummary)
void
e_summary_add_service (ESummary *esummary,
ExecutiveSummary *summary,
- ExecutiveSummaryComponentView *view)
+ ExecutiveSummaryComponentView *view,
+ const char *iid)
{
ESummaryWindow *window;
ESummaryPrivate *priv;
@@ -372,7 +411,7 @@ e_summary_add_service (ESummary *esummary,
window = g_new0 (ESummaryWindow, 1);
window->summary = summary;
-
+ window->iid = g_strdup (iid);
window->view = view;
priv = esummary->private;
@@ -380,8 +419,8 @@ e_summary_add_service (ESummary *esummary,
g_hash_table_insert (priv->summary_to_window, summary, window);
id = executive_summary_component_view_get_id (view);
- g_print ("--%d: %p\n", id, view);
g_hash_table_insert (priv->id_to_view, GINT_TO_POINTER (id), view);
+ g_hash_table_insert (priv->view_to_window, view, window);
}
#if 0
@@ -438,11 +477,19 @@ e_summary_add_bonobo_service (ESummary *esummary,
}
#endif
-static void
+void
e_summary_window_free (ESummaryWindow *window,
- ESummaryPrivate *priv)
+ ESummary *esummary)
{
- g_print ("%s\n", __FUNCTION__);
+ ESummaryPrivate *priv;
+
+ g_return_if_fail (window != NULL);
+ g_return_if_fail (esummary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (esummary));
+
+ priv = esummary->private;
+ g_free (window->iid);
+
priv->window_list = g_list_remove (priv->window_list, window);
bonobo_object_unref (BONOBO_OBJECT (window->summary));
@@ -451,10 +498,13 @@ e_summary_window_free (ESummaryWindow *window,
/* Call this before e_summary_window_free, execpt when you are freeing
the hash table */
-static void
+void
e_summary_window_remove_from_ht (ESummaryWindow *window,
- ESummaryPrivate *priv)
+ ESummary *esummary)
{
+ ESummaryPrivate *priv;
+
+ priv = esummary->private;
g_hash_table_remove (priv->summary_to_window, window->summary);
}
@@ -474,7 +524,7 @@ e_summary_update_window (ESummary *esummary,
if (priv->idle != 0)
return;
- priv->idle = g_idle_add (e_summary_rebuild_page, esummary);
+ priv->idle = g_idle_add ((GSourceFunc) e_summary_rebuild_page, esummary);
}
ExecutiveSummaryComponentView *
@@ -491,6 +541,273 @@ e_summary_view_from_id (ESummary *esummary,
priv = esummary->private;
view = g_hash_table_lookup (priv->id_to_view, GINT_TO_POINTER (id));
- g_print ("%d: %p\n", id, view);
return view;
}
+
+void
+e_summary_set_shell_view_interface (ESummary *summary,
+ Evolution_ShellView svi)
+{
+ ESummaryPrivate *priv;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+ g_return_if_fail (svi != CORBA_OBJECT_NIL);
+
+ priv = summary->private;
+ priv->shell_view_interface = svi;
+}
+
+/* Wrappers for Evolution_ShellView */
+void
+e_summary_set_message (ESummary *esummary,
+ const char *message,
+ gboolean busy)
+{
+ ESummaryPrivate *priv;
+ Evolution_ShellView svi;
+ CORBA_Environment ev;
+
+ g_return_if_fail (esummary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (esummary));
+
+ priv = esummary->private;
+
+ svi = priv->shell_view_interface;
+ if (svi == NULL)
+ return;
+
+ CORBA_exception_init (&ev);
+ if (message != NULL)
+ Evolution_ShellView_set_message (svi, message, busy, &ev);
+ else
+ Evolution_ShellView_set_message (svi, "", busy, &ev);
+ CORBA_exception_free (&ev);
+}
+
+void
+e_summary_unset_message (ESummary *esummary)
+{
+ ESummaryPrivate *priv;
+ Evolution_ShellView svi;
+ CORBA_Environment ev;
+
+ g_return_if_fail (esummary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (esummary));
+
+ priv = esummary->private;
+
+ svi = priv->shell_view_interface;
+ if (svi == NULL)
+ return;
+
+ CORBA_exception_init (&ev);
+ Evolution_ShellView_unset_message (svi, &ev);
+ CORBA_exception_free (&ev);
+}
+
+void
+e_summary_change_current_view (ESummary *esummary,
+ const char *uri)
+{
+ ESummaryPrivate *priv;
+ Evolution_ShellView svi;
+ CORBA_Environment ev;
+
+ g_return_if_fail (esummary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (esummary));
+
+ priv = esummary->private;
+
+ svi = priv->shell_view_interface;
+ if (svi == NULL)
+ return;
+
+ CORBA_exception_init (&ev);
+ Evolution_ShellView_change_current_view (svi, uri, &ev);
+ CORBA_exception_free (&ev);
+}
+
+void
+e_summary_set_title (ESummary *esummary,
+ const char *title)
+{
+ ESummaryPrivate *priv;
+ Evolution_ShellView svi;
+ CORBA_Environment ev;
+
+ g_return_if_fail (esummary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (esummary));
+
+ priv = esummary->private;
+
+ svi = priv->shell_view_interface;
+ if (svi == NULL)
+ return;
+
+ CORBA_exception_init (&ev);
+ Evolution_ShellView_set_title (svi, title, &ev);
+ CORBA_exception_free (&ev);
+}
+
+static void
+e_summary_load_state (ESummary *esummary,
+ const char *path)
+{
+ char *fullpath;
+ char **argv;
+ int argc, i;
+
+ g_return_if_fail (esummary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (esummary));
+
+ fullpath = g_strdup_printf ("=%s=/services/iids", path);
+ gnome_config_get_vector (fullpath, &argc, &argv);
+
+ for (i = 0; i < argc; i++) {
+ e_summary_factory_embed_service_from_id (esummary, argv[i]);
+ }
+
+ g_free (argv);
+ g_free (fullpath);
+}
+
+static void
+e_summary_save_state (ESummary *esummary,
+ const char *path)
+{
+ ESummaryPrivate *priv;
+ GList *windows;
+ char *fullpath;
+ char **argv;
+ int argc, i;
+
+ g_return_if_fail (esummary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (esummary));
+
+ fullpath = g_strdup_printf("=%s=/services/iids", path);
+ priv = esummary->private;
+
+ argc = g_list_length (priv->window_list);
+ argv = g_new (char *, argc);
+
+ for (windows = priv->window_list, i = 0; windows;
+ windows = windows->next, i++) {
+ ESummaryWindow *window;
+
+ window = windows->data;
+ g_print ("%s: IID: %s\n", path, window->iid);
+ argv[i] = window->iid;
+ }
+
+ gnome_config_set_vector (fullpath, argc, (const char **)argv);
+
+ gnome_config_sync ();
+ gnome_config_drop_all ();
+
+ g_free (fullpath);
+ g_free (argv);
+}
+
+ESummaryWindow *
+e_summary_window_from_view (ESummary *esummary,
+ ExecutiveSummaryComponentView *view)
+{
+ ESummaryPrivate *priv;
+
+ priv = esummary->private;
+ return g_hash_table_lookup (priv->view_to_window, view);
+}
+
+void
+e_summary_window_move_left (ESummary *esummary,
+ ESummaryWindow *window)
+{
+ ESummaryPrivate *priv;
+ GList *win_item, *grandparent;
+ int position;
+
+ priv = esummary->private;
+
+ /* Need to cache this location */
+ win_item = g_list_find (priv->window_list, window);
+
+ /* Find the item 2 previous. */
+ if (win_item->prev == NULL)
+ return; /* Item was first, can't be moved left */
+
+ grandparent = win_item->prev->prev;
+
+ /* Remove it from the list */
+ priv->window_list = g_list_remove_link (priv->window_list, win_item);
+
+ /* Insert it after the grandparent */
+ position = g_list_position (priv->window_list, grandparent);
+ priv->window_list = g_list_insert (priv->window_list, win_item->data,
+ position + 1);
+ g_list_free_1 (win_item);
+}
+
+void
+e_summary_window_move_right (ESummary *esummary,
+ ESummaryWindow *window)
+{
+ ESummaryPrivate *priv;
+ GList *win_item, *child;
+ int position;
+
+ priv = esummary->private;
+
+ win_item = g_list_find (priv->window_list, window);
+
+ if (win_item->next == NULL)
+ return;
+
+ child = win_item->next;
+
+ priv->window_list = g_list_remove_link (priv->window_list, win_item);
+
+ position = g_list_position (priv->window_list, child);
+ priv->window_list = g_list_insert (priv->window_list, win_item->data,
+ position + 1);
+ g_list_free_1 (win_item);
+}
+
+void
+e_summary_window_move_up (ESummary *esummary,
+ ESummaryWindow *window)
+{
+ ESummaryPrivate *priv;
+ GList *win_item;
+ int position;
+
+ priv = esummary->private;
+
+ win_item = g_list_find (priv->window_list, window);
+
+ position = g_list_position (priv->window_list, win_item);
+ priv->window_list = g_list_remove_link (priv->window_list, win_item);
+
+ priv->window_list = g_list_insert (priv->window_list, win_item->data,
+ position - 3);
+ g_list_free_1 (win_item);
+}
+
+void
+e_summary_window_move_down (ESummary *esummary,
+ ESummaryWindow *window)
+{
+ ESummaryPrivate *priv;
+ GList *win_item;
+ int position;
+
+ priv = esummary->private;
+
+ win_item = g_list_find (priv->window_list, window);
+
+ position = g_list_position (priv->window_list, win_item);
+ priv->window_list = g_list_remove_link (priv->window_list, win_item);
+
+ priv->window_list = g_list_insert (priv->window_list, win_item->data,
+ position + 3);
+}