Fully support setting the display name in the tree. It seems to work.

svn path=/trunk/; revision=5320
This commit is contained in:
Ettore Perazzoli
2000-09-11 11:12:16 +00:00
parent 32496628e7
commit 0f618ac4cf
5 changed files with 156 additions and 82 deletions

View File

@ -1,3 +1,27 @@
2000-09-11 Ettore Perazzoli <ettore@helixcode.com>
* e-storage.c (impl_list_folders): Removed.
(impl_get_subfolder_paths): New static function, implementation
for `::get_subfolder_paths'.
(class_init): Install it.
(e_storage_get_subfolder_paths): New.
* e-storage.h: `list_folders' virtual method removed. New virtual
method `list_subfolder_paths'.
* e-storage-set-view.c (etree_icon_at): If the folder is not
found, return NULL.
* e-local-storage.c (bonobo_interface_set_display_name_cb): New
function, callback for the `set_display_name' signal on the
EvolutionLocalStorage.
(construct): Connect it.
* e-storage-set-view.c (folder_changed_cb): New callback for the
"changed" signal emitted by the EFolders. It makes the model emit
the "changed" signal for the appropriate row.
(insert_folders): Connect it.
2000-09-09 Ettore Perazzoli <ettore@helixcode.com>
* e-storage-set-view.c (etree_value_at): Return the name of the

View File

@ -506,6 +506,30 @@ impl_async_remove_folder (EStorage *storage,
local_storage = E_LOCAL_STORAGE (storage);
}
/* Callbacks for the `Evolution::LocalStorage' interface we are exposing to the outside world. */
static void
bonobo_interface_set_display_name_cb (EvolutionLocalStorage *bonobo_local_storage,
const char *path,
const char *display_name,
void *data)
{
ELocalStorage *local_storage;
EFolder *folder;
local_storage = E_LOCAL_STORAGE (data);
g_print ("%s -- %s %s\n", __FUNCTION__, path, display_name);
folder = e_storage_get_folder (E_STORAGE (local_storage), path);
if (folder == NULL)
return;
e_folder_set_name (folder, display_name);
}
/* Initialization. */
@ -569,6 +593,10 @@ construct (ELocalStorage *local_storage,
g_assert (priv->bonobo_interface == NULL);
priv->bonobo_interface = evolution_local_storage_new (E_LOCAL_STORAGE_NAME);
gtk_signal_connect (GTK_OBJECT (priv->bonobo_interface), "set_display_name",
GTK_SIGNAL_FUNC (bonobo_interface_set_display_name_cb),
local_storage);
return load_all_folders (local_storage);
}

View File

