1 /* $Id$ */
2 /* Copyright (c) 2011 Pierre Pronchery <khorben@defora.org> */
3 /* This file is part of DeforaOS Desktop Mailer */
4 /* This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, version 3 of the License.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>. */
15 
16 
17 
18 #include <stdlib.h>
19 #ifdef DEBUG
20 # include <stdio.h>
21 #endif
22 #include <string.h>
23 #include <libintl.h>
24 #include <System.h>
25 #include "mailer.h"
26 #include "folder.h"
27 #define _(string) gettext(string)
28 #define N_(string) (string)
29 
30 
31 /* Folder */
32 /* private */
33 /* types */
34 struct _MailerFolder
35 {
36 	FolderType type;
37 	char * name;
38 	GtkTreeStore * store;
39 	GtkTreeRowReference * row;
40 
41 	GtkTreeStore * messages;
42 
43 	AccountFolder * data;		/* for account plug-ins */
44 };
45 
46 
47 /* prototypes */
48 static gboolean _folder_set(Folder * folder, MailerFolderColumn column,
49 		void * value);
50 
51 static char const * _get_local_name(FolderType type, char const * name);
52 
53 
54 /* functions */
55 /* folder_new */
folder_new(AccountFolder * folder,FolderType type,char const * name,GtkTreeStore * store,GtkTreeIter * iter)56 Folder * folder_new(AccountFolder * folder, FolderType type, char const * name,
57 		GtkTreeStore * store, GtkTreeIter * iter)
58 {
59 	Folder * ret;
60 	GtkTreePath * path;
61 
62 #ifdef DEBUG
63 	fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, name);
64 #endif
65 	if((ret = object_new(sizeof(*ret))) == NULL)
66 		return NULL;
67 	name = _get_local_name(type, name);
68 	ret->name = string_new(name);
69 	ret->store = store;
70 	path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), iter);
71 	ret->row = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
72 	gtk_tree_path_free(path);
73 	gtk_tree_store_set(store, iter, MFC_FOLDER, ret, MFC_NAME, name, -1);
74 	folder_set_type(ret, type);
75 	ret->messages = gtk_tree_store_new(MHC_COUNT, G_TYPE_POINTER,
76 			G_TYPE_POINTER, G_TYPE_POINTER, GDK_TYPE_PIXBUF,
77 			G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
78 			G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT,
79 			G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_UINT);
80 	gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ret->messages),
81 			MHC_DATE, GTK_SORT_DESCENDING);
82 	ret->data = folder;
83 	if(ret->name == NULL)
84 	{
85 		folder_delete(ret);
86 		return NULL;
87 	}
88 	return ret;
89 }
90 
91 
92 /* folder_delete */
folder_delete(Folder * folder)93 void folder_delete(Folder * folder)
94 {
95 	gtk_tree_row_reference_free(folder->row);
96 	string_delete(folder->name);
97 	object_delete(folder);
98 }
99 
100 
101 /* accessors */
102 /* folder_get_data */
folder_get_data(Folder * folder)103 AccountFolder * folder_get_data(Folder * folder)
104 {
105 	return folder->data;
106 }
107 
108 
109 /* folder_get_iter */
folder_get_iter(Folder * folder,GtkTreeIter * iter)110 gboolean folder_get_iter(Folder * folder, GtkTreeIter * iter)
111 {
112 	GtkTreePath * path;
113 
114 	if((path = gtk_tree_row_reference_get_path(folder->row)) == NULL)
115 		return FALSE;
116 	return gtk_tree_model_get_iter(GTK_TREE_MODEL(folder->store), iter,
117 			path);
118 }
119 
120 
121 /* folder_get_messages */
folder_get_messages(Folder * folder)122 GtkTreeStore * folder_get_messages(Folder * folder)
123 {
124 	return folder->messages;
125 }
126 
127 
128 /* folder_get_name */
folder_get_name(Folder * folder)129 char const * folder_get_name(Folder * folder)
130 {
131 	return folder->name;
132 }
133 
134 
135 /* folder_get_type */
folder_get_type(Folder * folder)136 FolderType folder_get_type(Folder * folder)
137 {
138 	return folder->type;
139 }
140 
141 
142 /* folder_set_type */
folder_set_type(Folder * folder,FolderType type)143 void folder_set_type(Folder * folder, FolderType type)
144 {
145 	GtkTreeIter iter;
146 	struct
147 	{
148 		FolderType type;
149 		char const * icon;
150 	} icons[FT_COUNT] =
151 	{
152 		{ FT_INBOX,	"mailer-inbox"		},
153 		{ FT_DRAFTS,	"mailer-drafts"		},
154 		{ FT_SENT,	"mailer-sent"		},
155 		{ FT_TRASH,	"gnome-stock-trash"	},
156 #if GTK_CHECK_VERSION(2, 6, 0)
157 		{ FT_FOLDER,	GTK_STOCK_DIRECTORY	}
158 #else
159 		{ FT_FOLDER,	"stock_directory"	}
160 #endif
161 	};
162 	size_t i;
163 	GtkIconTheme * theme;
164 	GdkPixbuf * pixbuf;
165 
166 	folder->type = type;
167 	if(folder_get_iter(folder, &iter) != TRUE)
168 		return;
169 	for(i = 0; i < FT_LAST; i++)
170 		if(icons[i].type == type)
171 			break;
172 	theme = gtk_icon_theme_get_default();
173 	pixbuf = gtk_icon_theme_load_icon(theme, icons[i].icon, 16, 0, NULL);
174 	_folder_set(folder, MFC_ICON, pixbuf);
175 }
176 
177 
178 /* private */
179 /* folder_set */
_folder_set(Folder * folder,MailerFolderColumn column,void * value)180 static gboolean _folder_set(Folder * folder, MailerFolderColumn column,
181 		void * value)
182 {
183 	GtkTreeIter iter;
184 
185 	if(folder_get_iter(folder, &iter) != TRUE)
186 		return FALSE;
187 	gtk_tree_store_set(folder->store, &iter, column, value, -1);
188 	return TRUE;
189 }
190 
191 
192 /* get_local_name */
_get_local_name(FolderType type,char const * name)193 static char const * _get_local_name(FolderType type, char const * name)
194 {
195 	struct
196 	{
197 		FolderType type;
198 		char const * name;
199 		char const * lname;
200 	} names[] =
201 	{
202 		{ FT_INBOX,	"Inbox",	N_("Inbox")	},
203 		{ FT_DRAFTS,	"Drafts",	N_("Drafts")	},
204 		{ FT_SENT,	"Sent",		N_("Sent")	},
205 		{ FT_TRASH,	"Trash",	N_("Trash")	}
206 	};
207 	size_t i;
208 
209 	for(i = 0; i < sizeof(names) / sizeof(*names); i++)
210 		if(names[i].type == type && strcasecmp(names[i].name, name)
211 				== 0)
212 			return _(names[i].lname);
213 	return name;
214 }
215