From 8cb68557aebb62334f68beeea60cf3bbf5930f9e Mon Sep 17 00:00:00 2001 From: Chris Toshok Date: Mon, 25 Jun 2001 01:09:43 +0000 Subject: correct path to libecontacteditor.a. (minicard_widget_test_LDADD): same. 2001-06-24 Chris Toshok * gui/widgets/Makefile.am (minicard_test_LDADD): correct path to libecontacteditor.a. (minicard_widget_test_LDADD): same. (INCLUDES): same, for the includes. * gui/widgets/e-minicard.h: correct e-contact-editor.h path. * gui/widgets/e-addressbook-util.h: correct path to e-contact-editor.h, and add e-contact-list-editor.h. Add prototype for e_addressbook_show_contact_list_editor. * gui/widgets/e-addressbook-util.c: remove #include "e-contact-editor.h" (our header includes it.) (added_cb): rename card_added_cb to this, and make it so it can be reused in both the list and card cases. remove the g_print too. (modified_cb): same for modified case. (deleted_cb): same for deleted case. (editor_closed_cb): change first arg to GtkObject* so we can reuse this for both list and card. (e_addressbook_show_contact_editor): use added_cb, modified_cb, deleted_cb, and pass FALSE as user_data. (e_addressbook_show_contact_list_editor): new function, same as above but creating a contact-list-editor, and pass TRUE as user_data. * gui/component/e-address-popup.c: correct path to contact-editor. * gui/component/e-address-widget.c: same. * gui/component/select-names/e-select-names-popup.c: same. * gui/component/select-names/e-select-names-text-model.c: same. * gui/component/addressbook.c (new_contact_list_cb): new function. (update_command_state): update ContactNewList command. (verbs): remove ViewAll from the toolbar from the verb list. Add ContactNewList. (pixmaps): same for pixmaps. * gui/component/Makefile.am (evolution_addressbook_LDADD): new path for contact-editor. (INCLUDES): same. * gui/contact-list-editor/e-contact-list-model.h: * gui/contact-list-editor/e-contact-list-model.c: * gui/contact-list-editor/e-contact-list-editor.h: * gui/contact-list-editor/e-contact-list-editor.c: * gui/contact-list-editor/Makefile.am: Initial contact-list editor commit. * gui/Makefile.am (SUBDIRS): add contact-editor. * Makefile.am: (SUBDIRS): remove contact-editor. svn path=/trunk/; revision=10463 --- addressbook/gui/contact-list-editor/.cvsignore | 3 + addressbook/gui/contact-list-editor/Makefile.am | 29 ++ .../contact-list-editor/contact-list-editor.glade | 287 ++++++++++++ .../contact-list-editor/e-contact-list-editor.c | 499 +++++++++++++++++++++ .../contact-list-editor/e-contact-list-editor.h | 108 +++++ .../gui/contact-list-editor/e-contact-list-model.c | 190 ++++++++ .../gui/contact-list-editor/e-contact-list-model.h | 42 ++ 7 files changed, 1158 insertions(+) create mode 100644 addressbook/gui/contact-list-editor/.cvsignore create mode 100644 addressbook/gui/contact-list-editor/Makefile.am create mode 100644 addressbook/gui/contact-list-editor/contact-list-editor.glade create mode 100644 addressbook/gui/contact-list-editor/e-contact-list-editor.c create mode 100644 addressbook/gui/contact-list-editor/e-contact-list-editor.h create mode 100644 addressbook/gui/contact-list-editor/e-contact-list-model.c create mode 100644 addressbook/gui/contact-list-editor/e-contact-list-model.h (limited to 'addressbook/gui/contact-list-editor') diff --git a/addressbook/gui/contact-list-editor/.cvsignore b/addressbook/gui/contact-list-editor/.cvsignore new file mode 100644 index 0000000000..e440fafdac --- /dev/null +++ b/addressbook/gui/contact-list-editor/.cvsignore @@ -0,0 +1,3 @@ +Makefile.in +Makefile +.deps diff --git a/addressbook/gui/contact-list-editor/Makefile.am b/addressbook/gui/contact-list-editor/Makefile.am new file mode 100644 index 0000000000..5e6229a833 --- /dev/null +++ b/addressbook/gui/contact-list-editor/Makefile.am @@ -0,0 +1,29 @@ +INCLUDES = \ + $(BONOBO_GNOME_CFLAGS) \ + $(EXTRA_GNOME_CFLAGS) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/addressbook/ \ + -I$(top_srcdir)/addressbook/backend \ + -I$(top_srcdir)/addressbook/gui/merging \ + -I$(top_srcdir)/widgets/e-table \ + -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ + -DDATADIR=\""$(datadir)"\" \ + -DEVOLUTION_DATADIR=\""$(datadir)"\" \ + -DEVOLUTIONDIR=\""$(evolutiondir)"\" \ + -DG_LOG_DOMAIN=\"contact-list-editor\" + +noinst_LIBRARIES = \ + libecontactlisteditor.a + +libecontactlisteditor_a_SOURCES = \ + e-contact-list-editor.c \ + e-contact-list-editor.h \ + e-contact-list-model.c \ + e-contact-list-model.h + +gladedir = $(datadir)/evolution/glade + +glade_DATA = \ + contact-list-editor.glade + +EXTRA_DIST = $(glade_DATA) diff --git a/addressbook/gui/contact-list-editor/contact-list-editor.glade b/addressbook/gui/contact-list-editor/contact-list-editor.glade new file mode 100644 index 0000000000..56317384f3 --- /dev/null +++ b/addressbook/gui/contact-list-editor/contact-list-editor.glade @@ -0,0 +1,287 @@ + + + + + contact-list-editor + contact-list-editor + + src + pixmaps + C + True + True + + + + GnomeApp + contact list editor + contact-list-editor + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + True + False + True + + + GnomeDock + GnomeApp:dock + dock1 + True + + 0 + True + True + + + + GtkTable + GnomeDock:contents + table1 + 13 + 6 + 4 + False + 5 + 5 + + + Custom + contact-list-table + e_contact_list_editor_create_table + + 0 + 0 + Sat, 23 Jun 2001 06:00:16 GMT + + 1 + 3 + 4 + 6 + 0 + 0 + True + True + False + False + True + True + + + + + GtkEntry + email-entry + True + True + True + 0 + + + 1 + 3 + 3 + 4 + 0 + 0 + True + False + False + False + True + False + + + + + GtkLabel + label1 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 1 + 3 + 2 + 3 + 0 + 0 + False + False + False + False + True + False + + + + + GtkLabel + label2 + + GTK_JUSTIFY_LEFT + False + 0 + 0.5 + 0 + 0 + + 1 + 2 + 0 + 1 + 0 + 0 + False + False + False + False + True + False + + + + + GtkEntry + list-name-entry + True + True + True + 0 + + + 2 + 3 + 0 + 1 + 0 + 0 + True + False + False + False + True + False + + + + + GtkVButtonBox + vbuttonbox2 + GTK_BUTTONBOX_START + 10 + 85 + 27 + 7 + 0 + + 3 + 4 + 4 + 6 + 0 + 0 + False + False + False + False + True + True + + + + GtkButton + remove-button + True + True + + GTK_RELIEF_NORMAL + + + + + GtkHSeparator + hseparator1 + + 1 + 4 + 1 + 2 + 0 + 0 + False + False + False + False + True + True + + + + + GtkVButtonBox + vbuttonbox3 + GTK_BUTTONBOX_DEFAULT_STYLE + 10 + 85 + 27 + 0 + 0 + + 3 + 4 + 3 + 4 + 0 + 0 + False + False + False + False + True + True + + + + GtkButton + add-email-button + True + True + + GTK_RELIEF_NORMAL + + + + + Custom + custom2 + e_create_image_widget + evolution-contacts-plain.png + 0 + 0 + Sat, 23 Jun 2001 05:59:21 GMT + + 0 + 1 + 0 + 6 + 0 + 0 + False + False + False + False + True + True + + + + + + + diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.c b/addressbook/gui/contact-list-editor/e-contact-list-editor.c new file mode 100644 index 0000000000..f95cb936af --- /dev/null +++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.c @@ -0,0 +1,499 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* e-contact-list-editor.c + * Copyright (C) 2000 Helix Code, Inc. + * Author: Chris Toshok + * + * This library 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 library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "e-contact-list-editor.h" +#include "e-contact-list-model.h" + +#include +#include +#include +#include "widgets/misc/e-dateedit.h" + +/* Signal IDs */ +enum { + LIST_ADDED, + LIST_MODIFIED, + LIST_DELETED, + EDITOR_CLOSED, + LAST_SIGNAL +}; + +static void e_contact_list_editor_init (EContactListEditor *editor); +static void e_contact_list_editor_class_init (EContactListEditorClass *klass); +static void e_contact_list_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); +static void e_contact_list_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); +static void e_contact_list_editor_destroy (GtkObject *object); + +static void create_ui (EContactListEditor *ce); +static void set_editable (EContactListEditor *editor); +static void command_state_changed (EContactListEditor *editor); + +static void add_email_cb (GtkWidget *w, EContactListEditor *editor); +static void remove_entry_cb (GtkWidget *w, EContactListEditor *editor); +static void list_name_changed_cb (GtkWidget *w, EContactListEditor *editor); + +static GtkObjectClass *parent_class = NULL; + +static guint contact_list_editor_signals[LAST_SIGNAL]; + +/* The arguments we take */ +enum { + ARG_0, + ARG_BOOK, + ARG_CARD, + ARG_IS_NEW_LIST, + ARG_EDITABLE +}; + +GtkType +e_contact_list_editor_get_type (void) +{ + static GtkType contact_list_editor_type = 0; + + if (!contact_list_editor_type) + { + static const GtkTypeInfo contact_list_editor_info = + { + "EContactListEditor", + sizeof (EContactListEditor), + sizeof (EContactListEditorClass), + (GtkClassInitFunc) e_contact_list_editor_class_init, + (GtkObjectInitFunc) e_contact_list_editor_init, + /* reserved_1 */ NULL, + /* reserved_2 */ NULL, + (GtkClassInitFunc) NULL, + }; + + contact_list_editor_type = gtk_type_unique (GTK_TYPE_OBJECT, &contact_list_editor_info); + } + + return contact_list_editor_type; +} + + +typedef void (*GtkSignal_NONE__INT_OBJECT) (GtkObject * object, + gint arg1, + GtkObject *arg2, + gpointer user_data); + +static void +e_marshal_NONE__INT_OBJECT (GtkObject * object, + GtkSignalFunc func, + gpointer func_data, GtkArg * args) +{ + GtkSignal_NONE__INT_OBJECT rfunc; + rfunc = (GtkSignal_NONE__INT_OBJECT) func; + (*rfunc) (object, + GTK_VALUE_INT (args[0]), + GTK_VALUE_OBJECT (args[1]), + func_data); +} + +static void +e_contact_list_editor_class_init (EContactListEditorClass *klass) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass*) klass; + + parent_class = gtk_type_class (GTK_TYPE_OBJECT); + + gtk_object_add_arg_type ("EContactListEditor::book", GTK_TYPE_OBJECT, + GTK_ARG_READWRITE, ARG_BOOK); + gtk_object_add_arg_type ("EContactListEditor::card", GTK_TYPE_OBJECT, + GTK_ARG_READWRITE, ARG_CARD); + gtk_object_add_arg_type ("EContactListEditor::is_new_list", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_IS_NEW_LIST); + gtk_object_add_arg_type ("EContactListEditor::editable", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_EDITABLE); + + contact_list_editor_signals[LIST_ADDED] = + gtk_signal_new ("list_added", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (EContactListEditorClass, list_added), + e_marshal_NONE__INT_OBJECT, + GTK_TYPE_NONE, 2, + GTK_TYPE_INT, GTK_TYPE_OBJECT); + + contact_list_editor_signals[LIST_MODIFIED] = + gtk_signal_new ("list_modified", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (EContactListEditorClass, list_modified), + e_marshal_NONE__INT_OBJECT, + GTK_TYPE_NONE, 2, + GTK_TYPE_INT, GTK_TYPE_OBJECT); + + contact_list_editor_signals[LIST_DELETED] = + gtk_signal_new ("list_deleted", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (EContactListEditorClass, list_deleted), + e_marshal_NONE__INT_OBJECT, + GTK_TYPE_NONE, 2, + GTK_TYPE_INT, GTK_TYPE_OBJECT); + + contact_list_editor_signals[EDITOR_CLOSED] = + gtk_signal_new ("editor_closed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (EContactListEditorClass, editor_closed), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + gtk_object_class_add_signals (object_class, contact_list_editor_signals, LAST_SIGNAL); + + object_class->set_arg = e_contact_list_editor_set_arg; + object_class->get_arg = e_contact_list_editor_get_arg; + object_class->destroy = e_contact_list_editor_destroy; +} + +static void +e_contact_list_editor_init (EContactListEditor *editor) +{ + GladeXML *gui; + GtkWidget *bonobo_win; + BonoboUIContainer *container; + + editor->card = NULL; + editor->changed = FALSE; + editor->editable = TRUE; + editor->is_new_list = FALSE; + + gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-list-editor.glade", NULL); + editor->gui = gui; + + editor->app = glade_xml_get_widget (gui, "contact list editor"); + editor->table = glade_xml_get_widget (gui, "contact-list-table"); + editor->add_button = glade_xml_get_widget (editor->gui, "add-email-button"); + editor->remove_button = glade_xml_get_widget (editor->gui, "remove-button"); + editor->email_entry =glade_xml_get_widget (gui, "email-entry"); + editor->list_name_entry =glade_xml_get_widget (gui, "list-name-entry"); + editor->model = gtk_object_get_data (GTK_OBJECT(editor->table), "model"); + + /* Construct the app */ + bonobo_win = bonobo_window_new ("contact-list-editor", "Contact List Editor"); + + /* FIXME: The sucking bit */ + { + GtkWidget *contents; + + contents = gnome_dock_get_client_area ( + GNOME_DOCK (GNOME_APP (editor->app)->dock)); + if (!contents) { + g_message ("contact_list_editor_construct(): Could not get contents"); + return; + } + gtk_widget_ref (contents); + gtk_container_remove (GTK_CONTAINER (contents->parent), contents); + bonobo_window_set_contents (BONOBO_WINDOW (bonobo_win), contents); + gtk_widget_destroy (editor->app); + editor->app = bonobo_win; + } + + /* Build the menu and toolbar */ + + container = bonobo_ui_container_new (); + bonobo_ui_container_set_win (container, BONOBO_WINDOW (editor->app)); + + editor->uic = bonobo_ui_component_new_default (); + if (!editor->uic) { + g_message ("e_contact_list_editor_init(): eeeeek, could not create the UI handler!"); + return; + } + bonobo_ui_component_set_container (editor->uic, + bonobo_object_corba_objref ( + BONOBO_OBJECT (container))); + + create_ui (editor); + + /* connect signals */ + gtk_signal_connect (GTK_OBJECT(editor->add_button), + "clicked", GTK_SIGNAL_FUNC(add_email_cb), editor); + gtk_signal_connect (GTK_OBJECT(editor->email_entry), + "activate", GTK_SIGNAL_FUNC(add_email_cb), editor); + gtk_signal_connect (GTK_OBJECT(editor->remove_button), + "clicked", GTK_SIGNAL_FUNC(remove_entry_cb), editor); + gtk_signal_connect (GTK_OBJECT(editor->list_name_entry), + "changed", GTK_SIGNAL_FUNC(list_name_changed_cb), editor); + + command_state_changed (editor); + + /* Connect to the deletion of the dialog */ + +#if 0 + gtk_signal_connect (GTK_OBJECT (editor->app), "delete_event", + GTK_SIGNAL_FUNC (app_delete_event_cb), editor); +#endif +} + +static void +e_contact_list_editor_destroy (GtkObject *object) +{ +} + +static +BonoboUIVerb verbs [] = { +#if 0 + BONOBO_UI_UNSAFE_VERB ("ContactEditorSave", file_save_cb), + BONOBO_UI_UNSAFE_VERB ("ContactEditorSaveAs", file_save_as_cb), + BONOBO_UI_UNSAFE_VERB ("ContactEditorSaveClose", tb_save_and_close_cb), + BONOBO_UI_UNSAFE_VERB ("ContactEditorSendAs", file_send_as_cb), + BONOBO_UI_UNSAFE_VERB ("ContactEditorSendTo", file_send_to_cb), + BONOBO_UI_UNSAFE_VERB ("ContactEditorDelete", delete_cb), + BONOBO_UI_UNSAFE_VERB ("ContactEditorPrint", print_cb), + BONOBO_UI_UNSAFE_VERB ("ContactEditorPrintEnvelope", print_envelope_cb), + /* BONOBO_UI_UNSAFE_VERB ("ContactEditorPageSetup", file_page_setup_menu), */ + BONOBO_UI_UNSAFE_VERB ("ContactEditorClose", file_close_cb), +#endif + BONOBO_UI_VERB_END +}; + +static void +create_ui (EContactListEditor *ce) +{ + bonobo_ui_component_add_verb_list_with_data ( + ce->uic, verbs, ce); + + bonobo_ui_util_set_ui (ce->uic, EVOLUTION_DATADIR, + "evolution-contact-list-editor.xml", + "evolution-contact-list-editor"); +} + +EContactListEditor * +e_contact_list_editor_new (EBook *book, + ECard *list_card, + gboolean is_new_list, + gboolean editable) +{ + EContactListEditor *ce; + + ce = E_CONTACT_LIST_EDITOR (gtk_type_new (E_CONTACT_LIST_EDITOR_TYPE)); + + gtk_object_set (GTK_OBJECT (ce), + "book", book, + "card", list_card, + "is_new_list", is_new_list, + "editable", editable, + NULL); + + return ce; +} + +static void +e_contact_list_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) +{ + EContactListEditor *editor; + + editor = E_CONTACT_LIST_EDITOR (o); + + switch (arg_id){ + case ARG_BOOK: + if (editor->book) + gtk_object_unref(GTK_OBJECT(editor->book)); + editor->book = E_BOOK(GTK_VALUE_OBJECT (*arg)); + gtk_object_ref (GTK_OBJECT (editor->book)); + /* XXX more here about editable/etc. */ + break; + case ARG_CARD: + if (editor->card) + gtk_object_unref(GTK_OBJECT(editor->card)); + editor->card = e_card_duplicate(E_CARD(GTK_VALUE_OBJECT (*arg))); +#if 0 + fill_in_info(editor); +#endif + editor->changed = FALSE; + break; + + case ARG_IS_NEW_LIST: { + gboolean new_value = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; + gboolean changed = (editor->is_new_list != new_value); + + editor->is_new_list = new_value; + + if (changed) + command_state_changed (editor); + break; + } + + case ARG_EDITABLE: { + gboolean new_value = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; + gboolean changed = (editor->editable != new_value); + + editor->editable = new_value; + + if (changed) { + set_editable (editor); + command_state_changed (editor); + } + break; + } + + } +} + +static void +e_contact_list_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) +{ + EContactListEditor *editor; + + editor = E_CONTACT_LIST_EDITOR (object); + + switch (arg_id) { + case ARG_BOOK: + GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(editor->book); + break; + + case ARG_CARD: +#if 0 + e_card_simple_sync_card(editor->simple); + extract_info(editor); +#endif + GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(editor->card); + break; + + case ARG_IS_NEW_LIST: + GTK_VALUE_BOOL (*arg) = editor->is_new_list ? TRUE : FALSE; + break; + + case ARG_EDITABLE: + GTK_VALUE_BOOL (*arg) = editor->editable ? TRUE : FALSE; + break; + default: + arg->type = GTK_TYPE_INVALID; + break; + } +} + +void +e_contact_list_editor_show (EContactListEditor *editor) +{ + gtk_widget_show (editor->app); +} + +void +e_contact_list_editor_close (EContactListEditor *editor) +{ +} + +void +e_contact_list_editor_raise (EContactListEditor *editor) +{ +} + +#define SPEC " \ + \ + \ + \ + \ + \ +" + +GtkWidget * +e_contact_list_editor_create_table(gchar *name, + gchar *string1, gchar *string2, + gint int1, gint int2); + +GtkWidget * +e_contact_list_editor_create_table(gchar *name, + gchar *string1, gchar *string2, + gint int1, gint int2) +{ + + ETableModel *model; + GtkWidget *table; + + model = e_contact_list_model_new (); + + table = e_table_scrolled_new (model, NULL, SPEC, NULL); + + gtk_object_set_data(GTK_OBJECT(table), "model", model); + + return table; +} + +static void +add_email_cb (GtkWidget *w, EContactListEditor *editor) +{ + char *text = gtk_entry_get_text (GTK_ENTRY(editor->email_entry)); + + if (text && *text) + e_contact_list_model_add_email (E_CONTACT_LIST_MODEL(editor->model), text); + + gtk_entry_set_text (GTK_ENTRY(editor->email_entry), ""); + + if (!editor->changed) { + editor->changed = TRUE; + command_state_changed (editor); + } +} + +static void +remove_row (int model_row, EContactListEditor *editor) +{ + e_contact_list_model_remove_row (E_CONTACT_LIST_MODEL (editor->model), model_row); +} + +static void +remove_entry_cb (GtkWidget *w, EContactListEditor *editor) +{ + e_table_selected_row_foreach (e_table_scrolled_get_table(E_TABLE_SCROLLED(editor->table)), + (EForeachFunc)remove_row, editor); +} + +static void +list_name_changed_cb (GtkWidget *w, EContactListEditor *editor) +{ + if (!editor->changed) { + editor->changed = TRUE; + command_state_changed (editor); + } +} + +static void +set_editable (EContactListEditor *editor) +{ + gtk_widget_set_sensitive (editor->email_entry, editor->editable); + gtk_widget_set_sensitive (editor->list_name_entry, editor->editable); + gtk_widget_set_sensitive (editor->add_button, editor->editable); + gtk_widget_set_sensitive (editor->remove_button, editor->editable); + gtk_widget_set_sensitive (editor->table, editor->editable); +} + +static void +command_state_changed (EContactListEditor *editor) +{ + bonobo_ui_component_set_prop (editor->uic, + "/commands/ContactListEditorSaveClose", + "sensitive", + editor->changed && editor->editable ? "1" : "0", NULL); + + bonobo_ui_component_set_prop (editor->uic, + "/commands/ContactListEditorSave", + "sensitive", + editor->changed && editor->editable ? "1" : "0", NULL); + + bonobo_ui_component_set_prop (editor->uic, + "/commands/ContactListEditorDelete", + "sensitive", + editor->editable && !editor->is_new_list ? "1" : "0", NULL); +} diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.h b/addressbook/gui/contact-list-editor/e-contact-list-editor.h new file mode 100644 index 0000000000..55badc3016 --- /dev/null +++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.h @@ -0,0 +1,108 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* e-contact-list-editor.h + * Copyright (C) 2000 Helix Code, Inc. + * Author: Chris Toshok + * + * This library 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 library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __E_CONTACT_LIST_EDITOR_H__ +#define __E_CONTACT_LIST_EDITOR_H__ + +#include +#include +#include +#include +#include + +#include "addressbook/backend/ebook/e-book.h" +#include "addressbook/backend/ebook/e-card.h" +#include "addressbook/backend/ebook/e-card-simple.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define E_CONTACT_LIST_EDITOR_TYPE (e_contact_list_editor_get_type ()) +#define E_CONTACT_LIST_EDITOR(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_LIST_EDITOR_TYPE, EContactListEditor)) +#define E_CONTACT_LIST_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_LIST_EDITOR_TYPE, EContactListEditorClass)) +#define E_IS_CONTACT_LIST_EDITOR(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_LIST_EDITOR_TYPE)) +#define E_IS_CONTACT_LIST_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_LIST_EDITOR_TYPE)) + + +typedef struct _EContactListEditor EContactListEditor; +typedef struct _EContactListEditorClass EContactListEditorClass; + +struct _EContactListEditor +{ + GtkObject object; + + /* item specific fields */ + EBook *book; + ECard *card; + + /* UI handler */ + BonoboUIComponent *uic; + + GladeXML *gui; + GtkWidget *app; + + GtkWidget *table; + ETableModel *model; + GtkWidget *email_entry; + GtkWidget *list_name_entry; + GtkWidget *add_button; + GtkWidget *remove_button; + + /* Whether we are editing a new card or an existing one */ + guint is_new_list : 1; + + /* Whether the card has been changed since bringing up the contact editor */ + guint changed : 1; + + /* Whether the contact editor will accept modifications */ + guint editable : 1; +}; + +struct _EContactListEditorClass +{ + GtkObjectClass parent_class; + + /* Notification signals */ + + void (* list_added) (EContactListEditor *cle, EBookStatus status, ECard *card); + void (* list_modified) (EContactListEditor *cle, EBookStatus status, ECard *card); + void (* list_deleted) (EContactListEditor *cle, EBookStatus status, ECard *card); + void (* editor_closed) (EContactListEditor *cle); +}; + +EContactListEditor *e_contact_list_editor_new (EBook *book, + ECard *list_card, + gboolean is_new_list, + gboolean editable); +GtkType e_contact_list_editor_get_type (void); +void e_contact_list_editor_show (EContactListEditor *editor); +void e_contact_list_editor_close (EContactListEditor *editor); +void e_contact_list_editor_raise (EContactListEditor *editor); + +gboolean e_contact_list_editor_confirm_delete (GtkWindow *parent); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __E_CONTACT_LIST_EDITOR_H__ */ diff --git a/addressbook/gui/contact-list-editor/e-contact-list-model.c b/addressbook/gui/contact-list-editor/e-contact-list-model.c new file mode 100644 index 0000000000..8d8831a6ab --- /dev/null +++ b/addressbook/gui/contact-list-editor/e-contact-list-model.c @@ -0,0 +1,190 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +#include +#include "e-contact-list-model.h" + +#define PARENT_TYPE e_table_model_get_type() +ETableModelClass *parent_class; + +#define COLS 1 + +/* This function returns the number of columns in our ETableModel. */ +static int +contact_list_col_count (ETableModel *etc) +{ + return COLS; +} + +/* This function returns the number of rows in our ETableModel. */ +static int +contact_list_row_count (ETableModel *etc) +{ + EContactListModel *model = E_CONTACT_LIST_MODEL (etc); + return model->simple_count + model->email_count; +} + +/* This function returns the value at a particular point in our ETableModel. */ +static void * +contact_list_value_at (ETableModel *etc, int col, int row) +{ + EContactListModel *model = E_CONTACT_LIST_MODEL (etc); + + if (row < model->simple_count) + return (char*)e_card_simple_get_const (model->simples[row], E_CARD_SIMPLE_FIELD_EMAIL); + else + return model->emails [row - model->simple_count]; +} + +/* This function sets the value at a particular point in our ETableModel. */ +static void +contact_list_set_value_at (ETableModel *etc, int col, int row, const void *val) +{ + /* nothing */ +} + +/* This function returns whether a particular cell is editable. */ +static gboolean +contact_list_is_cell_editable (ETableModel *etc, int col, int row) +{ + return FALSE; +} + +/* This function duplicates the value passed to it. */ +static void * +contact_list_duplicate_value (ETableModel *etc, int col, const void *value) +{ + return g_strdup(value); +} + +/* This function frees the value passed to it. */ +static void +contact_list_free_value (ETableModel *etc, int col, void *value) +{ + g_free(value); +} + +static void * +contact_list_initialize_value (ETableModel *etc, int col) +{ + return g_strdup(""); +} + +static gboolean +contact_list_value_is_empty (ETableModel *etc, int col, const void *value) +{ + return !(value && *(char *)value); +} + +static char * +contact_list_value_to_string (ETableModel *etc, int col, const void *value) +{ + return g_strdup(value); +} + +static void +contact_list_model_destroy (GtkObject *o) +{ +} + +static void +e_contact_list_model_class_init (GtkObjectClass *object_class) +{ + ETableModelClass *model_class = (ETableModelClass *) object_class; + + parent_class = gtk_type_class (PARENT_TYPE); + + object_class->destroy = contact_list_model_destroy; + + model_class->column_count = contact_list_col_count; + model_class->row_count = contact_list_row_count; + model_class->value_at = contact_list_value_at; + model_class->set_value_at = contact_list_set_value_at; + model_class->is_cell_editable = contact_list_is_cell_editable; + model_class->duplicate_value = contact_list_duplicate_value; + model_class->free_value = contact_list_free_value; + model_class->initialize_value = contact_list_initialize_value; + model_class->value_is_empty = contact_list_value_is_empty; + model_class->value_to_string = contact_list_value_to_string; +} + +static void +e_contact_list_model_init (GtkObject *object) +{ + EContactListModel *model = E_CONTACT_LIST_MODEL(object); + + model->simples = NULL; + model->simple_count = 0; + model->emails = NULL; + model->email_count = 0; +} + +GtkType +e_contact_list_model_get_type (void) +{ + static GtkType type = 0; + + if (!type){ + GtkTypeInfo info = { + "EContactListModel", + sizeof (EContactListModel), + sizeof (EContactListModelClass), + (GtkClassInitFunc) e_contact_list_model_class_init, + (GtkObjectInitFunc) e_contact_list_model_init, + NULL, /* reserved 1 */ + NULL, /* reserved 2 */ + (GtkClassInitFunc) NULL + }; + + type = gtk_type_unique (PARENT_TYPE, &info); + } + + return type; +} + +void +e_contact_list_model_construct (EContactListModel *model) +{ +} + +ETableModel * +e_contact_list_model_new () +{ + EContactListModel *model; + + model = gtk_type_new (e_contact_list_model_get_type ()); + + e_contact_list_model_construct (model); + + return E_TABLE_MODEL(model); +} + +void +e_contact_list_model_add_email (EContactListModel *model, + const char *email) +{ + model->email_count ++; + model->emails = g_renew (char*, model->emails, model->email_count); + model->emails[model->email_count - 1] = g_strdup (email); + e_table_model_changed (E_TABLE_MODEL (model)); +} + +void +e_contact_list_model_add_card (EContactListModel *model, + ECardSimple *simple) +{ +} + +void +e_contact_list_model_remove_row (EContactListModel *model, int row) +{ + if (row < model->simple_count) { + memcpy (model->simples + row, model->simples + row + 1, model->simple_count - row); + model->simple_count --; + } + else { + int email_row = row - model->simple_count; + memcpy (model->emails + email_row, model->emails + email_row + 1, model->email_count - email_row); + model->email_count --; + } + e_table_model_row_deleted (E_TABLE_MODEL (model), row); +} diff --git a/addressbook/gui/contact-list-editor/e-contact-list-model.h b/addressbook/gui/contact-list-editor/e-contact-list-model.h new file mode 100644 index 0000000000..da9be77b49 --- /dev/null +++ b/addressbook/gui/contact-list-editor/e-contact-list-model.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +#ifndef _E_CONTACT_LIST_MODEL_H_ +#define _E_CONTACT_LIST_MODEL_H_ + +#include +#include "addressbook/backend/ebook/e-book.h" +#include "addressbook/backend/ebook/e-book-view.h" +#include "addressbook/backend/ebook/e-card-simple.h" + +#define E_CONTACT_LIST_MODEL_TYPE (e_contact_list_model_get_type ()) +#define E_CONTACT_LIST_MODEL(o) (GTK_CHECK_CAST ((o), E_CONTACT_LIST_MODEL_TYPE, EContactListModel)) +#define E_CONTACT_LIST_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CONTACT_LIST_MODEL_TYPE, EContactListModelClass)) +#define E_IS_CONTACT_LIST_MODEL(o) (GTK_CHECK_TYPE ((o), E_CONTACT_LIST_MODEL_TYPE)) +#define E_IS_CONTACT_LIST_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CONTACT_LIST_MODEL_TYPE)) + +typedef struct _EContactListModel EContactListModel; +typedef struct _EContactListModelClass EContactListModelClass; + +struct _EContactListModel { + ETableModel parent; + + ECardSimple **simples; + int simple_count; + char **emails; + int email_count; +}; + + +struct _EContactListModelClass { + ETableModelClass parent_class; +}; + + +GtkType e_contact_list_model_get_type (void); +void e_contact_list_model_construct (EContactListModel *model); +ETableModel *e_contact_list_model_new (void); + +void e_contact_list_model_add_email (EContactListModel *model, const char *email); +void e_contact_list_model_add_card (EContactListModel *model, ECardSimple *simple); +void e_contact_list_model_remove_row (EContactListModel *model, int row); + +#endif /* _E_CONTACT_LIST_MODEL_H_ */ -- cgit v1.2.3