1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
4
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
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
G_DEFINE_TYPE (EFolder, e_folder, G_TYPE_OBJECT)
38
struct EFolderPrivate {
47
/* Folders have a default sorting priority of zero; when deciding the
48
sort order in the Evolution folder tree, folders with the same
49
priority value are compared by name, while folders with a higher
50
priority number always come after the folders with a lower priority
52
gint sorting_priority;
54
guint self_highlight : 1;
56
guint can_sync_offline : 1;
57
guint has_subfolders : 1;
59
/* Custom icon for this folder; if NULL the folder will just use the
61
gchar *custom_icon_name;
70
static guint signals[LAST_SIGNAL] = { 0 };
72
/* EFolder methods. */
75
accept_drop (EFolder *folder, GdkDragContext *context,
76
const gchar *target_type,
77
GtkSelectionData *selection_data)
82
/* GObject methods. */
85
impl_finalize (GObject *object)
90
folder = E_FOLDER (object);
95
g_free (priv->description);
96
g_free (priv->physical_uri);
98
g_free (priv->custom_icon_name);
102
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
106
e_folder_class_init (EFolderClass *klass)
108
GObjectClass *object_class;
110
parent_class = g_type_class_ref (PARENT_TYPE);
112
object_class = G_OBJECT_CLASS (klass);
113
object_class->finalize = impl_finalize;
115
klass->accept_drop = accept_drop;
116
signals[CHANGED] = g_signal_new ("changed",
117
G_OBJECT_CLASS_TYPE (object_class),
119
G_STRUCT_OFFSET (EFolderClass, changed),
121
g_cclosure_marshal_VOID__VOID,
124
signals[NAME_CHANGED] = g_signal_new ("name_changed",
125
G_OBJECT_CLASS_TYPE (object_class),
127
G_STRUCT_OFFSET (EFolderClass, name_changed),
129
g_cclosure_marshal_VOID__VOID,
134
e_folder_init (EFolder *folder)
136
EFolderPrivate *priv;
138
priv = g_new0 (EFolderPrivate, 1);
143
e_folder_construct (EFolder *folder,
146
const gchar *description)
148
EFolderPrivate *priv;
150
g_return_if_fail (E_IS_FOLDER (folder));
151
g_return_if_fail (name != NULL);
152
g_return_if_fail (type != NULL);
156
priv->name = g_strdup (name);
157
priv->type = g_strdup (type);
158
priv->description = g_strdup (description);
162
e_folder_new (const gchar *name,
164
const gchar *description)
168
g_return_val_if_fail (name != NULL, NULL);
169
g_return_val_if_fail (type != NULL, NULL);
170
g_return_val_if_fail (description != NULL, NULL);
172
folder = g_object_new (E_TYPE_FOLDER, NULL);
174
e_folder_construct (folder, name, type, description);
180
e_folder_get_name (EFolder *folder)
182
g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
184
return folder->priv->name;
188
e_folder_get_type_string (EFolder *folder)
190
g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
192
return folder->priv->type;
196
e_folder_get_description (EFolder *folder)
198
g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
200
return folder->priv->description;
204
e_folder_get_physical_uri (EFolder *folder)
206
g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
208
return folder->priv->physical_uri;
212
e_folder_get_unread_count (EFolder *folder)
214
g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
216
return folder->priv->unread_count;
220
e_folder_get_highlighted (EFolder *folder)
222
g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
224
return folder->priv->child_highlight || folder->priv->unread_count;
228
e_folder_get_is_stock (EFolder *folder)
230
g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
232
return folder->priv->is_stock;
236
e_folder_get_can_sync_offline (EFolder *folder)
238
g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
240
return folder->priv->can_sync_offline;
244
e_folder_get_has_subfolders (EFolder *folder)
246
g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
248
return folder->priv->has_subfolders;
252
* e_folder_get_custom_icon:
253
* @folder: An EFolder
255
* Get the name of the custom icon for @folder, or NULL if no custom icon is
256
* associated with it.
259
e_folder_get_custom_icon_name (EFolder *folder)
261
g_return_val_if_fail (E_IS_FOLDER (folder), NULL);
263
return folder->priv->custom_icon_name;
267
* e_folder_get_sorting_priority:
268
* @folder: An EFolder
270
* Get the sorting priority for @folder.
272
* Return value: Sorting priority value for @folder.
275
e_folder_get_sorting_priority (EFolder *folder)
277
g_return_val_if_fail (E_IS_FOLDER (folder), 0);
279
return folder->priv->sorting_priority;
283
e_folder_set_name (EFolder *folder,
286
g_return_if_fail (E_IS_FOLDER (folder));
287
g_return_if_fail (name != NULL);
289
if (folder->priv->name == name)
292
g_free (folder->priv->name);
293
folder->priv->name = g_strdup (name);
295
g_signal_emit (folder, signals[NAME_CHANGED], 0);
296
g_signal_emit (folder, signals[CHANGED], 0);
300
e_folder_set_type_string (EFolder *folder,
303
g_return_if_fail (E_IS_FOLDER (folder));
304
g_return_if_fail (type != NULL);
306
g_free (folder->priv->type);
307
folder->priv->type = g_strdup (type);
309
g_signal_emit (folder, signals[CHANGED], 0);
313
e_folder_set_description (EFolder *folder,
314
const gchar *description)
316
g_return_if_fail (E_IS_FOLDER (folder));
317
g_return_if_fail (description != NULL);
319
g_free (folder->priv->description);
320
folder->priv->description = g_strdup (description);
322
g_signal_emit (folder, signals[CHANGED], 0);
326
e_folder_set_physical_uri (EFolder *folder,
327
const gchar *physical_uri)
329
g_return_if_fail (E_IS_FOLDER (folder));
330
g_return_if_fail (physical_uri != NULL);
332
if (folder->priv->physical_uri == physical_uri)
335
g_free (folder->priv->physical_uri);
336
folder->priv->physical_uri = g_strdup (physical_uri);
338
g_signal_emit (folder, signals[CHANGED], 0);
342
e_folder_set_unread_count (EFolder *folder,
345
g_return_if_fail (E_IS_FOLDER (folder));
347
folder->priv->unread_count = unread_count;
349
g_signal_emit (folder, signals[CHANGED], 0);
353
e_folder_set_child_highlight (EFolder *folder,
354
gboolean highlighted)
356
g_return_if_fail (E_IS_FOLDER (folder));
359
folder->priv->child_highlight++;
361
folder->priv->child_highlight--;
363
g_signal_emit (folder, signals[CHANGED], 0);
367
e_folder_set_is_stock (EFolder *folder,
370
g_return_if_fail (E_IS_FOLDER (folder));
372
folder->priv->is_stock = !! is_stock;
374
g_signal_emit (folder, signals[CHANGED], 0);
378
e_folder_set_can_sync_offline (EFolder *folder,
379
gboolean can_sync_offline)
381
g_return_if_fail (E_IS_FOLDER (folder));
383
folder->priv->can_sync_offline = !! can_sync_offline;
385
g_signal_emit (folder, signals[CHANGED], 0);
389
e_folder_set_has_subfolders (EFolder *folder,
390
gboolean has_subfolders)
392
g_return_if_fail (E_IS_FOLDER (folder));
394
folder->priv->has_subfolders = !! has_subfolders;
396
g_signal_emit (folder, signals[CHANGED], 0);
400
* e_folder_set_custom_icon_name:
401
* @folder: An EFolder
402
* @icon_name: Name of the icon to be set (to be found in the standard
403
* Evolution icon dir)
405
* Set a custom icon for @folder (thus overriding the default icon, which is
406
* the one associated to the type of the folder).
409
e_folder_set_custom_icon (EFolder *folder,
410
const gchar *icon_name)
412
g_return_if_fail (E_IS_FOLDER (folder));
414
if (icon_name == folder->priv->custom_icon_name)
417
if (folder->priv->custom_icon_name == NULL
418
|| (icon_name != NULL && strcmp (icon_name, folder->priv->custom_icon_name) != 0)) {
419
g_free (folder->priv->custom_icon_name);
420
folder->priv->custom_icon_name = g_strdup (icon_name);
422
g_signal_emit (folder, signals[CHANGED], 0);
427
* e_folder_set_sorting_priority:
428
* @folder: An EFolder
429
* @sorting_priority: A sorting priority number
431
* Set the sorting priority for @folder. Folders have a default sorting
432
* priority of zero; when deciding the sort order in the Evolution folder tree,
433
* folders with the same priority value are compared by name, while folders
434
* with a higher priority number always come after the folders with a lower
438
e_folder_set_sorting_priority (EFolder *folder,
439
gint sorting_priority)
441
g_return_if_fail (E_IS_FOLDER (folder));
443
if (folder->priv->sorting_priority == sorting_priority)
446
folder->priv->sorting_priority = sorting_priority;
448
g_signal_emit (folder, signals[CHANGED], 0);
452
e_folder_accept_drop (EFolder *folder, GdkDragContext *context,
453
const gchar *target_type,
454
GtkSelectionData *selection_data)
456
g_return_val_if_fail (E_IS_FOLDER (folder), FALSE);
457
g_return_val_if_fail (context != NULL, FALSE);
459
return E_FOLDER_GET_CLASS (folder)->accept_drop (folder, context,