From dff9e866bb4f2fc18074d5c638733ee860746f9b Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Wed, 29 Jan 2003 21:06:40 +0000 Subject: Complete (or nearly) toolbar editor implementation. Bookmarks are 2003-01-29 Marco Pesenti Gritti * lib/ephy-bonobo-extensions.c: (ephy_bonobo_clear_path), (ephy_bonobo_replace_path): * lib/ephy-bonobo-extensions.h: * lib/ephy-marshal.list: * lib/ephy-string.c: (ephy_str_to_int): * lib/ephy-string.h: * lib/widgets/ephy-editable-toolbar.c: (impl_get_action), (add_action), (parse_item_list), (add_toolbar), (parse_toolbars), (load_defaults), (load_toolbar), (drag_data_received_cb), (setup_toolbar_drag), (ensure_toolbars_min_size), (do_merge), (ephy_editable_toolbar_class_init), (editor_get_dimensions), (hide_editor), (editor_close_cb), (editor_add_toolbar_cb), (editor_drag_data_received_cb), (editor_drag_data_delete_cb), (setup_editor), (button_press_cb), (show_editor), (ephy_editable_toolbar_edit), (ephy_editable_toolbar_get_action): * lib/widgets/ephy-editable-toolbar.h: * src/bookmarks/ephy-bookmarks.c: (ephy_bookmarks_get_bookmark_id): * src/bookmarks/ephy-bookmarks.h: * src/session.c: (session_load): * src/toolbar.c: (go_location_cb), (toolbar_get_action), (toolbar_class_init), (toolbar_init): Complete (or nearly) toolbar editor implementation. Bookmarks are implemented too, but some minor problems are stopping them to work. --- ChangeLog | 28 ++ lib/ephy-bonobo-extensions.c | 622 +----------------------------------- lib/ephy-bonobo-extensions.h | 76 ----- lib/ephy-string.c | 4 +- lib/ephy-string.h | 2 +- lib/widgets/ephy-editable-toolbar.c | 376 +++++++++++++++++----- lib/widgets/ephy-editable-toolbar.h | 18 +- src/bookmarks/ephy-bookmarks.c | 20 ++ src/bookmarks/ephy-bookmarks.h | 3 + src/session.c | 2 +- src/toolbar.c | 94 +++--- 11 files changed, 420 insertions(+), 825 deletions(-) diff --git a/ChangeLog b/ChangeLog index a90e449fb..8ec581e13 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +2003-01-29 Marco Pesenti Gritti + + * lib/ephy-bonobo-extensions.c: (ephy_bonobo_clear_path), + (ephy_bonobo_replace_path): + * lib/ephy-bonobo-extensions.h: + * lib/ephy-marshal.list: + * lib/ephy-string.c: (ephy_str_to_int): + * lib/ephy-string.h: + * lib/widgets/ephy-editable-toolbar.c: (impl_get_action), + (add_action), (parse_item_list), (add_toolbar), (parse_toolbars), + (load_defaults), (load_toolbar), (drag_data_received_cb), + (setup_toolbar_drag), (ensure_toolbars_min_size), (do_merge), + (ephy_editable_toolbar_class_init), (editor_get_dimensions), + (hide_editor), (editor_close_cb), (editor_add_toolbar_cb), + (editor_drag_data_received_cb), (editor_drag_data_delete_cb), + (setup_editor), (button_press_cb), (show_editor), + (ephy_editable_toolbar_edit), (ephy_editable_toolbar_get_action): + * lib/widgets/ephy-editable-toolbar.h: + * src/bookmarks/ephy-bookmarks.c: (ephy_bookmarks_get_bookmark_id): + * src/bookmarks/ephy-bookmarks.h: + * src/session.c: (session_load): + * src/toolbar.c: (go_location_cb), (toolbar_get_action), + (toolbar_class_init), (toolbar_init): + + Complete (or nearly) toolbar editor implementation. + Bookmarks are implemented too, but some minor problems + are stopping them to work. + 2003-01-29 Christian Neumair * src/window-commands.c: Changed Copyright notice. diff --git a/lib/ephy-bonobo-extensions.c b/lib/ephy-bonobo-extensions.c index efc43ed60..590be941c 100644 --- a/lib/ephy-bonobo-extensions.c +++ b/lib/ephy-bonobo-extensions.c @@ -39,67 +39,6 @@ #include #include -typedef enum { - NUMBERED_MENU_ITEM_PLAIN, - NUMBERED_MENU_ITEM_TOGGLE, - NUMBERED_MENU_ITEM_RADIO -} NumberedMenuItemType; - -void -ephy_bonobo_set_accelerator (BonoboUIComponent *ui, - const char *path, - const char *accelerator) -{ - if (bonobo_ui_component_get_container (ui)) /* should not do this here... */ - { - bonobo_ui_component_set_prop (ui, path, "accel", accelerator, NULL); - } -} - -void -ephy_bonobo_set_label (BonoboUIComponent *ui, - const char *path, - const char *label) -{ - if (bonobo_ui_component_get_container (ui)) /* should not do this here... */ - { - bonobo_ui_component_set_prop (ui, path, "label", label, NULL); - } -} - -void -ephy_bonobo_set_tip (BonoboUIComponent *ui, - const char *path, - const char *tip) -{ - if (bonobo_ui_component_get_container (ui)) /* should not do this here... */ - { - bonobo_ui_component_set_prop (ui, path, "tip", tip, NULL); - } -} - -void -ephy_bonobo_set_sensitive (BonoboUIComponent *ui, - const char *path, - gboolean sensitive) -{ - if (bonobo_ui_component_get_container (ui)) /* should not do this here... */ - { - bonobo_ui_component_set_prop (ui, path, "sensitive", sensitive ? "1" : "0", NULL); - } -} - -void -ephy_bonobo_set_toggle_state (BonoboUIComponent *ui, - const char *path, - gboolean state) -{ - if (bonobo_ui_component_get_container (ui)) /* should not do this here... */ - { - bonobo_ui_component_set_prop (ui, path, "state", state ? "1" : "0", NULL); - } -} - void ephy_bonobo_set_hidden (BonoboUIComponent *ui, const char *path, @@ -111,535 +50,16 @@ ephy_bonobo_set_hidden (BonoboUIComponent *ui, } } -char * -ephy_bonobo_get_label (BonoboUIComponent *ui, - const char *path) -{ - if (bonobo_ui_component_get_container (ui)) /* should not do this here... */ - { - return bonobo_ui_component_get_prop (ui, path, "label", NULL); - } - else - { - return NULL; - } -} - -gboolean -ephy_bonobo_get_hidden (BonoboUIComponent *ui, - const char *path) -{ - char *value; - gboolean hidden; - CORBA_Environment ev; - - g_return_val_if_fail (BONOBO_IS_UI_COMPONENT (ui), FALSE); - g_return_val_if_fail (path != NULL, FALSE); - - CORBA_exception_init (&ev); - value = bonobo_ui_component_get_prop (ui, path, "hidden", &ev); - CORBA_exception_free (&ev); - - if (value == NULL) { - /* No hidden attribute means not hidden. */ - hidden = FALSE; - } else { - /* Anything other than "0" counts as TRUE */ - hidden = strcmp (value, "0") != 0; - g_free (value); - } - - return hidden; -} - -static char * -get_numbered_menu_item_name (guint index) -{ - return g_strdup_printf ("%u", index); -} - -char * -ephy_bonobo_get_numbered_menu_item_path (BonoboUIComponent *ui, - const char *container_path, - guint index) -{ - char *item_name; - char *item_path; - - g_return_val_if_fail (BONOBO_IS_UI_COMPONENT (ui), NULL); - g_return_val_if_fail (container_path != NULL, NULL); - - item_name = get_numbered_menu_item_name (index); - item_path = g_strconcat (container_path, "/", item_name, NULL); - g_free (item_name); - - return item_path; -} - -char * -ephy_bonobo_get_numbered_menu_item_command (BonoboUIComponent *ui, - const char *container_path, - guint index) -{ - char *command_name; - char *path; - - g_return_val_if_fail (BONOBO_IS_UI_COMPONENT (ui), NULL); - g_return_val_if_fail (container_path != NULL, NULL); - - path = ephy_bonobo_get_numbered_menu_item_path (ui, container_path, index); - command_name = gnome_vfs_escape_string (path); - g_free (path); - - return command_name; -} - -guint -ephy_bonobo_get_numbered_menu_item_index_from_command (const char *command) -{ - char *path; - char *index_string; - int index; - gboolean got_index; - - path = gnome_vfs_unescape_string (command, NULL); - index_string = strrchr (path, '/'); - - if (index_string == NULL) { - got_index = FALSE; - } else { - got_index = ephy_str_to_int (index_string + 1, &index); - } - g_free (path); - - g_return_val_if_fail (got_index, 0); - - return index; -} - -char * -ephy_bonobo_get_numbered_menu_item_container_path_from_command (const char *command) -{ - char *path; - char *index_string; - char *container_path; - - path = gnome_vfs_unescape_string (command, NULL); - index_string = strrchr (path, '/'); - - container_path = index_string == NULL - ? NULL - : g_strndup (path, index_string - path); - g_free (path); - - return container_path; -} - -static char * -ephy_bonobo_add_numbered_menu_item_internal (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - NumberedMenuItemType type, - GdkPixbuf *pixbuf, - const char *radio_group_name) -{ - char *xml_item, *xml_command; - char *command_name; - char *item_name, *pixbuf_data; - char *path; - - g_assert (BONOBO_IS_UI_COMPONENT (ui)); - g_assert (container_path != NULL); - g_assert (label != NULL); - g_assert (type == NUMBERED_MENU_ITEM_PLAIN || pixbuf == NULL); - g_assert (type == NUMBERED_MENU_ITEM_RADIO || radio_group_name == NULL); - g_assert (type != NUMBERED_MENU_ITEM_RADIO || radio_group_name != NULL); - - item_name = get_numbered_menu_item_name (index); - command_name = ephy_bonobo_get_numbered_menu_item_command - (ui, container_path, index); - - switch (type) { - case NUMBERED_MENU_ITEM_TOGGLE: - xml_item = g_strdup_printf ("\n", - item_name, command_name); - break; - case NUMBERED_MENU_ITEM_RADIO: - xml_item = g_strdup_printf ("\n", - item_name, command_name, radio_group_name); - break; - case NUMBERED_MENU_ITEM_PLAIN: - if (pixbuf != NULL) { - pixbuf_data = bonobo_ui_util_pixbuf_to_xml (pixbuf); - xml_item = g_strdup_printf ("\n", - item_name, command_name, pixbuf_data); - g_free (pixbuf_data); - } else { - xml_item = g_strdup_printf ("\n", - item_name, command_name); - } - break; - default: - g_assert_not_reached (); - xml_item = NULL; /* keep compiler happy */ - } - - g_free (item_name); - - bonobo_ui_component_set (ui, container_path, xml_item, NULL); - - g_free (xml_item); - - path = ephy_bonobo_get_numbered_menu_item_path (ui, container_path, index); - ephy_bonobo_set_label (ui, path, label); - g_free (path); - - /* Make the command node here too, so callers can immediately set - * properties on it (otherwise it doesn't get created until some - * time later). - */ - xml_command = g_strdup_printf ("\n", command_name); - bonobo_ui_component_set (ui, "/commands", xml_command, NULL); - g_free (xml_command); - - g_free (command_name); - - return item_name; -} - -/* Add a menu item specified by number into a given path. Used for - * dynamically creating a related series of menu items. Each index - * must be unique (normal use is to call this in a loop, and - * increment the index for each item). - */ -void -ephy_bonobo_add_numbered_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - GdkPixbuf *pixbuf) -{ - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - g_return_if_fail (label != NULL); - - ephy_bonobo_add_numbered_menu_item_internal (ui, container_path, index, label, - NUMBERED_MENU_ITEM_PLAIN, pixbuf, NULL); -} - -/* Add a menu item specified by number into a given path. Used for - * dynamically creating a related series of toggle menu items. Each index - * must be unique (normal use is to call this in a loop, and - * increment the index for each item). - */ -void -ephy_bonobo_add_numbered_toggle_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label) -{ - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - g_return_if_fail (label != NULL); - - ephy_bonobo_add_numbered_menu_item_internal (ui, container_path, index, label, - NUMBERED_MENU_ITEM_TOGGLE, NULL, NULL); -} - -/* Add a menu item specified by number into a given path. Used for - * dynamically creating a related series of radio menu items. Each index - * must be unique (normal use is to call this in a loop, and - * increment the index for each item). - */ -void -ephy_bonobo_add_numbered_radio_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - const char *radio_group_name) -{ - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - g_return_if_fail (label != NULL); - - ephy_bonobo_add_numbered_menu_item_internal (ui, container_path, index, label, - NUMBERED_MENU_ITEM_RADIO, NULL, radio_group_name); -} - -void -ephy_bonobo_add_numbered_submenu (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - GdkPixbuf *pixbuf) -{ - char *xml_string, *item_name, *pixbuf_data, *submenu_path, *command_name; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - g_return_if_fail (label != NULL); - g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); - - item_name = get_numbered_menu_item_name (index); - command_name = ephy_bonobo_get_numbered_menu_item_command (ui, container_path, index); - - if (pixbuf != NULL) { - pixbuf_data = bonobo_ui_util_pixbuf_to_xml (pixbuf); - xml_string = g_strdup_printf ("\n", - item_name, pixbuf_data, command_name); - g_free (pixbuf_data); - } else { - xml_string = g_strdup_printf ("\n", item_name, - command_name); - } - - bonobo_ui_component_set (ui, container_path, xml_string, NULL); - - g_free (xml_string); - - submenu_path = ephy_bonobo_get_numbered_menu_item_path (ui, container_path, index); - ephy_bonobo_set_label (ui, submenu_path, label); - g_free (submenu_path); - - g_free (item_name); - g_free (command_name); -} - -void -ephy_bonobo_add_numbered_submenu_no_verb (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - GdkPixbuf *pixbuf) -{ - char *xml_string, *item_name, *pixbuf_data, *submenu_path; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - g_return_if_fail (label != NULL); - g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); - - item_name = get_numbered_menu_item_name (index); - - if (pixbuf != NULL) { - pixbuf_data = bonobo_ui_util_pixbuf_to_xml (pixbuf); - xml_string = g_strdup_printf ("\n", - item_name, pixbuf_data); - g_free (pixbuf_data); - } else { - xml_string = g_strdup_printf ("\n", item_name); - } - - bonobo_ui_component_set (ui, container_path, xml_string, NULL); - - g_free (xml_string); - - submenu_path = ephy_bonobo_get_numbered_menu_item_path (ui, container_path, index); - ephy_bonobo_set_label (ui, submenu_path, label); - g_free (submenu_path); - - g_free (item_name); -} - -void -ephy_bonobo_add_submenu (BonoboUIComponent *ui, - const char *path, - const char *label, - GdkPixbuf *pixbuf) -{ - char *xml_string, *name, *pixbuf_data, *submenu_path; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (path != NULL); - g_return_if_fail (label != NULL); - g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); - - /* Labels may contain characters that are illegal in names. So - * we create the name by URI-encoding the label. - */ - name = gnome_vfs_escape_string (label); - - if (pixbuf != NULL) { - pixbuf_data = bonobo_ui_util_pixbuf_to_xml (pixbuf); - xml_string = g_strdup_printf ("\n", - name, pixbuf_data); - g_free (pixbuf_data); - } else { - xml_string = g_strdup_printf ("\n", name); - } - - bonobo_ui_component_set (ui, path, xml_string, NULL); - - g_free (xml_string); - - submenu_path = g_strconcat (path, "/", name, NULL); - ephy_bonobo_set_label (ui, submenu_path, label); - g_free (submenu_path); - - g_free (name); -} - -void -ephy_bonobo_add_menu_separator (BonoboUIComponent *ui, const char *path) -{ - static gint hack = 0; - gchar *xml; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (path != NULL); - - xml = g_strdup_printf ("", ++hack); - bonobo_ui_component_set (ui, path, xml, NULL); - g_free (xml); -} - static void -remove_commands (BonoboUIComponent *ui, const char *container_path) +ephy_bonobo_clear_path (BonoboUIComponent *uic, + const gchar *path) { - BonoboUINode *path_node; - BonoboUINode *child_node; - char *verb_name; - char *id_name; - - path_node = bonobo_ui_component_get_tree (ui, container_path, TRUE, NULL); - if (path_node == NULL) { - return; - } - - bonobo_ui_component_freeze (ui, NULL); - - for (child_node = bonobo_ui_node_children (path_node); - child_node != NULL; - child_node = bonobo_ui_node_next (child_node)) { - verb_name = bonobo_ui_node_get_attr (child_node, "verb"); - if (verb_name != NULL) { - bonobo_ui_component_remove_verb (ui, verb_name); - bonobo_ui_node_free_string (verb_name); - } else { - /* Only look for an id if there's no verb */ - id_name = bonobo_ui_node_get_attr (child_node, "id"); - if (id_name != NULL) { - bonobo_ui_component_remove_listener (ui, id_name); - bonobo_ui_node_free_string (id_name); - } - } + if (bonobo_ui_component_path_exists (uic, path, NULL)) + { + char *remove_wildcard = g_strdup_printf ("%s/*", path); + bonobo_ui_component_rm (uic, remove_wildcard, NULL); + g_free (remove_wildcard); } - - bonobo_ui_component_thaw (ui, NULL); - - bonobo_ui_node_free (path_node); -} - -/** - * ephy_bonobo_remove_menu_items_and_verbs - * - * Removes all menu items contained in a menu or placeholder, and - * their verbs. - * - * @uih: The BonoboUIHandler for this menu item. - * @container_path: The standard bonobo-style path specifier for this placeholder or submenu. - */ -void -ephy_bonobo_remove_menu_items_and_commands (BonoboUIComponent *ui, - const char *container_path) -{ - char *remove_wildcard; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (container_path != NULL); - - remove_commands (ui, container_path); - - /* For speed, remove menu items themselves all in one fell swoop, - * though we removed the verbs one-by-one. - */ - remove_wildcard = g_strdup_printf ("%s/*", container_path); - bonobo_ui_component_rm (ui, remove_wildcard, NULL); - g_free (remove_wildcard); -} - -/* Call to set the user-visible label of a menu item to a string - * containing an underscore accelerator. The underscore is stripped - * off before setting the label of the command, because pop-up menu - * and toolbar button labels shouldn't have the underscore. - */ -void -ephy_bonobo_set_label_for_menu_item_and_command (BonoboUIComponent *ui, - const char *menu_item_path, - const char *command_path, - const char *label_with_underscore) -{ - char *label_no_underscore; - - g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui)); - g_return_if_fail (menu_item_path != NULL); - g_return_if_fail (command_path != NULL); - g_return_if_fail (label_with_underscore != NULL); - - label_no_underscore = ephy_str_strip_chr (label_with_underscore, '_'); - ephy_bonobo_set_label (ui, - menu_item_path, - label_with_underscore); - ephy_bonobo_set_label (ui, - command_path, - label_no_underscore); - - g_free (label_no_underscore); -} - -gchar * -ephy_bonobo_add_dockitem (BonoboUIComponent *uic, - const char *name, - int band_num) -{ - gchar *xml; - gchar *sname; - gchar *path; - - sname = gnome_vfs_escape_string (name); - xml = g_strdup_printf ("", - sname, band_num); - path = g_strdup_printf ("/%s", sname); - bonobo_ui_component_set (uic, "", xml, NULL); - - g_free (sname); - g_free (xml); - return path; -} - -BonoboControl * -ephy_bonobo_add_numbered_control (BonoboUIComponent *uic, GtkWidget *w, - guint index, const char *container_path) -{ - BonoboControl *control; - char *xml_string, *item_name, *control_path; - - g_return_val_if_fail (BONOBO_IS_UI_COMPONENT (uic), NULL); - g_return_val_if_fail (container_path != NULL, NULL); - - item_name = get_numbered_menu_item_name (index); - xml_string = g_strdup_printf ("", item_name); - - bonobo_ui_component_set (uic, container_path, xml_string, NULL); - - g_free (xml_string); - - control_path = ephy_bonobo_get_numbered_menu_item_path (uic, container_path, index); - - control = bonobo_control_new (w); - bonobo_ui_component_object_set (uic, control_path, BONOBO_OBJREF (control), NULL); - bonobo_object_unref (control); - - g_free (control_path); - g_free (item_name); - - return control; } void @@ -665,31 +85,3 @@ ephy_bonobo_replace_path (BonoboUIComponent *uic, const gchar *path_src, g_free (path_dst_folder); bonobo_ui_node_free (node); } - -void -ephy_bonobo_clear_path (BonoboUIComponent *uic, - const gchar *path) -{ - if (bonobo_ui_component_path_exists (uic, path, NULL)) - { - char *remove_wildcard = g_strdup_printf ("%s/*", path); - bonobo_ui_component_rm (uic, remove_wildcard, NULL); - g_free (remove_wildcard); - } -} - -void -ephy_bonobo_add_numbered_widget (BonoboUIComponent *uic, GtkWidget *w, - guint index, const char *container_path) -{ - gchar *path = ephy_bonobo_get_numbered_menu_item_path (uic, container_path, index); - gchar *item_name = get_numbered_menu_item_name (index); - gchar *xml_string = g_strdup_printf ("", item_name); - - bonobo_ui_component_set (uic, container_path, xml_string, NULL); - bonobo_ui_component_widget_set (uic, path, w, NULL); - - g_free (path); - g_free (item_name); - g_free (xml_string); -} diff --git a/lib/ephy-bonobo-extensions.h b/lib/ephy-bonobo-extensions.h index be090711d..7e840f49f 100644 --- a/lib/ephy-bonobo-extensions.h +++ b/lib/ephy-bonobo-extensions.h @@ -37,87 +37,11 @@ #include #include -void ephy_bonobo_set_accelerator (BonoboUIComponent *ui, - const char *path, - const char *accelerator); -char *ephy_bonobo_get_label (BonoboUIComponent *ui, - const char *path); -void ephy_bonobo_set_label (BonoboUIComponent *ui, - const char *path, - const char *label); -void ephy_bonobo_set_tip (BonoboUIComponent *ui, - const char *path, - const char *tip); -void ephy_bonobo_set_sensitive (BonoboUIComponent *ui, - const char *path, - gboolean sensitive); -void ephy_bonobo_set_toggle_state (BonoboUIComponent *ui, - const char *path, - gboolean state); void ephy_bonobo_set_hidden (BonoboUIComponent *ui, const char *path, gboolean hidden); -gboolean ephy_bonobo_get_hidden (BonoboUIComponent *ui, - const char *path); -void ephy_bonobo_add_numbered_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - GdkPixbuf *pixbuf); -void ephy_bonobo_add_numbered_toggle_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label); -void ephy_bonobo_add_numbered_radio_menu_item (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - const char *radio_group_name); -char *ephy_bonobo_get_numbered_menu_item_command (BonoboUIComponent *ui, - const char *container_path, - guint index); -char *ephy_bonobo_get_numbered_menu_item_path (BonoboUIComponent *ui, - const char *container_path, - guint index); -guint ephy_bonobo_get_numbered_menu_item_index_from_command (const char *command); -char *ephy_bonobo_get_numbered_menu_item_container_path_from_command (const char *command); -void ephy_bonobo_add_submenu (BonoboUIComponent *ui, - const char *container_path, - const char *label, - GdkPixbuf *pixbuf); -void ephy_bonobo_add_numbered_submenu (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - GdkPixbuf *pixbuf); -void ephy_bonobo_add_numbered_submenu_no_verb (BonoboUIComponent *ui, - const char *container_path, - guint index, - const char *label, - GdkPixbuf *pixbuf); -void ephy_bonobo_add_menu_separator (BonoboUIComponent *ui, - const char *path); -void ephy_bonobo_remove_menu_items_and_commands (BonoboUIComponent *ui, - const char *container_path); -void ephy_bonobo_set_label_for_menu_item_and_command (BonoboUIComponent *ui, - const char *menu_item_path, - const char *command_path, - const char *label_with_underscore); -void ephy_bonobo_set_icon (BonoboUIComponent *ui, - const char *path, - const char *icon_relative_path); -gchar *ephy_bonobo_add_dockitem (BonoboUIComponent *uic, - const char *name, - int band_num); -BonoboControl *ephy_bonobo_add_numbered_control (BonoboUIComponent *uic, - GtkWidget *w, guint index, - const char *path); -void ephy_bonobo_clear_path (BonoboUIComponent *uic, - const gchar *path); void ephy_bonobo_replace_path (BonoboUIComponent *uic, const gchar *path_src, const char *path_dst); -void ephy_bonobo_add_numbered_widget (BonoboUIComponent *uic, GtkWidget *w, - guint index, const char *container_path); #endif /* EPHY_BONOBO_EXTENSIONS_H */ diff --git a/lib/ephy-string.c b/lib/ephy-string.c index 391b275f8..ca32e824c 100644 --- a/lib/ephy-string.c +++ b/lib/ephy-string.c @@ -138,9 +138,9 @@ ephy_string_time_to_string (GDate *t, } gboolean -ephy_str_to_int (const char *string, int *integer) +ephy_str_to_int (const char *string, gulong *integer) { - long result; + gulong result; char *parse_end; /* Check for the case of an empty string. */ diff --git a/lib/ephy-string.h b/lib/ephy-string.h index 3c57d08de..97e15e756 100644 --- a/lib/ephy-string.h +++ b/lib/ephy-string.h @@ -33,7 +33,7 @@ gchar *ephy_string_time_to_string (GDate *t, const char *format); gboolean ephy_str_to_int (const char *string, - int *integer); + gulong *integer); char *ephy_str_strip_chr (const char *source, char remove_this); diff --git a/lib/widgets/ephy-editable-toolbar.c b/lib/widgets/ephy-editable-toolbar.c index 5cfc21aff..f6b6f8f7f 100755 --- a/lib/widgets/ephy-editable-toolbar.c +++ b/lib/widgets/ephy-editable-toolbar.c @@ -20,9 +20,12 @@ #include "ephy-editable-toolbar.h" #include "ephy-file-helpers.h" #include "ephy-debug.h" +#include "ephy-dnd.h" #include "eggtoolitem.h" +#include "eggtoolbar.h" #include +#include #include /* This is copied from gtkscrollbarwindow.c */ @@ -32,9 +35,18 @@ (GTK_SCROLLED_WINDOW_GET_CLASS (w)->scrollbar_spacing >= 0 ? \ GTK_SCROLLED_WINDOW_GET_CLASS (w)->scrollbar_spacing : DEFAULT_SCROLLBAR_SPACING) -static GtkTargetEntry drag_types [] = +static GtkTargetEntry dest_drag_types [] = { - { "EPHY_TOOLBAR_BUTTON", 0, 0 } + { "EPHY_TOOLBAR_BUTTON", 0, 0 }, + /* FIXME generic way to add types */ + { EPHY_DND_URL_TYPE, 0, EPHY_DND_URL } +}; + +static GtkTargetEntry source_drag_types [] = +{ + { "EPHY_TOOLBAR_BUTTON", 0, 0 }, + /* FIXME generic way to add types */ + { EPHY_DND_URL_TYPE, 0, EPHY_DND_URL } }; static void ephy_editable_toolbar_class_init (EphyEditableToolbarClass *klass); @@ -42,6 +54,7 @@ static void ephy_editable_toolbar_init (EphyEditableToolbar *t); static void ephy_editable_toolbar_finalize (GObject *object); static void do_merge (EphyEditableToolbar *t); +static void setup_editor (EphyEditableToolbar *etoolbar); enum { @@ -49,16 +62,8 @@ enum PROP_MENU_MERGE }; -enum -{ - REQUEST_ACTION, - LAST_SIGNAL -}; - static GObjectClass *parent_class = NULL; -static gint EphyEditableToolbarSignals[LAST_SIGNAL]; - struct EphyEditableToolbarPrivate { EggMenuMerge *merge; @@ -68,6 +73,9 @@ struct EphyEditableToolbarPrivate GtkWidget *editor; GtkWidget *table; + GtkWidget *label_zone; + GtkWidget *action_zone; + GtkWidget *scrolled_window; guint ui_id; gboolean ui_dirty; @@ -173,10 +181,32 @@ find_node_from_action (EphyEditableToolbar *t, EggAction *action) return NULL; } +static EggAction * +impl_get_action (EphyEditableToolbar *etoolbar, + const char *type, + const char *name) +{ + EggAction *action; + + LOG ("Getting an action"); + + if (type == NULL) + { + action = find_action (etoolbar, name); + } + else + { + action = NULL; + } + + return action; +} + static void add_action (EphyEditableToolbar *t, GNode *parent, GNode *sibling, + const char *type, const char *name) { EggAction *action = NULL; @@ -184,13 +214,10 @@ add_action (EphyEditableToolbar *t, ItemNode *item; GNode *node; - action = find_action (t, name); separator = (strcmp (name, "separator") == 0); - - if (!action && !separator) + if (!separator) { - g_signal_emit (t, EphyEditableToolbarSignals[REQUEST_ACTION], 0, name); - action = find_action (t, name); + action = ephy_editable_toolbar_get_action (t, type, name); } item = item_node_new (action, separator); @@ -211,35 +238,43 @@ parse_item_list (EphyEditableToolbar *t, xmlChar *verb; verb = xmlGetProp (child, "verb"); - add_action (t, parent, NULL, verb); + add_action (t, parent, NULL, NULL, verb); xmlFree (verb); } else if (xmlStrEqual (child->name, "separator")) { - add_action (t, parent, NULL, "separator"); + add_action (t, parent, NULL, NULL, "separator"); } child = child->next; } } +static GNode * +add_toolbar (EphyEditableToolbar *t) +{ + ToolbarNode *toolbar; + GNode *node; + + toolbar = toolbar_node_new (); + node = g_node_new (toolbar); + g_node_append (t->priv->toolbars, node); + + return node; +} + static void parse_toolbars (EphyEditableToolbar *t, - xmlNodePtr child, - GNode *toolbars) + xmlNodePtr child) { while (child) { if (xmlStrEqual (child->name, "toolbar")) { - ToolbarNode *toolbar; GNode *node; - toolbar = toolbar_node_new (); - node = g_node_new (toolbar); - g_node_append (toolbars, node); - + node = add_toolbar (t); parse_item_list (t, child->children, node); } @@ -275,8 +310,7 @@ load_defaults (EphyEditableToolbar *t) t->priv->toolbars == NULL) { t->priv->toolbars = g_node_new (NULL); - parse_toolbars (t, child->children, - t->priv->toolbars); + parse_toolbars (t, child->children); } child = child->next; @@ -298,8 +332,7 @@ load_toolbar (EphyEditableToolbar *t) root = xmlDocGetRootElement (doc); t->priv->toolbars = g_node_new (NULL); - parse_toolbars (t, root->children, - t->priv->toolbars); + parse_toolbars (t, root->children); } static xmlDocPtr @@ -418,13 +451,24 @@ drag_data_received_cb (GtkWidget *widget, guint time_, EphyEditableToolbar *etoolbar) { + GNode *toolbar; GNode *parent; GNode *sibling; - sibling = (GNode *)g_object_get_data (G_OBJECT (widget), "item_node"); - parent = sibling->parent; + toolbar = (GNode *)g_object_get_data (G_OBJECT (widget), "toolbar_node"); + + if (!toolbar) + { + sibling = (GNode *)g_object_get_data (G_OBJECT (widget), "item_node"); + parent = sibling->parent; + } + else + { + sibling = NULL; + parent = toolbar; + } - add_action (etoolbar, parent, sibling, selection_data->data); + add_action (etoolbar, parent, sibling, NULL, selection_data->data); queue_ui_update (etoolbar); } @@ -468,16 +512,33 @@ setup_toolbar_drag (EphyEditableToolbar *etoolbar, GNode *toolbars) { GNode *l1, *l2; int k = 0; + char path[255]; for (l1 = toolbars->children; l1 != NULL; l1 = l1->next) { int i = 0; + GtkWidget *toolbar; + + sprintf (path, "/Toolbar%d", k); + toolbar = egg_menu_merge_get_widget (etoolbar->priv->merge, path); + g_object_set_data (G_OBJECT (toolbar), "toolbar_node", l1); + + if (!g_object_get_data (G_OBJECT (toolbar), "drag_dest_set")) + { + LOG ("Setup drag dest for toolbar %s", path) + g_object_set_data (G_OBJECT (toolbar), "drag_dest_set", + GINT_TO_POINTER (TRUE)); + gtk_drag_dest_set (toolbar, GTK_DEST_DEFAULT_ALL, + dest_drag_types, 2, GDK_ACTION_MOVE); + g_signal_connect (toolbar, "drag_data_received", + G_CALLBACK (drag_data_received_cb), + etoolbar); + } for (l2 = l1->children; l2 != NULL; l2 = l2->next) { ItemNode *node = (ItemNode *) (l2->data); GtkWidget *toolitem; - char path[255]; const char *type; if (node->separator) @@ -502,7 +563,7 @@ setup_toolbar_drag (EphyEditableToolbar *etoolbar, GNode *toolbars) g_object_set_data (G_OBJECT (toolitem), "drag_dest_set", GINT_TO_POINTER (TRUE)); gtk_drag_dest_set (toolitem, GTK_DEST_DEFAULT_ALL, - drag_types, 1, GDK_ACTION_MOVE); + dest_drag_types, 2, GDK_ACTION_MOVE); g_signal_connect (toolitem, "drag_data_received", G_CALLBACK (drag_data_received_cb), etoolbar); @@ -522,6 +583,33 @@ setup_toolbar_drag (EphyEditableToolbar *etoolbar, GNode *toolbars) } } +static void +ensure_toolbars_min_size (EphyEditableToolbar *t) +{ + GNode *n; + int i = 0; + + for (n = t->priv->toolbars->children; n != NULL; n = n->next) + { + GtkWidget *toolbar; + char path[255]; + + sprintf (path, "/Toolbar%d", i); + toolbar = egg_menu_merge_get_widget (t->priv->merge, path); + + if (g_node_n_children (n) == 0) + { + gtk_widget_set_size_request (toolbar, -1, 20); + } + else + { + gtk_widget_set_size_request (toolbar, -1, -1); + } + + i++; + } +} + static void do_merge (EphyEditableToolbar *t) { @@ -549,6 +637,8 @@ do_merge (EphyEditableToolbar *t) setup_toolbar_drag (t, t->priv->toolbars); + ensure_toolbars_min_size (t); + g_free (str); } @@ -604,19 +694,10 @@ ephy_editable_toolbar_class_init (EphyEditableToolbarClass *klass) parent_class = g_type_class_peek_parent (klass); object_class->finalize = ephy_editable_toolbar_finalize; - object_class->set_property = ephy_editable_toolbar_set_property; object_class->get_property = ephy_editable_toolbar_get_property; - EphyEditableToolbarSignals[REQUEST_ACTION] = - g_signal_new - ("request_action", G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP, - G_STRUCT_OFFSET (EphyEditableToolbarClass, request_action), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); + klass->get_action = impl_get_action; g_object_class_install_property (object_class, PROP_MENU_MERGE, @@ -685,40 +766,42 @@ ephy_editable_toolbar_new (EggMenuMerge *merge) } static void -editor_get_dimensions (GtkWidget *window, GtkWidget *toolbar, GtkWidget *table, +editor_get_dimensions (EphyEditableToolbar *etoolbar, GtkWidget *toolbar, int *x, int *y, int *width, int *height) { GtkBin *popwin; GtkWidget *widget; - GtkScrolledWindow *popup; - GtkRequisition table_requisition; - int real_height; - int real_width; + GtkWidget *table; + GtkWidget *label_zone; + GtkWidget *action_zone; + GtkWidget *popup; + GtkRequisition requisition; int avail_height; int avail_width; int work_height; int work_width; widget = toolbar; - popup = GTK_SCROLLED_WINDOW (GTK_BIN (window)->child); - popwin = GTK_BIN (window); - - gdk_window_get_origin (widget->window, x, y); - real_height = MIN (widget->requisition.height, - widget->allocation.height); - real_width = MIN (widget->requisition.width, - widget->allocation.width); - *y += real_height; + popup = etoolbar->priv->scrolled_window; + popwin = GTK_BIN (etoolbar->priv->editor); + table = etoolbar->priv->table; + action_zone = etoolbar->priv->action_zone; + label_zone = etoolbar->priv->label_zone; + + gdk_window_get_origin (toolbar->window, x, y); + + *y += toolbar->allocation.y + toolbar->allocation.height; + avail_height = gdk_screen_height () - *y; avail_width = gdk_screen_width () - *x; - gtk_widget_size_request (table, &table_requisition); + gtk_widget_size_request (table, &requisition); - *width = MIN (avail_width, table_requisition.width); - *height = MIN (avail_height, table_requisition.height); + *width = MIN (avail_width, requisition.width); + *height = MIN (avail_height, requisition.height); work_width = (2 * popwin->child->style->xthickness + - 2 * GTK_CONTAINER (window)->border_width + + 2 * GTK_CONTAINER (popwin)->border_width + 2 * GTK_CONTAINER (popwin->child)->border_width + 2 * GTK_CONTAINER (popup)->border_width + 2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width + @@ -726,14 +809,21 @@ editor_get_dimensions (GtkWidget *window, GtkWidget *toolbar, GtkWidget *table, *width += work_width; work_height = (2 * popwin->child->style->ythickness + - 2 * GTK_CONTAINER (window)->border_width + + 2 * GTK_CONTAINER (popwin)->border_width + 2 * GTK_CONTAINER (popwin->child)->border_width + 2 * GTK_CONTAINER (popup)->border_width + 2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width + 2 * GTK_BIN (popup)->child->style->ythickness); *height += work_height; - *x = *x + (real_width/2 - *width/2); + gtk_widget_size_request (label_zone, &requisition); + *height += requisition.height; + gtk_widget_size_request (action_zone, &requisition); + *height += requisition.height; + /* Vbox spacing */ + *height += 2 * 12; + + *x += (toolbar->allocation.x + toolbar->allocation.width)/2 - (*width / 2); } static GList * @@ -757,40 +847,141 @@ build_to_drag_actions_list (EphyEditableToolbar *etoolbar) return result; } +static void +hide_editor (EphyEditableToolbar *etoolbar) +{ + gtk_grab_remove (GTK_WIDGET (etoolbar->priv->editor)); + gtk_widget_hide (GTK_WIDGET (etoolbar->priv->editor)); +} + +static void +editor_close_cb (GtkWidget *button, EphyEditableToolbar *etoolbar) +{ + hide_editor (etoolbar); +} + +static void +editor_add_toolbar_cb (GtkWidget *button, EphyEditableToolbar *etoolbar) +{ + add_toolbar (etoolbar); + queue_ui_update (etoolbar); +} + +static void +editor_drag_data_received_cb (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *selection_data, + guint info, + guint time_, + EphyEditableToolbar *etoolbar) +{ + setup_editor (etoolbar); +} + +static void +editor_drag_data_delete_cb (GtkWidget *widget, + GdkDragContext *context, + EphyEditableToolbar *etoolbar) +{ + setup_editor (etoolbar); +} + static void setup_editor (EphyEditableToolbar *etoolbar) { GList *l; GList *to_drag; int x, y, height, width; + GtkWidget *table; + GtkWidget *viewport; + GtkWidget *last_toolbar; + GtkWidget *editor; + char path[255]; if (etoolbar->priv->editor == NULL) { GtkWidget *editor; GtkWidget *scrolled_window; - GtkWidget *table; + GtkWidget *vbox; + GtkWidget *label_hbox; + GtkWidget *image; + GtkWidget *label; + GtkWidget *bbox; + GtkWidget *button; editor = gtk_window_new (GTK_WINDOW_POPUP); gtk_container_set_border_width (GTK_CONTAINER (editor), 12); + vbox = gtk_vbox_new (FALSE, 12); + gtk_widget_show (vbox); + gtk_container_add (GTK_CONTAINER (editor), vbox); scrolled_window = gtk_scrolled_window_new (NULL, NULL); + etoolbar->priv->scrolled_window = scrolled_window; gtk_widget_show (scrolled_window); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (editor), scrolled_window); - table = gtk_table_new (0, 0, TRUE); - gtk_table_set_col_spacings (GTK_TABLE (table), 12); - gtk_table_set_row_spacings (GTK_TABLE (table), 12); - gtk_widget_show (table); - gtk_scrolled_window_add_with_viewport - (GTK_SCROLLED_WINDOW (scrolled_window), table); + gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0); + label_hbox = gtk_hbox_new (FALSE, 6); + etoolbar->priv->label_zone = label_hbox; + gtk_widget_show (label_hbox); + gtk_box_pack_start (GTK_BOX (vbox), label_hbox, FALSE, FALSE, 0); + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); + gtk_widget_show (image); + gtk_box_pack_start (GTK_BOX (label_hbox), image, FALSE, FALSE, 0); + label = gtk_label_new (_("Drag an item onto the toolbars above to add it.\n" + "Drag an item from the toolbars in the items table" + " to remove it.")); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (label_hbox), label, FALSE, TRUE, 0); + bbox = gtk_hbutton_box_new (); + gtk_box_set_spacing (GTK_BOX (bbox), 10); + etoolbar->priv->action_zone = bbox; + gtk_widget_show (bbox); + gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), + GTK_BUTTONBOX_END); + gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0); + button = gtk_button_new_from_stock (GTK_STOCK_ADD); + gtk_widget_show (button); + gtk_button_set_label (GTK_BUTTON (button), _("Add Toolbar")); + g_signal_connect (button, "clicked", + G_CALLBACK (editor_add_toolbar_cb), + etoolbar); + gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0); + button = gtk_button_new_from_stock (GTK_STOCK_CLOSE); + gtk_widget_show (button); + g_signal_connect (button, "clicked", + G_CALLBACK (editor_close_cb), + etoolbar); + gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0); etoolbar->priv->editor = editor; - etoolbar->priv->table = table; } + viewport = GTK_BIN (etoolbar->priv->scrolled_window)->child; + if (viewport) + { + table = GTK_BIN (viewport)->child; + gtk_container_remove (GTK_CONTAINER (viewport), table); + } + table = gtk_table_new (0, 0, TRUE); + etoolbar->priv->table = table; + gtk_container_set_border_width (GTK_CONTAINER (table), 12); + gtk_table_set_col_spacings (GTK_TABLE (table), 12); + gtk_table_set_row_spacings (GTK_TABLE (table), 12); + gtk_widget_show (table); + gtk_scrolled_window_add_with_viewport + (GTK_SCROLLED_WINDOW (etoolbar->priv->scrolled_window), table); + gtk_drag_dest_set (table, GTK_DEST_DEFAULT_ALL, + dest_drag_types, 2, GDK_ACTION_MOVE); + g_signal_connect (table, "drag_data_received", + G_CALLBACK (editor_drag_data_received_cb), + etoolbar); + to_drag = build_to_drag_actions_list (etoolbar); x = y = 0; @@ -811,11 +1002,14 @@ setup_editor (EphyEditableToolbar *etoolbar) gtk_widget_show (event_box); gtk_drag_source_set (event_box, GDK_BUTTON1_MASK, - drag_types, 1, + source_drag_types, 1, GDK_ACTION_MOVE); g_signal_connect (event_box, "drag_data_get", G_CALLBACK (drag_data_get_cb), etoolbar); + g_signal_connect (event_box, "drag_data_delete", + G_CALLBACK (editor_drag_data_delete_cb), + etoolbar); g_object_set_data (G_OBJECT (event_box), "egg-action", action); @@ -844,6 +1038,16 @@ setup_editor (EphyEditableToolbar *etoolbar) } } + sprintf (path, "/Toolbar%d", g_node_n_children (etoolbar->priv->toolbars) - 1); + last_toolbar = egg_menu_merge_get_widget (etoolbar->priv->merge, path); + g_assert (EGG_IS_TOOLBAR (last_toolbar)); + + editor_get_dimensions (etoolbar, last_toolbar, + &x, &y, &width, &height); + editor = etoolbar->priv->editor; + gtk_widget_set_size_request (GTK_WIDGET (editor), width, height); + gtk_window_move (GTK_WINDOW (editor), x, y); + g_list_free (to_drag); } @@ -864,7 +1068,7 @@ button_press_cb (GtkWidget *w, { case GDK_BUTTON_PRESS: gtk_drag_begin (toolitem, - gtk_target_list_new (drag_types, 1), + gtk_target_list_new (source_drag_types, 1), GDK_ACTION_MOVE, 1, event); return TRUE; default: @@ -875,17 +1079,12 @@ button_press_cb (GtkWidget *w, } static void -show_editor (EphyEditableToolbar *etoolbar, GtkWidget *toolbar) +show_editor (EphyEditableToolbar *etoolbar) { GtkWidget *editor = etoolbar->priv->editor; - int x, y, width, height; g_return_if_fail (editor != NULL); - editor_get_dimensions (GTK_WIDGET (editor), toolbar, - etoolbar->priv->table, &x, &y, &width, &height); - gtk_widget_set_size_request (GTK_WIDGET (editor), width, height); - gtk_window_move (GTK_WINDOW (editor), x, y); gtk_widget_show (GTK_WIDGET (editor)); gtk_grab_add (editor); @@ -910,13 +1109,16 @@ set_all_actions_sensitive (EphyEditableToolbar *etoolbar) void ephy_editable_toolbar_edit (EphyEditableToolbar *etoolbar) { - GtkWidget *last_toolbar; - char path[255]; - - sprintf (path, "/Toolbar%d", g_node_n_children (etoolbar->priv->toolbars) - 1); - last_toolbar = egg_menu_merge_get_widget (etoolbar->priv->merge, path); - set_all_actions_sensitive (etoolbar); setup_editor (etoolbar); - show_editor (etoolbar, last_toolbar); + show_editor (etoolbar); +} + +EggAction * +ephy_editable_toolbar_get_action (EphyEditableToolbar *etoolbar, + const char *type, + const char *name) +{ + EphyEditableToolbarClass *klass = EPHY_EDITABLE_TOOLBAR_GET_CLASS (etoolbar); + return klass->get_action (etoolbar, type, name); } diff --git a/lib/widgets/ephy-editable-toolbar.h b/lib/widgets/ephy-editable-toolbar.h index 6ece8d4c5..10d633a50 100755 --- a/lib/widgets/ephy-editable-toolbar.h +++ b/lib/widgets/ephy-editable-toolbar.h @@ -32,6 +32,8 @@ typedef struct EphyEditableToolbarClass EphyEditableToolbarClass; #define EPHY_EDITABLE_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EPHY_EDITABLE_TOOLBAR_TYPE, EphyEditableToolbarClass)) #define IS_EPHY_EDITABLE_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EPHY_EDITABLE_TOOLBAR_TYPE)) #define IS_EPHY_EDITABLE_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EPHY_EDITABLE_TOOLBAR_TYPE)) +#define EPHY_EDITABLE_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EPHY_EDITABLE_TOOLBAR_TYPE, EphyEditableToolbarClass)) + typedef struct EphyEditableToolbar EphyEditableToolbar; typedef struct EphyEditableToolbarPrivate EphyEditableToolbarPrivate; @@ -46,15 +48,21 @@ struct EphyEditableToolbarClass { GObjectClass parent_class; - void (* request_action) (EphyEditableToolbar *etoolbar, - const char *action_name); + EggAction * (* get_action) (EphyEditableToolbar *etoolbar, + const char *type, + const char *name); }; -GType ephy_editable_toolbar_get_type (void); +GType ephy_editable_toolbar_get_type (void); + +EphyEditableToolbar *ephy_editable_toolbar_new (EggMenuMerge *merge); + +void ephy_editable_toolbar_edit (EphyEditableToolbar *etoolbar); -EphyEditableToolbar *ephy_editable_toolbar_new (EggMenuMerge *merge); +EggAction *ephy_editable_toolbar_get_action (EphyEditableToolbar *etoolbar, + const char *type, + const char *name); -void ephy_editable_toolbar_edit (EphyEditableToolbar *etoolbar); G_END_DECLS diff --git a/src/bookmarks/ephy-bookmarks.c b/src/bookmarks/ephy-bookmarks.c index 5e9d539f3..7e1d2bdd5 100644 --- a/src/bookmarks/ephy-bookmarks.c +++ b/src/bookmarks/ephy-bookmarks.c @@ -659,6 +659,26 @@ ephy_bookmarks_add (EphyBookmarks *eb, return bm; } +guint +ephy_bookmarks_get_bookmark_id (EphyBookmarks *eb, + const char *url) +{ + EphyNode *node; + + g_static_rw_lock_reader_lock (eb->priv->bookmarks_hash_lock); + node = g_hash_table_lookup (eb->priv->bookmarks_hash, url); + g_static_rw_lock_reader_unlock (eb->priv->bookmarks_hash_lock); + + if (node) + { + return ephy_node_get_id (node); + } + else + { + return -1; + } +} + void ephy_bookmarks_set_icon (EphyBookmarks *eb, const char *url, diff --git a/src/bookmarks/ephy-bookmarks.h b/src/bookmarks/ephy-bookmarks.h index d2b1d7915..169e5a841 100644 --- a/src/bookmarks/ephy-bookmarks.h +++ b/src/bookmarks/ephy-bookmarks.h @@ -69,6 +69,9 @@ EphyNode *ephy_bookmarks_add (EphyBookmarks *eb, const char *smart_url, const char *keywords); +guint ephy_bookmarks_get_bookmark_id (EphyBookmarks *eb, + const char *url); + void ephy_bookmarks_set_icon (EphyBookmarks *eb, const char *url, const char *icon); diff --git a/src/session.c b/src/session.c index d050a9dcd..431edef02 100644 --- a/src/session.c +++ b/src/session.c @@ -604,7 +604,7 @@ session_load (Session *session, { if (strcmp (child->name, "window") == 0) { - gint x = 0, y = 0, width = 0, height = 0; + gulong x = 0, y = 0, width = 0, height = 0; xmlChar *tmp; tmp = xmlGetProp (child, "x"); diff --git a/src/toolbar.c b/src/toolbar.c index ff5f9cba1..29ae4665f 100755 --- a/src/toolbar.c +++ b/src/toolbar.c @@ -99,18 +99,73 @@ toolbar_get_type (void) } +static void +go_location_cb (EggAction *action, char *location, EphyWindow *window) +{ + EphyEmbed *embed; + + embed = ephy_window_get_active_embed (window); + g_return_if_fail (embed != NULL); + + ephy_embed_load_url (embed, location); +} + +static EggAction * +toolbar_get_action (EphyEditableToolbar *etoolbar, + const char *type, + const char *name) +{ + Toolbar *t = TOOLBAR (etoolbar); + EggAction *action = NULL; + EphyBookmarks *bookmarks; + gulong id = 0; + + if (type && (strcmp (type, EPHY_DND_URL_TYPE) == 0)) + { + char action_name[255]; + + bookmarks = ephy_shell_get_bookmarks (ephy_shell); + id = ephy_bookmarks_get_bookmark_id (bookmarks, name); + + snprintf (action_name, 255, "GoBookmarkId%ld", id); + action = ephy_bookmark_action_new (name, id); + } + else if (g_str_has_prefix (name, "GoBookmarkId")) + { + ephy_str_to_int (name + strlen ("GoBookmarkId"), &id); + } + + if (action) + { + g_signal_connect (action, "go_location", + G_CALLBACK (go_location_cb), t->priv->window); + egg_action_group_add_action (t->priv->action_group, action); + g_object_unref (action); + } + else + { + action = EPHY_EDITABLE_TOOLBAR_CLASS + (parent_class)->get_action (etoolbar, type, name); + } + + return action; +} + static void toolbar_class_init (ToolbarClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + EphyEditableToolbarClass *eet_class; parent_class = g_type_class_peek_parent (klass); + eet_class = EPHY_EDITABLE_TOOLBAR_CLASS (klass); object_class->finalize = toolbar_finalize; - object_class->set_property = toolbar_set_property; object_class->get_property = toolbar_get_property; + eet_class->get_action = toolbar_get_action; + g_object_class_install_property (object_class, PROP_EPHY_WINDOW, g_param_spec_object ("EphyWindow", @@ -152,17 +207,6 @@ toolbar_get_property (GObject *object, } } -static void -go_location_cb (EggAction *action, char *location, EphyWindow *window) -{ - EphyEmbed *embed; - - embed = ephy_window_get_active_embed (window); - g_return_if_fail (embed != NULL); - - ephy_embed_load_url (embed, location); -} - static void toolbar_setup_actions (Toolbar *t) { @@ -245,28 +289,6 @@ toolbar_set_window (Toolbar *t, EphyWindow *window) g_object_set (t, "MenuMerge", t->priv->ui_merge, NULL); } -static void -editable_toolbar_request_action (Toolbar *t, - const char *name, - EphyEditableToolbar *etoolbar) -{ - guint id; - - if (g_str_has_prefix (name, "GoBookmark") && - ephy_str_to_int (name + strlen ("GoBookmark"), &id)) - { - EggAction *action; - - LOG ("Create an action for bookmark %d", id) - - action = ephy_bookmark_action_new (name, id); - g_signal_connect (action, "go_location", - G_CALLBACK (go_location_cb), t->priv->window); - egg_action_group_add_action (t->priv->action_group, action); - g_object_unref (action); - } -} - static void toolbar_init (Toolbar *t) { @@ -275,10 +297,6 @@ toolbar_init (Toolbar *t) t->priv->window = NULL; t->priv->ui_merge = NULL; t->priv->visibility = TRUE; - - g_signal_connect (t, "request_action", - G_CALLBACK (editable_toolbar_request_action), - EPHY_EDITABLE_TOOLBAR (t)); } static void -- cgit v1.2.3