diff options
author | Iain Holmes <iain@src.gnome.org> | 2000-11-02 08:42:35 +0800 |
---|---|---|
committer | Iain Holmes <iain@src.gnome.org> | 2000-11-02 08:42:35 +0800 |
commit | 4f3a4c8234238faaac1dea1ae68cae4d5dca3a5c (patch) | |
tree | 6f9b76cee8d456070ca9c849c697f621ff833694 /executive-summary | |
parent | 35162bcd8728297bff435a5592328051fd1df211 (diff) | |
download | gsoc2013-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')
-rw-r--r-- | executive-summary/ChangeLog | 50 | ||||
-rw-r--r-- | executive-summary/component/e-summary-factory.c | 85 | ||||
-rw-r--r-- | executive-summary/component/e-summary-factory.h | 3 | ||||
-rw-r--r-- | executive-summary/component/e-summary-url.c | 306 | ||||
-rw-r--r-- | executive-summary/component/e-summary-url.h | 3 | ||||
-rw-r--r-- | executive-summary/component/e-summary.c | 381 | ||||
-rw-r--r-- | executive-summary/component/e-summary.h | 40 | ||||
-rw-r--r-- | executive-summary/evolution-services/executive-summary-component-client.c | 21 | ||||
-rw-r--r-- | executive-summary/evolution-services/executive-summary-component-client.h | 11 | ||||
-rw-r--r-- | executive-summary/evolution-services/executive-summary-component-view.c | 2 | ||||
-rw-r--r-- | executive-summary/evolution-services/executive-summary-component.c | 6 | ||||
-rw-r--r-- | executive-summary/idl/SummaryComponent.idl | 3 | ||||
-rw-r--r-- | executive-summary/test-service/main.c | 2 |
13 files changed, 817 insertions, 96 deletions
diff --git a/executive-summary/ChangeLog b/executive-summary/ChangeLog index 1f1717db45..2a59845862 100644 --- a/executive-summary/ChangeLog +++ b/executive-summary/ChangeLog @@ -1,3 +1,53 @@ +2000-11-01 Iain Holmes <iain@helixcode.com> + + * component/e-summary.c: + component/e-summary-factory.c: + component/e-summary-url.c: Warning's cleanup. + +2000-11-01 Iain Holmes <iain@helixcode.com> + + * component/e-summary.c (e_summary_rebuild_page): Requeue the redraw + if there is a selection on the widget. + +2000-11-01 Iain Holmes <iain@helixcode.com> + + * component/e-summary.c (e_summary_display_window): Draw the window + controls to move, close and configure the window. + (e_summary_window_move_(left|right|up|down)): Move the window around the + window list. + + * component/e-summary-url.c (e_summary_url_click): Add handlers for the + window control URIs (close:// configure:// up:// down:// left:// and + right://). + (get_protocol): Add support for the new protocols. + (parse_uri): Ditto. + (e_summary_url_describe): ditto. + +2000-10-30 Iain Holmes <iain@helixcode.com> + + * component/e-summary-factory.c (embed_service): Generate the uid here + and pass it into the create_view method. + + * evolution-services/executive-summary-component-client.c + (executive_summary_component_client_create_view): Use the passed in UID + to generate a view. + + * evolution-services/executive-summary-component.c + (impl_Evolution_SummaryComponent_create_view): Don't generate the id here + but use the passed in one instead. + + * idl/SummaryComponent.idl: create_view now takes an ID parameter. + +2000-10-26 Iain Holmes <iain@helixcode.com> + + * component/e-summary.c (load_default): Neaten the Report bug link. + (e_summary_end_load): Put in a <hr> and a mailto to me. + (e_summary_new): Create an EvolutionShellClient from the Evolution_Shell. + (e_summary_get_shell_client): Retrieve the shell-client. + + * component/e-summary-url.c (e_summary_url_click): On a PROTOCOL_VIEW + change the current view to the one specified in the URL. + 2000-10-28 Ettore Perazzoli <ettore@helixcode.com> * component/Makefile.am (INCLUDES): Add diff --git a/executive-summary/component/e-summary-factory.c b/executive-summary/component/e-summary-factory.c index 435e6953ad..4593edee47 100644 --- a/executive-summary/component/e-summary-factory.c +++ b/executive-summary/component/e-summary-factory.c @@ -50,8 +50,8 @@ static GList *control_list = NULL; -GtkWidget* embed_service (GtkWidget *widget, - ESummary *esummary); +void embed_service (GtkWidget *widget, + ESummary *esummary); BonoboUIVerb verbs[] = { BONOBO_UI_UNSAFE_VERB ("AddService", embed_service), @@ -118,11 +118,41 @@ control_activate_cb (BonoboControl *control, gboolean activate, gpointer user_data) { + ESummary *summary; BonoboUIComponent *ui_component; - + Bonobo_ControlFrame control_frame; + Evolution_ShellView shell_view_interface; + CORBA_Environment ev; + ui_component = bonobo_control_get_ui_component (control); g_assert (ui_component != NULL); + if (gtk_object_get_data (GTK_OBJECT (control), "shell_view_interface") == NULL) { + control_frame = bonobo_control_get_control_frame (control); + if (control_frame == NULL) { + goto out; + } + + CORBA_exception_init (&ev); + shell_view_interface = Bonobo_Unknown_query_interface (control_frame, + "IDL:Evolution/ShellView:1.0", + &ev); + CORBA_exception_free (&ev); + + if (shell_view_interface != CORBA_OBJECT_NIL) { + gtk_object_set_data (GTK_OBJECT (control), + "shell_view_interface", + shell_view_interface); + } else { + g_warning ("Control frame doesn't have Evolution/ShellView."); + } + + summary = E_SUMMARY (user_data); + e_summary_set_shell_view_interface (summary, + shell_view_interface); + } + + out: if (activate) control_activate (control, ui_component, user_data); else @@ -147,7 +177,6 @@ update (ExecutiveSummary *summary, ESummary *esummary) { ExecutiveSummaryComponentView *view; - g_print ("OI!\n"); view = e_summary_view_from_id (esummary, id); executive_summary_component_view_set_html (view, html); @@ -158,9 +187,12 @@ static void set_title (ExecutiveSummary *summary, int id, const char *title, - gpointer user_data) + ESummary *esummary) { - g_print ("Setting title to %s\n", title); + ExecutiveSummaryComponentView *view; + + view = e_summary_view_from_id (esummary, id); + executive_summary_component_view_set_title (view, title); } static void @@ -186,48 +218,53 @@ view_destroyed (ExecutiveSummaryComponentView *view, /* A ********very******** temporary function to embed something */ -GtkWidget* +void embed_service (GtkWidget *widget, ESummary *esummary) { - ExecutiveSummaryComponentClient *client; - ExecutiveSummary *summary; - ExecutiveSummaryComponentView *view; char *required_interfaces[2] = {"IDL:Evolution:SummaryComponent:1.0", NULL}; char *obj_id; - char *title; - char *icon; - char *html; - + obj_id = bonobo_selector_select_id ("Select a service", (const char **) required_interfaces); if (obj_id == NULL) - return NULL; + return; - client = executive_summary_component_client_new (obj_id); + e_summary_factory_embed_service_from_id (esummary, obj_id); +} - if (client == NULL) - return NULL; +void +e_summary_factory_embed_service_from_id (ESummary *esummary, + const char *obj_id) +{ + ExecutiveSummaryComponentClient *client; + ExecutiveSummary *summary; + ExecutiveSummaryComponentView *view; + int id; + + client = executive_summary_component_client_new (obj_id); + + g_return_if_fail (client != NULL); /* Set the owner */ - summary = executive_summary_new (); + summary = EXECUTIVE_SUMMARY (executive_summary_new ()); executive_summary_component_client_set_owner (client, summary); gtk_signal_connect (GTK_OBJECT (summary), "flash", - GTK_SIGNAL_FUNC (flash), NULL); + GTK_SIGNAL_FUNC (flash), esummary); gtk_signal_connect (GTK_OBJECT (summary), "set_title", - GTK_SIGNAL_FUNC (set_title), NULL); + GTK_SIGNAL_FUNC (set_title), esummary); gtk_signal_connect (GTK_OBJECT (summary), "update", GTK_SIGNAL_FUNC (update), esummary); /* Create view */ - view = executive_summary_component_client_create_view (client); + id = executive_summary_component_create_unique_id (); + view = executive_summary_component_client_create_view (client, id); gtk_signal_connect (GTK_OBJECT (view), "destroy", GTK_SIGNAL_FUNC (view_destroyed), client); - e_summary_add_service (esummary, summary, view); + e_summary_add_service (esummary, summary, view, obj_id); e_summary_rebuild_page (esummary); - return NULL; } BonoboControl * diff --git a/executive-summary/component/e-summary-factory.h b/executive-summary/component/e-summary-factory.h index e9c8660c82..175988a78c 100644 --- a/executive-summary/component/e-summary-factory.h +++ b/executive-summary/component/e-summary-factory.h @@ -25,8 +25,11 @@ #define _E_SUMMARY_FACTORY_H__ #include <Evolution.h> +#include "e-summary.h" BonoboControl *e_summary_factory_new_control (const char *uri, const Evolution_Shell shell); +void e_summary_factory_embed_service_from_id (ESummary *esummary, + const char *obj_id); #endif diff --git a/executive-summary/component/e-summary-url.c b/executive-summary/component/e-summary-url.c index 856297bb68..c07a3efc99 100644 --- a/executive-summary/component/e-summary-url.c +++ b/executive-summary/component/e-summary-url.c @@ -39,6 +39,7 @@ #include "e-summary-url.h" #include "e-summary-util.h" +#include <evolution-services/executive-summary-component-view.h> #include "Composer.h" typedef enum _ESummaryProtocol { @@ -48,11 +49,37 @@ typedef enum _ESummaryProtocol { PROTOCOL_VIEW, PROTOCOL_EXEC, PROTOCOL_FILE, + PROTOCOL_CLOSE, + PROTOCOL_LEFT, + PROTOCOL_RIGHT, + PROTOCOL_UP, + PROTOCOL_DOWN, + PROTOCOL_CONFIGURE, PROTOCOL_OTHER } ESummaryProtocol; +static char *descriptions[] = { + N_("Open %s with the default GNOME application"), + N_("Open %s with the default GNOME web browser"), + N_("Send an email to %s"), + N_("Change the view to %s"), + N_("Run %s"), + N_("Open %s with the default GNOME application"), + N_("Close %s"), + N_("Move %s to the left"), + N_("Move %s to the right"), + N_("Move %s into the previous row"), + N_("Move %s into the next row"), + N_("Configure %s"), + N_("Open %s with the default GNOME application") +}; + #define COMPOSER_IID "OAFIID:evolution-composer:evolution-mail:cd8618ea-53e1-4b9e-88cf-ec578bdb903b" +gboolean e_summary_url_mail_compose (ESummary *esummary, + const char *url); +gboolean e_summary_url_exec (const char *exec); + void e_summary_url_request (GtkHTML *html, const gchar *url, @@ -111,6 +138,98 @@ e_summary_url_request (GtkHTML *html, gnome_vfs_close (handle); } +static char * +parse_uri (const char *uri, + ESummaryProtocol protocol, + ESummary *esummary) +{ + ExecutiveSummaryComponentView *view; + char *parsed; + char *p; + int id; + + switch (protocol) { + + case PROTOCOL_HTTP: + /* "http://" == 7 */ + parsed = g_strdup (uri + 7); + break; + + case PROTOCOL_EXEC: + /* "exec://" == 7 */ + parsed = g_strdup (uri + 7); + break; + + case PROTOCOL_VIEW: + /* "view://" == 7 */ + parsed = g_strdup (uri + 7); + break; + + case PROTOCOL_MAILTO: + /* Fun. Mailto's might be "mailto:" or "mailto://" */ + if (strstr (uri, "mailto://") == NULL) { + parsed = (char *) (uri + 7); + } else { + parsed = (char *) (uri + 9); + } + + /* Now strip anything after a question mark, + as it is a parameter (that we ignore for the time being) */ + if ( (p = strchr (parsed, '?')) != NULL) { + parsed = g_strndup (parsed, p - parsed); + } else { + parsed = g_strdup (parsed); + } + + break; + + case PROTOCOL_CLOSE: + id = atoi (uri + 8); + view = e_summary_view_from_id (esummary, id); + parsed = g_strdup (executive_summary_component_view_get_title (view)); + break; + + case PROTOCOL_LEFT: + id = atoi (uri + 7); + view = e_summary_view_from_id (esummary, id); + parsed = g_strdup (executive_summary_component_view_get_title (view)); + break; + + case PROTOCOL_RIGHT: + id = atoi (uri + 8); + view = e_summary_view_from_id (esummary, id); + parsed = g_strdup (executive_summary_component_view_get_title (view)); + break; + + case PROTOCOL_UP: + id = atoi (uri + 5); + view = e_summary_view_from_id (esummary, id); + parsed = g_strdup (executive_summary_component_view_get_title (view)); + break; + + case PROTOCOL_DOWN: + id = atoi (uri + 7); + view = e_summary_view_from_id (esummary, id); + parsed = g_strdup (executive_summary_component_view_get_title (view)); + break; + + case PROTOCOL_CONFIGURE: + id = atoi (uri + 12); + view = e_summary_view_from_id (esummary, id); + parsed = g_strdup (executive_summary_component_view_get_title (view)); + break; + + case PROTOCOL_NONE: + case PROTOCOL_OTHER: + default: + /* Just return the uneditted uri. */ + parsed = g_strdup (uri); + break; + } + + return parsed; +} + static ESummaryProtocol get_protocol (const char *url) { @@ -134,29 +253,61 @@ get_protocol (const char *url) } switch (lowerurl[0]) { + case 'c': + switch (lowerurl[1]) { + case 'l': + if (strncmp (lowerurl + 2, "ose", 3) == 0) + protocol = PROTOCOL_CLOSE; + break; + case 'o': + if (strncmp (lowerurl + 2, "nfigure", 7) == 0) + protocol = PROTOCOL_CONFIGURE; + break; + } + + case 'd': + if (strncmp (lowerurl + 1, "own", 3) == 0) + protocol = PROTOCOL_DOWN; + break; + + case 'e': + if (strncmp (lowerurl + 1, "xec", 3) == 0) + protocol = PROTOCOL_EXEC; + break; + + case 'f': + if (strncmp (lowerurl + 1, "ile", 3) == 0) + protocol = PROTOCOL_FILE; + break; + case 'h': if (strncmp (lowerurl + 1, "ttp", 3) == 0) protocol = PROTOCOL_HTTP; break; + case 'l': + if (strncmp (lowerurl + 1, "eft", 3) == 0) + protocol = PROTOCOL_LEFT; + break; + case 'm': if (strncmp (lowerurl + 1, "ailto", 5) == 0) protocol = PROTOCOL_MAILTO; break; - case 'v': - if (strncmp (lowerurl + 1, "iew", 3) == 0) - protocol = PROTOCOL_VIEW; + case 'r': + if (strncmp (lowerurl + 1, "ight", 4) == 0) + protocol = PROTOCOL_RIGHT; break; - - case 'e': - if (strncmp (lowerurl + 1, "xec", 3) == 0) - protocol = PROTOCOL_EXEC; + + case 'u': + if (lowerurl[1] == 'p') + protocol = PROTOCOL_UP; break; - case 'f': - if (strncmp (lowerurl + 1, "ile", 3) == 0) - protocol = PROTOCOL_FILE; + case 'v': + if (strncmp (lowerurl + 1, "iew", 3) == 0) + protocol = PROTOCOL_VIEW; break; default: @@ -174,25 +325,104 @@ e_summary_url_click (GtkWidget *widget, ESummary *esummary) { ESummaryProtocol protocol; - g_print ("URL: %s\n", url); - + ExecutiveSummaryComponentView *view; + gpointer window; /* FIXME */ + char *parsed; + int id; + protocol = get_protocol (url); - + + parsed = parse_uri (url, protocol, esummary); + switch (protocol) { case PROTOCOL_MAILTO: /* Open a composer window */ - e_summary_url_mail_compose (esummary, url); + e_summary_url_mail_compose (esummary, parsed); break; case PROTOCOL_VIEW: /* Change the EShellView's current uri */ + e_summary_change_current_view (esummary, parsed); break; case PROTOCOL_EXEC: /* Execute the rest of the url */ - e_summary_url_exec (url + 7); + e_summary_url_exec (parsed); break; - + + case PROTOCOL_CLOSE: + /* Close the window. */ + id = atoi (url + 8); + view = e_summary_view_from_id (esummary, id); + if (view == NULL) + return; + + window = e_summary_window_from_view (esummary, view); + e_summary_window_remove_from_ht (window, esummary); + e_summary_window_free (window, esummary); + e_summary_rebuild_page (esummary); + break; + + case PROTOCOL_CONFIGURE: + /* Configure the window. . . */ + id = atoi (url + 12); + view = e_summary_view_from_id (esummary, id); + if (view == NULL) + return; + + /* Issue the configure command some how :) */ + break; + + case PROTOCOL_LEFT: + /* Window left */ + id = atoi (url + 7); + view = e_summary_view_from_id (esummary, id); + + if (view == NULL) + return; + + window = e_summary_window_from_view (esummary, view); + + e_summary_window_move_left (esummary, window); + e_summary_rebuild_page (esummary); + break; + + case PROTOCOL_RIGHT: + id = atoi (url + 8); + view = e_summary_view_from_id (esummary, id); + if (view == NULL) + return; + + window = e_summary_window_from_view (esummary, view); + + e_summary_window_move_right (esummary, window); + e_summary_rebuild_page (esummary); + break; + + case PROTOCOL_UP: + id = atoi (url + 5); + view = e_summary_view_from_id (esummary, id); + if (view == NULL) + return; + + window = e_summary_window_from_view (esummary, view); + + e_summary_window_move_up (esummary, window); + e_summary_rebuild_page (esummary); + break; + + case PROTOCOL_DOWN: + id = atoi (url + 7); + view = e_summary_view_from_id (esummary, id); + if (view == NULL) + return; + + window = e_summary_window_from_view (esummary, view); + + e_summary_window_move_down (esummary, window); + e_summary_rebuild_page (esummary); + break; + case PROTOCOL_NONE: case PROTOCOL_OTHER: case PROTOCOL_HTTP: @@ -203,6 +433,8 @@ e_summary_url_click (GtkWidget *widget, break; } + + g_free (parsed); } gboolean @@ -225,13 +457,16 @@ e_summary_url_mail_compose (ESummary *esummary, g_warning ("Unable to start composer component!"); return FALSE; } - + if ( (proto = strstr (url, "://")) != NULL){ address = proto + 3; } else { - address = url + 7; + if (strncmp (url, "mailto:", 7) == 0) + address = (char *) (url + 7); + else + address = (char *) url; } - + to = Evolution_Composer_RecipientList__alloc (); to->_length = 1; to->_maximum = 1; @@ -296,4 +531,37 @@ e_summary_url_exec (const char *exec) gnome_execute_async (NULL, argc, exec_array); g_strfreev (exec_array); + return TRUE; +} + +static char * +e_summary_url_describe (const char *uri, + ESummary *esummary) +{ + ESummaryProtocol protocol; + char *contents, *description; + + protocol = get_protocol (uri); + contents = parse_uri (uri, protocol, esummary); + + description = g_strdup_printf (_(descriptions[protocol]), contents); + g_free (contents); + + return description; +} + +void +e_summary_url_over (GtkHTML *html, + const char *uri, + ESummary *esummary) +{ + char *description; + + if (uri != NULL) { + description = e_summary_url_describe (uri, esummary); + e_summary_set_message (esummary, description, FALSE); + g_free (description); + } else { + e_summary_unset_message (esummary); + } } diff --git a/executive-summary/component/e-summary-url.h b/executive-summary/component/e-summary-url.h index de45caf7c7..9844d384e0 100644 --- a/executive-summary/component/e-summary-url.h +++ b/executive-summary/component/e-summary-url.h @@ -30,5 +30,8 @@ void e_summary_url_request (GtkHTML *html, void e_summary_url_click (GtkWidget *widget, const char *url, ESummary *esummary); +void e_summary_url_over (GtkHTML *html, + const char *uri, + ESummary *esummary); #endif 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); +} diff --git a/executive-summary/component/e-summary.h b/executive-summary/component/e-summary.h index 569cae3331..f68575d76c 100644 --- a/executive-summary/component/e-summary.h +++ b/executive-summary/component/e-summary.h @@ -29,8 +29,9 @@ #include <gtk/gtkvbox.h> #include <evolution-services/executive-summary.h> #include <evolution-services/executive-summary-component-client.h> +#include <evolution-services/executive-summary-component-view.h> -#include "shell/Evolution.h" +#include <Evolution.h> #define E_SUMMARY_TYPE (e_summary_get_type ()) #define E_SUMMARY(obj) (GTK_CHECK_CAST ((obj), E_SUMMARY_TYPE, ESummary)) @@ -41,6 +42,13 @@ typedef struct _ESummaryPrivate ESummaryPrivate; typedef struct _ESummary ESummary; typedef struct _ESummaryClass ESummaryClass; +typedef struct _ESummaryWindow ESummaryWindow; + +struct _ESummaryWindow { + ExecutiveSummary *summary; + ExecutiveSummaryComponentView *view; + char *iid; +}; struct _ESummary { GtkVBox parent; @@ -70,5 +78,35 @@ void e_summary_add_bonobo_service (ESummary *esummary, void e_summary_update_window (ESummary *esummary, ExecutiveSummary *summary, const char *html); +void e_summary_window_free (ESummaryWindow *window, + ESummary *esummary); +void e_summary_window_remove_from_ht (ESummaryWindow *window, + ESummary *esummary); +void e_summary_add_service (ESummary *esummary, + ExecutiveSummary *summary, + ExecutiveSummaryComponentView *view, + const char *iid); +ExecutiveSummaryComponentView * e_summary_view_from_id (ESummary *esummary, + int id); +void e_summary_set_shell_view_interface (ESummary *summary, + Evolution_ShellView svi); +void e_summary_set_message (ESummary *esummary, + const char *message, + gboolean busy); +void e_summary_unset_message (ESummary *esummary); +void e_summary_change_current_view (ESummary *esummary, + const char *uri); +void e_summary_set_title (ESummary *esummary, + const char *title); +ESummaryWindow *e_summary_window_from_view (ESummary *esummary, + ExecutiveSummaryComponentView *view); +void e_summary_window_move_left (ESummary *esummary, + ESummaryWindow *window); +void e_summary_window_move_right (ESummary *esummary, + ESummaryWindow *window); +void e_summary_window_move_up (ESummary *esummary, + ESummaryWindow *window); +void e_summary_window_move_down (ESummary *esummary, + ESummaryWindow *window); #endif diff --git a/executive-summary/evolution-services/executive-summary-component-client.c b/executive-summary/evolution-services/executive-summary-component-client.c index 7c0477af41..ecd806af52 100644 --- a/executive-summary/evolution-services/executive-summary-component-client.c +++ b/executive-summary/evolution-services/executive-summary-component-client.c @@ -201,26 +201,30 @@ executive_summary_component_client_supports (ExecutiveSummaryComponentClient *cl #endif ExecutiveSummaryComponentView * -executive_summary_component_client_create_view (ExecutiveSummaryComponentClient *client) +executive_summary_component_client_create_view (ExecutiveSummaryComponentClient *client, + int id) { ExecutiveSummaryComponentView *view; Evolution_SummaryComponent component; char *html, *title, *icon; Bonobo_Control control; BonoboControl *bc; - int id; + int ret_id; CORBA_Environment ev; - + g_return_val_if_fail (client != NULL, NULL); g_return_val_if_fail (IS_EXECUTIVE_SUMMARY_COMPONENT_CLIENT (client), NULL); CORBA_exception_init (&ev); - component = bonobo_object_corba_objref (BONOBO_OBJECT (client)); + if (client) + component = bonobo_object_corba_objref (BONOBO_OBJECT (client)); /* Get all the details about the view */ - id = Evolution_SummaryComponent_create_view (component, &control, - &html, &title, &icon, &ev); + g_print ("In %s\n", __FUNCTION__); + ret_id = Evolution_SummaryComponent_create_view (component, id, &control, + &html, &title, &icon, &ev); + g_print ("Out %s\n", __FUNCTION__); if (ev._major != CORBA_NO_EXCEPTION) { g_warning ("Error creating view"); CORBA_exception_free (&ev); @@ -238,7 +242,7 @@ executive_summary_component_client_create_view (ExecutiveSummaryComponentClient view = executive_summary_component_view_new (NULL, bc, html, title, icon); - executive_summary_component_view_set_id (view, id); + executive_summary_component_view_set_id (view, ret_id); return view; } @@ -301,7 +305,8 @@ executive_summary_component_client_configure (ExecutiveSummaryComponentClient *c void executive_summary_component_client_destroy_view (ExecutiveSummaryComponentClient *client, - ExecutiveSummaryComponentView *view) { + ExecutiveSummaryComponentView *view) +{ int id; Evolution_SummaryComponent component; CORBA_Environment ev; diff --git a/executive-summary/evolution-services/executive-summary-component-client.h b/executive-summary/evolution-services/executive-summary-component-client.h index 849bec6c99..3a9edd7a1c 100644 --- a/executive-summary/evolution-services/executive-summary-component-client.h +++ b/executive-summary/evolution-services/executive-summary-component-client.h @@ -26,6 +26,7 @@ #include <bonobo.h> #include <evolution-services/executive-summary.h> +#include <evolution-services/executive-summary-component-view.h> #define EXECUTIVE_SUMMARY_COMPONENT_CLIENT_TYPE (executive_summary_component_client_get_type ()) #define EXECUTIVE_SUMMARY_COMPONENT_CLIENT(obj) (GTK_CHECK_CAST ((obj), EXECUTIVE_SUMMARY_COMPONENT_CLIENT_TYPE, ExecutiveSummaryComponentClient)) @@ -57,14 +58,10 @@ void executive_summary_component_client_unset_owner (ExecutiveSummaryComponentCl void executive_summary_component_client_supports (ExecutiveSummaryComponentClient *client, gboolean *bonobo, gboolean *html); -Bonobo_Control executive_summary_component_client_create_bonobo_view (ExecutiveSummaryComponentClient *client, - char **title, - char **icon); - -char *executive_summary_component_client_create_html_view (ExecutiveSummaryComponentClient *client, - char **title, - char **icon); void executive_summary_component_client_configure (ExecutiveSummaryComponentClient *client); +void executive_summary_component_client_destroy_view (ExecutiveSummaryComponentClient *client, + ExecutiveSummaryComponentView *view); #endif + diff --git a/executive-summary/evolution-services/executive-summary-component-view.c b/executive-summary/evolution-services/executive-summary-component-view.c index b61b69a7fa..ebcbeb9e09 100644 --- a/executive-summary/evolution-services/executive-summary-component-view.c +++ b/executive-summary/evolution-services/executive-summary-component-view.c @@ -314,7 +314,7 @@ executive_summary_component_view_get_control (ExecutiveSummaryComponentView *vie priv = view->private; - return BONOBO_OBJECT (priv->control); + return priv->control; } void diff --git a/executive-summary/evolution-services/executive-summary-component.c b/executive-summary/evolution-services/executive-summary-component.c index 116736f051..c07afc498a 100644 --- a/executive-summary/evolution-services/executive-summary-component.c +++ b/executive-summary/evolution-services/executive-summary-component.c @@ -145,6 +145,7 @@ impl_Evolution_SummaryComponent_unset_owner (PortableServer_Servant servant, static CORBA_long impl_Evolution_SummaryComponent_create_view (PortableServer_Servant servant, + CORBA_long id, Bonobo_Control *control, CORBA_char **html, CORBA_char **title, @@ -157,14 +158,12 @@ impl_Evolution_SummaryComponent_create_view (PortableServer_Servant servant, ExecutiveSummaryComponentPrivate *priv; BonoboObject *initial_control; const char *initial_title, *initial_icon, *initial_html; - int id; bonobo_object = bonobo_object_from_servant (servant); component = EXECUTIVE_SUMMARY_COMPONENT (bonobo_object); priv = component->private; view = gtk_type_new (executive_summary_component_view_get_type ()); - id = executive_summary_component_create_unique_id (); executive_summary_component_view_set_id (view, id); (* priv->create_view) (component, view, priv->closure); @@ -182,7 +181,7 @@ impl_Evolution_SummaryComponent_create_view (PortableServer_Servant servant, if (initial_control != NULL) { *control = bonobo_object_corba_objref (BONOBO_OBJECT (initial_control)); } else { - *control = NULL; + *control = CORBA_OBJECT_NIL; } *html = CORBA_string_dup (initial_html ? initial_html:""); @@ -498,5 +497,6 @@ executive_summary_component_create_unique_id (void) static int id = 0; id++; + g_print ("%s -- %d\n", __FUNCTION__, id); return id; } diff --git a/executive-summary/idl/SummaryComponent.idl b/executive-summary/idl/SummaryComponent.idl index 6cf04b3a01..1c60314fb2 100644 --- a/executive-summary/idl/SummaryComponent.idl +++ b/executive-summary/idl/SummaryComponent.idl @@ -42,7 +42,8 @@ module Evolution { * Creates a summary of the data that the component has. * Returns: The ID of the view. */ - long create_view (out Bonobo::Control control, + long create_view (in long id, + out Bonobo::Control control, out string html, out string title, out string icon); diff --git a/executive-summary/test-service/main.c b/executive-summary/test-service/main.c index 8612c2d394..75bbc3199b 100644 --- a/executive-summary/test-service/main.c +++ b/executive-summary/test-service/main.c @@ -107,6 +107,7 @@ create_view (ExecutiveSummaryComponent *component, char *html = "Since you started this service<br><center>0</center><br>seconds have passed."; struct userdata *ud; + g_print ("In: %s\n", __FUNCTION__); /* Create the userdata structure */ ud = g_new (struct userdata, 1); @@ -114,6 +115,7 @@ create_view (ExecutiveSummaryComponent *component, executive_summary_component_view_construct (view, component, NULL, html, "The Magic Counter", "gnome-clock.png"); + g_print ("Out: %s\n", __FUNCTION__); /* Set the user data on the object */ gtk_object_set_data (GTK_OBJECT (view), "timer-data", ud); |