aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook
diff options
context:
space:
mode:
authorChristopher James Lahey <clahey@helixcode.com>2000-05-14 22:31:22 +0800
committerChris Lahey <clahey@src.gnome.org>2000-05-14 22:31:22 +0800
commit32471accadcf2099f9d3567f51add9fab197ec24 (patch)
tree8b070bcbdbcd962de9016b0fceaa15ec45848310 /addressbook
parent623ba9a279db035339ac8ae5030683c1e79b8618 (diff)
downloadgsoc2013-evolution-32471accadcf2099f9d3567f51add9fab197ec24.tar.gz
gsoc2013-evolution-32471accadcf2099f9d3567f51add9fab197ec24.tar.zst
gsoc2013-evolution-32471accadcf2099f9d3567f51add9fab197ec24.zip
From widgets/e-table/ChangeLog
2000-05-14 Christopher James Lahey <clahey@helixcode.com> * Implemented the feature where the ETable columns automatically fill the given space. * e-cell-text.c, e-cell-text.h: Moved #include e-text-event-processor.h from the .h to the .c. * e-table-col.c, e-table-col.h: Added an expansion variable, and made it so that width isn't set by the programmer but instead by the e-table-header. * e-table-example-1.c, e-table-example-2.c, e-table-size-test.c, test-check.c, test-cols.c, test-table.c: Fixed to handle new ETable column resizing. * e-table-group-container.c, e-table-group-container.h, e-table-group-leaf.c, e-table-group-leaf.h, e-table-group.c, e-table-group.h, e-table-item.c, e-table-item.h: Fixed these to do a proper canvas reflow/update loop. Changed them to take a minimum width and return a width and a height. * e-table-header-item.c, e-table-header-item.h: Made this so that it depends on e-table-header.c for deciding the actual size of columns during resize (it was making incorrect decisions on its own.) * e-table-header.c, e-table-header.h: Changed this to make sure that the sum of the widths of the columns was always as close as possible to the width of the window. This is done by taking a full width and having each of the columns have an "expansion" field. This field is what makes each column have approximately the same portion of its part of the screen that it used to. * e-table.c: Changed this to set the width on the ETableHeader as well as set the proper minimum width on the ETableGroup and get the width and height it reports. From addressbook/ChangeLog 2000-05-14 Christopher James Lahey <clahey@helixcode.com> * backend/ebook/Makefile.am: Added libeutil for e-card's support for categories. * backend/ebook/e-card-list.c, backend/ebook/e-card-list.h: Added a function to get the length. * backend/ebook/e-card.c, backend/ebook/e-card.h: Added categories support (accessible either as "categories" or "category_list".) * contact-editor/Makefile.am: Added e-table and all of the categories files. * contact-editor/categories.glade, contact-editor/categories-strings.h, contact-editor/e-contact-editor-categories.c, contact-editor/e-contact-editor-categories.h: * contact-editor/contact-editor.glade, contact-editor/e-contact-editor-strings.h: Rearranged this dialog. * contact-editor/e-contact-editor.c: Rearranged dialog a bit. Added opening of categories dialog. * gui/component/Makefile.am: Rearranged libraries so that libetable would be available for the contact editor categories dialog. * gui/component/addressbook.c: Fix for new ETable resizing. Make contact editor dialog resizable. * gui/minicard/Makefile.am: Added libetable contact editor categories dialog. * gui/minicard/e-minicard.c: Make contact editor dialog resizable. From mail/ChangeLog 2000-05-14 Christopher James Lahey <clahey@helixcode.com> * message-list.c: Updated to work with new ETable resizing. svn path=/trunk/; revision=3027
Diffstat (limited to 'addressbook')
-rw-r--r--addressbook/ChangeLog37
-rw-r--r--addressbook/backend/ebook/Makefile.am14
-rw-r--r--addressbook/backend/ebook/e-card-list.c6
-rw-r--r--addressbook/backend/ebook/e-card-list.h1
-rw-r--r--addressbook/backend/ebook/e-card.c149
-rw-r--r--addressbook/backend/ebook/e-card.h2
-rw-r--r--addressbook/contact-editor/Makefile.am12
-rw-r--r--addressbook/contact-editor/categories-strings.h9
-rw-r--r--addressbook/contact-editor/categories.glade190
-rw-r--r--addressbook/contact-editor/contact-editor.glade882
-rw-r--r--addressbook/contact-editor/e-contact-editor-categories.c435
-rw-r--r--addressbook/contact-editor/e-contact-editor-categories.h83
-rw-r--r--addressbook/contact-editor/e-contact-editor-strings.h29
-rw-r--r--addressbook/contact-editor/e-contact-editor.c74
-rw-r--r--addressbook/gui/component/Makefile.am9
-rw-r--r--addressbook/gui/component/addressbook.c7
-rw-r--r--addressbook/gui/contact-editor/Makefile.am12
-rw-r--r--addressbook/gui/contact-editor/categories-strings.h9
-rw-r--r--addressbook/gui/contact-editor/categories.glade190
-rw-r--r--addressbook/gui/contact-editor/contact-editor.glade882
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-categories.c435
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-categories.h83
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor-strings.h29
-rw-r--r--addressbook/gui/contact-editor/e-contact-editor.c74
-rw-r--r--addressbook/gui/minicard/Makefile.am12
-rw-r--r--addressbook/gui/minicard/e-minicard.c2
-rw-r--r--addressbook/gui/widgets/Makefile.am12
-rw-r--r--addressbook/gui/widgets/e-minicard.c2
28 files changed, 2866 insertions, 815 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 969ae0ace3..79c0e9da41 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,40 @@
+2000-05-14 Christopher James Lahey <clahey@helixcode.com>
+
+ * backend/ebook/Makefile.am: Added libeutil for e-card's support
+ for categories.
+
+ * backend/ebook/e-card-list.c, backend/ebook/e-card-list.h: Added
+ a function to get the length.
+
+ * backend/ebook/e-card.c, backend/ebook/e-card.h: Added categories
+ support (accessible either as "categories" or "category_list".)
+
+ * contact-editor/Makefile.am: Added e-table and all of the
+ categories files.
+
+ * contact-editor/categories.glade,
+ contact-editor/categories-strings.h,
+ contact-editor/e-contact-editor-categories.c,
+ contact-editor/e-contact-editor-categories.h:
+
+ * contact-editor/contact-editor.glade,
+ contact-editor/e-contact-editor-strings.h: Rearranged this dialog.
+
+ * contact-editor/e-contact-editor.c: Rearranged dialog a bit.
+ Added opening of categories dialog.
+
+ * gui/component/Makefile.am: Rearranged libraries so that
+ libetable would be available for the contact editor categories
+ dialog.
+
+ * gui/component/addressbook.c: Fix for new ETable resizing. Make
+ contact editor dialog resizable.
+
+ * gui/minicard/Makefile.am: Added libetable contact editor
+ categories dialog.
+
+ * gui/minicard/e-minicard.c: Make contact editor dialog resizable.
+
2000-05-12 Miguel de Icaza <miguel@gnu.org>
* contact-editor/fulname.glade: Use accelerators here.
diff --git a/addressbook/backend/ebook/Makefile.am b/addressbook/backend/ebook/Makefile.am
index 42399190ea..c0ab395564 100644
--- a/addressbook/backend/ebook/Makefile.am
+++ b/addressbook/backend/ebook/Makefile.am
@@ -63,7 +63,8 @@ test_client_LDADD = \
libebook.la \
$(BONOBO_GNOME_LIBS) \
$(top_builddir)/libversit/libversit.la \
- $(top_builddir)/addressbook/ename/libename.la
+ $(top_builddir)/addressbook/ename/libename.la \
+ $(top_builddir)/e-util/libeutil.la
test_client_list_SOURCES = \
test-client-list.c
@@ -72,7 +73,8 @@ test_client_list_LDADD = \
libebook.la \
$(BONOBO_GNOME_LIBS) \
$(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la
+ $(top_builddir)/libversit/libversit.la \
+ $(top_builddir)/e-util/libeutil.la
test_card_SOURCES = \
test-card.c
@@ -81,7 +83,9 @@ test_card_LDADD = \
libebook.la \
$(BONOBO_GNOME_LIBS) \
$(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la
+ $(top_builddir)/libversit/libversit.la \
+ $(top_builddir)/e-util/libeutil.la
+
load_pine_addressbook_SOURCES = \
load-pine-addressbook.c
@@ -90,7 +94,9 @@ load_pine_addressbook_LDADD = \
libebook.la \
$(BONOBO_GNOME_LIBS) \
$(top_builddir)/addressbook/ename/libename.la \
- $(top_builddir)/libversit/libversit.la
+ $(top_builddir)/libversit/libversit.la \
+ $(top_builddir)/e-util/libeutil.la
+
BUILT_SOURCES = $(CORBA_SOURCE)
CLEANFILES += $(BUILT_SOURCES)
diff --git a/addressbook/backend/ebook/e-card-list.c b/addressbook/backend/ebook/e-card-list.c
index 9bec3b7bd5..e912de7b6e 100644
--- a/addressbook/backend/ebook/e-card-list.c
+++ b/addressbook/backend/ebook/e-card-list.c
@@ -95,6 +95,12 @@ e_card_list_get_iterator (ECardList *list)
return iterator;
}
+int
+e_card_list_length (ECardList *list)
+{
+ return g_list_length(list->list);
+}
+
void
e_card_list_append (ECardList *list, const void *data)
{
diff --git a/addressbook/backend/ebook/e-card-list.h b/addressbook/backend/ebook/e-card-list.h
index 18b69b2a3e..0a4a5bf105 100644
--- a/addressbook/backend/ebook/e-card-list.h
+++ b/addressbook/backend/ebook/e-card-list.h
@@ -46,6 +46,7 @@ ECardList *e_card_list_new (ECardListCopyFunc copy,
ECardIterator *e_card_list_get_iterator (ECardList *list);
void e_card_list_append (ECardList *list,
const void *data);
+int e_card_list_length (ECardList *list);
/* For iterators to call. */
void e_card_list_invalidate_iterators (ECardList *list,
diff --git a/addressbook/backend/ebook/e-card.c b/addressbook/backend/ebook/e-card.c
index 2eeec38b73..cff4e8d54f 100644
--- a/addressbook/backend/ebook/e-card.c
+++ b/addressbook/backend/ebook/e-card.c
@@ -19,6 +19,8 @@
#include "e-card-pairs.h"
#include "e-name-western.h"
+#include <e-util/e-util.h>
+
#define is_a_prop_of(obj,prop) (isAPropertyOf ((obj),(prop)))
#define str_val(obj) (the_str = (vObjectValueType (obj))? fakeCString (vObjectUStringZValue (obj)) : calloc (1, 1))
#define has(obj,prop) (vo = isAPropertyOf ((obj), (prop)))
@@ -47,6 +49,8 @@ enum {
ARG_ANNIVERSARY,
ARG_FBURL,
ARG_NOTE,
+ ARG_CATEGORIES,
+ ARG_CATEGORY_LIST,
ARG_ID
};
@@ -86,6 +90,7 @@ static void parse_spouse(ECard *card, VObject *object);
static void parse_anniversary(ECard *card, VObject *object);
static void parse_fburl(ECard *card, VObject *object);
static void parse_note(ECard *card, VObject *object);
+static void parse_categories(ECard *card, VObject *object);
static void parse_id(ECard *card, VObject *object);
static ECardPhoneFlags get_phone_flags (VObject *vobj);
@@ -120,6 +125,7 @@ struct {
{ "X-EVOLUTION-ANNIVERSARY", parse_anniversary },
{ "FBURL", parse_fburl },
{ VCNoteProp, parse_note },
+ { "CATEGORIES", parse_categories },
{ VCUniqueStringProp, parse_id }
};
@@ -379,6 +385,32 @@ char
if (card->note)
addPropValue(vobj, VCNoteProp, card->note);
+ if (card->categories) {
+ ECardIterator *iterator;
+ int length = 0;
+ char *string;
+ char *stringptr;
+ for (iterator = e_card_list_get_iterator(card->categories); e_card_iterator_is_valid(iterator); e_card_iterator_next(iterator)) {
+ length += strlen(e_card_iterator_get(iterator)) + 1;
+ }
+ string = g_new(char, length + 1);
+ stringptr = string;
+ *stringptr = 0;
+ for (e_card_iterator_reset(iterator); e_card_iterator_is_valid(iterator); e_card_iterator_next(iterator)) {
+ strcpy(stringptr, e_card_iterator_get(iterator));
+ stringptr += strlen(stringptr);
+ *stringptr = ',';
+ stringptr++;
+ *stringptr = 0;
+ }
+ if (stringptr > string) {
+ stringptr --;
+ *stringptr = 0;
+ }
+ addPropValue (vobj, "CATEGORIES", string);
+ g_free(string);
+ }
+
if (card->id)
addPropValue (vobj, VCUniqueStringProp, card->id);
@@ -432,9 +464,6 @@ char
if (crd->agent)
addVObjectProp (vobj, card_convert_to_vobject (crd->agent));
- add_CardStrProperty (vobj, VCCategoriesProp, &crd->categories);
- add_CardStrProperty (vobj, VCCommentProp, &crd->comment);
-
if (crd->sound.prop.used) {
if (crd->sound.type != SOUND_PHONETIC)
vprop = addPropSizedValue (vobj, VCPronunciationProp,
@@ -684,6 +713,72 @@ parse_note(ECard *card, VObject *vobj)
}
static void
+add_list_unique(ECard *card, ECardList *list, char *string)
+{
+ char *temp = e_strdup_strip(string);
+ ECardIterator *iterator;
+
+ if (!*temp) {
+ g_free(temp);
+ return;
+ }
+ for ( iterator = e_card_list_get_iterator(list); e_card_iterator_is_valid(iterator); e_card_iterator_next(iterator)) {
+ if (!strcmp(e_card_iterator_get(iterator), temp)) {
+ g_free(temp);
+ break;
+ }
+ }
+ if (!e_card_iterator_is_valid(iterator)) {
+ e_card_list_append(list, temp);
+ }
+ gtk_object_unref(GTK_OBJECT(iterator));
+}
+
+static void
+do_parse_categories(ECard *card, char *str)
+{
+ int length = strlen(str);
+ char *copy = g_new(char, length + 1);
+ int i, j;
+ ECardList *list;
+ gtk_object_get(GTK_OBJECT(card),
+ "category_list", &list,
+ NULL);
+ for (i = 0, j = 0; str[i]; i++, j++) {
+ switch (str[i]) {
+ case '\\':
+ i++;
+ if (str[i]) {
+ copy[j] = str[i];
+ } else
+ i--;
+ break;
+ case ',':
+ copy[j] = 0;
+ add_list_unique(card, list, copy);
+ j = -1;
+ break;
+ default:
+ copy[j] = str[i];
+ break;
+ }
+ }
+ copy[j] = 0;
+ add_list_unique(card, list, copy);
+ g_free(copy);
+}
+
+static void
+parse_categories(ECard *card, VObject *vobj)
+{
+ if ( vObjectValueType (vobj) ) {
+ char *str = fakeCString (vObjectUStringZValue (vobj));
+ do_parse_categories(card, str);
+ free(str);
+ }
+}
+
+static void
parse_id(ECard *card, VObject *vobj)
{
if ( card->id )
@@ -786,6 +881,10 @@ e_card_class_init (ECardClass *klass)
GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FBURL);
gtk_object_add_arg_type ("ECard::note",
GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NOTE);
+ gtk_object_add_arg_type ("ECard::categories",
+ GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_CATEGORIES);
+ gtk_object_add_arg_type ("ECard::category_list",
+ GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CATEGORY_LIST);
gtk_object_add_arg_type ("ECard::id",
GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ID);
@@ -1081,6 +1180,8 @@ e_card_destroy (GtkObject *object)
if (card->note)
g_free(card->note);
+ if (card->categories)
+ gtk_object_unref(GTK_OBJECT(card->categories));
if (card->email)
gtk_object_unref(GTK_OBJECT(card->email));
if (card->phone)
@@ -1116,6 +1217,20 @@ e_card_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
e_card_name_free(card->name);
card->name = GTK_VALUE_POINTER(*arg);
break;
+ case ARG_CATEGORIES:
+ if (card->categories)
+ gtk_object_unref(GTK_OBJECT(card->categories));
+ card->categories = NULL;
+ if (GTK_VALUE_STRING(*arg))
+ do_parse_categories(card, GTK_VALUE_STRING(*arg));
+ break;
+ case ARG_CATEGORY_LIST:
+ if (card->categories)
+ gtk_object_unref(GTK_OBJECT(card->categories));
+ card->categories = E_CARD_LIST(GTK_VALUE_OBJECT(*arg));
+ if (card->categories)
+ gtk_object_ref(GTK_OBJECT(card->categories));
+ break;
case ARG_BIRTH_DATE:
if ( card->bday )
g_free(card->bday);
@@ -1242,6 +1357,33 @@ e_card_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
NULL);
GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->email);
break;
+ case ARG_CATEGORIES:
+ {
+ int i;
+ char ** strs;
+ int length;
+ ECardIterator *iterator;
+ if (!card->categories)
+ card->categories = e_card_list_new((ECardListCopyFunc) g_strdup,
+ (ECardListFreeFunc) g_free,
+ NULL);
+ length = e_card_list_length(card->categories);
+ strs = g_new(char *, length + 1);
+ for (iterator = e_card_list_get_iterator(card->categories), i = 0; e_card_iterator_is_valid(iterator); e_card_iterator_next(iterator), i++) {
+ strs[i] = (char *)e_card_iterator_get(iterator);
+ }
+ strs[i] = 0;
+ GTK_VALUE_STRING(*arg) = g_strjoinv(", ", strs);
+ g_free(strs);
+ }
+ break;
+ case ARG_CATEGORY_LIST:
+ if (!card->categories)
+ card->categories = e_card_list_new((ECardListCopyFunc) g_strdup,
+ (ECardListFreeFunc) g_free,
+ NULL);
+ GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->categories);
+ break;
case ARG_BIRTH_DATE:
GTK_VALUE_POINTER(*arg) = card->bday;
break;
@@ -1323,6 +1465,7 @@ e_card_init (ECard *card)
card->anniversary = NULL;
card->fburl = NULL;
card->note = NULL;
+ card->categories = NULL;
#if 0
c = g_new0 (ECard, 1);
diff --git a/addressbook/backend/ebook/e-card.h b/addressbook/backend/ebook/e-card.h
index 98fa4a9060..b34ab2cd54 100644
--- a/addressbook/backend/ebook/e-card.h
+++ b/addressbook/backend/ebook/e-card.h
@@ -63,6 +63,8 @@ struct _ECard {
char *fburl; /* Free Busy URL */
+ ECardList *categories; /* Categories. */
+
#if 0
ECardPhoto *logo; /* This person's org's logo. */
diff --git a/addressbook/contact-editor/Makefile.am b/addressbook/contact-editor/Makefile.am
index 3998e4fccb..5133ffa30f 100644
--- a/addressbook/contact-editor/Makefile.am
+++ b/addressbook/contact-editor/Makefile.am
@@ -13,6 +13,7 @@ INCLUDES = \
-I$(top_srcdir) \
-I$(top_srcdir)/addressbook/ \
-I$(top_srcdir)/addressbook/backend \
+ -I$(top_srcdir)/widgets/e-table \
-DEVOLUTION_IMAGES=\""$(imagesdir)"\" \
-DG_LOG_DOMAIN=\"contact-editor\"
@@ -20,6 +21,8 @@ noinst_LIBRARIES = \
libecontacteditor.a
libecontacteditor_a_SOURCES = \
+ e-contact-editor-categories.c \
+ e-contact-editor-categories.h \
e-contact-editor-fullname.c \
e-contact-editor-fullname.h \
e-contact-editor.c \
@@ -39,14 +42,19 @@ contact_editor_test_LDADD = \
-lbonobo \
$(top_builddir)/e-util/libeutil.la \
libecontacteditor.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la \
+ $(top_builddir)/widgets/e-text/libetext.a \
$(EXTRA_GNOME_LIBS)
gladedir = $(datadir)/evolution/glade
glade_DATA = \
contact-editor.glade \
- fullname.glade
+ fullname.glade \
+ categories.glade
EXTRA_DIST = $(glade_DATA) \
e-contact-editor-strings.h \
- fullname-strings.h
+ fullname-strings.h \
+ categories-strings.h
diff --git a/addressbook/contact-editor/categories-strings.h b/addressbook/contact-editor/categories-strings.h
new file mode 100644
index 0000000000..813018a00e
--- /dev/null
+++ b/addressbook/contact-editor/categories-strings.h
@@ -0,0 +1,9 @@
+/*
+ * Translatable strings file generated by Glade.
+ * Add this file to your project's POTFILES.in.
+ * DO NOT compile it as part of your application.
+ */
+
+gchar *s = N_("categories");
+gchar *s = N_("Item(s) belong to these categories:");
+gchar *s = N_("Available Categories:");
diff --git a/addressbook/contact-editor/categories.glade b/addressbook/contact-editor/categories.glade
new file mode 100644
index 0000000000..bf78008940
--- /dev/null
+++ b/addressbook/contact-editor/categories.glade
@@ -0,0 +1,190 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>categories</name>
+ <program_name>categories</program_name>
+ <directory></directory>
+ <source_directory>src</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>True</gnome_support>
+ <gettext_support>False</gettext_support>
+ <use_widget_names>False</use_widget_names>
+ <output_main_file>False</output_main_file>
+ <output_support_files>False</output_support_files>
+ <output_build_files>False</output_build_files>
+ <backup_source_files>False</backup_source_files>
+ <main_source_file>interface.c</main_source_file>
+ <main_header_file>interface.h</main_header_file>
+ <handler_source_file>callbacks.c</handler_source_file>
+ <handler_header_file>callbacks.h</handler_header_file>
+ <support_source_file>support.c</support_source_file>
+ <support_header_file>support.h</support_header_file>
+ <output_translatable_strings>True</output_translatable_strings>
+ <translatable_strings_file>categories-strings.h</translatable_strings_file>
+</project>
+
+<widget>
+ <class>GnomeDialog</class>
+ <name>categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <visible>False</visible>
+ <title>categories</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>
+ <auto_close>False</auto_close>
+ <hide_on_close>False</hide_on_close>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDialog:vbox</child_name>
+ <name>dialog-vbox1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <homogeneous>False</homogeneous>
+ <spacing>8</spacing>
+ <child>
+ <padding>4</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table-categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <rows>4</rows>
+ <columns>1</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>0</row_spacing>
+ <column_spacing>0</column_spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkAccelLabel</class>
+ <name>accellabel1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Item(s) belong to these categories:</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>0</left_attach>
+ <right_attach>1</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>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkAccelLabel</class>
+ <name>accellabel2</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Available Categories:</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>0</left_attach>
+ <right_attach>1</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>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>entry-categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <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>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</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>
+
+ <widget>
+ <class>GtkHButtonBox</class>
+ <child_name>GnomeDialog:action_area</child_name>
+ <name>dialog-action_area1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <layout_style>GTK_BUTTONBOX_END</layout_style>
+ <spacing>8</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>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ <pack>GTK_PACK_END</pack>
+ </child>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button3</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/addressbook/contact-editor/contact-editor.glade b/addressbook/contact-editor/contact-editor.glade
index 976508d41c..a450743ff8 100644
--- a/addressbook/contact-editor/contact-editor.glade
+++ b/addressbook/contact-editor/contact-editor.glade
@@ -56,7 +56,7 @@
<name>table-contact-editor-general</name>
<border_width>7</border_width>
<cxx_use_heap>True</cxx_use_heap>
- <rows>11</rows>
+ <rows>13</rows>
<columns>8</columns>
<homogeneous>False</homogeneous>
<row_spacing>4</row_spacing>
@@ -163,114 +163,6 @@
</widget>
<widget>
- <class>GtkLabel</class>
- <name>label-phone3</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Business Fax</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>5</left_attach>
- <right_attach>6</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>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone2</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Home</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>5</left_attach>
- <right_attach>6</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>GtkLabel</class>
- <name>label-phone1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Business</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>5</left_attach>
- <right_attach>6</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>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone4</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Mobile</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>5</left_attach>
- <right_attach>6</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>
-
- <widget>
<class>GtkText</class>
<name>text-address</name>
<width>1</width>
@@ -296,38 +188,11 @@
</widget>
<widget>
- <class>GtkLabel</class>
- <name>label-email1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Primary Email</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>2</right_attach>
- <top_attach>5</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>
<class>GtkButton</class>
<name>button-fullname</name>
<cxx_use_heap>True</cxx_use_heap>
<can_focus>True</can_focus>
- <label> Full Name...</label>
+ <label>_Full Name...</label>
<child>
<left_attach>1</left_attach>
<right_attach>3</right_attach>
@@ -346,33 +211,6 @@
<widget>
<class>GtkAccelLabel</class>
- <name>accellabel-jobtitle</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Job Title:</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>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>GtkAccelLabel</class>
<name>accellabel-company</name>
<cxx_use_heap>True</cxx_use_heap>
<label>Company:</label>
@@ -454,40 +292,6 @@
<widget>
<class>GtkAlignment</class>
- <name>alignment2</name>
- <cxx_use_heap>True</cxx_use_heap>
- <xalign>0</xalign>
- <yalign>0</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>9</top_attach>
- <bottom_attach>10</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton-mailingaddress</name>
- <cxx_use_heap>True</cxx_use_heap>
- <visible>False</visible>
- <label>This is the mailing address</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
<name>alignment3</name>
<cxx_use_heap>True</cxx_use_heap>
<xalign>1</xalign>
@@ -880,60 +684,6 @@
</widget>
<widget>
- <class>GtkHBox</class>
- <name>hbox5</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <left_attach>0</left_attach>
- <right_attach>8</right_attach>
- <top_attach>10</top_attach>
- <bottom_attach>11</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>
- <class>GtkText</class>
- <name>text-comments</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkVScrollbar</class>
- <name>vscrollbar-comments</name>
- <cxx_use_heap>True</cxx_use_heap>
- <policy>GTK_UPDATE_CONTINUOUS</policy>
- <value>0</value>
- <lower>0</lower>
- <upper>0</upper>
- <step>0</step>
- <page>0</page>
- <page_size>0</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
<class>GtkAlignment</class>
<name>alignment10</name>
<cxx_use_heap>True</cxx_use_heap>
@@ -960,27 +710,217 @@
<class>GtkCheckButton</class>
<name>checkbutton-htmlmail</name>
<cxx_use_heap>True</cxx_use_heap>
- <visible>False</visible>
- <label>Wants HTML mail</label>
+ <label>Wants _HTML mail</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
</widget>
</widget>
<widget>
+ <class>GtkAlignment</class>
+ <name>alignment4</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <xalign>1</xalign>
+ <yalign>0.5</yalign>
+ <xscale>0</xscale>
+ <yscale>0</yscale>
+ <child>
+ <left_attach>6</left_attach>
+ <right_attach>7</right_attach>
+ <top_attach>5</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>button-address1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
<class>GtkLabel</class>
- <name>label-address1</name>
+ <name>address-label</name>
<cxx_use_heap>True</cxx_use_heap>
- <label>Business</label>
+ <label>Address:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
+ <focus_target>text-address</focus_target>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>7</right_attach>
+ <top_attach>6</top_attach>
+ <bottom_attach>7</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>GtkEventBox</class>
+ <name>eventbox1</name>
+ <cxx_use_heap>True</cxx_use_heap>
<child>
<left_attach>5</left_attach>
<right_attach>6</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>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label-phone1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>_Business</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-phone1</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox2</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>6</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>
+ <class>GtkLabel</class>
+ <name>label-phone2</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>_Home</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-phone2</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox3</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>6</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>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label-phone3</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Business _Fax</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-phone3</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox4</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>6</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>GtkLabel</class>
+ <name>label-phone4</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>_Mobile</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-phone4</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox5</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
<top_attach>5</top_attach>
<bottom_attach>6</bottom_attach>
<xpad>0</xpad>
@@ -992,21 +932,142 @@
<xfill>True</xfill>
<yfill>True</yfill>
</child>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label-email1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Primary Email</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-email1</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox-business</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>6</right_attach>
+ <top_attach>5</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>GtkLabel</class>
+ <name>label-address1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Business</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>text-address</focus_target>
+ </widget>
</widget>
<widget>
<class>GtkAlignment</class>
- <name>alignment4</name>
+ <name>alignment2</name>
<cxx_use_heap>True</cxx_use_heap>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
+ <xalign>0</xalign>
+ <yalign>0</yalign>
<xscale>0</xscale>
<yscale>0</yscale>
<child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
+ <left_attach>7</left_attach>
+ <right_attach>8</right_attach>
+ <top_attach>9</top_attach>
+ <bottom_attach>10</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkCheckButton</class>
+ <name>checkbutton-mailingaddress</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>This is the _mailing address</label>
+ <active>False</active>
+ <draw_indicator>True</draw_indicator>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkHSeparator</class>
+ <name>hseparator9</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>11</top_attach>
+ <bottom_attach>12</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>2</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkHSeparator</class>
+ <name>hseparator10</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>4</left_attach>
+ <right_attach>8</right_attach>
+ <top_attach>11</top_attach>
+ <bottom_attach>12</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkAlignment</class>
+ <name>alignment12</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>12</top_attach>
+ <bottom_attach>13</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
@@ -1019,31 +1080,124 @@
<widget>
<class>GtkButton</class>
- <name>button-address1</name>
+ <name>button-contacts</name>
<cxx_use_heap>True</cxx_use_heap>
+ <can_focus>True</can_focus>
+ <label>_Contacts...</label>
+ </widget>
+ </widget>
- <widget>
- <class>Placeholder</class>
- </widget>
+ <widget>
+ <class>GtkAlignment</class>
+ <name>alignment15</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
+ <child>
+ <left_attach>7</left_attach>
+ <right_attach>8</right_attach>
+ <top_attach>12</top_attach>
+ <bottom_attach>13</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>entry-categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_focus>True</can_focus>
+ <editable>True</editable>
+ <text_visible>True</text_visible>
+ <text_max_length>0</text_max_length>
+ <text></text>
</widget>
</widget>
<widget>
- <class>GtkLabel</class>
- <name>address-label</name>
+ <class>GtkAlignment</class>
+ <name>alignment14</name>
<cxx_use_heap>True</cxx_use_heap>
- <label>Address:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
+ <xalign>0.5</xalign>
<yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
+ <child>
+ <left_attach>3</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>12</top_attach>
+ <bottom_attach>13</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>entry-contacts</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_focus>True</can_focus>
+ <editable>True</editable>
+ <text_visible>True</text_visible>
+ <text_max_length>0</text_max_length>
+ <text></text>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkAlignment</class>
+ <name>alignment16</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
<child>
<left_attach>5</left_attach>
<right_attach>7</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
+ <top_attach>12</top_attach>
+ <bottom_attach>13</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>button-categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_focus>True</can_focus>
+ <label>Ca_tegories...</label>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox7</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
@@ -1053,6 +1207,19 @@
<xfill>True</xfill>
<yfill>True</yfill>
</child>
+
+ <widget>
+ <class>GtkAccelLabel</class>
+ <name>accellabel-jobtitle</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Job Title</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ </widget>
</widget>
</widget>
@@ -1193,7 +1360,7 @@
<class>GtkLabel</class>
<name>label25</name>
<cxx_use_heap>True</cxx_use_heap>
- <label>Spouse's name:</label>
+ <label>Spouse:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
@@ -1218,33 +1385,6 @@
<widget>
<class>GtkLabel</class>
- <name>label28</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Address:</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>2</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>8</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>GtkLabel</class>
<name>label31</name>
<cxx_use_heap>True</cxx_use_heap>
<label>Birthday:</label>
@@ -1301,7 +1441,7 @@
<class>GtkLabel</class>
<name>label29</name>
<cxx_use_heap>True</cxx_use_heap>
- <label>Manager's name:</label>
+ <label>Manager's Name:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
@@ -1477,31 +1617,6 @@
</widget>
<widget>
- <class>GtkEntry</class>
- <name>entry-fburl</name>
- <cxx_use_heap>True</cxx_use_heap>
- <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>6</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>8</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>GnomeDateEdit</class>
<name>dateedit-anniversary</name>
<cxx_use_heap>True</cxx_use_heap>
@@ -1602,68 +1717,119 @@
</widget>
<widget>
- <class>GtkHBox</class>
- <name>hbox7</name>
+ <class>GtkHSeparator</class>
+ <name>hseparator7</name>
<cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>6</spacing>
<child>
<left_attach>0</left_attach>
<right_attach>6</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>2</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label33</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Notes:</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>2</right_attach>
+ <top_attach>7</top_attach>
+ <bottom_attach>8</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
- <xexpand>True</xexpand>
+ <xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
</child>
+ </widget>
+
+ <widget>
+ <class>GtkHBox</class>
+ <name>hbox5</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>6</right_attach>
+ <top_attach>8</top_attach>
+ <bottom_attach>9</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
<widget>
- <class>GtkLabel</class>
- <name>label33</name>
+ <class>GtkText</class>
+ <name>text-comments</name>
+ <height>50</height>
<cxx_use_heap>True</cxx_use_heap>
- <label>Internet Free-Busy</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>2</ypad>
+ <can_focus>True</can_focus>
+ <editable>True</editable>
+ <text></text>
<child>
<padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
+ <expand>True</expand>
+ <fill>True</fill>
</child>
</widget>
<widget>
- <class>GtkHSeparator</class>
- <name>hseparator8</name>
+ <class>GtkVScrollbar</class>
+ <name>vscrollbar-comments</name>
<cxx_use_heap>True</cxx_use_heap>
+ <policy>GTK_UPDATE_CONTINUOUS</policy>
+ <value>0</value>
+ <lower>0</lower>
+ <upper>0</upper>
+ <step>0</step>
+ <page>0</page>
+ <page_size>0</page_size>
<child>
<padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
+ <expand>False</expand>
+ <fill>False</fill>
</child>
</widget>
</widget>
<widget>
<class>GtkHSeparator</class>
- <name>hseparator7</name>
+ <name>hseparator8</name>
<cxx_use_heap>True</cxx_use_heap>
<child>
<left_attach>0</left_attach>
<right_attach>6</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
+ <top_attach>6</top_attach>
+ <bottom_attach>7</bottom_attach>
<xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>False</xexpand>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
diff --git a/addressbook/contact-editor/e-contact-editor-categories.c b/addressbook/contact-editor/e-contact-editor-categories.c
new file mode 100644
index 0000000000..14b10d21c8
--- /dev/null
+++ b/addressbook/contact-editor/e-contact-editor-categories.c
@@ -0,0 +1,435 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * e-contact-editor-categories.c
+ * Copyright (C) 2000 Helix Code, Inc.
+ * Author: Chris Lahey <clahey@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 <config.h>
+#include <gnome.h>
+#include <e-contact-editor-categories.h>
+#include <e-table.h>
+#include <e-table-simple.h>
+#include <e-cell-text.h>
+#include <e-cell-checkbox.h>
+
+static void e_contact_editor_categories_init (EContactEditorCategories *card);
+static void e_contact_editor_categories_class_init (EContactEditorCategoriesClass *klass);
+static void e_contact_editor_categories_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
+static void e_contact_editor_categories_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+static void e_contact_editor_categories_destroy (GtkObject *object);
+static int e_contact_editor_categories_col_count (ETableModel *etc, gpointer data);
+static int e_contact_editor_categories_row_count (ETableModel *etc, gpointer data);
+static void *e_contact_editor_categories_value_at (ETableModel *etc, int col, int row, gpointer data);
+static void e_contact_editor_categories_set_value_at (ETableModel *etc, int col, int row, const void *val, gpointer data);
+static gboolean e_contact_editor_categories_is_cell_editable (ETableModel *etc, int col, int row, gpointer data);
+static void *e_contact_editor_categories_duplicate_value (ETableModel *etc, int col, const void *value, gpointer data);
+static void e_contact_editor_categories_free_value (ETableModel *etc, int col, void *value, gpointer data);
+static void e_contact_editor_categories_thaw (ETableModel *etc, gpointer data);
+
+static GnomeDialogClass *parent_class = NULL;
+
+/* The arguments we take */
+enum {
+ ARG_0,
+ ARG_CATEGORIES
+};
+
+GtkType
+e_contact_editor_categories_get_type (void)
+{
+ static GtkType contact_editor_categories_type = 0;
+
+ if (!contact_editor_categories_type)
+ {
+ static const GtkTypeInfo contact_editor_categories_info =
+ {
+ "EContactEditorCategories",
+ sizeof (EContactEditorCategories),
+ sizeof (EContactEditorCategoriesClass),
+ (GtkClassInitFunc) e_contact_editor_categories_class_init,
+ (GtkObjectInitFunc) e_contact_editor_categories_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+
+ contact_editor_categories_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_categories_info);
+ }
+
+ return contact_editor_categories_type;
+}
+
+static void
+e_contact_editor_categories_class_init (EContactEditorCategoriesClass *klass)
+{
+ GtkObjectClass *object_class;
+ GnomeDialogClass *dialog_class;
+
+ object_class = (GtkObjectClass*) klass;
+ dialog_class = (GnomeDialogClass *) klass;
+
+ parent_class = gtk_type_class (gnome_dialog_get_type ());
+
+ gtk_object_add_arg_type ("EContactEditorCategories::categories", GTK_TYPE_STRING,
+ GTK_ARG_READWRITE, ARG_CATEGORIES);
+
+ object_class->set_arg = e_contact_editor_categories_set_arg;
+ object_class->get_arg = e_contact_editor_categories_get_arg;
+ object_class->destroy = e_contact_editor_categories_destroy;
+}
+
+gchar *builtin_categories[] = {
+ "Business",
+ "Competition",
+ "Favorites",
+ "Gifts",
+ "Goals/Objectives",
+ "Holiday",
+ "Holiday Cards",
+ "Hot Contacts",
+ "Ideas",
+ "International",
+ "Key Customer",
+ "Miscellaneous",
+ "Personal",
+ "Phone Calls",
+ "Status",
+ "Strategies",
+ "Suppliers",
+ "Time & Expenses",
+ "VIP",
+ "Waiting",
+};
+
+#define BUILTIN_CATEGORY_COUNT (sizeof(builtin_categories) / sizeof(builtin_categories[0]))
+
+static void
+add_list_unique(EContactEditorCategories *categories, char *string)
+{
+ int k;
+ char *temp = e_strdup_strip(string);
+ char **list = categories->category_list;
+
+ if (!*temp) {
+ g_free(temp);
+ return;
+ }
+ for (k = 0; k < categories->list_length; k++) {
+ if (!strcmp(list[k], temp)) {
+ categories->selected_list[k] = TRUE;
+ g_free(temp);
+ break;
+ }
+ }
+ if (k == categories->list_length) {
+ categories->selected_list[categories->list_length] = TRUE;
+ list[categories->list_length++] = temp;
+ }
+}
+
+static void
+do_parse_categories(EContactEditorCategories *categories)
+{
+ char *str = categories->categories;
+ int length = strlen(str);
+ char *copy = g_new(char, length + 1);
+ int i, j;
+ char **list;
+ int count = 1;
+ for (i = 0; str[i]; i++) {
+ switch (str[i]) {
+ case '\\':
+ i++;
+ if (!str[i])
+ i--;
+ break;
+ case ',':
+ count ++;
+ break;
+ }
+ }
+
+ for (i = 0; i < categories->list_length; i++)
+ g_free(categories->category_list[i]);
+ g_free(categories->category_list);
+ list = g_new(char *, count + 1 + BUILTIN_CATEGORY_COUNT);
+ categories->category_list = list;
+
+ g_free(categories->selected_list);
+ categories->selected_list = g_new(gboolean, count + 1 + BUILTIN_CATEGORY_COUNT);
+
+ for (count = 0; count < BUILTIN_CATEGORY_COUNT; count++) {
+ list[count] = g_strdup(builtin_categories[count]);
+ categories->selected_list[count] = 0;
+ }
+ categories->list_length = count;
+
+ for (i = 0, j = 0; str[i]; i++, j++) {
+ switch (str[i]) {
+ case '\\':
+ i++;
+ if (str[i]) {
+ copy[j] = str[i];
+ } else
+ i--;
+ break;
+ case ',':
+ copy[j] = 0;
+ add_list_unique(categories, copy);
+ j = -1;
+ break;
+ default:
+ copy[j] = str[i];
+ break;
+ }
+ }
+ copy[j] = 0;
+ add_list_unique(categories, copy);
+ g_free(copy);
+ e_table_model_changed(categories->model);
+}
+
+static void
+e_contact_editor_categories_entry_change (GtkWidget *entry,
+ EContactEditorCategories *categories)
+{
+ if (categories->categories)
+ g_free(categories->categories);
+ categories->categories = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
+ do_parse_categories(categories);
+}
+
+
+#define INITIAL_SPEC "<ETableSpecification no-header=\"1\"> \
+ <columns-shown> \
+ <column> 0 </column> \
+ <column> 1 </column> \
+ </columns-shown> \
+ <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
+</ETableSpecification>"
+
+static void
+e_contact_editor_categories_init (EContactEditorCategories *categories)
+{
+ GladeXML *gui;
+ GtkWidget *table;
+ ECell *cell_left_just;
+ ECell *cell_checkbox;
+ ETableHeader *header;
+ ETableCol *col;
+ GtkWidget *e_table;
+
+ categories->list_length = 0;
+ categories->category_list = NULL;
+ categories->selected_list = NULL;
+
+ gnome_dialog_append_button ( GNOME_DIALOG(categories),
+ GNOME_STOCK_BUTTON_OK);
+
+ gnome_dialog_append_button ( GNOME_DIALOG(categories),
+ GNOME_STOCK_BUTTON_CANCEL);
+
+ gtk_window_set_policy(GTK_WINDOW(categories), TRUE, TRUE, FALSE);
+
+ categories->categories = NULL;
+ gui = glade_xml_new (EVOLUTION_GLADEDIR "/categories.glade", NULL);
+ categories->gui = gui;
+
+ table = glade_xml_get_widget(gui, "table-categories");
+ gtk_widget_ref(table);
+ gtk_container_remove(GTK_CONTAINER(table->parent), table);
+ gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (categories)->vbox), table, TRUE, TRUE, 0);
+ gtk_widget_unref(table);
+
+ categories->entry = glade_xml_get_widget(gui, "entry-categories");
+
+ gtk_signal_connect(GTK_OBJECT(categories->entry), "changed",
+ GTK_SIGNAL_FUNC(e_contact_editor_categories_entry_change), categories);
+
+ categories->model = e_table_simple_new(e_contact_editor_categories_col_count,
+ e_contact_editor_categories_row_count,
+ e_contact_editor_categories_value_at,
+ e_contact_editor_categories_set_value_at,
+ e_contact_editor_categories_is_cell_editable,
+ e_contact_editor_categories_duplicate_value,
+ e_contact_editor_categories_free_value,
+ e_contact_editor_categories_thaw,
+ categories);
+
+ header = e_table_header_new();
+
+ cell_checkbox = e_cell_checkbox_new();
+ col = e_table_col_new (0, "",
+ 0, 20, cell_checkbox,
+ g_int_compare, TRUE);
+ e_table_header_add_column (header, col, 0);
+
+ cell_left_just = e_cell_text_new (categories->model, NULL, GTK_JUSTIFY_LEFT);
+ col = e_table_col_new (1, "Category",
+ 1.0, 20, cell_left_just,
+ g_str_compare, TRUE);
+ e_table_header_add_column (header, col, 1);
+
+ e_table = e_table_new (header, categories->model, INITIAL_SPEC);
+
+ gtk_widget_show(e_table);
+
+ gtk_table_attach_defaults(GTK_TABLE(table),
+ e_table,
+ 0, 1,
+ 3, 4);
+}
+
+void
+e_contact_editor_categories_destroy (GtkObject *object)
+{
+ EContactEditorCategories *e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES(object);
+
+ if (e_contact_editor_categories->gui)
+ gtk_object_unref(GTK_OBJECT(e_contact_editor_categories->gui));
+ g_free(e_contact_editor_categories->categories);
+}
+
+GtkWidget*
+e_contact_editor_categories_new (char *categories)
+{
+ GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_categories_get_type ()));
+ gtk_object_set (GTK_OBJECT(widget),
+ "categories", categories,
+ NULL);
+ return widget;
+}
+
+static void
+e_contact_editor_categories_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
+{
+ EContactEditorCategories *e_contact_editor_categories;
+
+ e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES (o);
+
+ switch (arg_id){
+ case ARG_CATEGORIES:
+ gtk_entry_set_text(GTK_ENTRY(e_contact_editor_categories->entry), GTK_VALUE_STRING (*arg));
+ break;
+ }
+}
+
+static void
+e_contact_editor_categories_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ EContactEditorCategories *e_contact_editor_categories;
+
+ e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES (object);
+
+ switch (arg_id) {
+ case ARG_CATEGORIES:
+ GTK_VALUE_STRING (*arg) = g_strdup(e_contact_editor_categories->categories);
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+/* This function returns the number of columns in our ETableModel. */
+static int
+e_contact_editor_categories_col_count (ETableModel *etc, gpointer data)
+{
+ return 2;
+}
+
+/* This function returns the number of rows in our ETableModel. */
+static int
+e_contact_editor_categories_row_count (ETableModel *etc, gpointer data)
+{
+ EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
+ return categories->list_length;
+}
+
+/* This function returns the value at a particular point in our ETableModel. */
+static void *
+e_contact_editor_categories_value_at (ETableModel *etc, int col, int row, gpointer data)
+{
+ EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
+ if (col == 0)
+ return (void *) categories->selected_list[row];
+ else
+ return categories->category_list[row];
+}
+
+/* This function sets the value at a particular point in our ETableModel. */
+static void
+e_contact_editor_categories_set_value_at (ETableModel *etc, int col, int row, const void *val, gpointer data)
+{
+ EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
+ if ( col == 0 ) {
+ char **strs;
+ int i, j;
+ char *string;
+ categories->selected_list[row] = (gboolean) val;
+ strs = g_new(char *, categories->list_length + 1);
+ for (i = 0, j = 0; i < categories->list_length; i++) {
+ if (categories->selected_list[i])
+ strs[j++] = categories->category_list[i];
+ }
+ strs[j] = 0;
+ string = g_strjoinv(", ", strs);
+ gtk_entry_set_text(GTK_ENTRY(categories->entry), string);
+ g_free(string);
+ g_free(strs);
+ }
+ if ( col == 1 )
+ return;
+}
+
+/* This function returns whether a particular cell is editable. */
+static gboolean
+e_contact_editor_categories_is_cell_editable (ETableModel *etc, int col, int row, gpointer data)
+{
+ return col == 0;
+}
+
+/* This function duplicates the value passed to it. */
+static void *
+e_contact_editor_categories_duplicate_value (ETableModel *etc, int col, const void *value, gpointer data)
+{
+ if (col == 0)
+ return (void *)value;
+ else
+ return g_strdup(value);
+}
+
+/* This function frees the value passed to it. */
+static void
+e_contact_editor_categories_free_value (ETableModel *etc, int col, void *value, gpointer data)
+{
+ if (col == 0)
+ return;
+ else
+ g_free(value);
+}
+
+/* This function is for when the model is unfrozen. This can mostly
+ be ignored for simple models. */
+static void
+e_contact_editor_categories_thaw (ETableModel *etc, gpointer data)
+{
+ e_table_model_changed(etc);
+}
+
diff --git a/addressbook/contact-editor/e-contact-editor-categories.h b/addressbook/contact-editor/e-contact-editor-categories.h
new file mode 100644
index 0000000000..529ef71b68
--- /dev/null
+++ b/addressbook/contact-editor/e-contact-editor-categories.h
@@ -0,0 +1,83 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* e-contact-editor-categories.h
+ * Copyright (C) 2000 Helix Code, Inc.
+ * Author: Chris Lahey <clahey@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_EDITOR_CATEGORIES_H__
+#define __E_CONTACT_EDITOR_CATEGORIES_H__
+
+#include <gnome.h>
+#include <glade/glade.h>
+#include <ebook/e-card.h>
+#include <widgets/e-table/e-table-model.h>
+
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif /* __cplusplus */
+
+/* EContactEditorCategories - A dialog displaying information about a contact.
+ *
+ * The following arguments are available:
+ *
+ * name type read/write description
+ * --------------------------------------------------------------------------------
+ * name ECardName * RW The card currently being edited. Returns a copy.
+ */
+
+#define E_CONTACT_EDITOR_CATEGORIES_TYPE (e_contact_editor_categories_get_type ())
+#define E_CONTACT_EDITOR_CATEGORIES(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE, EContactEditorCategories))
+#define E_CONTACT_EDITOR_CATEGORIES_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_CATEGORIES_TYPE, EContactEditorCategoriesClass))
+#define E_IS_CONTACT_EDITOR_CATEGORIES(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE))
+#define E_IS_CONTACT_EDITOR_CATEGORIES_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE))
+
+
+typedef struct _EContactEditorCategories EContactEditorCategories;
+typedef struct _EContactEditorCategoriesClass EContactEditorCategoriesClass;
+
+struct _EContactEditorCategories
+{
+ GnomeDialog parent;
+
+ /* item specific fields */
+ char *categories;
+ GtkWidget *entry;
+ ETableModel *model;
+
+ int list_length;
+ char **category_list;
+ gboolean *selected_list;
+
+ GladeXML *gui;
+};
+
+struct _EContactEditorCategoriesClass
+{
+ GnomeDialogClass parent_class;
+};
+
+
+GtkWidget *e_contact_editor_categories_new(char *categories);
+GtkType e_contact_editor_categories_get_type (void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __E_CONTACT_EDITOR_CATEGORIES_H__ */
diff --git a/addressbook/contact-editor/e-contact-editor-strings.h b/addressbook/contact-editor/e-contact-editor-strings.h
index 07aff370ad..b718d53500 100644
--- a/addressbook/contact-editor/e-contact-editor-strings.h
+++ b/addressbook/contact-editor/e-contact-editor-strings.h
@@ -5,32 +5,33 @@
*/
gchar *s = N_("Contact Editor");
-gchar *s = N_("Business Fax");
-gchar *s = N_("Home");
-gchar *s = N_("Business");
-gchar *s = N_("Mobile");
-gchar *s = N_("Primary Email");
-gchar *s = N_("\tFull Name...");
-gchar *s = N_("Job Title:");
+gchar *s = N_("_Full Name...");
gchar *s = N_("Company:");
gchar *s = N_("File As:");
gchar *s = N_("Web page address:");
-gchar *s = N_("This is the mailing address");
-gchar *s = N_("Wants HTML mail");
-gchar *s = N_("Business");
+gchar *s = N_("Wants _HTML mail");
gchar *s = N_("Address:");
+gchar *s = N_("_Business");
+gchar *s = N_("_Home");
+gchar *s = N_("Business _Fax");
+gchar *s = N_("_Mobile");
+gchar *s = N_("Primary Email");
+gchar *s = N_("Business");
+gchar *s = N_("This is the _mailing address");
+gchar *s = N_("_Contacts...");
+gchar *s = N_("Ca_tegories...");
+gchar *s = N_("Job Title");
gchar *s = N_("General");
gchar *s = N_("Department:");
gchar *s = N_("Office:");
gchar *s = N_("Profession:");
gchar *s = N_("Nickname:");
-gchar *s = N_("Spouse's name:");
-gchar *s = N_("Address:");
+gchar *s = N_("Spouse:");
gchar *s = N_("Birthday:");
gchar *s = N_("Assistant's name:");
-gchar *s = N_("Manager's name:");
+gchar *s = N_("Manager's Name:");
gchar *s = N_("Anniversary:");
-gchar *s = N_("Internet Free-Busy");
+gchar *s = N_("Notes:");
gchar *s = N_("Details");
gchar *s = N_("Add");
gchar *s = N_("Delete");
diff --git a/addressbook/contact-editor/e-contact-editor.c b/addressbook/contact-editor/e-contact-editor.c
index 58f6af1475..e898b6eedd 100644
--- a/addressbook/contact-editor/e-contact-editor.c
+++ b/addressbook/contact-editor/e-contact-editor.c
@@ -24,6 +24,7 @@
#include <gnome.h>
#include "e-contact-editor.h"
#include <e-contact-editor-fullname.h>
+#include <e-contact-editor-categories.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
@@ -159,6 +160,8 @@ _add_images(GtkTable *table)
_add_image(table, EVOLUTION_IMAGES "/globe.png",
0, 1, 8, 10);
_add_image(table, EVOLUTION_IMAGES "/house.png", 4, 5, 5, 10);
+ _add_image(table, EVOLUTION_IMAGES "/evolution-contacts.png", 0, 1, 12, 14);
+ _add_image(table, EVOLUTION_IMAGES "/briefcase.png", 4, 5, 12, 14);
}
static void
@@ -166,7 +169,7 @@ _add_details_images(GtkTable *table)
{
_add_image(table, EVOLUTION_IMAGES "/briefcase.png", 0, 1, 0, 2);
_add_image(table, EVOLUTION_IMAGES "/malehead.png", 0, 1, 4, 6);
- _add_image(table, EVOLUTION_IMAGES "/globe.png", 0, 1, 7, 9);
+ _add_image(table, EVOLUTION_IMAGES "/globe.png", 0, 1, 8, 10);
}
static void
@@ -456,7 +459,6 @@ full_name_clicked(GtkWidget *button, EContactEditor *editor)
GnomeDialog *dialog = GNOME_DIALOG(e_contact_editor_fullname_new(editor->name));
int result;
gtk_widget_show(GTK_WIDGET(dialog));
- gnome_dialog_close_hides (dialog, TRUE);
result = gnome_dialog_run_and_close (dialog);
if (result == 0) {
ECardName *name;
@@ -474,6 +476,27 @@ full_name_clicked(GtkWidget *button, EContactEditor *editor)
}
static void
+categories_clicked(GtkWidget *button, EContactEditor *editor)
+{
+ char *categories;
+ GnomeDialog *dialog;
+ int result;
+ GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-categories"));
+ categories = gtk_entry_get_text(entry);
+ dialog = GNOME_DIALOG(e_contact_editor_categories_new(categories));
+ gtk_widget_show(GTK_WIDGET(dialog));
+ result = gnome_dialog_run (dialog);
+ if (result == 0) {
+ gtk_object_get(GTK_OBJECT(dialog),
+ "categories", &categories,
+ NULL);
+ gtk_entry_set_text(entry, categories);
+ g_free(categories);
+ }
+ gtk_object_destroy(GTK_OBJECT(dialog));
+}
+
+static void
e_contact_editor_init (EContactEditor *e_contact_editor)
{
GladeXML *gui;
@@ -493,6 +516,9 @@ e_contact_editor_init (EContactEditor *e_contact_editor)
gtk_signal_connect(GTK_OBJECT(glade_xml_get_widget(e_contact_editor->gui, "button-fullname")), "clicked",
full_name_clicked, e_contact_editor);
+ gtk_signal_connect(GTK_OBJECT(glade_xml_get_widget(e_contact_editor->gui, "button-categories")), "clicked",
+ categories_clicked, e_contact_editor);
+
gtk_object_get(GTK_OBJECT(glade_xml_get_widget(gui, "text-comments")),
"vadjustment", &adjustment,
NULL);
@@ -739,7 +765,7 @@ e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *la
GtkWidget *dialog = gnome_dialog_new(title,
NULL);
-
+
gtk_container_add(GTK_CONTAINER(GNOME_DIALOG(dialog)->vbox),
gtk_widget_new (gtk_frame_get_type(),
"border_width", 4,
@@ -1022,9 +1048,9 @@ fill_in_info(EContactEditor *editor)
char *nickname;
char *spouse;
const ECardDate *anniversary;
- char *fburl;
char *note;
const ECardDate *bday;
+ char *categories;
GtkEditable *editable;
int position = 0;
@@ -1043,9 +1069,9 @@ fill_in_info(EContactEditor *editor)
"nickname", &nickname,
"spouse", &spouse,
"anniversary", &anniversary,
- "fburl", &fburl,
"note", &note,
"birth_date", &bday,
+ "categories", &categories,
NULL);
position = 0;
@@ -1121,12 +1147,6 @@ fill_in_info(EContactEditor *editor)
}
position = 0;
- editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-fburl"));
- gtk_editable_delete_text(editable, 0, -1);
- if (fburl)
- gtk_editable_insert_text(editable, fburl, strlen(fburl), &position);
-
- position = 0;
editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-profession"));
gtk_editable_delete_text(editable, 0, -1);
if (role)
@@ -1149,6 +1169,12 @@ fill_in_info(EContactEditor *editor)
dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-birthday"));
gnome_date_edit_set_time(dateedit, time_val);
}
+
+ position = 0;
+ editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-categories"));
+ gtk_editable_delete_text(editable, 0, -1);
+ if (categories)
+ gtk_editable_insert_text(editable, categories, strlen(categories), &position);
/* File as has to come after company and name or else it'll get messed up when setting them. */
position = 0;
@@ -1179,8 +1205,8 @@ extract_info(EContactEditor *editor)
char *nickname;
char *spouse;
ECardDate *anniversary;
- char *fburl;
char *note;
+ char *categories;
ECardDate *bday;
GtkEditable *editable;
GnomeDateEdit *dateedit;
@@ -1351,18 +1377,6 @@ extract_info(EContactEditor *editor)
"anniversary", anniversary,
NULL);
- editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-fburl"));
- fburl = gtk_editable_get_chars(editable, 0, -1);
- if (fburl && *fburl)
- gtk_object_set(GTK_OBJECT(card),
- "fburl", fburl,
- NULL);
- else
- gtk_object_set(GTK_OBJECT(card),
- "fburl", NULL,
- NULL);
- g_free(fburl);
-
editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "text-comments"));
note = gtk_editable_get_chars(editable, 0, -1);
if (note && *note)
@@ -1375,6 +1389,18 @@ extract_info(EContactEditor *editor)
NULL);
g_free(note);
+ editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-categories"));
+ categories = gtk_editable_get_chars(editable, 0, -1);
+ if (categories && *categories)
+ gtk_object_set(GTK_OBJECT(card),
+ "categories", categories,
+ NULL);
+ else
+ gtk_object_set(GTK_OBJECT(card),
+ "categories", NULL,
+ NULL);
+ g_free(categories);
+
dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-birthday"));
time_val = gnome_date_edit_get_date(dateedit);
gmtime_r(&time_val,
diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am
index 69a834722b..9df1ad065d 100644
--- a/addressbook/gui/component/Makefile.am
+++ b/addressbook/gui/component/Makefile.am
@@ -35,13 +35,13 @@ evolution_addressbook_LDADD = \
$(EXTRA_GNOME_LIBS) \
$(BONOBO_HTML_GNOME_LIBS) \
$(top_builddir)/addressbook/gui/minicard/libeminicard.a \
- $(top_builddir)/widgets/e-text/libetext.a \
- $(top_builddir)/widgets/e-table/libetable.a \
- $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
$(top_builddir)/addressbook/ename/libename.la \
$(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
- $(top_builddir)/libversit/libversit.la
+ $(top_builddir)/libversit/libversit.la \
+ $(top_builddir)/widgets/e-text/libetext.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la
evolution_addressbook_LDFLAGS = `gnome-config --libs gdk_pixbuf`
@@ -72,3 +72,4 @@ evolution-addressbook.pure: evolution-addressbook
endif
+
diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c
index 1807213798..5830eb95f8 100644
--- a/addressbook/gui/component/addressbook.c
+++ b/addressbook/gui/component/addressbook.c
@@ -101,6 +101,8 @@ new_contact_cb (BonoboUIHandler *uih, void *user_data, const char *path)
GtkObject *object;
GtkWidget* dlg = gnome_dialog_new ("Contact Editor", "Save", "Cancel", NULL);
+ gtk_window_set_policy(GTK_WINDOW(dlg), FALSE, TRUE, FALSE);
+
if (view->view)
object = GTK_OBJECT(view->view);
else
@@ -113,7 +115,8 @@ new_contact_cb (BonoboUIHandler *uih, void *user_data, const char *path)
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dlg)->vbox),
contact_editor, TRUE, TRUE, 0);
- gtk_widget_show_all (dlg);
+ gtk_widget_show (contact_editor);
+ gtk_widget_show (dlg);
gnome_dialog_close_hides (GNOME_DIALOG (dlg), TRUE);
result = gnome_dialog_run_and_close (GNOME_DIALOG (dlg));
@@ -731,7 +734,7 @@ create_table_view (AddressbookView *view, char *initial_query)
/* Create the column. */
ETableCol *ecol = e_table_col_new (
i, e_card_simple_get_name(view->simple, i+1),
- 80, 20, cell_left_just,
+ 1.0, 20, cell_left_just,
g_str_compare, TRUE);
/* Add it to the header. */
e_table_header_add_column (e_table_header, ecol, i);
diff --git a/addressbook/gui/contact-editor/Makefile.am b/addressbook/gui/contact-editor/Makefile.am
index 3998e4fccb..5133ffa30f 100644
--- a/addressbook/gui/contact-editor/Makefile.am
+++ b/addressbook/gui/contact-editor/Makefile.am
@@ -13,6 +13,7 @@ INCLUDES = \
-I$(top_srcdir) \
-I$(top_srcdir)/addressbook/ \
-I$(top_srcdir)/addressbook/backend \
+ -I$(top_srcdir)/widgets/e-table \
-DEVOLUTION_IMAGES=\""$(imagesdir)"\" \
-DG_LOG_DOMAIN=\"contact-editor\"
@@ -20,6 +21,8 @@ noinst_LIBRARIES = \
libecontacteditor.a
libecontacteditor_a_SOURCES = \
+ e-contact-editor-categories.c \
+ e-contact-editor-categories.h \
e-contact-editor-fullname.c \
e-contact-editor-fullname.h \
e-contact-editor.c \
@@ -39,14 +42,19 @@ contact_editor_test_LDADD = \
-lbonobo \
$(top_builddir)/e-util/libeutil.la \
libecontacteditor.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la \
+ $(top_builddir)/widgets/e-text/libetext.a \
$(EXTRA_GNOME_LIBS)
gladedir = $(datadir)/evolution/glade
glade_DATA = \
contact-editor.glade \
- fullname.glade
+ fullname.glade \
+ categories.glade
EXTRA_DIST = $(glade_DATA) \
e-contact-editor-strings.h \
- fullname-strings.h
+ fullname-strings.h \
+ categories-strings.h
diff --git a/addressbook/gui/contact-editor/categories-strings.h b/addressbook/gui/contact-editor/categories-strings.h
new file mode 100644
index 0000000000..813018a00e
--- /dev/null
+++ b/addressbook/gui/contact-editor/categories-strings.h
@@ -0,0 +1,9 @@
+/*
+ * Translatable strings file generated by Glade.
+ * Add this file to your project's POTFILES.in.
+ * DO NOT compile it as part of your application.
+ */
+
+gchar *s = N_("categories");
+gchar *s = N_("Item(s) belong to these categories:");
+gchar *s = N_("Available Categories:");
diff --git a/addressbook/gui/contact-editor/categories.glade b/addressbook/gui/contact-editor/categories.glade
new file mode 100644
index 0000000000..bf78008940
--- /dev/null
+++ b/addressbook/gui/contact-editor/categories.glade
@@ -0,0 +1,190 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>categories</name>
+ <program_name>categories</program_name>
+ <directory></directory>
+ <source_directory>src</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>True</gnome_support>
+ <gettext_support>False</gettext_support>
+ <use_widget_names>False</use_widget_names>
+ <output_main_file>False</output_main_file>
+ <output_support_files>False</output_support_files>
+ <output_build_files>False</output_build_files>
+ <backup_source_files>False</backup_source_files>
+ <main_source_file>interface.c</main_source_file>
+ <main_header_file>interface.h</main_header_file>
+ <handler_source_file>callbacks.c</handler_source_file>
+ <handler_header_file>callbacks.h</handler_header_file>
+ <support_source_file>support.c</support_source_file>
+ <support_header_file>support.h</support_header_file>
+ <output_translatable_strings>True</output_translatable_strings>
+ <translatable_strings_file>categories-strings.h</translatable_strings_file>
+</project>
+
+<widget>
+ <class>GnomeDialog</class>
+ <name>categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <visible>False</visible>
+ <title>categories</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>
+ <auto_close>False</auto_close>
+ <hide_on_close>False</hide_on_close>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDialog:vbox</child_name>
+ <name>dialog-vbox1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <homogeneous>False</homogeneous>
+ <spacing>8</spacing>
+ <child>
+ <padding>4</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table-categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <rows>4</rows>
+ <columns>1</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>0</row_spacing>
+ <column_spacing>0</column_spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkAccelLabel</class>
+ <name>accellabel1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Item(s) belong to these categories:</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>0</left_attach>
+ <right_attach>1</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>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkAccelLabel</class>
+ <name>accellabel2</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Available Categories:</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>0</left_attach>
+ <right_attach>1</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>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>entry-categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <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>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</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>
+
+ <widget>
+ <class>GtkHButtonBox</class>
+ <child_name>GnomeDialog:action_area</child_name>
+ <name>dialog-action_area1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <layout_style>GTK_BUTTONBOX_END</layout_style>
+ <spacing>8</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>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ <pack>GTK_PACK_END</pack>
+ </child>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <stock_button>GNOME_STOCK_BUTTON_OK</stock_button>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button3</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/addressbook/gui/contact-editor/contact-editor.glade b/addressbook/gui/contact-editor/contact-editor.glade
index 976508d41c..a450743ff8 100644
--- a/addressbook/gui/contact-editor/contact-editor.glade
+++ b/addressbook/gui/contact-editor/contact-editor.glade
@@ -56,7 +56,7 @@
<name>table-contact-editor-general</name>
<border_width>7</border_width>
<cxx_use_heap>True</cxx_use_heap>
- <rows>11</rows>
+ <rows>13</rows>
<columns>8</columns>
<homogeneous>False</homogeneous>
<row_spacing>4</row_spacing>
@@ -163,114 +163,6 @@
</widget>
<widget>
- <class>GtkLabel</class>
- <name>label-phone3</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Business Fax</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>5</left_attach>
- <right_attach>6</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>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone2</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Home</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>5</left_attach>
- <right_attach>6</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>GtkLabel</class>
- <name>label-phone1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Business</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>5</left_attach>
- <right_attach>6</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>True</yfill>
- </child>
- </widget>
-
- <widget>
- <class>GtkLabel</class>
- <name>label-phone4</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Mobile</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>5</left_attach>
- <right_attach>6</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>
-
- <widget>
<class>GtkText</class>
<name>text-address</name>
<width>1</width>
@@ -296,38 +188,11 @@
</widget>
<widget>
- <class>GtkLabel</class>
- <name>label-email1</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Primary Email</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>2</right_attach>
- <top_attach>5</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>
<class>GtkButton</class>
<name>button-fullname</name>
<cxx_use_heap>True</cxx_use_heap>
<can_focus>True</can_focus>
- <label> Full Name...</label>
+ <label>_Full Name...</label>
<child>
<left_attach>1</left_attach>
<right_attach>3</right_attach>
@@ -346,33 +211,6 @@
<widget>
<class>GtkAccelLabel</class>
- <name>accellabel-jobtitle</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Job Title:</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>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>GtkAccelLabel</class>
<name>accellabel-company</name>
<cxx_use_heap>True</cxx_use_heap>
<label>Company:</label>
@@ -454,40 +292,6 @@
<widget>
<class>GtkAlignment</class>
- <name>alignment2</name>
- <cxx_use_heap>True</cxx_use_heap>
- <xalign>0</xalign>
- <yalign>0</yalign>
- <xscale>0</xscale>
- <yscale>0</yscale>
- <child>
- <left_attach>7</left_attach>
- <right_attach>8</right_attach>
- <top_attach>9</top_attach>
- <bottom_attach>10</bottom_attach>
- <xpad>0</xpad>
- <ypad>0</ypad>
- <xexpand>True</xexpand>
- <yexpand>False</yexpand>
- <xshrink>False</xshrink>
- <yshrink>False</yshrink>
- <xfill>True</xfill>
- <yfill>True</yfill>
- </child>
-
- <widget>
- <class>GtkCheckButton</class>
- <name>checkbutton-mailingaddress</name>
- <cxx_use_heap>True</cxx_use_heap>
- <visible>False</visible>
- <label>This is the mailing address</label>
- <active>False</active>
- <draw_indicator>True</draw_indicator>
- </widget>
- </widget>
-
- <widget>
- <class>GtkAlignment</class>
<name>alignment3</name>
<cxx_use_heap>True</cxx_use_heap>
<xalign>1</xalign>
@@ -880,60 +684,6 @@
</widget>
<widget>
- <class>GtkHBox</class>
- <name>hbox5</name>
- <cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>0</spacing>
- <child>
- <left_attach>0</left_attach>
- <right_attach>8</right_attach>
- <top_attach>10</top_attach>
- <bottom_attach>11</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>
- <class>GtkText</class>
- <name>text-comments</name>
- <cxx_use_heap>True</cxx_use_heap>
- <can_focus>True</can_focus>
- <editable>True</editable>
- <text></text>
- <child>
- <padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
- </child>
- </widget>
-
- <widget>
- <class>GtkVScrollbar</class>
- <name>vscrollbar-comments</name>
- <cxx_use_heap>True</cxx_use_heap>
- <policy>GTK_UPDATE_CONTINUOUS</policy>
- <value>0</value>
- <lower>0</lower>
- <upper>0</upper>
- <step>0</step>
- <page>0</page>
- <page_size>0</page_size>
- <child>
- <padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
- </child>
- </widget>
- </widget>
-
- <widget>
<class>GtkAlignment</class>
<name>alignment10</name>
<cxx_use_heap>True</cxx_use_heap>
@@ -960,27 +710,217 @@
<class>GtkCheckButton</class>
<name>checkbutton-htmlmail</name>
<cxx_use_heap>True</cxx_use_heap>
- <visible>False</visible>
- <label>Wants HTML mail</label>
+ <label>Wants _HTML mail</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
</widget>
</widget>
<widget>
+ <class>GtkAlignment</class>
+ <name>alignment4</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <xalign>1</xalign>
+ <yalign>0.5</yalign>
+ <xscale>0</xscale>
+ <yscale>0</yscale>
+ <child>
+ <left_attach>6</left_attach>
+ <right_attach>7</right_attach>
+ <top_attach>5</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>button-address1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
<class>GtkLabel</class>
- <name>label-address1</name>
+ <name>address-label</name>
<cxx_use_heap>True</cxx_use_heap>
- <label>Business</label>
+ <label>Address:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
+ <focus_target>text-address</focus_target>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>7</right_attach>
+ <top_attach>6</top_attach>
+ <bottom_attach>7</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>GtkEventBox</class>
+ <name>eventbox1</name>
+ <cxx_use_heap>True</cxx_use_heap>
<child>
<left_attach>5</left_attach>
<right_attach>6</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>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label-phone1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>_Business</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-phone1</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox2</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>6</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>
+ <class>GtkLabel</class>
+ <name>label-phone2</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>_Home</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-phone2</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox3</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>6</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>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label-phone3</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Business _Fax</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-phone3</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox4</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>6</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>GtkLabel</class>
+ <name>label-phone4</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>_Mobile</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-phone4</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox5</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
<top_attach>5</top_attach>
<bottom_attach>6</bottom_attach>
<xpad>0</xpad>
@@ -992,21 +932,142 @@
<xfill>True</xfill>
<yfill>True</yfill>
</child>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label-email1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Primary Email</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>entry-email1</focus_target>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox-business</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>5</left_attach>
+ <right_attach>6</right_attach>
+ <top_attach>5</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>GtkLabel</class>
+ <name>label-address1</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Business</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <focus_target>text-address</focus_target>
+ </widget>
</widget>
<widget>
<class>GtkAlignment</class>
- <name>alignment4</name>
+ <name>alignment2</name>
<cxx_use_heap>True</cxx_use_heap>
- <xalign>1</xalign>
- <yalign>0.5</yalign>
+ <xalign>0</xalign>
+ <yalign>0</yalign>
<xscale>0</xscale>
<yscale>0</yscale>
<child>
- <left_attach>6</left_attach>
- <right_attach>7</right_attach>
- <top_attach>5</top_attach>
- <bottom_attach>6</bottom_attach>
+ <left_attach>7</left_attach>
+ <right_attach>8</right_attach>
+ <top_attach>9</top_attach>
+ <bottom_attach>10</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkCheckButton</class>
+ <name>checkbutton-mailingaddress</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>This is the _mailing address</label>
+ <active>False</active>
+ <draw_indicator>True</draw_indicator>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkHSeparator</class>
+ <name>hseparator9</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>11</top_attach>
+ <bottom_attach>12</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>2</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkHSeparator</class>
+ <name>hseparator10</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>4</left_attach>
+ <right_attach>8</right_attach>
+ <top_attach>11</top_attach>
+ <bottom_attach>12</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkAlignment</class>
+ <name>alignment12</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>12</top_attach>
+ <bottom_attach>13</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
@@ -1019,31 +1080,124 @@
<widget>
<class>GtkButton</class>
- <name>button-address1</name>
+ <name>button-contacts</name>
<cxx_use_heap>True</cxx_use_heap>
+ <can_focus>True</can_focus>
+ <label>_Contacts...</label>
+ </widget>
+ </widget>
- <widget>
- <class>Placeholder</class>
- </widget>
+ <widget>
+ <class>GtkAlignment</class>
+ <name>alignment15</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
+ <child>
+ <left_attach>7</left_attach>
+ <right_attach>8</right_attach>
+ <top_attach>12</top_attach>
+ <bottom_attach>13</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>entry-categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_focus>True</can_focus>
+ <editable>True</editable>
+ <text_visible>True</text_visible>
+ <text_max_length>0</text_max_length>
+ <text></text>
</widget>
</widget>
<widget>
- <class>GtkLabel</class>
- <name>address-label</name>
+ <class>GtkAlignment</class>
+ <name>alignment14</name>
<cxx_use_heap>True</cxx_use_heap>
- <label>Address:</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0</xalign>
+ <xalign>0.5</xalign>
<yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>0</ypad>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
+ <child>
+ <left_attach>3</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>12</top_attach>
+ <bottom_attach>13</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>entry-contacts</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_focus>True</can_focus>
+ <editable>True</editable>
+ <text_visible>True</text_visible>
+ <text_max_length>0</text_max_length>
+ <text></text>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkAlignment</class>
+ <name>alignment16</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xscale>1</xscale>
+ <yscale>0</yscale>
<child>
<left_attach>5</left_attach>
<right_attach>7</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
+ <top_attach>12</top_attach>
+ <bottom_attach>13</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>button-categories</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <can_focus>True</can_focus>
+ <label>Ca_tegories...</label>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkEventBox</class>
+ <name>eventbox7</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
<xexpand>False</xexpand>
@@ -1053,6 +1207,19 @@
<xfill>True</xfill>
<yfill>True</yfill>
</child>
+
+ <widget>
+ <class>GtkAccelLabel</class>
+ <name>accellabel-jobtitle</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Job Title</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ </widget>
</widget>
</widget>
@@ -1193,7 +1360,7 @@
<class>GtkLabel</class>
<name>label25</name>
<cxx_use_heap>True</cxx_use_heap>
- <label>Spouse's name:</label>
+ <label>Spouse:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
@@ -1218,33 +1385,6 @@
<widget>
<class>GtkLabel</class>
- <name>label28</name>
- <cxx_use_heap>True</cxx_use_heap>
- <label>Address:</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>2</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>8</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>GtkLabel</class>
<name>label31</name>
<cxx_use_heap>True</cxx_use_heap>
<label>Birthday:</label>
@@ -1301,7 +1441,7 @@
<class>GtkLabel</class>
<name>label29</name>
<cxx_use_heap>True</cxx_use_heap>
- <label>Manager's name:</label>
+ <label>Manager's Name:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0</xalign>
@@ -1477,31 +1617,6 @@
</widget>
<widget>
- <class>GtkEntry</class>
- <name>entry-fburl</name>
- <cxx_use_heap>True</cxx_use_heap>
- <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>6</right_attach>
- <top_attach>7</top_attach>
- <bottom_attach>8</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>GnomeDateEdit</class>
<name>dateedit-anniversary</name>
<cxx_use_heap>True</cxx_use_heap>
@@ -1602,68 +1717,119 @@
</widget>
<widget>
- <class>GtkHBox</class>
- <name>hbox7</name>
+ <class>GtkHSeparator</class>
+ <name>hseparator7</name>
<cxx_use_heap>True</cxx_use_heap>
- <homogeneous>False</homogeneous>
- <spacing>6</spacing>
<child>
<left_attach>0</left_attach>
<right_attach>6</right_attach>
- <top_attach>6</top_attach>
- <bottom_attach>7</bottom_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>2</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label33</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <label>Notes:</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>2</right_attach>
+ <top_attach>7</top_attach>
+ <bottom_attach>8</bottom_attach>
<xpad>0</xpad>
<ypad>0</ypad>
- <xexpand>True</xexpand>
+ <xexpand>False</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
<xfill>True</xfill>
<yfill>True</yfill>
</child>
+ </widget>
+
+ <widget>
+ <class>GtkHBox</class>
+ <name>hbox5</name>
+ <cxx_use_heap>True</cxx_use_heap>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>6</right_attach>
+ <top_attach>8</top_attach>
+ <bottom_attach>9</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
<widget>
- <class>GtkLabel</class>
- <name>label33</name>
+ <class>GtkText</class>
+ <name>text-comments</name>
+ <height>50</height>
<cxx_use_heap>True</cxx_use_heap>
- <label>Internet Free-Busy</label>
- <justify>GTK_JUSTIFY_CENTER</justify>
- <wrap>False</wrap>
- <xalign>0.5</xalign>
- <yalign>0.5</yalign>
- <xpad>0</xpad>
- <ypad>2</ypad>
+ <can_focus>True</can_focus>
+ <editable>True</editable>
+ <text></text>
<child>
<padding>0</padding>
- <expand>False</expand>
- <fill>False</fill>
+ <expand>True</expand>
+ <fill>True</fill>
</child>
</widget>
<widget>
- <class>GtkHSeparator</class>
- <name>hseparator8</name>
+ <class>GtkVScrollbar</class>
+ <name>vscrollbar-comments</name>
<cxx_use_heap>True</cxx_use_heap>
+ <policy>GTK_UPDATE_CONTINUOUS</policy>
+ <value>0</value>
+ <lower>0</lower>
+ <upper>0</upper>
+ <step>0</step>
+ <page>0</page>
+ <page_size>0</page_size>
<child>
<padding>0</padding>
- <expand>True</expand>
- <fill>True</fill>
+ <expand>False</expand>
+ <fill>False</fill>
</child>
</widget>
</widget>
<widget>
<class>GtkHSeparator</class>
- <name>hseparator7</name>
+ <name>hseparator8</name>
<cxx_use_heap>True</cxx_use_heap>
<child>
<left_attach>0</left_attach>
<right_attach>6</right_attach>
- <top_attach>3</top_attach>
- <bottom_attach>4</bottom_attach>
+ <top_attach>6</top_attach>
+ <bottom_attach>7</bottom_attach>
<xpad>0</xpad>
- <ypad>2</ypad>
- <xexpand>False</xexpand>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
<yexpand>False</yexpand>
<xshrink>False</xshrink>
<yshrink>False</yshrink>
diff --git a/addressbook/gui/contact-editor/e-contact-editor-categories.c b/addressbook/gui/contact-editor/e-contact-editor-categories.c
new file mode 100644
index 0000000000..14b10d21c8
--- /dev/null
+++ b/addressbook/gui/contact-editor/e-contact-editor-categories.c
@@ -0,0 +1,435 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * e-contact-editor-categories.c
+ * Copyright (C) 2000 Helix Code, Inc.
+ * Author: Chris Lahey <clahey@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 <config.h>
+#include <gnome.h>
+#include <e-contact-editor-categories.h>
+#include <e-table.h>
+#include <e-table-simple.h>
+#include <e-cell-text.h>
+#include <e-cell-checkbox.h>
+
+static void e_contact_editor_categories_init (EContactEditorCategories *card);
+static void e_contact_editor_categories_class_init (EContactEditorCategoriesClass *klass);
+static void e_contact_editor_categories_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
+static void e_contact_editor_categories_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
+static void e_contact_editor_categories_destroy (GtkObject *object);
+static int e_contact_editor_categories_col_count (ETableModel *etc, gpointer data);
+static int e_contact_editor_categories_row_count (ETableModel *etc, gpointer data);
+static void *e_contact_editor_categories_value_at (ETableModel *etc, int col, int row, gpointer data);
+static void e_contact_editor_categories_set_value_at (ETableModel *etc, int col, int row, const void *val, gpointer data);
+static gboolean e_contact_editor_categories_is_cell_editable (ETableModel *etc, int col, int row, gpointer data);
+static void *e_contact_editor_categories_duplicate_value (ETableModel *etc, int col, const void *value, gpointer data);
+static void e_contact_editor_categories_free_value (ETableModel *etc, int col, void *value, gpointer data);
+static void e_contact_editor_categories_thaw (ETableModel *etc, gpointer data);
+
+static GnomeDialogClass *parent_class = NULL;
+
+/* The arguments we take */
+enum {
+ ARG_0,
+ ARG_CATEGORIES
+};
+
+GtkType
+e_contact_editor_categories_get_type (void)
+{
+ static GtkType contact_editor_categories_type = 0;
+
+ if (!contact_editor_categories_type)
+ {
+ static const GtkTypeInfo contact_editor_categories_info =
+ {
+ "EContactEditorCategories",
+ sizeof (EContactEditorCategories),
+ sizeof (EContactEditorCategoriesClass),
+ (GtkClassInitFunc) e_contact_editor_categories_class_init,
+ (GtkObjectInitFunc) e_contact_editor_categories_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+
+ contact_editor_categories_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_categories_info);
+ }
+
+ return contact_editor_categories_type;
+}
+
+static void
+e_contact_editor_categories_class_init (EContactEditorCategoriesClass *klass)
+{
+ GtkObjectClass *object_class;
+ GnomeDialogClass *dialog_class;
+
+ object_class = (GtkObjectClass*) klass;
+ dialog_class = (GnomeDialogClass *) klass;
+
+ parent_class = gtk_type_class (gnome_dialog_get_type ());
+
+ gtk_object_add_arg_type ("EContactEditorCategories::categories", GTK_TYPE_STRING,
+ GTK_ARG_READWRITE, ARG_CATEGORIES);
+
+ object_class->set_arg = e_contact_editor_categories_set_arg;
+ object_class->get_arg = e_contact_editor_categories_get_arg;
+ object_class->destroy = e_contact_editor_categories_destroy;
+}
+
+gchar *builtin_categories[] = {
+ "Business",
+ "Competition",
+ "Favorites",
+ "Gifts",
+ "Goals/Objectives",
+ "Holiday",
+ "Holiday Cards",
+ "Hot Contacts",
+ "Ideas",
+ "International",
+ "Key Customer",
+ "Miscellaneous",
+ "Personal",
+ "Phone Calls",
+ "Status",
+ "Strategies",
+ "Suppliers",
+ "Time & Expenses",
+ "VIP",
+ "Waiting",
+};
+
+#define BUILTIN_CATEGORY_COUNT (sizeof(builtin_categories) / sizeof(builtin_categories[0]))
+
+static void
+add_list_unique(EContactEditorCategories *categories, char *string)
+{
+ int k;
+ char *temp = e_strdup_strip(string);
+ char **list = categories->category_list;
+
+ if (!*temp) {
+ g_free(temp);
+ return;
+ }
+ for (k = 0; k < categories->list_length; k++) {
+ if (!strcmp(list[k], temp)) {
+ categories->selected_list[k] = TRUE;
+ g_free(temp);
+ break;
+ }
+ }
+ if (k == categories->list_length) {
+ categories->selected_list[categories->list_length] = TRUE;
+ list[categories->list_length++] = temp;
+ }
+}
+
+static void
+do_parse_categories(EContactEditorCategories *categories)
+{
+ char *str = categories->categories;
+ int length = strlen(str);
+ char *copy = g_new(char, length + 1);
+ int i, j;
+ char **list;
+ int count = 1;
+ for (i = 0; str[i]; i++) {
+ switch (str[i]) {
+ case '\\':
+ i++;
+ if (!str[i])
+ i--;
+ break;
+ case ',':
+ count ++;
+ break;
+ }
+ }
+
+ for (i = 0; i < categories->list_length; i++)
+ g_free(categories->category_list[i]);
+ g_free(categories->category_list);
+ list = g_new(char *, count + 1 + BUILTIN_CATEGORY_COUNT);
+ categories->category_list = list;
+
+ g_free(categories->selected_list);
+ categories->selected_list = g_new(gboolean, count + 1 + BUILTIN_CATEGORY_COUNT);
+
+ for (count = 0; count < BUILTIN_CATEGORY_COUNT; count++) {
+ list[count] = g_strdup(builtin_categories[count]);
+ categories->selected_list[count] = 0;
+ }
+ categories->list_length = count;
+
+ for (i = 0, j = 0; str[i]; i++, j++) {
+ switch (str[i]) {
+ case '\\':
+ i++;
+ if (str[i]) {
+ copy[j] = str[i];
+ } else
+ i--;
+ break;
+ case ',':
+ copy[j] = 0;
+ add_list_unique(categories, copy);
+ j = -1;
+ break;
+ default:
+ copy[j] = str[i];
+ break;
+ }
+ }
+ copy[j] = 0;
+ add_list_unique(categories, copy);
+ g_free(copy);
+ e_table_model_changed(categories->model);
+}
+
+static void
+e_contact_editor_categories_entry_change (GtkWidget *entry,
+ EContactEditorCategories *categories)
+{
+ if (categories->categories)
+ g_free(categories->categories);
+ categories->categories = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
+ do_parse_categories(categories);
+}
+
+
+#define INITIAL_SPEC "<ETableSpecification no-header=\"1\"> \
+ <columns-shown> \
+ <column> 0 </column> \
+ <column> 1 </column> \
+ </columns-shown> \
+ <grouping> <leaf column=\"1\" ascending=\"1\"/> </grouping> \
+</ETableSpecification>"
+
+static void
+e_contact_editor_categories_init (EContactEditorCategories *categories)
+{
+ GladeXML *gui;
+ GtkWidget *table;
+ ECell *cell_left_just;
+ ECell *cell_checkbox;
+ ETableHeader *header;
+ ETableCol *col;
+ GtkWidget *e_table;
+
+ categories->list_length = 0;
+ categories->category_list = NULL;
+ categories->selected_list = NULL;
+
+ gnome_dialog_append_button ( GNOME_DIALOG(categories),
+ GNOME_STOCK_BUTTON_OK);
+
+ gnome_dialog_append_button ( GNOME_DIALOG(categories),
+ GNOME_STOCK_BUTTON_CANCEL);
+
+ gtk_window_set_policy(GTK_WINDOW(categories), TRUE, TRUE, FALSE);
+
+ categories->categories = NULL;
+ gui = glade_xml_new (EVOLUTION_GLADEDIR "/categories.glade", NULL);
+ categories->gui = gui;
+
+ table = glade_xml_get_widget(gui, "table-categories");
+ gtk_widget_ref(table);
+ gtk_container_remove(GTK_CONTAINER(table->parent), table);
+ gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (categories)->vbox), table, TRUE, TRUE, 0);
+ gtk_widget_unref(table);
+
+ categories->entry = glade_xml_get_widget(gui, "entry-categories");
+
+ gtk_signal_connect(GTK_OBJECT(categories->entry), "changed",
+ GTK_SIGNAL_FUNC(e_contact_editor_categories_entry_change), categories);
+
+ categories->model = e_table_simple_new(e_contact_editor_categories_col_count,
+ e_contact_editor_categories_row_count,
+ e_contact_editor_categories_value_at,
+ e_contact_editor_categories_set_value_at,
+ e_contact_editor_categories_is_cell_editable,
+ e_contact_editor_categories_duplicate_value,
+ e_contact_editor_categories_free_value,
+ e_contact_editor_categories_thaw,
+ categories);
+
+ header = e_table_header_new();
+
+ cell_checkbox = e_cell_checkbox_new();
+ col = e_table_col_new (0, "",
+ 0, 20, cell_checkbox,
+ g_int_compare, TRUE);
+ e_table_header_add_column (header, col, 0);
+
+ cell_left_just = e_cell_text_new (categories->model, NULL, GTK_JUSTIFY_LEFT);
+ col = e_table_col_new (1, "Category",
+ 1.0, 20, cell_left_just,
+ g_str_compare, TRUE);
+ e_table_header_add_column (header, col, 1);
+
+ e_table = e_table_new (header, categories->model, INITIAL_SPEC);
+
+ gtk_widget_show(e_table);
+
+ gtk_table_attach_defaults(GTK_TABLE(table),
+ e_table,
+ 0, 1,
+ 3, 4);
+}
+
+void
+e_contact_editor_categories_destroy (GtkObject *object)
+{
+ EContactEditorCategories *e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES(object);
+
+ if (e_contact_editor_categories->gui)
+ gtk_object_unref(GTK_OBJECT(e_contact_editor_categories->gui));
+ g_free(e_contact_editor_categories->categories);
+}
+
+GtkWidget*
+e_contact_editor_categories_new (char *categories)
+{
+ GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_categories_get_type ()));
+ gtk_object_set (GTK_OBJECT(widget),
+ "categories", categories,
+ NULL);
+ return widget;
+}
+
+static void
+e_contact_editor_categories_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
+{
+ EContactEditorCategories *e_contact_editor_categories;
+
+ e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES (o);
+
+ switch (arg_id){
+ case ARG_CATEGORIES:
+ gtk_entry_set_text(GTK_ENTRY(e_contact_editor_categories->entry), GTK_VALUE_STRING (*arg));
+ break;
+ }
+}
+
+static void
+e_contact_editor_categories_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
+{
+ EContactEditorCategories *e_contact_editor_categories;
+
+ e_contact_editor_categories = E_CONTACT_EDITOR_CATEGORIES (object);
+
+ switch (arg_id) {
+ case ARG_CATEGORIES:
+ GTK_VALUE_STRING (*arg) = g_strdup(e_contact_editor_categories->categories);
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+/* This function returns the number of columns in our ETableModel. */
+static int
+e_contact_editor_categories_col_count (ETableModel *etc, gpointer data)
+{
+ return 2;
+}
+
+/* This function returns the number of rows in our ETableModel. */
+static int
+e_contact_editor_categories_row_count (ETableModel *etc, gpointer data)
+{
+ EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
+ return categories->list_length;
+}
+
+/* This function returns the value at a particular point in our ETableModel. */
+static void *
+e_contact_editor_categories_value_at (ETableModel *etc, int col, int row, gpointer data)
+{
+ EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
+ if (col == 0)
+ return (void *) categories->selected_list[row];
+ else
+ return categories->category_list[row];
+}
+
+/* This function sets the value at a particular point in our ETableModel. */
+static void
+e_contact_editor_categories_set_value_at (ETableModel *etc, int col, int row, const void *val, gpointer data)
+{
+ EContactEditorCategories *categories = E_CONTACT_EDITOR_CATEGORIES(data);
+ if ( col == 0 ) {
+ char **strs;
+ int i, j;
+ char *string;
+ categories->selected_list[row] = (gboolean) val;
+ strs = g_new(char *, categories->list_length + 1);
+ for (i = 0, j = 0; i < categories->list_length; i++) {
+ if (categories->selected_list[i])
+ strs[j++] = categories->category_list[i];
+ }
+ strs[j] = 0;
+ string = g_strjoinv(", ", strs);
+ gtk_entry_set_text(GTK_ENTRY(categories->entry), string);
+ g_free(string);
+ g_free(strs);
+ }
+ if ( col == 1 )
+ return;
+}
+
+/* This function returns whether a particular cell is editable. */
+static gboolean
+e_contact_editor_categories_is_cell_editable (ETableModel *etc, int col, int row, gpointer data)
+{
+ return col == 0;
+}
+
+/* This function duplicates the value passed to it. */
+static void *
+e_contact_editor_categories_duplicate_value (ETableModel *etc, int col, const void *value, gpointer data)
+{
+ if (col == 0)
+ return (void *)value;
+ else
+ return g_strdup(value);
+}
+
+/* This function frees the value passed to it. */
+static void
+e_contact_editor_categories_free_value (ETableModel *etc, int col, void *value, gpointer data)
+{
+ if (col == 0)
+ return;
+ else
+ g_free(value);
+}
+
+/* This function is for when the model is unfrozen. This can mostly
+ be ignored for simple models. */
+static void
+e_contact_editor_categories_thaw (ETableModel *etc, gpointer data)
+{
+ e_table_model_changed(etc);
+}
+
diff --git a/addressbook/gui/contact-editor/e-contact-editor-categories.h b/addressbook/gui/contact-editor/e-contact-editor-categories.h
new file mode 100644
index 0000000000..529ef71b68
--- /dev/null
+++ b/addressbook/gui/contact-editor/e-contact-editor-categories.h
@@ -0,0 +1,83 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* e-contact-editor-categories.h
+ * Copyright (C) 2000 Helix Code, Inc.
+ * Author: Chris Lahey <clahey@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_EDITOR_CATEGORIES_H__
+#define __E_CONTACT_EDITOR_CATEGORIES_H__
+
+#include <gnome.h>
+#include <glade/glade.h>
+#include <ebook/e-card.h>
+#include <widgets/e-table/e-table-model.h>
+
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif /* __cplusplus */
+
+/* EContactEditorCategories - A dialog displaying information about a contact.
+ *
+ * The following arguments are available:
+ *
+ * name type read/write description
+ * --------------------------------------------------------------------------------
+ * name ECardName * RW The card currently being edited. Returns a copy.
+ */
+
+#define E_CONTACT_EDITOR_CATEGORIES_TYPE (e_contact_editor_categories_get_type ())
+#define E_CONTACT_EDITOR_CATEGORIES(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE, EContactEditorCategories))
+#define E_CONTACT_EDITOR_CATEGORIES_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_CATEGORIES_TYPE, EContactEditorCategoriesClass))
+#define E_IS_CONTACT_EDITOR_CATEGORIES(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE))
+#define E_IS_CONTACT_EDITOR_CATEGORIES_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_CATEGORIES_TYPE))
+
+
+typedef struct _EContactEditorCategories EContactEditorCategories;
+typedef struct _EContactEditorCategoriesClass EContactEditorCategoriesClass;
+
+struct _EContactEditorCategories
+{
+ GnomeDialog parent;
+
+ /* item specific fields */
+ char *categories;
+ GtkWidget *entry;
+ ETableModel *model;
+
+ int list_length;
+ char **category_list;
+ gboolean *selected_list;
+
+ GladeXML *gui;
+};
+
+struct _EContactEditorCategoriesClass
+{
+ GnomeDialogClass parent_class;
+};
+
+
+GtkWidget *e_contact_editor_categories_new(char *categories);
+GtkType e_contact_editor_categories_get_type (void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __E_CONTACT_EDITOR_CATEGORIES_H__ */
diff --git a/addressbook/gui/contact-editor/e-contact-editor-strings.h b/addressbook/gui/contact-editor/e-contact-editor-strings.h
index 07aff370ad..b718d53500 100644
--- a/addressbook/gui/contact-editor/e-contact-editor-strings.h
+++ b/addressbook/gui/contact-editor/e-contact-editor-strings.h
@@ -5,32 +5,33 @@
*/
gchar *s = N_("Contact Editor");
-gchar *s = N_("Business Fax");
-gchar *s = N_("Home");
-gchar *s = N_("Business");
-gchar *s = N_("Mobile");
-gchar *s = N_("Primary Email");
-gchar *s = N_("\tFull Name...");
-gchar *s = N_("Job Title:");
+gchar *s = N_("_Full Name...");
gchar *s = N_("Company:");
gchar *s = N_("File As:");
gchar *s = N_("Web page address:");
-gchar *s = N_("This is the mailing address");
-gchar *s = N_("Wants HTML mail");
-gchar *s = N_("Business");
+gchar *s = N_("Wants _HTML mail");
gchar *s = N_("Address:");
+gchar *s = N_("_Business");
+gchar *s = N_("_Home");
+gchar *s = N_("Business _Fax");
+gchar *s = N_("_Mobile");
+gchar *s = N_("Primary Email");
+gchar *s = N_("Business");
+gchar *s = N_("This is the _mailing address");
+gchar *s = N_("_Contacts...");
+gchar *s = N_("Ca_tegories...");
+gchar *s = N_("Job Title");
gchar *s = N_("General");
gchar *s = N_("Department:");
gchar *s = N_("Office:");
gchar *s = N_("Profession:");
gchar *s = N_("Nickname:");
-gchar *s = N_("Spouse's name:");
-gchar *s = N_("Address:");
+gchar *s = N_("Spouse:");
gchar *s = N_("Birthday:");
gchar *s = N_("Assistant's name:");
-gchar *s = N_("Manager's name:");
+gchar *s = N_("Manager's Name:");
gchar *s = N_("Anniversary:");
-gchar *s = N_("Internet Free-Busy");
+gchar *s = N_("Notes:");
gchar *s = N_("Details");
gchar *s = N_("Add");
gchar *s = N_("Delete");
diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c
index 58f6af1475..e898b6eedd 100644
--- a/addressbook/gui/contact-editor/e-contact-editor.c
+++ b/addressbook/gui/contact-editor/e-contact-editor.c
@@ -24,6 +24,7 @@
#include <gnome.h>
#include "e-contact-editor.h"
#include <e-contact-editor-fullname.h>
+#include <e-contact-editor-categories.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk-pixbuf/gnome-canvas-pixbuf.h>
@@ -159,6 +160,8 @@ _add_images(GtkTable *table)
_add_image(table, EVOLUTION_IMAGES "/globe.png",
0, 1, 8, 10);
_add_image(table, EVOLUTION_IMAGES "/house.png", 4, 5, 5, 10);
+ _add_image(table, EVOLUTION_IMAGES "/evolution-contacts.png", 0, 1, 12, 14);
+ _add_image(table, EVOLUTION_IMAGES "/briefcase.png", 4, 5, 12, 14);
}
static void
@@ -166,7 +169,7 @@ _add_details_images(GtkTable *table)
{
_add_image(table, EVOLUTION_IMAGES "/briefcase.png", 0, 1, 0, 2);
_add_image(table, EVOLUTION_IMAGES "/malehead.png", 0, 1, 4, 6);
- _add_image(table, EVOLUTION_IMAGES "/globe.png", 0, 1, 7, 9);
+ _add_image(table, EVOLUTION_IMAGES "/globe.png", 0, 1, 8, 10);
}
static void
@@ -456,7 +459,6 @@ full_name_clicked(GtkWidget *button, EContactEditor *editor)
GnomeDialog *dialog = GNOME_DIALOG(e_contact_editor_fullname_new(editor->name));
int result;
gtk_widget_show(GTK_WIDGET(dialog));
- gnome_dialog_close_hides (dialog, TRUE);
result = gnome_dialog_run_and_close (dialog);
if (result == 0) {
ECardName *name;
@@ -474,6 +476,27 @@ full_name_clicked(GtkWidget *button, EContactEditor *editor)
}
static void
+categories_clicked(GtkWidget *button, EContactEditor *editor)
+{
+ char *categories;
+ GnomeDialog *dialog;
+ int result;
+ GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-categories"));
+ categories = gtk_entry_get_text(entry);
+ dialog = GNOME_DIALOG(e_contact_editor_categories_new(categories));
+ gtk_widget_show(GTK_WIDGET(dialog));
+ result = gnome_dialog_run (dialog);
+ if (result == 0) {
+ gtk_object_get(GTK_OBJECT(dialog),
+ "categories", &categories,
+ NULL);
+ gtk_entry_set_text(entry, categories);
+ g_free(categories);
+ }
+ gtk_object_destroy(GTK_OBJECT(dialog));
+}
+
+static void
e_contact_editor_init (EContactEditor *e_contact_editor)
{
GladeXML *gui;
@@ -493,6 +516,9 @@ e_contact_editor_init (EContactEditor *e_contact_editor)
gtk_signal_connect(GTK_OBJECT(glade_xml_get_widget(e_contact_editor->gui, "button-fullname")), "clicked",
full_name_clicked, e_contact_editor);
+ gtk_signal_connect(GTK_OBJECT(glade_xml_get_widget(e_contact_editor->gui, "button-categories")), "clicked",
+ categories_clicked, e_contact_editor);
+
gtk_object_get(GTK_OBJECT(glade_xml_get_widget(gui, "text-comments")),
"vadjustment", &adjustment,
NULL);
@@ -739,7 +765,7 @@ e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *la
GtkWidget *dialog = gnome_dialog_new(title,
NULL);
-
+
gtk_container_add(GTK_CONTAINER(GNOME_DIALOG(dialog)->vbox),
gtk_widget_new (gtk_frame_get_type(),
"border_width", 4,
@@ -1022,9 +1048,9 @@ fill_in_info(EContactEditor *editor)
char *nickname;
char *spouse;
const ECardDate *anniversary;
- char *fburl;
char *note;
const ECardDate *bday;
+ char *categories;
GtkEditable *editable;
int position = 0;
@@ -1043,9 +1069,9 @@ fill_in_info(EContactEditor *editor)
"nickname", &nickname,
"spouse", &spouse,
"anniversary", &anniversary,
- "fburl", &fburl,
"note", &note,
"birth_date", &bday,
+ "categories", &categories,
NULL);
position = 0;
@@ -1121,12 +1147,6 @@ fill_in_info(EContactEditor *editor)
}
position = 0;
- editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-fburl"));
- gtk_editable_delete_text(editable, 0, -1);
- if (fburl)
- gtk_editable_insert_text(editable, fburl, strlen(fburl), &position);
-
- position = 0;
editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-profession"));
gtk_editable_delete_text(editable, 0, -1);
if (role)
@@ -1149,6 +1169,12 @@ fill_in_info(EContactEditor *editor)
dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-birthday"));
gnome_date_edit_set_time(dateedit, time_val);
}
+
+ position = 0;
+ editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-categories"));
+ gtk_editable_delete_text(editable, 0, -1);
+ if (categories)
+ gtk_editable_insert_text(editable, categories, strlen(categories), &position);
/* File as has to come after company and name or else it'll get messed up when setting them. */
position = 0;
@@ -1179,8 +1205,8 @@ extract_info(EContactEditor *editor)
char *nickname;
char *spouse;
ECardDate *anniversary;
- char *fburl;
char *note;
+ char *categories;
ECardDate *bday;
GtkEditable *editable;
GnomeDateEdit *dateedit;
@@ -1351,18 +1377,6 @@ extract_info(EContactEditor *editor)
"anniversary", anniversary,
NULL);
- editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-fburl"));
- fburl = gtk_editable_get_chars(editable, 0, -1);
- if (fburl && *fburl)
- gtk_object_set(GTK_OBJECT(card),
- "fburl", fburl,
- NULL);
- else
- gtk_object_set(GTK_OBJECT(card),
- "fburl", NULL,
- NULL);
- g_free(fburl);
-
editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "text-comments"));
note = gtk_editable_get_chars(editable, 0, -1);
if (note && *note)
@@ -1375,6 +1389,18 @@ extract_info(EContactEditor *editor)
NULL);
g_free(note);
+ editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, "entry-categories"));
+ categories = gtk_editable_get_chars(editable, 0, -1);
+ if (categories && *categories)
+ gtk_object_set(GTK_OBJECT(card),
+ "categories", categories,
+ NULL);
+ else
+ gtk_object_set(GTK_OBJECT(card),
+ "categories", NULL,
+ NULL);
+ g_free(categories);
+
dateedit = GNOME_DATE_EDIT(glade_xml_get_widget(editor->gui, "dateedit-birthday"));
time_val = gnome_date_edit_get_date(dateedit);
gmtime_r(&time_val,
diff --git a/addressbook/gui/minicard/Makefile.am b/addressbook/gui/minicard/Makefile.am
index 83cf28c2af..cc96918a77 100644
--- a/addressbook/gui/minicard/Makefile.am
+++ b/addressbook/gui/minicard/Makefile.am
@@ -47,11 +47,13 @@ minicard_test_LDADD = \
$(GNOMEGNORBA_LIBS) \
libeminicard.a \
-lbonobo \
- $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/libversit/libversit.la \
$(top_builddir)/addressbook/ename/libename.la \
$(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/widgets/e-text/libetext.a
reflow_test_SOURCES = \
@@ -62,11 +64,13 @@ reflow_test_LDADD = \
$(GNOMEGNORBA_LIBS) \
libeminicard.a \
-lbonobo \
- $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/libversit/libversit.la \
$(top_builddir)/addressbook/ename/libename.la \
$(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/widgets/e-text/libetext.a
minicard_view_test_SOURCES = \
@@ -77,9 +81,11 @@ minicard_view_test_LDADD = \
$(GNOMEGNORBA_LIBS) \
libeminicard.a \
-lbonobo \
- $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/libversit/libversit.la \
$(top_builddir)/addressbook/ename/libename.la \
$(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/widgets/e-text/libetext.a
diff --git a/addressbook/gui/minicard/e-minicard.c b/addressbook/gui/minicard/e-minicard.c
index 7b7b1bcbe5..ed8034926b 100644
--- a/addressbook/gui/minicard/e-minicard.c
+++ b/addressbook/gui/minicard/e-minicard.c
@@ -381,6 +381,8 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event)
NULL);
dlg = gnome_dialog_new ("Contact Editor", "Save", "Cancel", NULL);
+
+ gtk_window_set_policy(GTK_WINDOW(dlg), FALSE, TRUE, FALSE);
g_assert (E_IS_BOOK (book));
diff --git a/addressbook/gui/widgets/Makefile.am b/addressbook/gui/widgets/Makefile.am
index 83cf28c2af..cc96918a77 100644
--- a/addressbook/gui/widgets/Makefile.am
+++ b/addressbook/gui/widgets/Makefile.am
@@ -47,11 +47,13 @@ minicard_test_LDADD = \
$(GNOMEGNORBA_LIBS) \
libeminicard.a \
-lbonobo \
- $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/libversit/libversit.la \
$(top_builddir)/addressbook/ename/libename.la \
$(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/widgets/e-text/libetext.a
reflow_test_SOURCES = \
@@ -62,11 +64,13 @@ reflow_test_LDADD = \
$(GNOMEGNORBA_LIBS) \
libeminicard.a \
-lbonobo \
- $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/libversit/libversit.la \
$(top_builddir)/addressbook/ename/libename.la \
$(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/widgets/e-text/libetext.a
minicard_view_test_SOURCES = \
@@ -77,9 +81,11 @@ minicard_view_test_LDADD = \
$(GNOMEGNORBA_LIBS) \
libeminicard.a \
-lbonobo \
- $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/libversit/libversit.la \
$(top_builddir)/addressbook/ename/libename.la \
$(top_builddir)/addressbook/contact-editor/libecontacteditor.a \
+ $(top_builddir)/widgets/e-table/libetable.a \
+ $(top_builddir)/e-util/libeutil.la \
$(top_builddir)/widgets/e-text/libetext.a
diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c
index 7b7b1bcbe5..ed8034926b 100644
--- a/addressbook/gui/widgets/e-minicard.c
+++ b/addressbook/gui/widgets/e-minicard.c
@@ -381,6 +381,8 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event)
NULL);
dlg = gnome_dialog_new ("Contact Editor", "Save", "Cancel", NULL);
+
+ gtk_window_set_policy(GTK_WINDOW(dlg), FALSE, TRUE, FALSE);
g_assert (E_IS_BOOK (book));