aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/gui/contact-editor
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/gui/contact-editor')
-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
8 files changed, 1316 insertions, 398 deletions
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,