diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ChangeLog | 17 | ||||
-rw-r--r-- | shell/Makefile.am | 2 | ||||
-rw-r--r-- | shell/e-shortcuts-view-model.c | 296 | ||||
-rw-r--r-- | shell/e-shortcuts-view-model.h | 67 | ||||
-rw-r--r-- | shell/e-shortcuts-view.c | 184 | ||||
-rw-r--r-- | shell/e-shortcuts.c | 20 | ||||
-rw-r--r-- | shell/e-shortcuts.h | 3 |
7 files changed, 431 insertions, 158 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog index f127aff6b0..c401a3e5d5 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,3 +1,20 @@ +2000-09-25 Ettore Perazzoli <ettore@helixcode.com> + + * e-shortcuts-view.c (item_selected): Renamed from + `selected_item'. + (class_init): Updated accordingly. + (impl_shortcut_dropped): New function, implementation for + `EShortcutBar::shortcut_dropped'. + (impl_shortcut_dragged): New function, implementation for + `EShortcutBar::shortcut_dragged'. + (e_shortcuts_view_construct): Update to use EShortcutsViewModel. + (class_init): Install them. + + * e-shortcuts.c (e_shortcuts_get_group_title): New. + + * e-shortcuts-view-model.c: New. + * e-shortcuts-view-model.h: New. + 2000-09-24 Ettore Perazzoli <ettore@helixcode.com> * e-shell.c (setup_local_storage): Don't unref the local storage. diff --git a/shell/Makefile.am b/shell/Makefile.am index 9928d52774..f68b15bc75 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -102,6 +102,8 @@ evolution_SOURCES = \ e-shell-view.h \ e-shell.c \ e-shell.h \ + e-shortcuts-view-model.c \ + e-shortcuts-view-model.h \ e-shortcuts-view.c \ e-shortcuts-view.h \ e-shortcuts.c \ diff --git a/shell/e-shortcuts-view-model.c b/shell/e-shortcuts-view-model.c new file mode 100644 index 0000000000..c37e45092c --- /dev/null +++ b/shell/e-shortcuts-view-model.c @@ -0,0 +1,296 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-shortcuts-view-model.c + * + * Copyright (C) 2000 Helix Code, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ettore Perazzoli + */ + +/* FIXME. This really sucks. We are using the model/view approach in the + dumbest possible way. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gnome.h> +#include <gal/util/e-util.h> + +#include "e-shortcuts-view-model.h" + + +#define PARENT_TYPE e_shortcut_model_get_type () +static EShortcutModelClass *parent_class = NULL; + +struct _EShortcutsViewModelPrivate { + EShortcuts *shortcuts; +}; + + +/* View initialization. */ + +static const char * +get_storage_set_path_from_uri (const char *uri) +{ + const char *colon; + + if (g_path_is_absolute (uri)) + return NULL; + + colon = strchr (uri, ':'); + if (colon == NULL || colon == uri || colon[1] == '\0') + return NULL; + + if (! g_path_is_absolute (colon + 1)) + return NULL; + + if (g_strncasecmp (uri, "evolution", colon - uri) != 0) + return NULL; + + return colon + 1; +} + +static void +load_group_into_model (EShortcutsViewModel *shortcuts_view_model, + const char *group_title, + int group_num) +{ + EShortcutsViewModelPrivate *priv; + EStorageSet *storage_set; + GList *shortcut_list; + GList *p; + + priv = shortcuts_view_model->priv; + + storage_set = e_shortcuts_get_storage_set (priv->shortcuts); + g_assert (storage_set != NULL); + + shortcut_list = e_shortcuts_get_shortcuts_in_group (priv->shortcuts, group_title); + if (shortcut_list == NULL) + return; + + for (p = shortcut_list; p != NULL; p = p->next) { + EFolder *folder; + const char *path; + const char *uri; + const char *name; + + uri = (const char *) p->data; + path = get_storage_set_path_from_uri (uri); + if (path != NULL) + folder = e_storage_set_get_folder (storage_set, path); + + if (path == NULL || folder == NULL) { + /* FIXME */ + g_warning ("Invalid link while loading shortcut bar view -- %s\n", + uri); + continue; + } + + name = e_folder_get_name (folder); + e_shortcut_model_add_item (E_SHORTCUT_MODEL (shortcuts_view_model), group_num, -1, uri, name); + } + + e_free_string_list (shortcut_list); +} + +static void +load_all_shortcuts_into_model (EShortcutsViewModel *shortcuts_view_model) +{ + EShortcutsViewModelPrivate *priv; + GList *group_titles; + GList *p; + int group_num; + + priv = shortcuts_view_model->priv; + + group_titles = e_shortcuts_get_group_titles (priv->shortcuts); + + for (p = group_titles; p != NULL; p = p->next) { + const char *group_title; + + group_title = (const char *) p->data; + group_num = e_shortcut_model_add_group (E_SHORTCUT_MODEL (shortcuts_view_model), -1, group_title); + + load_group_into_model (shortcuts_view_model, group_title, group_num); + } + + e_free_string_list (group_titles); +} + + +/* EShortcuts callbacks. */ + +static void +shortcuts_new_group_cb (EShortcuts *shortcuts, + int group_num, + void *data) +{ + EShortcutsViewModel *shortcuts_view_model; + EShortcutsViewModelPrivate *priv; + const char *title; + + shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (shortcuts); + priv = shortcuts_view_model->priv; + + title = e_shortcuts_get_group_title (priv->shortcuts, group_num); + e_shortcut_model_add_group (E_SHORTCUT_MODEL (shortcuts_view_model), group_num, title); +} + +static void +shortcuts_remove_group_cb (EShortcuts *shortcuts, + int group_num, + void *data) +{ + EShortcutsViewModel *shortcuts_view_model; + + shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); + e_shortcut_model_remove_group (E_SHORTCUT_MODEL (shortcuts_view_model), group_num); +} + +static void +shortcuts_new_shortcut_cb (EShortcuts *shortcuts, + int group_num, + int item_num, + void *data) +{ + EShortcutsViewModel *shortcuts_view_model; + EShortcutsViewModelPrivate *priv; + EStorageSet *storage_set; + EFolder *folder; + const char *uri; + const char *storage_set_path; + const char *folder_name; + + shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); + priv = shortcuts_view_model->priv; + + uri = e_shortcuts_get_uri (priv->shortcuts, group_num, item_num); + g_assert (uri != NULL); + + storage_set_path = get_storage_set_path_from_uri (uri); + if (storage_set_path == NULL) + return; + + storage_set = e_shortcuts_get_storage_set (priv->shortcuts); + folder = e_storage_set_get_folder (storage_set, storage_set_path); + folder_name = e_folder_get_name (folder); + + e_shortcut_model_add_item (E_SHORTCUT_MODEL (shortcuts_view_model), + group_num, item_num, uri, folder_name); +} + +static void +shortcuts_remove_shortcut_cb (EShortcuts *shortcuts, + int group_num, + int item_num, + void *data) +{ + EShortcutsViewModel *shortcuts_view_model; + + shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); + e_shortcut_model_remove_item (E_SHORTCUT_MODEL (shortcuts_view_model), group_num, item_num); +} + + +/* GtkObject methods. */ + +static void +impl_destroy (GtkObject *object) +{ + EShortcutsViewModel *view_model; + EShortcutsViewModelPrivate *priv; + + view_model = E_SHORTCUTS_VIEW_MODEL (object); + priv = view_model->priv; + + g_free (priv); +} + + +static void +class_init (EShortcutsViewModelClass *klass) +{ + GtkObjectClass *object_class; + + object_class = GTK_OBJECT_CLASS (klass); + + parent_class = gtk_type_class (e_shortcut_model_get_type ()); +} + +static void +init (EShortcutsViewModel *shortcuts_view_model) +{ + EShortcutsViewModelPrivate *priv; + + priv = g_new (EShortcutsViewModelPrivate, 1); + priv->shortcuts = NULL; + + shortcuts_view_model->priv = priv; +} + + +void +e_shortcuts_view_model_construct (EShortcutsViewModel *model, + EShortcuts *shortcuts) +{ + EShortcutsViewModelPrivate *priv; + + g_return_if_fail (model != NULL); + g_return_if_fail (E_IS_SHORTCUTS_VIEW_MODEL (model)); + g_return_if_fail (shortcuts != NULL); + g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); + + priv = model->priv; + g_return_if_fail (priv->shortcuts == NULL); + + priv->shortcuts = shortcuts; + + load_all_shortcuts_into_model (model); + + gtk_signal_connect_while_alive (GTK_OBJECT (priv->shortcuts), + "new_group", GTK_SIGNAL_FUNC (shortcuts_new_group_cb), model, + GTK_OBJECT (model)); + gtk_signal_connect_while_alive (GTK_OBJECT (priv->shortcuts), + "remove_group", GTK_SIGNAL_FUNC (shortcuts_remove_group_cb), model, + GTK_OBJECT (model)); + gtk_signal_connect_while_alive (GTK_OBJECT (priv->shortcuts), + "new_shortcut", GTK_SIGNAL_FUNC (shortcuts_new_shortcut_cb), model, + GTK_OBJECT (model)); + gtk_signal_connect_while_alive (GTK_OBJECT (priv->shortcuts), + "remove_shortcut", GTK_SIGNAL_FUNC (shortcuts_remove_shortcut_cb), model, + GTK_OBJECT (model)); +} + +EShortcutsViewModel * +e_shortcuts_view_model_new (EShortcuts *shortcuts) +{ + EShortcutsViewModel *new; + + g_return_val_if_fail (shortcuts != NULL, NULL); + g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); + + new = gtk_type_new (e_shortcuts_view_model_get_type ()); + + e_shortcuts_view_model_construct (new, shortcuts); + + return new; +} + + +E_MAKE_TYPE (e_shortcuts_view_model, "EShortcutsViewModel", EShortcutsViewModel, class_init, init, PARENT_TYPE) diff --git a/shell/e-shortcuts-view-model.h b/shell/e-shortcuts-view-model.h new file mode 100644 index 0000000000..af5259bbee --- /dev/null +++ b/shell/e-shortcuts-view-model.h @@ -0,0 +1,67 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-shortcuts-view-model.h + * + * Copyright (C) 2000 Helix Code, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ettore Perazzoli + */ + +#ifndef _E_SHORTCUTS_VIEW_MODEL_H_ +#define _E_SHORTCUTS_VIEW_MODEL_H_ + +#include "e-shortcuts.h" + +#include "shortcut-bar/e-shortcut-model.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define E_TYPE_SHORTCUTS_VIEW_MODEL (e_shortcuts_view_model_get_type ()) +#define E_SHORTCUTS_VIEW_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHORTCUTS_VIEW_MODEL, EShortcutsViewModel)) +#define E_SHORTCUTS_VIEW_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHORTCUTS_VIEW_MODEL, EShortcutsViewModelClass)) +#define E_IS_SHORTCUTS_VIEW_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHORTCUTS_VIEW_MODEL)) +#define E_IS_SHORTCUTS_VIEW_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHORTCUTS_VIEW_MODEL)) + + +typedef struct _EShortcutsViewModel EShortcutsViewModel; +typedef struct _EShortcutsViewModelPrivate EShortcutsViewModelPrivate; +typedef struct _EShortcutsViewModelClass EShortcutsViewModelClass; + +struct _EShortcutsViewModel { + EShortcutModel parent; + + EShortcutsViewModelPrivate *priv; +}; + +struct _EShortcutsViewModelClass { + EShortcutModelClass parent_class; +}; + + +GtkType e_shortcuts_view_model_get_type (void); +void e_shortcuts_view_model_construct (EShortcutsViewModel *model, + EShortcuts *shortcuts); +EShortcutsViewModel *e_shortcuts_view_model_new (EShortcuts *shortcuts); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _E_SHORTCUTS_VIEW_MODEL_H_ */ diff --git a/shell/e-shortcuts-view.c b/shell/e-shortcuts-view.c index 7a9b75a86a..014be21beb 100644 --- a/shell/e-shortcuts-view.c +++ b/shell/e-shortcuts-view.c @@ -29,6 +29,8 @@ #include <gal/util/e-util.h> +#include "e-shortcuts-view-model.h" + #include "e-shortcuts-view.h" @@ -47,7 +49,7 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; -/* View initialization. */ +/* FIXME this should all be in the model. */ static const char * get_storage_set_path_from_uri (const char *uri) @@ -70,80 +72,6 @@ get_storage_set_path_from_uri (const char *uri) return colon + 1; } -static void -load_group (EShortcutsView *shortcuts_view, - EShortcuts *shortcuts, - const char *group_title, - int group_num) -{ - EShortcutsViewPrivate *priv; - EStorageSet *storage_set; - GList *shortcut_list; - GList *p; - - priv = shortcuts_view->priv; - - storage_set = e_shortcuts_get_storage_set (shortcuts); - g_assert (storage_set != NULL); - - shortcut_list = e_shortcuts_get_shortcuts_in_group (shortcuts, group_title); - if (shortcut_list == NULL) - return; - - for (p = shortcut_list; p != NULL; p = p->next) { - EFolder *folder; - const char *path; - const char *uri; - const char *name; - - uri = (const char *) p->data; - path = get_storage_set_path_from_uri (uri); - if (path != NULL) - folder = e_storage_set_get_folder (storage_set, path); - - if (path == NULL || folder == NULL) { - /* FIXME */ - g_warning ("Invalid link while loading shortcut bar view -- %s\n", - uri); - continue; - } - - name = e_folder_get_name (folder); - e_shortcut_model_add_item (E_SHORTCUT_BAR (shortcuts_view)->model, group_num, -1, uri, name); - } - - e_free_string_list (shortcut_list); -} - -static void -load_all_shortcuts (EShortcutsView *shortcuts_view, - EShortcuts *shortcuts) -{ - EShortcutsViewPrivate *priv; - GList *group_titles; - GList *p; - int group_num; - - priv = shortcuts_view->priv; - - group_titles = e_shortcuts_get_group_titles (shortcuts); - - for (p = group_titles; p != NULL; p = p->next) { - const char *group_title; - - group_title = (const char *) p->data; - group_num = e_shortcut_model_add_group (E_SHORTCUT_BAR (shortcuts_view)->model, - -1, group_title); - - load_group (shortcuts_view, shortcuts, group_title, group_num); - } - - e_free_string_list (group_titles); - - gtk_object_ref (GTK_OBJECT (shortcuts)); - priv->shortcuts = shortcuts; -} - /* Icon callback for the shortcut bar. */ static GdkPixbuf * icon_callback (EShortcutBar *shortcut_bar, @@ -381,7 +309,7 @@ destroy (GtkObject *object) /* EShortcutBar methods. */ static void -selected_item (EShortcutBar *shortcut_bar, +item_selected (EShortcutBar *shortcut_bar, GdkEvent *event, int group_num, int item_num) @@ -416,90 +344,35 @@ selected_item (EShortcutBar *shortcut_bar, shortcuts, uri); } -#if 0 -static void -added_item (EShortcutBar *shortcut_bar, - int group_num, - int item_num) -{ - EShortcutsViewPrivate *priv; - EShortcutBarGroup *group; - EShortcuts *shortcuts; - const char *url; - - priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv; - shortcuts = priv->shortcuts; - - if (shortcuts == NULL) - return; - - /* FIXME ** NASTY ** */ - - group = &g_array_index (shortcut_bar->groups, EShortcutBarGroup, group_num); - url = e_icon_bar_get_item_data (E_ICON_BAR (group->icon_bar), item_num); - - if (url == NULL) { - g_warning ("NULL URL being added to the shortcut bar!?"); - return; - } - - e_shortcuts_add_shortcut (shortcuts, group_num, item_num, url); -} - static void -removed_item (EShortcutBar *shortcut_bar, - int group_num, - int item_num) -{ - EShortcutsViewPrivate *priv; - EShortcuts *shortcuts; - - priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv; - shortcuts = priv->shortcuts; - - e_shortcuts_remove_shortcut (shortcuts, group_num, item_num); -} - -static void -added_group (EShortcutBar *shortcut_bar, - int group_num) +impl_shortcut_dropped (EShortcutBar *shortcut_bar, + int group_num, + int position, + const char *item_url, + const char *item_name) { + EShortcutsView *shortcuts_view; EShortcutsViewPrivate *priv; - EShortcuts *shortcuts; - EShortcutBarGroup *group; - const char *group_name; - priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv; - shortcuts = priv->shortcuts; - - if (shortcuts == NULL) - return; - - group = &g_array_index (shortcut_bar->groups, EShortcutBarGroup, group_num); - - /* FIXME Losing EShortcutBar does not give me a method to retrieve the - group name. */ - group_name = "Foo"; + shortcuts_view = E_SHORTCUTS_VIEW (shortcut_bar); + priv = shortcuts_view->priv; - e_shortcuts_add_group (shortcuts, group_num, group_name); + e_shortcuts_add_shortcut (priv->shortcuts, group_num, position, item_url); } static void -removed_group (EShortcutBar *shortcut_bar, - int group_num) +impl_shortcut_dragged (EShortcutBar *shortcut_bar, + gint group_num, + gint item_num) { + EShortcutsView *shortcuts_view; EShortcutsViewPrivate *priv; - EShortcuts *shortcuts; - - priv = E_SHORTCUTS_VIEW (shortcut_bar)->priv; - shortcuts = priv->shortcuts; - if (shortcuts == NULL) - return; + shortcuts_view = E_SHORTCUTS_VIEW (shortcut_bar); + priv = shortcuts_view->priv; - e_shortcuts_remove_group (shortcuts, group_num); + e_shortcuts_remove_shortcut (priv->shortcuts, group_num, item_num); } -#endif static void @@ -512,13 +385,10 @@ class_init (EShortcutsViewClass *klass) object_class->destroy = destroy; shortcut_bar_class = E_SHORTCUT_BAR_CLASS (klass); - shortcut_bar_class->selected_item = selected_item; -#if 0 - shortcut_bar_class->added_item = added_item; - shortcut_bar_class->removed_item = removed_item; - shortcut_bar_class->added_group = added_group; - shortcut_bar_class->removed_group = removed_group; -#endif + shortcut_bar_class->item_selected = item_selected; + shortcut_bar_class->shortcut_dropped = impl_shortcut_dropped; + shortcut_bar_class->shortcut_dragged = impl_shortcut_dragged; + parent_class = gtk_type_class (e_shortcut_bar_get_type ()); signals[ACTIVATE_SHORTCUT] = @@ -557,13 +427,11 @@ e_shortcuts_view_construct (EShortcutsView *shortcuts_view, priv = shortcuts_view->priv; - e_shortcut_bar_set_model (E_SHORTCUT_BAR (shortcuts_view), - e_shortcut_model_new ()); - e_shortcut_bar_set_icon_callback (E_SHORTCUT_BAR (shortcuts_view), icon_callback, shortcuts); - load_all_shortcuts (shortcuts_view, shortcuts); + e_shortcut_bar_set_model (E_SHORTCUT_BAR (shortcuts_view), + E_SHORTCUT_MODEL (e_shortcuts_view_model_new (shortcuts))); } GtkWidget * diff --git a/shell/e-shortcuts.c b/shell/e-shortcuts.c index 4d4b8ed9ee..4befb87cb7 100644 --- a/shell/e-shortcuts.c +++ b/shell/e-shortcuts.c @@ -756,5 +756,25 @@ e_shortcuts_add_group (EShortcuts *shortcuts, } +const char * +e_shortcuts_get_group_title (EShortcuts *shortcuts, + int group_num) +{ + EShortcutsPrivate *priv; + const ShortcutGroup *group; + + g_return_val_if_fail (shortcuts != NULL, NULL); + g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); + + priv = shortcuts->priv; + + group = g_list_nth (priv->groups, group_num); + if (group == NULL) + return NULL; + + return group->title; +} + + E_MAKE_TYPE (e_shortcuts, "EShortcuts", EShortcuts, class_init, init, PARENT_TYPE) diff --git a/shell/e-shortcuts.h b/shell/e-shortcuts.h index da4dfc1fa0..8fc5b335da 100644 --- a/shell/e-shortcuts.h +++ b/shell/e-shortcuts.h @@ -76,6 +76,9 @@ EShortcuts *e_shortcuts_new (EStorageSet *storage_s const char *file_name); GList *e_shortcuts_get_group_titles (EShortcuts *shortcuts); +const char *e_shortcuts_get_group_title (EShortcuts *shortcuts, + int group_num); + GList *e_shortcuts_get_shortcuts_in_group (EShortcuts *shortcuts, const char *group_title); EStorageSet *e_shortcuts_get_storage_set (EShortcuts *shortcuts); |