Bug 771404 - Use OpenStreetMap or Google Maps to open maps
This commit is contained in:
@ -115,5 +115,10 @@
|
||||
<summary>Show Certificates tab</summary>
|
||||
<_description>Whether to show Certificates tab in the editor</_description>
|
||||
</key>
|
||||
<key type="s" name="open-map-target">
|
||||
<default>'openstreetmap'</default>
|
||||
<_summary>Where to open contact locations</_summary>
|
||||
<_description>Currently supported values are “openstreetmap” and “google”; if unknown set, uses “openstreetmap”</_description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
|
||||
@ -41,6 +41,9 @@
|
||||
#define TEXT_IS_RIGHT_TO_LEFT \
|
||||
(gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
|
||||
|
||||
#define GOOGLE_MAP_PREFIX "https://maps.google.com?q="
|
||||
#define OPENSTREETMAP_PREFIX "https://www.openstreetmap.org/search?query="
|
||||
|
||||
struct _EABContactDisplayPrivate {
|
||||
EContact *contact;
|
||||
|
||||
@ -79,6 +82,39 @@ G_DEFINE_TYPE (
|
||||
eab_contact_display,
|
||||
E_TYPE_WEB_VIEW)
|
||||
|
||||
static void
|
||||
contact_display_open_map (EABContactDisplay *display,
|
||||
const gchar *query)
|
||||
{
|
||||
GSettings *settings;
|
||||
gchar *open_map_target;
|
||||
gpointer parent;
|
||||
gchar *uri;
|
||||
const gchar *prefix;
|
||||
|
||||
g_return_if_fail (EAB_IS_CONTACT_DISPLAY (display));
|
||||
g_return_if_fail (query != NULL);
|
||||
|
||||
parent = gtk_widget_get_toplevel (GTK_WIDGET (display));
|
||||
parent = gtk_widget_is_toplevel (parent) ? parent : NULL;
|
||||
|
||||
settings = e_util_ref_settings ("org.gnome.evolution.addressbook");
|
||||
open_map_target = g_settings_get_string (settings, "open-map-target");
|
||||
g_object_unref (settings);
|
||||
|
||||
if (open_map_target && g_ascii_strcasecmp (open_map_target, "google") == 0) {
|
||||
prefix = GOOGLE_MAP_PREFIX;
|
||||
} else {
|
||||
prefix = OPENSTREETMAP_PREFIX;
|
||||
}
|
||||
|
||||
g_free (open_map_target);
|
||||
|
||||
uri = g_strconcat (prefix, query, NULL);
|
||||
e_show_uri (parent, uri);
|
||||
g_free (uri);
|
||||
}
|
||||
|
||||
static void
|
||||
contact_display_emit_send_message (EABContactDisplay *display,
|
||||
gint email_num)
|
||||
@ -267,36 +303,50 @@ contact_display_hovering_over_link (EWebView *web_view,
|
||||
const gchar *title,
|
||||
const gchar *uri)
|
||||
{
|
||||
EWebViewClass *web_view_class;
|
||||
EABContactDisplay *display;
|
||||
EContact *contact;
|
||||
const gchar *name;
|
||||
gchar *message;
|
||||
gboolean handled = FALSE;
|
||||
|
||||
if (uri == NULL || *uri == '\0')
|
||||
goto chainup;
|
||||
if (uri && g_str_has_prefix (uri, "internal-mailto:")) {
|
||||
display = EAB_CONTACT_DISPLAY (web_view);
|
||||
contact = eab_contact_display_get_contact (display);
|
||||
|
||||
if (!g_str_has_prefix (uri, "internal-mailto:"))
|
||||
goto chainup;
|
||||
name = e_contact_get_const (contact, E_CONTACT_FILE_AS);
|
||||
if (name == NULL)
|
||||
e_contact_get_const (contact, E_CONTACT_FULL_NAME);
|
||||
g_return_if_fail (name != NULL);
|
||||
|
||||
display = EAB_CONTACT_DISPLAY (web_view);
|
||||
contact = eab_contact_display_get_contact (display);
|
||||
message = g_strdup_printf (_("Click to mail %s"), name);
|
||||
e_web_view_status_message (web_view, message);
|
||||
g_free (message);
|
||||
|
||||
name = e_contact_get_const (contact, E_CONTACT_FILE_AS);
|
||||
if (name == NULL)
|
||||
e_contact_get_const (contact, E_CONTACT_FULL_NAME);
|
||||
g_return_if_fail (name != NULL);
|
||||
handled = TRUE;
|
||||
} else if (uri && g_str_has_prefix (uri, "open-map:")) {
|
||||
SoupURI *suri;
|
||||
|
||||
message = g_strdup_printf (_("Click to mail %s"), name);
|
||||
e_web_view_status_message (web_view, message);
|
||||
g_free (message);
|
||||
suri = soup_uri_new (uri);
|
||||
if (suri) {
|
||||
gchar *decoded;
|
||||
|
||||
return;
|
||||
decoded = soup_uri_decode (soup_uri_get_path (suri));
|
||||
|
||||
chainup:
|
||||
/* Chain up to parent's hovering_over_link() method. */
|
||||
web_view_class = E_WEB_VIEW_CLASS (eab_contact_display_parent_class);
|
||||
web_view_class->hovering_over_link (web_view, title, uri);
|
||||
message = g_strdup_printf (_("Click to open map for %s"), decoded);
|
||||
e_web_view_status_message (web_view, message);
|
||||
g_free (message);
|
||||
|
||||
handled = TRUE;
|
||||
|
||||
soup_uri_free (suri);
|
||||
g_free (decoded);
|
||||
}
|
||||
}
|
||||
|
||||
if (!handled) {
|
||||
/* Chain up to parent's method. */
|
||||
E_WEB_VIEW_CLASS (eab_contact_display_parent_class)->hovering_over_link (web_view, title, uri);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -317,9 +367,21 @@ contact_display_link_clicked (EWebView *web_view,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Chain up to parent's link_clicked() method. */
|
||||
E_WEB_VIEW_CLASS (eab_contact_display_parent_class)->
|
||||
link_clicked (web_view, uri);
|
||||
length = strlen ("open-map:");
|
||||
if (g_str_has_prefix (uri, "open-map:")) {
|
||||
SoupURI *suri;
|
||||
|
||||
suri = soup_uri_new (uri);
|
||||
if (suri) {
|
||||
contact_display_open_map (display, soup_uri_get_path (suri));
|
||||
soup_uri_free (suri);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Chain up to parent's method. */
|
||||
E_WEB_VIEW_CLASS (eab_contact_display_parent_class)->link_clicked (web_view, uri);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@ -138,7 +138,7 @@ render_address_link (GString *buffer,
|
||||
g_string_assign (link, escaped);
|
||||
g_free (escaped);
|
||||
|
||||
g_string_prepend (link, "<a href=\"http://maps.google.com?q=");
|
||||
g_string_prepend (link, "<a href=\"open-map:");
|
||||
g_string_append_printf (link, "\">%s</a>", _("Open map"));
|
||||
}
|
||||
|
||||
|
||||
@ -95,6 +95,7 @@ get_general_page (EConfig *config,
|
||||
ESourceRegistry *registry;
|
||||
GtkWidget *container;
|
||||
GtkWidget *itembox;
|
||||
GtkWidget *label;
|
||||
GtkWidget *widget;
|
||||
GtkWidget *vbox;
|
||||
EShell *shell;
|
||||
@ -123,7 +124,7 @@ get_general_page (EConfig *config,
|
||||
DTFormatKindDateTime, _("_Table column:"));
|
||||
gtk_widget_show (widget);
|
||||
|
||||
itembox = add_section (vbox, _("Address formatting"), FALSE);
|
||||
itembox = add_section (vbox, _("Miscellaneous"), FALSE);
|
||||
|
||||
widget = gtk_check_button_new_with_mnemonic (
|
||||
_("_Format address according to standard of its destination country"));
|
||||
@ -134,6 +135,37 @@ get_general_page (EConfig *config,
|
||||
gtk_box_pack_start (GTK_BOX (itembox), widget, FALSE, FALSE, 0);
|
||||
gtk_widget_show (widget);
|
||||
|
||||
container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
|
||||
gtk_box_pack_start (GTK_BOX (itembox), container, FALSE, FALSE, 0);
|
||||
gtk_widget_show (container);
|
||||
|
||||
/* Translators: This is part of a sentence "Open maps with OpenStreetMap" and "Open maps with Google" */
|
||||
label = gtk_label_new_with_mnemonic (C_("OpenMap", "Open _maps with"));
|
||||
gtk_box_pack_start (GTK_BOX (container), label, FALSE, FALSE, 0);
|
||||
gtk_widget_show (label);
|
||||
|
||||
widget = gtk_combo_box_text_new ();
|
||||
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "openstreetmap",
|
||||
/* Translators: This is part of "Open maps with OpenStreetMap" */
|
||||
C_("OpenMap", "OpenStreetMap"));
|
||||
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "google",
|
||||
/* Translators: This is part of "Open maps with Google" */
|
||||
C_("OpenMap", "Google"));
|
||||
|
||||
gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
|
||||
gtk_widget_show (widget);
|
||||
|
||||
g_settings_bind (
|
||||
settings, "open-map-target",
|
||||
widget, "active-id",
|
||||
G_SETTINGS_BIND_DEFAULT);
|
||||
|
||||
/* In case user has some garbage/unknown value set there */
|
||||
if (!gtk_combo_box_get_active_id (GTK_COMBO_BOX (widget)))
|
||||
gtk_combo_box_set_active_id (GTK_COMBO_BOX (widget), "openstreetmap");
|
||||
|
||||
itembox = add_section (vbox, _("Autocompletion"), TRUE);
|
||||
|
||||
widget = gtk_check_button_new_with_mnemonic (
|
||||
|
||||
Reference in New Issue
Block a user