diff options
Diffstat (limited to 'addressbook/gui')
18 files changed, 1258 insertions, 67 deletions
diff --git a/addressbook/gui/Makefile.am b/addressbook/gui/Makefile.am index 8ba306c0d3..6b0850da5d 100644 --- a/addressbook/gui/Makefile.am +++ b/addressbook/gui/Makefile.am @@ -1 +1 @@ -SUBDIRS = merging widgets search component +SUBDIRS = contact-editor contact-list-editor merging widgets search component diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am index 6f38d86436..d58c768328 100644 --- a/addressbook/gui/component/Makefile.am +++ b/addressbook/gui/component/Makefile.am @@ -1,24 +1,25 @@ SUBDIRS = select-names -INCLUDES = \ - -DG_LOG_DOMAIN=\"evolution-addressbook\" \ - $(EXTRA_GNOME_CFLAGS) \ - $(GNOME_INCLUDEDIR) \ - -I$(top_srcdir) \ - -I$(top_builddir) \ - -I$(top_srcdir)/shell \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_srcdir)/addressbook/gui/minicard \ - -I$(top_srcdir)/addressbook/gui/widgets \ - -I$(top_srcdir)/addressbook/contact-editor \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - $(BONOBO_HTML_GNOME_CFLAGS) \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \ - -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ +INCLUDES = \ + -DG_LOG_DOMAIN=\"evolution-addressbook\" \ + $(EXTRA_GNOME_CFLAGS) \ + $(GNOME_INCLUDEDIR) \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(top_srcdir)/shell \ + -I$(top_builddir)/shell \ + -I$(top_srcdir)/widgets/misc \ + -I$(top_srcdir)/addressbook/gui/contact-editor \ + -I$(top_srcdir)/addressbook/gui/contact-list-editor \ + -I$(top_srcdir)/addressbook/gui/minicard \ + -I$(top_srcdir)/addressbook/gui/widgets \ + -I$(top_srcdir)/addressbook/backend \ + -I$(top_builddir)/addressbook/backend \ + $(BONOBO_HTML_GNOME_CFLAGS) \ + -DEVOLUTION_DATADIR=\""$(datadir)"\" \ + -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ + -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \ + -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ -DCAMEL_PROVIDERDIR=\""$(providerdir)"\" bin_PROGRAMS = \ @@ -49,7 +50,8 @@ evolution_addressbook_LDADD = \ $(top_builddir)/addressbook/gui/widgets/libeminicard.a \ $(top_builddir)/addressbook/backend/ebook/libebook.la \ $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \ + $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.a \ + $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.a \ $(top_builddir)/libversit/libversit.la \ $(top_builddir)/widgets/misc/libemiscwidgets.a \ $(top_builddir)/addressbook/printing/libecontactprint.a \ diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c index 2936855d57..bd51a3515e 100644 --- a/addressbook/gui/component/addressbook.c +++ b/addressbook/gui/component/addressbook.c @@ -68,6 +68,21 @@ new_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) } static void +new_contact_list_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + EBook *book; + AddressbookView *view = (AddressbookView *) user_data; + + gtk_object_get(GTK_OBJECT(view->view), + "book", &book, + NULL); + + g_assert (E_IS_BOOK (book)); + + e_addressbook_show_contact_list_editor (book, e_card_new(""), TRUE, e_addressbook_view_can_create(view->view)); +} + +static void config_cb (BonoboUIComponent *uih, void *user_data, const char *path) { addressbook_config (NULL /* XXX */); @@ -102,13 +117,6 @@ print_cb (BonoboUIComponent *uih, void *user_data, const char *path) } static void -show_all_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - e_addressbook_view_show_all(view->view); -} - -static void stop_loading_cb (BonoboUIComponent *uih, void *user_data, const char *path) { AddressbookView *view = (AddressbookView *) user_data; @@ -153,6 +161,10 @@ update_command_state (EAddressbookView *eav, AddressbookView *view) "/commands/ContactNew", "sensitive", e_addressbook_view_can_create (view->view) ? "1" : "0", NULL); + bonobo_ui_component_set_prop (uic, + "/commands/ContactNewList", + "sensitive", + e_addressbook_view_can_create (view->view) ? "1" : "0", NULL); /* Print Contact */ bonobo_ui_component_set_prop (uic, @@ -184,14 +196,6 @@ update_command_state (EAddressbookView *eav, AddressbookView *view) e_addressbook_view_can_select_all (view->view) ? "1" : "0", NULL); - /* View All Contacts */ -#if 0 - /* this is always enabled */ - bonobo_ui_component_set_prop (uic, - "/Toolbar/ContactViewAll", - "sensitive", "1", NULL); -#endif - /* Stop */ bonobo_ui_component_set_prop (uic, "/commands/ContactStop", @@ -212,8 +216,8 @@ BonoboUIVerb verbs [] = { BONOBO_UI_UNSAFE_VERB ("AddressbookConfig", config_cb), BONOBO_UI_UNSAFE_VERB ("ContactNew", new_contact_cb), + BONOBO_UI_UNSAFE_VERB ("ContactNewList", new_contact_list_cb), BONOBO_UI_UNSAFE_VERB ("ContactDelete", delete_contact_cb), - BONOBO_UI_UNSAFE_VERB ("ContactViewAll", show_all_contacts_cb), BONOBO_UI_UNSAFE_VERB ("ContactStop", stop_loading_cb), BONOBO_UI_UNSAFE_VERB ("ContactsCut", cut_contacts_cb), @@ -230,8 +234,8 @@ static EPixmap pixmaps [] = { E_PIXMAP ("/menu/File/Print/ContactsPrintPreview", "print-preview.xpm"), E_PIXMAP ("/menu/Tools/Component/AddressbookConfig", "configure_16_addressbook.xpm"), - E_PIXMAP ("/Toolbar/ContactViewAll", "all_contacts.xpm"), E_PIXMAP ("/Toolbar/ContactNew", "new_contact.xpm"), + E_PIXMAP ("/Toolbar/ContactNewList", "all_contacts.xpm"), E_PIXMAP_END }; diff --git a/addressbook/gui/component/e-address-popup.c b/addressbook/gui/component/e-address-popup.c index 0d01e3f162..cedaf84a5f 100644 --- a/addressbook/gui/component/e-address-popup.c +++ b/addressbook/gui/component/e-address-popup.c @@ -34,8 +34,8 @@ #include <gal/widgets/e-unicode.h> #include <addressbook/backend/ebook/e-book.h> #include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/contact-editor/e-contact-editor.h> -#include <addressbook/contact-editor/e-contact-quick-add.h> +#include <addressbook/gui/contact-editor/e-contact-editor.h> +#include <addressbook/gui/contact-editor/e-contact-quick-add.h> #include <addressbook/gui/widgets/e-minicard-widget.h> #include <addressbook/gui/widgets/e-addressbook-util.h> static GtkObjectClass *parent_class; diff --git a/addressbook/gui/component/e-address-widget.c b/addressbook/gui/component/e-address-widget.c index f69ce5c58d..2f81c70b36 100644 --- a/addressbook/gui/component/e-address-widget.c +++ b/addressbook/gui/component/e-address-widget.c @@ -30,7 +30,7 @@ #include <bonobo/bonobo-control.h> #include <bonobo/bonobo-property-bag.h> #include <bonobo/bonobo-generic-factory.h> -#include <addressbook/contact-editor/e-contact-quick-add.h> +#include <addressbook/gui/contact-editor/e-contact-quick-add.h> #include "e-address-widget.h" static void e_address_widget_class_init (EAddressWidgetClass *klass); diff --git a/addressbook/gui/component/select-names/e-select-names-popup.c b/addressbook/gui/component/select-names/e-select-names-popup.c index 03dadf2d80..fb05ff686a 100644 --- a/addressbook/gui/component/select-names/e-select-names-popup.c +++ b/addressbook/gui/component/select-names/e-select-names-popup.c @@ -39,8 +39,8 @@ #include <libgnomeui/gnome-popup-menu.h> #include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/contact-editor/e-contact-editor.h> -#include <addressbook/contact-editor/e-contact-quick-add.h> +#include <addressbook/gui/contact-editor/e-contact-editor.h> +#include <addressbook/gui/contact-editor/e-contact-quick-add.h> #include "e-addressbook-util.h" #include "e-select-names-popup.h" diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.c b/addressbook/gui/component/select-names/e-select-names-text-model.c index c9d1d1177f..7c87c887f5 100644 --- a/addressbook/gui/component/select-names/e-select-names-text-model.c +++ b/addressbook/gui/component/select-names/e-select-names-text-model.c @@ -16,7 +16,7 @@ #include <gal/e-text/e-text-model-repos.h> -#include <addressbook/contact-editor/e-contact-editor.h> +#include <addressbook/gui/contact-editor/e-contact-editor.h> #include "e-select-names-text-model.h" #include "e-addressbook-util.h" 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 @@ +<?xml version="1.0"?> +<GTK-Interface> + +<project> + <name>contact-list-editor</name> + <program_name>contact-list-editor</program_name> + <directory></directory> + <source_directory>src</source_directory> + <pixmaps_directory>pixmaps</pixmaps_directory> + <language>C</language> + <gnome_support>True</gnome_support> + <gettext_support>True</gettext_support> +</project> + +<widget> + <class>GnomeApp</class> + <name>contact list editor</name> + <title>contact-list-editor</title> + <type>GTK_WINDOW_TOPLEVEL</type> + <position>GTK_WIN_POS_NONE</position> + <modal>False</modal> + <allow_shrink>False</allow_shrink> + <allow_grow>True</allow_grow> + <auto_shrink>False</auto_shrink> + <enable_layout_config>True</enable_layout_config> + + <widget> + <class>GnomeDock</class> + <child_name>GnomeApp:dock</child_name> + <name>dock1</name> + <allow_floating>True</allow_floating> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + + <widget> + <class>GtkTable</class> + <child_name>GnomeDock:contents</child_name> + <name>table1</name> + <border_width>13</border_width> + <rows>6</rows> + <columns>4</columns> + <homogeneous>False</homogeneous> + <row_spacing>5</row_spacing> + <column_spacing>5</column_spacing> + + <widget> + <class>Custom</class> + <name>contact-list-table</name> + <creation_function>e_contact_list_editor_create_table</creation_function> + <string1></string1> + <int1>0</int1> + <int2>0</int2> + <last_modification_time>Sat, 23 Jun 2001 06:00:16 GMT</last_modification_time> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>4</top_attach> + <bottom_attach>6</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>True</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + </widget> + + <widget> + <class>GtkEntry</class> + <name>email-entry</name> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>3</top_attach> + <bottom_attach>4</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label1</name> + <label>Type an email address or drag a contact into the list below</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label2</name> + <label>List Name:</label> + <justify>GTK_JUSTIFY_LEFT</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkEntry</class> + <name>list-name-entry</name> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkVButtonBox</class> + <name>vbuttonbox2</name> + <layout_style>GTK_BUTTONBOX_START</layout_style> + <spacing>10</spacing> + <child_min_width>85</child_min_width> + <child_min_height>27</child_min_height> + <child_ipad_x>7</child_ipad_x> + <child_ipad_y>0</child_ipad_y> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>4</top_attach> + <bottom_attach>6</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + + <widget> + <class>GtkButton</class> + <name>remove-button</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <label>Remove</label> + <relief>GTK_RELIEF_NORMAL</relief> + </widget> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator1</name> + <child> + <left_attach>1</left_attach> + <right_attach>4</right_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + </widget> + + <widget> + <class>GtkVButtonBox</class> + <name>vbuttonbox3</name> + <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style> + <spacing>10</spacing> + <child_min_width>85</child_min_width> + <child_min_height>27</child_min_height> + <child_ipad_x>0</child_ipad_x> + <child_ipad_y>0</child_ipad_y> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>3</top_attach> + <bottom_attach>4</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + + <widget> + <class>GtkButton</class> + <name>add-email-button</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <label>Add</label> + <relief>GTK_RELIEF_NORMAL</relief> + </widget> + </widget> + + <widget> + <class>Custom</class> + <name>custom2</name> + <creation_function>e_create_image_widget</creation_function> + <string1>evolution-contacts-plain.png</string1> + <int1>0</int1> + <int2>0</int2> + <last_modification_time>Sat, 23 Jun 2001 05:59:21 GMT</last_modification_time> + <child> + <left_attach>0</left_attach> + <right_attach>1</right_attach> + <top_attach>0</top_attach> + <bottom_attach>6</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + </widget> + </widget> + </widget> +</widget> + +</GTK-Interface> 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 <toshok@helixcode.com> + * + * 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 <bonobo/bonobo-ui-container.h> +#include <bonobo/bonobo-ui-util.h> +#include <gal/e-table/e-table-scrolled.h> +#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 "<ETableSpecification no-headers=\"true\" cursor-mode=\"line\" selection-mode=\"single\"> \ + <ETableColumn model_col= \"0\" _title=\"Contact\" expansion=\"1.0\" minimum_width=\"20\" resizable=\"true\" cell=\"string\" compare=\"string\"/> \ + <ETableState> \ + <column source=\"0\"/> \ + <grouping> <leaf column=\"0\" ascending=\"true\"/> </grouping> \ + </ETableState> \ +</ETableSpecification>" + +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 <toshok@helixcode.com> + * + * 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 <libgnomeui/gnome-app.h> +#include <libgnomeui/gnome-app-helper.h> +#include <bonobo/bonobo-ui-component.h> +#include <glade/glade.h> +#include <gal/e-table/e-table-model.h> + +#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 <config.h> +#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 <gal/e-table/e-table-model.h> +#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_ */ diff --git a/addressbook/gui/widgets/Makefile.am b/addressbook/gui/widgets/Makefile.am index a375965a66..9619363732 100644 --- a/addressbook/gui/widgets/Makefile.am +++ b/addressbook/gui/widgets/Makefile.am @@ -4,7 +4,7 @@ INCLUDES = \ -DEVOLUTION_DATADIR=\""$(datadir)"\" \ -I$(top_srcdir) \ -I$(top_srcdir)/addressbook/backend/ebook \ - -I$(top_srcdir)/addressbook/contact-editor \ + -I$(top_srcdir)/addressbook/gui/contact-editor \ -I$(top_srcdir)/addressbook/gui/merging \ -I$(top_srcdir)/widgets/misc \ $(BONOBO_GNOME_CFLAGS) \ @@ -66,7 +66,8 @@ minicard_test_LDADD = \ $(top_builddir)/e-util/libeutil.la \ $(top_builddir)/libversit/libversit.la \ $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \ + $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.a \ + $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.a \ $(top_builddir)/addressbook/printing/libecontactprint.a \ $(top_builddir)/addressbook/gui/merging/libecardmerging.a \ $(top_builddir)/widgets/misc/libemiscwidgets.a \ @@ -118,7 +119,8 @@ minicard_widget_test_LDADD = \ $(top_builddir)/e-util/libeutil.la \ $(top_builddir)/libversit/libversit.la \ $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \ + $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.a \ + $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.a \ $(top_builddir)/addressbook/printing/libecontactprint.a \ $(top_builddir)/widgets/misc/libemiscwidgets.a \ $(top_builddir)/e-util/libeutil.la \ diff --git a/addressbook/gui/widgets/e-addressbook-util.c b/addressbook/gui/widgets/e-addressbook-util.c index 7ec044adf8..9aaa554547 100644 --- a/addressbook/gui/widgets/e-addressbook-util.c +++ b/addressbook/gui/widgets/e-addressbook-util.c @@ -25,7 +25,6 @@ #include <gnome.h> #include "e-addressbook-util.h" -#include "e-contact-editor.h" #include "e-card-merging.h" void @@ -53,39 +52,38 @@ e_addressbook_error_dialog (const gchar *msg, EBookStatus status) static void -card_added_cb (EBook* book, EBookStatus status, const char *id, - gpointer user_data) +added_cb (EBook* book, EBookStatus status, const char *id, + gboolean is_list) { - g_print ("%s: %s(): a card was added\n", __FILE__, __FUNCTION__); if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (_("Error adding card"), status); + e_addressbook_error_dialog (is_list ? _("Error adding list") : _("Error adding card"), status); } } static void -card_modified_cb (EBook* book, EBookStatus status, - gpointer user_data) +modified_cb (EBook* book, EBookStatus status, + gboolean is_list) { - g_print ("%s: %s(): a card was modified\n", __FILE__, __FUNCTION__); if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (_("Error modifying card"), status); + e_addressbook_error_dialog (is_list ? _("Error modifying list") : _("Error modifying card"), + status); } } static void -card_deleted_cb (EBook* book, EBookStatus status, - gpointer user_data) +deleted_cb (EBook* book, EBookStatus status, + gboolean is_list) { - g_print ("%s: %s(): a card was removed\n", __FILE__, __FUNCTION__); if (status != E_BOOK_STATUS_SUCCESS) { - e_addressbook_error_dialog (_("Error removing card"), status); + e_addressbook_error_dialog (is_list ? _("Error removing list") : _("Error removing card"), + status); } } static void -editor_closed_cb (EContactEditor *ce, gpointer data) +editor_closed_cb (GtkObject *editor, gpointer data) { - gtk_object_unref (GTK_OBJECT (ce)); + gtk_object_unref (editor); } EContactEditor * @@ -98,13 +96,36 @@ e_addressbook_show_contact_editor (EBook *book, ECard *card, ce = e_contact_editor_new (book, card, is_new_card, editable); gtk_signal_connect (GTK_OBJECT (ce), "card_added", - GTK_SIGNAL_FUNC (card_added_cb), NULL); + GTK_SIGNAL_FUNC (added_cb), GINT_TO_POINTER (FALSE)); gtk_signal_connect (GTK_OBJECT (ce), "card_modified", - GTK_SIGNAL_FUNC (card_modified_cb), NULL); + GTK_SIGNAL_FUNC (modified_cb), GINT_TO_POINTER (FALSE)); gtk_signal_connect (GTK_OBJECT (ce), "card_deleted", - GTK_SIGNAL_FUNC (card_deleted_cb), NULL); + GTK_SIGNAL_FUNC (deleted_cb), GINT_TO_POINTER (FALSE)); gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", GTK_SIGNAL_FUNC (editor_closed_cb), NULL); return ce; } + +EContactListEditor * +e_addressbook_show_contact_list_editor (EBook *book, ECard *card, + gboolean is_new_card, + gboolean editable) +{ + EContactListEditor *ce; + + ce = e_contact_list_editor_new (book, card, is_new_card, editable); + + gtk_signal_connect (GTK_OBJECT (ce), "list_added", + GTK_SIGNAL_FUNC (added_cb), GINT_TO_POINTER (TRUE)); + gtk_signal_connect (GTK_OBJECT (ce), "list_modified", + GTK_SIGNAL_FUNC (modified_cb), GINT_TO_POINTER (TRUE)); + gtk_signal_connect (GTK_OBJECT (ce), "list_deleted", + GTK_SIGNAL_FUNC (deleted_cb), GINT_TO_POINTER (TRUE)); + gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", + GTK_SIGNAL_FUNC (editor_closed_cb), GINT_TO_POINTER (TRUE)); + + e_contact_list_editor_show (ce); + + return ce; +} diff --git a/addressbook/gui/widgets/e-addressbook-util.h b/addressbook/gui/widgets/e-addressbook-util.h index 3e222f7154..1f3ffe074d 100644 --- a/addressbook/gui/widgets/e-addressbook-util.h +++ b/addressbook/gui/widgets/e-addressbook-util.h @@ -22,7 +22,8 @@ #define __E_ADDRESSBOOK_UTIL_H__ #include "addressbook/backend/ebook/e-book.h" -#include "addressbook/contact-editor/e-contact-editor.h" +#include "addressbook/gui/contact-editor/e-contact-editor.h" +#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h" #ifdef __cplusplus extern "C" { @@ -34,6 +35,9 @@ void e_addressbook_error_dialog (const gchar *msg, EContactEditor* e_addressbook_show_contact_editor (EBook *book, ECard *card, gboolean is_new_card, gboolean editable); +EContactListEditor * e_addressbook_show_contact_list_editor (EBook *book, ECard *card, + gboolean is_new_card, + gboolean editable); #ifdef __cplusplus } diff --git a/addressbook/gui/widgets/e-minicard.h b/addressbook/gui/widgets/e-minicard.h index 88c34b97d3..ae54ad63ec 100644 --- a/addressbook/gui/widgets/e-minicard.h +++ b/addressbook/gui/widgets/e-minicard.h @@ -22,7 +22,7 @@ #define __E_MINICARD_H__ #include <libgnomeui/gnome-canvas.h> -#include "addressbook/contact-editor/e-contact-editor.h" +#include "addressbook/gui/contact-editor/e-contact-editor.h" #include "addressbook/backend/ebook/e-card.h" #include "addressbook/backend/ebook/e-card-simple.h" |