aboutsummaryrefslogtreecommitdiffstats
path: root/src/bookmarks/ephy-favorites-menu.c
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <marco@gnome.org>2004-07-02 17:03:42 +0800
committerMarco Pesenti Gritti <marco@src.gnome.org>2004-07-02 17:03:42 +0800
commit6dadef323fb59daefac69200014b1d5f238a911a (patch)
treef44b28f70a91dee49b95ebbc8d5c7a86a7ea9f3c /src/bookmarks/ephy-favorites-menu.c
parent5788200966658bf840916954af8718426d33c177 (diff)
downloadgsoc2013-epiphany-6dadef323fb59daefac69200014b1d5f238a911a.tar
gsoc2013-epiphany-6dadef323fb59daefac69200014b1d5f238a911a.tar.gz
gsoc2013-epiphany-6dadef323fb59daefac69200014b1d5f238a911a.tar.bz2
gsoc2013-epiphany-6dadef323fb59daefac69200014b1d5f238a911a.tar.lz
gsoc2013-epiphany-6dadef323fb59daefac69200014b1d5f238a911a.tar.xz
gsoc2013-epiphany-6dadef323fb59daefac69200014b1d5f238a911a.tar.zst
gsoc2013-epiphany-6dadef323fb59daefac69200014b1d5f238a911a.zip
Move in the bookmarks dir.
2004-07-02 Marco Pesenti Gritti <marco@gnome.org> * src/bookmarks/ephy-favorites-menu.c: * src/bookmarks/ephy-favorites-menu.h: Move in the bookmarks dir. * lib/ephy-gui.c: (ephy_gui_select_row_by_key), (ephy_gui_is_middle_click): * lib/ephy-gui.h: Add a function to check if menus was activated by a middle or a ctrl+click (which is equivalent in epiphany) * lib/ephy-marshal.list: * src/Makefile.am: * src/bookmarks/Makefile.am: * src/bookmarks/ephy-bookmark-action.c: (activate_cb), (ephy_bookmark_action_class_init): * src/bookmarks/ephy-bookmark-action.h: * src/bookmarks/ephy-bookmarks-menu.c: (open_bookmark_cb), (create_menu): * src/bookmarks/ephy-bookmarksbar.c: (bookmark_open_in_tab_cb), (bookmark_open_cb), (ephy_bookmarksbar_action_request): * src/bookmarks/ephy-topic-action.c: (menu_activate_cb), (ephy_topic_action_class_init): * src/bookmarks/ephy-topic-action.h: Add signals to open bookmarks in new window/tab. I'll need them for context menus. Use them for middle/ctrl click.
Diffstat (limited to 'src/bookmarks/ephy-favorites-menu.c')
-rw-r--r--src/bookmarks/ephy-favorites-menu.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/src/bookmarks/ephy-favorites-menu.c b/src/bookmarks/ephy-favorites-menu.c
new file mode 100644
index 000000000..f2ef1e814
--- /dev/null
+++ b/src/bookmarks/ephy-favorites-menu.c
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2002 Ricardo Fernández Pascual
+ * Copyright (C) 2003 Marco Pesenti Gritti
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "ephy-favorites-menu.h"
+#include "ephy-bookmark-action.h"
+#include "ephy-shell.h"
+#include "ephy-debug.h"
+
+#include <gtk/gtkuimanager.h>
+#include <glib/gprintf.h>
+
+#define EPHY_FAVORITES_MENU_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_FAVORITES_MENU, EphyFavoritesMenuPrivate))
+
+struct _EphyFavoritesMenuPrivate
+{
+ EphyWindow *window;
+ EphyBookmarks *bookmarks;
+ GtkActionGroup *action_group;
+ guint ui_id;
+ guint update_tag;
+};
+
+static void ephy_favorites_menu_class_init (EphyFavoritesMenuClass *klass);
+static void ephy_favorites_menu_init (EphyFavoritesMenu *menu);
+static void ephy_favorites_menu_finalize (GObject *o);
+
+enum
+{
+ PROP_0,
+ PROP_WINDOW
+};
+
+static gpointer parent_class;
+
+GType
+ephy_favorites_menu_get_type (void)
+{
+ static GType ephy_favorites_menu_type = 0;
+
+ if (ephy_favorites_menu_type == 0)
+ {
+ static const GTypeInfo our_info =
+ {
+ sizeof (EphyFavoritesMenuClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) ephy_favorites_menu_class_init,
+ NULL,
+ NULL, /* class_data */
+ sizeof (EphyFavoritesMenu),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) ephy_favorites_menu_init
+ };
+
+ ephy_favorites_menu_type = g_type_register_static (G_TYPE_OBJECT,
+ "EphyFavoritesMenu",
+ &our_info, 0);
+ }
+ return ephy_favorites_menu_type;
+}
+
+static void
+ephy_favorites_menu_clean (EphyFavoritesMenu *menu)
+{
+ EphyFavoritesMenuPrivate *p = menu->priv;
+ GtkUIManager *merge = GTK_UI_MANAGER (p->window->ui_merge);
+
+ if (p->ui_id > 0)
+ {
+ gtk_ui_manager_remove_ui (merge, p->ui_id);
+ gtk_ui_manager_ensure_update (merge);
+ p->ui_id = 0;
+ }
+
+ if (p->action_group != NULL)
+ {
+ gtk_ui_manager_remove_action_group (merge, p->action_group);
+ g_object_unref (p->action_group);
+ }
+}
+
+static void
+open_bookmark_cb (GtkAction *action, char *location, EphyWindow *window)
+{
+ ephy_window_load_url (window, location);
+}
+
+static void
+ephy_favorites_menu_rebuild (EphyFavoritesMenu *menu)
+{
+ EphyFavoritesMenuPrivate *p = menu->priv;
+ gint i;
+ EphyNode *fav;
+ GPtrArray *children;
+ GtkUIManager *merge = GTK_UI_MANAGER (p->window->ui_merge);
+
+ LOG ("Rebuilding favorites menu")
+
+ START_PROFILER ("Rebuild favorites menu")
+
+ ephy_favorites_menu_clean (menu);
+
+ fav = ephy_bookmarks_get_favorites (p->bookmarks);
+ children = ephy_node_get_children (fav);
+
+ p->action_group = gtk_action_group_new ("FavoritesActions");
+ gtk_ui_manager_insert_action_group (merge, p->action_group, 0);
+ p->ui_id = gtk_ui_manager_new_merge_id (merge);
+
+ for (i = 0; i < children->len; i++)
+ {
+ char verb[20];
+ char name[20];
+ char accel_path[48];
+ EphyNode *node;
+ GtkAction *action;
+
+ g_snprintf (verb, sizeof (verb),"GoFav%d", i);
+ g_snprintf (name, sizeof (name), "GoFav%dMenu", i);
+ g_snprintf (accel_path, sizeof (accel_path),
+ "<Actions>/FavoritesActions/%s", verb);
+
+ node = g_ptr_array_index (children, i);
+
+ action = ephy_bookmark_action_new (verb,
+ ephy_node_get_id (node));
+ gtk_action_set_accel_path (action, accel_path);
+ gtk_action_group_add_action (p->action_group, action);
+ g_object_unref (action);
+ g_signal_connect (action, "open",
+ G_CALLBACK (open_bookmark_cb), p->window);
+
+ gtk_ui_manager_add_ui (merge, p->ui_id,
+ "/menubar/GoMenu",
+ name, verb,
+ GTK_UI_MANAGER_MENUITEM, FALSE);
+ }
+
+ STOP_PROFILER ("Rebuild favorites menu")
+}
+
+static void
+ephy_favorites_menu_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EphyFavoritesMenu *menu = EPHY_FAVORITES_MENU (object);
+
+ switch (prop_id)
+ {
+ case PROP_WINDOW:
+ menu->priv->window = g_value_get_object (value);
+ ephy_favorites_menu_rebuild (menu);
+ break;
+ }
+}
+
+static void
+ephy_favorites_menu_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EphyFavoritesMenu *menu = EPHY_FAVORITES_MENU (object);
+
+ switch (prop_id)
+ {
+ case PROP_WINDOW:
+ g_value_set_object (value, menu->priv->window);
+ break;
+ }
+}
+
+
+static void
+ephy_favorites_menu_class_init (EphyFavoritesMenuClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_class->finalize = ephy_favorites_menu_finalize;
+ object_class->set_property = ephy_favorites_menu_set_property;
+ object_class->get_property = ephy_favorites_menu_get_property;
+
+ g_object_class_install_property (object_class,
+ PROP_WINDOW,
+ g_param_spec_object ("window",
+ "Window",
+ "Parent window",
+ EPHY_TYPE_WINDOW,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+
+ g_type_class_add_private (object_class, sizeof(EphyFavoritesMenuPrivate));
+}
+
+static gboolean
+do_updates (EphyFavoritesMenu *menu)
+{
+ ephy_favorites_menu_rebuild (menu);
+
+ menu->priv->update_tag = 0;
+
+ /* don't run again */
+ return FALSE;
+}
+
+static void
+fav_removed_cb (EphyNode *node,
+ EphyNode *child,
+ guint old_index,
+ EphyFavoritesMenu *menu)
+{
+ if (menu->priv->update_tag == 0)
+ {
+ menu->priv->update_tag = g_idle_add((GSourceFunc)do_updates, menu);
+ }
+}
+
+static void
+fav_added_cb (EphyNode *node,
+ EphyNode *child,
+ EphyFavoritesMenu *menu)
+{
+ if (menu->priv->update_tag == 0)
+ {
+ menu->priv->update_tag = g_idle_add((GSourceFunc)do_updates, menu);
+ }
+}
+
+static void
+ephy_favorites_menu_init (EphyFavoritesMenu *menu)
+{
+ EphyFavoritesMenuPrivate *p = EPHY_FAVORITES_MENU_GET_PRIVATE (menu);
+ EphyNode *fav;
+ menu->priv = p;
+
+ menu->priv->bookmarks = ephy_shell_get_bookmarks (ephy_shell);
+ menu->priv->ui_id = 0;
+ menu->priv->update_tag = 0;
+ menu->priv->action_group = NULL;
+
+ fav = ephy_bookmarks_get_favorites (menu->priv->bookmarks);
+ ephy_node_signal_connect_object (fav,
+ EPHY_NODE_CHILD_REMOVED,
+ (EphyNodeCallback) fav_removed_cb,
+ G_OBJECT (menu));
+ ephy_node_signal_connect_object (fav,
+ EPHY_NODE_CHILD_ADDED,
+ (EphyNodeCallback) fav_added_cb,
+ G_OBJECT (menu));
+}
+
+static void
+ephy_favorites_menu_finalize (GObject *o)
+{
+ EphyFavoritesMenu *menu = EPHY_FAVORITES_MENU (o);
+
+ if (menu->priv->action_group != NULL)
+ {
+ g_object_unref (menu->priv->action_group);
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (o);
+}
+
+EphyFavoritesMenu *
+ephy_favorites_menu_new (EphyWindow *window)
+{
+ return g_object_new (EPHY_TYPE_FAVORITES_MENU,
+ "window", window,
+ NULL);
+}