aboutsummaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ChangeLog27
-rw-r--r--shell/Evolution-StorageSetView.idl3
-rw-r--r--shell/e-shell-importer.c127
-rw-r--r--shell/e-storage-set-view.c1
-rw-r--r--shell/evolution-storage-set-view-listener.c21
-rw-r--r--shell/evolution-storage-set-view-listener.h3
-rw-r--r--shell/evolution-storage-set-view.c63
7 files changed, 216 insertions, 29 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog
index eb73a348bb..4fa46fc8d1 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,3 +1,30 @@
+2002-06-26 Iain <iain@ximian.com>
+
+ * Evolution-StorageSetView.idl: Add a notifyFolderToggled method,
+ allow checkedFolders to be writable.
+
+ * e-shell-importer.c (free_iid_list): Free the list of iid infos.
+ (get_name_from_component_info): Move this function from futher down
+ the file to here because it's useful.
+ (choose_importer_from_list): Present the user with a list of importer
+ names to select the one they want to use.
+ (get_iid_for_filetype): Store the name of the importer as well as the
+ iid in the list. If there are multiple matches, show the user a list.
+
+ * evolution-storage-set-view-listener.[ch]: Add a folder toggled signal.
+ (impl_GNOME_Evolution_StorageSetViewListener_notifyFolderToggled):
+ Notify listeners that a folder has been toggled.
+ (corba_class_init): Hook up the new method.
+ (class_init): Create the new signal.
+
+ * evolution-storage-set-view.c
+ (storage_set_view_widget_folder_toggled_cb): Call the CORBA method for
+ each listener.
+ (impl_StorageSetView__set_checkedFolders): Set the checked folders
+ from the list.
+ (impl_StorageSetView__get_checkedFolders): Don't include blanks in the
+ list.
+
2002-06-24 Ettore Perazzoli <ettore@ximian.com>
* e-shell-folder-selection-dialog.c (impl_clicked): Pass
diff --git a/shell/Evolution-StorageSetView.idl b/shell/Evolution-StorageSetView.idl
index 7ed45a3358..9aca41f6ad 100644
--- a/shell/Evolution-StorageSetView.idl
+++ b/shell/Evolution-StorageSetView.idl
@@ -14,6 +14,7 @@ module GNOME {
module Evolution {
interface StorageSetViewListener {
void notifyFolderSelected (in string uri);
+ void notifyFolderToggled ();
};
/* FIXME: Maybe we should have a generic Bonobo::Listener interface. */
@@ -24,7 +25,7 @@ module Evolution {
attribute boolean showFolders;
attribute boolean showCheckboxes;
- readonly attribute FolderList checkedFolders;
+ attribute FolderList checkedFolders;
void addListener (in StorageSetViewListener listener)
raises (AlreadyListening);
diff --git a/shell/e-shell-importer.c b/shell/e-shell-importer.c
index 4e48d41bc4..f555d553b7 100644
--- a/shell/e-shell-importer.c
+++ b/shell/e-shell-importer.c
@@ -322,12 +322,90 @@ dialog_destroy_cb (GtkObject *object,
icd->destroyed = TRUE;
}
+struct _IIDInfo {
+ char *iid;
+ char *name;
+};
+
+static void
+free_iid_list (GList *list)
+{
+ for (; list; list = list->next) {
+ struct _IIDInfo *iid = list->data;
+
+ g_free (iid->iid);
+ g_free (iid->name);
+ g_free (iid);
+ }
+}
+
+static const char *
+get_name_from_component_info (const OAF_ServerInfo *info)
+{
+ OAF_Property *property;
+ const char *name;
+
+ property = oaf_server_info_prop_find ((OAF_ServerInfo *) info,
+ "evolution:menu-name");
+ if (property == NULL || property->v._d != OAF_P_STRING)
+ return NULL;
+
+ name = property->v._u.value_string;
+
+ return name;
+}
+
+static char *
+choose_importer_from_list (GList *importer_list)
+{
+ GtkWidget *dialog, *clist;
+ GList *p;
+ int ans;
+ char *iid;
+
+ dialog = gnome_dialog_new (_("Select importer"),
+ GNOME_STOCK_BUTTON_OK,
+ GNOME_STOCK_BUTTON_CANCEL,
+ NULL);
+ clist = gtk_clist_new (1);
+ for (p = importer_list; p; p = p->next) {
+ struct _IIDInfo *iid;
+ char *text[1];
+ int row;
+
+ iid = p->data;
+ text[0] = iid->name;
+ row = gtk_clist_append (GTK_CLIST (clist), text);
+ gtk_clist_set_row_data (GTK_CLIST (clist), row, iid->iid);
+ }
+
+ gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), clist,
+ TRUE, TRUE, 0);
+ gtk_widget_show (clist);
+
+ switch (gnome_dialog_run (GNOME_DIALOG (dialog))) {
+ case 0:
+ ans = GPOINTER_TO_INT (GTK_CLIST (clist)->selection->data);
+ iid = gtk_clist_get_row_data (GTK_CLIST (clist), ans);
+ break;
+
+ case 1:
+ default:
+ iid = NULL;
+ break;
+ }
+
+ gtk_widget_destroy (dialog);
+
+ return g_strdup (iid);
+}
+
static char *
get_iid_for_filetype (const char *filename)
{
OAF_ServerInfoList *info_list;
CORBA_Environment ev;
- GList *can_handle = NULL, *l;
+ GList *can_handle = NULL;
char *ret_iid;
int i, len = 0;
@@ -338,7 +416,7 @@ get_iid_for_filetype (const char *filename)
CORBA_Environment ev2;
CORBA_Object importer;
const OAF_ServerInfo *info;
-
+
info = info_list->_buffer + i;
CORBA_exception_init (&ev2);
@@ -351,29 +429,40 @@ get_iid_for_filetype (const char *filename)
if (GNOME_Evolution_Importer_supportFormat (importer,
filename, &ev2)) {
- can_handle = g_list_prepend (can_handle,
- g_strdup (info->iid));
+ struct _IIDInfo *iid;
+
+ iid = g_new (struct _IIDInfo, 1);
+ iid->iid = g_strdup (info->iid);
+ iid->name = g_strdup (get_name_from_component_info (info));
+
+ can_handle = g_list_prepend (can_handle, iid);
len++;
}
bonobo_object_release_unref (importer, &ev2);
CORBA_exception_free (&ev2);
}
+
CORBA_free (info_list);
if (len == 1) {
- ret_iid = can_handle->data;
+ struct _IIDInfo *iid;
+
+ iid = can_handle->data;
+
+ ret_iid = g_strdup (iid->iid);
+
+ free_iid_list (can_handle);
g_list_free (can_handle);
+
return ret_iid;
} else if (len > 1) {
- /* FIXME: Some way to choose between multiple iids */
- /* FIXME: Free stuff */
- g_warning ("Multiple iids can support %s", filename);
- ret_iid = g_strdup (can_handle->data);
+ /* Display all the IIDs */
+ ret_iid = choose_importer_from_list (can_handle);
- for (l = can_handle; l; l = l->next)
- g_free (l->data);
+ free_iid_list (can_handle);
g_list_free (can_handle);
+
return ret_iid;
} else {
return NULL;
@@ -529,22 +618,6 @@ filename_changed (GtkEntry *entry,
TRUE, !page->need_filename, TRUE);
}
-static const char *
-get_name_from_component_info (const OAF_ServerInfo *info)
-{
- OAF_Property *property;
- const char *name;
-
- property = oaf_server_info_prop_find ((OAF_ServerInfo *) info,
- "evolution:menu-name");
- if (property == NULL || property->v._d != OAF_P_STRING)
- return NULL;
-
- name = property->v._u.value_string;
-
- return name;
-}
-
static void
item_selected (GtkWidget *item,
ImportData *data)
diff --git a/shell/e-storage-set-view.c b/shell/e-storage-set-view.c
index f059e06493..a856ce5c93 100644
--- a/shell/e-storage-set-view.c
+++ b/shell/e-storage-set-view.c
@@ -2071,6 +2071,7 @@ e_storage_set_view_set_checkboxes_list (EStorageSetView *storage_set_view,
priv->checkboxes = g_hash_table_new (g_str_hash, g_str_equal);
for (; checkboxes; checkboxes = g_list_next (checkboxes)) {
char *path = checkboxes->data;
+
if (g_hash_table_lookup (priv->checkboxes, path))
continue;
path = g_strdup (path);
diff --git a/shell/evolution-storage-set-view-listener.c b/shell/evolution-storage-set-view-listener.c
index 28841f72d4..310a2f2844 100644
--- a/shell/evolution-storage-set-view-listener.c
+++ b/shell/evolution-storage-set-view-listener.c
@@ -41,6 +41,7 @@ struct _EvolutionStorageSetViewListenerPrivate {
enum {
FOLDER_SELECTED,
+ FOLDER_TOGGLED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
@@ -71,6 +72,17 @@ impl_GNOME_Evolution_StorageSetViewListener_notifyFolderSelected (PortableServer
gtk_signal_emit (GTK_OBJECT (listener), signals[FOLDER_SELECTED], uri);
}
+static void
+impl_GNOME_Evolution_StorageSetViewListener_notifyFolderToggled (PortableServer_Servant servant,
+ CORBA_Environment *ev)
+{
+ EvolutionStorageSetViewListener *listener;
+
+ listener = gtk_object_from_servant (servant);
+
+ gtk_signal_emit (GTK_OBJECT (listener), signals[FOLDER_TOGGLED]);
+}
+
static EvolutionStorageSetViewListenerServant *
create_servant (EvolutionStorageSetViewListener *listener)
{
@@ -170,7 +182,8 @@ corba_class_init (void)
epv = g_new0 (POA_GNOME_Evolution_StorageSetViewListener__epv, 1);
epv->notifyFolderSelected = impl_GNOME_Evolution_StorageSetViewListener_notifyFolderSelected;
-
+ epv->notifyFolderToggled = impl_GNOME_Evolution_StorageSetViewListener_notifyFolderToggled;
+
vepv = & my_GNOME_Evolution_StorageSetViewListener_vepv;
vepv->_base_epv = base_epv;
vepv->GNOME_Evolution_StorageSetViewListener_epv = epv;
@@ -193,6 +206,12 @@ class_init (EvolutionStorageSetViewListenerClass *klass)
gtk_marshal_NONE__STRING,
GTK_TYPE_NONE, 1,
GTK_TYPE_STRING);
+ signals[FOLDER_TOGGLED] = gtk_signal_new ("folder_toggled",
+ GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EvolutionStorageSetViewListenerClass, folder_toggled),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
diff --git a/shell/evolution-storage-set-view-listener.h b/shell/evolution-storage-set-view-listener.h
index c95778ee7e..b81ab1ed30 100644
--- a/shell/evolution-storage-set-view-listener.h
+++ b/shell/evolution-storage-set-view-listener.h
@@ -54,6 +54,9 @@ struct _EvolutionStorageSetViewListenerClass {
void (* folder_selected) (EvolutionStorageSetViewListener *listener,
const char *uri);
+ void (* folder_toggled) (EvolutionStorageSetViewListener *listener,
+ const char *uri,
+ gboolean active);
};
diff --git a/shell/evolution-storage-set-view.c b/shell/evolution-storage-set-view.c
index 6016007015..4253ea3158 100644
--- a/shell/evolution-storage-set-view.c
+++ b/shell/evolution-storage-set-view.c
@@ -68,6 +68,32 @@ storage_set_view_widget_folder_selected_cb (EStorageSetView *storage_set_view_wi
}
}
+static void
+storage_set_view_widget_folder_toggled_cb (EStorageSetView *storage_set_view_widget,
+ void *data)
+{
+ EvolutionStorageSetView *storage_set_view;
+ EvolutionStorageSetViewPrivate *priv;
+ GList *p;
+
+ storage_set_view = EVOLUTION_STORAGE_SET_VIEW (data);
+ priv = storage_set_view->priv;
+
+ for (p = priv->listeners; p != NULL; p = p->next) {
+ CORBA_Environment ev;
+ GNOME_Evolution_StorageSetViewListener listener;
+
+ CORBA_exception_init (&ev);
+
+ listener = (GNOME_Evolution_StorageSetViewListener) p->data;
+ GNOME_Evolution_StorageSetViewListener_notifyFolderToggled (listener, &ev);
+
+ /* FIXME: What if we fail? */
+
+ CORBA_exception_free (&ev);
+ }
+}
+
/* Listener handling. */
@@ -271,6 +297,35 @@ impl_StorageSetView__get_showCheckboxes (PortableServer_Servant servant,
return e_storage_set_view_get_show_checkboxes (E_STORAGE_SET_VIEW (priv->storage_set_view_widget));
}
+static void
+impl_StorageSetView__set_checkedFolders (PortableServer_Servant servant,
+ const GNOME_Evolution_FolderList *list,
+ CORBA_Environment *ev)
+{
+ BonoboObject *bonobo_object;
+ EvolutionStorageSetView *storage_set_view;
+ EvolutionStorageSetViewPrivate *priv;
+ GList *path_list = NULL;
+ GList *p;
+ int i;
+
+ bonobo_object = bonobo_object_from_servant (servant);
+ storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object);
+ priv = storage_set_view->priv;
+
+ for (i = 0; i < list->_length; i++) {
+ path_list = g_list_append (path_list, g_strdup (list->_buffer[i].evolutionUri));
+ }
+
+ e_storage_set_view_set_checkboxes_list (E_STORAGE_SET_VIEW (priv->storage_set_view_widget), path_list);
+
+ for (p = path_list; p; p = p->next) {
+ g_free (p->data);
+ }
+
+ g_list_free (path_list);
+}
+
static GNOME_Evolution_FolderList *
impl_StorageSetView__get_checkedFolders (PortableServer_Servant servant,
CORBA_Environment *ev)
@@ -309,6 +364,11 @@ impl_StorageSetView__get_checkedFolders (PortableServer_Servant servant,
folder = e_storage_set_get_folder (storage_set, path);
if (folder == NULL) {
g_warning ("Cannot find folder -- %s", path);
+
+ /* Subtract here so that we don't start putting
+ ininitialised blanks into the CORBA list */
+ return_list->_length--;
+ i--;
continue;
}
@@ -374,6 +434,7 @@ corba_class_init (void)
epv->_get_showFolders = impl_StorageSetView__get_showFolders;
epv->_set_showCheckboxes = impl_StorageSetView__set_showCheckboxes;
epv->_get_showCheckboxes = impl_StorageSetView__get_showCheckboxes;
+ epv->_set_checkedFolders = impl_StorageSetView__set_checkedFolders;
epv->_get_checkedFolders = impl_StorageSetView__get_checkedFolders;
vepv = &StorageSetView_vepv;
@@ -430,6 +491,8 @@ evolution_storage_set_view_construct (EvolutionStorageSetView *storage_set_view,
gtk_signal_connect (GTK_OBJECT (priv->storage_set_view_widget), "folder_selected",
GTK_SIGNAL_FUNC (storage_set_view_widget_folder_selected_cb), storage_set_view);
+ gtk_signal_connect (GTK_OBJECT (priv->storage_set_view_widget), "checkboxes_changed",
+ GTK_SIGNAL_FUNC (storage_set_view_widget_folder_toggled_cb), storage_set_view);
}
EvolutionStorageSetView *