1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 /* e-folder-type-registry.c
4 * Copyright (C) 2000, 2001 Ximian, Inc.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of version 2 of the GNU Lesser General Public
8 * License as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this program; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
20 * Author: Ettore Perazzoli
27 #include "e-folder-type-registry.h"
29 #define PARENT_TYPE G_TYPE_OBJECT
30 static GObjectClass *parent_class = NULL;
39 gboolean user_creatable;
41 GList *accepted_dnd_types; /* char * */
47 struct EFolderTypeRegistryPrivate {
48 GHashTable *name_to_type;
51 /* FolderType handling. */
54 folder_type_new (const char *name,
55 const char *icon_name,
56 const char *display_name,
57 const char *description,
58 gboolean user_creatable,
59 int num_accepted_dnd_types,
60 const char **accepted_dnd_types)
65 new = g_new0 (FolderType, 1);
67 new->name = g_strdup (name);
68 new->icon_name = g_strdup (icon_name);
69 new->display_name = g_strdup (display_name);
70 new->description = g_strdup (description);
72 new->user_creatable = user_creatable;
74 new->accepted_dnd_types = NULL;
75 for (i = 0; i < num_accepted_dnd_types; i++)
76 new->accepted_dnd_types = g_list_prepend (new->accepted_dnd_types,
77 g_strdup (accepted_dnd_types[i]));
78 new->accepted_dnd_types = g_list_reverse (new->accepted_dnd_types);
86 folder_type_free (FolderType *folder_type)
88 g_free (folder_type->name);
89 g_free (folder_type->icon_name);
90 g_free (folder_type->display_name);
91 g_free (folder_type->description);
93 if (folder_type->handler != NULL)
94 g_object_unref (folder_type->handler);
100 get_folder_type (EFolderTypeRegistry *folder_type_registry,
101 const char *type_name)
103 EFolderTypeRegistryPrivate *priv;
105 priv = folder_type_registry->priv;
107 return g_hash_table_lookup (priv->name_to_type, type_name);
111 register_folder_type (EFolderTypeRegistry *folder_type_registry,
113 const char *icon_name,
114 const char *display_name,
115 const char *description,
116 gboolean user_creatable,
117 int num_accepted_dnd_types,
118 const char **accepted_dnd_types)
120 EFolderTypeRegistryPrivate *priv;
121 FolderType *folder_type;
123 priv = folder_type_registry->priv;
125 /* Make sure we don't add the same type twice. */
126 if (get_folder_type (folder_type_registry, name) != NULL)
129 folder_type = folder_type_new (name, icon_name,
130 display_name, description,
132 num_accepted_dnd_types, accepted_dnd_types);
133 g_hash_table_insert (priv->name_to_type, folder_type->name, folder_type);
139 set_handler (EFolderTypeRegistry *folder_type_registry,
143 EFolderTypeRegistryPrivate *priv;
144 FolderType *folder_type;
146 priv = folder_type_registry->priv;
148 folder_type = get_folder_type (folder_type_registry, name);
149 if (folder_type == NULL)
151 if (folder_type->handler != NULL)
154 g_object_ref (handler);
155 folder_type->handler = handler;
160 /* GObject methods. */
163 hash_forall_free_folder_type (gpointer key,
167 FolderType *folder_type;
169 folder_type = (FolderType *) value;
170 folder_type_free (folder_type);
174 impl_finalize (GObject *object)
176 EFolderTypeRegistry *folder_type_registry;
177 EFolderTypeRegistryPrivate *priv;
179 folder_type_registry = E_FOLDER_TYPE_REGISTRY (object);
180 priv = folder_type_registry->priv;
182 g_hash_table_foreach (priv->name_to_type, hash_forall_free_folder_type, NULL);
183 g_hash_table_destroy (priv->name_to_type);
187 (* G_OBJECT_CLASS (parent_class)->finalize) (object);
191 e_folder_type_registry_class_init (EFolderTypeRegistryClass *class)
193 GObjectClass *object_class;
195 object_class = G_OBJECT_CLASS (class);
196 object_class->finalize = impl_finalize;
198 parent_class = g_type_class_ref (PARENT_TYPE);
202 e_folder_type_registry_init (EFolderTypeRegistry *folder_type_registry)
204 EFolderTypeRegistryPrivate *priv;
206 priv = g_new0 (EFolderTypeRegistryPrivate, 1);
207 priv->name_to_type = g_hash_table_new (g_str_hash, g_str_equal);
209 folder_type_registry->priv = priv;
212 EFolderTypeRegistry *
213 e_folder_type_registry_new (void)
215 return g_object_new (E_TYPE_FOLDER_TYPE_REGISTRY, NULL);
219 e_folder_type_registry_register_type (EFolderTypeRegistry *folder_type_registry,
220 const char *type_name,
221 const char *icon_name,
222 const char *display_name,
223 const char *description,
224 gboolean user_creatable,
225 int num_accepted_dnd_types,
226 const char **accepted_dnd_types)
228 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE);
229 g_return_val_if_fail (type_name != NULL, FALSE);
230 g_return_val_if_fail (icon_name != NULL, FALSE);
232 return register_folder_type (folder_type_registry, type_name, icon_name,
233 display_name, description, user_creatable,
234 num_accepted_dnd_types, accepted_dnd_types);
238 e_folder_type_registry_set_handler_for_type (EFolderTypeRegistry *folder_type_registry,
239 const char *type_name,
242 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE);
243 //g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (handler), FALSE);
245 return set_handler (folder_type_registry, type_name, handler);
249 e_folder_type_registry_type_registered (EFolderTypeRegistry *folder_type_registry,
250 const char *type_name)
252 EFolderTypeRegistryPrivate *priv;
254 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE);
255 g_return_val_if_fail (type_name != NULL, FALSE);
257 priv = folder_type_registry->priv;
259 if (get_folder_type (folder_type_registry, type_name) == NULL)
266 e_folder_type_registry_unregister_type (EFolderTypeRegistry *folder_type_registry,
267 const char *type_name)
269 EFolderTypeRegistryPrivate *priv;
270 FolderType *folder_type;
272 g_return_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry));
273 g_return_if_fail (type_name != NULL);
275 priv = folder_type_registry->priv;
277 folder_type = get_folder_type (folder_type_registry, type_name);
278 if (folder_type == NULL)
281 g_hash_table_remove (priv->name_to_type, folder_type->name);
282 folder_type_free (folder_type);
286 get_type_names_hash_forall (void *key,
290 GList **type_name_list;
292 type_name_list = (GList **) data;
294 *type_name_list = g_list_prepend (*type_name_list, g_strdup ((const char *) key));
298 e_folder_type_registry_get_type_names (EFolderTypeRegistry *folder_type_registry)
300 GList *type_name_list;
301 EFolderTypeRegistryPrivate *priv;
303 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
305 priv = folder_type_registry->priv;
307 type_name_list = NULL;
308 g_hash_table_foreach (priv->name_to_type, get_type_names_hash_forall, &type_name_list);
310 return type_name_list;
314 e_folder_type_registry_get_icon_name_for_type (EFolderTypeRegistry *folder_type_registry,
315 const char *type_name)
317 const FolderType *folder_type;
319 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
320 g_return_val_if_fail (type_name != NULL, NULL);
322 folder_type = get_folder_type (folder_type_registry, type_name);
323 if (folder_type == NULL)
326 return folder_type->icon_name;
330 e_folder_type_registry_get_handler_for_type (EFolderTypeRegistry *folder_type_registry,
331 const char *type_name)
333 const FolderType *folder_type;
335 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
336 g_return_val_if_fail (type_name != NULL, NULL);
338 folder_type = get_folder_type (folder_type_registry, type_name);
339 if (folder_type == NULL)
342 return folder_type->handler;
346 e_folder_type_registry_type_is_user_creatable (EFolderTypeRegistry *folder_type_registry,
347 const char *type_name)
349 const FolderType *folder_type;
351 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE);
352 g_return_val_if_fail (type_name != NULL, FALSE);
354 folder_type = get_folder_type (folder_type_registry, type_name);
355 if (folder_type == NULL)
358 return folder_type->user_creatable;
362 e_folder_type_registry_get_display_name_for_type (EFolderTypeRegistry *folder_type_registry,
363 const char *type_name)
365 const FolderType *folder_type;
367 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
368 g_return_val_if_fail (type_name != NULL, NULL);
370 folder_type = get_folder_type (folder_type_registry, type_name);
371 if (folder_type == NULL)
374 return folder_type->display_name;
378 e_folder_type_registry_get_description_for_type (EFolderTypeRegistry *folder_type_registry,
379 const char *type_name)
381 const FolderType *folder_type;
383 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
384 g_return_val_if_fail (type_name != NULL, NULL);
386 folder_type = get_folder_type (folder_type_registry, type_name);
387 if (folder_type == NULL)
390 return folder_type->description;
394 e_folder_type_registry_get_accepted_dnd_types_for_type (EFolderTypeRegistry *folder_type_registry,
395 const char *type_name)
397 const FolderType *folder_type;
399 g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), NULL);
400 g_return_val_if_fail (type_name != NULL, NULL);
402 folder_type = get_folder_type (folder_type_registry, type_name);
403 if (folder_type == NULL)
406 return folder_type->accepted_dnd_types;
408 G_DEFINE_TYPE (EFolderTypeRegistry, e_folder_type_registry, G_TYPE_OBJECT)