/* $Id: folder.c,v 1.6 2011/06/26 23:03:18 khorben Exp $ */ /* Copyright (c) 2011 Pierre Pronchery */ /* This file is part of DeforaOS Desktop Mailer */ /* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #ifdef DEBUG # include #endif #include #include #include #include "mailer.h" #include "folder.h" #define _(string) gettext(string) #define N_(string) (string) /* Folder */ /* private */ /* types */ struct _Folder { FolderType type; char * name; GtkTreeStore * store; GtkTreeRowReference * row; GtkListStore * messages; AccountFolder * data; /* for account plug-ins */ }; /* prototypes */ static gboolean _folder_get_iter(Folder * folder, GtkTreeIter * iter); static gboolean _folder_set(Folder * folder, MailerFolderColumn column, void * value); static char const * _get_local_name(FolderType type, char const * name); /* functions */ /* folder_new */ Folder * folder_new(AccountFolder * folder, FolderType type, char const * name, GtkTreeStore * store, GtkTreeIter * iter) { Folder * ret; GtkTreePath * path; #ifdef DEBUG fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, name); #endif if((ret = object_new(sizeof(*ret))) == NULL) return NULL; name = _get_local_name(type, name); ret->name = string_new(name); ret->store = store; path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), iter); ret->row = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path); gtk_tree_path_free(path); gtk_tree_store_set(store, iter, MFC_FOLDER, ret, MFC_NAME, name, -1); folder_set_type(ret, type); ret->messages = gtk_list_store_new(MHC_COUNT, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_UINT); ret->data = folder; if(ret->name == NULL) { folder_delete(ret); return NULL; } return ret; } /* folder_delete */ void folder_delete(Folder * folder) { gtk_tree_row_reference_free(folder->row); string_delete(folder->name); object_delete(folder); } /* accessors */ /* folder_get_data */ AccountFolder * folder_get_data(Folder * folder) { return folder->data; } /* folder_get_messages */ GtkListStore * folder_get_messages(Folder * folder) { return folder->messages; } /* folder_get_name */ char const * folder_get_name(Folder * folder) { return folder->name; } /* folder_get_type */ FolderType folder_get_type(Folder * folder) { return folder->type; } /* folder_set_type */ void folder_set_type(Folder * folder, FolderType type) { GtkTreeIter iter; struct { FolderType type; char const * icon; } icons[FT_COUNT] = { { FT_INBOX, "mailer-inbox" }, { FT_DRAFTS, "mailer-drafts" }, { FT_SENT, "mailer-sent" }, { FT_TRASH, "gnome-stock-trash" }, #if GTK_CHECK_VERSION(2, 6, 0) { FT_FOLDER, GTK_STOCK_DIRECTORY } #else { FT_FOLDER, "stock_directory" } #endif }; size_t i; GtkIconTheme * theme; GdkPixbuf * pixbuf; folder->type = type; if(_folder_get_iter(folder, &iter) != TRUE) return; for(i = 0; i < FT_LAST; i++) if(icons[i].type == type) break; theme = gtk_icon_theme_get_default(); pixbuf = gtk_icon_theme_load_icon(theme, icons[i].icon, 16, 0, NULL); _folder_set(folder, MFC_ICON, pixbuf); } /* private */ /* folder_get_iter */ static gboolean _folder_get_iter(Folder * folder, GtkTreeIter * iter) { GtkTreePath * path; if((path = gtk_tree_row_reference_get_path(folder->row)) == NULL) return FALSE; return gtk_tree_model_get_iter(GTK_TREE_MODEL(folder->store), iter, path); } /* folder_set */ static gboolean _folder_set(Folder * folder, MailerFolderColumn column, void * value) { GtkTreeIter iter; if(_folder_get_iter(folder, &iter) != TRUE) return FALSE; gtk_tree_store_set(folder->store, &iter, column, value, -1); return TRUE; } /* get_local_name */ static char const * _get_local_name(FolderType type, char const * name) { struct { FolderType type; char const * name; char const * lname; } names[] = { { FT_INBOX, "Inbox", N_("Inbox") }, { FT_DRAFTS, "Drafts", N_("Drafts") }, { FT_SENT, "Sent", N_("Sent") }, { FT_TRASH, "Trash", N_("Trash") } }; size_t i; for(i = 0; i < sizeof(names) / sizeof(*names); i++) if(names[i].type == type && strcasecmp(names[i].name, name) == 0) return _(names[i].lname); return name; }