aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/gui')
-rw-r--r--addressbook/gui/Makefile.am2
-rw-r--r--addressbook/gui/component/Makefile.am42
-rw-r--r--addressbook/gui/component/addressbook.c38
-rw-r--r--addressbook/gui/component/e-address-popup.c4
-rw-r--r--addressbook/gui/component/e-address-widget.c2
-rw-r--r--addressbook/gui/component/select-names/e-select-names-popup.c4
-rw-r--r--addressbook/gui/component/select-names/e-select-names-text-model.c2
-rw-r--r--addressbook/gui/contact-list-editor/.cvsignore3
-rw-r--r--addressbook/gui/contact-list-editor/Makefile.am29
-rw-r--r--addressbook/gui/contact-list-editor/contact-list-editor.glade287
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-editor.c499
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-editor.h108
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-model.c190
-rw-r--r--addressbook/gui/contact-list-editor/e-contact-list-model.h42
-rw-r--r--addressbook/gui/widgets/Makefile.am8
-rw-r--r--addressbook/gui/widgets/e-addressbook-util.c57
-rw-r--r--addressbook/gui/widgets/e-addressbook-util.h6
-rw-r--r--addressbook/gui/widgets/e-minicard.h2
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"