diff options
Diffstat (limited to 'src/bookmarks')
-rw-r--r-- | src/bookmarks/Makefile.am | 4 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmark-properties.c | 14 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks-editor.c | 43 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks.c | 115 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks.h | 114 | ||||
-rwxr-xr-x | src/bookmarks/ephy-bookmarksbar-model.c | 114 | ||||
-rwxr-xr-x | src/bookmarks/ephy-bookmarksbar-model.h | 26 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarksbar.c | 60 |
8 files changed, 288 insertions, 202 deletions
diff --git a/src/bookmarks/Makefile.am b/src/bookmarks/Makefile.am index 104254cbf..3b2b130ae 100644 --- a/src/bookmarks/Makefile.am +++ b/src/bookmarks/Makefile.am @@ -29,6 +29,8 @@ NOINST_H_FILES = \ ephy-bookmarks-export.h \ ephy-bookmarks-import.h \ ephy-bookmarks-menu.h \ + ephy-bookmarksbar-model.h \ + ephy-bookmarksbar.h \ ephy-bookmark-properties.h \ ephy-new-bookmark.h \ ephy-topic-action.h \ @@ -41,6 +43,8 @@ libephybookmarks_la_SOURCES = \ ephy-bookmarks-export.c \ ephy-bookmarks-import.c \ ephy-bookmarks-menu.c \ + ephy-bookmarksbar-model.c \ + ephy-bookmarksbar.c \ ephy-bookmark-properties.c \ ephy-new-bookmark.c \ ephy-topic-action.c \ diff --git a/src/bookmarks/ephy-bookmark-properties.c b/src/bookmarks/ephy-bookmark-properties.c index 2b6325add..f984124b8 100644 --- a/src/bookmarks/ephy-bookmark-properties.c +++ b/src/bookmarks/ephy-bookmark-properties.c @@ -22,7 +22,7 @@ #include "config.h" #endif -#include "ephy-toolbars-model.h" +#include "ephy-bookmarksbar-model.h" #include "ephy-bookmark-properties.h" #include "ephy-topics-selector.h" #include "ephy-debug.h" @@ -64,7 +64,7 @@ struct EphyBookmarkPropertiesPrivate GtkWidget *location_entry; GtkWidget *topics_selector; - EphyToolbarsModel *tb_model; + EphyBookmarksBarModel *tb_model; }; enum @@ -155,6 +155,8 @@ ephy_bookmark_properties_set_property (GObject *object, { case PROP_BOOKMARKS: selector->priv->bookmarks = g_value_get_object (value); + selector->priv->tb_model = EPHY_BOOKMARKSBAR_MODEL + (ephy_bookmarks_get_toolbars_model (selector->priv->bookmarks)); break; case PROP_BOOKMARK: ephy_bookmark_properties_set_bookmark @@ -260,12 +262,12 @@ toolbar_checkbox_changed_cb (GtkWidget *checkbox, EphyBookmarkProperties *props) if (state) { - ephy_toolbars_model_add_bookmark + ephy_bookmarksbar_model_add_bookmark (props->priv->tb_model, FALSE, id); } else { - ephy_toolbars_model_remove_bookmark + ephy_bookmarksbar_model_remove_bookmark (props->priv->tb_model, id); } } @@ -402,7 +404,7 @@ build_ui (EphyBookmarkProperties *editor) checkbox = gtk_check_button_new_with_mnemonic (_("_Show in bookmarks bar")); id = ephy_node_get_id (editor->priv->bookmark); - state = ephy_toolbars_model_has_bookmark (editor->priv->tb_model, id); + state = ephy_bookmarksbar_model_has_bookmark (editor->priv->tb_model, id); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), state); g_signal_connect (checkbox, "toggled", G_CALLBACK (toolbar_checkbox_changed_cb), editor); @@ -427,8 +429,6 @@ ephy_bookmark_properties_init (EphyBookmarkProperties *editor) editor->priv = EPHY_BOOKMARK_PROPERTIES_GET_PRIVATE (editor); editor->priv->bookmark = NULL; - editor->priv->tb_model = EPHY_TOOLBARS_MODEL - (ephy_shell_get_toolbars_model (ephy_shell, FALSE)); } GtkWidget * diff --git a/src/bookmarks/ephy-bookmarks-editor.c b/src/bookmarks/ephy-bookmarks-editor.c index 5a8b71976..0cc0158a0 100644 --- a/src/bookmarks/ephy-bookmarks-editor.c +++ b/src/bookmarks/ephy-bookmarks-editor.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003 Marco Pesenti Gritti <mpeseng@tin.it> + * Copyright (C) 2003, 2004 Marco Pesenti Gritti <mpeseng@tin.it> * * 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 @@ -56,7 +56,7 @@ #include "ephy-gui.h" #include "ephy-stock-icons.h" #include "ephy-search-entry.h" -#include "ephy-toolbars-model.h" +#include "ephy-bookmarksbar-model.h" #include "ephy-favicon-cache.h" #include "eel-gconf-extensions.h" #include "ephy-debug.h" @@ -141,7 +141,7 @@ struct EphyBookmarksEditorPrivate GtkUIManager *ui_merge; GtkActionGroup *action_group; int priority_col; - EphyToolbarsModel *tb_model; + EphyBookmarksBarModel *tb_model; GHashTable *props_dialogs; GtkTreeViewColumn *title_col; @@ -322,6 +322,15 @@ get_target_window (EphyBookmarksEditor *editor) } static void +toolbar_items_changed_cb (EggToolbarsModel *model, + int toolbar_position, + int position, + EphyBookmarksEditor *editor) +{ + ephy_bookmarks_editor_update_menu (editor); +} + +static void cmd_show_in_bookmarks_bar (GtkAction *action, EphyBookmarksEditor *editor) { @@ -353,13 +362,19 @@ cmd_show_in_bookmarks_bar (GtkAction *action, if (state) { - ephy_toolbars_model_add_bookmark + ephy_bookmarksbar_model_add_bookmark (editor->priv->tb_model, topic, id); } else { - ephy_toolbars_model_remove_bookmark + g_signal_handlers_block_by_func + (editor->priv->tb_model, + G_CALLBACK (toolbar_items_changed_cb), editor); + ephy_bookmarksbar_model_remove_bookmark (editor->priv->tb_model, id); + g_signal_handlers_unblock_by_func + (editor->priv->tb_model, + G_CALLBACK (toolbar_items_changed_cb), editor); } g_list_free (selection); @@ -981,7 +996,7 @@ ephy_bookmarks_editor_update_menu (EphyBookmarksEditor *editor) gulong id; id = ephy_node_get_id (node); - show_in_bookmarks_bar = ephy_toolbars_model_has_bookmark + show_in_bookmarks_bar = ephy_bookmarksbar_model_has_bookmark (editor->priv->tb_model, id); priority = ephy_node_get_property_int @@ -1001,7 +1016,7 @@ ephy_bookmarks_editor_update_menu (EphyBookmarksEditor *editor) g_return_if_fail (node != NULL); id = ephy_node_get_id (node); - show_in_bookmarks_bar = ephy_toolbars_model_has_bookmark + show_in_bookmarks_bar = ephy_bookmarksbar_model_has_bookmark (editor->priv->tb_model, id); g_list_free (selected); @@ -1653,23 +1668,15 @@ ephy_bookmarks_editor_get_property (GObject *object, } static void -toolbar_items_changed_cb (EphyToolbarsModel *model, - int toolbar_position, - int position, - EphyBookmarksEditor *editor) -{ - ephy_bookmarks_editor_update_menu (editor); -} - -static void ephy_bookmarks_editor_init (EphyBookmarksEditor *editor) { editor->priv = EPHY_BOOKMARKS_EDITOR_GET_PRIVATE (editor); editor->priv->props_dialogs = g_hash_table_new (g_direct_hash, g_direct_equal); - editor->priv->tb_model = EPHY_TOOLBARS_MODEL - (ephy_shell_get_toolbars_model (ephy_shell, FALSE)); + editor->priv->tb_model = EPHY_BOOKMARKSBAR_MODEL + (ephy_bookmarks_get_toolbars_model + (ephy_shell_get_bookmarks (ephy_shell))); g_signal_connect (editor->priv->tb_model, "item_added", G_CALLBACK (toolbar_items_changed_cb), editor); diff --git a/src/bookmarks/ephy-bookmarks.c b/src/bookmarks/ephy-bookmarks.c index 6e765e6d6..be9884956 100644 --- a/src/bookmarks/ephy-bookmarks.c +++ b/src/bookmarks/ephy-bookmarks.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2002-2004 Marco Pesenti Gritti + * Copyright (C) 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 @@ -30,7 +31,7 @@ #include "ephy-debug.h" #include "ephy-tree-model-node.h" #include "ephy-node-common.h" -#include "ephy-toolbars-model.h" +#include "ephy-bookmarksbar-model.h" #include "ephy-bookmarks-export.h" #include "ephy-bookmarks-import.h" #include "ephy-prefs.h" @@ -50,7 +51,7 @@ struct EphyBookmarksPrivate { - EphyToolbarsModel *toolbars_model; + EphyBookmarksBarModel *toolbars_model; gboolean init_defaults; gboolean dirty; guint save_timeout_id; @@ -160,22 +161,84 @@ ephy_bookmarks_init_defaults (EphyBookmarks *eb) bmk = ephy_bookmarks_add (eb, _(default_bookmarks[i].title), _(default_bookmarks[i].location)); - ephy_toolbars_model_add_bookmark (eb->priv->toolbars_model, FALSE, - ephy_node_get_id (bmk)); + ephy_bookmarksbar_model_add_bookmark (eb->priv->toolbars_model, FALSE, + ephy_node_get_id (bmk)); } } -static void -ephy_bookmarks_set_toolbars_model (EphyBookmarks *eb, EphyToolbarsModel *model) +static char * +get_item_type_forward_cb (EggToolbarsModel *model, + GdkAtom type, + EggToolbarsModel *bookmarksbar_model) +{ + char *retval; + + g_signal_emit_by_name (bookmarksbar_model, "get_item_type", + type, &retval); + + return retval; +} + +static char * +get_item_id_forward_cb (EggToolbarsModel *model, + const char *type, + const char *name, + EggToolbarsModel *bookmarksbar_model) +{ + char *retval; + + g_signal_emit_by_name (bookmarksbar_model, "get_item_id", + type, name, &retval); + + return retval; +} + +static char * +get_item_data_forward_cb (EggToolbarsModel *model, + const char *type, + const char *id, + EggToolbarsModel *bookmarksbar_model) +{ + char *retval; + + g_signal_emit_by_name (bookmarksbar_model, "get_item_data", + type, id, &retval); + + return retval; +} + +EggToolbarsModel * +ephy_bookmarks_get_toolbars_model (EphyBookmarks *eb) { - eb->priv->toolbars_model = model; - g_object_add_weak_pointer (G_OBJECT(eb->priv->toolbars_model), - (gpointer *)&eb->priv->toolbars_model); + g_return_val_if_fail (EPHY_IS_BOOKMARKS (eb), NULL); - if (eb->priv->init_defaults) + if (eb->priv->toolbars_model == NULL) { - ephy_bookmarks_init_defaults (eb); + GObject *toolbars_model; + + eb->priv->toolbars_model = EPHY_BOOKMARKSBAR_MODEL + (ephy_bookmarksbar_model_new (eb)); + + /* forward those signals, so that bookmarks can also be on the main model */ + toolbars_model = ephy_shell_get_toolbars_model (ephy_shell, FALSE); + + g_signal_connect_after (toolbars_model, "get_item_type", + G_CALLBACK (get_item_type_forward_cb), + eb->priv->toolbars_model); + g_signal_connect_after (toolbars_model, "get_item_id", + G_CALLBACK (get_item_id_forward_cb), + eb->priv->toolbars_model); + g_signal_connect_after (toolbars_model, "get_item_data", + G_CALLBACK (get_item_data_forward_cb), + eb->priv->toolbars_model); + + if (eb->priv->init_defaults) + { + ephy_bookmarks_init_defaults (eb); + } } + + return EGG_TOOLBARS_MODEL (eb->priv->toolbars_model); } static void @@ -184,16 +247,8 @@ ephy_bookmarks_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - EphyBookmarks *eb; - - eb = EPHY_BOOKMARKS (object); - - switch (prop_id) - { - case PROP_TOOLBARS_MODEL: - ephy_bookmarks_set_toolbars_model (eb, g_value_get_object (value)); - break; - } + /* no writable properties */ + g_assert_not_reached (); } static void @@ -202,14 +257,12 @@ ephy_bookmarks_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - EphyBookmarks *eb; - - eb = EPHY_BOOKMARKS (object); + EphyBookmarks *eb = EPHY_BOOKMARKS (object); switch (prop_id) { case PROP_TOOLBARS_MODEL: - g_value_set_object (value, eb->priv->toolbars_model); + g_value_set_object (value, ephy_bookmarks_get_toolbars_model (eb)); break; } } @@ -238,11 +291,11 @@ ephy_bookmarks_class_init (EphyBookmarksClass *klass) g_object_class_install_property (object_class, PROP_TOOLBARS_MODEL, - g_param_spec_object ("toolbars_model", + g_param_spec_object ("toolbars-model", "Toolbars model", "Toolbars model", - EPHY_TYPE_TOOLBARS_MODEL, - G_PARAM_READWRITE)); + EPHY_TYPE_BOOKMARKSBAR_MODEL, + G_PARAM_READABLE)); g_type_class_add_private (object_class, sizeof(EphyBookmarksPrivate)); } @@ -763,10 +816,10 @@ ephy_bookmarks_finalize (GObject *object) g_object_unref (eb->priv->db); - if (eb->priv->toolbars_model) + LOG ("Unref bookmarks toolbars model") + if (eb->priv->toolbars_model != NULL) { - g_object_remove_weak_pointer (G_OBJECT(eb->priv->toolbars_model), - (gpointer *)&eb->priv->toolbars_model); + g_object_unref (eb->priv->toolbars_model); } g_free (eb->priv->xml_file); diff --git a/src/bookmarks/ephy-bookmarks.h b/src/bookmarks/ephy-bookmarks.h index 14b352e0a..26c83832e 100644 --- a/src/bookmarks/ephy-bookmarks.h +++ b/src/bookmarks/ephy-bookmarks.h @@ -1,5 +1,6 @@ /* - * Copyright (C) 2000, 2001, 2002 Marco Pesenti Gritti + * Copyright (C) 2000-2004 Marco Pesenti Gritti + * Copyright (C) 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 @@ -24,6 +25,7 @@ #include <glib-object.h> #include "ephy-node.h" +#include "egg-toolbars-model.h" G_BEGIN_DECLS @@ -34,103 +36,105 @@ G_BEGIN_DECLS #define EPHY_IS_BOOKMARKS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EPHY_TYPE_BOOKMARKS)) #define EPHY_BOOKMARKS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EPHY_TYPE_BOOKMARKS, EphyBookmarksClass)) -typedef struct EphyBookmarksClass EphyBookmarksClass; -typedef struct EphyBookmarks EphyBookmarks; -typedef struct EphyBookmarksPrivate EphyBookmarksPrivate; +typedef struct EphyBookmarksClass EphyBookmarksClass; +typedef struct EphyBookmarks EphyBookmarks; +typedef struct EphyBookmarksPrivate EphyBookmarksPrivate; enum { - EPHY_NODE_BMK_PROP_TITLE = 2, - EPHY_NODE_BMK_PROP_LOCATION = 3, - EPHY_NODE_BMK_PROP_KEYWORDS = 4, - EPHY_NODE_KEYWORD_PROP_NAME = 5, - EPHY_NODE_BMK_PROP_ICON = 7, - EPHY_NODE_KEYWORD_PROP_PRIORITY = 8 + EPHY_NODE_BMK_PROP_TITLE = 2, + EPHY_NODE_BMK_PROP_LOCATION = 3, + EPHY_NODE_BMK_PROP_KEYWORDS = 4, + EPHY_NODE_KEYWORD_PROP_NAME = 5, + EPHY_NODE_BMK_PROP_ICON = 7, + EPHY_NODE_KEYWORD_PROP_PRIORITY = 8 }; struct EphyBookmarks { - GObject parent; + GObject parent; /*< private >*/ - EphyBookmarksPrivate *priv; + EphyBookmarksPrivate *priv; }; struct EphyBookmarksClass { - GObjectClass parent_class; + GObjectClass parent_class; - void (* tree_changed) (EphyBookmarks *eb); + void (* tree_changed) (EphyBookmarks *eb); }; -GType ephy_bookmarks_get_type (void); +GType ephy_bookmarks_get_type (void); -EphyBookmarks *ephy_bookmarks_new (void); +EphyBookmarks *ephy_bookmarks_new (void); -EphyNode *ephy_bookmarks_get_from_id (EphyBookmarks *eb, - long id); +EphyNode *ephy_bookmarks_get_from_id (EphyBookmarks *eb, + long id); + +EggToolbarsModel *ephy_bookmarks_get_toolbars_model (EphyBookmarks *eb); /* Bookmarks */ -EphyNode *ephy_bookmarks_add (EphyBookmarks *eb, - const char *title, - const char *url); +EphyNode *ephy_bookmarks_add (EphyBookmarks *eb, + const char *title, + const char *url); -EphyNode* ephy_bookmarks_find_bookmark (EphyBookmarks *eb, - const char *url); +EphyNode* ephy_bookmarks_find_bookmark (EphyBookmarks *eb, + const char *url); -void ephy_bookmarks_set_icon (EphyBookmarks *eb, - const char *url, - const char *icon); +void ephy_bookmarks_set_icon (EphyBookmarks *eb, + const char *url, + const char *icon); -void ephy_bookmarks_set_address (EphyBookmarks *eb, - EphyNode *bookmark, - const char *address); +void ephy_bookmarks_set_address (EphyBookmarks *eb, + EphyNode *bookmark, + const char *address); -char *ephy_bookmarks_solve_smart_url (EphyBookmarks *eb, - const char *smart_url, - const char *content); +char *ephy_bookmarks_solve_smart_url (EphyBookmarks *eb, + const char *smart_url, + const char *content); /* Keywords */ -EphyNode *ephy_bookmarks_add_keyword (EphyBookmarks *eb, - const char *name); +EphyNode *ephy_bookmarks_add_keyword (EphyBookmarks *eb, + const char *name); -EphyNode *ephy_bookmarks_find_keyword (EphyBookmarks *eb, - const char *name, - gboolean partial_match); +EphyNode *ephy_bookmarks_find_keyword (EphyBookmarks *eb, + const char *name, + gboolean partial_match); -void ephy_bookmarks_remove_keyword (EphyBookmarks *eb, - EphyNode *keyword); +void ephy_bookmarks_remove_keyword (EphyBookmarks *eb, + EphyNode *keyword); -gboolean ephy_bookmarks_has_keyword (EphyBookmarks *eb, - EphyNode *keyword, - EphyNode *bookmark); +gboolean ephy_bookmarks_has_keyword (EphyBookmarks *eb, + EphyNode *keyword, + EphyNode *bookmark); -void ephy_bookmarks_set_keyword (EphyBookmarks *eb, - EphyNode *keyword, - EphyNode *bookmark); +void ephy_bookmarks_set_keyword (EphyBookmarks *eb, + EphyNode *keyword, + EphyNode *bookmark); -void ephy_bookmarks_unset_keyword (EphyBookmarks *eb, - EphyNode *keyword, - EphyNode *bookmark); +void ephy_bookmarks_unset_keyword (EphyBookmarks *eb, + EphyNode *keyword, + EphyNode *bookmark); -char *ephy_bookmarks_get_topic_uri (EphyBookmarks *eb, - EphyNode *node); +char *ephy_bookmarks_get_topic_uri (EphyBookmarks *eb, + EphyNode *node); /* Favorites */ -EphyNode *ephy_bookmarks_get_favorites (EphyBookmarks *eb); +EphyNode *ephy_bookmarks_get_favorites (EphyBookmarks *eb); /* Root */ -EphyNode *ephy_bookmarks_get_keywords (EphyBookmarks *eb); +EphyNode *ephy_bookmarks_get_keywords (EphyBookmarks *eb); -EphyNode *ephy_bookmarks_get_bookmarks (EphyBookmarks *eb); +EphyNode *ephy_bookmarks_get_bookmarks (EphyBookmarks *eb); -EphyNode *ephy_bookmarks_get_not_categorized (EphyBookmarks *eb); +EphyNode *ephy_bookmarks_get_not_categorized (EphyBookmarks *eb); -EphyNode *ephy_bookmarks_get_smart_bookmarks (EphyBookmarks *eb); +EphyNode *ephy_bookmarks_get_smart_bookmarks (EphyBookmarks *eb); G_END_DECLS diff --git a/src/bookmarks/ephy-bookmarksbar-model.c b/src/bookmarks/ephy-bookmarksbar-model.c index cc5bdf773..fc969fddc 100755 --- a/src/bookmarks/ephy-bookmarksbar-model.c +++ b/src/bookmarks/ephy-bookmarksbar-model.c @@ -188,9 +188,9 @@ ephy_bookmarksbar_model_add_bookmark (EphyBookmarksBarModel *model, name = ephy_bookmarksbar_model_get_action_name (model, id); egg_toolbars_model_add_item (EGG_TOOLBARS_MODEL (model), - toolbar_position, -1, name, - topic ? EPHY_DND_TOPIC_TYPE : - EPHY_DND_URL_TYPE); + toolbar_position, -1, name, + topic ? EPHY_DND_TOPIC_TYPE : + EPHY_DND_URL_TYPE); g_free (name); } @@ -198,19 +198,19 @@ void ephy_bookmarksbar_model_remove_bookmark (EphyBookmarksBarModel *model, long id) { -/* char *action_name; + char *action_name; int toolbar, position; action_name = ephy_bookmarksbar_model_get_action_name (model, id); g_return_if_fail (action_name != NULL); - if (get_toolbar_and_item_pos (model, action_name, &toolbar, &position)) + while (get_toolbar_and_item_pos (model, action_name, &toolbar, &position)) { egg_toolbars_model_remove_item (EGG_TOOLBARS_MODEL (model), toolbar, position); } - g_free (action_name);*/ + g_free (action_name); } gboolean @@ -285,74 +285,27 @@ update_flags_and_save_changes (EphyBookmarksBarModel *model) } static void -bookmark_destroy_cb (EphyNode *node, - EphyBookmarksBarModel *model) -{ - long id; - - id = ephy_node_get_id (node); - ephy_bookmarksbar_model_remove_bookmark (model, id); -} - -static void item_added_cb (EphyBookmarksBarModel *model, int toolbar_position, int position) { - EphyNode *node; - const char *i_name; - gboolean is_separator; - - egg_toolbars_model_item_nth (EGG_TOOLBARS_MODEL (model), toolbar_position, - position, &is_separator, &i_name, NULL); - if (!is_separator && g_str_has_prefix (i_name, "GoBookmark-")) - { - node = ephy_bookmarksbar_model_get_node (model, i_name); - g_return_if_fail (node != NULL); - - ephy_node_signal_connect_object (node, - EPHY_NODE_DESTROY, - (EphyNodeCallback) bookmark_destroy_cb, - G_OBJECT (model)); - } - save_changes (model); } static char * -impl_get_item_name (EggToolbarsModel *eggmodel, - const char *type, - const char *id) +impl_get_item_type (EggToolbarsModel *model, + GdkAtom type) { - EphyBookmarksBarModel *model = EPHY_BOOKMARKSBAR_MODEL (eggmodel); - EphyNode *node; - - if (strcmp (type, EPHY_DND_TOPIC_TYPE) == 0) + if (gdk_atom_intern (EPHY_DND_TOPIC_TYPE, FALSE) == type) { - char *uri; - - node = ephy_bookmarksbar_model_get_node (model, id); - g_return_val_if_fail (node != NULL, NULL); - - uri = ephy_bookmarks_get_topic_uri - (model->priv->bookmarks, node); - - return uri; + return g_strdup (EPHY_DND_TOPIC_TYPE); } - else if (strcmp (type, EPHY_DND_URL_TYPE) == 0) + else if (gdk_atom_intern (EPHY_DND_URL_TYPE, FALSE) == type) { - const char *name; - - node = ephy_bookmarksbar_model_get_node (model, id); - g_return_val_if_fail (node != NULL, NULL); - - name = ephy_node_get_property_string - (node, EPHY_NODE_BMK_PROP_LOCATION); - - return g_strdup (name); + return g_strdup (EPHY_DND_URL_TYPE); } - return EGG_TOOLBARS_MODEL_CLASS (parent_class)->get_item_name (eggmodel, type, id); + return EGG_TOOLBARS_MODEL_CLASS (parent_class)->get_item_type (model, type); } static char * @@ -422,19 +375,39 @@ impl_get_item_id (EggToolbarsModel *eggmodel, } static char * -impl_get_item_type (EggToolbarsModel *model, - GdkAtom type) +impl_get_item_data (EggToolbarsModel *eggmodel, + const char *type, + const char *id) { - if (gdk_atom_intern (EPHY_DND_TOPIC_TYPE, FALSE) == type) + EphyBookmarksBarModel *model = EPHY_BOOKMARKSBAR_MODEL (eggmodel); + EphyNode *node; + + if (strcmp (type, EPHY_DND_TOPIC_TYPE) == 0) { - return g_strdup (EPHY_DND_TOPIC_TYPE); + char *uri; + + node = ephy_bookmarksbar_model_get_node (model, id); + g_return_val_if_fail (node != NULL, NULL); + + uri = ephy_bookmarks_get_topic_uri + (model->priv->bookmarks, node); + + return uri; } - else if (gdk_atom_intern (EPHY_DND_URL_TYPE, FALSE) == type) + else if (strcmp (type, EPHY_DND_URL_TYPE) == 0) { - return g_strdup (EPHY_DND_URL_TYPE); + const char *name; + + node = ephy_bookmarksbar_model_get_node (model, id); + g_return_val_if_fail (node != NULL, NULL); + + name = ephy_node_get_property_string + (node, EPHY_NODE_BMK_PROP_LOCATION); + + return g_strdup (name); } - return EGG_TOOLBARS_MODEL_CLASS (parent_class)->get_item_type (model, type); + return EGG_TOOLBARS_MODEL_CLASS (parent_class)->get_item_data (eggmodel, type, id); } static void @@ -527,6 +500,9 @@ ephy_bookmarksbar_model_finalize (GObject *object) model->priv->timeout = 0; } + /* FIXME: instead of saving on exit, we should detect when items data changes */ + save_changes_idle (model); + g_free (model->priv->xml_file); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -572,9 +548,9 @@ ephy_bookmarksbar_model_class_init (EphyBookmarksBarModelClass *klass) object_class->set_property = ephy_bookmarksbar_model_set_property; object_class->get_property = ephy_bookmarksbar_model_get_property; - eggclass->get_item_name = impl_get_item_name; - eggclass->get_item_id = impl_get_item_id; eggclass->get_item_type = impl_get_item_type; + eggclass->get_item_id = impl_get_item_id; + eggclass->get_item_data = impl_get_item_data; g_object_class_install_property (object_class, PROP_BOOKMARKS, diff --git a/src/bookmarks/ephy-bookmarksbar-model.h b/src/bookmarks/ephy-bookmarksbar-model.h index ac39f9325..41c7efef3 100755 --- a/src/bookmarks/ephy-bookmarksbar-model.h +++ b/src/bookmarks/ephy-bookmarksbar-model.h @@ -51,25 +51,25 @@ struct EphyBookmarksBarModelClass EggToolbarsModelClass parent_class; }; -GType ephy_bookmarksbar_model_get_type (void); +GType ephy_bookmarksbar_model_get_type (void); -EggToolbarsModel *ephy_bookmarksbar_model_new (EphyBookmarks *bookmarks); +EggToolbarsModel *ephy_bookmarksbar_model_new (EphyBookmarks *bookmarks); -char *ephy_bookmarksbar_model_get_action_name (EphyBookmarksBarModel *model, - long id); +char *ephy_bookmarksbar_model_get_action_name (EphyBookmarksBarModel *model, + long id); -EphyNode *ephy_bookmarksbar_model_get_node (EphyBookmarksBarModel *model, - const char *action_name); +EphyNode *ephy_bookmarksbar_model_get_node (EphyBookmarksBarModel *model, + const char *action_name); -void ephy_bookmarksbar_model_add_bookmark (EphyBookmarksBarModel *model, - gboolean topic, - long id); +void ephy_bookmarksbar_model_add_bookmark (EphyBookmarksBarModel *model, + gboolean topic, + long id); -void ephy_bookmarksbar_model_remove_bookmark (EphyBookmarksBarModel *model, - long id); +void ephy_bookmarksbar_model_remove_bookmark (EphyBookmarksBarModel *model, + long id); -gboolean ephy_bookmarksbar_model_has_bookmark (EphyBookmarksBarModel *model, - long id); +gboolean ephy_bookmarksbar_model_has_bookmark (EphyBookmarksBarModel *model, + long id); G_END_DECLS diff --git a/src/bookmarks/ephy-bookmarksbar.c b/src/bookmarks/ephy-bookmarksbar.c index 144d7c25e..511b635fa 100644 --- a/src/bookmarks/ephy-bookmarksbar.c +++ b/src/bookmarks/ephy-bookmarksbar.c @@ -42,9 +42,8 @@ static GtkTargetEntry drag_targets[] = { - { EGG_TOOLBAR_ITEM_TYPE, 0, 0 }, - { EPHY_DND_TOPIC_TYPE, 0, 1 }, - { EPHY_DND_URL_TYPE, 0, 2 } + { EPHY_DND_TOPIC_TYPE, 0, 0 }, + { EPHY_DND_URL_TYPE, 0, 1 } }; static int n_drag_targets = G_N_ELEMENTS (drag_targets); @@ -145,30 +144,73 @@ go_location_cb (GtkAction *action, } } +static gboolean +remove_action_from_model (EggToolbarsModel *model, const char *name) +{ + int n_toolbars, n_items, t, i; + + n_toolbars = egg_toolbars_model_n_toolbars (model); + + for (t = 0; t < n_toolbars; t++) + { + n_items = egg_toolbars_model_n_items (model, t); + + for (i = 0; i < n_items; i++) + { + const char *i_name; + gboolean is_separator; + + egg_toolbars_model_item_nth (model, t , i, &is_separator, + &i_name, NULL); + g_return_val_if_fail (i_name != NULL, FALSE); + + if (strcmp (i_name, name) == 0) + { + egg_toolbars_model_remove_item (model, t, i); + + if (!remove_action_from_model (model, name)) + { + return FALSE; + } + } + } + } + + return FALSE; +} + static void bookmark_destroy_cb (EphyNode *node, EphyBookmarksBar *toolbar) { + EggToolbarsModel *model; GtkAction *action; char *name; long id; + + model = toolbar->priv->toolbars_model; id = ephy_node_get_id (node); name = ephy_bookmarksbar_model_get_action_name - (EPHY_BOOKMARKSBAR_MODEL (toolbar->priv->toolbars_model), - id); + (EPHY_BOOKMARKSBAR_MODEL (model), id); + remove_action_from_model (model, name); - action = gtk_action_group_get_action (toolbar->priv->action_group, name); - g_return_if_fail (action != NULL); + model = EGG_TOOLBARS_MODEL (ephy_shell_get_toolbars_model + (ephy_shell, FALSE)); + remove_action_from_model (model, name); - gtk_action_group_remove_action (toolbar->priv->action_group, action); + action = gtk_action_group_get_action (toolbar->priv->action_group, name); + if (action) + { + gtk_action_group_remove_action (toolbar->priv->action_group, action); + } g_free (name); } static void ephy_bookmarksbar_action_request (EggEditableToolbar *eggtoolbar, - const char *name) + const char *name) { EphyBookmarksBar *toolbar = EPHY_BOOKMARKSBAR (eggtoolbar); GtkAction *action = NULL; |