/* * e-shell-shortcut.c: Handles events from the shortcut bar widget on the * e-shell-view * * Authors: * Damon Chaplin (damon@gtk.org) * Miguel de Icaza (miguel@kernel.org) * * (C) 1999, 2000 Helix Code, Inc. */ #include #include #include "shortcut-bar/e-shortcut-bar.h" #include "e-shell-shortcut.h" #define SMALL_ICONS 1 #define LARGE_ICONS 2 static void set_large_icons (GtkMenuItem *menu_item, EShellView *eshell_view) { EShortcutGroup *sg = gtk_object_get_data (GTK_OBJECT (menu_item), "shortcut_group"); g_assert (sg != NULL); e_shortcut_group_set_view_type (sg, E_ICON_BAR_LARGE_ICONS); } static void set_small_icons (GtkMenu *menu_item, EShellView *eshell_view) { EShortcutGroup *sg = gtk_object_get_data (GTK_OBJECT (menu_item), "shortcut_group"); g_assert (sg != NULL); e_shortcut_group_set_view_type (sg, E_ICON_BAR_SMALL_ICONS); } static void add_group (GtkMenu *menu, EShellView *eshell_view) { int group_num; GtkWidget *entry; group_num = e_shortcut_bar_model_add_group (eshell_view->eshell->shortcut_bar); /* * FIXME: Figure out why this does not quite work */ entry = gtk_entry_new (); gtk_widget_show (entry); e_group_bar_set_group_button_label ( E_GROUP_BAR (eshell_view->shortcut_bar), group_num, entry); } static void remove_group (GtkMenuItem *menu_item, EShellView *eshell_view) { EShortcutGroup *sg = gtk_object_get_data (GTK_OBJECT (menu_item), "shortcut_group"); g_assert (sg != NULL); e_shortcut_bar_model_remove_group (eshell_view->eshell->shortcut_bar, sg); } static void do_rename (GtkEntry *entry, EShortcutGroup *sg) { e_shortcut_group_rename (sg, gtk_entry_get_text (entry)); } static void rename_group (GtkMenuItem *menu_item, EShellView *eshell_view) { EShortcutGroup *sg = gtk_object_get_data (GTK_OBJECT (menu_item), "shortcut_group"); GtkWidget *entry; int item; g_assert (sg != NULL); item = e_group_num_from_group_ptr (eshell_view->eshell->shortcut_bar, sg); e_shortcut_group_rename (sg, "Dum de da"); return; entry = gtk_entry_new (); gtk_widget_show (entry); gtk_widget_grab_focus (entry); gtk_signal_connect (GTK_OBJECT (entry), "activate", GTK_SIGNAL_FUNC (do_rename), sg); e_group_bar_set_group_button_label (E_GROUP_BAR (eshell_view->shortcut_bar), item, entry); } static void add_shortcut (GtkMenu *menu, EShellView *eshell_view) { } static struct { char *label; int flags; GtkSignalFunc callback; } shortcut_menu [] = { { N_("Large Icons"), SMALL_ICONS, GTK_SIGNAL_FUNC (set_large_icons) }, { N_("Small Icons"), LARGE_ICONS, GTK_SIGNAL_FUNC (set_small_icons) }, { NULL, 0, NULL }, { N_("Add New Group"), 0, GTK_SIGNAL_FUNC (add_group) }, { N_("Remove Group"), 0, GTK_SIGNAL_FUNC (remove_group) }, { N_("Rename Group"), 0, GTK_SIGNAL_FUNC (rename_group) }, { NULL, 0, NULL }, { N_("Add Shortcut"), 0, GTK_SIGNAL_FUNC (add_shortcut) }, }; #define ELEMENTS(x) (sizeof (x) / sizeof (x[0])) static void shortcut_bar_show_standard_popup (EShellView *eshell_view, GdkEvent *event, EShortcutGroup *shortcut_group) { GtkWidget *menu, *menuitem; int i; menu = gtk_menu_new (); for (i = 0; i < ELEMENTS (shortcut_menu); i++){ gboolean disable = FALSE; if (shortcut_menu [i].flags & SMALL_ICONS) if (shortcut_group->type != E_ICON_BAR_SMALL_ICONS) disable = TRUE; if (shortcut_menu [i].flags & LARGE_ICONS) if (shortcut_group->type != E_ICON_BAR_LARGE_ICONS) disable = TRUE; if (shortcut_menu [i].label == NULL){ menuitem = gtk_menu_item_new (); gtk_widget_set_sensitive (menuitem, FALSE); } else menuitem = gtk_menu_item_new_with_label (_(shortcut_menu [i].label)); if (disable) gtk_widget_set_sensitive (menuitem, FALSE); gtk_widget_show (menuitem); gtk_menu_append (GTK_MENU (menu), menuitem); gtk_signal_connect ( GTK_OBJECT (menuitem), "activate", shortcut_menu [i].callback, eshell_view); gtk_object_set_data ( GTK_OBJECT (menuitem), "shortcut_group", shortcut_group); } gtk_signal_connect (GTK_OBJECT (menu), "deactivate", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button.button, event->button.time); gtk_main (); gtk_object_destroy (GTK_OBJECT (menu)); } static void shortcut_open (GtkMenuItem *menuitem, EShellView *eshell_view) { } static void shortcut_open_new_window (GtkMenuItem *menuitem, EShellView *eshell_view) { } static void shortcut_remove (GtkMenuItem *menuitem, EShellView *eshell_view) { } static void shortcut_rename (GtkMenuItem *menuitem, EShellView *eshell_view) { printf ("Implement: %s %s\n", __FILE__, __FUNCTION__); } static void shortcut_properties (GtkMenuItem *menuitem, EShellView *eshell_view) { printf ("Implement: %s %s\n", __FILE__, __FUNCTION__); } #define NOT_IMPLEMENTED 1 static struct { char *label; char *stock_id; int flags; GtkSignalFunc callback; } context_shortcut_menu [] = { { N_("Open Folder"), GNOME_STOCK_MENU_OPEN, 0, GTK_SIGNAL_FUNC (shortcut_open) }, { N_("Open in New Window"), NULL, 0, GTK_SIGNAL_FUNC (shortcut_open_new_window) }, { N_("Advanced Find"), NULL, NOT_IMPLEMENTED, NULL }, { NULL, }, { N_("Remove From Shortcut Bar"), NULL, 0, GTK_SIGNAL_FUNC (shortcut_remove) }, { N_("Rename Shortcut"), NULL, 0, GTK_SIGNAL_FUNC (shortcut_rename) }, { NULL, }, { N_("Properties"), NULL, 0, GTK_SIGNAL_FUNC (shortcut_properties) }, }; static void shortcut_bar_show_context_popup (EShellView *eshell_view, GdkEvent *event, EShortcutGroup *shortcut_group) { GtkWidget *menu, *menuitem; int i; gboolean disable; menu = gtk_menu_new (); for (i = 0; i < ELEMENTS (context_shortcut_menu); i++){ disable = FALSE; if (context_shortcut_menu [i].flags & NOT_IMPLEMENTED) disable = TRUE; if (context_shortcut_menu [i].label == NULL){ menuitem = gtk_menu_item_new (); gtk_widget_set_sensitive (menuitem, FALSE); } else { GtkWidget *label; if (context_shortcut_menu [i].stock_id){ GtkWidget *stock; menuitem = gtk_pixmap_menu_item_new (); stock = gnome_stock_pixmap_widget ( menu, context_shortcut_menu [i].stock_id); if (stock){ gtk_widget_show (stock); gtk_pixmap_menu_item_set_pixmap ( GTK_PIXMAP_MENU_ITEM (menuitem), stock); } } else menuitem = gtk_menu_item_new (); label = gtk_label_new (_(context_shortcut_menu [i].label)); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_show (label); gtk_container_add (GTK_CONTAINER (menuitem), label); } if (disable) gtk_widget_set_sensitive (menuitem, FALSE); gtk_widget_show (menuitem); gtk_menu_append (GTK_MENU (menu), menuitem); gtk_signal_connect ( GTK_OBJECT (menuitem), "activate", context_shortcut_menu [i].callback, eshell_view); gtk_object_set_data ( GTK_OBJECT (menuitem), "shortcut_group", shortcut_group); } gtk_signal_connect (GTK_OBJECT (menu), "deactivate", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button.button, event->button.time); gtk_main (); gtk_object_destroy (GTK_OBJECT (menu)); } void shortcut_bar_item_selected (EShortcutBar *e_shortcut_bar, GdkEvent *event, gint group_num, gint item_num, EShellView *eshell_view) { EShortcut *shortcut; EShortcutGroup *shortcut_group; EShortcutBarModel *shortcut_bar = eshell_view->eshell->shortcut_bar; shortcut_group = e_shortcut_group_from_pos (shortcut_bar, group_num); if (shortcut_group == NULL) return; shortcut = e_shortcut_from_pos (shortcut_group, item_num); if (group_num == -1) return; if (event->button.button == 1) { printf ("Item Selected - %i:%i", group_num + 1, item_num + 1); } else if (event->button.button == 3) { if (shortcut == NULL) shortcut_bar_show_standard_popup ( eshell_view, event, shortcut_group); else shortcut_bar_show_context_popup ( eshell_view, event, shortcut_group); } }