aboutsummaryrefslogtreecommitdiffstats
path: root/executive-summary/component/e-summary-url.c
diff options
context:
space:
mode:
Diffstat (limited to 'executive-summary/component/e-summary-url.c')
-rw-r--r--executive-summary/component/e-summary-url.c306
1 files changed, 287 insertions, 19 deletions
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);
+ }
}