So I got lots of stuff done today - here's the updated version, which not only implements the new calendar dialog but also task list creation and properties windows (with as much shared code as I think possible). Lemme know how things look, -David On Thu, 2004-10-21 at 13:44 +0800, Not Zed wrote: > > Looking good. > > - dont set the table spacing. yes the spacing is a bit wrong but that > applies everywhere, it just needs to be fixed in e-config.c rather > than worked-around in every component. > - it may make sense to add a titled section to wrap things in, it just > looks more consistent with the other components. > - be nice if you didn't need the 'real' as well as the 'source' in the > target, then again maybe thats better for plugins anyway and i need to > do that elsewhere. so leave that for now. > - see the addressbook stuff for how to convert this to a 'dynamic' ui > which can also be used for creating calendars. you could basically > just copy everything in eab-config.c into e-cal-config.c and rename or > whatever, i just started with e-cal-config when i wrote it. it > handles various details you need for a dynamic ui. > > The check stuff is wrong though. You should add a page-check function, > and you call e_config_target_changed when things change (this can be > done inside the target directly - again see the addressbook stuff i > just committed), and that will trigger a validate, and manage the > button sensitivity too. That means you can remove all of the check > and allocating your own stuff, etc. > > You should use e_config_create_window() instead of > e_config_create_widget(), to get all of the commit/validate stuff > happening automatically, and you can get rid of all of the dialog > handling/etc code because of that. > > So basically looks ok, just a few tweaks, and the new stuff required > for the create calendar window. > > > On Wed, 2004-10-20 at 22:30 -0600, David Trowbridge wrote: > > Ok, here's an updated version, that ought to address your concerns. > > > > -David > > > > On Fri, 2004-10-15 at 09:07 +0800, Not Zed wrote: > > > > > > The ESource in the target should be modified instantly as the widgets > > > change. This is required for a couple of reasons: > > > 1. Communicate the changed state to any other interested widgets, > > > which may be supplied by plugins > > > 2. Lets the gui know when things have changed, so it can only enable > > > the "ok" button if the data validates. > > > > > > It also simplifies 'commit' since you just copy/install that source. > > > Obviously the ESource in the target should be a working-copy and not > > > the actual ESource. And clearly point 1 is the vital one. > > > > > > For the plugin it needs to ref the source and keep it around for the > > > widget modified callbacks. Also note that this should mean you don't > > > need to keep any globals to access them since the data will just be on > > > the source already. It doesn't need a commit method really since all > > > of its state is stored in the source which will be committed by the > > > master programme. > > > > > > I suspect as the calendar naming conventions seem to be e_cal, that > > > would make sense more than ec_, esp since the filename was changed to > > > e-cal-. > > > > > > You should probably also do page_check(xx, NULL) since you want all > > > values checked - there might be more pages. > > > > > > But those are minor points apart from the instant-change-to-source > > > thing. > > > > > > I'm not sure who needs to own the copyrights if the code is going to > > > be in the main tree, Novell may want to, even for plugins. > > > > > > On Thu, 2004-10-14 at 15:27 -0600, David Trowbridge wrote: > > > > Here is my first attempt at adding config hooks for the calendar > > > > properties window. > > > > > > > > Note that at this time, field verification isn't enabled, since I wasn't > > > > sure what people wanted for it. > > > > > > > > It requires a plugin to be installed for webcal properties to function > > > > correctly - i've added a plugins/ directory to the evolution root (as > > > > per some discussion on irc a week or so back). This will probably mean > > > > changing EPlugin to load plugins from both the system directory and the > > > > user EVOLUTION_PLUGIN_PATH, rather than just one or the other. > > > > > > > > -David > > > -- > > > > > > Michael Zucchi <notzed ximian com> > > > "born to die, live to work, it's > > > all downhill from here" > > > Novell's Evolution and Free > > > Software Developer > -- > > Michael Zucchi <notzed ximian com> > "born to die, live to work, it's > all downhill from here" > Novell's Evolution and Free > Software Developer
Attachment:
newfiles.tar.gz
Description: application/compressed-tar
Index: configure.in =================================================================== RCS file: /cvs/gnome/evolution/configure.in,v retrieving revision 1.730 diff -u -r1.730 configure.in --- configure.in 21 Oct 2004 08:51:32 -0000 1.730 +++ configure.in 22 Oct 2004 00:33:18 -0000 @@ -1338,21 +1338,27 @@ EVO_PLUGIN_RULE=$srcdir/plugin.mk AC_SUBST_FILE(EVO_PLUGIN_RULE) -AC_ARG_ENABLE(plugins, [ --enable-plugins=[no/all/list] Enable plugins.],enable_plugins="$enableval",enable_plugins=no) +AC_ARG_ENABLE(plugins, [ --enable-plugins=[base/no/all/list] Enable plugins.],enable_plugins="$enableval",enable_plugins=base) dnl Add any new plugins here -plugins_all="subject-thread save-attachments prefer-plain save-calendar select-one-source copy-tool" +plugins_base="calendar-http" +plugins_all="calendar-http subject-thread save-attachments prefer-plain save-calendar select-one-source copy-tool" if test x"$enable_plugins" = "xno"; then plugins_enabled="" msg_plugins="no" else - if test x"$enable_plugins" = "xall"; then - plugins_enabled="$plugins_all" + if test x"$enable_plugins" = "xbase"; then + plugins_enabled="$plugins_base" + msg_plugins="$plugins_base" else - plugins_enabled="$enable_plugins" - fi - msg_plugins="$enable_plugins" + if test x"$enable_plugins" = "xall"; then + plugins_enabled="$plugins_all" + else + plugins_enabled="$enable_plugins" + fi + msg_plugins="$enable_plugins" + fi fi AC_SUBST(plugins_enabled) AC_SUBST(plugins_all) @@ -1533,6 +1539,7 @@ mail/default/C/Makefile mail/importers/Makefile plugins/Makefile +plugins/calendar-http/Makefile plugins/subject-thread/Makefile plugins/save-attachments/Makefile plugins/save-calendar/Makefile Index: calendar/ChangeLog =================================================================== RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v retrieving revision 1.2552 diff -u -r1.2552 ChangeLog --- calendar/ChangeLog 20 Oct 2004 18:51:16 -0000 1.2552 +++ calendar/ChangeLog 22 Oct 2004 00:33:31 -0000 @@ -1,3 +1,10 @@ +2004-10-20 David Trowbridge <trowbrds cs colorado edu> + + * gui/e-cal-config.c: added EConfig subclass for calendars + * gui/calendar-component.c, gui/tasks-component.c: initialize + plugin hooks on component startup. + * gui/dialogs/calendar-setup.c: Converted to use EConfig + 2004-10-20 JP Rosevear <jpr novell com> * gui/calendar-component.c: put an icon on the properties menu item Index: calendar/gui/Makefile.am =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/Makefile.am,v retrieving revision 1.299 diff -u -r1.299 Makefile.am --- calendar/gui/Makefile.am 18 Oct 2004 04:08:47 -0000 1.299 +++ calendar/gui/Makefile.am 22 Oct 2004 00:33:31 -0000 @@ -59,6 +59,11 @@ component_LTLIBRARIES = libevolution-calendar.la +ecalendarincludedir = $(privincludedir)/calendar/gui + +ecalendarinclude_HEADERS = \ + e-cal-config.h + INCLUDES = \ -DG_LOG_DOMAIN=\"calendar-gui\" \ -I$(top_builddir)/shell \ @@ -115,6 +120,8 @@ e-alarm-list.h \ e-cal-component-preview.c \ e-cal-component-preview.h \ + e-cal-config.c \ + e-cal-config.h \ e-cal-menu.c \ e-cal-menu.h \ e-cal-model-calendar.h \ Index: calendar/gui/calendar-component.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/calendar-component.c,v retrieving revision 1.189 diff -u -r1.189 calendar-component.c --- calendar/gui/calendar-component.c 20 Oct 2004 18:51:16 -0000 1.189 +++ calendar/gui/calendar-component.c 22 Oct 2004 00:33:33 -0000 @@ -55,6 +55,7 @@ #include "e-util/e-icon-factory.h" #include "e-cal-menu.h" #include "e-cal-popup.h" +#include "e-cal-config.h" /* IDs for user creatable items */ #define CREATE_EVENT_ID "event" @@ -376,7 +377,7 @@ if (!selected_source) return; - calendar_setup_edit_calendar (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), selected_source); + calendar_setup_edit_calendar (GTK_WINDOW (gtk_widget_get_toplevel (ep->target->widget)), selected_source); } static EPopupItem ecc_source_popups[] = { @@ -1183,6 +1184,17 @@ } static void +cc_startup (CalendarComponent *cc) +{ + static int started = 0; + if (started) + return; + started = 1; + + e_plugin_hook_register_type (e_cal_config_hook_get_type ()); +} + +static void impl_createControls (PortableServer_Servant servant, Bonobo_Control *corba_sidebar_control, Bonobo_Control *corba_view_control, @@ -1192,7 +1204,9 @@ CalendarComponent *calendar_component = CALENDAR_COMPONENT (bonobo_object_from_servant (servant)); CalendarComponentPrivate *priv; CalendarComponentView *component_view; - + + cc_startup (calendar_component); + priv = calendar_component->priv; /* Create the calendar component view */ Index: calendar/gui/tasks-component.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/tasks-component.c,v retrieving revision 1.79 diff -u -r1.79 tasks-component.c --- calendar/gui/tasks-component.c 20 Oct 2004 18:51:16 -0000 1.79 +++ calendar/gui/tasks-component.c 22 Oct 2004 00:33:35 -0000 @@ -983,6 +983,17 @@ } static void +tc_startup (TasksComponent *tc) +{ + static int started = 0; + if (started) + return; + started = 1; + + e_plugin_hook_register_type (e_cal_config_hook_get_type ()); +} + +static void impl_createControls (PortableServer_Servant servant, Bonobo_Control *corba_sidebar_control, Bonobo_Control *corba_view_control, @@ -992,6 +1003,8 @@ TasksComponent *component = TASKS_COMPONENT (bonobo_object_from_servant (servant)); TasksComponentPrivate *priv; TasksComponentView *component_view; + + tc_startup (component); priv = component->priv; Index: calendar/gui/dialogs/Makefile.am =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/Makefile.am,v retrieving revision 1.64 diff -u -r1.64 Makefile.am --- calendar/gui/dialogs/Makefile.am 24 Jun 2004 21:02:09 -0000 1.64 +++ calendar/gui/dialogs/Makefile.am 22 Oct 2004 00:33:35 -0000 @@ -89,7 +89,6 @@ alarm-dialog.glade \ alarm-list-dialog.glade \ cal-prefs-dialog.glade \ - calendar-setup.glade \ e-delegate-dialog.glade \ event-page.glade \ meeting-page.glade \ Index: calendar/gui/dialogs/calendar-setup.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/calendar-setup.c,v retrieving revision 1.29 diff -u -r1.29 calendar-setup.c --- calendar/gui/dialogs/calendar-setup.c 30 Jul 2004 07:37:02 -0000 1.29 +++ calendar/gui/dialogs/calendar-setup.c 22 Oct 2004 00:33:35 -0000 @@ -1,12 +1,12 @@ -/* Evolution calendar - Calendar properties dialogs +/* + * Authors: David Trowbridge <trowbrds cs colorado edu> * - * Copyright (C) 2003 Novell, Inc. - * - * Author: Hans Petter Jansson <hpj ximian com> + * Copyright (C) 2004 Novell, Inc (www.novell.com) * * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * 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 @@ -15,879 +15,461 @@ * * 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. + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * */ #ifdef HAVE_CONFIG_H #include <config.h> #endif -#include <string.h> -#include <bonobo/bonobo-i18n.h> -#include <gdk/gdkkeysyms.h> +#include <gtk/gtkbox.h> #include <gtk/gtkdialog.h> -#include <gtk/gtkentry.h> -#include <gtk/gtkmenu.h> -#include <gtk/gtkmenuitem.h> -#include <gtk/gtkmessagedialog.h> -#include <gtk/gtkoptionmenu.h> -#include <libgnome/libgnome.h> -#include <libgnomeui/gnome-druid.h> -#include <libgnomeui/gnome-druid-page.h> -#include <libgnomeui/gnome-color-picker.h> -#include <glade/glade.h> +#include <gtk/gtkstock.h> +#include <gtk/gtkvbox.h> + +#include <libedataserver/e-source.h> #include <libedataserver/e-source-list.h> -#include <libecal/e-cal.h> -#include <e-util/e-dialog-utils.h> -#include <e-util/e-url.h> -#include <e-util/e-icon-factory.h> +#include <libgnome/gnome-i18n.h> +#include <libgnomeui/libgnomeui.h> + #include "calendar-setup.h" +#include "../e-cal-config.h" -#define GLADE_FILE_NAME "calendar-setup.glade" +typedef struct _CalendarSourceDialog CalendarSourceDialog; -typedef struct -{ - GladeXML *gui_xml; +struct _CalendarSourceDialog { + ECalConfig *config; /* the config manager */ - /* Main widgets */ - GtkWidget *window; - GtkWidget *druid; + GtkWidget *window; - /* Source selection */ - ESourceList *source_list; - GtkWidget *group_optionmenu; + /* Source selection (creation only) */ + ESourceList *source_list; + GSList *menu_source_groups; + GtkWidget *group_optionmenu; - /* ESource we're currently editing (if any) */ - ESource *source; + /* ESource we're currently editing */ + ESource *source; + /* The original source in edit mode. Also used to flag when we are in edit mode. */ + ESource *original_source; - /* Source group we're creating/editing source in */ + /* Source group we're creating/editing a source in */ ESourceGroup *source_group; - - /* General page fields */ - GtkWidget *name_entry; - GtkWidget *source_color; - - /* Location page fields */ - GtkWidget *uri_entry; - GtkWidget *refresh_spin; - - /* sensitive blocks */ - GtkWidget *uri_label; - GtkWidget *uri_hbox; - GtkWidget *refresh_label; - GtkWidget *refresh_hbox; - GtkWidget *refresh_optionmenu; - GtkWidget *add_button; -} -SourceDialog; - -static gchar * -print_uri_noproto (EUri *uri) -{ - gchar *uri_noproto; - - if (uri->port != 0) - uri_noproto = g_strdup_printf ( - "%s%s%s%s%s%s%s:%d%s%s%s", - uri->user ? uri->user : "", - uri->authmech ? ";auth=" : "", - uri->authmech ? uri->authmech : "", - uri->passwd ? ":" : "", - uri->passwd ? uri->passwd : "", - uri->user ? "@" : "", - uri->host ? uri->host : "", - uri->port, - uri->path ? uri->path : "", - uri->query ? "?" : "", - uri->query ? uri->query : ""); - else - uri_noproto = g_strdup_printf ( - "%s%s%s%s%s%s%s%s%s%s", - uri->user ? uri->user : "", - uri->authmech ? ";auth=" : "", - uri->authmech ? uri->authmech : "", - uri->passwd ? ":" : "", - uri->passwd ? uri->passwd : "", - uri->user ? "@" : "", - uri->host ? uri->host : "", - uri->path ? uri->path : "", - uri->query ? "?" : "", - uri->query ? uri->query : ""); - - return uri_noproto; -} - -static gboolean -source_group_is_remote (ESourceGroup *group) -{ - EUri *uri; - gboolean is_remote = FALSE; - - if (!group) - return FALSE; - - uri = e_uri_new (e_source_group_peek_base_uri (group)); - if (!uri) - return FALSE; - - if (uri->protocol && uri->protocol [0] && strcmp (uri->protocol, "file")) - is_remote = TRUE; - - e_uri_free (uri); - return is_remote; -} - -static gboolean -source_is_remote (ESource *source) -{ - gchar *uri_str; - EUri *uri; - gboolean is_remote = FALSE; - - uri_str = e_source_get_uri (source); - if (!uri_str) - return FALSE; - - uri = e_uri_new (uri_str); - g_free (uri_str); - - if (!uri) - return FALSE; - - if (uri->protocol && uri->protocol [0] && strcmp (uri->protocol, "file")) - is_remote = TRUE; - - e_uri_free (uri); - return is_remote; -} +}; static gboolean -validate_remote_uri (const gchar *source_location, gboolean interactive, GtkWidget *parent) +eccp_check_complete (EConfig *ec, const char *pageid, void *data) { - EUri *uri; - - if (!source_location || !strlen (source_location)) { - if (interactive) - e_notice (parent, GTK_MESSAGE_ERROR, - _("You must specify a location to get the calendar from.")); - return FALSE; - } + CalendarSourceDialog *sdialog = data; + gboolean valid = TRUE; + const char *tmp; + ESource *source; - uri = e_uri_new (source_location); - if (!uri) { - if (interactive) - e_notice (parent, GTK_MESSAGE_ERROR, - _("The source location '%s' is not well-formed."), - source_location); - return FALSE; - } + tmp = e_source_peek_name (sdialog->source); + valid = tmp && tmp[0] && ((source = e_source_group_peek_source_by_name (sdialog->source_group, tmp)) == NULL || source == sdialog->original_source); - /* Make sure we're in agreement with the protocol. Note that EUri sets it - * to 'file' if none was specified in the input URI. We don't want to - * silently translate an explicit file:// into http:// though. */ - if (uri->protocol && - strcmp (uri->protocol, "http") && - strcmp (uri->protocol, "webcal")) { - e_uri_free (uri); - - if (interactive) - e_notice (parent, GTK_MESSAGE_ERROR, - _("The source location '%s' is not a webcal source."), - source_location); - return FALSE; - } - - e_uri_free (uri); - return TRUE; + return valid; } -static gboolean -source_group_is_mutable (ESourceGroup *source_group) +static void +colorpicker_set_color (GnomeColorPicker *color, guint32 rgb) { - gboolean mutable; - - if (!source_group) - return FALSE; - - mutable = !e_source_group_get_readonly (source_group); - - if (mutable) { - const char *uri = e_source_group_peek_base_uri (source_group); - - if (g_str_has_prefix (uri, "groupwise://") || g_str_has_prefix (uri, "exchange://")) - mutable = FALSE; - - } - - return mutable; + gnome_color_picker_set_i8 (color, (rgb & 0xff0000) >> 16, (rgb & 0xff00) >> 8, rgb & 0xff, 0xff); } -static int -source_group_menu_add_groups (GtkMenuShell *menu_shell, SourceDialog *source_dialog) +static guint32 +colorpicker_get_color (GnomeColorPicker *color) { - ESourceList *source_list = source_dialog->source_list; - GSList *groups, *sl; - int index=-1, i=0; - - - if (source_list == NULL) - return index; - - groups = e_source_list_peek_groups (source_list); - for (sl = groups; sl; sl = g_slist_next (sl)) { - GtkWidget *menu_item; - ESourceGroup *group = sl->data; - - menu_item = gtk_menu_item_new_with_label (e_source_group_peek_name (group)); - gtk_widget_show (menu_item); - - if (!source_group_is_mutable (group)) - gtk_widget_set_sensitive(menu_item, FALSE); - - if (source_dialog->source_group - && !strcmp (e_source_group_peek_uid (source_dialog->source_group), e_source_group_peek_uid (group))) - index = i; + guint8 r, g, b, a; + guint32 rgb = 0; - gtk_menu_shell_append (menu_shell, menu_item); - i++; - } + gnome_color_picker_get_i8 (color, &r, &g, &b, &a); - if (!source_dialog->source_group && groups) { - source_dialog->source_group = groups->data; - return -1; - } + rgb = r; + rgb <<= 8; + rgb |= g; + rgb <<= 8; + rgb |= b; - return index; + return rgb; } -static ESource * -create_new_source_with_group (GtkWindow *parent, - ESourceGroup *group, - const char *source_name, - const char *source_location, - ECalSourceType source_type) +static void +eccp_commit (EConfig *ec, GSList *items, void *data) { - ESource *source; - ECal *cal; - - if (e_source_group_peek_source_by_name (group, source_name)) { - e_notice (parent, GTK_MESSAGE_ERROR, - _("Source with name '%s' already exists in the selected group"), - source_name); - return NULL; - } - - if (source_group_is_remote (group)) { - EUri *uri; - gchar *relative_uri; - - /* Remote source */ - - if (!source_location || !strlen (source_location)) { - e_notice (parent, GTK_MESSAGE_ERROR, - _("The group '%s' is remote. You must specify a location " - "to get the calendar from"), - e_source_group_peek_name (group)); - return NULL; - } - - if (!validate_remote_uri (source_location, TRUE, GTK_WIDGET (parent))) - return NULL; + CalendarSourceDialog *sdialog = data; + xmlNodePtr xml; - /* Our relative_uri is everything but protocol, which is supplied by parent group */ - uri = e_uri_new (source_location); - relative_uri = print_uri_noproto (uri); - e_uri_free (uri); + if (sdialog->original_source) { + guint32 color; - /* Create source */ - source = e_source_new (source_name, relative_uri); + xml = xmlNewNode (NULL, "dummy"); + e_source_dump_to_xml_node (sdialog->source, xml); + e_source_update_from_xml_node (sdialog->original_source, xml->children, NULL); + xmlFreeNode (xml); - g_free (relative_uri); + e_source_get_color (sdialog->source, &color); + e_source_set_color (sdialog->original_source, color); } else { - /* Local source */ - source = e_source_new (source_name, source_name); - e_source_set_relative_uri (source, e_source_peek_uid (source)); + e_source_group_add_source (sdialog->source_group, sdialog->source, -1); + e_source_list_sync (sdialog->source_list, NULL); } - - e_source_group_add_source (group, source, -1); - - /* create the calendar in the backend */ - cal = e_cal_new (source, source_type); - if (!e_cal_open (cal, FALSE, NULL)) { - e_source_group_remove_source (group, source); - g_object_unref (source); - source = NULL; - } - - g_object_unref (cal); - - return source; -} - -static void -source_dialog_destroy (SourceDialog *source_dialog) -{ - g_object_unref (source_dialog->gui_xml); - - if (source_dialog->source) - g_object_unref (source_dialog->source); - - g_free (source_dialog); -} - -static gboolean -remote_page_verify (SourceDialog *source_dialog) -{ - const gchar *uri; - - uri = gtk_entry_get_text (GTK_ENTRY (source_dialog->uri_entry)); - if (!uri || !uri [0]) - return FALSE; - - if (!validate_remote_uri (uri, FALSE, NULL)) - return FALSE; - - return TRUE; } static void -general_entry_modified (SourceDialog *source_dialog) +eccp_free (EConfig *ec, GSList *items, void *data) { - const char *text = gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry)); - gboolean sensitive = text && *text != '\0'; + CalendarSourceDialog *sdialog = data; - sensitive = sensitive && (source_dialog->source_group != NULL); - - if (source_group_is_remote (source_dialog->source_group) && source_group_is_mutable (source_dialog->source_group)) { - sensitive = sensitive && remote_page_verify (source_dialog); - } + g_slist_free (items); - gtk_widget_set_sensitive (source_dialog->add_button, sensitive); + g_object_unref (sdialog->source); + if (sdialog->original_source) + g_object_unref (sdialog->original_source); + if (sdialog->source_list) + g_object_unref (sdialog->source_list); + g_slist_free (sdialog->menu_source_groups); + g_free (sdialog); } static void -general_update_dialog (SourceDialog *source_dialog) +eccp_type_changed (GtkComboBox *dropdown, CalendarSourceDialog *sdialog) { - gboolean remote = FALSE; - gboolean mutable = source_group_is_mutable (source_dialog->source_group); + int id = gtk_combo_box_get_active (dropdown); + GtkTreeModel *model; + GtkTreeIter iter; - if (source_dialog->source && e_source_get_readonly (source_dialog->source)) - gtk_widget_set_sensitive (glade_xml_get_widget (source_dialog->gui_xml, "settings-table"), FALSE); + model = gtk_combo_box_get_model (dropdown); + if (id == -1 || !gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) + return; - /* These are calendar specific so make sure we have them */ - if (source_dialog->uri_entry) - g_signal_handlers_block_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, source_dialog); + /* TODO: when we change the group type, we lose all of the pre-filled dialog info */ - remote = (source_dialog->source && source_is_remote (source_dialog->source)) - || source_group_is_remote (source_dialog->source_group); + gtk_tree_model_get (model, &iter, 1, &sdialog->source_group, -1); + /* HACK: doesn't work if you don't do this */ + e_source_set_absolute_uri (sdialog->source, NULL); + e_source_set_group (sdialog->source, sdialog->source_group); + e_source_set_relative_uri (sdialog->source, ""); - if (!remote) { - if (source_dialog->uri_entry) - gtk_entry_set_text (GTK_ENTRY (source_dialog->uri_entry), ""); - if (source_dialog->refresh_spin) - gtk_spin_button_set_value (GTK_SPIN_BUTTON (source_dialog->refresh_spin), 30); - } - - general_entry_modified (source_dialog); - - if (source_dialog->uri_hbox) - gtk_widget_set_sensitive (source_dialog->uri_hbox, remote && mutable); - if (source_dialog->uri_label) - gtk_widget_set_sensitive (source_dialog->uri_label, remote && mutable); - if (source_dialog->refresh_label) - gtk_widget_set_sensitive (source_dialog->refresh_label, remote && mutable); - if (source_dialog->refresh_hbox) - gtk_widget_set_sensitive (source_dialog->refresh_hbox, remote && mutable); - - if (source_dialog->uri_entry) - g_signal_handlers_unblock_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, source_dialog); -} - -static void -colorpicker_set_color (GnomeColorPicker *color, guint32 rgb) -{ - gnome_color_picker_set_i8 (color, (rgb & 0xff0000) >> 16, (rgb & 0xff00) >> 8, rgb & 0xff, 0xff); + e_config_target_changed ((EConfig *) sdialog->config, E_CONFIG_TARGET_CHANGED_REBUILD); } -static guint32 -colorpicker_get_color (GnomeColorPicker *color) +static GtkWidget * +eccp_get_source_type (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, void *data) { - guint8 r, g, b, a; - guint32 rgb = 0; - - gnome_color_picker_get_i8 (color, &r, &g, &b, &a); - - rgb = r; - rgb <<= 8; - rgb |= g; - rgb <<= 8; - rgb |= b; - - return rgb; -} + static GtkWidget *label, *type; + int row; + CalendarSourceDialog *sdialog = data; + ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target; + ESource *source = t->source; + ESourceGroup *group = e_source_peek_group (source); + char *markup; -static char * -get_refresh_minutes (SourceDialog *source_dialog) -{ - int setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (source_dialog->refresh_spin)); + if (old) + gtk_widget_destroy (label); - if (source_dialog->refresh_optionmenu) - switch (gtk_option_menu_get_history (GTK_OPTION_MENU (source_dialog->refresh_optionmenu))){ - case 0: /* minutes */ - break; - case 1: /* hours */ - setting *= 60; - break; - case 2: /* days */ - setting *= 1440; - break; - case 3: /* weeks wtf? why so long */ - setting *= 10080; - break; - default: - g_warning ("Time unit out of range"); - break; - } + row = ((GtkTable *)parent)->nrows; - return g_strdup_printf ("%d", setting); -} + if (sdialog->original_source) { + label = gtk_label_new (_("Type:")); -static void -set_refresh_time (SourceDialog *source_dialog) { - int time; - int item_num = 0; - - const char *refresh_str = e_source_get_property (source_dialog->source, "refresh"); - time = refresh_str ? atoi (refresh_str) : 30; - - if (source_dialog->refresh_optionmenu) { - if (time && !(time % 10080)) { - /* weeks */ - item_num = 3; - time /= 10080; - } else if (time && !(time % 1440)) { - /* days */ - item_num = 2; - time /= 1440; - } else if (time && !(time % 60)) { - /* days */ - item_num = 1; - time /= 60; + type = gtk_label_new (""); + gtk_widget_show (type); + markup = g_strdup_printf ("<span weight=\"bold\">%s</span>", e_source_group_peek_name (group)); + gtk_label_set_markup (GTK_LABEL (type), markup); + gtk_misc_set_alignment (GTK_MISC (type), 0.0, 0.5); + g_free (markup); + gtk_table_attach (GTK_TABLE (parent), type, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + } else { + GtkCellRenderer *cell; + GtkListStore *store; + GtkTreeIter iter; + GSList *l; + int active = 0, i = 0; + + label = gtk_label_new_with_mnemonic(_("_Type:")); + + type = gtk_combo_box_new (); + cell = gtk_cell_renderer_text_new (); + store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); + for (l = sdialog->menu_source_groups; l; l = g_slist_next (l)) { + ESourceGroup *group = l->data; + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, e_source_group_peek_name (group), 1, group, -1); + if (sdialog->source_group == group) + active = i; + i++; } - gtk_option_menu_set_history (GTK_OPTION_MENU (source_dialog->refresh_optionmenu), item_num); - } - - gtk_spin_button_set_value (GTK_SPIN_BUTTON (source_dialog->refresh_spin), time); - return; -} - -static void -source_to_dialog (SourceDialog *source_dialog) -{ - ESource *source = source_dialog->source; - gboolean remote = FALSE; - - g_signal_handlers_block_matched (source_dialog->name_entry, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, source_dialog); - - /* These are calendar specific so make sure we have them */ - if (source_dialog->uri_entry) - g_signal_handlers_block_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, source_dialog); - if (source_dialog->refresh_spin) - g_signal_handlers_block_matched (source_dialog->refresh_spin, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, source_dialog); - - gtk_entry_set_text (GTK_ENTRY (source_dialog->name_entry), source ? e_source_peek_name (source) : ""); - - if (source && source_is_remote (source)) { - gchar *uri_str; - - remote = TRUE; - - uri_str = e_source_get_uri (source); - gtk_entry_set_text (GTK_ENTRY (source_dialog->uri_entry), uri_str); - g_free (uri_str); - - set_refresh_time (source_dialog); - } else { - if (source_dialog->uri_entry) - gtk_entry_set_text (GTK_ENTRY (source_dialog->uri_entry), ""); - if (source_dialog->refresh_spin) - gtk_spin_button_set_value (GTK_SPIN_BUTTON (source_dialog->refresh_spin), 30); + gtk_cell_layout_pack_start ((GtkCellLayout *) type, cell, TRUE); + gtk_cell_layout_set_attributes ((GtkCellLayout *) type, cell, "text", 0, NULL); + gtk_combo_box_set_model ((GtkComboBox *) type, (GtkTreeModel *) store); + gtk_combo_box_set_active ((GtkComboBox *) type, active); + g_signal_connect (type, "changed", G_CALLBACK (eccp_type_changed), sdialog); + gtk_widget_show (type); + gtk_table_attach (GTK_TABLE (parent), type, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), type); } - general_update_dialog (source_dialog); - - g_signal_handlers_unblock_matched (source_dialog->name_entry, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, source_dialog); - if (source_dialog->uri_entry) - g_signal_handlers_unblock_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, source_dialog); - if (source_dialog->refresh_spin) - g_signal_handlers_unblock_matched (source_dialog->refresh_spin, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, source_dialog); - if (source_dialog->source_color) { - static guint32 assigned_colors[] = { - 0xBECEDD, /* 190 206 221 Blue */ - 0xE2F0EF, /* 226 240 239 Light Blue */ - 0xC6E2B7, /* 198 226 183 Green */ - 0xE2F0D3, /* 226 240 211 Light Green */ - 0xE2D4B7, /* 226 212 183 Khaki */ - 0xEAEAC1, /* 234 234 193 Light Khaki */ - 0xF0B8B7, /* 240 184 183 Pink */ - 0xFED4D3, /* 254 212 211 Light Pink */ - 0xE2C6E1, /* 226 198 225 Purple */ - 0xF0E2EF /* 240 226 239 Light Purple */ - }; - GRand *rand = g_rand_new (); - guint32 color; - - color = assigned_colors[g_rand_int_range (rand, 0, 9)]; - g_rand_free (rand); - - if (source_dialog->source) - e_source_get_color (source_dialog->source, &color); - else - /* FIXME */; + gtk_widget_show (label); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); - colorpicker_set_color (GNOME_COLOR_PICKER (source_dialog->source_color), color); - } + return type; } static void -dialog_to_source (SourceDialog *source_dialog) +name_changed (GtkEntry *entry, ECalConfigTargetSource *t) { - ESource *source = source_dialog->source; - - g_return_if_fail (source != NULL); - - e_source_set_name (source, gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry))); - if (source_is_remote (source)) { - EUri *uri; - gchar *relative_uri; - gchar *refresh_str; - - /* Our relative_uri is everything but protocol, which is supplied by parent group */ - uri = e_uri_new (gtk_entry_get_text (GTK_ENTRY (source_dialog->uri_entry))); - if (!uri) { - g_warning ("Invalid remote URI!"); - return; - } - - relative_uri = print_uri_noproto (uri); - e_source_set_relative_uri (source, relative_uri); - g_free (relative_uri); - e_uri_free (uri); - - refresh_str = get_refresh_minutes (source_dialog); - e_source_set_property (source, "refresh", refresh_str); - g_free (refresh_str); - } - - if (source_dialog->source_color) - e_source_set_color (source, - colorpicker_get_color (GNOME_COLOR_PICKER (source_dialog->source_color))); + ESource *source = t->source; + e_source_set_name (source, gtk_entry_get_text (GTK_ENTRY (entry))); } -static void -dialog_hide_unused_options (SourceDialog *source_dialog) +static GtkWidget * +eccp_get_source_name (EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) { - ESource *source = source_dialog->source; + static GtkWidget *label, *entry; + int row; + ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target; + ESource *source = t->source; - if (source && (!source_is_remote (source) || !source_group_is_mutable (source_dialog->source_group))) { - if (source_dialog->uri_hbox) - gtk_widget_hide (source_dialog->uri_hbox); - if (source_dialog->uri_label) - gtk_widget_hide (source_dialog->uri_label); - if (source_dialog->refresh_label) - gtk_widget_hide (source_dialog->refresh_label); - if (source_dialog->refresh_hbox) - gtk_widget_hide (source_dialog->refresh_hbox); - } -} + if (old) + gtk_widget_destroy (label); -static void -source_group_changed_sensitive (SourceDialog *source_dialog) -{ - source_dialog->source_group = - g_slist_nth (e_source_list_peek_groups (source_dialog->source_list), - gtk_option_menu_get_history (GTK_OPTION_MENU (source_dialog->group_optionmenu)))->data; + row = ((GtkTable*)parent)->nrows; - general_update_dialog (source_dialog); -} + label = gtk_label_new_with_mnemonic (_("_Name:")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_widget_show (label); + gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); -static gboolean -key_press_event (GtkWidget *widget, GdkEventKey *event) -{ - if (event->keyval == GDK_Escape) { - gtk_widget_destroy (widget); - return TRUE; - } + entry = gtk_entry_new (); + gtk_widget_show (entry); + gtk_table_attach (GTK_TABLE (parent), entry, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); + g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (name_changed), (gpointer) t); - return FALSE; -} + if (source) + gtk_entry_set_text (GTK_ENTRY (entry), e_source_peek_name (source)); -static void -new_calendar_cancel (SourceDialog *source_dialog) -{ - gtk_widget_destroy (source_dialog->window); + return entry; } static void -new_calendar_add (SourceDialog *source_dialog) +color_changed (GnomeColorPicker *picker, guint r, guint g, guint b, guint a, ECalConfigTargetSource *t) { - source_dialog->source = - create_new_source_with_group (GTK_WINDOW (source_dialog->window), source_dialog->source_group, - gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry)), - gtk_entry_get_text (GTK_ENTRY (source_dialog->uri_entry)), - E_CAL_SOURCE_TYPE_EVENT); - dialog_to_source (source_dialog); - - gtk_widget_destroy (source_dialog->window); + ESource *source = t->source; + e_source_set_color (source, colorpicker_get_color (picker)); } -static void -edit_calendar_finish (SourceDialog *source_dialog) +static GtkWidget * +eccp_get_source_color (EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) { - dialog_to_source (source_dialog); - gtk_widget_destroy (source_dialog->window); -} + CalendarSourceDialog *sdialog = data; + static GtkWidget *label, *picker; + int row; + ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target; + ESource *source = t->source; -gboolean -calendar_setup_edit_calendar (GtkWindow *parent, ESource *source) -{ - SourceDialog *source_dialog = g_new0 (SourceDialog, 1); - int index; - GList *icon_list; + static guint32 assigned_colors[] = { + 0xBECEDD, /* 190 206 221 Blue */ + 0xE2F0EF, /* 226 240 239 Light Blue */ + 0xC6E2B7, /* 198 226 183 Green */ + 0xE2F0D3, /* 226 240 211 Light Green */ + 0xE2D4B7, /* 226 212 183 Khaki */ + 0xEAEAC1, /* 234 234 193 Light Khaki */ + 0xF0B8B7, /* 240 184 183 Pink */ + 0xFED4D3, /* 254 212 211 Light Pink */ + 0xE2C6E1, /* 226 198 225 Purple */ + 0xF0E2EF /* 240 226 239 Light Purple */ + }; + GRand *rand = g_rand_new (); + guint32 color; - source_dialog->gui_xml = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "add-calendar-window", NULL); - if (!source_dialog->gui_xml) { - g_warning (G_STRLOC ": Cannot load Glade file."); - g_free (source_dialog); - return FALSE; - } + if (old) + gtk_widget_destroy (label); - source_dialog->window = glade_xml_get_widget (source_dialog->gui_xml, "add-calendar-window"); - if (source) { - gtk_window_set_title (GTK_WINDOW (source_dialog->window), "Calendar Properties"); - source_dialog->source = source; - source_dialog->source_group = e_source_peek_group (source); - g_object_ref (source); - } - - g_signal_connect (source_dialog->window, "key-press-event", G_CALLBACK (key_press_event), NULL); + row = ((GtkTable*)parent)->nrows; - source_dialog->name_entry = glade_xml_get_widget (source_dialog->gui_xml, "name-entry"); - g_signal_connect_swapped (source_dialog->name_entry, "changed", - G_CALLBACK (general_entry_modified), source_dialog); - source_dialog->source_list = e_source_list_new_for_gconf_default ("/apps/evolution/calendar/sources"); - - source_dialog->group_optionmenu = - glade_xml_get_widget (source_dialog->gui_xml, "group-optionmenu"); - if (!GTK_IS_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (source_dialog->group_optionmenu)))) { - GtkWidget *menu = gtk_menu_new (); - gtk_option_menu_set_menu (GTK_OPTION_MENU (source_dialog->group_optionmenu), menu); - gtk_widget_show (menu); - } - gtk_widget_set_sensitive (source_dialog->group_optionmenu, source == NULL); + color = assigned_colors[g_rand_int_range (rand, 0, 9)]; + g_rand_free (rand); - /* NOTE: This assumes that we have sources. If they don't exist, they're set up - * on startup of the calendar component. */ - index = source_group_menu_add_groups (GTK_MENU_SHELL (gtk_option_menu_get_menu ( - GTK_OPTION_MENU (source_dialog->group_optionmenu))), source_dialog); - gtk_option_menu_set_history (GTK_OPTION_MENU (source_dialog->group_optionmenu), index); - - g_signal_connect_swapped (source_dialog->group_optionmenu, "changed", - G_CALLBACK (source_group_changed_sensitive), source_dialog); - source_dialog->uri_entry = glade_xml_get_widget (source_dialog->gui_xml, "uri-entry"); - source_dialog->uri_label = glade_xml_get_widget (source_dialog->gui_xml, "uri-label"); - source_dialog->uri_hbox = glade_xml_get_widget (source_dialog->gui_xml, "uri-hbox"); - - g_signal_connect_swapped (source_dialog->uri_entry, "changed", - G_CALLBACK (general_entry_modified), source_dialog); - - source_dialog->refresh_spin = glade_xml_get_widget (source_dialog->gui_xml, "refresh-spin"); - source_dialog->refresh_optionmenu = glade_xml_get_widget (source_dialog->gui_xml, "refresh-optionmenu"); - source_dialog->refresh_label = glade_xml_get_widget (source_dialog->gui_xml, "refresh-label"); - source_dialog->refresh_hbox = glade_xml_get_widget (source_dialog->gui_xml, "refresh-hbox"); + label = gtk_label_new_with_mnemonic (_("C_olor:")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_widget_show (label); + gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); - g_signal_connect_swapped (glade_xml_get_widget (source_dialog->gui_xml, "cancel-button"), "clicked", - G_CALLBACK (new_calendar_cancel), source_dialog); + picker = gnome_color_picker_new (); + gtk_widget_show (picker); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), picker); + gtk_table_attach (GTK_TABLE (parent), picker, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + g_signal_connect (G_OBJECT (picker), "color-set", G_CALLBACK (color_changed), t); - source_dialog->add_button = glade_xml_get_widget (source_dialog->gui_xml, "add-button"); - gtk_widget_set_sensitive (source_dialog->add_button, FALSE); + if (sdialog->original_source) + e_source_get_color (sdialog->original_source, &color); + else + /* since we don't have an original source here, we want to set + * the initial color */ + e_source_set_color (sdialog->source, color); + + colorpicker_set_color (GNOME_COLOR_PICKER (picker), color); + + return picker; +} + +static ECalConfigItem eccp_items[] = { + { E_CONFIG_BOOK, "", NULL }, + { E_CONFIG_PAGE, "00.general", N_("General") }, + { E_CONFIG_SECTION_TABLE, "00.general/00.source", N_("Calendar") }, + { E_CONFIG_ITEM_TABLE, "00.general/00.source/00.type", NULL, eccp_get_source_type }, + { E_CONFIG_ITEM_TABLE, "00.general/00.source/10.name", NULL, eccp_get_source_name }, + { E_CONFIG_ITEM_TABLE, "00.general/00.source/20.color", NULL, eccp_get_source_color }, + { 0 }, +}; + +static ECalConfigItem ectp_items[] = { + { E_CONFIG_BOOK, "", NULL }, + { E_CONFIG_PAGE, "00.general", N_("General") }, + { E_CONFIG_SECTION_TABLE, "00.general/00.source", N_("Tasks List") }, + { E_CONFIG_ITEM_TABLE, "00.general/00.source/00.type", NULL, eccp_get_source_type }, + { E_CONFIG_ITEM_TABLE, "00.general/00.source/10.name", NULL, eccp_get_source_name }, + { E_CONFIG_ITEM_TABLE, "00.general/00.source/20.color", NULL, eccp_get_source_color }, + { 0 }, +}; + +/** + * calendar_setup_edit_calendar: + * @parent: parent window for dialog (current unused) + * @source: the ESource corresponding to the calendar + * + * Show calendar properties for @source. + **/ +void +calendar_setup_edit_calendar (struct _GtkWindow *parent, ESource *source) +{ + CalendarSourceDialog *sdialog = g_new0 (CalendarSourceDialog, 1); + char *xml; + ECalConfig *ec; + int i; + GSList *items = NULL; + ECalConfigTargetSource *target; if (source) { - gtk_button_set_use_stock (GTK_BUTTON (source_dialog->add_button), TRUE); - gtk_button_set_label (GTK_BUTTON (source_dialog->add_button), GTK_STOCK_OK); + guint32 color; - g_signal_connect_swapped (source_dialog->add_button, "clicked", - G_CALLBACK (edit_calendar_finish), source_dialog); + sdialog->original_source = source; + g_object_ref (source); + sdialog->source_group = e_source_peek_group (source); + xml = e_source_to_standalone_xml (source); + sdialog->source = e_source_new_from_standalone_xml (xml); + g_free (xml); + + e_source_get_color (source, &color); + e_source_set_color (sdialog->source, color); } else { - g_signal_connect_swapped (source_dialog->add_button, "clicked", - G_CALLBACK (new_calendar_add), source_dialog); - } + GConfClient *gconf; + GSList *l; - source_dialog->source_color = glade_xml_get_widget (source_dialog->gui_xml, "source-color"); + sdialog->source = e_source_new ("", ""); + gconf = gconf_client_get_default (); + sdialog->source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/calendar/sources"); + l = e_source_list_peek_groups (sdialog->source_list); + sdialog->menu_source_groups = g_slist_copy(l); - g_object_weak_ref (G_OBJECT (source_dialog->window), - (GWeakNotify) source_dialog_destroy, source_dialog); - - source_to_dialog (source_dialog); - - gtk_window_set_type_hint (GTK_WINDOW (source_dialog->window), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_window_set_modal (GTK_WINDOW (source_dialog->window), TRUE); - - icon_list = e_icon_factory_get_icon_list ("stock_calendar"); - if (icon_list) { - gtk_window_set_icon_list (GTK_WINDOW (source_dialog->window), icon_list); - g_list_foreach (icon_list, (GFunc) g_object_unref, NULL); - g_list_free (icon_list); + sdialog->source_group = (ESourceGroup *)sdialog->menu_source_groups->data; + g_object_unref (gconf); } - dialog_hide_unused_options (source_dialog); - gtk_widget_show (source_dialog->window); - return TRUE; -} + /* HACK: doesn't work if you don't do this */ + e_source_set_absolute_uri (sdialog->source, NULL); + e_source_set_group (sdialog->source, sdialog->source_group); -static void -new_task_list_cancel (SourceDialog *source_dialog) -{ - gtk_widget_destroy (source_dialog->window); -} + sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties"); + for (i = 0; eccp_items[i].path; i++) + items = g_slist_prepend (items, &eccp_items[i]); + e_config_add_items ((EConfig *) ec, items, eccp_commit, NULL, eccp_free, sdialog); + e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog); -static void -new_task_list_add (SourceDialog *source_dialog) -{ - source_dialog->source = - create_new_source_with_group (GTK_WINDOW (source_dialog->window), source_dialog->source_group, - gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry)), - gtk_entry_get_text (GTK_ENTRY (source_dialog->uri_entry)), - E_CAL_SOURCE_TYPE_TODO); - dialog_to_source (source_dialog); - - gtk_widget_destroy (source_dialog->window); -} + target = e_cal_config_target_new_source (ec, sdialog->source); + e_config_set_target ((EConfig *) ec, (EConfigTarget *) target); -gboolean -calendar_setup_new_calendar (GtkWindow *parent) -{ - return calendar_setup_edit_calendar (parent, NULL); + sdialog->window = e_config_create_window ((EConfig *)ec, NULL, _("Calendar Properties")); + + /* forces initial validation */ + if (!sdialog->original_source) + e_config_target_changed ((EConfig *)ec, E_CONFIG_TARGET_CHANGED_STATE); + + return; } -static void -edit_task_list_finish (SourceDialog *source_dialog) +void +calendar_setup_new_calendar (struct _GtkWindow *parent) { - dialog_to_source (source_dialog); - gtk_widget_destroy (source_dialog->window); + calendar_setup_edit_calendar (parent, NULL); } -gboolean -calendar_setup_edit_task_list (GtkWindow *parent, ESource *source) +void +calendar_setup_edit_task_list (struct _GtkWindow *parent, ESource *source) { - SourceDialog *source_dialog = g_new0 (SourceDialog, 1); - int index; - GList *icon_list; - - source_dialog->gui_xml = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "add-task-list-window", NULL); - if (!source_dialog->gui_xml) { - g_warning (G_STRLOC ": Cannot load Glade file."); - g_free (source_dialog); - return FALSE; - } + CalendarSourceDialog *sdialog = g_new0 (CalendarSourceDialog, 1); + char *xml; + ECalConfig *ec; + int i; + GSList *items = NULL; + ECalConfigTargetSource *target; - source_dialog->window = glade_xml_get_widget (source_dialog->gui_xml, "add-task-list-window"); if (source) { - gtk_window_set_title (GTK_WINDOW (source_dialog->window), "Task List Properties"); - source_dialog->source = source; - source_dialog->source_group = e_source_peek_group (source); + guint32 color; + + sdialog->original_source = source; g_object_ref (source); - } + sdialog->source_group = e_source_peek_group (source); + xml = e_source_to_standalone_xml (source); + sdialog->source = e_source_new_from_standalone_xml (xml); + g_free (xml); - g_signal_connect (source_dialog->window, "key-press-event", G_CALLBACK (key_press_event), NULL); + e_source_get_color (source, &color); + e_source_set_color (sdialog->source, color); + } else { + GConfClient *gconf; + GSList *l; + + sdialog->source = e_source_new ("", ""); + gconf = gconf_client_get_default (); + sdialog->source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/tasks/sources"); + l = e_source_list_peek_groups (sdialog->source_list); + sdialog->menu_source_groups = g_slist_copy(l); - source_dialog->name_entry = glade_xml_get_widget (source_dialog->gui_xml, "name-entry"); - g_signal_connect_swapped (source_dialog->name_entry, "changed", - G_CALLBACK (general_entry_modified), source_dialog); - source_dialog->source_list = e_source_list_new_for_gconf_default ("/apps/evolution/tasks/sources"); - - source_dialog->group_optionmenu = - glade_xml_get_widget (source_dialog->gui_xml, "group-optionmenu"); - if (!GTK_IS_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (source_dialog->group_optionmenu)))) { - GtkWidget *menu = gtk_menu_new (); - gtk_option_menu_set_menu (GTK_OPTION_MENU (source_dialog->group_optionmenu), menu); - gtk_widget_show (menu); + sdialog->source_group = (ESourceGroup *)sdialog->menu_source_groups->data; + g_object_unref (gconf); } - gtk_widget_set_sensitive (source_dialog->group_optionmenu, source == NULL); - /* NOTE: This assumes that we have sources. If they don't exist, they're set up - * on startup of the calendar component. */ - index = source_group_menu_add_groups (GTK_MENU_SHELL (gtk_option_menu_get_menu ( - GTK_OPTION_MENU (source_dialog->group_optionmenu))), source_dialog); - gtk_option_menu_set_history (GTK_OPTION_MENU (source_dialog->group_optionmenu), index); - - g_signal_connect_swapped (source_dialog->group_optionmenu, "changed", - G_CALLBACK (source_group_changed_sensitive), source_dialog); - - source_dialog->uri_entry = glade_xml_get_widget (source_dialog->gui_xml, "uri-entry"); - source_dialog->uri_label = glade_xml_get_widget (source_dialog->gui_xml, "uri-label"); - source_dialog->uri_hbox = glade_xml_get_widget (source_dialog->gui_xml, "uri-hbox"); - - g_signal_connect_swapped (source_dialog->uri_entry, "changed", - G_CALLBACK (general_entry_modified), source_dialog); - - source_dialog->refresh_spin = glade_xml_get_widget (source_dialog->gui_xml, "refresh-spin"); - source_dialog->refresh_optionmenu = glade_xml_get_widget (source_dialog->gui_xml, "refresh-optionmenu"); - source_dialog->refresh_label = glade_xml_get_widget (source_dialog->gui_xml, "refresh-label"); - source_dialog->refresh_hbox = glade_xml_get_widget (source_dialog->gui_xml, "refresh-hbox"); - - g_signal_connect_swapped (glade_xml_get_widget (source_dialog->gui_xml, "cancel-button"), "clicked", - G_CALLBACK (new_task_list_cancel), source_dialog); - - source_dialog->add_button = glade_xml_get_widget (source_dialog->gui_xml, "add-button"); - gtk_widget_set_sensitive (source_dialog->add_button, FALSE); - - if (source) { - gtk_button_set_use_stock (GTK_BUTTON (source_dialog->add_button), TRUE); - gtk_button_set_label (GTK_BUTTON (source_dialog->add_button), GTK_STOCK_OK); + /* HACK: doesn't work if you don't do this */ + e_source_set_absolute_uri (sdialog->source, NULL); + e_source_set_group (sdialog->source, sdialog->source_group); - g_signal_connect_swapped (source_dialog->add_button, "clicked", - G_CALLBACK (edit_task_list_finish), source_dialog); - } else { - g_signal_connect_swapped (source_dialog->add_button, "clicked", - G_CALLBACK (new_task_list_add), source_dialog); - } + sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties"); + for (i = 0; ectp_items[i].path; i++) + items = g_slist_prepend (items, &ectp_items[i]); + e_config_add_items ((EConfig *) ec, items, eccp_commit, NULL, eccp_free, sdialog); + e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog); - g_object_weak_ref (G_OBJECT (source_dialog->window), - (GWeakNotify) source_dialog_destroy, source_dialog); - - source_dialog->source_color = glade_xml_get_widget (source_dialog->gui_xml, "source-color"); - - source_to_dialog (source_dialog); - - gtk_window_set_type_hint (GTK_WINDOW (source_dialog->window), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_window_set_modal (GTK_WINDOW (source_dialog->window), TRUE); - - icon_list = e_icon_factory_get_icon_list ("stock_task"); - if (icon_list) { - gtk_window_set_icon_list (GTK_WINDOW (source_dialog->window), icon_list); - g_list_foreach (icon_list, (GFunc) g_object_unref, NULL); - g_list_free (icon_list); - } + target = e_cal_config_target_new_source (ec, sdialog->source); + e_config_set_target ((EConfig *) ec, (EConfigTarget *) target); + + sdialog->window = e_config_create_window ((EConfig *)ec, NULL, _("Task List Properties")); + + /* forces initial validation */ + if (!sdialog->original_source) + e_config_target_changed ((EConfig *)ec, E_CONFIG_TARGET_CHANGED_STATE); - dialog_hide_unused_options (source_dialog); - gtk_widget_show (source_dialog->window); - return TRUE; + return; } -gboolean -calendar_setup_new_task_list (GtkWindow *parent) +void +calendar_setup_new_task_list (struct _GtkWindow *parent) { - return calendar_setup_edit_task_list (parent, NULL); + calendar_setup_edit_task_list (parent, NULL); } - Index: calendar/gui/dialogs/calendar-setup.h =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/calendar-setup.h,v retrieving revision 1.1 diff -u -r1.1 calendar-setup.h --- calendar/gui/dialogs/calendar-setup.h 9 Jan 2004 20:50:22 -0000 1.1 +++ calendar/gui/dialogs/calendar-setup.h 22 Oct 2004 00:33:35 -0000 @@ -1,12 +1,12 @@ -/* Evolution calendar - Calendar properties dialogs. +/* + * Authors: David Trowbridge <trowbrds cs colorado edu> * - * Copyright (C) 2004 Novell, Inc. - * - * Author: Hans Petter Jansson <hpj ximian com> + * Copyright (C) 2004 Novell, Inc (www.novell.com) * * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * 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 @@ -15,18 +15,29 @@ * * 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. + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * */ -#ifndef CALENDAR_CONFIG_H -#define CALENDAR_CONFIG_H +#ifndef __CALENDAR_SETUP_H__ +#define __CALENDAR_SETUP_H__ -#include <gtk/gtkwindow.h> +struct _GtkWindow; +struct _ESource; -gboolean calendar_setup_new_calendar (GtkWindow *parent); -gboolean calendar_setup_edit_calendar (GtkWindow *parent, ESource *source); +#ifdef __cplusplus +extern "C" { +#pragma } +#endif -gboolean calendar_setup_new_task_list (GtkWindow *parent); -gboolean calendar_setup_edit_task_list (GtkWindow *parent, ESource *source); +void calendar_setup_edit_calendar (struct _GtkWindow *parent, struct _ESource *source); +void calendar_setup_new_calendar (struct _GtkWindow *parent); +void calendar_setup_edit_task_list (struct _GtkWindow *parent, struct _ESource *source); +void calendar_setup_new_task_list (struct _GtkWindow *parent); + +#ifdef __cplusplus +} #endif + +#endif /* __CALENDAR_SETUP_H__ */