aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui/contact-editor/e-contact-editor-im.c
diff options
context:
space:
mode:
authorChristian Hammond <chipx86@gnupdate.org>2004-01-12 11:35:25 +0800
committerJP Rosevear <jpr@src.gnome.org>2004-01-12 11:35:25 +0800
commit54e2fae377ffccc0ae3c3987a8a15d2b47e98575 (patch)
tree28d57589dbf532e3e5a26762e9012574b99ae2fd /addressbook/gui/contact-editor/e-contact-editor-im.c
parent9ed71d9c171dd28a9ae43302517b2bdd505eddeb (diff)
downloadgsoc2013-evolution-54e2fae377ffccc0ae3c3987a8a15d2b47e98575.tar
gsoc2013-evolution-54e2fae377ffccc0ae3c3987a8a15d2b47e98575.tar.gz
gsoc2013-evolution-54e2fae377ffccc0ae3c3987a8a15d2b47e98575.tar.bz2
gsoc2013-evolution-54e2fae377ffccc0ae3c3987a8a15d2b47e98575.tar.lz
gsoc2013-evolution-54e2fae377ffccc0ae3c3987a8a15d2b47e98575.tar.xz
gsoc2013-evolution-54e2fae377ffccc0ae3c3987a8a15d2b47e98575.tar.zst
gsoc2013-evolution-54e2fae377ffccc0ae3c3987a8a15d2b47e98575.zip
Added a dialog for adding a new IM account. Added the previously mentioned
2004-01-11 Christian Hammond <chipx86@gnupdate.org> * addressbook/gui/contact-editor/e-contact-editor-im.[ch], addressbook/gui/contact-editor/im.glade: Added a dialog for adding a new IM account. * addressbook/gui/contact-editor/Makefile.am: Added the previously mentioned files, and depend on camel for necessary MIME parsing. * addressbook/gui/contact-editor/contact-editor.[ch], addressbook/gui/contact-editor/contact-editor.glade: Add and implement svn path=/trunk/; revision=24162
Diffstat (limited to 'addressbook/gui/contact-editor/e-contact-editor-im.c')
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-im.c487
1 files changed, 487 insertions, 0 deletions
diff --git a/addressbook/gui/contact-editor/e-contact-editor-im.c b/addressbook/gui/contact-editor/e-contact-editor-im.c
new file mode 100644
index 0000000000..f4932a79f2
--- /dev/null
+++ b/addressbook/gui/contact-editor/e-contact-editor-im.c
@@ -0,0 +1,487 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * e-contact-editor-im.c
+ * Copyright (C) 2003 Ximian, Inc.
+ * Author: Christian Hammond <chipx86@gnupdate.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * 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 library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include "e-contact-editor-im.h"
+#include <libgnomeui/gnome-window-icon.h>
+#include <libgnome/gnome-util.h>
+#include <libgnome/gnome-i18n.h>
+#include <gtk/gtkbox.h>
+#include <gtk/gtkentry.h>
+#include <gtk/gtkhbox.h>
+#include <gtk/gtkimage.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkoptionmenu.h>
+#include <gtk/gtksizegroup.h>
+#include <gtk/gtkstock.h>
+#include <string.h>
+
+static void e_contact_editor_im_init (EContactEditorIm *card);
+static void e_contact_editor_im_class_init (EContactEditorImClass *klass);
+static void e_contact_editor_im_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
+static void e_contact_editor_im_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
+static void e_contact_editor_im_dispose (GObject *object);
+
+static void fill_in_info(EContactEditorIm *editor);
+static void extract_info(EContactEditorIm *editor);
+
+static GtkDialogClass *parent_class = NULL;
+
+/* The arguments we take */
+enum {
+ PROP_0,
+ PROP_SERVICE,
+ PROP_LOCATION,
+ PROP_USERNAME,
+ PROP_EDITABLE
+};
+
+#define FIRST_IM_TYPE E_CONTACT_IM_AIM
+#define LAST_IM_TYPE E_CONTACT_IM_ICQ
+
+static const char *im_labels[] = {
+ N_("AOL Instant Messenger"),
+ N_("Jabber"),
+ N_("Yahoo Messenger"),
+ N_("MSN Messenger"),
+ N_("ICQ")
+};
+
+static const char *im_images[] = {
+ "im-aim.png",
+ "im-jabber.png",
+ "im-yahoo.png",
+ "im-msn.png",
+ "im-icq.png"
+};
+
+GType
+e_contact_editor_im_get_type (void)
+{
+ static GType contact_editor_im_type = 0;
+
+ if (!contact_editor_im_type) {
+ static const GTypeInfo contact_editor_im_info = {
+ sizeof (EContactEditorImClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) e_contact_editor_im_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (EContactEditorIm),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) e_contact_editor_im_init,
+ };
+
+ contact_editor_im_type = g_type_register_static (GTK_TYPE_DIALOG, "EContactEditorIm", &contact_editor_im_info, 0);
+ }
+
+ return contact_editor_im_type;
+}
+
+static void
+e_contact_editor_im_class_init (EContactEditorImClass *klass)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_ref (GTK_TYPE_DIALOG);
+
+ object_class->set_property = e_contact_editor_im_set_property;
+ object_class->get_property = e_contact_editor_im_get_property;
+ object_class->dispose = e_contact_editor_im_dispose;
+
+ g_object_class_install_property (object_class, PROP_SERVICE,
+ g_param_spec_int ("service",
+ _("Service"),
+ /*_( */"XXX blurb" /*)*/,
+ FIRST_IM_TYPE,
+ LAST_IM_TYPE,
+ FIRST_IM_TYPE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class, PROP_LOCATION,
+ g_param_spec_string ("location",
+ _("Location"),
+ /*_( */"XXX blurb" /*)*/,
+ "HOME",
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class, PROP_USERNAME,
+ g_param_spec_string ("username",
+ _("Username"),
+ /*_( */"XXX blurb" /*)*/,
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (object_class, PROP_EDITABLE,
+ g_param_spec_boolean ("editable",
+ _("Editable"),
+ /*_( */"XXX blurb" /*)*/,
+ FALSE,
+ G_PARAM_READWRITE));
+}
+
+static void
+service_changed_cb(GtkWidget *optmenu, EContactEditorIm *editor)
+{
+ editor->service = gtk_option_menu_get_history(GTK_OPTION_MENU(optmenu)) + FIRST_IM_TYPE;
+}
+
+static void
+location_changed_cb(GtkWidget *optmenu, EContactEditorIm *editor)
+{
+ int i = gtk_option_menu_get_history(GTK_OPTION_MENU(optmenu));
+
+ if (editor->location != NULL)
+ g_free(editor->location);
+
+ if (i == 0)
+ editor->location = g_strdup("HOME");
+ else if (i == 1)
+ editor->location = g_strdup("WORK");
+ else
+ editor->location = NULL;
+}
+
+static void
+setup_service_optmenu(EContactEditorIm *editor)
+{
+ GtkWidget *optmenu;
+ GtkWidget *menu;
+ GtkWidget *hbox;
+ GtkWidget *item;
+ GtkWidget *label;
+ GtkWidget *image;
+ GdkPixbuf *pixbuf;
+ GdkPixbuf *scale;
+ GList *p;
+ GtkSizeGroup *sg;
+ char *icon_path;
+ int i;
+
+ optmenu = glade_xml_get_widget(editor->gui, "optmenu-service");
+ g_signal_connect(G_OBJECT(optmenu), "changed",
+ G_CALLBACK(service_changed_cb), editor);
+
+ menu = gtk_menu_new();
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu);
+ gtk_widget_show(menu);
+
+ sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
+ for (i = 0; i < G_N_ELEMENTS(im_labels); i++) {
+ item = gtk_menu_item_new();
+
+ hbox = gtk_hbox_new(FALSE, 4);
+ gtk_container_add(GTK_CONTAINER(item), hbox);
+ gtk_widget_show(hbox);
+
+ icon_path = g_concat_dir_and_file(EVOLUTION_IMAGESDIR, im_images[i]);
+ pixbuf = gdk_pixbuf_new_from_file(icon_path, NULL);
+ g_free(icon_path);
+
+ if (pixbuf != NULL) {
+ scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR);
+ image = gtk_image_new_from_pixbuf(scale);
+
+ g_object_unref(G_OBJECT(pixbuf));
+ g_object_unref(G_OBJECT(scale));
+ }
+ else
+ image = gtk_image_new();
+
+ gtk_size_group_add_widget(sg, image);
+
+ gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
+ gtk_widget_show(image);
+
+ label = gtk_label_new(im_labels[i]);
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+ gtk_widget_show(label);
+
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show(item);
+ }
+}
+
+static void
+setup_location_optmenu(EContactEditorIm *editor)
+{
+ GtkWidget *item;
+ GtkWidget *optmenu;
+ GtkWidget *menu;
+
+ optmenu = glade_xml_get_widget(editor->gui, "optmenu-location");
+
+ g_signal_connect(G_OBJECT(optmenu), "changed",
+ G_CALLBACK(location_changed_cb), editor);
+
+ menu = gtk_menu_new();
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu);
+ gtk_widget_show(menu);
+
+ item = gtk_menu_item_new_with_label(_("Home"));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show(item);
+
+ item = gtk_menu_item_new_with_label(_("Work"));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show(item);
+
+ item = gtk_menu_item_new_with_label(_("Other"));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show(item);
+}
+
+static void
+e_contact_editor_im_init (EContactEditorIm *e_contact_editor_im)
+{
+ GladeXML *gui;
+ GtkWidget *widget;
+ char *icon_path;
+
+ gtk_dialog_add_buttons (GTK_DIALOG (e_contact_editor_im),
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_OK,
+ NULL);
+
+ gtk_window_set_resizable(GTK_WINDOW(e_contact_editor_im), TRUE);
+
+ e_contact_editor_im->service = FIRST_IM_TYPE;
+ e_contact_editor_im->location = g_strdup("HOME");
+ e_contact_editor_im->username = NULL;
+ gui = glade_xml_new (EVOLUTION_GLADEDIR "/im.glade", NULL, NULL);
+ e_contact_editor_im->gui = gui;
+
+ widget = glade_xml_get_widget(gui, "dialog-im");
+ gtk_window_set_title (GTK_WINDOW (e_contact_editor_im),
+ GTK_WINDOW (widget)->title);
+
+ widget = glade_xml_get_widget(gui, "table-im");
+ g_object_ref(widget);
+ gtk_container_remove(GTK_CONTAINER(widget->parent), widget);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (e_contact_editor_im)->vbox), widget, TRUE, TRUE, 0);
+ g_object_unref(widget);
+
+ setup_service_optmenu(e_contact_editor_im);
+ setup_location_optmenu(e_contact_editor_im);
+
+ gtk_widget_grab_focus(glade_xml_get_widget(gui, "entry-username"));
+
+ icon_path = g_concat_dir_and_file (EVOLUTION_IMAGESDIR, "evolution-contacts-mini.png");
+ gnome_window_icon_set_from_file (GTK_WINDOW (e_contact_editor_im), icon_path);
+ g_free (icon_path);
+}
+
+void
+e_contact_editor_im_dispose (GObject *object)
+{
+ EContactEditorIm *e_contact_editor_im = E_CONTACT_EDITOR_IM(object);
+
+ if (e_contact_editor_im->gui) {
+ g_object_unref(e_contact_editor_im->gui);
+ e_contact_editor_im->gui = NULL;
+ }
+
+ if (e_contact_editor_im->location) {
+ g_free(e_contact_editor_im->location);
+ e_contact_editor_im->location = NULL;
+ }
+
+ if (e_contact_editor_im->username) {
+ g_free(e_contact_editor_im->username);
+ e_contact_editor_im->username = NULL;
+ }
+
+ if (G_OBJECT_CLASS (parent_class)->dispose)
+ (* G_OBJECT_CLASS (parent_class)->dispose) (object);
+}
+
+GtkWidget*
+e_contact_editor_im_new (EContactField service, const char *location, const char *username)
+{
+ GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_IM, NULL);
+ g_object_set (widget,
+ "service", GINT_TO_POINTER(service),
+ "location", location,
+ "username", username,
+ NULL);
+ return widget;
+}
+
+static void
+e_contact_editor_im_set_property (GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ EContactEditorIm *e_contact_editor_im;
+ const char *str;
+
+ e_contact_editor_im = E_CONTACT_EDITOR_IM (object);
+
+ switch (prop_id){
+ case PROP_SERVICE:
+ e_contact_editor_im->service = g_value_get_int(value);
+ fill_in_info(e_contact_editor_im);
+ break;
+
+ case PROP_LOCATION:
+ if (e_contact_editor_im->location != NULL)
+ g_free(e_contact_editor_im->location);
+
+ str = g_value_get_string(value);
+
+ if (str == NULL)
+ e_contact_editor_im->location = NULL;
+ else if (!g_ascii_strcasecmp(str, "HOME"))
+ e_contact_editor_im->location = g_strdup("HOME");
+ else if (!g_ascii_strcasecmp(str, "WORK"))
+ e_contact_editor_im->location = g_strdup("WORK");
+ else
+ e_contact_editor_im->location = NULL;
+
+ fill_in_info(e_contact_editor_im);
+ break;
+
+ case PROP_USERNAME:
+ if (e_contact_editor_im->username != NULL)
+ g_free(e_contact_editor_im->username);
+
+ e_contact_editor_im->username = g_strdup(g_value_get_string(value));
+ fill_in_info(e_contact_editor_im);
+ break;
+
+ case PROP_EDITABLE: {
+ int i;
+ char *widget_names[] = {
+ "optmenu-service",
+ "optmenu-location",
+ "entry-username",
+ "label-service",
+ "label-location",
+ "label-username",
+ NULL
+ };
+ e_contact_editor_im->editable = g_value_get_boolean (value) ? TRUE : FALSE;
+ for (i = 0; widget_names[i] != NULL; i ++) {
+ GtkWidget *w = glade_xml_get_widget(e_contact_editor_im->gui, widget_names[i]);
+ if (GTK_IS_ENTRY (w)) {
+ gtk_editable_set_editable (GTK_EDITABLE (w),
+ e_contact_editor_im->editable);
+ }
+ else {
+ gtk_widget_set_sensitive (w, e_contact_editor_im->editable);
+ }
+ }
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+e_contact_editor_im_get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ EContactEditorIm *e_contact_editor_im;
+
+ e_contact_editor_im = E_CONTACT_EDITOR_IM (object);
+
+ switch (prop_id) {
+ case PROP_SERVICE:
+ g_value_set_int (value, e_contact_editor_im->service);
+ break;
+ case PROP_LOCATION:
+ g_value_set_string (value, e_contact_editor_im->location);
+ break;
+ case PROP_USERNAME:
+ extract_info(e_contact_editor_im);
+ g_value_set_string (value, e_contact_editor_im->username);
+ break;
+ case PROP_EDITABLE:
+ g_value_set_boolean (value, e_contact_editor_im->editable ? TRUE : FALSE);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+fill_in_field(EContactEditorIm *editor, char *field, char *string)
+{
+ GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field));
+ if (entry) {
+ if (string)
+ gtk_entry_set_text(entry, string);
+ else
+ gtk_entry_set_text(entry, "");
+ }
+}
+
+static void
+fill_in_info(EContactEditorIm *editor)
+{
+ GtkWidget *optmenu;
+
+ fill_in_field(editor, "entry-username", editor->username);
+
+ optmenu = glade_xml_get_widget(editor->gui, "optmenu-service");
+
+ if (optmenu != NULL)
+ gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), editor->service - FIRST_IM_TYPE);
+
+ optmenu = glade_xml_get_widget(editor->gui, "optmenu-location");
+
+ if (optmenu != NULL)
+ gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu),
+ (editor->location == NULL ? 2 :
+ !strcmp(editor->location, "WORK") ? 1 : 0));
+}
+
+static char *
+extract_field(EContactEditorIm *editor, char *field)
+{
+ GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field));
+ if (entry)
+ return g_strdup (gtk_entry_get_text(entry));
+ else
+ return NULL;
+}
+
+static void
+extract_info(EContactEditorIm *editor)
+{
+ if (editor->username != NULL)
+ g_free(editor->username);
+
+ editor->username = extract_field(editor, "entry-username");
+
+ /*
+ * NOTE: We don't need to handle the option menus.
+ * These are set by the callbacks.
+ */
+}