aboutsummaryrefslogtreecommitdiffstats
path: root/src/ephy-location-action.c
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-01-19 03:08:09 +0800
committerCosimo Cecchi <cosimoc@gnome.org>2012-01-20 02:07:23 +0800
commite62275191c520024b3b48dd2bdecbfb407e105e1 (patch)
tree4d2edd491ef3c4290802e5e60b4f0a633616f0bd /src/ephy-location-action.c
parent2082e3a96b3aed97adc615e7739cec6afea5d76e (diff)
downloadgsoc2013-epiphany-e62275191c520024b3b48dd2bdecbfb407e105e1.tar
gsoc2013-epiphany-e62275191c520024b3b48dd2bdecbfb407e105e1.tar.gz
gsoc2013-epiphany-e62275191c520024b3b48dd2bdecbfb407e105e1.tar.bz2
gsoc2013-epiphany-e62275191c520024b3b48dd2bdecbfb407e105e1.tar.lz
gsoc2013-epiphany-e62275191c520024b3b48dd2bdecbfb407e105e1.tar.xz
gsoc2013-epiphany-e62275191c520024b3b48dd2bdecbfb407e105e1.tar.zst
gsoc2013-epiphany-e62275191c520024b3b48dd2bdecbfb407e105e1.zip
Rename EphyLocationAction -> EphyLocationController
Since it's not a GtkAction anymore. https://bugzilla.gnome.org/show_bug.cgi?id=668206
Diffstat (limited to 'src/ephy-location-action.c')
-rw-r--r--src/ephy-location-action.c914
1 files changed, 0 insertions, 914 deletions
diff --git a/src/ephy-location-action.c b/src/ephy-location-action.c
deleted file mode 100644
index 7c319c335..000000000
--- a/src/ephy-location-action.c
+++ /dev/null
@@ -1,914 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright © 2003, 2004 Marco Pesenti Gritti
- * Copyright © 2003, 2004 Christian Persch
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "config.h"
-#include "ephy-location-action.h"
-
-#include "ephy-completion-model.h"
-#include "ephy-debug.h"
-#include "ephy-embed-container.h"
-#include "ephy-embed-utils.h"
-#include "ephy-link.h"
-#include "ephy-location-entry.h"
-#include "ephy-shell.h"
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include <string.h>
-
-/**
- * SECTION:ephy-location-action
- * @short_description: An #EphyLinkAction implementation
- *
- * #EphyLocationAction handles navigation together with #EphyLocationEntry
- */
-
-#define EPHY_LOCATION_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_LOCATION_ACTION, EphyLocationActionPrivate))
-
-struct _EphyLocationActionPrivate
-{
- EphyWindow *window;
- EphyLocationEntry *location_entry;
- GtkWidget *proxy;
- GList *actions;
- char *address;
- EphyNode *smart_bmks;
- EphyBookmarks *bookmarks;
- GdkPixbuf *icon;
- char *lock_stock_id;
- char *lock_tooltip;
- guint editable : 1;
- guint show_lock : 1;
- gboolean sync_address_is_blocked;
-};
-
-static void ephy_location_action_init (EphyLocationAction *action);
-static void ephy_location_action_class_init (EphyLocationActionClass *class);
-static void ephy_location_action_finalize (GObject *object);
-static void user_changed_cb (GtkWidget *proxy,
- EphyLocationAction *action);
-static void sync_address (EphyLocationAction *action,
- GParamSpec *pspec,
- GtkWidget *proxy);
-
-enum
-{
- PROP_0,
- PROP_ADDRESS,
- PROP_EDITABLE,
- PROP_ICON,
- PROP_LOCK_STOCK,
- PROP_LOCK_TOOLTIP,
- PROP_SHOW_LOCK,
- PROP_WINDOW,
- PROP_LOCATION_ENTRY
-};
-
-enum
-{
- LOCK_CLICKED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL];
-
-G_DEFINE_TYPE_WITH_CODE (EphyLocationAction, ephy_location_action, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (EPHY_TYPE_LINK,
- NULL))
-
-static gboolean
-match_func (GtkEntryCompletion *completion,
- const char *key,
- GtkTreeIter *iter,
- gpointer data)
-{
- char *item = NULL;
- char *url = NULL;
- char *keywords = NULL;
-
- gboolean ret = FALSE;
- GtkTreeModel *model;
- GSList *search_terms;
-
- model = gtk_entry_completion_get_model (completion);
-
- gtk_tree_model_get (model, iter,
- EPHY_COMPLETION_TEXT_COL, &item,
- EPHY_COMPLETION_URL_COL, &url,
- EPHY_COMPLETION_KEYWORDS_COL, &keywords,
- -1);
-
- if (!key)
- return FALSE;
-
- search_terms = ephy_location_entry_get_search_terms (data);
-
- if (search_terms)
- {
- GSList *iter;
- GRegex *current = NULL;
-
- ret = TRUE;
- for (iter = search_terms; iter != NULL; iter = iter->next)
- {
- current = (GRegex*) iter->data;
- if ((!g_regex_match (current, item, G_REGEX_MATCH_NOTEMPTY, NULL)) &&
- (!g_regex_match (current, url, G_REGEX_MATCH_NOTEMPTY, NULL)) &&
- (!g_regex_match (current, keywords, G_REGEX_MATCH_NOTEMPTY, NULL)))
- {
- ret = FALSE;
- break;
- }
- }
- }
-
- g_free (item);
- g_free (url);
- g_free (keywords);
-
- return ret;
-}
-
-static void
-action_activated_cb (GtkEntryCompletion *completion,
- gint index,
- EphyLocationAction *action)
-{
- GtkWidget *entry;
- char *content;
-
- entry = gtk_entry_completion_get_entry (completion);
- content = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
- if (content)
- {
- EphyNode *node;
- const char *smart_url;
- char *url;
-
- node = (EphyNode *)g_list_nth_data (action->priv->actions, index);
- smart_url = ephy_node_get_property_string
- (node, EPHY_NODE_BMK_PROP_LOCATION);
- g_return_if_fail (smart_url != NULL);
-
- url = ephy_bookmarks_resolve_address
- (action->priv->bookmarks, smart_url, content);
- g_free (content);
- if (url == NULL) return;
-
- ephy_link_open (EPHY_LINK (action), url, NULL,
- ephy_link_flags_from_current_event ());
-
- g_free (url);
- }
-}
-
-static void
-entry_activate_cb (GtkEntry *entry,
- EphyLocationAction *action)
-{
- EphyBookmarks *bookmarks;
- const char *content;
- char *address;
- EphyLocationActionPrivate *priv;
-
- priv = action->priv;
-
- if (priv->sync_address_is_blocked)
- {
- priv->sync_address_is_blocked = FALSE;
- g_signal_handlers_unblock_by_func (action, G_CALLBACK (sync_address), entry);
- }
-
- content = gtk_entry_get_text (entry);
- if (content == NULL || content[0] == '\0') return;
-
- bookmarks = ephy_shell_get_bookmarks (ephy_shell_get_default ());
-
- address = ephy_bookmarks_resolve_address (bookmarks, content, NULL);
- g_return_if_fail (address != NULL);
-
- ephy_link_open (EPHY_LINK (action), g_strstrip (address), NULL,
- ephy_link_flags_from_current_event ());
-
- g_free (address);
-}
-
-static void
-user_changed_cb (GtkWidget *proxy, EphyLocationAction *action)
-{
- const char *address;
-
- address = ephy_location_entry_get_location (EPHY_LOCATION_ENTRY (proxy));
-
- LOG ("user_changed_cb, new address %s", address);
-
- g_signal_handlers_block_by_func (action, G_CALLBACK (sync_address), proxy);
- ephy_location_action_set_address (action, address);
- g_signal_handlers_unblock_by_func (action, G_CALLBACK (sync_address), proxy);
-}
-
-static void
-lock_clicked_cb (GtkWidget *proxy,
- EphyLocationAction *action)
-{
- g_signal_emit (action, signals[LOCK_CLICKED], 0);
-}
-
-static void
-sync_address (EphyLocationAction *action,
- GParamSpec *pspec,
- GtkWidget *widget)
-{
- EphyLocationActionPrivate *priv = action->priv;
- EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (widget);
-
- LOG ("sync_address %s", action->priv->address);
-
- g_signal_handlers_block_by_func (widget, G_CALLBACK (user_changed_cb), action);
- ephy_location_entry_set_location (lentry, priv->address);
- g_signal_handlers_unblock_by_func (widget, G_CALLBACK (user_changed_cb), action);
-}
-
-static void
-sync_editable (EphyLocationAction *action,
- GParamSpec *pspec,
- GtkWidget *widget)
-{
- EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (widget);
-
- gtk_editable_set_editable (GTK_EDITABLE (lentry), action->priv->editable);
-}
-
-static void
-sync_icon (EphyLocationAction *action,
- GParamSpec *pspec,
- GtkWidget *widget)
-{
- EphyLocationActionPrivate *priv = action->priv;
- EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-
- ephy_location_entry_set_favicon (entry, priv->icon);
-}
-
-static void
-sync_lock_stock_id (EphyLocationAction *action,
- GParamSpec *pspec,
- GtkWidget *widget)
-{
- EphyLocationActionPrivate *priv = action->priv;
- EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-
- ephy_location_entry_set_lock_stock (entry, priv->lock_stock_id);
-}
-
-static void
-sync_lock_tooltip (EphyLocationAction *action,
- GParamSpec *pspec,
- GtkWidget *widget)
-{
- EphyLocationActionPrivate *priv = action->priv;
- EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-
- ephy_location_entry_set_lock_tooltip (entry, priv->lock_tooltip);
-}
-
-static void
-sync_show_lock (EphyLocationAction *action,
- GParamSpec *pspec,
- GtkWidget *widget)
-{
- EphyLocationActionPrivate *priv = action->priv;
- EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-
- ephy_location_entry_set_show_lock (entry, priv->show_lock);
-}
-
-static char *
-get_location_cb (EphyLocationEntry *entry,
- EphyLocationAction *action)
-{
- EphyLocationActionPrivate *priv = action->priv;
- EphyEmbed *embed;
-
- embed = ephy_embed_container_get_active_child
- (EPHY_EMBED_CONTAINER (priv->window));
-
- return g_strdup (ephy_web_view_get_address (ephy_embed_get_web_view (embed)));
-}
-
-static char *
-get_title_cb (EphyLocationEntry *entry,
- EphyLocationAction *action)
-{
- EphyEmbed *embed;
-
- embed = ephy_embed_container_get_active_child
- (EPHY_EMBED_CONTAINER (action->priv->window));
-
- return g_strdup (ephy_web_view_get_title (ephy_embed_get_web_view (embed)));
-}
-
-static void
-remove_completion_actions (EphyLocationAction *action,
- EphyLocationEntry *lentry)
-{
- GtkEntryCompletion *completion;
- GList *l;
-
- completion = gtk_entry_get_completion (GTK_ENTRY (lentry));
-
- for (l = action->priv->actions; l != NULL; l = l->next)
- {
- gtk_entry_completion_delete_action (completion, 0);
- }
-
- g_signal_handlers_disconnect_by_func
- (completion, G_CALLBACK (action_activated_cb), action);
-}
-
-static void
-add_completion_actions (EphyLocationAction *action,
- EphyLocationEntry *lentry)
-{
- GtkEntryCompletion *completion;
- GList *l;
-
- completion = gtk_entry_get_completion (GTK_ENTRY (lentry));
-
- for (l = action->priv->actions; l != NULL; l = l->next)
- {
- EphyNode *bmk = l->data;
- const char *title;
- int index;
-
- index = g_list_position (action->priv->actions, l);
- title = ephy_node_get_property_string
- (bmk, EPHY_NODE_BMK_PROP_TITLE);
- gtk_entry_completion_insert_action_text (completion, index, (char*)title);
- }
-
- g_signal_connect (completion, "action_activated",
- G_CALLBACK (action_activated_cb), action);
-}
-
-static gboolean
-focus_in_event_cb (GtkWidget *entry,
- GdkEventFocus *event,
- EphyLocationAction *action)
-{
- EphyLocationActionPrivate *priv = action->priv;
-
- if (!priv->sync_address_is_blocked)
- {
- priv->sync_address_is_blocked = TRUE;
- g_signal_handlers_block_by_func (action, G_CALLBACK (sync_address), entry);
- }
-
- return FALSE;
-}
-
-static gboolean
-focus_out_event_cb (GtkWidget *entry,
- GdkEventFocus *event,
- EphyLocationAction *action)
-{
- EphyLocationActionPrivate *priv = action->priv;
-
- if (priv->sync_address_is_blocked)
- {
- priv->sync_address_is_blocked = FALSE;
- g_signal_handlers_unblock_by_func (action, G_CALLBACK (sync_address), entry);
- }
-
- return FALSE;
-}
-
-static void
-switch_page_cb (GtkNotebook *notebook,
- GtkWidget *page,
- guint page_num,
- EphyLocationAction *action)
-{
- EphyLocationActionPrivate *priv = action->priv;
-
- if (priv->sync_address_is_blocked == TRUE)
- {
- priv->sync_address_is_blocked = FALSE;
- g_signal_handlers_unblock_by_func (action, G_CALLBACK (sync_address), priv->proxy);
- }
-}
-
-static void
-ephy_location_action_constructed (GObject *object)
-{
- EphyLocationAction *action = EPHY_LOCATION_ACTION (object);
- EphyLocationActionPrivate *priv = action->priv;
- EphyCompletionModel *model;
- GtkWidget *notebook, *widget;
-
- G_OBJECT_CLASS (ephy_location_action_parent_class)->constructed (object);
-
- notebook = ephy_window_get_notebook (priv->window);
- widget = GTK_WIDGET (priv->location_entry);
-
- g_signal_connect (notebook, "switch-page",
- G_CALLBACK (switch_page_cb), action);
-
- model = ephy_completion_model_new ();
- ephy_location_entry_set_completion (priv->location_entry,
- GTK_TREE_MODEL (model),
- EPHY_COMPLETION_TEXT_COL,
- EPHY_COMPLETION_ACTION_COL,
- EPHY_COMPLETION_KEYWORDS_COL,
- EPHY_COMPLETION_RELEVANCE_COL,
- EPHY_COMPLETION_URL_COL,
- EPHY_COMPLETION_EXTRA_COL,
- EPHY_COMPLETION_FAVICON_COL);
- g_object_unref (model);
-
- ephy_location_entry_set_match_func (priv->location_entry,
- match_func,
- priv->location_entry,
- NULL);
-
- add_completion_actions (action, priv->location_entry);
-
- sync_address (action, NULL, widget);
- g_signal_connect_object (action, "notify::address",
- G_CALLBACK (sync_address), widget, 0);
- sync_editable (action, NULL, widget);
- g_signal_connect_object (action, "notify::editable",
- G_CALLBACK (sync_editable), widget, 0);
- sync_icon (action, NULL, widget);
- g_signal_connect_object (action, "notify::icon",
- G_CALLBACK (sync_icon), widget, 0);
- sync_lock_stock_id (action, NULL, widget);
- g_signal_connect_object (action, "notify::lock-stock-id",
- G_CALLBACK (sync_lock_stock_id), widget, 0);
- sync_lock_tooltip (action, NULL, widget);
- g_signal_connect_object (action, "notify::lock-tooltip",
- G_CALLBACK (sync_lock_tooltip), widget, 0);
- sync_show_lock (action, NULL, widget);
- g_signal_connect_object (action, "notify::show-lock",
- G_CALLBACK (sync_show_lock), widget, 0);
-
- g_signal_connect_object (widget, "activate",
- G_CALLBACK (entry_activate_cb),
- action, 0);
- g_signal_connect_object (widget, "user-changed",
- G_CALLBACK (user_changed_cb), action, 0);
- g_signal_connect_object (widget, "lock-clicked",
- G_CALLBACK (lock_clicked_cb), action, 0);
- g_signal_connect_object (widget, "get-location",
- G_CALLBACK (get_location_cb), action, 0);
- g_signal_connect_object (widget, "get-title",
- G_CALLBACK (get_title_cb), action, 0);
- g_signal_connect_object (widget, "focus-in-event",
- G_CALLBACK (focus_in_event_cb), action, 0);
- g_signal_connect_object (widget, "focus-out-event",
- G_CALLBACK (focus_out_event_cb), action, 0);
-}
-
-static void
-ephy_location_action_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EphyLocationAction *action = EPHY_LOCATION_ACTION (object);
- EphyLocationActionPrivate *priv = action->priv;
-
- switch (prop_id)
- {
- case PROP_ADDRESS:
- ephy_location_action_set_address (action, g_value_get_string (value));
- break;
- case PROP_EDITABLE:
- priv->editable = g_value_get_boolean (value);
- break;
- case PROP_ICON:
- if (priv->icon != NULL)
- {
- g_object_unref (priv->icon);
- }
- priv->icon = GDK_PIXBUF (g_value_dup_object (value));
- break;
- case PROP_LOCK_STOCK:
- g_free (priv->lock_stock_id);
- priv->lock_stock_id = g_value_dup_string (value);
- break;
- case PROP_LOCK_TOOLTIP:
- g_free (priv->lock_tooltip);
- priv->lock_tooltip = g_value_dup_string (value);
- break;
- case PROP_SHOW_LOCK:
- priv->show_lock = g_value_get_boolean (value);
- break;
- case PROP_WINDOW:
- priv->window = EPHY_WINDOW (g_value_get_object (value));
- break;
- case PROP_LOCATION_ENTRY:
- priv->location_entry = EPHY_LOCATION_ENTRY (g_value_get_object (value));
- break;
- }
-}
-
-static void
-ephy_location_action_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EphyLocationAction *action = EPHY_LOCATION_ACTION (object);
- EphyLocationActionPrivate *priv = action->priv;
-
- switch (prop_id)
- {
- case PROP_ADDRESS:
- g_value_set_string (value, ephy_location_action_get_address (action));
- break;
- case PROP_EDITABLE:
- g_value_set_boolean (value, priv->editable);
- break;
- case PROP_ICON:
- g_value_set_object (value, priv->icon);
- break;
- case PROP_LOCK_STOCK:
- g_value_set_string (value, priv->lock_stock_id);
- break;
- case PROP_LOCK_TOOLTIP:
- g_value_set_string (value, priv->lock_tooltip);
- break;
- case PROP_SHOW_LOCK:
- g_value_set_boolean (value, priv->show_lock);
- break;
- case PROP_WINDOW:
- case PROP_LOCATION_ENTRY:
- /* not readable */
- break;
- }
-}
-
-static void
-ephy_location_action_dispose (GObject *object)
-{
- EphyLocationAction *action = EPHY_LOCATION_ACTION (object);
- EphyLocationActionPrivate *priv = action->priv;
- GtkWidget *notebook;
-
- notebook = ephy_window_get_notebook (priv->window);
-
- if (notebook == NULL ||
- priv->location_entry == NULL) {
- return;
- }
-
- g_signal_handlers_disconnect_matched (action, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, priv->location_entry);
- g_signal_handlers_disconnect_matched (priv->location_entry, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, action);
- g_signal_handlers_disconnect_matched (notebook, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, action);
- priv->location_entry = NULL;
-
- G_OBJECT_CLASS (ephy_location_action_parent_class)->dispose (object);
-}
-
-static void
-ephy_location_action_class_init (EphyLocationActionClass *class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
-
- object_class->finalize = ephy_location_action_finalize;
- object_class->dispose = ephy_location_action_dispose;
- object_class->constructed = ephy_location_action_constructed;
- object_class->get_property = ephy_location_action_get_property;
- object_class->set_property = ephy_location_action_set_property;
-
- /**
- * EphyLocationAction::lock-clicked:
- * @action: the object which received the signal.
- *
- * Emitted when the user clicks on the security icon of the internal
- * #EphyLocationEntry.
- */
- signals[LOCK_CLICKED] = g_signal_new (
- "lock-clicked",
- EPHY_TYPE_LOCATION_ACTION,
- G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EphyLocationActionClass, lock_clicked),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
-
- /**
- * EphyLocationAction:address:
- *
- * The address of the current location.
- */
- g_object_class_install_property (object_class,
- PROP_ADDRESS,
- g_param_spec_string ("address",
- "Address",
- "The address of the current location",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- /**
- * EphyLocationAction:editable:
- *
- * Whether the location bar entry can be edited.
- */
- g_object_class_install_property (object_class,
- PROP_EDITABLE,
- g_param_spec_boolean ("editable",
- "Editable",
- "Whether the location bar entry can be edited",
- TRUE,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- /**
- * EphyLocationAction:icon:
- *
- * The icon corresponding to the current location.
- */
- g_object_class_install_property (object_class,
- PROP_ICON,
- g_param_spec_object ("icon",
- "Icon",
- "The icon corresponding to the current location",
- GDK_TYPE_PIXBUF,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- /**
- * EphyLocationAction:lock-stock-id:
- *
- * Stock id of the security icon.
- */
- g_object_class_install_property (object_class,
- PROP_LOCK_STOCK,
- g_param_spec_string ("lock-stock-id",
- "Lock Stock ID",
- "Stock id of the security icon",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- /**
- * EphyLocationAction:lock-tooltip:
- *
- * Tooltip for the security icon.
- */
- g_object_class_install_property (object_class,
- PROP_LOCK_TOOLTIP,
- g_param_spec_string ("lock-tooltip",
- "Lock Tooltip",
- "Tooltip for the security icon",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- /**
- * EphyLocationAction:show-lock:
- *
- * If we should show the security icon.
- */
- g_object_class_install_property (object_class,
- PROP_SHOW_LOCK,
- g_param_spec_boolean ("show-lock",
- "Show Lock",
- "If we should show the security icon",
- FALSE,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- /**
- * EphyLocationAction:window:
- *
- * The parent window.
- */
- g_object_class_install_property (object_class,
- PROP_WINDOW,
- g_param_spec_object ("window",
- "Window",
- "The parent window",
- G_TYPE_OBJECT,
- G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
- G_PARAM_CONSTRUCT_ONLY));
-
- /**
- * EphyLocationAction:location-entry:
- *
- * The controlled location entry.
- */
- g_object_class_install_property (object_class,
- PROP_LOCATION_ENTRY,
- g_param_spec_object ("location-entry",
- "Location entry",
- "The controlled location entry",
- G_TYPE_OBJECT,
- G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
- G_PARAM_CONSTRUCT_ONLY));
-
- g_type_class_add_private (object_class, sizeof (EphyLocationActionPrivate));
-}
-
-static int
-compare_actions (gconstpointer a,
- gconstpointer b)
-{
- EphyNode *node_a = (EphyNode *)a;
- EphyNode *node_b = (EphyNode *)b;
- const char *title1, *title2;
- int retval;
-
- title1 = ephy_node_get_property_string (node_a, EPHY_NODE_BMK_PROP_TITLE);
- title2 = ephy_node_get_property_string (node_b, EPHY_NODE_BMK_PROP_TITLE);
-
- if (title1 == NULL)
- {
- retval = -1;
- }
- else if (title2 == NULL)
- {
- retval = 1;
- }
- else
- {
- char *str_a, *str_b;
-
- str_a = g_utf8_casefold (title1, -1);
- str_b = g_utf8_casefold (title2, -1);
- retval = g_utf8_collate (str_a, str_b);
- g_free (str_a);
- g_free (str_b);
- }
-
- return retval;
-}
-
-static void
-init_actions_list (EphyLocationAction *action)
-{
- GPtrArray *children;
- int i;
-
- children = ephy_node_get_children (action->priv->smart_bmks);
- for (i = 0; i < children->len; i++)
- {
- EphyNode *kid;
-
- kid = g_ptr_array_index (children, i);
-
- action->priv->actions = g_list_prepend
- (action->priv->actions, kid);
- }
-
- action->priv->actions =
- g_list_sort (action->priv->actions, (GCompareFunc) compare_actions);
-}
-
-static void
-update_actions_list (EphyLocationAction *la)
-{
- EphyLocationActionPrivate *priv = la->priv;
-
- remove_completion_actions (la, priv->location_entry);
-
- g_list_free (la->priv->actions);
- la->priv->actions = NULL;
- init_actions_list (la);
-
- add_completion_actions (la, priv->location_entry);
-}
-
-static void
-actions_child_removed_cb (EphyNode *node,
- EphyNode *child,
- guint old_index,
- EphyLocationAction *action)
-{
- update_actions_list (action);
-}
-
-static void
-actions_child_added_cb (EphyNode *node,
- EphyNode *child,
- EphyLocationAction *action)
-{
- update_actions_list (action);
-}
-
-static void
-actions_child_changed_cb (EphyNode *node,
- EphyNode *child,
- guint property_id,
- EphyLocationAction *action)
-{
- update_actions_list (action);
-}
-
-static void
-ephy_location_action_init (EphyLocationAction *action)
-{
- EphyLocationActionPrivate *priv;
-
- priv = action->priv = EPHY_LOCATION_ACTION_GET_PRIVATE (action);
-
- priv->address = g_strdup ("");
- priv->editable = TRUE;
- priv->bookmarks = ephy_shell_get_bookmarks (ephy_shell);
- priv->smart_bmks = ephy_bookmarks_get_smart_bookmarks
- (action->priv->bookmarks);
- priv->sync_address_is_blocked = FALSE;
-
- init_actions_list (action);
-
- ephy_node_signal_connect_object (priv->smart_bmks,
- EPHY_NODE_CHILD_ADDED,
- (EphyNodeCallback)actions_child_added_cb,
- G_OBJECT (action));
- ephy_node_signal_connect_object (priv->smart_bmks,
- EPHY_NODE_CHILD_REMOVED,
- (EphyNodeCallback)actions_child_removed_cb,
- G_OBJECT (action));
- ephy_node_signal_connect_object (priv->smart_bmks,
- EPHY_NODE_CHILD_CHANGED,
- (EphyNodeCallback)actions_child_changed_cb,
- G_OBJECT (action));
-}
-
-static void
-ephy_location_action_finalize (GObject *object)
-{
- EphyLocationAction *action = EPHY_LOCATION_ACTION (object);
- EphyLocationActionPrivate *priv = action->priv;
-
- if (priv->icon != NULL)
- {
- g_object_unref (priv->icon);
- }
-
- g_list_free (priv->actions);
- g_free (priv->address);
- g_free (priv->lock_stock_id);
- g_free (priv->lock_tooltip);
-
- G_OBJECT_CLASS (ephy_location_action_parent_class)->finalize (object);
-}
-
-/**
- * ephy_location_action_get_address:
- * @action: an #EphyLocationAction
- *
- * Retrieves the currently loaded address.
- *
- * Returns: the current address
- **/
-const char *
-ephy_location_action_get_address (EphyLocationAction *action)
-{
- g_return_val_if_fail (EPHY_IS_LOCATION_ACTION (action), "");
-
- return action->priv->address;
-}
-
-/**
- * ephy_location_action_set_address:
- * @action: an #EphyLocationAction
- * @address: new address
- *
- * Sets @address as the address of @action.
- **/
-void
-ephy_location_action_set_address (EphyLocationAction *action,
- const char *address)
-{
- EphyLocationActionPrivate *priv;
-
- g_return_if_fail (EPHY_IS_LOCATION_ACTION (action));
-
- priv = action->priv;
-
- LOG ("set_address %s", address);
-
- g_free (priv->address);
- priv->address = g_strdup (address);
-
- g_object_notify (G_OBJECT (action), "address");
-}