diff options
author | Federico Mena Quintero <federico@ximian.com> | 2001-07-28 03:42:21 +0800 |
---|---|---|
committer | Federico Mena Quintero <federico@src.gnome.org> | 2001-07-28 03:42:21 +0800 |
commit | 7463b3c0eeba36906a6a94130c243a41c65d5e98 (patch) | |
tree | 099ddd2aa5815e0427abde9f6bb8aaf78cc57147 /calendar/gui/comp-editor-factory.c | |
parent | 35bf394708e6564c698277ff3dff149133036580 (diff) | |
download | gsoc2013-evolution-7463b3c0eeba36906a6a94130c243a41c65d5e98.tar gsoc2013-evolution-7463b3c0eeba36906a6a94130c243a41c65d5e98.tar.gz gsoc2013-evolution-7463b3c0eeba36906a6a94130c243a41c65d5e98.tar.bz2 gsoc2013-evolution-7463b3c0eeba36906a6a94130c243a41c65d5e98.tar.lz gsoc2013-evolution-7463b3c0eeba36906a6a94130c243a41c65d5e98.tar.xz gsoc2013-evolution-7463b3c0eeba36906a6a94130c243a41c65d5e98.tar.zst gsoc2013-evolution-7463b3c0eeba36906a6a94130c243a41c65d5e98.zip |
New files with a derivative of ESearchBar that generates sexps for
2001-07-27 Federico Mena Quintero <federico@ximian.com>
* gui/cal-search-bar.[ch]: New files with a derivative of
ESearchBar that generates sexps for calendar queries directly.
* gui/gnome-cal.c (setup_widgets): Use CalSearchBar instead of
ESearchBar.
* gui/e-calendar-table.h (ECalendarTable): Removed the ->colors
array since it is handled by ETableExtras now.
* gui/e-calendar-table.[ch]: Removed the subset_model. Now we use
the live query facility to filter tasks. Removed the filter
function stuff as well.
* gui/e-tasks.c (e_tasks_construct): Use
calendar_model_set_cal_client() directly instead of
e_calendar_table_set_model().
(setup_widgets): Create a calendar search bar for the tasks
component.
(search_bar_sexp_changed_cb): Set the query sexp on the table model.
(e_tasks_on_filter_selected): Regenerate the query from the
selected category and the current sexp.
(update_query): New convenience function to recompute the real
query sexp.
* gui/gnome-cal.c (gnome_calendar_construct): Likewise.
* gui/e-calendar-table.c (e_calendar_table_set_cal_client):
Removed function; people are now supposed to get the model from
the calendar table and operate on it.
* gui/calendar-commands.c (verbs): Consistency fixes with the XML
file.
(pixmaps): Likewise.
* gui/Makefile.am (evolution_calendar_SOURCES): Added
cal-search-bar.[ch] to the list of sources.
2001-07-20 Federico Mena Quintero <federico@ximian.com>
* idl/evolution-calendar.idl (CompEditorFactory): New interface to
a centralized factory for calendar component editors. Has
editExisting() and editNew() methods to edit an existing component
from a URI/UID pair, and to create a new component in a calendar
that is in a particular URI, respectively.
* gui/comp-editor-factory.[ch]: Implementation files for the
component editor factory.
* gui/GNOME_Evolution_Calendar.oaf.in: Added the CompEditorFactory
stuff.
* gui/Makefile.am (evolution_calendar_SOURCES): Added
comp-editor-factory.[ch] to the list of sources.
svn path=/trunk/; revision=11455
Diffstat (limited to 'calendar/gui/comp-editor-factory.c')
-rw-r--r-- | calendar/gui/comp-editor-factory.c | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/calendar/gui/comp-editor-factory.c b/calendar/gui/comp-editor-factory.c new file mode 100644 index 0000000000..8c32bb3059 --- /dev/null +++ b/calendar/gui/comp-editor-factory.c @@ -0,0 +1,228 @@ +/* Evolution calendar - Component editor factory object + * + * Copyright (C) 2001 Ximian, Inc. + * + * Authors: Federico Mena-Quintero <federico@ximian.com> + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <cal-client/cal-client.h> +#include "comp-editor-factory.h" + + + +/* An client we have open */ +typedef struct { + /* Uri of the calendar, used as key in the clients hash table */ + GnomeVFSURI *uri; + + /* Client of the calendar */ + CalClient *client; + + /* Hash table of components that belong to this client */ + GHashTable *uid_comp_hash; + + /* Number of times this client has been opened */ + int refcount; +} OpenClient; + +/* A component that is being edited */ +typedef struct { + /* Our parent client */ + OpenClient *parent; + + /* UID of the component we are editing, used as the key in the hash table */ + const char *uid; + + /* Component we are editing */ + CalComponent *comp; +} Component; + +/* Private part of the CompEditorFactory structure */ +struct CompEditorFactoryPrivate { + /* Hash table of URI->OpenClient */ + GHashTable *uri_client_hash; +}; + + + +static void comp_editor_factory_class_init (CompEditorFactoryClass *class); +static void comp_editor_factory_init (CompEditorFactory *factory); +static void comp_editor_factory_destroy (GtkObject *object); + +static void impl_editExisting (PortableServer_Servant servant, + const CORBA_char *uri, + const GNOME_Evolution_Calendar_CalObjUID uid, + CORBA_Environment *ev); +static void impl_editNew (PortableServer_Servant servant, + const CORBA_char *uri, + const GNOME_Evolution_Calendar_CalObjType type, + CORBA_Environment *ev); + +static BonoboXObjectClass *parent_class = NULL; + + + +BONOBO_X_TYPE_FUNC_FULL (CompEditorFactory, + GNOME_Evolution_Calendar_CompEditorFactory, + BONOBO_X_OBJECT_TYPE, + comp_editor_factory); + +/* Class initialization function for the component editor factory */ +static void +comp_editor_factory_class_init (CompEditorFactoryClass *class) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass *) class; + + parent_class = gtk_type_class (BONOBO_X_OBJECT_TYPE); + + class->epv.editExisting = impl_editExisting; + class->epv.editNew = impl_editNew; + + object_class->destroy = comp_editor_factory_destroy; +} + +/* Object initialization function for the component editor factory */ +static void +comp_editor_factory_init (CompEditorFactory *factory) +{ + CompEditorFactoryPrivate *priv; + + priv = g_new (CompEditorFactoryPrivate, 1); + + priv->uri_client_hash = g_hash_table_new (gnome_vfs_uri_hash, gnome_vfs_uri_hequal); +} + +/* Used from g_hash_table_foreach(); frees a client structure */ +static void +free_client_cb (gpointer key, gpointer value, gpointer data) +{ + OpenClient *oc; + + oc = value; + + gnome_vfs_uri_unref (oc->uri); + cal_client_unref (oc->client); + g_hash_table_destroy (oc->uid_comp_hash); + + g_free (oc); +} + +/* Destroy handler for the component editor factory */ +static void +comp_editor_factory_destroy (GtkObject *object) +{ + CompEditorFactory *factory; + CompEditorFactoryPrivate *priv; + + g_return_if_fail (object != NULL); + g_return_if_fail (IS_COMP_EDITOR_FACTORY (object)); + + factory = COMP_EDITOR_FACTORY (object); + priv = factory->priv; + + g_hash_table_foreach (priv->uri_client_hash, free_client_cb, NULL); + g_hash_table_destroy (priv->uri_client_hash); + priv->uri_client_hash = NULL; + + g_free (priv); + factory->priv = NULL; + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); +} + + + +/* Creates a new OpenClient structure by synchronously (!) opening a calendar + * client. Returns NULL if it could not open it. + */ +static OpenClient * +open_client (GnomeVFSURI *uri) +{ + CalClient *client; + + client = cal_client_new (); + if (!client) + return NULL; + + gtk_signal_connect (GTK_OBJECT (client), "cal_opened", + GTK_SIGNAL_FUNC (cal_opened_cb), NULL); + + oc = g_new (OpenClient, 1); + oc->uri = uri; + oc->client = client; + oc->uid_comp_hash = g_hash_table_new (g_str_hash, g_str_equal); + oc->refcount = 1; + +} + +static void +impl_editExisting (PortableServer_Servant servant, + const CORBA_char *str_uri, + const GNOME_Evolution_Calendar_CalObjUID uid, + CORBA_Environment *ev) +{ + CompEditorFactory *factory; + CompEditorFactoryPrivate *priv; + GnomeVFSURI *uri; + OpenClient *oc; + CalClient *client; + Component *c; + + factory = COMP_EDITOR_FACTORY (bonobo_object_from_servant (servant)); + priv = factory->priv; + + /* Look up the client */ + + uri = gnome_vfs_uri_new (str_uri); + if (!uri) { + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, + ex_GNOME_Evolution_Calendar_CompEditorFactory_InvalidURI, + NULL); + return; + } + + oc = g_hash_table_lookup (priv->uri_client_hash, uri); + if (oc) + client = oc->client; + else { + oc = open_client (uri); + if (!oc) { + gnome_vfs_uri_unref (uri); + + CORBA_exception_set ( + ev, CORBA_USER_EXCEPTION, + ex_GNOME_Evolution_Calendar_CompEditorFactory_BackendContactError, + NULL); + return; + } + + client = oc->client; + } + + gnome_vfs_uri_unref (uri); + + /* Look up the component */ + + c = g_hash_table_lookup (oc->uid_comp_hash, +} |