Changes for an importer bug and to get the storagesetselector in the summary
svn path=/trunk/; revision=17289
This commit is contained in:
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -54,6 +54,9 @@ struct _EvolutionStorageSetViewListenerClass {
|
||||
|
||||
void (* folder_selected) (EvolutionStorageSetViewListener *listener,
|
||||
const char *uri);
|
||||
void (* folder_toggled) (EvolutionStorageSetViewListener *listener,
|
||||
const char *uri,
|
||||
gboolean active);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -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 *
|
||||
|
||||
Reference in New Issue
Block a user