aboutsummaryrefslogtreecommitdiffstats
path: root/shell/e-shell-view.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@src.gnome.org>2008-08-19 10:55:45 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2008-08-19 10:55:45 +0800
commit035744f29bdea64cfb38f2e507020d5914cd666e (patch)
tree98f062db0de5a09700524fe219d0a377f30a706a /shell/e-shell-view.c
parent4187293731274274e4283d9039f6e30c95578118 (diff)
downloadgsoc2013-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.c238
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);
-}