aboutsummaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ChangeLog32
-rw-r--r--shell/e-shell-view.c23
-rw-r--r--shell/e-shell-view.h1
-rw-r--r--shell/e-shortcuts-view.c199
-rw-r--r--shell/e-shortcuts.c76
-rw-r--r--shell/e-shortcuts.h9
6 files changed, 327 insertions, 13 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog
index 5b5eef1e1e..2be202631e 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,3 +1,35 @@
+2000-06-01 Ettore Perazzoli <ettore@helixcode.com>
+
+ * e-shell-view-menu.c (e_shell_view_menu_setup): Set the
+ statusbar.
+
+ * e-shell-view.c: New member `appbar' for `EShellViewPrivate'.
+ (init): Initialize to NULL.
+ (setup_widgets): Install a status bar and set `appbar' to point to
+ it.
+ (setup_bonobo_ui_handler): Make the BonoboUIHandler use `appbar'
+ as its statusbar.
+ (e_shell_view_get_appbar): New function.
+ (e_shell_view_construct): Set up the BonoboUIHandler after setting
+ up the widgets.
+
+ * e-shortcuts.c (class_init): Add new signals "new_shortcut",
+ "removed_shortcut", "new_group", "removed_group".
+ (e_shortcuts_remove_shortcut): Emit "remove_shortcut".
+ (e_shortcuts_add_shortcut): Emit "new_shortcut".
+ (e_shortcuts_remove_group): Emit "remove_group".
+ (e_shortcuts_add_group): Emit "new_group".
+ (unload_shortcuts): Emit "remove_group" for all the groups.
+
+ * e-shortcuts.h: New signals "new_shortcut", "removed_shortcut",
+ "new_group", "removed_group".
+
+ * e-shortcuts-view.c (pop_up_right_click_menu): New function to
+ pop up the right-click menu for the shortcut bar.
+ (pop_up_right_click_menu_for_shortcut): New function.
+ (selected_item): Pop up right click menu when appropriate. Don't
+ activate the shortcut when right-clicking.
+
2000-05-31 Ettore Perazzoli <ettore@helixcode.com>
* evolution-storage.h: #include 'Evolution.h".
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c
index 0157b72b0b..a003f10c8f 100644
--- a/shell/e-shell-view.c
+++ b/shell/e-shell-view.c
@@ -63,6 +63,7 @@ struct _EShellViewPrivate {
char *uri;
/* The widgetry. */
+ GtkWidget *appbar;
GtkWidget *hpaned;
GtkWidget *view_vbox;
GtkWidget *view_title_bar;
@@ -227,6 +228,11 @@ setup_widgets (EShellView *shell_view)
priv = shell_view->priv;
+ /* The application bar. */
+
+ priv->appbar = gnome_appbar_new (FALSE, TRUE, GNOME_PREFERENCES_NEVER);
+ gnome_app_set_statusbar (GNOME_APP (shell_view), priv->appbar);
+
/* The shortcut bar. */
priv->shortcut_bar = e_shortcuts_new_view (e_shell_get_shortcuts (priv->shell));
@@ -304,6 +310,7 @@ setup_bonobo_ui_handler (EShellView *shell_view)
bonobo_ui_handler_set_app (uih, GNOME_APP (shell_view));
bonobo_ui_handler_create_menubar (uih);
+ bonobo_ui_handler_set_statusbar (uih, priv->appbar);
priv->uih = uih;
}
@@ -386,6 +393,7 @@ init (EShellView *shell_view)
priv->uih = NULL;
priv->uri = NULL;
+ priv->appbar = NULL;
priv->hpaned = NULL;
priv->view_hpaned = NULL;
priv->contents = NULL;
@@ -417,15 +425,15 @@ e_shell_view_construct (EShellView *shell_view,
g_return_if_fail (shell != NULL);
g_return_if_fail (E_IS_SHELL (shell));
- gnome_app_construct (GNOME_APP (shell_view), "evolution", "Evolution");
-
priv = shell_view->priv;
+ gnome_app_construct (GNOME_APP (shell_view), "evolution", "Evolution");
+
gtk_object_ref (GTK_OBJECT (shell));
priv->shell = shell;
- setup_bonobo_ui_handler (shell_view);
setup_widgets (shell_view);
+ setup_bonobo_ui_handler (shell_view);
e_shell_view_menu_setup (shell_view);
}
@@ -944,5 +952,14 @@ e_shell_view_get_bonobo_ui_handler (EShellView *shell_view)
return shell_view->priv->uih;
}
+GtkWidget *
+e_shell_view_get_appbar (EShellView *shell_view)
+{
+ g_return_val_if_fail (shell_view != NULL, NULL);
+ g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
+
+ return shell_view->priv->appbar;
+}
+
E_MAKE_TYPE (e_shell_view, "EShellView", EShellView, class_init, init, PARENT_TYPE)
diff --git a/shell/e-shell-view.h b/shell/e-shell-view.h
index 5bc936a7bf..53ce8a59a7 100644
--- a/shell/e-shell-view.h
+++ b/shell/e-shell-view.h
@@ -88,6 +88,7 @@ EShellViewSubwindowMode e_shell_view_get_folder_bar_mode (EShellView
EShell *e_shell_view_get_shell (EShellView *shell_view);
BonoboUIHandler *e_shell_view_get_bonobo_ui_handler (EShellView *shell_view);
+GtkWidget *e_shell_view_get_appbar (EShellView *shell_view);
#ifdef __cplusplus
}
diff --git a/shell/e-shortcuts-view.c b/shell/e-shortcuts-view.c
index 8e4bbea50c..e5184129f6 100644
--- a/shell/e-shortcuts-view.c
+++ b/shell/e-shortcuts-view.c
@@ -181,6 +181,182 @@ icon_callback (EShortcutBar *shortcut_bar,
}
+/* Shortcut bar right-click menu. */
+
+struct _RightClickMenuData {
+ EShortcutsView *shortcuts_view;
+ int group_num;
+};
+typedef struct _RightClickMenuData RightClickMenuData;
+
+static void
+toggle_large_icons_cb (GtkWidget *widget,
+ void *data)
+{
+ RightClickMenuData *menu_data;
+
+ g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (widget));
+
+ if (data == NULL)
+ return;
+
+ menu_data = (RightClickMenuData *) data;
+
+ if (! GTK_CHECK_MENU_ITEM (widget)->active)
+ return;
+
+ e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (menu_data->shortcuts_view),
+ menu_data->group_num,
+ E_ICON_BAR_LARGE_ICONS);
+}
+
+static void
+toggle_small_icons_cb (GtkWidget *widget,
+ void *data)
+{
+ RightClickMenuData *menu_data;
+
+ g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (widget));
+
+ if (data == NULL)
+ return;
+
+ menu_data = (RightClickMenuData *) data;
+
+ if (! GTK_CHECK_MENU_ITEM (widget)->active)
+ return;
+
+ e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (menu_data->shortcuts_view),
+ menu_data->group_num,
+ E_ICON_BAR_SMALL_ICONS);
+}
+
+static GnomeUIInfo icon_size_radio_group_uiinfo[] = {
+ { GNOME_APP_UI_ITEM, N_("_Small icons"),
+ N_("Show the shortcuts as small icons"), toggle_small_icons_cb, NULL,
+ NULL, 0, 0, 0, 0 },
+ { GNOME_APP_UI_ITEM, N_("_Large icons"),
+ N_("Show the shortcuts as large icons"), toggle_large_icons_cb, NULL,
+ NULL, 0, 0, 0, 0 },
+
+ GNOMEUIINFO_END
+};
+
+static GnomeUIInfo right_click_menu_uiinfo[] = {
+ GNOMEUIINFO_RADIOLIST (icon_size_radio_group_uiinfo),
+ GNOMEUIINFO_END
+};
+
+static void
+pop_up_right_click_menu_for_group (EShortcutsView *shortcuts_view,
+ GdkEventButton *event,
+ int group_num)
+{
+ RightClickMenuData *menu_data;
+ GtkWidget *popup_menu;
+
+ menu_data = g_new (RightClickMenuData, 1);
+ menu_data->shortcuts_view = shortcuts_view;
+ menu_data->group_num = group_num;
+
+ popup_menu = gnome_popup_menu_new (right_click_menu_uiinfo);
+
+ if (e_shortcut_bar_get_view_type (E_SHORTCUT_BAR (shortcuts_view), group_num)
+ == E_ICON_BAR_SMALL_ICONS)
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (icon_size_radio_group_uiinfo[0].widget),
+ TRUE);
+ else
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (icon_size_radio_group_uiinfo[1].widget),
+ TRUE);
+
+ gnome_popup_menu_do_popup_modal (popup_menu, NULL, NULL, event, menu_data);
+
+ g_free (menu_data);
+ gtk_widget_destroy (popup_menu);
+}
+
+
+/* Shortcut right-click menu. */
+
+struct _ShortcutRightClickMenuData {
+ EShortcutsView *shortcuts_view;
+ int group_num;
+ int item_num;
+};
+typedef struct _ShortcutRightClickMenuData ShortcutRightClickMenuData;
+
+static void
+activate_shortcut_cb (GtkWidget *widget,
+ void *data)
+{
+ ShortcutRightClickMenuData *menu_data;
+ EShortcutsView *shortcuts_view;
+ EShortcuts *shortcuts;
+ const char *uri;
+
+ menu_data = (ShortcutRightClickMenuData *) data;
+ shortcuts_view = menu_data->shortcuts_view;
+ shortcuts = shortcuts_view->priv->shortcuts;
+
+ uri = e_shortcuts_get_uri (shortcuts, menu_data->group_num, menu_data->item_num);
+ if (uri == NULL)
+ return;
+
+ gtk_signal_emit (GTK_OBJECT (shortcuts_view), signals[ACTIVATE_SHORTCUT],
+ shortcuts, uri);
+}
+
+static void
+remove_shortcut_cb (GtkWidget *widget,
+ void *data)
+{
+ ShortcutRightClickMenuData *menu_data;
+ EShortcutsView *shortcuts_view;
+ EShortcuts *shortcuts;
+
+ menu_data = (ShortcutRightClickMenuData *) data;
+ shortcuts_view = menu_data->shortcuts_view;
+ shortcuts = shortcuts_view->priv->shortcuts;
+
+ e_shortcuts_remove_shortcut (shortcuts, menu_data->group_num, menu_data->item_num);
+
+ /* FIXME not real model-view. */
+ e_shortcut_bar_remove_item (E_SHORTCUT_BAR (shortcuts_view),
+ menu_data->group_num, menu_data->item_num);
+}
+
+static GnomeUIInfo shortcut_right_click_menu_uiinfo[] = {
+ GNOMEUIINFO_ITEM (N_("Activate"), N_("Activate this shortcut"),
+ activate_shortcut_cb, NULL),
+ GNOMEUIINFO_SEPARATOR,
+ GNOMEUIINFO_ITEM_STOCK (N_("Remove"), N_("Remove this shortcut from the shortcut bar"),
+ remove_shortcut_cb, GNOME_STOCK_MENU_CLOSE),
+ GNOMEUIINFO_END
+};
+
+static void
+pop_up_right_click_menu_for_shortcut (EShortcutsView *shortcuts_view,
+ GdkEventButton *event,
+ int group_num,
+ int item_num)
+{
+ ShortcutRightClickMenuData *menu_data;
+ GtkWidget *popup_menu;
+
+ menu_data = g_new (ShortcutRightClickMenuData, 1);
+ menu_data->shortcuts_view = shortcuts_view;
+ menu_data->group_num = group_num;
+ menu_data->item_num = item_num;
+
+ popup_menu = gnome_popup_menu_new (shortcut_right_click_menu_uiinfo);
+
+ gnome_popup_menu_do_popup_modal (popup_menu, NULL, NULL, event, menu_data);
+
+ g_free (menu_data);
+ gtk_widget_destroy (popup_menu);
+}
+
+
/* GtkObject methods. */
static void
@@ -207,17 +383,32 @@ selected_item (EShortcutBar *shortcut_bar,
int item_num)
{
EShortcuts *shortcuts;
+ EShortcutsView *shortcuts_view;
const char *uri;
- shortcuts = E_SHORTCUTS_VIEW (shortcut_bar)->priv->shortcuts;
+ shortcuts_view = E_SHORTCUTS_VIEW (shortcut_bar);
+ shortcuts = shortcuts_view->priv->shortcuts;
- uri = e_shortcuts_get_uri (shortcuts, group_num, item_num);
+ if (event->button.button == 3) {
+ if (item_num < 0)
+ pop_up_right_click_menu_for_group (shortcuts_view, &event->button,
+ group_num);
+ else
+ pop_up_right_click_menu_for_shortcut (shortcuts_view, &event->button,
+ group_num, item_num);
+ return;
+ } else if (event->button.button != 1) {
+ return;
+ }
- /* Lame EShortcutBar. This can happen. */
+ if (item_num < 0)
+ return;
+
+ uri = e_shortcuts_get_uri (shortcuts, group_num, item_num);
if (uri == NULL)
return;
- gtk_signal_emit (GTK_OBJECT (shortcut_bar), signals[ACTIVATE_SHORTCUT],
+ gtk_signal_emit (GTK_OBJECT (shortcuts_view), signals[ACTIVATE_SHORTCUT],
shortcuts, uri);
}
diff --git a/shell/e-shortcuts.c b/shell/e-shortcuts.c
index 414e5d2da9..4d3b51cc13 100644
--- a/shell/e-shortcuts.c
+++ b/shell/e-shortcuts.c
@@ -100,36 +100,52 @@ struct _EShortcutsPrivate {
GHashTable *title_to_group;
};
+enum {
+ NEW_GROUP,
+ REMOVE_GROUP,
+ NEW_SHORTCUT,
+ REMOVE_SHORTCUT,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
static void
unload_shortcuts (EShortcuts *shortcuts)
{
EShortcutsPrivate *priv;
+ GList *orig_groups;
GList *p, *q;
priv = shortcuts->priv;
+ orig_groups = priv->groups;
for (p = priv->groups; p != NULL; p = p->next) {
ShortcutGroup *group;
+ gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_GROUP], 0);
+
group = (ShortcutGroup *) p->data;
- g_free (group->title);
+
+ g_hash_table_remove (priv->title_to_group, group->title);
for (q = group->shortcuts; q != NULL; q = q->next)
g_free (q->data);
+ g_free (group->title);
g_list_free (group->shortcuts);
+
+ priv->groups = priv->groups->next;
}
- if (priv->groups != NULL)
- g_list_free (priv->groups);
+ if (orig_groups != NULL)
+ g_list_free (orig_groups);
priv->groups = NULL;
g_hash_table_destroy (priv->title_to_group);
priv->title_to_group = g_hash_table_new (g_str_hash, g_str_equal);
-
- /* FIXME update the views. */
}
static gboolean
@@ -141,6 +157,8 @@ load_shortcuts (EShortcuts *shortcuts,
xmlNode *root;
xmlNode *p, *q;
+ /* FIXME: Update the views by emitting the appropriate signals. */
+
priv = shortcuts->priv;
doc = xmlParseFile (file_name);
@@ -355,6 +373,46 @@ class_init (EShortcutsClass *klass)
object_class->destroy = destroy;
parent_class = gtk_type_class (gtk_object_get_type ());
+
+ signals[NEW_GROUP]
+ = gtk_signal_new ("new_group",
+ GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EShortcutsClass, new_group),
+ gtk_marshal_NONE__INT,
+ GTK_TYPE_NONE, 1,
+ GTK_TYPE_INT);
+
+ signals[REMOVE_GROUP]
+ = gtk_signal_new ("remove_group",
+ GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EShortcutsClass, remove_group),
+ gtk_marshal_NONE__INT,
+ GTK_TYPE_NONE, 1,
+ GTK_TYPE_INT);
+
+ signals[NEW_SHORTCUT]
+ = gtk_signal_new ("new_shortcut",
+ GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EShortcutsClass, new_shortcut),
+ gtk_marshal_NONE__INT_INT,
+ GTK_TYPE_NONE, 2,
+ GTK_TYPE_INT,
+ GTK_TYPE_INT);
+
+ signals[REMOVE_SHORTCUT]
+ = gtk_signal_new ("remove_shortcut",
+ GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EShortcutsClass, remove_shortcut),
+ gtk_marshal_NONE__INT_INT,
+ GTK_TYPE_NONE, 2,
+ GTK_TYPE_INT,
+ GTK_TYPE_INT);
+
+ gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
}
@@ -609,6 +667,8 @@ e_shortcuts_remove_shortcut (EShortcuts *shortcuts,
p = g_list_nth (group->shortcuts, num);
g_return_if_fail (p != NULL);
+ gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_SHORTCUT], group_num, num);
+
uri = (char *) p->data;
g_free (uri);
@@ -639,6 +699,8 @@ e_shortcuts_add_shortcut (EShortcuts *shortcuts,
group->shortcuts = g_list_insert (group->shortcuts, g_strdup (uri), num);
+ gtk_signal_emit (GTK_OBJECT (shortcuts), signals[NEW_SHORTCUT], group_num, num);
+
make_dirty (shortcuts);
}
@@ -658,6 +720,8 @@ e_shortcuts_remove_group (EShortcuts *shortcuts,
p = g_list_nth (priv->groups, group_num);
g_return_if_fail (p != NULL);
+ gtk_signal_emit (GTK_OBJECT (shortcuts), signals[REMOVE_GROUP], group_num);
+
group = (ShortcutGroup *) p->data;
e_free_string_list (group->shortcuts);
@@ -686,6 +750,8 @@ e_shortcuts_add_group (EShortcuts *shortcuts,
priv->groups = g_list_insert (priv->groups, group, group_num);
+ gtk_signal_emit (GTK_OBJECT (shortcuts), signals[NEW_GROUP], group_num);
+
make_dirty (shortcuts);
}
diff --git a/shell/e-shortcuts.h b/shell/e-shortcuts.h
index f450728b51..da4dfc1fa0 100644
--- a/shell/e-shortcuts.h
+++ b/shell/e-shortcuts.h
@@ -57,7 +57,14 @@ struct _EShortcuts {
struct _EShortcutsClass {
GtkObjectClass parent_class;
-};
+
+ /* Signals. */
+
+ void (* new_group) (EShortcuts *shortcuts, int group_num);
+ void (* remove_group) (EShortcuts *shortcuts, int group_num);
+ void (* new_shortcut) (EShortcuts *shortcuts, int group_num, int item_num);
+ void (* remove_shortcut) (EShortcuts *shortcuts, int group_num, int item_num);}
+;
GtkType e_shortcuts_get_type (void);