1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
3
/* Copyright (C) 2002-2004 Novell, Inc.
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of version 2 of the GNU Lesser General Public
7
* License as published by the Free Software Foundation.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with this program; if not, write to the
16
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
* Boston, MA 02110-1301, USA.
20
/* ExchangeFolderSize: Display the folder tree with the folder sizes */
28
#include <glade/glade-xml.h>
31
#include "exchange-hierarchy-webdav.h"
32
#include "e-folder-exchange.h"
33
#include "exchange-folder-size.h"
35
#define PARENT_TYPE G_TYPE_OBJECT
36
static GObjectClass *parent_class = NULL;
38
G_DEFINE_TYPE (ExchangeFolderSize, exchange_folder_size, G_TYPE_OBJECT)
45
struct _ExchangeFolderSizePrivate {
59
free_fgsizeable (gpointer key, gpointer value, gpointer data)
61
folder_info *f_info = (folder_info *) value;
64
g_free (f_info->folder_name);
70
free_row_refs (gpointer key, gpointer value, gpointer user_data)
73
gtk_tree_row_reference_free (value);
78
finalize (GObject *object)
80
ExchangeFolderSize *fsize = EXCHANGE_FOLDER_SIZE (object);
82
g_hash_table_foreach_remove (fsize->priv->table, free_fgsizeable, NULL);
83
g_hash_table_destroy (fsize->priv->table);
84
g_hash_table_foreach_remove (fsize->priv->row_refs, free_row_refs, NULL);
85
g_hash_table_destroy (fsize->priv->row_refs);
86
if (fsize->priv->model)
87
g_object_unref (fsize->priv->model);
90
G_OBJECT_CLASS (parent_class)->finalize (object);
94
dispose (GObject *object)
96
G_OBJECT_CLASS (parent_class)->dispose (object);
100
exchange_folder_size_class_init (ExchangeFolderSizeClass *class)
102
GObjectClass *object_class;
103
parent_class = g_type_class_ref (PARENT_TYPE);
105
object_class = G_OBJECT_CLASS (class);
107
/* override virtual methods */
108
object_class->dispose = dispose;
109
object_class->finalize = finalize;
114
exchange_folder_size_init (ExchangeFolderSize *fsize)
116
fsize->priv = g_new0 (ExchangeFolderSizePrivate, 1);
117
fsize->priv->table = g_hash_table_new (g_str_hash, g_str_equal);
118
fsize->priv->model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_DOUBLE);
119
fsize->priv->row_refs = g_hash_table_new (g_str_hash, g_str_equal);
123
* exchange_folder_size_new:
125
* Return value: a foldersize object with the table initialized
128
exchange_folder_size_new (void)
130
ExchangeFolderSize *fsize;
132
fsize = g_object_new (EXCHANGE_TYPE_FOLDER_SIZE, NULL);
138
exchange_folder_size_update (ExchangeFolderSize *fsize,
139
const gchar *folder_name,
142
folder_info *f_info, *cached_info;
143
ExchangeFolderSizePrivate *priv;
144
GHashTable *folder_gsizeable;
145
GtkTreeRowReference *row;
149
g_return_if_fail (EXCHANGE_IS_FOLDER_SIZE (fsize));
152
folder_gsizeable = priv->table;
154
cached_info = g_hash_table_lookup (folder_gsizeable, folder_name);
156
if (cached_info->folder_size == folder_size) {
159
cached_info->folder_size = folder_size;
160
row = g_hash_table_lookup (priv->row_refs, folder_name);
161
path = gtk_tree_row_reference_get_path (row);
162
if (gtk_tree_model_get_iter (GTK_TREE_MODEL (fsize->priv->model), &iter, path)) {
163
gtk_list_store_set (fsize->priv->model, &iter,
164
COLUMN_NAME, cached_info->folder_name,
165
COLUMN_SIZE, cached_info->folder_size,
168
gtk_tree_path_free (path);
172
f_info = g_new0(folder_info, 1);
173
f_info->folder_name = g_strdup (folder_name);
174
f_info->folder_size = folder_size;
175
g_hash_table_insert (folder_gsizeable, f_info->folder_name, f_info);
177
gtk_list_store_append (fsize->priv->model, &iter);
178
gtk_list_store_set (fsize->priv->model, &iter,
179
COLUMN_NAME, f_info->folder_name,
180
COLUMN_SIZE, f_info->folder_size,
183
path = gtk_tree_model_get_path (GTK_TREE_MODEL (fsize->priv->model), &iter);
184
row = gtk_tree_row_reference_new (GTK_TREE_MODEL (fsize->priv->model), path);
185
gtk_tree_path_free (path);
187
g_hash_table_insert (fsize->priv->row_refs, g_strdup (folder_name), row);
192
exchange_folder_size_remove (ExchangeFolderSize *fsize,
193
const gchar *folder_name)
195
ExchangeFolderSizePrivate *priv;
196
GHashTable *folder_gsizeable;
197
folder_info *cached_info;
198
GtkTreeRowReference *row;
202
g_return_if_fail (EXCHANGE_IS_FOLDER_SIZE (fsize));
203
g_return_if_fail (folder_name != NULL);
206
folder_gsizeable = priv->table;
208
cached_info = g_hash_table_lookup (folder_gsizeable, folder_name);
210
row = g_hash_table_lookup (priv->row_refs, folder_name);
211
path = gtk_tree_row_reference_get_path (row);
212
g_hash_table_remove (folder_gsizeable, folder_name);
213
if (gtk_tree_model_get_iter (GTK_TREE_MODEL (fsize->priv->model), &iter, path)) {
214
gtk_list_store_remove (fsize->priv->model, &iter);
216
g_hash_table_remove (priv->row_refs, row);
217
gtk_tree_path_free (path);
222
exchange_folder_size_get (ExchangeFolderSize *fsize,
223
const gchar *folder_name)
225
ExchangeFolderSizePrivate *priv;
226
GHashTable *folder_gsizeable;
227
folder_info *cached_info;
229
g_return_val_if_fail (EXCHANGE_IS_FOLDER_SIZE (fsize), -1);
232
folder_gsizeable = priv->table;
234
cached_info = g_hash_table_lookup (folder_gsizeable, folder_name);
236
return cached_info->folder_size;
242
exchange_folder_size_get_model (ExchangeFolderSize *fsize)
244
ExchangeFolderSizePrivate *priv;
248
if (!g_hash_table_size (priv->table))