diff options
Diffstat (limited to 'lib/widgets/ephy-editable-toolbar.c')
-rwxr-xr-x | lib/widgets/ephy-editable-toolbar.c | 1171 |
1 files changed, 0 insertions, 1171 deletions
diff --git a/lib/widgets/ephy-editable-toolbar.c b/lib/widgets/ephy-editable-toolbar.c deleted file mode 100755 index e65015d3a..000000000 --- a/lib/widgets/ephy-editable-toolbar.c +++ /dev/null @@ -1,1171 +0,0 @@ -/* - * Copyright (C) 2000 Marco Pesenti Gritti - * (C) 2001, 2002 Jorn Baayen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "ephy-editable-toolbar.h" -#include "ephy-toolbars-group.h" -#include "ephy-debug.h" -#include "ephy-dnd.h" -#include "ephy-file-helpers.h" -#include "eggtoolitem.h" -#include "eggtoolbar.h" -#include "eggseparatortoolitem.h" - -#include <libgnome/gnome-i18n.h> -#include <string.h> - -enum -{ - X_TOOLBAR_ITEM -}; - -static GtkTargetEntry dest_drag_types [] = -{ - { "application/x-toolbar-item", 0, X_TOOLBAR_ITEM }, - /* FIXME generic way to add types */ - { EPHY_DND_URL_TYPE, 0, 2 }, - { EPHY_DND_TOPIC_TYPE, 0, 2 } -}; -static int n_dest_drag_types = G_N_ELEMENTS (dest_drag_types); - -static GtkTargetEntry source_drag_types [] = -{ - { "application/x-toolbar-item", 0, X_TOOLBAR_ITEM }, -}; - -static int n_source_drag_types = G_N_ELEMENTS (source_drag_types); - -enum -{ - RESPONSE_ADD_TOOLBAR -}; - -static void ephy_editable_toolbar_class_init (EphyEditableToolbarClass *klass); -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, - GtkWidget *window); -static void update_editor_sheet (EphyEditableToolbar *etoolbar); - -static void ephy_editable_toolbar_remove_cb (EggAction *action, EphyEditableToolbar *etoolbar); -static void ephy_editable_toolbar_edit_cb (EggAction *action, EphyEditableToolbar *etoolbar); - -static EggActionGroupEntry ephy_toolbar_popups [] = { - /* Toplevel */ - { "FakeToplevel", (""), NULL, NULL, NULL, NULL, NULL }, - - /* Popups */ - { "RemoveToolbarPopup", N_("_Remove Toolbar"), GTK_STOCK_REMOVE, NULL, - NULL, G_CALLBACK (ephy_editable_toolbar_remove_cb), NULL }, - { "EditToolbarPopup", N_("_Edit Toolbars..."), GTK_STOCK_PREFERENCES, NULL, - NULL, G_CALLBACK (ephy_editable_toolbar_edit_cb), NULL }, -}; - -static guint ephy_toolbar_popups_n_entries = G_N_ELEMENTS (ephy_toolbar_popups); - -enum -{ - PROP_0, - PROP_TOOLBARS_GROUP, - PROP_MENU_MERGE -}; - -static GObjectClass *parent_class = NULL; - -struct EphyEditableToolbarPrivate -{ - EggMenuMerge *merge; - - GtkWidget *editor; - GtkWidget *table; - GtkWidget *scrolled_window; - - GtkWidget *last_toolbar; - - guint ui_id; - - gboolean toolbars_dirty; - gboolean editor_sheet_dirty; - gboolean edit_mode; - - EphyToolbarsGroup *group; - - EggMenuMerge *popup_merge; - EggActionGroup *popup_action_group; - - GList *actions_list; -}; - -typedef struct { - EphyEditableToolbar *etoolbar; - EphyToolbarsToolbar *t; -} ContextMenuData; - -GType -ephy_editable_toolbar_get_type (void) -{ - static GType ephy_editable_toolbar_type = 0; - - if (ephy_editable_toolbar_type == 0) - { - static const GTypeInfo our_info = - { - sizeof (EphyEditableToolbarClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) ephy_editable_toolbar_class_init, - NULL, - NULL, /* class_data */ - sizeof (EphyEditableToolbar), - 0, /* n_preallocs */ - (GInstanceInitFunc) ephy_editable_toolbar_init - }; - - ephy_editable_toolbar_type = g_type_register_static (G_TYPE_OBJECT, - "EphyEditableToolbar", - &our_info, 0); - } - - return ephy_editable_toolbar_type; -} - -static void -update_popup_menu (EphyEditableToolbar *t) -{ - EggAction *action; - - action = egg_action_group_get_action (t->priv->popup_action_group, - "EditToolbarPopup"); - g_object_set (G_OBJECT (action), "visible", - !t->priv->edit_mode, NULL); - - action = egg_action_group_get_action (t->priv->popup_action_group, - "RemoveToolbarPopup"); - g_object_set (G_OBJECT (action), "visible", - t->priv->edit_mode, NULL); -} - -static EggAction * -find_action (EphyEditableToolbar *t, const char *name) -{ - GList *l = t->priv->merge->action_groups; - EggAction *action = NULL; - - g_return_val_if_fail (IS_EPHY_EDITABLE_TOOLBAR (t), NULL); - g_return_val_if_fail (name != NULL, NULL); - - for (; l != NULL; l = l->next) - { - EggAction *tmp; - - tmp = egg_action_group_get_action - (EGG_ACTION_GROUP (l->data), name); - if (tmp) action = tmp; - } - - return action; -} - -static char * -impl_get_action_name (EphyEditableToolbar *etoolbar, - const char *drag_type, - const char *data) -{ - return NULL; -} - -static EggAction * -impl_get_action (EphyEditableToolbar *etoolbar, - const char *name) -{ - EggAction *action; - - g_return_val_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar), NULL); - - action = find_action (etoolbar, name); - - return action; -} - -static gboolean -ui_update (gpointer data) -{ - EphyEditableToolbar *etoolbar = EPHY_EDITABLE_TOOLBAR (data); - - g_return_val_if_fail (etoolbar != NULL, FALSE); - - if (etoolbar->priv->toolbars_dirty) - { - LOG ("Update ui: toolbars") - do_merge (etoolbar); - etoolbar->priv->toolbars_dirty = FALSE; - } - - if (etoolbar->priv->editor_sheet_dirty) - { - LOG ("Update ui: editor sheet") - update_editor_sheet (etoolbar); - etoolbar->priv->editor_sheet_dirty = FALSE; - } - - return FALSE; -} - -static void -queue_ui_update (EphyEditableToolbar *etoolbar) -{ - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - g_idle_add (ui_update, etoolbar); -} - -static void -drag_data_received_cb (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time_, - EphyEditableToolbar *etoolbar) -{ - EphyToolbarsToolbar *toolbar; - const char *type = NULL; - GdkAtom target; - EggAction *action = NULL; - int pos; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - LOG ("Drag data received %s", selection_data->data) - - toolbar = (EphyToolbarsToolbar *)g_object_get_data (G_OBJECT (widget), "toolbar_data"); - pos = egg_toolbar_get_drop_index (EGG_TOOLBAR (widget), x, y); - - /* HACK placeholder are implemented as separators */ - pos = pos/3 + 1; - - target = gtk_drag_dest_find_target (widget, context, NULL); - if (target == gdk_atom_intern (EPHY_DND_URL_TYPE, FALSE)) - { - type = EPHY_DND_URL_TYPE; - } - else if (target == gdk_atom_intern (EPHY_DND_TOPIC_TYPE, FALSE)) - { - type = EPHY_DND_TOPIC_TYPE; - } - - if (type) - { - char *name; - - name = ephy_editable_toolbar_get_action_name - (etoolbar, type, selection_data->data); - if (name != NULL) - { - action = ephy_editable_toolbar_get_action (etoolbar, name); - g_free (name); - } - } - else - { - action = ephy_editable_toolbar_get_action (etoolbar, selection_data->data); - } - - if (action) - { - ephy_toolbars_group_add_item (etoolbar->priv->group, toolbar, pos, - action->name); - etoolbar->priv->toolbars_dirty = TRUE; - } - else if (strcmp (selection_data->data, "separator") == 0) - { - ephy_toolbars_group_add_item (etoolbar->priv->group, toolbar, pos, - "separator"); - etoolbar->priv->toolbars_dirty = TRUE; - } - - queue_ui_update (etoolbar); -} - -static void -drag_data_delete_cb (GtkWidget *widget, - GdkDragContext *context, - EphyEditableToolbar *etoolbar) -{ - EphyToolbarsItem *node; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - node = (EphyToolbarsItem *)g_object_get_data (G_OBJECT (widget), "item_data"); - g_return_if_fail (node != NULL); - ephy_toolbars_group_remove_item (etoolbar->priv->group, node); - - etoolbar->priv->toolbars_dirty = TRUE; - queue_ui_update (etoolbar); -} - -static void -drag_data_get_cb (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint32 time, - EphyEditableToolbar *etoolbar) -{ - EggAction *action; - const char *target; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - action = EGG_ACTION (g_object_get_data (G_OBJECT (widget), "egg-action")); - - if (action) - { - LOG ("Drag data get %s", action->name); - target = action->name; - } - else - { - LOG ("Drag data get %s", separator); - target = "separator"; - } - - gtk_selection_data_set (selection_data, - selection_data->target, - 8, target, strlen (target)); -} - -static void -toolbar_drag_data_delete_cb (GtkWidget *widget, - GdkDragContext *context, - EphyEditableToolbar *etoolbar) -{ - EphyToolbarsToolbar *t; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - t = (EphyToolbarsToolbar *)g_object_get_data (G_OBJECT (widget), - "toolbar_drag_data"); - g_return_if_fail (t != NULL); - - ephy_toolbars_group_remove_toolbar (etoolbar->priv->group, t); - - etoolbar->priv->toolbars_dirty = TRUE; - queue_ui_update (etoolbar); -} - -static void -toolbar_drag_data_get_cb (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint32 time, - EphyEditableToolbar *etoolbar) -{ - EphyToolbarsToolbar *t; - char *target; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - t = (EphyToolbarsToolbar *)g_object_get_data (G_OBJECT (widget), - "toolbar_drag_data"); - - target = t->id; - LOG ("Drag data get %s", t->id); - - gtk_selection_data_set (selection_data, - selection_data->target, - 8, target, strlen (target)); -} - -static void -ephy_editable_toolbar_remove_cb (EggAction *action, - EphyEditableToolbar *etoolbar) -{ - EphyToolbarsToolbar *t; - - t = g_object_get_data (G_OBJECT (etoolbar), "popup_toolbar"); - - ephy_toolbars_group_remove_toolbar (etoolbar->priv->group, t); -} - -static void -ephy_editable_toolbar_edit_cb (EggAction *action, - EphyEditableToolbar *etoolbar) -{ - ephy_editable_toolbar_edit (etoolbar, NULL); -} - -static GtkWidget * -get_item_widget (EphyEditableToolbar *t, gpointer data) -{ - GtkWidget *widget; - char *path; - - path = ephy_toolbars_group_get_path (t->priv->group, data); - g_return_val_if_fail (path != NULL, NULL); - - widget = egg_menu_merge_get_widget (t->priv->merge, path); - g_free (path); - - return widget; -} - -static void -connect_item_drag_source (EphyToolbarsItem *item, EphyEditableToolbar *etoolbar) -{ - GtkWidget *toolitem; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - g_return_if_fail (item != NULL); - - toolitem = get_item_widget (etoolbar, item); - - if (!g_object_get_data (G_OBJECT (toolitem), "drag_source_set")) - { - g_object_set_data (G_OBJECT (toolitem), "drag_source_set", - GINT_TO_POINTER (TRUE)); - - egg_tool_item_set_use_drag_window (EGG_TOOL_ITEM (toolitem), TRUE); - - g_object_set_data (G_OBJECT (toolitem), "item_data", item); - - gtk_drag_source_set (toolitem, GDK_BUTTON1_MASK, - source_drag_types, n_source_drag_types, - GDK_ACTION_MOVE); - g_signal_connect (toolitem, "drag_data_get", - G_CALLBACK (drag_data_get_cb), - etoolbar); - g_signal_connect (toolitem, "drag_data_delete", - G_CALLBACK (drag_data_delete_cb), - etoolbar); - } -} - -static void -disconnect_item_drag_source (EphyToolbarsItem *item, EphyEditableToolbar *etoolbar) -{ - GtkWidget *toolitem; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - g_return_if_fail (item != NULL); - - toolitem = get_item_widget (etoolbar, item); - - if (g_object_get_data (G_OBJECT (toolitem), "drag_source_set")) - { - g_object_set_data (G_OBJECT (toolitem), "drag_source_set", - GINT_TO_POINTER (FALSE)); - - egg_tool_item_set_use_drag_window (EGG_TOOL_ITEM (toolitem), FALSE); - - g_signal_handlers_disconnect_by_func (toolitem, - G_CALLBACK (drag_data_get_cb), - etoolbar); - g_signal_handlers_disconnect_by_func (toolitem, - G_CALLBACK (drag_data_delete_cb), - etoolbar); - } -} - -static void -connect_toolbar_drag_source (EphyToolbarsToolbar *t, - EphyEditableToolbar *etoolbar) -{ - GtkWidget *tb; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - g_return_if_fail (t != NULL); - - tb = get_item_widget (etoolbar, t); - - g_return_if_fail (tb != NULL); - - if (!g_object_get_data (G_OBJECT (tb), "drag_source_set")) - { - g_object_set_data (G_OBJECT (tb), "drag_source_set", - GINT_TO_POINTER (TRUE)); - - g_object_set_data (G_OBJECT (tb), "toolbar_drag_data", t); - - g_signal_connect (tb, "drag_data_get", - G_CALLBACK (toolbar_drag_data_get_cb), - etoolbar); - g_signal_connect (tb, "drag_data_delete", - G_CALLBACK (toolbar_drag_data_delete_cb), - etoolbar); - } -} - -static void -disconnect_toolbar_drag_source (EphyToolbarsToolbar *t, - EphyEditableToolbar *etoolbar) -{ - GtkWidget *tb; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - g_return_if_fail (t != NULL); - - tb = get_item_widget (etoolbar, t); - - g_return_if_fail (tb != NULL); - - if (g_object_get_data (G_OBJECT (tb), "drag_source_set")) - { - g_object_set_data (G_OBJECT (tb), "drag_source_set", - GINT_TO_POINTER (FALSE)); - - g_signal_handlers_disconnect_by_func (tb, - G_CALLBACK (toolbar_drag_data_get_cb), - etoolbar); - g_signal_handlers_disconnect_by_func (tb, - G_CALLBACK (toolbar_drag_data_delete_cb), - etoolbar); - } -} - -static void -popup_toolbar_context_menu (EggToolbar *toolbar, ContextMenuData *data) -{ - GtkWidget *widget; - - widget = egg_menu_merge_get_widget (data->etoolbar->priv->popup_merge, - "/popups/EphyToolbarPopup"); - - g_object_set_data (G_OBJECT (data->etoolbar), - "popup_toolbar", data->t); - - g_return_if_fail (widget != NULL); - - gtk_menu_popup (GTK_MENU (widget), NULL, NULL, NULL, NULL, 2, - gtk_get_current_event_time ()); -} - -static void -setup_toolbar (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar) -{ - GtkWidget *widget; - ContextMenuData *data; - int signal_id; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - g_return_if_fail (toolbar != NULL); - - widget = get_item_widget (etoolbar, toolbar); - g_object_set_data (G_OBJECT (widget), "toolbar_data", toolbar); - - if (!g_object_get_data (G_OBJECT (widget), "drag_dest_set")) - { - LOG ("Setup drag dest for toolbar %s", toolbar->id) - g_object_set_data (G_OBJECT (widget), "drag_dest_set", - GINT_TO_POINTER (TRUE)); - gtk_drag_dest_set (widget, GTK_DEST_DEFAULT_ALL, - dest_drag_types, n_dest_drag_types, - GDK_ACTION_MOVE | GDK_ACTION_COPY); - g_signal_connect (widget, "drag_data_received", - G_CALLBACK (drag_data_received_cb), - etoolbar); - } - - if (!g_object_get_data (G_OBJECT (widget), "popup_signal_id")) - { - data = g_new0 (ContextMenuData, 1); - data->etoolbar = etoolbar; - data->t = toolbar; - - signal_id = g_signal_connect_data (widget, - "popup_context_menu", - G_CALLBACK (popup_toolbar_context_menu), - data, (GClosureNotify)g_free, 0); - - g_object_set_data (G_OBJECT (widget), "popup_signal_id", - GINT_TO_POINTER (signal_id)); - } - - etoolbar->priv->last_toolbar = widget; -} - -static void -ensure_toolbar_min_size (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *t) -{ - GtkWidget *widget; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (t)); - g_return_if_fail (toolbar != NULL); - - widget = get_item_widget (t, toolbar); - - if (EGG_TOOLBAR (widget)->num_children == 0) - { - gtk_widget_set_size_request (widget, -1, 20); - } - else - { - gtk_widget_set_size_request (widget, -1, -1); - } -} - -static void -do_merge (EphyEditableToolbar *t) -{ - char *str; - guint ui_id; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (t)); - - str = ephy_toolbars_group_to_string (t->priv->group); - g_return_if_fail (str != NULL); - - LOG ("Merge UI\n%s", str) - - ui_id = egg_menu_merge_add_ui_from_string - (t->priv->merge, str, -1, NULL); - - if (t->priv->ui_id != 0) - { - LOG ("Remove old toolbar") - - egg_menu_merge_remove_ui (t->priv->merge, - t->priv->ui_id); - } - - t->priv->ui_id = ui_id; - - egg_menu_merge_ensure_update (t->priv->merge); - - ephy_toolbars_group_foreach_toolbar (t->priv->group, - (EphyToolbarsGroupForeachToolbarFunc) - setup_toolbar, t); - - if (t->priv->edit_mode) - { - ephy_toolbars_group_foreach_item (t->priv->group, - (EphyToolbarsGroupForeachItemFunc) - connect_item_drag_source, t); - - ephy_toolbars_group_foreach_toolbar (t->priv->group, - (EphyToolbarsGroupForeachToolbarFunc) - connect_toolbar_drag_source, t); - } - - ephy_toolbars_group_foreach_toolbar (t->priv->group, - (EphyToolbarsGroupForeachToolbarFunc) - ensure_toolbar_min_size, t); - - g_free (str); -} - -static void -ensure_action (EphyToolbarsItem *item, EphyEditableToolbar *t) -{ - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (t)); - g_return_if_fail (item != NULL); - - ephy_editable_toolbar_get_action (t, item->action); -} - -static void -group_changed_cb (EphyToolbarsGroup *group, EphyEditableToolbar *t) -{ - g_return_if_fail (IS_EPHY_TOOLBARS_GROUP (group)); - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (t)); - - t->priv->toolbars_dirty = TRUE; - - ephy_toolbars_group_foreach_item (t->priv->group, - (EphyToolbarsGroupForeachItemFunc) - ensure_action, t); - - queue_ui_update (t); -} - -static void -ephy_editable_toolbar_set_group (EphyEditableToolbar *t, EphyToolbarsGroup *group) -{ - g_return_if_fail (IS_EPHY_TOOLBARS_GROUP (group)); - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (t)); - - t->priv->group = group; - - g_signal_connect_object (group, "changed", - G_CALLBACK (group_changed_cb), - t, 0); -} - -static void -ephy_editable_toolbar_set_merge (EphyEditableToolbar *t, EggMenuMerge *merge) -{ - g_return_if_fail (EGG_IS_MENU_MERGE (merge)); - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (t)); - - t->priv->merge = merge; - - LOG ("Got MenuMerge") - - ephy_toolbars_group_foreach_item (t->priv->group, - (EphyToolbarsGroupForeachItemFunc) - ensure_action, t); - - do_merge (t); -} - -static void -ephy_editable_toolbar_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EphyEditableToolbar *t = EPHY_EDITABLE_TOOLBAR (object); - - switch (prop_id) - { - case PROP_MENU_MERGE: - ephy_editable_toolbar_set_merge (t, g_value_get_object (value)); - break; - case PROP_TOOLBARS_GROUP: - ephy_editable_toolbar_set_group (t, g_value_get_object (value)); - break; - } -} - -static void -ephy_editable_toolbar_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EphyEditableToolbar *t = EPHY_EDITABLE_TOOLBAR (object); - - switch (prop_id) - { - case PROP_MENU_MERGE: - g_value_set_object (value, t->priv->merge); - break; - case PROP_TOOLBARS_GROUP: - g_value_set_object (value, t->priv->group); - break; - } -} - -static void -ephy_editable_toolbar_class_init (EphyEditableToolbarClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (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; - - klass->get_action = impl_get_action; - klass->get_action_name = impl_get_action_name; - - g_object_class_install_property (object_class, - PROP_MENU_MERGE, - g_param_spec_object ("MenuMerge", - "MenuMerge", - "Menu merge", - EGG_TYPE_MENU_MERGE, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, - PROP_TOOLBARS_GROUP, - g_param_spec_object ("ToolbarsGroup", - "ToolbarsGroup", - "Toolbars Group", - EPHY_TOOLBARS_GROUP_TYPE, - G_PARAM_READWRITE)); -} - -static void -ephy_editable_toolbar_init (EphyEditableToolbar *t) -{ - int i; - - t->priv = g_new0 (EphyEditableToolbarPrivate, 1); - - t->priv->merge = NULL; - t->priv->editor = NULL; - t->priv->ui_id = 0; - t->priv->toolbars_dirty = FALSE; - t->priv->editor_sheet_dirty = FALSE; - t->priv->edit_mode = FALSE; - t->priv->actions_list = NULL; - - for (i = 0; i < ephy_toolbar_popups_n_entries; i++) - { - ephy_toolbar_popups[i].user_data = t; - } - - t->priv->popup_merge = egg_menu_merge_new (); - - t->priv->popup_action_group = egg_action_group_new ("ToolbarPopupActions"); - egg_action_group_add_actions (t->priv->popup_action_group, - ephy_toolbar_popups, - ephy_toolbar_popups_n_entries); - egg_menu_merge_insert_action_group (t->priv->popup_merge, - t->priv->popup_action_group, 0); - egg_menu_merge_add_ui_from_file (t->priv->popup_merge, - ephy_file ("epiphany-toolbar-popup-ui.xml"), - NULL); - - update_popup_menu (t); -} - -static void -ephy_editable_toolbar_finalize (GObject *object) -{ - EphyEditableToolbar *t = EPHY_EDITABLE_TOOLBAR (object); - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (object)); - - if (t->priv->editor) - { - gtk_widget_destroy (t->priv->editor); - } - - g_object_unref (t->priv->popup_action_group); - egg_menu_merge_remove_action_group (t->priv->popup_merge, - t->priv->popup_action_group); - g_object_unref (t->priv->popup_merge); - - g_free (t->priv); - - LOG ("EphyEditableToolbar finalized") - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -EphyEditableToolbar * -ephy_editable_toolbar_new (EggMenuMerge *merge) -{ - EphyEditableToolbar *t; - - t = EPHY_EDITABLE_TOOLBAR (g_object_new (EPHY_EDITABLE_TOOLBAR_TYPE, - "MenuMerge", merge, - NULL)); - - g_return_val_if_fail (t->priv != NULL, NULL); - - return t; -} - -static void -hide_editor (EphyEditableToolbar *etoolbar) -{ - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - gtk_widget_hide (GTK_WIDGET (etoolbar->priv->editor)); -} - -static void -editor_drag_data_received_cb (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time_, - EphyEditableToolbar *etoolbar) -{ - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - etoolbar->priv->editor_sheet_dirty = TRUE; - queue_ui_update (etoolbar); -} - -static void -editor_drag_data_delete_cb (GtkWidget *widget, - GdkDragContext *context, - EphyEditableToolbar *etoolbar) -{ - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - etoolbar->priv->editor_sheet_dirty = TRUE; - queue_ui_update (etoolbar); -} - -static void -editor_close (EphyEditableToolbar *etoolbar) -{ - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - etoolbar->priv->edit_mode = FALSE; - ephy_toolbars_group_foreach_item (etoolbar->priv->group, - (EphyToolbarsGroupForeachItemFunc) - disconnect_item_drag_source, - etoolbar); - ephy_toolbars_group_foreach_toolbar (etoolbar->priv->group, - (EphyToolbarsGroupForeachToolbarFunc) - disconnect_toolbar_drag_source, - etoolbar); - - update_popup_menu (etoolbar); - hide_editor (etoolbar); -} - -static void -editor_add_toolbar (EphyEditableToolbar *etoolbar) -{ - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - ephy_toolbars_group_add_toolbar (etoolbar->priv->group); - - etoolbar->priv->toolbars_dirty = TRUE; - queue_ui_update (etoolbar); -} - -static void -dialog_response_cb (GtkDialog *dialog, gint response_id, - EphyEditableToolbar *etoolbar) -{ - switch (response_id) - { - case RESPONSE_ADD_TOOLBAR: - editor_add_toolbar (etoolbar); - break; - case GTK_RESPONSE_CLOSE: - editor_close (etoolbar); - break; - } -} - -static void -setup_editor (EphyEditableToolbar *etoolbar, GtkWidget *window) -{ - GtkWidget *editor; - GtkWidget *scrolled_window; - GtkWidget *vbox; - GtkWidget *label_hbox; - GtkWidget *image; - GtkWidget *label; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - editor = gtk_dialog_new (), - gtk_dialog_set_has_separator (GTK_DIALOG (editor), FALSE); - gtk_widget_set_size_request (GTK_WIDGET (editor), 500, 330); - gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (window)); - gtk_window_set_title (GTK_WINDOW (editor), "Toolbar editor"); - etoolbar->priv->editor = editor; - - vbox = gtk_vbox_new (FALSE, 12); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); - gtk_widget_show (vbox); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (editor)->vbox), vbox); - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - etoolbar->priv->scrolled_window = scrolled_window; - gtk_widget_show (scrolled_window); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0); - label_hbox = gtk_hbox_new (FALSE, 6); - 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, " - "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); - - gtk_dialog_add_button (GTK_DIALOG (editor), - _("Add Toolbar"), - RESPONSE_ADD_TOOLBAR); - gtk_dialog_add_button (GTK_DIALOG (editor), - GTK_STOCK_CLOSE, - GTK_RESPONSE_CLOSE); - - g_signal_connect (editor, "response", - G_CALLBACK (dialog_response_cb), - etoolbar); - - update_editor_sheet (etoolbar); -} - -static void -add_to_list (EphyToolbarsItem *item, GList **l) -{ - g_return_if_fail (item != NULL); - - *l = g_list_append (*l, item); -} - -static void -update_editor_sheet (EphyEditableToolbar *etoolbar) -{ - GList *l; - GList *to_drag = NULL; - int x, y, height, width; - GtkWidget *table; - GtkWidget *viewport; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - 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_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, n_dest_drag_types, GDK_ACTION_MOVE); - g_signal_connect (table, "drag_data_received", - G_CALLBACK (editor_drag_data_received_cb), - etoolbar); - - ephy_toolbars_group_foreach_available (etoolbar->priv->group, - (EphyToolbarsGroupForeachItemFunc) - add_to_list, &to_drag); - - x = y = 0; - width = 4; - height = (g_list_length (to_drag) - 1) / width + 1; - gtk_table_resize (GTK_TABLE (etoolbar->priv->table), height, width); - - for (l = to_drag; l != NULL; l = l->next) - { - GtkWidget *event_box; - GtkWidget *vbox; - GtkWidget *icon; - GtkWidget *label; - EphyToolbarsItem *node = (EphyToolbarsItem *) (l->data); - EggAction *action; - - action = ephy_editable_toolbar_get_action - (etoolbar, node->action); - g_return_if_fail (action != NULL); - - event_box = gtk_event_box_new (); - gtk_widget_show (event_box); - gtk_drag_source_set (event_box, - GDK_BUTTON1_MASK, - 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); - - vbox = gtk_vbox_new (0, FALSE); - gtk_widget_show (vbox); - gtk_container_add (GTK_CONTAINER (event_box), vbox); - - icon = gtk_image_new_from_stock - (action->stock_id ? action->stock_id : GTK_STOCK_DND, - GTK_ICON_SIZE_LARGE_TOOLBAR); - gtk_widget_show (icon); - gtk_box_pack_start (GTK_BOX (vbox), icon, FALSE, TRUE, 0); - - label = gtk_label_new_with_mnemonic (action->label); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0); - - gtk_table_attach_defaults (GTK_TABLE (etoolbar->priv->table), - event_box, x, x + 1, y, y + 1); - - x ++; - if (x >= width) - { - x = 0; - y++; - } - } - - g_list_free (to_drag); -} - -static void -show_editor (EphyEditableToolbar *etoolbar) -{ - GtkWidget *editor = etoolbar->priv->editor; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - g_return_if_fail (editor != NULL); - - gtk_widget_show (GTK_WIDGET (editor)); -} - -static void -set_action_sensitive (EphyToolbarsItem *item, EphyEditableToolbar *etoolbar) -{ - EggAction *action; - - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - g_return_if_fail (item != NULL); - - if (!item->separator) - { - action = find_action (etoolbar, item->action); - g_object_set (action, "sensitive", TRUE, NULL); - } -} - -void -ephy_editable_toolbar_edit (EphyEditableToolbar *etoolbar, GtkWidget *window) -{ - g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); - - etoolbar->priv->edit_mode = TRUE; - ephy_toolbars_group_foreach_item (etoolbar->priv->group, - (EphyToolbarsGroupForeachItemFunc) - connect_item_drag_source, etoolbar); - ephy_toolbars_group_foreach_item (etoolbar->priv->group, - (EphyToolbarsGroupForeachItemFunc) - set_action_sensitive, etoolbar); - ephy_toolbars_group_foreach_toolbar (etoolbar->priv->group, - (EphyToolbarsGroupForeachToolbarFunc) - connect_toolbar_drag_source, etoolbar); - - update_popup_menu (etoolbar); - - setup_editor (etoolbar, window); - show_editor (etoolbar); -} - -char * -ephy_editable_toolbar_get_action_name (EphyEditableToolbar *etoolbar, - const char *drag_type, - const char *data) -{ - EphyEditableToolbarClass *klass = EPHY_EDITABLE_TOOLBAR_GET_CLASS (etoolbar); - return klass->get_action_name (etoolbar, drag_type, data); -} - -EggAction * -ephy_editable_toolbar_get_action (EphyEditableToolbar *etoolbar, - const char *name) -{ - EphyEditableToolbarClass *klass = EPHY_EDITABLE_TOOLBAR_GET_CLASS (etoolbar); - return klass->get_action (etoolbar, name); -} |