diff options
Diffstat (limited to 'src/bookmarks/ephy-bookmarks-ui.c')
-rw-r--r-- | src/bookmarks/ephy-bookmarks-ui.c | 602 |
1 files changed, 484 insertions, 118 deletions
diff --git a/src/bookmarks/ephy-bookmarks-ui.c b/src/bookmarks/ephy-bookmarks-ui.c index 0083fb4e5..ae801ff36 100644 --- a/src/bookmarks/ephy-bookmarks-ui.c +++ b/src/bookmarks/ephy-bookmarks-ui.c @@ -29,6 +29,7 @@ #include "ephy-open-tabs-action.h" #include "ephy-topic-factory-action.h" #include "ephy-bookmark-factory-action.h" +#include "ephy-bookmark-properties.h" #include "ephy-node-common.h" #include "ephy-link.h" #include "ephy-dnd.h" @@ -37,6 +38,8 @@ #include "ephy-string.h" #include "ephy-debug.h" #include "ephy-file-helpers.h" +#include "ephy-gui.h" +#include "egg-editable-toolbar.h" #include <string.h> #include <glib/gi18n.h> @@ -46,13 +49,14 @@ typedef struct { guint bookmarks_menu; - guint favorites_menu; + guint toolbar_menu; } BookmarksWindowData; static GString * bookmarks_menu_string = 0; -static GString * favorites_menu_string = 0; +static GHashTable *properties_dialogs = 0; + static GtkAction * find_action (GtkUIManager *manager, const char *name) @@ -95,30 +99,46 @@ activate_bookmarks_menu (GtkAction *action, EphyWindow *window) } static void -activate_favorites_menu (GtkAction *action, EphyWindow *window) +activate_bookmark_properties (GtkAction *action, EggEditableToolbar *etoolbar) { - BookmarksWindowData *data = g_object_get_data (G_OBJECT (window), BM_WINDOW_DATA_KEY); - if (data && !data->favorites_menu) - { - GtkUIManager *manager = GTK_UI_MANAGER (ephy_window_get_ui_manager (window)); - gtk_ui_manager_ensure_update (manager); - - if (!favorites_menu_string->len) - { - EphyBookmarks *eb = ephy_shell_get_bookmarks (ephy_shell); - EphyNode *favorites = ephy_bookmarks_get_favorites (eb); - - g_string_append (favorites_menu_string, - "<ui><menubar><menu name=\"GoMenu\" action=\"Go\">"); - ephy_bookmarks_menu_build (favorites_menu_string, favorites); - g_string_append (favorites_menu_string, "</menu></menubar></ui>"); - } - - data->favorites_menu = gtk_ui_manager_add_ui_from_string - (manager, favorites_menu_string->str, favorites_menu_string->len, 0); - - gtk_ui_manager_ensure_update (manager); - } + GtkWidget *widget = gtk_widget_get_ancestor + (egg_editable_toolbar_get_selected (etoolbar), GTK_TYPE_TOOL_ITEM); + GtkAction *baction = widget ? g_object_get_data (G_OBJECT (widget), "gtk-action") : NULL; + g_return_if_fail (EPHY_IS_BOOKMARK_ACTION (baction)); + ephy_bookmarks_ui_show_bookmark (GTK_WIDGET (etoolbar), + ephy_bookmark_action_get_bookmark + (EPHY_BOOKMARK_ACTION (baction))); +} + +static void +activate_bookmark_open_tab (GtkAction *action, EggEditableToolbar *etoolbar) +{ + GtkWidget *widget = gtk_widget_get_ancestor + (egg_editable_toolbar_get_selected (etoolbar), GTK_TYPE_TOOL_ITEM); + GtkAction *baction = widget ? g_object_get_data (G_OBJECT (widget), "gtk-action") : NULL; + g_return_if_fail (EPHY_IS_BOOKMARK_ACTION (baction)); + ephy_bookmark_action_activate (EPHY_BOOKMARK_ACTION (baction), widget, EPHY_LINK_NEW_TAB); +} + +static void +activate_bookmark_open_window (GtkAction *action, EggEditableToolbar *etoolbar) +{ + GtkWidget *widget = gtk_widget_get_ancestor + (egg_editable_toolbar_get_selected (etoolbar), GTK_TYPE_TOOL_ITEM); + GtkAction *baction = widget ? g_object_get_data (G_OBJECT (widget), "gtk-action") : NULL; + g_return_if_fail (EPHY_IS_BOOKMARK_ACTION (baction)); + ephy_bookmark_action_activate (EPHY_BOOKMARK_ACTION (baction), widget, EPHY_LINK_NEW_WINDOW); +} + +static void +selected_bookmark_action (EggEditableToolbar *etoolbar, + GParamSpec *pspec, + GtkAction *action) +{ + GtkWidget *widget = gtk_widget_get_ancestor (egg_editable_toolbar_get_selected (etoolbar), + GTK_TYPE_TOOL_ITEM); + GtkAction *baction = widget ? g_object_get_data (G_OBJECT (widget), "gtk-action") : NULL; + gtk_action_set_visible (action, EPHY_IS_BOOKMARK_ACTION (baction)); } static void @@ -136,20 +156,6 @@ erase_bookmarks_menu (EphyWindow *window) } static void -erase_favorites_menu (EphyWindow *window) -{ - BookmarksWindowData *data = g_object_get_data (G_OBJECT (window), BM_WINDOW_DATA_KEY); - GtkUIManager *manager = GTK_UI_MANAGER (ephy_window_get_ui_manager (window)); - - if (data != NULL && data->favorites_menu != 0) - { - gtk_ui_manager_remove_ui (manager, data->favorites_menu); - data->favorites_menu = 0; - } - g_string_truncate (favorites_menu_string, 0); -} - -static void tree_changed_cb (EphyBookmarks *bookmarks, EphyWindow *window) { erase_bookmarks_menu (window); @@ -159,7 +165,6 @@ static void node_added_cb (EphyNode *parent, EphyNode *child, EphyWindow *window) { erase_bookmarks_menu (window); - erase_favorites_menu (window); } static void @@ -168,7 +173,6 @@ node_changed_cb (EphyNode *parent, EphyNode *child, guint property_id, EphyWindo if (property_id == EPHY_NODE_KEYWORD_PROP_NAME || property_id == EPHY_NODE_BMK_PROP_TITLE) { erase_bookmarks_menu (window); - erase_favorites_menu (window); } } @@ -176,7 +180,6 @@ static void node_removed_cb (EphyNode *parent, EphyNode *child, guint index, EphyWindow *window) { erase_bookmarks_menu (window); - erase_favorites_menu (window); } void @@ -185,10 +188,10 @@ ephy_bookmarks_ui_attach_window (EphyWindow *window) EphyBookmarks *eb = ephy_shell_get_bookmarks (ephy_shell); EphyNode *bookmarks = ephy_bookmarks_get_bookmarks (eb); EphyNode *topics = ephy_bookmarks_get_keywords (eb); - EphyNode *favorites = ephy_bookmarks_get_favorites (eb); BookmarksWindowData *data = g_object_get_data (G_OBJECT (window), BM_WINDOW_DATA_KEY); GtkUIManager *manager = GTK_UI_MANAGER (ephy_window_get_ui_manager (window)); + EggEditableToolbar *etoolbar = EGG_EDITABLE_TOOLBAR (ephy_window_get_toolbar (window)); GtkActionGroup *actions; GtkAction *action; @@ -196,10 +199,13 @@ ephy_bookmarks_ui_attach_window (EphyWindow *window) data = g_new0 (BookmarksWindowData, 1); g_object_set_data_full (G_OBJECT (window), BM_WINDOW_DATA_KEY, data, g_free); + + /* Create the self-maintaining action groups for bookmarks and topics */ actions = ephy_bookmark_group_new (bookmarks); gtk_ui_manager_insert_action_group (manager, actions, 0); - g_signal_connect_swapped (G_OBJECT (actions), "open-link", - G_CALLBACK (ephy_link_open), G_OBJECT (window)); + g_signal_connect_object (G_OBJECT (actions), "open-link", + G_CALLBACK (ephy_link_open), G_OBJECT (window), + G_CONNECT_SWAPPED | G_CONNECT_AFTER); g_object_unref (G_OBJECT (actions)); actions = ephy_topic_group_new (topics, manager); @@ -208,12 +214,19 @@ ephy_bookmarks_ui_attach_window (EphyWindow *window) actions = ephy_open_tabs_group_new (topics); gtk_ui_manager_insert_action_group (manager, actions, 0); - g_signal_connect_swapped (G_OBJECT (actions), "open-link", - G_CALLBACK (ephy_link_open), G_OBJECT (window)); + g_signal_connect_object (G_OBJECT (actions), "open-link", + G_CALLBACK (ephy_link_open), G_OBJECT (window), + G_CONNECT_SWAPPED | G_CONNECT_AFTER); g_object_unref (G_OBJECT (actions)); + + /* Create and add an action group specifically foor bookmarks on the toolbar */ actions = gtk_action_group_new ("BookmarkToolbarActions"); + gtk_ui_manager_insert_action_group (manager, actions, 0); + g_object_unref (G_OBJECT (actions)); + + /* Add factory actions */ action = ephy_topic_factory_action_new ("AddTopicToToolbar"); gtk_action_group_add_action (actions, action); g_object_unref (action); @@ -222,23 +235,64 @@ ephy_bookmarks_ui_attach_window (EphyWindow *window) gtk_action_group_add_action (actions, action); g_object_unref (action); + + /* Add the dynamic 'related topic' action */ action = ephy_related_action_new (EPHY_LINK (window), manager, "RelatedTopic"); gtk_action_group_add_action (actions, action); g_object_unref (action); - gtk_ui_manager_insert_action_group (manager, actions, 0); - g_object_unref (G_OBJECT (actions)); + /* Add popup menu actions that are specific to the bookmark widgets */ + action = gtk_action_new ("ToolbarBookmarkProperties", _("Properties"), + _("Show properties for this bookmark"), GTK_STOCK_PROPERTIES); + g_signal_connect_object (G_OBJECT (action), "activate", + G_CALLBACK (activate_bookmark_properties), + G_OBJECT (etoolbar), 0); + g_signal_connect_object (G_OBJECT (etoolbar), "notify::selected", + G_CALLBACK (selected_bookmark_action), + G_OBJECT (action), 0); + gtk_action_group_add_action (actions, action); + g_object_unref (action); + + action = gtk_action_new ("ToolbarBookmarkOpenInTab", _("Open in New _Tab"), + _("Open this bookmark in a new tab"), NULL); + g_signal_connect_object (G_OBJECT (action), "activate", + G_CALLBACK (activate_bookmark_open_tab), + G_OBJECT (etoolbar), 0); + g_signal_connect_object (G_OBJECT (etoolbar), "notify::selected", + G_CALLBACK (selected_bookmark_action), + G_OBJECT (action), 0); + gtk_action_group_add_action (actions, action); + g_object_unref (action); + + action = gtk_action_new ("ToolbarBookmarkOpenInWindow", _("Open in New _Window"), + _("Open this bookmark in a new window"), NULL); + g_signal_connect_object (G_OBJECT (action), "activate", + G_CALLBACK (activate_bookmark_open_window), + G_OBJECT (etoolbar), 0); + g_signal_connect_object (G_OBJECT (etoolbar), "notify::selected", + G_CALLBACK (selected_bookmark_action), + G_OBJECT (action), 0); + gtk_action_group_add_action (actions, action); + g_object_unref (action); + + data->toolbar_menu = gtk_ui_manager_add_ui_from_string (manager, + "<popup name=\"ToolbarPopup\">" + "<separator/>" + "<menuitem action=\"ToolbarBookmarkOpenInTab\"/>" + "<menuitem action=\"ToolbarBookmarkOpenInWindow\"/>" + "<separator/>" + "<menuitem action=\"ToolbarBookmarkProperties\"/>" + "</popup>", -1, NULL); + + /* Add signal handlers for the bookmark database */ ephy_node_signal_connect_object (bookmarks, EPHY_NODE_CHILD_ADDED, (EphyNodeCallback)node_added_cb, G_OBJECT (window)); ephy_node_signal_connect_object (topics, EPHY_NODE_CHILD_ADDED, (EphyNodeCallback)node_added_cb, G_OBJECT (window)); - ephy_node_signal_connect_object (favorites, EPHY_NODE_CHILD_ADDED, - (EphyNodeCallback)node_added_cb, - G_OBJECT (window)); ephy_node_signal_connect_object (bookmarks, EPHY_NODE_CHILD_REMOVED, (EphyNodeCallback)node_removed_cb, @@ -246,9 +300,6 @@ ephy_bookmarks_ui_attach_window (EphyWindow *window) ephy_node_signal_connect_object (topics, EPHY_NODE_CHILD_REMOVED, (EphyNodeCallback)node_removed_cb, G_OBJECT (window)); - ephy_node_signal_connect_object (favorites, EPHY_NODE_CHILD_REMOVED, - (EphyNodeCallback)node_removed_cb, - G_OBJECT (window)); ephy_node_signal_connect_object (bookmarks, EPHY_NODE_CHILD_CHANGED, (EphyNodeCallback)node_changed_cb, @@ -261,17 +312,13 @@ ephy_bookmarks_ui_attach_window (EphyWindow *window) G_CALLBACK (tree_changed_cb), G_OBJECT (window), 0); - /* Build menus on demand. */ - if (!favorites_menu_string) favorites_menu_string = g_string_new (""); + + /* Setup empty menu strings and add signal handlers to build the menus on demand */ if (!bookmarks_menu_string) bookmarks_menu_string = g_string_new (""); action = find_action (manager, "Bookmarks"); g_signal_connect_object (G_OBJECT (action), "activate", G_CALLBACK (activate_bookmarks_menu), G_OBJECT (window), 0); - action = find_action (manager, "Go"); - g_signal_connect_object (G_OBJECT (action), "activate", - G_CALLBACK (activate_favorites_menu), - G_OBJECT (window), 0); } void @@ -280,7 +327,6 @@ ephy_bookmarks_ui_detach_window (EphyWindow *window) EphyBookmarks *eb = ephy_shell_get_bookmarks (ephy_shell); EphyNode *bookmarks = ephy_bookmarks_get_bookmarks (eb); EphyNode *topics = ephy_bookmarks_get_keywords (eb); - EphyNode *favorites = ephy_bookmarks_get_favorites (eb); BookmarksWindowData *data = g_object_get_data (G_OBJECT (window), BM_WINDOW_DATA_KEY); GtkUIManager *manager = GTK_UI_MANAGER (ephy_window_get_ui_manager (window)); @@ -288,7 +334,7 @@ ephy_bookmarks_ui_detach_window (EphyWindow *window) g_return_if_fail (data != 0); if (data->bookmarks_menu) gtk_ui_manager_remove_ui (manager, data->bookmarks_menu); - if (data->favorites_menu) gtk_ui_manager_remove_ui (manager, data->favorites_menu); + if (data->toolbar_menu) gtk_ui_manager_remove_ui (manager, data->toolbar_menu); g_object_set_data (G_OBJECT (window), BM_WINDOW_DATA_KEY, 0); ephy_node_signal_disconnect_object (bookmarks, EPHY_NODE_CHILD_ADDED, @@ -297,9 +343,6 @@ ephy_bookmarks_ui_detach_window (EphyWindow *window) ephy_node_signal_disconnect_object (topics, EPHY_NODE_CHILD_ADDED, (EphyNodeCallback)node_added_cb, G_OBJECT (window)); - ephy_node_signal_disconnect_object (favorites, EPHY_NODE_CHILD_ADDED, - (EphyNodeCallback)node_added_cb, - G_OBJECT (window)); ephy_node_signal_disconnect_object (bookmarks, EPHY_NODE_CHILD_REMOVED, (EphyNodeCallback)node_removed_cb, @@ -307,9 +350,6 @@ ephy_bookmarks_ui_detach_window (EphyWindow *window) ephy_node_signal_disconnect_object (topics, EPHY_NODE_CHILD_REMOVED, (EphyNodeCallback)node_removed_cb, G_OBJECT (window)); - ephy_node_signal_disconnect_object (favorites, EPHY_NODE_CHILD_REMOVED, - (EphyNodeCallback)node_removed_cb, - G_OBJECT (window)); ephy_node_signal_disconnect_object (bookmarks, EPHY_NODE_CHILD_CHANGED, (EphyNodeCallback)node_changed_cb, @@ -324,42 +364,356 @@ ephy_bookmarks_ui_detach_window (EphyWindow *window) action = find_action (manager, "Bookmarks"); g_signal_handlers_disconnect_by_func (G_OBJECT (action), G_CALLBACK (activate_bookmarks_menu), G_OBJECT (window)); +} + +static void +properties_dialog_destroy_cb (EphyBookmarkProperties *dialog, + gpointer user_data) +{ + g_hash_table_remove (properties_dialogs, ephy_bookmark_properties_get_node (dialog)); +} + +static void +add_bookmark (GtkWidget *parent, + const char *location, + const char *title) +{ + GtkWidget *dialog; + EphyBookmarks *bookmarks; + EphyNode *bookmark; - action = find_action (manager, "Go"); - g_signal_handlers_disconnect_by_func - (G_OBJECT (action), G_CALLBACK (activate_favorites_menu), G_OBJECT (window)); + bookmarks = ephy_shell_get_bookmarks (ephy_shell); + bookmark = ephy_bookmarks_add (bookmarks, title, location); + + if (properties_dialogs == 0) + { + properties_dialogs = g_hash_table_new (g_direct_hash, g_direct_equal); + } + + dialog = ephy_bookmark_properties_new (bookmarks, bookmark, TRUE); + if (parent != NULL) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent)); + + g_signal_connect (dialog, "destroy", + G_CALLBACK (properties_dialog_destroy_cb), bookmarks); + g_hash_table_insert (properties_dialogs, + bookmark, dialog); + + gtk_window_present (GTK_WINDOW (dialog)); } static void -toolbar_node_removed_cb (EphyNode *parent, EphyNode *child, guint index, EggToolbarsModel *model) +duplicate_bookmark_response_cb (GtkWidget *dialog, + int response, + EphyNode *node) { - gint i, j; - char *nid = NULL; - const char *id; + GtkWidget *parent; + parent = GTK_WIDGET (gtk_window_get_transient_for (GTK_WINDOW (dialog))); - switch (ephy_node_get_id (parent)) + if (response == GTK_RESPONSE_ACCEPT) { - case BOOKMARKS_NODE_ID: - nid = ephy_bookmark_action_name (child); - break; - case KEYWORDS_NODE_ID: - nid = ephy_topic_action_name (child); - break; - default: + ephy_bookmarks_ui_show_bookmark (parent, node); + } + else if (response == GTK_RESPONSE_REJECT) + { + const char *location = g_object_get_data (G_OBJECT (dialog), "location"); + const char *title = g_object_get_data (G_OBJECT (dialog), "title"); + add_bookmark (parent, location, title); + } + + gtk_widget_destroy (dialog); +} + +static void +dialog_node_destroy_cb (EphyNode *node, + GtkWidget *dialog) +{ + gtk_widget_destroy (dialog); +} + +void +ephy_bookmarks_ui_add_bookmark (GtkWidget *parent, + const char *location, + const char *title) +{ + EphyBookmarks *bookmarks; + EphyNode *bookmark; + + bookmarks = ephy_shell_get_bookmarks (ephy_shell); + bookmark = location ? ephy_bookmarks_find_bookmark (bookmarks, location) : NULL; + + if (bookmark != NULL) + { + GtkWidget *button, *dialog; + char *str; + + dialog = gtk_message_dialog_new_with_markup + (GTK_WINDOW (parent), GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, GTK_BUTTONS_NONE, + "<span weight=\"bold\" size=\"larger\">%s</span>", + _("Bookmark exists")); + + str = g_strdup_printf + (_("You already have a bookmark titled “%s” for this page."), + "<span weight=\"bold\">%s</span>"); + + gtk_message_dialog_format_secondary_markup + (GTK_MESSAGE_DIALOG (dialog), str, + ephy_node_get_property_string (bookmark, EPHY_NODE_BMK_PROP_TITLE)); + + g_free (str); + + button = gtk_dialog_add_button (GTK_DIALOG (dialog), + _("_Create New"), GTK_RESPONSE_REJECT); + gtk_button_set_image (GTK_BUTTON (button), + gtk_image_new_from_stock + (GTK_STOCK_NEW, GTK_ICON_SIZE_BUTTON)); + + button = gtk_dialog_add_button (GTK_DIALOG (dialog), + _("_View Properties"), GTK_RESPONSE_ACCEPT); + gtk_button_set_image (GTK_BUTTON (button), + gtk_image_new_from_stock + (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_BUTTON)); + + gtk_dialog_add_button (GTK_DIALOG (dialog), + GTK_STOCK_OK, GTK_RESPONSE_OK); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + + gtk_window_set_title (GTK_WINDOW (dialog), _("Bookmark Exists")); + gtk_window_set_icon_name (GTK_WINDOW (dialog), "web-browser"); + + g_object_set_data_full (G_OBJECT (dialog), "location", g_strdup (location), g_free); + g_object_set_data_full (G_OBJECT (dialog), "title", g_strdup (title), g_free); + + g_signal_connect (G_OBJECT (dialog), + "response", + G_CALLBACK (duplicate_bookmark_response_cb), + bookmark); + + ephy_node_signal_connect_object (bookmark, EPHY_NODE_DESTROY, + (EphyNodeCallback) dialog_node_destroy_cb, + G_OBJECT (dialog)); + + gtk_window_present (GTK_WINDOW (dialog)); + } + else + { + add_bookmark (parent, location, title); + } +} + +static EphyNode * +ephy_bookmarks_ui_find_topic (const char *name) +{ + EphyBookmarks *bookmarks; + GPtrArray *children; + EphyNode *node; + int i; + + bookmarks = ephy_shell_get_bookmarks (ephy_shell); + node = ephy_bookmarks_get_keywords (bookmarks); + children = ephy_node_get_children (node); + node = NULL; + for (i = 0; i < children->len; i++) + { + const char *title; + + node = g_ptr_array_index (children, i); + title = ephy_node_get_property_string (node, EPHY_NODE_KEYWORD_PROP_NAME); + + if (g_utf8_collate (title, name) == 0) + { + return node; + } + } + + return NULL; +} + +static void +add_topic_changed_cb (GtkEditable *editable, + GtkDialog *dialog) +{ + const char *title = gtk_entry_get_text (GTK_ENTRY (editable)); + gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, *title != 0); +} + +static void +duplicate_topic_response_cb (GtkWidget *dialog, + int response, + EphyNode *node) +{ + gtk_widget_destroy (dialog); +} + +static void +add_topic_response_cb (GtkWidget *dialog, + int response, + EphyNode *bookmark) +{ + if (response == GTK_RESPONSE_OK) + { + EphyBookmarks *bookmarks; + GtkEntry *entry; + EphyNode *topic; + const char *name; + + entry = g_object_get_data (G_OBJECT (dialog), "name"); + name = gtk_entry_get_text (entry); + g_return_if_fail (name && *name); + + topic = ephy_bookmarks_ui_find_topic (name); + if (topic != NULL) + { + GtkWidget *message; + char *str = g_strdup_printf + (_("You already have a topic named “%s”.\nPlease use a new topic name."), + "<span weight=\"bold\">%s</span>"); + + message = gtk_message_dialog_new_with_markup + (GTK_WINDOW (dialog), GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, str, + ephy_node_get_property_string (topic, EPHY_NODE_KEYWORD_PROP_NAME)); + + g_free (str); + + g_signal_connect (message, "response", + G_CALLBACK (duplicate_topic_response_cb), + bookmark); + + gtk_window_group_add_window + (ephy_gui_ensure_window_group (GTK_WINDOW (dialog)), GTK_WINDOW (message)); + gtk_window_present (GTK_WINDOW (message)); + return; + } + + + bookmarks = ephy_shell_get_bookmarks (ephy_shell); + topic = ephy_bookmarks_add_keyword (bookmarks, name); + ephy_bookmarks_set_keyword (bookmarks, topic, bookmark); } + + gtk_widget_destroy (dialog); +} - for (i=egg_toolbars_model_n_toolbars(model)-1; i>=0; i--) - for (j=egg_toolbars_model_n_items(model, i)-1; j>=0; j--) - { - id = egg_toolbars_model_item_nth (model, i, j); - if (!strcmp (id, nid)) - { - egg_toolbars_model_remove_item (model, i, j); - } - } +void +ephy_bookmarks_ui_add_topic (GtkWidget *parent, + EphyNode *bookmark) +{ + GtkWidget *dialog, *hbox, *entry, *label; + GtkContainer *container; + GList *children; + + if (bookmark != NULL) + { + char *str = g_strdup_printf + ("<span weight=\"bold\" size=\"larger\">%s</span>", _("New topic for “%s”")); + + dialog = gtk_message_dialog_new_with_markup + (GTK_WINDOW (parent), GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, + str, ephy_node_get_property_string (bookmark, EPHY_NODE_BMK_PROP_TITLE)); + + g_free (str); + } + else + { + dialog = gtk_message_dialog_new_with_markup + (GTK_WINDOW (parent), GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, + "<span weight=\"bold\" size=\"larger\">%s</span>", _("New topic")); + } - free (nid); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("Enter a unique name for the topic.")); + + hbox = gtk_hbox_new (FALSE, 12); + gtk_widget_show (hbox); + + entry = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + gtk_widget_show (entry); + + label = gtk_label_new_with_mnemonic ("_Name:"); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); + gtk_widget_show (label); + + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0); + + /* Get the hbox which is the first child of the main vbox */ + children = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox)); + container = GTK_CONTAINER (children->data); + g_list_free (children); + + /* Get the vbox which is the second child of the hbox */ + children = gtk_container_get_children (container); + container = GTK_CONTAINER (children->next->data); + g_list_free (children); + + gtk_container_add (container, hbox); + g_object_set_data (G_OBJECT (dialog), "name", entry); + + gtk_dialog_add_button (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + gtk_dialog_add_button (GTK_DIALOG (dialog), + _("Create"), GTK_RESPONSE_OK); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + + gtk_window_set_title (GTK_WINDOW (dialog), _("New Topic")); + gtk_window_set_icon_name (GTK_WINDOW (dialog), "web-browser"); + + g_signal_connect (G_OBJECT (dialog), + "response", + G_CALLBACK (add_topic_response_cb), + bookmark); + + g_signal_connect (G_OBJECT (entry), + "changed", + G_CALLBACK (add_topic_changed_cb), + dialog); + + add_topic_changed_cb (GTK_EDITABLE (entry), GTK_DIALOG (dialog)); + + ephy_node_signal_connect_object (bookmark, EPHY_NODE_DESTROY, + (EphyNodeCallback) dialog_node_destroy_cb, + G_OBJECT (dialog)); + + gtk_window_group_add_window + (ephy_gui_ensure_window_group (GTK_WINDOW (parent)), GTK_WINDOW (dialog)); + gtk_window_present (GTK_WINDOW (dialog)); +} + +void +ephy_bookmarks_ui_show_bookmark (GtkWidget *parent, + EphyNode *bookmark) +{ + EphyBookmarks *bookmarks = ephy_shell_get_bookmarks (ephy_shell); + GtkWidget *dialog; + + g_return_if_fail (EPHY_IS_BOOKMARKS (bookmarks)); + g_return_if_fail (EPHY_IS_NODE (bookmark)); + + if (properties_dialogs == 0) + { + properties_dialogs = g_hash_table_new (g_direct_hash, g_direct_equal); + } + + dialog = g_hash_table_lookup (properties_dialogs, bookmark); + + if (dialog == NULL) + { + dialog = ephy_bookmark_properties_new (bookmarks, bookmark, FALSE); + + g_signal_connect (dialog, "destroy", + G_CALLBACK (properties_dialog_destroy_cb), bookmarks); + g_hash_table_insert (properties_dialogs, + bookmark, dialog); + } + + parent = gtk_widget_get_ancestor (parent, GTK_TYPE_WINDOW); + if (parent != NULL) gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent)); + gtk_window_present (GTK_WINDOW (dialog)); } /* Below this line we have functions relating to toolbar code */ @@ -375,7 +729,7 @@ topic_has_data (EggToolbarsItemType *type, EphyNode *node, *topics; guint node_id; - if (sscanf (name, "OpenTopic%u", &node_id) != 1 || + if (sscanf (name, "OpenTopic%u", &node_id) != 1 && sscanf (name, "Tpc%u", &node_id) != 1) return FALSE; node = ephy_bookmarks_get_from_id (eb, node_id); if (!node) return FALSE; @@ -390,7 +744,7 @@ topic_get_data (EggToolbarsItemType *type, EphyNode *node; guint node_id; - if (sscanf (name, "OpenTopic%u", &node_id) != 1 || + if (sscanf (name, "OpenTopic%u", &node_id) != 1 && sscanf (name, "Tpc%u", &node_id) != 1) return NULL; node = ephy_bookmarks_get_from_id (eb, node_id); if (!node) return NULL; @@ -414,7 +768,7 @@ bookmark_has_data (EggToolbarsItemType *type, EphyNode *node; guint node_id; - if (sscanf (name, "OpenBmk%u", &node_id) != 1 || + if (sscanf (name, "OpenBmk%u", &node_id) != 1 && sscanf (name, "Bmk%u", &node_id) != 1) return FALSE; node = ephy_bookmarks_get_from_id (eb, node_id); if (!node) return FALSE; @@ -429,7 +783,7 @@ bookmark_get_data (EggToolbarsItemType *type, EphyNode *node; guint node_id; - if (sscanf (name, "OpenBmk%u", &node_id) != 1 || + if (sscanf (name, "OpenBmk%u", &node_id) != 1 && sscanf (name, "Bmk%u", &node_id) != 1) return NULL; node = ephy_bookmarks_get_from_id (eb, node_id); if (!node) return NULL; @@ -462,11 +816,8 @@ static char * bookmark_new_name (EggToolbarsItemType *type, const char *data) { - EphyHistory *gh; EphyNode *node; gchar **netscape_url; - const char *icon; - const char *title; netscape_url = g_strsplit (data, "\n", 2); if (!netscape_url || !netscape_url[0]) @@ -475,28 +826,43 @@ bookmark_new_name (EggToolbarsItemType *type, return NULL; } - title = netscape_url[1]; - if (title == NULL || title[0] == '\0') - { - title = _("Untitled"); - } + node = ephy_bookmarks_add (eb, netscape_url[1], netscape_url[0]); - node = ephy_bookmarks_add (eb, title, netscape_url[0]); + g_strfreev (netscape_url); - if (node != NULL) - { - gh = EPHY_HISTORY (ephy_embed_shell_get_global_history (embed_shell)); - icon = ephy_history_get_icon (gh, netscape_url[0]); + return ephy_bookmark_action_name (node); +} - if (icon) - { - ephy_bookmarks_set_icon (eb, netscape_url[0], icon); - } +static void +toolbar_node_removed_cb (EphyNode *parent, EphyNode *child, guint index, EggToolbarsModel *model) +{ + gint i, j; + char *nid = NULL; + const char *id; + + switch (ephy_node_get_id (parent)) + { + case BOOKMARKS_NODE_ID: + nid = ephy_bookmark_action_name (child); + break; + case KEYWORDS_NODE_ID: + nid = ephy_topic_action_name (child); + break; + default: + return; } - g_strfreev (netscape_url); - - return ephy_bookmark_action_name (node); + for (i=egg_toolbars_model_n_toolbars(model)-1; i>=0; i--) + for (j=egg_toolbars_model_n_items(model, i)-1; j>=0; j--) + { + id = egg_toolbars_model_item_nth (model, i, j); + if (!strcmp (id, nid)) + { + egg_toolbars_model_remove_item (model, i, j); + } + } + + free (nid); } void |