/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/* Author : Bertrand.Guiheneuf@aful.org */
/* A simple and very dirty hack written to test
(and perhaps demonstrate) Camel */
#include <gnome.h>
#include <glade/glade.h>
#include "camel-folder.h"
#include "camel-mh-folder.h"
#include "camel-mh-store.h"
#include "camel.h"
#include "camel-folder-summary.h"
static GladeXML *xml;
static CamelSession *_session;
static CamelFolder *currently_selected_folder = NULL;
static GList *store_list;
static GList *folder_list;
static void add_mail_store (const gchar *store_url);
static void show_folder_messages (CamelFolder *folder);
static void
_destroy_menu (gpointer data)
{
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
_copy_message (GtkWidget *widget, gpointer data)
{
CamelFolder *dest_folder = CAMEL_FOLDER (data);
GtkWidget *message_clist;
gint current_row;
GList *selected;
gint selected_row;
CamelMimeMessage *message;
printf ("Selected \"copy to folder\" with destination folder %s\n", camel_folder_get_name (dest_folder));
message_clist = glade_xml_get_widget (xml, "message-clist");
selected = GTK_CLIST (message_clist)->selection;
while (selected) {
selected_row = GPOINTER_TO_INT (selected->data);
message = CAMEL_MIME_MESSAGE (gtk_clist_get_row_data (GTK_CLIST (message_clist), selected_row));
camel_folder_copy_message_to (currently_selected_folder, message, dest_folder);
selected = selected->next;
}
}
static GnomeUIInfo mailbox_popup_menu[] = {
GNOMEUIINFO_ITEM_STOCK ("_Copy selected message here", NULL, _copy_message, GNOME_STOCK_MENU_NEW),
GNOMEUIINFO_END
};
static void
_show_mailbox_context_menu (CamelFolder *folder) {
GtkWidget *menu;
GtkCTree *mailbox_and_store_tree;
mailbox_and_store_tree = GTK_CTREE (glade_xml_get_widget (xml, "store-and-mailbox-tree"));
menu = gtk_object_get_data (GTK_OBJECT (mailbox_and_store_tree), "mailbox_popup_menu");
if (!menu) {
menu = gnome_popup_menu_new (mailbox_popup_menu);
gtk_object_set_data_full (GTK_OBJECT (mailbox_and_store_tree), "mailbox_popup_menu", menu, _destroy_menu);
}
gnome_popup_menu_do_popup (menu, NULL, NULL, NULL, folder);
}
static gboolean
mailbox_button_clicked_on_row (gint button, gint row)
{
GtkCTreeNode *mailbox_node;
CamelFolder *folder;
GtkCTree *mailbox_and_store_tree;
const gchar *mailbox_name;
mailbox_and_store_tree = GTK_CTREE (glade_xml_get_widget (xml, "store-and-mailbox-tree"));
mailbox_node = gtk_ctree_node_nth (mailbox_and_store_tree, row);
folder = gtk_ctree_node_get_row_data (mailbox_and_store_tree, mailbox_node);
if (folder && IS_CAMEL_FOLDER (folder)) {
mailbox_name = camel_folder_get_name (folder);
printf ("mailbox %s clicked with button %d\n", mailbox_name, button);
switch (button) {
case 1:
currently_selected_folder = folder;
show_folder_messages (folder);
break;
case 2:
break;
case 3:
_show_mailbox_context_menu (folder);
}
return TRUE;
} else {
printf ("Node is a store\n");
return FALSE;
}
}
static void
message_destroy_notify (gpointer data)
{
CamelMimeMessage *message = CAMEL_MIME_MESSAGE (data);
gtk_object_unref (GTK_OBJECT (message));
}
static void
show_folder_messages (CamelFolder *folder)
{
GtkWidget *message_clist;
gint folder_message_count;
CamelMimeMessage *message;
gint i;
const gchar *clist_row_text[3];
const char *sent_date, *subject, *sender;
gint current_row;
CamelFolderSummary *summary;
message_clist = glade_xml_get_widget (xml, "message-clist");
/* clear old message list */
gtk_clist_clear (GTK_CLIST (message_clist));
if (camel_folder_has_summary_capability (folder)) {
const GList *message_info_list;
CamelMessageInfo *msg_info;
printf ("Folder has summary. Good\n");
summary = camel_folder_get_summary (folder);
message_info_list = camel_folder_summary_get_message_info_list (summary);
printf ("message_info_list = %p\n", message_info_list);
while (message_info_list) {
msg_info = (CamelMessageInfo *)message_info_list->data;
clist_row_text [0] = msg_info->date;
clist_row_text [1] = msg_info->sender;
clist_row_text [2] = msg_info->subject;
current_row = gtk_clist_append (GTK_CLIST (message_clist), clist_row_text);
message_info_list = message_info_list->next;
}
} else {
printf ("Folder does not have summary. Opening all messages\n");
folder_message_count = camel_folder_get_message_count (folder);
for (i=0; i<folder_message_count; i++) {
message = camel_folder_get_message (folder, i);
gtk_object_ref (GTK_OBJECT (message));
sent_date = camel_mime_message_get_sent_date (message);
sender = camel_mime_message_get_from (message);
subject = camel_mime_message_get_subject (message);
if (sent_date) clist_row_text [0] = sent_date;
else clist_row_text [0] = NULL;
if (sender) clist_row_text [1] = sender;
else clist_row_text [1] = NULL;
if (subject) clist_row_text [2] = subject;
else clist_row_text [2] = NULL;
current_row = gtk_clist_append (GTK_CLIST (message_clist), clist_row_text);
gtk_clist_set_row_data_full (GTK_CLIST (message_clist), current_row, (gpointer)message, message_destroy_notify);
}
}
}
/* add a mail store given by its URL */
static void
add_mail_store (const gchar *store_url)
{
CamelStore *store;
GtkWidget *mailbox_and_store_tree;
GtkCTreeNode* new_store_node;
GtkCTreeNode* new_folder_node;
char *new_tree_text[1];
GList *subfolder_list;
CamelFolder *root_folder;
CamelFolder *new_folder;
store = camel_session_get_store (_session, store_url);
if (!store) return;
/* remember store */
store_list = g_list_prepend (store_list, store);
//store_list = g_list_append (store_list, (gpointer)store);
mailbox_and_store_tree = glade_xml_get_widget (xml, "store-and-mailbox-tree");
new_tree_text[0] = g_strdup (store_url);
new_store_node = gtk_ctree_insert_node (GTK_CTREE (mailbox_and_store_tree),
NULL,
NULL,
new_tree_text,
0,
NULL,
NULL,
NULL,
NULL,
FALSE,
FALSE);
/* normally, use get_root_folder */
root_folder = camel_store_get_folder (store, "");
camel_folder_open (root_folder, FOLDER_OPEN_RW);
subfolder_list = camel_folder_list_subfolders (root_folder);
while (subfolder_list) {
new_tree_text[0] = subfolder_list->data;
new_folder = camel_store_get_folder (store, subfolder_list->data);
camel_folder_open (new_folder, FOLDER_OPEN_RW);
folder_list = g_list_prepend (folder_list, new_folder);
new_folder_node = gtk_ctree_insert_node (GTK_CTREE (mailbox_and_store_tree),
new_store_node,
NULL,
new_tree_text,
0,
NULL,
NULL,
NULL,
NULL,
FALSE,
FALSE);
gtk_ctree_node_set_row_data (GTK_CTREE (mailbox_and_store_tree), new_folder_node, (gpointer)new_folder);
subfolder_list = subfolder_list->next;
}
}
static void
delete_selected_messages ()
{
GtkWidget *message_clist;
gint current_row;
GList *selected;
gint selected_row;
CamelMimeMessage *message;
message_clist = glade_xml_get_widget (xml, "message-clist");
selected = GTK_CLIST (message_clist)->selection;
while (selected) {
selected_row = GPOINTER_TO_INT (selected->data);
message = CAMEL_MIME_MESSAGE (gtk_clist_get_row_data (GTK_CLIST (message_clist), selected_row));
camel_mime_message_set_flag (message, "DELETED", TRUE);
selected = selected->next;
}
}
static void
expunge_selected_folders ()
{
GtkWidget *mailbox_and_store_tree;
CamelFolder *folder;
GtkCTreeNode* selected_node;
GList *selected;
const gchar *folder_name;
mailbox_and_store_tree = glade_xml_get_widget (xml, "store-and-mailbox-tree");
selected = GTK_CLIST (mailbox_and_store_tree)->selection;
while (selected) {
selected_node= GTK_CTREE_NODE (selected->data);
folder = CAMEL_FOLDER (gtk_ctree_node_get_row_data (GTK_CTREE (mailbox_and_store_tree),
selected_node));
if (folder && IS_CAMEL_FOLDER (folder)) {
folder_name = camel_folder_get_name (folder);
printf ("folder to expunge : %s\n", folder_name);
camel_folder_expunge (folder, FALSE);
/* reshowing the folder this way is uggly
but allows to check the message are
correctly renoved and the cache works correctly */
show_folder_messages (folder);
} else {
printf ("A selected node is a store\n");
}
selected = selected->next;
}
}
void
close_all ()
{
while (folder_list) {
camel_folder_close (CAMEL_FOLDER (folder_list->data), TRUE);
folder_list = folder_list->next;
}
while (store_list) {
//camel_store_close (CAMEL_STORE (store_list->data));
store_list = store_list->next;
}
}
/* ----- libglade callbacks */
void
on_exit_activate (GtkWidget *widget, void *data)
{
close_all ();
gtk_main_quit ();
}
void
on_about_activate (GtkWidget *widget, void *data)
{
GtkWidget *about_widget;
about_widget = glade_xml_get_widget (xml, "about_widget");
gtk_widget_show (about_widget);
}
void
on_new_store_activate (GtkWidget *widget, void *data)
{
GtkWidget *new_store_dialog;
GtkWidget *new_store_gnome_entry;
GtkWidget *new_store_entry;
gchar *url_text;
gint pressed_button;
new_store_dialog = glade_xml_get_widget (xml, "new_store_dialog");
pressed_button = gnome_dialog_run (GNOME_DIALOG (new_store_dialog));
if ((pressed_button != 0) && (pressed_button != 1))
return;
new_store_gnome_entry = glade_xml_get_widget (xml, "new-store-entry");
new_store_entry = gnome_entry_gtk_entry (GNOME_ENTRY (new_store_gnome_entry));
url_text = gtk_entry_get_text (GTK_ENTRY (new_store_entry));
if (url_text)
add_mail_store (url_text);
}
void
on_expunge_activate (GtkWidget *widget, void *data)
{
expunge_selected_folders ();
}
void
on_message_delete_activate (GtkWidget *widget, void *data)
{
delete_selected_messages();
}
gboolean
on_store_and_mailbox_tree_button_press_event (GtkWidget *widget, GdkEventButton *event, void *data)
{
gint row;
GtkCList *clist = GTK_CLIST (widget);
if (!gtk_clist_get_selection_info (clist, event->x, event->y, &row, NULL))
return FALSE;
if (!mailbox_button_clicked_on_row (event->button, row))
return FALSE;
return TRUE;
}
/* ----- init */
int
main(int argc, char *argv[])
{
GtkWidget *new_store_gnome_entry;
gnome_init ("store_listing", "1.0", argc, argv);
glade_gnome_init ();
camel_init ();
xml = glade_xml_new ("store_listing.glade", NULL);
if (xml) glade_xml_signal_autoconnect (xml);
_session = camel_session_new ();
camel_provider_register_as_module ("../../camel/providers/MH/.libs/libcamelmh.so");
new_store_gnome_entry = glade_xml_get_widget (xml, "new-store-entry");
gnome_entry_load_history (GNOME_ENTRY (new_store_gnome_entry));
gtk_main ();
gnome_entry_save_history (GNOME_ENTRY (new_store_gnome_entry));
return 0;
}