From 5df4d67be220866f4dd6121cb26158cf5299193f Mon Sep 17 00:00:00 2001 From: Christopher James Lahey Date: Tue, 23 Apr 2002 19:42:37 +0000 Subject: Removed e_addressbook_reflow_adapter_right_click and 2002-04-23 Christopher James Lahey * gui/widgets/e-addressbook-reflow-adapter.c, gui/widgets/e-addressbook-reflow-adapter.h: Removed e_addressbook_reflow_adapter_right_click and e_addressbook_reflow_adapter_base_right_click. * gui/widgets/e-addressbook-view.c: Handle right click menu for both types of view. Merged right click on white space with right click on main area. General clean up. * gui/widgets/e-minicard-view-widget.c, gui/widgets/e-minicard-view-widget.h: Removed a couple unnecessary functions. Added e_minicard_view_widget_get_view. Added right_click signal. * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h: Added the right_click signal and the e_minicard_view_get_card_list function. svn path=/trunk/; revision=16567 --- addressbook/gui/widgets/e-addressbook-view.c | 562 +++++++++++++++------------ 1 file changed, 303 insertions(+), 259 deletions(-) (limited to 'addressbook/gui/widgets/e-addressbook-view.c') diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c index 33f7ccc3be..1cb1b888bf 100644 --- a/addressbook/gui/widgets/e-addressbook-view.c +++ b/addressbook/gui/widgets/e-addressbook-view.c @@ -576,6 +576,296 @@ e_addressbook_view_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) } } +/* Popup menu stuff */ +typedef struct { + EAddressbookView *view; + EPopupMenu *submenu; + gpointer closure; +} CardAndBook; + +static void +card_and_book_free (CardAndBook *card_and_book) +{ + EAddressbookView *view = card_and_book->view; + + if (card_and_book->submenu) + gal_view_instance_free_popup_menu (card_and_book->view->view_instance, + card_and_book->submenu); + + if (E_IS_TABLE_SCROLLED (view->widget)) { + ETable *table = e_table_scrolled_get_table (E_TABLE_SCROLLED (view->widget)); + + e_table_right_click_up (table); + } else if (E_IS_MINICARD_VIEW_WIDGET (view->object)) { + EMinicardViewWidget *minicard_view_widget = + E_MINICARD_VIEW_WIDGET (view->object); + ESelectionModel *selection = + e_minicard_view_widget_get_selection_model (minicard_view_widget); + + e_selection_model_right_click_up(selection); + } + + gtk_object_unref(GTK_OBJECT(card_and_book->view)); +} + +static void +table_get_card_list_1(gint model_row, + gpointer closure) +{ + CardAndBook *card_and_book; + GList **list; + EAddressbookView *view; + ECard *card; + + card_and_book = closure; + list = card_and_book->closure; + view = card_and_book->view; + + card = e_addressbook_model_get_card(view->model, model_row); + *list = g_list_prepend(*list, card); +} + +static GList * +get_card_list (CardAndBook *card_and_book) +{ + GList *list = NULL; + EAddressbookView *view = card_and_book->view; + + if (E_IS_TABLE_SCROLLED (view->widget)) { + ETable *table; + ETableScrolled *scrolled = E_TABLE_SCROLLED (view->widget); + table = e_table_scrolled_get_table (scrolled); + card_and_book->closure = &list; + e_table_selected_row_foreach(table, + table_get_card_list_1, + card_and_book); + } else if (E_IS_MINICARD_VIEW_WIDGET (view->object)) { + EMinicardViewWidget *view_widget = + E_MINICARD_VIEW_WIDGET (view->object); + EMinicardView *view = + e_minicard_view_widget_get_view (view_widget); + + list = e_minicard_view_get_card_list (view); + } + + return list; +} + +static void +save_as (GtkWidget *widget, CardAndBook *card_and_book) +{ + GList *cards = get_card_list (card_and_book); + if (cards) { + e_contact_list_save_as(_("Save as VCard"), cards); + e_free_object_list(cards); + } +} + +static void +send_as (GtkWidget *widget, CardAndBook *card_and_book) +{ + GList *cards = get_card_list (card_and_book); + if (cards) { + e_card_list_send(cards, E_CARD_DISPOSITION_AS_ATTACHMENT); + e_free_object_list(cards); + } +} + +static void +send_to (GtkWidget *widget, CardAndBook *card_and_book) + +{ + GList *cards = get_card_list (card_and_book); + if (cards) { + e_card_list_send(cards, E_CARD_DISPOSITION_AS_TO); + e_free_object_list(cards); + } +} + +static void +print (GtkWidget *widget, CardAndBook *card_and_book) +{ + GList *cards = get_card_list (card_and_book); + if (cards) { + if (cards->next) + gtk_widget_show(e_contact_print_card_list_dialog_new(cards)); + else + gtk_widget_show(e_contact_print_card_dialog_new(cards->data)); + e_free_object_list(cards); + } +} + +#if 0 /* Envelope printing is disabled for Evolution 1.0. */ +static void +print_envelope (GtkWidget *widget, CardAndBook *card_and_book) +{ + GList *cards = get_card_list (card_and_book); + if (cards) { + gtk_widget_show(e_contact_list_print_envelope_dialog_new(card_and_book->card)); + e_free_object_list(cards); + } +} +#endif + +static void +copy (GtkWidget *widget, CardAndBook *card_and_book) +{ + e_addressbook_view_copy (card_and_book->view); +} + +static void +paste (GtkWidget *widget, CardAndBook *card_and_book) +{ + e_addressbook_view_paste (card_and_book->view); +} + +static void +cut (GtkWidget *widget, CardAndBook *card_and_book) +{ + e_addressbook_view_cut (card_and_book->view); +} + +static void +delete (GtkWidget *widget, CardAndBook *card_and_book) +{ + if (e_contact_editor_confirm_delete(GTK_WINDOW(gtk_widget_get_toplevel(card_and_book->view->widget)))) { + EBook *book; + + GList *list = get_card_list(card_and_book); + GList *iterator; + + gtk_object_get(GTK_OBJECT(card_and_book->view->model), + "book", &book, + NULL); + + for (iterator = list; iterator; iterator = iterator->next) { + ECard *card = iterator->data; + /* Remove the card. */ + e_book_remove_card (book, + card, + NULL, + NULL); + } + e_free_object_list(list); + } +} + +static void +copy_to_folder (GtkWidget *widget, CardAndBook *card_and_book) +{ + e_addressbook_view_copy_to_folder (card_and_book->view); +} + +static void +move_to_folder (GtkWidget *widget, CardAndBook *card_and_book) +{ + e_addressbook_view_move_to_folder (card_and_book->view); +} + +static void +free_popup_info (GtkWidget *w, CardAndBook *card_and_book) +{ + card_and_book_free (card_and_book); +} + +static void +new_card (GtkWidget *widget, CardAndBook *card_and_book) +{ + EBook *book; + + gtk_object_get(GTK_OBJECT(card_and_book->view->model), + "book", &book, + NULL); + e_addressbook_show_contact_editor (book, e_card_new(""), TRUE, TRUE); +} + +static void +new_list (GtkWidget *widget, CardAndBook *card_and_book) +{ + EBook *book; + + gtk_object_get(GTK_OBJECT(card_and_book->view->model), + "book", &book, + NULL); + e_addressbook_show_contact_list_editor (book, e_card_new(""), TRUE, TRUE); +} + +#define POPUP_READONLY_MASK 0x1 +#define POPUP_NOSELECTION_MASK 0x2 + +static void +do_popup_menu(EAddressbookView *view, GdkEvent *event) +{ + CardAndBook *card_and_book; + GtkMenu *popup; + EPopupMenu *submenu = NULL; + gboolean selection; + + EPopupMenu menu[] = { + E_POPUP_ITEM (N_("New Contact..."), GTK_SIGNAL_FUNC(new_card), POPUP_READONLY_MASK), + E_POPUP_ITEM (N_("New Contact List..."), GTK_SIGNAL_FUNC(new_list), POPUP_READONLY_MASK), + E_POPUP_SEPARATOR, +#if 0 + E_POPUP_ITEM (N_("Go to Folder..."), GTK_SIGNAL_FUNC (goto_folder), 0), + E_POPUP_ITEM (N_("Import..."), GTK_SIGNAL_FUNC (import), POPUP_READONLY_MASK), + E_POPUP_SEPARATOR, + E_POPUP_ITEM (N_("Search for Contacts..."), GTK_SIGNAL_FUNC (search), 0), + E_POPUP_ITEM (N_("Addressbook Sources..."), GTK_SIGNAL_FUNC (sources), 0), + E_POPUP_SEPARATOR, + E_POPUP_ITEM (N_("Pilot Settings..."), GTK_SIGNAL_FUNC (pilot_settings), 0), +#endif + E_POPUP_SEPARATOR, + E_POPUP_ITEM (N_("Save as VCard"), GTK_SIGNAL_FUNC(save_as), POPUP_NOSELECTION_MASK), + E_POPUP_ITEM (N_("Forward Contact"), GTK_SIGNAL_FUNC(send_as), POPUP_NOSELECTION_MASK), + E_POPUP_ITEM (N_("Send Message to Contact"), GTK_SIGNAL_FUNC(send_to), POPUP_NOSELECTION_MASK), + E_POPUP_ITEM (N_("Print"), GTK_SIGNAL_FUNC(print), POPUP_NOSELECTION_MASK), +#if 0 /* Envelope printing is disabled for Evolution 1.0. */ + E_POPUP_ITEM (N_("Print Envelope"), GTK_SIGNAL_FUNC(print_envelope), POPUP_NOSELECTION_MASK), +#endif + E_POPUP_SEPARATOR, + + E_POPUP_ITEM (N_("Copy to folder..."), GTK_SIGNAL_FUNC(copy_to_folder), POPUP_NOSELECTION_MASK), + E_POPUP_ITEM (N_("Move to folder..."), GTK_SIGNAL_FUNC(move_to_folder), POPUP_READONLY_MASK | POPUP_NOSELECTION_MASK), + E_POPUP_SEPARATOR, + + E_POPUP_ITEM (N_("Cut"), GTK_SIGNAL_FUNC (cut), POPUP_READONLY_MASK | POPUP_NOSELECTION_MASK), + E_POPUP_ITEM (N_("Copy"), GTK_SIGNAL_FUNC (copy), POPUP_NOSELECTION_MASK), + E_POPUP_ITEM (N_("Paste"), GTK_SIGNAL_FUNC (paste), POPUP_READONLY_MASK), + E_POPUP_ITEM (N_("Delete"), GTK_SIGNAL_FUNC(delete), POPUP_READONLY_MASK | POPUP_NOSELECTION_MASK), + E_POPUP_SEPARATOR, + + E_POPUP_SUBMENU (N_("Current View"), submenu = gal_view_instance_get_popup_menu (view->view_instance), 0), + E_POPUP_TERMINATOR + }; + + if (E_IS_TABLE_SCROLLED(view->widget)) { + selection = e_table_selected_count(e_table_scrolled_get_table (E_TABLE_SCROLLED (view->widget))) > 0; + } else if (E_IS_MINICARD_VIEW_WIDGET (view->object)) { + EMinicardViewWidget *minicard_view_widget = E_MINICARD_VIEW_WIDGET (view->object); + ESelectionModel *selection_model = e_minicard_view_widget_get_selection_model (minicard_view_widget); + selection = e_selection_model_selected_count(selection_model) > 0; + } else { + selection = FALSE; + } + card_and_book = g_new(CardAndBook, 1); + card_and_book->view = view; + card_and_book->submenu = submenu; + + gtk_object_ref(GTK_OBJECT(card_and_book->view)); + + popup = e_popup_menu_create (menu, + (e_addressbook_model_editable (view->model) ? 0 : POPUP_READONLY_MASK) + + (selection ? 0 : POPUP_NOSELECTION_MASK), + 0, card_and_book); + + gtk_signal_connect (GTK_OBJECT (popup), "selection-done", + GTK_SIGNAL_FUNC (free_popup_info), card_and_book); + e_popup_menu (popup, event); + +} + + +/* Minicard view stuff */ /* Translators: put here a list of labels you want to see on buttons in addressbook. You may use any character to separate labels but it must @@ -776,6 +1066,12 @@ minicard_button_press (GtkWidget *widget, GdkEventButton *event, EAddressbookVie d(g_print ("Button %d pressed with event type %d\n", event->button, event->type)); } +static void +minicard_right_click (EMinicardView *minicard_view_item, GdkEvent *event, EAddressbookView *view) +{ + do_popup_menu(view, event); +} + static void create_minicard_view (EAddressbookView *view) { @@ -802,6 +1098,9 @@ create_minicard_view (EAddressbookView *view) gtk_signal_connect(GTK_OBJECT(minicard_view), "button_press_event", GTK_SIGNAL_FUNC(minicard_button_press), view); + gtk_signal_connect(GTK_OBJECT(minicard_view), "right_click", + GTK_SIGNAL_FUNC(minicard_right_click), view); + view->object = GTK_OBJECT(minicard_view); view->widget = minicard_hbox; @@ -861,273 +1160,18 @@ table_double_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, E } } -typedef struct { - EBook *book; - ECard *card; - EAddressbookView *view; - GtkWidget *widget; - EPopupMenu *submenu; - gpointer closure; -} CardAndBook; - -static void -card_and_book_free (CardAndBook *card_and_book) -{ - if (card_and_book->submenu) - gal_view_instance_free_popup_menu (card_and_book->view->view_instance, - card_and_book->submenu); - - gtk_object_unref(GTK_OBJECT(card_and_book->card)); - gtk_object_unref(GTK_OBJECT(card_and_book->book)); - gtk_object_unref(GTK_OBJECT(card_and_book->view)); -} - -static void -get_card_list_1(gint model_row, - gpointer closure) -{ - CardAndBook *card_and_book; - GList **list; - EAddressbookView *view; - ECard *card; - - card_and_book = closure; - list = card_and_book->closure; - view = card_and_book->view; - - card = e_addressbook_model_get_card(view->model, model_row); - *list = g_list_prepend(*list, card); -} - -static GList * -get_card_list (CardAndBook *card_and_book) -{ - GList *list = NULL; - ETable *table; - - table = E_TABLE(card_and_book->widget); - card_and_book->closure = &list; - e_table_selected_row_foreach(table, - get_card_list_1, - card_and_book); - return list; -} - -static void -save_as (GtkWidget *widget, CardAndBook *card_and_book) -{ - e_contact_save_as(_("Save as VCard"), card_and_book->card); -} - -static void -send_as (GtkWidget *widget, CardAndBook *card_and_book) -{ - e_card_send(card_and_book->card, E_CARD_DISPOSITION_AS_ATTACHMENT); -} - -static void -send_to (GtkWidget *widget, CardAndBook *card_and_book) - -{ - e_card_send(card_and_book->card, E_CARD_DISPOSITION_AS_TO); -} - -static void -print (GtkWidget *widget, CardAndBook *card_and_book) -{ - gtk_widget_show(e_contact_print_card_dialog_new(card_and_book->card)); -} - -#if 0 /* Envelope printing is disabled for Evolution 1.0. */ -static void -print_envelope (GtkWidget *widget, CardAndBook *card_and_book) -{ - gtk_widget_show(e_contact_print_envelope_dialog_new(card_and_book->card)); -} -#endif - -static void -copy (GtkWidget *widget, CardAndBook *card_and_book) -{ -#if 0 - card_and_book->view->clipboard_cards = g_list_append (NULL, card_and_book->card); - gtk_object_ref (GTK_OBJECT (card_and_book->card)); - gtk_selection_owner_set (card_and_book->view->invisible, clipboard_atom, GDK_CURRENT_TIME); -#endif - - e_addressbook_view_copy (card_and_book->view); -} - -static void -paste (GtkWidget *widget, CardAndBook *card_and_book) -{ - e_addressbook_view_paste (card_and_book->view); -} - -static void -cut (GtkWidget *widget, CardAndBook *card_and_book) -{ -#if 0 - /* copy */ - card_and_book->view->clipboard_cards = g_list_append (NULL, card_and_book->card); - gtk_object_ref (GTK_OBJECT (card_and_book->card)); - gtk_selection_owner_set (card_and_book->view->invisible, clipboard_atom, GDK_CURRENT_TIME); - - /* delete */ - e_book_remove_card (card_and_book->book, card_and_book->card, NULL, NULL); -#endif - - e_addressbook_view_cut (card_and_book->view); -} - -static void -delete (GtkWidget *widget, CardAndBook *card_and_book) -{ - if (e_contact_editor_confirm_delete(GTK_WINDOW(gtk_widget_get_toplevel(card_and_book->widget)))) { - GList *list = get_card_list(card_and_book); - GList *iterator; - for (iterator = list; iterator; iterator = iterator->next) { - ECard *card = iterator->data; - /* Add the card in the contact editor to our ebook */ - e_book_remove_card (card_and_book->book, - card, - NULL, - NULL); - } - e_free_object_list(list); - } -} - -static void -copy_to_folder (GtkWidget *widget, CardAndBook *card_and_book) -{ - e_addressbook_view_copy_to_folder (card_and_book->view); -} - -static void -move_to_folder (GtkWidget *widget, CardAndBook *card_and_book) -{ - e_addressbook_view_move_to_folder (card_and_book->view); -} - -static void -free_popup_info (GtkWidget *w, CardAndBook *card_and_book) -{ - card_and_book_free (card_and_book); -} - -#define POPUP_READONLY_MASK 0x1 static gint table_right_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EAddressbookView *view) { - if (E_IS_ADDRESSBOOK_TABLE_ADAPTER(view->object)) { - EAddressbookModel *model = view->model; - CardAndBook *card_and_book; - GtkMenu *popup; - EPopupMenu *submenu; - - EPopupMenu menu[] = { - E_POPUP_ITEM (N_("Save as VCard"), GTK_SIGNAL_FUNC(save_as), 0), - E_POPUP_ITEM (N_("Forward Contact"), GTK_SIGNAL_FUNC(send_as), 0), - E_POPUP_ITEM (N_("Send Message to Contact"), GTK_SIGNAL_FUNC(send_to), 0), - E_POPUP_ITEM (N_("Print"), GTK_SIGNAL_FUNC(print), 0), -#if 0 /* Envelope printing is disabled for Evolution 1.0. */ - E_POPUP_ITEM (N_("Print Envelope"), GTK_SIGNAL_FUNC(print_envelope), 0), -#endif - E_POPUP_SEPARATOR, - - E_POPUP_ITEM (N_("Copy to folder..."), GTK_SIGNAL_FUNC(copy_to_folder), 0), - E_POPUP_ITEM (N_("Move to folder..."), GTK_SIGNAL_FUNC(move_to_folder), POPUP_READONLY_MASK), - E_POPUP_SEPARATOR, - - E_POPUP_ITEM (N_("Cut"), GTK_SIGNAL_FUNC (cut), POPUP_READONLY_MASK), - E_POPUP_ITEM (N_("Copy"), GTK_SIGNAL_FUNC (copy), 0), - E_POPUP_ITEM (N_("Paste"), GTK_SIGNAL_FUNC (paste), POPUP_READONLY_MASK), - E_POPUP_ITEM (N_("Delete"), GTK_SIGNAL_FUNC(delete), POPUP_READONLY_MASK), - E_POPUP_SEPARATOR, - - E_POPUP_SUBMENU (N_("Current View"), submenu = gal_view_instance_get_popup_menu (view->view_instance), 0), - E_POPUP_TERMINATOR - }; - - card_and_book = g_new(CardAndBook, 1); - card_and_book->card = e_addressbook_model_get_card(model, row); - card_and_book->widget = GTK_WIDGET(table); - card_and_book->view = view; - card_and_book->submenu = submenu; - - gtk_object_get(GTK_OBJECT(model), - "book", &(card_and_book->book), - NULL); - - gtk_object_ref(GTK_OBJECT(card_and_book->book)); - gtk_object_ref(GTK_OBJECT(card_and_book->view)); - - popup = e_popup_menu_create (menu, - e_addressbook_model_editable (model) ? 0 : POPUP_READONLY_MASK, - 0, card_and_book); - - gtk_signal_connect (GTK_OBJECT (popup), "selection-done", - GTK_SIGNAL_FUNC (free_popup_info), card_and_book); - e_popup_menu (popup, event); - - return TRUE; - } else - return FALSE; -} - -static void -new_card (GtkWidget *widget, CardAndBook *card_and_book) -{ - e_addressbook_show_contact_editor (card_and_book->book, e_card_new(""), TRUE, TRUE); -} - -static void -new_list (GtkWidget *widget, CardAndBook *card_and_book) -{ - e_addressbook_show_contact_list_editor (card_and_book->book, e_card_new(""), TRUE, TRUE); + do_popup_menu(view, event); + return TRUE; } static gint table_white_space_event(ETableScrolled *table, GdkEvent *event, EAddressbookView *view) { - if (event->type == GDK_BUTTON_PRESS && ((GdkEventButton *)event)->button == 3 && - E_IS_ADDRESSBOOK_TABLE_ADAPTER(view->object)) { - EAddressbookModel *model = view->model; - CardAndBook *card_and_book; - GtkMenu *popup; - EPopupMenu *submenu; - - EPopupMenu menu[] = { - E_POPUP_ITEM (N_("New Contact..."), GTK_SIGNAL_FUNC(new_card), POPUP_READONLY_MASK), - E_POPUP_ITEM (N_("New Contact List..."), GTK_SIGNAL_FUNC(new_list), POPUP_READONLY_MASK), - E_POPUP_SEPARATOR, - E_POPUP_ITEM (N_("Paste"), GTK_SIGNAL_FUNC (paste), POPUP_READONLY_MASK), - E_POPUP_SEPARATOR, - E_POPUP_SUBMENU (N_("Current View"), submenu = gal_view_instance_get_popup_menu (view->view_instance), 0), - E_POPUP_TERMINATOR - }; - - card_and_book = g_new(CardAndBook, 1); - card_and_book->card = NULL; - card_and_book->widget = GTK_WIDGET(table); - card_and_book->view = view; - card_and_book->submenu = submenu; - gtk_object_get(GTK_OBJECT(model), - "book", &(card_and_book->book), - NULL); - - gtk_object_ref(GTK_OBJECT(card_and_book->book)); - gtk_object_ref(GTK_OBJECT(card_and_book->view)); - - popup = e_popup_menu_create (menu, - e_addressbook_model_editable (model) ? 0 : POPUP_READONLY_MASK, - 0, card_and_book); - - gtk_signal_connect (GTK_OBJECT (popup), "selection-done", - GTK_SIGNAL_FUNC (free_popup_info), card_and_book); - e_popup_menu (popup, event); - + if (event->type == GDK_BUTTON_PRESS && ((GdkEventButton *)event)->button == 3) { + do_popup_menu(view, event); return TRUE; } else { return FALSE; -- cgit v1.2.3