1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
4 * Copyright (C) 2000, 2001, 2002 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
31 #include <libedataserver/e-data-server-util.h>
33 #define PARENT_TYPE G_TYPE_OBJECT
34 static GObjectClass *parent_class = NULL;
36 struct EFolderPrivate {
45 /* Folders have a default sorting priority of zero; when deciding the
46 sort order in the Evolution folder tree, folders with the same
47 priority value are compared by name, while folders with a higher
48 priority number always come after the folders with a lower priority
52 unsigned int self_highlight : 1;
53 unsigned int is_stock : 1;
54 unsigned int can_sync_offline : 1;
55 unsigned int has_subfolders : 1;
57 /* Custom icon for this folder; if NULL the folder will just use the
59 char *custom_icon_name;
68 static guint signals[LAST_SIGNAL] = { 0 };
70 /* EFolder methods. */
73 accept_drop (EFolder *folder, GdkDragContext *context,
74 const char *target_type,
75 GtkSelectionData *selection_data)
81 /* GObject methods. */
84 impl_finalize (GObject *object)
89 folder = E_FOLDER (object);
94 g_free (priv->description);
95 g_free (priv->physical_uri);
97 g_free (priv->custom_icon_name);
101 (* G_OBJECT_CLASS (parent_class)->finalize) (object);
105 e_folder_class_init (EFolderClass *klass)
107 GObjectClass *object_class;
109 parent_class = g_type_class_ref (PARENT_TYPE);
111 object_class = G_OBJECT_CLASS (klass);
112 object_class->finalize = impl_finalize;
114 klass->accept_drop = accept_drop;
115 signals[CHANGED] = g_signal_new ("changed",
116 G_OBJECT_CLASS_TYPE (object_class),
118 G_STRUCT_OFFSET (EFolderClass, changed),
120 g_cclosure_marshal_VOID__VOID,
123 signals[NAME_CHANGED] = g_signal_new ("name_changed",
124 G_OBJECT_CLASS_TYPE (object_class),
126 G_STRUCT_OFFSET (EFolderClass, name_changed),
128 g_cclosure_marshal_VOID__VOID,
133 e_folder_init (EFolder *folder)
135 EFolderPrivate *priv;
137 priv = g_new0 (EFolderPrivate, 1);
142 e_folder_construct (EFolder *folder,
145 const char *description)
147 EFolderPrivate *priv;
149 g_return_if_fail (E_IS_FOLDER (folder));
150 g_return_if_fail (name != NULL);
151 g_return_if_fail (type != NULL);
155 priv->name = g_strdup (name);
156 priv->type = g_strdup (type);
157 priv->description = g_strdup (description);
161 e_folder_new (const char *name,
163 const char *description)
167 g_return_val_if_fail (name != NULL, NULL);
168 g_return_val_if_fail (type != NULL, NULL);
169 g_return_val_if_fail (description != NULL, NULL);
171 folder = g_object_new (E_TYPE_FOLDER, NULL);
173 e_folder_construct (folder, name, type, description);
179 e_folder_get_name (EFolder *folder)
181 g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
183 return folder->priv->name;
187 e_folder_get_type_string (EFolder *folder)
189 g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
191 return folder->priv->type;
195 e_folder_get_description (EFolder *folder)
197 g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
199 return folder->priv->description;
203 e_folder_get_physical_uri (EFolder *folder)
205 g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
207 return folder->priv->physical_uri;
211 e_folder_get_unread_count (EFolder *folder)
213 g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
215 return folder->priv->unread_count;
219 e_folder_get_highlighted (EFolder *folder)
221 g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
223 return folder->priv->child_highlight || folder->priv->unread_count;
227 e_folder_get_is_stock (EFolder *folder)
229 g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
231 return folder->priv->is_stock;
235 e_folder_get_can_sync_offline (EFolder *folder)
237 g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
239 return folder->priv->can_sync_offline;
243 e_folder_get_has_subfolders (EFolder *folder)
245 g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
247 return folder->priv->has_subfolders;
251 * e_folder_get_custom_icon:
252 * @folder: An EFolder
254 * Get the name of the custom icon for @folder, or NULL if no custom icon is
255 * associated with it.
258 e_folder_get_custom_icon_name (EFolder *folder)
260 g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
262 return folder->priv->custom_icon_name;
266 * e_folder_get_sorting_priority:
267 * @folder: An EFolder
269 * Get the sorting priority for @folder.
271 * Return value: Sorting priority value for @folder.
274 e_folder_get_sorting_priority (EFolder *folder)
276 g_return_val_if_fail (E_IS_FOLDER (folder), 0);
278 return folder->priv->sorting_priority;
282 e_folder_set_name (EFolder *folder,
285 g_return_if_fail (E_IS_FOLDER (folder));
286 g_return_if_fail (name != NULL);
288 if (folder->priv->name == name)
291 g_free (folder->priv->name);
292 folder->priv->name = g_strdup (name);
294 g_signal_emit (folder, signals[NAME_CHANGED], 0);
295 g_signal_emit (folder, signals[CHANGED], 0);
299 e_folder_set_type_string (EFolder *folder,
302 g_return_if_fail (E_IS_FOLDER (folder));
303 g_return_if_fail (type != NULL);
305 g_free (folder->priv->type);
306 folder->priv->type = g_strdup (type);
308 g_signal_emit (folder, signals[CHANGED], 0);
312 e_folder_set_description (EFolder *folder,
313 const char *description)
315 g_return_if_fail (E_IS_FOLDER (folder));
316 g_return_if_fail (description != NULL);
318 g_free (folder->priv->description);
319 folder->priv->description = g_strdup (description);
321 g_signal_emit (folder, signals[CHANGED], 0);
325 e_folder_set_physical_uri (EFolder *folder,
326 const char *physical_uri)
328 g_return_if_fail (E_IS_FOLDER (folder));
329 g_return_if_fail (physical_uri != NULL);
331 if (folder->priv->physical_uri == physical_uri)
334 g_free (folder->priv->physical_uri);
335 folder->priv->physical_uri = g_strdup (physical_uri);
337 g_signal_emit (folder, signals[CHANGED], 0);
341 e_folder_set_unread_count (EFolder *folder,
344 g_return_if_fail (E_IS_FOLDER (folder));
346 folder->priv->unread_count = unread_count;
348 g_signal_emit (folder, signals[CHANGED], 0);
352 e_folder_set_child_highlight (EFolder *folder,
353 gboolean highlighted)
355 g_return_if_fail (E_IS_FOLDER (folder));
358 folder->priv->child_highlight++;
360 folder->priv->child_highlight--;
362 g_signal_emit (folder, signals[CHANGED], 0);
366 e_folder_set_is_stock (EFolder *folder,
369 g_return_if_fail (E_IS_FOLDER (folder));
371 folder->priv->is_stock = !! is_stock;
373 g_signal_emit (folder, signals[CHANGED], 0);
377 e_folder_set_can_sync_offline (EFolder *folder,
378 gboolean can_sync_offline)
380 g_return_if_fail (E_IS_FOLDER (folder));
382 folder->priv->can_sync_offline = !! can_sync_offline;
384 g_signal_emit (folder, signals[CHANGED], 0);
388 e_folder_set_has_subfolders (EFolder *folder,
389 gboolean has_subfolders)
391 g_return_if_fail (E_IS_FOLDER (folder));
393 folder->priv->has_subfolders = !! has_subfolders;
395 g_signal_emit (folder, signals[CHANGED], 0);
399 * e_folder_set_custom_icon_name:
400 * @folder: An EFolder
401 * @icon_name: Name of the icon to be set (to be found in the standard
402 * Evolution icon dir)
404 * Set a custom icon for @folder (thus overriding the default icon, which is
405 * the one associated to the type of the folder).
408 e_folder_set_custom_icon (EFolder *folder,
409 const char *icon_name)
411 g_return_if_fail (E_IS_FOLDER (folder));
413 if (icon_name == folder->priv->custom_icon_name)
416 if (folder->priv->custom_icon_name == NULL
417 || (icon_name != NULL && strcmp (icon_name, folder->priv->custom_icon_name) != 0)) {
418 g_free (folder->priv->custom_icon_name);
419 folder->priv->custom_icon_name = g_strdup (icon_name);
421 g_signal_emit (folder, signals[CHANGED], 0);
426 * e_folder_set_sorting_priority:
427 * @folder: An EFolder
428 * @sorting_priority: A sorting priority number
430 * Set the sorting priority for @folder. Folders have a default sorting
431 * priority of zero; when deciding the sort order in the Evolution folder tree,
432 * folders with the same priority value are compared by name, while folders
433 * with a higher priority number always come after the folders with a lower
437 e_folder_set_sorting_priority (EFolder *folder,
438 int sorting_priority)
440 g_return_if_fail (E_IS_FOLDER (folder));
442 if (folder->priv->sorting_priority == sorting_priority)
445 folder->priv->sorting_priority = sorting_priority;
447 g_signal_emit (folder, signals[CHANGED], 0);
451 e_folder_accept_drop (EFolder *folder, GdkDragContext *context,
452 const char *target_type,
453 GtkSelectionData *selection_data)
455 g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
456 g_return_val_if_fail (context != NULL, FALSE);
458 return E_FOLDER_GET_CLASS (folder)->accept_drop (folder, context,
463 G_DEFINE_TYPE (EFolder, e_folder, G_TYPE_OBJECT)