From 035744f29bdea64cfb38f2e507020d5914cd666e Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 19 Aug 2008 02:55:45 +0000 Subject: Committing the day's progress. Realized the "New" menu construction algorithm needs to live independently of shell view instances since we lazy load the shell views but have to display all possible "New" items immediately. Prototype the mechanisms for managing the various shell views and keeping track of which one is current. Various other tightening up and rethinking of APIs. svn path=/branches/kill-bonobo/; revision=36022 --- shell/e-shell-view.c | 238 ++++----------------------------------------------- 1 file changed, 17 insertions(+), 221 deletions(-) (limited to 'shell/e-shell-view.c') diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c index 1187c17ee4..52f6479b18 100644 --- a/shell/e-shell-view.c +++ b/shell/e-shell-view.c @@ -42,102 +42,6 @@ enum { static gpointer parent_class; -static gint -shell_view_compare_actions (GtkAction *action1, - GtkAction *action2) -{ - gchar *label1, *label2; - gint result; - - /* XXX This is really inefficient, but we're only sorting - * a small number of actions (repeatedly, though). */ - - g_object_get (action1, "label", &label1, NULL); - g_object_get (action2, "label", &label2, NULL); - - result = g_utf8_collate (label1, label2); - - g_free (label1); - g_free (label2); - - return result; -} - -static void -shell_view_extract_actions (EShellView *shell_view, - GList **source_list, - GList **destination_list) -{ - GList *match_list = NULL; - GList *iter; - - /* Pick out the actions from the source list that are tagged - * as belonging to the given EShellView and move them to the - * destination list. */ - - /* Example: Suppose [A] and [C] are tagged for this EShellView. - * - * source_list = [A] -> [B] -> [C] - * ^ ^ - * | | - * match_list = [ ] --------> [ ] - * - * - * destination_list = [1] -> [2] (other actions) - */ - for (iter = *source_list; iter != NULL; iter = iter->next) { - GtkAction *action = iter->data; - EShellView *action_shell_view; - - action_shell_view = g_object_get_data ( - G_OBJECT (action), "shell-view"); - - if (action_shell_view != shell_view) - continue; - - match_list = g_list_append (match_list, iter); - } - - /* source_list = [B] match_list = [A] -> [C] */ - for (iter = match_list; iter != NULL; iter = iter->next) { - GList *link = iter->data; - - iter->data = link->data; - *source_list = g_list_delete_link (*source_list, link); - } - - /* destination_list = [1] -> [2] -> [A] -> [C] */ - *destination_list = g_list_concat (*destination_list, match_list); -} - -static void -shell_view_register_new_actions (EShellView *shell_view, - GtkActionGroup *action_group, - const GtkActionEntry *entries, - guint n_entries) -{ - guint ii; - - gtk_action_group_add_actions ( - action_group, entries, n_entries, shell_view); - - /* Tag each action with the shell view that registered it. - * This is used to help sort items in the "New" menu. */ - - for (ii = 0; ii < n_entries; ii++) { - const gchar *action_name; - GtkAction *action; - - action_name = entries[ii].name; - - action = gtk_action_group_get_action ( - action_group, action_name); - - g_object_set_data ( - G_OBJECT (action), "shell-view", shell_view); - } -} - static void shell_view_set_window (EShellView *shell_view, GtkWidget *window) @@ -226,80 +130,6 @@ shell_view_finalize (GObject *object) G_OBJECT_CLASS (parent_class)->finalize (object); } -static GtkWidget * -shell_view_create_new_menu (EShellView *shell_view) -{ - GtkActionGroup *action_group; - GList *new_item_actions; - GList *new_source_actions; - GList *iter, *list = NULL; - GtkWidget *menu; - GtkWidget *separator; - GtkWidget *window; - - window = e_shell_view_get_window (shell_view); - - /* Get sorted lists of "new item" and "new source" actions. */ - - action_group = E_SHELL_WINDOW_ACTION_GROUP_NEW_ITEM (window); - - new_item_actions = g_list_sort ( - gtk_action_group_list_actions (action_group), - (GCompareFunc) shell_view_compare_actions); - - action_group = E_SHELL_WINDOW_ACTION_GROUP_NEW_SOURCE (window); - - new_source_actions = g_list_sort ( - gtk_action_group_list_actions (action_group), - (GCompareFunc) shell_view_compare_actions); - - /* Give priority to actions that belong to this shell view. */ - - shell_view_extract_actions ( - shell_view, &new_item_actions, &list); - - shell_view_extract_actions ( - shell_view, &new_source_actions, &list); - - /* Convert the actions to menu item proxy widgets. */ - - for (iter = list; iter != NULL; iter = iter->next) - iter->data = gtk_action_create_menu_item (iter->data); - - for (iter = new_item_actions; iter != NULL; iter = iter->next) - iter->data = gtk_action_create_menu_item (iter->data); - - for (iter = new_source_actions; iter != NULL; iter = iter->next) - iter->data = gtk_action_create_menu_item (iter->data); - - /* Add menu separators. */ - - separator = gtk_separator_menu_item_new (); - new_item_actions = g_list_prepend (new_item_actions, separator); - - separator = gtk_separator_menu_item_new (); - new_source_actions = g_list_prepend (new_source_actions, separator); - - /* Merge everything into one list, reflecting the menu layout. */ - - list = g_list_concat (list, new_item_actions); - new_item_actions = NULL; /* just for clarity */ - - list = g_list_concat (list, new_source_actions); - new_source_actions = NULL; /* just for clarity */ - - /* And finally, build the menu. */ - - menu = gtk_menu_new (); - - for (iter = list; iter != NULL; iter = iter->next) - gtk_menu_shell_append (GTK_MENU_SHELL (menu), iter->data); - - g_list_free (list); - - return menu; -} - static void shell_view_class_init (EShellViewClass *class) { @@ -314,8 +144,6 @@ shell_view_class_init (EShellViewClass *class) object_class->dispose = shell_view_dispose; object_class->finalize = shell_view_finalize; - class->create_new_menu = shell_view_create_new_menu; - g_object_class_install_property ( object_class, PROP_TITLE, @@ -372,6 +200,23 @@ e_shell_view_get_type (void) return type; } +const gchar * +e_shell_view_get_name (EShellView *shell_view) +{ + EShellViewClass *class; + + g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); + + /* A shell view's name is taken from the name of the + * module that registered the shell view subclass. */ + + class = E_SHELL_VIEW_GET_CLASS (shell_view); + g_return_val_if_fail (class->module != NULL, NULL); + g_return_val_if_fail (class->module->name != NULL, NULL); + + return class->module->name; +} + const gchar * e_shell_view_get_title (EShellView *shell_view) { @@ -400,19 +245,6 @@ e_shell_view_get_window (EShellView *shell_view) return shell_view->priv->window; } -GtkWidget * -e_shell_view_create_new_menu (EShellView *shell_view) -{ - EShellViewClass *class; - - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - class = E_SHELL_VIEW_CLASS (shell_view); - g_return_val_if_fail (class->create_new_menu != NULL, NULL); - - return class->create_new_menu (shell_view); -} - GtkWidget * e_shell_view_get_content_widget (EShellView *shell_view) { @@ -451,39 +283,3 @@ e_shell_view_get_status_widget (EShellView *shell_view) return class->get_status_widget (shell_view); } - -void -e_shell_view_register_new_item_actions (EShellView *shell_view, - const GtkActionEntry *entries, - guint n_entries) -{ - GtkWidget *window; - GtkActionGroup *action_group; - - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (entries != NULL); - - window = e_shell_view_get_window (shell_view); - action_group = E_SHELL_WINDOW_ACTION_GROUP_NEW_ITEM (window); - - shell_view_register_new_actions ( - shell_view, action_group, entries, n_entries); -} - -void -e_shell_view_register_new_source_actions (EShellView *shell_view, - const GtkActionEntry *entries, - guint n_entries) -{ - GtkWidget *window; - GtkActionGroup *action_group; - - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (entries != NULL); - - window = e_shell_view_get_window (shell_view); - action_group = E_SHELL_WINDOW_ACTION_GROUP_NEW_SOURCE (window); - - shell_view_register_new_actions ( - shell_view, action_group, entries, n_entries); -} -- cgit