diff options
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); -} |