aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-accounts.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-accounts.c')
-rw-r--r--mail/mail-accounts.c380
1 files changed, 380 insertions, 0 deletions
diff --git a/mail/mail-accounts.c b/mail/mail-accounts.c
new file mode 100644
index 0000000000..832e0173bc
--- /dev/null
+++ b/mail/mail-accounts.c
@@ -0,0 +1,380 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors: Jeffrey Stedfast <fejj@helixcode.com>
+ *
+ * Copyright 2001 Helix Code, Inc. (www.helixcode.com)
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "mail-config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <camel/camel-url.h>
+
+static void mail_accounts_dialog_class_init (MailAccountsDialogClass *class);
+static void mail_accounts_dialog_init (MailAccountsDialog *dialog);
+static void mail_accounts_dialog_finalise (GtkObject *obj);
+
+static GnomeDialogClass *parent_class;
+
+GtkType
+mail_accounts_dialog_get_type ()
+{
+ static GtkType type = 0;
+
+ if (!type) {
+ GtkTypeInfo type_info = {
+ "MailAccountsDialog",
+ sizeof (MailAccountsDialog),
+ sizeof (MailAccountsDialogClass),
+ (GtkClassInitFunc) mail_accounts_dialog_class_init,
+ (GtkObjectInitFunc) mail_accounts_dialog_init,
+ (GtkArgSetFunc) NULL,
+ (GtkArgGetFunc) NULL
+ };
+
+ type = gtk_type_unique (gnome_dialog_get_type (), &type_info);
+ }
+
+ return type;
+}
+
+static void
+mail_accounts_dialog_class_init (MailConfigDruidClass *class)
+{
+ GtkObjectClass *object_class;
+
+ object_class = (GtkObjectClass *) class;
+ parent_class = gtk_type_class (gnome_dialog_get_type ());
+
+ object_class->finalize = mail_accounts_dialog_finalise;
+ /* override methods */
+
+}
+
+static void
+mail_accounts_dialog_init (MailAccountsDialog *o)
+{
+ ;
+}
+
+static void
+mail_accounts_dialog_finalise (GtkObject *obj)
+{
+ MailAccountsDialog *dialog = (MailConfigDruid *) obj;
+
+ gtk_object_unref (GTK_OBJECT (dialog->gui));
+
+ ((GtkObjectClass *)(parent_class))->finalize (obj);
+}
+
+static void
+load_accounts (MailAccountsDialog *dialog)
+{
+ const MailConfigAccount *account;
+ const GList *node = dialog->accounts;
+ int i = 0;
+
+ gtk_clist_freeze (dialog->mail_accounts);
+
+ gtk_clist_clear (dialog->mail_accounts);
+
+ while (node) {
+ CamelURL *url;
+ gchar *text[2];
+
+ account = node->data;
+
+ url = camel_url_new (account->source->url, NULL);
+ text[0] = g_strdup (account->name);
+ text[1] = g_strdup_printf ("%s%s", url->protocol,
+ account->default ? " (default)" : "");
+ camel_url_free (url);
+
+ gtk_clist_append (dialog->mail_accounts, text);
+ g_free (text[0]);
+ g_free (text[1]);
+
+ /* set the account on the row */
+ gtk_clist_set_row_data (dialog->mail_accounts, i, account);
+
+ node = node->next;
+ i++;
+ }
+
+ gtk_clist_thaw (dialog->mail_accounts);
+}
+
+static void
+load_news (MailAccountsDialog *dialog)
+{
+ /* FIXME: implement */
+ ;
+}
+
+/* mail callbacks */
+static void
+mail_select (GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+
+ dialog->accounts_row = row;
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_edit), TRUE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_delete), TRUE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_default), TRUE);
+}
+
+static void
+mail_unselect (GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+
+ dialog->accounts_row = -1;
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_edit), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_delete), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_default), FALSE);
+}
+
+static void
+mail_add_finished (GtkWidget *widget, gpointer data)
+{
+ /* Either Cancel or Finished was clicked in the druid so reload the accounts */
+ MailAccountsDialog *dialog = data;
+
+ dialog->accounts = mail_config_get_accounts ();
+ load_accounts (dialog);
+}
+
+static void
+mail_add (GtkButton *button, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+ MailConfigDruid *druid;
+
+ druid = mail_config_druid_new ();
+ gtk_signal_connect (GTK_OBJECT (druid), "destroy"
+ GTK_SIGNAL_FUNC (mail_add_finished), dialog);
+
+ gtk_widget_show (GTK_WIDGET (druid));
+}
+
+static void
+mail_edit (GtkButton *button, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+ MailConfigAccount *account;
+
+ /* open the editor and stuff */
+}
+
+static void
+mail_delete (GtkButton *button, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+ MailConfigAccount *account;
+
+ if (dialog->accounts_row >= 0) {
+ int row, len;
+
+ account = gtk_clist_get_row_data (dialog->mail_accounts, dialog->accounts_row);
+ g_list_remove ((GList *)dialog->accounts, account);
+ account_destroy (account);
+ gtk_clist_remove (dialog->mail_accounts, dialog->accounts_row);
+
+ len = g_list_length (dialog->accounts);
+ if (len > 0) {
+ row = dialog->accounts_row;
+ row = row >= len ? len - 1 : row;
+ gtk_clist_select_row (dialog->mail_accounts, row, 0);
+ } else {
+ dialog->accounts_row = -1;
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_edit), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_delete), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_default), FALSE);
+ }
+ }
+}
+
+static void
+mail_default (GtkButton *button, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+ const MailConfigAccount *account;
+
+ if (dialog->accounts_row >= 0) {
+ account = gtk_clist_get_row_data (dialog->mail_accounts, dialog->accounts_row);
+ mail_config_set_default_account (account);
+ }
+}
+
+/* news callbacks */
+static void
+news_select (GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+
+ dialog->news_row = row;
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->news_edit), TRUE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->news_delete), TRUE);
+}
+
+static void
+news_unselect (GtkCList *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+
+ dialog->news_row = -1;
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->news_edit), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->news_delete), FALSE);
+}
+
+static void
+news_add_finish_clicked ()
+{
+ /* FIXME: uhm, yea... */
+ ;
+}
+
+static void
+news_add (GtkButton *button, gpointer data)
+{
+ /* FIXME: do stuff */
+ ;
+}
+
+static void
+news_edit (GtkButton *button, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+ MailConfigService *server;
+
+ /* FIXME: open the editor and stuff */
+}
+
+static void
+news_delete (GtkButton *button, gpointer data)
+{
+ MailAccountsDialog *dialog = data;
+ MailConfigService *server;
+
+ if (dialog->news_row >= 0) {
+ int row, len;
+
+ server = gtk_clist_get_row_data (dialog->news_accounts, dialog->news_row);
+ g_list_remove ((GList *)dialog->news, server);
+ service_destroy (server);
+ gtk_clist_remove (dialog->news_accounts, dialog->news_row);
+
+ len = g_list_length (dialog->news);
+ if (len > 0) {
+ row = dialog->news_row;
+ row = row >= len ? len - 1 : row;
+ gtk_clist_select_row (dialog->news_accounts, row, 0);
+ } else {
+ dialog->news_row = -1;
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->news_edit), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->news_delete), FALSE);
+ }
+ }
+}
+
+static void
+construct (MailAccountsDialog *dialog)
+{
+ GladeXML *gui;
+ GtkWidget *notebook;
+
+ gui = glade_xml_new (EVOLUTION_DATA_DIR "/mail-config-druid.glade", "mail-accounts-dialog");
+ dialog->gui = gui;
+
+ /* get our toplevel widget */
+ notebook = glade_xml_get_widget (gui, "notebook");
+
+ /* reparent */
+ gtk_widget_reparent (widget, GTK_WIDGET (dialog));
+
+ /* give our dialog an OK button and title */
+ gnome_dialog_construct (GNOME_DIALOG (dialog), _("Evolution Accounts"),
+ GNOME_STOCK_BUTTON_OK);
+
+ dialog->mail_accounts = GTK_CLIST (glade_xml_get_widget (gui, "clistAccounts"));
+ gtk_signal_connect (GTK_OBJECT (dialog->mail_accounts), "select-row",
+ GTK_SIGNAL_FUNC (mail_select), dialog);
+ gtk_signal_connect (GTK_OBJECT (dialog->mail_accounts), "unselect-row",
+ GTK_SIGNAL_FUNC (mail_unselect), dialog);
+ dialog->mail_add = GTK_BUTTON (glade_xml_get_widget (gui, "cmdMailAdd"));
+ gtk_signal_connect (GTK_OBJECT (dialog->mail_add), "clicked",
+ GTK_SIGNAL_FUNC (mail_add), dialog);
+ dialog->mail_edit = GTK_BUTTON (glade_xml_get_widget (gui, "cmdMailEdit"));
+ gtk_signal_connect (GTK_OBJECT (dialog->mail_edit), "clicked",
+ GTK_SIGNAL_FUNC (mail_edit), dialog);
+ dialog->mail_delete = GTK_BUTTON (glade_xml_get_widget (gui, "cmdMailDelete"));
+ gtk_signal_connect (GTK_OBJECT (dialog->mail_delete), "clicked",
+ GTK_SIGNAL_FUNC (mail_delete), dialog);
+ dialog->mail_default = GTK_BUTTON (glade_xml_get_widget (gui, "cmdMailDefault"));
+ gtk_signal_connect (GTK_OBJECT (dialog->mail_default), "clicked",
+ GTK_SIGNAL_FUNC (mail_default), dialog);
+
+ dialog->news_accounts = GTK_CLIST (glade_xml_get_widget (gui, "clistAccounts"));
+ gtk_signal_connect (GTK_OBJECT (dialog->news_accounts), "select-row",
+ GTK_SIGNAL_FUNC (news_select), dialog);
+ gtk_signal_connect (GTK_OBJECT (dialog->news_accounts), "unselect-row",
+ GTK_SIGNAL_FUNC (news_unselect), dialog);
+ dialog->news_add = GTK_BUTTON (glade_xml_get_widget (gui, "cmdNewsAdd"));
+ gtk_signal_connect (GTK_OBJECT (dialog->news_add), "clicked",
+ GTK_SIGNAL_FUNC (news_add), dialog);
+ dialog->news_edit = GTK_BUTTON (glade_xml_get_widget (gui, "cmdNewsEdit"));
+ gtk_signal_connect (GTK_OBJECT (dialog->news_edit), "clicked",
+ GTK_SIGNAL_FUNC (news_edit), dialog);
+ dialog->news_delete = GTK_BUTTON (glade_xml_get_widget (gui, "cmdNewsDelete"));
+ gtk_signal_connect (GTK_OBJECT (dialog->news_delete), "clicked",
+ GTK_SIGNAL_FUNC (news_delete), dialog);
+
+ /* now to fill in the clists */
+ dialog->accounts_row = -1;
+ dialog->accounts = mail_config_get_accounts ();
+ if (dialog->accounts) {
+ load_accounts (dialog);
+ gtk_clist_select_row (dialog->mail_accounts, 0, 0);
+ } else {
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_edit), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_delete), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->mail_default), FALSE);
+ }
+
+ dialog->news_row = -1;
+ dialog->news = mail_config_get_news ();
+ if (dialog->news) {
+ load_news (dialog);
+ gtk_clist_select_row (dialog->news_accounts, 0, 0);
+ } else {
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->news_edit), FALSE);
+ gtk_widget_set_sensitive (GTK_WIDGET (dialog->news_delete), FALSE);
+ }
+}
+
+MailAccountsDialog *
+mail_accounts_dialog_new ()
+{
+ MailAccountsDialog *new;
+
+ new = (MailAccountsDialog *) gtk_type_new (mail_accounts_dialog_get_type ());
+ construct (new);
+
+ return new;
+}