@ -29,6 +29,8 @@
#include <gnome.h>
#include "e-util/e-util.h"
#include "e-util/e-gtk-utils.h"
#include "e-shell-constants.h"
#include "e-storage-set-view.h"
@ -331,8 +333,6 @@ etable_drag_begin (EStorageSetView *storage_set_view,
node = e_tree_model_node_at_row (priv->etree_model, row);
priv->selected_row_path = e_tree_model_node_get_data (priv->etree_model, node);
g_print ("dragging %s\n", priv->selected_row_path);
}
static void
@ -469,8 +469,9 @@ static GdkPixbuf*
etree_icon_at (ETreeModel *etree, ETreePath *tree_path, void *model_data)
{
EStorageSetView *storage_set_view;
char *path;
EStorageSet *storage_set;
EFolder *folder;
char *path;
/* folders are from depth 2 on. depth 1 are storages and 0 is
our (invisible) root node. */
@ -482,8 +483,11 @@ etree_icon_at (ETreeModel *etree, ETreePath *tree_path, void *model_data)
path = (char*)e_tree_model_node_get_data (etree, tree_path);
return get_pixbuf_for_folder (storage_set_view,
e_storage_set_get_folder (storage_set, path));
folder = e_storage_set_get_folder (storage_set, path);
if (folder == NULL)
return NULL;
return get_pixbuf_for_folder (storage_set_view, folder);
}
static void*
@ -608,6 +612,7 @@ new_folder_cb (EStorageSet *storage_set,
ETreePath *new_node;
const char *last_separator;
char *parent_path;
char *copy_of_path;
g_return_if_fail (g_path_is_absolute (path));
@ -628,7 +633,8 @@ new_folder_cb (EStorageSet *storage_set,
g_free (parent_path);
new_node = e_tree_model_node_insert (etree, parent_node, -1, (gpointer)g_strdup(path));
copy_of_path = g_strdup (path);
new_node = e_tree_model_node_insert (etree, parent_node, -1, copy_of_path);
if (! add_node_to_hash (storage_set_view, path, new_node)) {
e_tree_model_node_remove (etree, new_node);
@ -694,32 +700,58 @@ init (EStorageSetView *storage_set_view)
priv = g_new (EStorageSetViewPrivate, 1);
priv->storage_set = NULL;
priv->path_to_etree_node = g_hash_table_new (g_str_hash, g_str_equal);
priv->type_name_to_pixbuf = g_hash_table_new (g_str_hash, g_str_equal);
priv->selected_row_path = NULL;
priv->storage_set = NULL;
priv->path_to_etree_node = g_hash_table_new (g_str_hash, g_str_equal);
priv->type_name_to_pixbuf = g_hash_table_new (g_str_hash, g_str_equal);
priv->selected_row_path = NULL;
storage_set_view->priv = priv;
}
static int
folder_compare_cb (gconstpointer a, gconstpointer b)
/* Handling of the "changed" signal in EFolders displayed in the EStorageSetView. */
struct _FolderChangedCallbackData {
EStorageSetView *storage_set_view;
char *path;
};
typedef struct _FolderChangedCallbackData FolderChangedCallbackData;
static void
folder_changed_callback_data_destroy_notify (void *data)
{
EFolder *folder_a;
EFolder *folder_b;
const char *name_a;
const char *name_b;
FolderChangedCallbackData *callback_data;
folder_a = E_FOLDER (a);
folder_b = E_FOLDER (b);
callback_data = (FolderChangedCallbackData *) data;
name_a = e_folder_get_name (folder_a);
name_b = e_folder_get_name (folder_b);
return strcmp (name_a, name_b);
g_free (callback_data->path);
g_free (callback_data);
}
static void
folder_changed_cb (EFolder *folder,
void *data)
{
EStorageSetView *storage_set_view;
EStorageSetViewPrivate *priv;
FolderChangedCallbackData *callback_data;
ETreePath *node;
callback_data = (FolderChangedCallbackData *) data;
storage_set_view = callback_data->storage_set_view;
priv = callback_data->storage_set_view->priv;
node = g_hash_table_lookup (priv->path_to_etree_node, callback_data->path);
if (node == NULL) {
g_warning ("EStorageSetView -- EFolder::changed emitted for a folder whose path I don't know.");
return;
}
e_tree_model_node_changed (priv->etree_model, node);
}
static void
insert_folders (EStorageSetView *storage_set_view,
ETreePath *parent,
@ -729,7 +761,7 @@ insert_folders (EStorageSetView *storage_set_view,
EStorageSetViewPrivate *priv;
ETreeModel *etree;
ETreePath *node;
GList *folder_list;
GList *folder_path_list;
GList *p;
const char *storage_name;
@ -738,35 +770,41 @@ insert_folders (EStorageSetView *storage_set_view,
storage_name = e_storage_get_name (storage);
folder_list = e_storage_list_folders (storage, path);
if (folder_list == NULL)
folder_path_list = e_storage_get_subfolder_paths (storage, path);
if (folder_path_list == NULL)
return;
folder_list = g_list_sort (folder_list, folder_compare_cb);
for (p = folder_list; p != NULL; p = p->next) {
for (p = folder_path_list; p != NULL; p = p->next) {
FolderChangedCallbackData *folder_changed_callback_data;
EFolder *folder;
const char *folder_name;
char *subpath;
const char *folder_path;
char *full_path;
folder = E_FOLDER (p->data);
folder_path = (const char *) p->data;
folder = e_storage_get_folder (storage, folder_path);
folder_name = e_folder_get_name (folder);
subpath = g_concat_dir_and_file (path, folder_name);
full_path = g_strconcat("/", storage_name, subpath, NULL);
node = e_tree_model_node_insert (etree, parent, -1, (gpointer)full_path);
insert_folders (storage_set_view, node, storage, subpath);
full_path = g_strconcat ("/", storage_name, folder_path, NULL);
node = e_tree_model_node_insert (etree, parent, -1, (void *) full_path);
add_node_to_hash (storage_set_view, full_path, node);
g_free (subpath);
insert_folders (storage_set_view, node, storage, folder_path);
folder_changed_callback_data = g_new (FolderChangedCallbackData, 1);
folder_changed_callback_data->storage_set_view = storage_set_view;
folder_changed_callback_data->path = g_strdup (folder_path);
e_gtk_signal_connect_full_while_alive (GTK_OBJECT (folder), "changed",
GTK_SIGNAL_FUNC (folder_changed_cb),
NULL,
folder_changed_callback_data,
folder_changed_callback_data_destroy_notify,
FALSE, FALSE,
GTK_OBJECT (storage_set_view));
}
e_free_object_list (folder_list);
e_free_string_list (folder_path_list);
}
static void

View File

@ -97,33 +97,14 @@ destroy (GtkObject *object)
/* EStorage methods. */
static GList *
impl_list_folders (EStorage *storage,
const char *path)
impl_get_subfolder_paths (EStorage *storage,
const char *path)
{
EStoragePrivate *priv;
GList *path_list;
GList *list;
GList *p;
priv = storage->priv;
path_list = e_folder_tree_get_subfolders (priv->folder_tree, path);
list = NULL;
for (p = path_list; p != NULL; p = p->next) {
EFolder *e_folder;
const char *sub_path;
sub_path = (const char *) p->data;
e_folder = e_folder_tree_get_folder (priv->folder_tree, sub_path);
gtk_object_ref (GTK_OBJECT (e_folder));
list = g_list_prepend (list, e_folder);
}
e_free_string_list (path_list);
return list;
return e_folder_tree_get_subfolders (priv->folder_tree, path);
}
static EFolder *
@ -179,7 +160,7 @@ class_init (EStorageClass *class)
object_class->destroy = destroy;
class->list_folders = impl_list_folders;
class->get_subfolder_paths = impl_get_subfolder_paths;
class->get_folder = impl_get_folder;
class->get_name = impl_get_name;
class->async_create_folder = impl_async_create_folder;
@ -260,15 +241,15 @@ e_storage_path_is_relative (const char *path)
GList *
e_storage_list_folders (EStorage *storage,
const char *path)
e_storage_get_subfolder_paths (EStorage *storage,
const char *path)
{
g_return_val_if_fail (storage != NULL, NULL);
g_return_val_if_fail (E_IS_STORAGE (storage), NULL);
g_return_val_if_fail (path != NULL, NULL);
g_return_val_if_fail (g_path_is_absolute (path), NULL);
return (* ES_CLASS (storage)->list_folders) (storage, path);
return (* ES_CLASS (storage)->get_subfolder_paths) (storage, path);
}
EFolder *

View File

@ -81,28 +81,31 @@ struct _EStorageClass {
/* Virtual methods. */
GList * (* list_folders) (EStorage *storage, const char *path);
EFolder * (* get_folder) (EStorage *storage, const char *path);
const char * (* get_name) (EStorage *storage);
GList * (* get_subfolder_paths) (EStorage *storage, const char *path);
EFolder * (* get_folder) (EStorage *storage, const char *path);
const char * (* get_name) (EStorage *storage);
void (* async_create_folder) (EStorage *storage, const char *path,
const char *type, const char *description,
EStorageResultCallback callback, void *data);
void (* async_remove_folder) (EStorage *storage, const char *path,
EStorageResultCallback callback, void *data);
void (* async_create_folder) (EStorage *storage, const char *path,
const char *type, const char *description,
EStorageResultCallback callback, void *data);
void (* async_remove_folder) (EStorage *storage, const char *path,
EStorageResultCallback callback, void *data);
};
GtkType e_storage_get_type (void);
void e_storage_construct (EStorage *storage);
EStorage *e_storage_new (void);
gboolean e_storage_path_is_relative (const char *path);
gboolean e_storage_path_is_absolute (const char *path);
GtkType e_storage_get_type (void);
void e_storage_construct (EStorage *storage);
EStorage *e_storage_new (void);
GList *e_storage_list_folders (EStorage *storage, const char *path);
EFolder *e_storage_get_folder (EStorage *storage, const char *path);
gboolean e_storage_path_is_relative (const char *path);
gboolean e_storage_path_is_absolute (const char *path);
const char *e_storage_get_name (EStorage *storage);
GList *e_storage_get_subfolder_paths (EStorage *storage,
const char *path);
EFolder *e_storage_get_folder (EStorage *storage,
const char *path);
const char *e_storage_get_name (EStorage *storage);
/* Folder operations. */