diff options
author | Matthew Barnes <mbarnes@src.gnome.org> | 2008-08-19 10:55:45 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@src.gnome.org> | 2008-08-19 10:55:45 +0800 |
commit | 035744f29bdea64cfb38f2e507020d5914cd666e (patch) | |
tree | 98f062db0de5a09700524fe219d0a377f30a706a /shell/e-shell-view.c | |
parent | 4187293731274274e4283d9039f6e30c95578118 (diff) | |
download | gsoc2013-evolution-035744f29bdea64cfb38f2e507020d5914cd666e.tar.gz gsoc2013-evolution-035744f29bdea64cfb38f2e507020d5914cd666e.tar.zst gsoc2013-evolution-035744f29bdea64cfb38f2e507020d5914cd666e.zip |
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
Diffstat (limited to 'shell/e-shell-view.c')
-rw-r--r-- | shell/e-shell-view.c | 238 |
1 files changed, 17 insertions, 221 deletions
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, @@ -373,6 +201,23 @@ e_shell_view_get_type (void) } 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) { g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); @@ -401,19 +246,6 @@ e_shell_view_get_window (EShellView *shell_view) } 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) { EShellViewClass *class; @@ -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); -} |