diff options
43 files changed, 6388 insertions, 621 deletions
@@ -1,3 +1,37 @@ +2000-01-20 Christopher James Lahey <clahey@helixcode.com> + + * widgets/e-text-event-processor-types.h: Changed some line + spacing. + + * widgets/test-reflow.c: Connected to the resize signal of the + reflow. + + * widgets/e-minicard.c: Made width argument set function only + update if width is different. + + * widgets/e-reflow.h, widgets/e-reflow.c: Added draggable column dividers. + + * addressbook/contact-editor/test-editor.c: Open two dialogs for + more interesting testing. + + * addressbook/contact-editor/e-contact-editor.h, + addressbook/contact-editor/e-contact-editor.c: Modified to use + glade. Added menus to change which phone/address/email entries to + view. Added images to the dialog. + + * addressbook/contact-editor/e-contact-editor-strings.h, + addressbook/contact-editor/contact-editor.glade: Glade files for + the contact editor dialog. + + * addressbook/contact-editor/Makefile.am: Added images and added + glade stuff. + + * addressbook/contact-editor/arrow.png, + addressbook/contact-editor/briefcase.png, + addressbook/contact-editor/netfreebusy.png, + addressbook/contact-editor/netmeeting.png: Image files for the + contact editor dialog. + 2000-01-19 bertrand <bertrand@helixcode.com> * camel/providers/mbox/camel-mbox-folder.c (_get_message_count): diff --git a/addressbook/contact-editor/Makefile.am b/addressbook/contact-editor/Makefile.am index 0286af7c49..4892d51bbb 100644 --- a/addressbook/contact-editor/Makefile.am +++ b/addressbook/contact-editor/Makefile.am @@ -1,4 +1,13 @@ +images = email.png head.png phone.png snailmail.png web.png arrow.png briefcase.png netmeeting.png netfreebusy.png + +EXTRA_DIST = $(images) +pkgdata_DATA = $(images) + +CPPFLAGS = \ + -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ + -DDATADIR=\""$(datadir)"\" + INCLUDES = \ $(GNOME_INCLUDEDIR) @@ -17,4 +26,10 @@ contact_editor_test_SOURCES = \ contact_editor_test_LDADD = \ $(EXTRA_GNOME_LIBS) \ - libecontacteditor.a + libecontacteditor.a + +gladedir = $(datadir)/evolution/glade + +glade_DATA = \ + contact-editor.glade + diff --git a/addressbook/contact-editor/arrow.png b/addressbook/contact-editor/arrow.png Binary files differnew file mode 100644 index 0000000000..b7f782c1e5 --- /dev/null +++ b/addressbook/contact-editor/arrow.png diff --git a/addressbook/contact-editor/briefcase.png b/addressbook/contact-editor/briefcase.png Binary files differnew file mode 100644 index 0000000000..dd59b8fd39 --- /dev/null +++ b/addressbook/contact-editor/briefcase.png diff --git a/addressbook/contact-editor/contact-editor.glade b/addressbook/contact-editor/contact-editor.glade new file mode 100644 index 0000000000..87251a6f6f --- /dev/null +++ b/addressbook/contact-editor/contact-editor.glade @@ -0,0 +1,2198 @@ +<?xml version="1.0"?> +<GTK-Interface> + +<project> + <name>Contact-editor</name> + <program_name>contact-editor</program_name> + <directory></directory> + <source_directory>src</source_directory> + <pixmaps_directory>pixmaps</pixmaps_directory> + <language>C</language> + <gnome_support>True</gnome_support> + <gettext_support>True</gettext_support> + <use_widget_names>True</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>e-contact-editor-strings.h</translatable_strings_file> +</project> + +<widget> + <class>GtkWindow</class> + <name>contact editor</name> + <visible>False</visible> + <title>Contact Editor</title> + <type>GTK_WINDOW_TOPLEVEL</type> + <position>GTK_WIN_POS_NONE</position> + <allow_shrink>False</allow_shrink> + <allow_grow>True</allow_grow> + <auto_shrink>False</auto_shrink> + + <widget> + <class>GtkNotebook</class> + <name>notebook-contact-editor</name> + <can_focus>True</can_focus> + <show_tabs>True</show_tabs> + <show_border>True</show_border> + <tab_pos>GTK_POS_TOP</tab_pos> + <scrollable>False</scrollable> + <tab_hborder>2</tab_hborder> + <tab_vborder>2</tab_vborder> + <popup_enable>False</popup_enable> + <num_pages>5</num_pages> + + <widget> + <class>GtkTable</class> + <name>table-contact-editor-general</name> + <border_width>7</border_width> + <rows>12</rows> + <columns>8</columns> + <homogeneous>False</homogeneous> + <row_spacing>4</row_spacing> + <column_spacing>4</column_spacing> + + <widget> + <class>GtkEntry</class> + <name>entry-phone1</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-phone2</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-phone3</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-phone4</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</right_attach> + <top_attach>3</top_attach> + <bottom_attach>4</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-fullname</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-web</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>8</top_attach> + <bottom_attach>9</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-phone3</name> + <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> + <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> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-phone2</name> + <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> + <label>Home</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-phone1</name> + <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> + <label>Business</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-phone4</name> + <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> + <label>Mobile</label> + <justify>GTK_JUSTIFY_LEFT</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkText</class> + <name>text-address</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</right_attach> + <top_attach>5</top_attach> + <bottom_attach>9</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> + <width>1</width> + <height>1</height> + <can_focus>True</can_focus> + <editable>True</editable> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-email1</name> + <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> + <label>Email</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-fullname</name> + <child> + <left_attach>1</left_attach> + <right_attach>3</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> + <can_focus>True</can_focus> + <label> Full Name...</label> + </widget> + + <widget> + <class>GtkAccelLabel</class> + <name>accellabel-jobtitle</name> + <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> + <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> + <class>GtkAccelLabel</class> + <name>accellabel-company</name> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <label>Company:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkAccelLabel</class> + <name>accellabel-fileas</name> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>3</top_attach> + <bottom_attach>4</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <label>File As:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkAccelLabel</class> + <name>accellabel-web</name> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>8</top_attach> + <bottom_attach>9</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> + <label>Web page address:</label> + <justify>GTK_JUSTIFY_LEFT</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox5</name> + <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> + <homogeneous>False</homogeneous> + <spacing>0</spacing> + + <widget> + <class>GtkText</class> + <name>text-comments</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text></text> + </widget> + + <widget> + <class>GtkVScrollbar</class> + <name>vscrollbar-comments</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <policy>GTK_UPDATE_CONTINUOUS</policy> + <vvalue>0</vvalue> + <vlower>0</vlower> + <vupper>0</vupper> + <vstep>0</vstep> + <vpage>0</vpage> + <vpage_size>0</vpage_size> + </widget> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox3</name> + <child> + <left_attach>0</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> + <homogeneous>False</homogeneous> + <spacing>6</spacing> + + <widget> + <class>GtkButton</class> + <name>button-contacts</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <can_focus>True</can_focus> + <label>Contacts...</label> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-contacts</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-categories</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <can_focus>True</can_focus> + <label>Categories...</label> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-categories</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <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>alignment2</name> + <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> + <xalign>0</xalign> + <yalign>0</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkCheckButton</class> + <name>checkbutton-mailingaddress</name> + <can_focus>True</can_focus> + <label>This is the mailing address</label> + <active>False</active> + <draw_indicator>True</draw_indicator> + </widget> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-address</name> + <child> + <left_attach>5</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> + <can_focus>True</can_focus> + <label>A_ddress...</label> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-jobtitle</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-company</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkCombo</class> + <name>combo-fileas</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>3</top_attach> + <bottom_attach>4</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <case_sensitive>True</case_sensitive> + <use_arrows>True</use_arrows> + <use_arrows_always>False</use_arrows_always> + <items></items> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox4</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>5</top_attach> + <bottom_attach>6</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> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + + <widget> + <class>GtkEntry</class> + <name>entry-email1</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkButton</class> + <name>button23</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment3</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>1</yscale> + + <widget> + <class>GtkButton</class> + <name>button-email1</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment4</name> + <child> + <left_attach>6</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>1</yscale> + + <widget> + <class>GtkButton</class> + <name>button-address1</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment5</name> + <child> + <left_attach>6</left_attach> + <right_attach>7</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkButton</class> + <name>button-phone4</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment7</name> + <child> + <left_attach>6</left_attach> + <right_attach>7</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkButton</class> + <name>button-phone2</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment8</name> + <child> + <left_attach>6</left_attach> + <right_attach>7</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkButton</class> + <name>button-phone1</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-address1</name> + <child> + <left_attach>5</left_attach> + <right_attach>6</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> + <label>Business</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator6</name> + <child> + <left_attach>0</left_attach> + <right_attach>4</right_attach> + <top_attach>7</top_attach> + <bottom_attach>8</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>hseparator4</name> + <child> + <left_attach>4</left_attach> + <right_attach>8</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</bottom_attach> + <xpad>0</xpad> + <ypad>2</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator5</name> + <child> + <left_attach>0</left_attach> + <right_attach>4</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</bottom_attach> + <xpad>0</xpad> + <ypad>2</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment6</name> + <child> + <left_attach>6</left_attach> + <right_attach>7</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkButton</class> + <name>button-phone3</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label15</name> + <label>General</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkTable</class> + <name>table-contact-editor-details</name> + <border_width>7</border_width> + <rows>12</rows> + <columns>6</columns> + <homogeneous>False</homogeneous> + <row_spacing>4</row_spacing> + <column_spacing>4</column_spacing> + + <widget> + <class>GtkLabel</class> + <name>label21</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <label>Department:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label22</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</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> + <label>Office:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label23</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</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> + <label>Profession:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label24</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</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> + <label>Nickname:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label25</name> + <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> + <label>Spouse's name:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label26</name> + <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> + <label>Directory Server:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label27</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>8</top_attach> + <bottom_attach>9</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> + <label>Email alias:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label28</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>10</top_attach> + <bottom_attach>11</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> + <label>Address:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label31</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</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> + <label>Birthday:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label30</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <label>Assistant's name:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label29</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</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> + <label>Manager's name:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label32</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</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> + <label>Anniversary:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry4</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>5</top_attach> + <bottom_attach>6</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry5</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry6</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry7</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry8</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry9</name> + <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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry10</name> + <child> + <left_attach>2</left_attach> + <right_attach>5</right_attach> + <top_attach>8</top_attach> + <bottom_attach>9</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry11</name> + <child> + <left_attach>2</left_attach> + <right_attach>6</right_attach> + <top_attach>10</top_attach> + <bottom_attach>11</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GnomeDateEdit</class> + <name>dateedit2</name> + <child> + <left_attach>4</left_attach> + <right_attach>6</right_attach> + <top_attach>5</top_attach> + <bottom_attach>6</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> + <show_time>False</show_time> + <use_24_format>False</use_24_format> + <week_start_monday>False</week_start_monday> + <lower_hour>7</lower_hour> + <upper_hour>19</upper_hour> + </widget> + + <widget> + <class>GnomeDateEdit</class> + <name>dateedit1</name> + <child> + <left_attach>4</left_attach> + <right_attach>6</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</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> + <show_time>False</show_time> + <use_24_format>False</use_24_format> + <week_start_monday>False</week_start_monday> + <lower_hour>7</lower_hour> + <upper_hour>19</upper_hour> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry13</name> + <child> + <left_attach>4</left_attach> + <right_attach>6</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry12</name> + <child> + <left_attach>4</left_attach> + <right_attach>6</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-callnow</name> + <child> + <left_attach>5</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>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <can_focus>True</can_focus> + <label>Call Now</label> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox7</name> + <child> + <left_attach>0</left_attach> + <right_attach>6</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> + <homogeneous>False</homogeneous> + <spacing>6</spacing> + + <widget> + <class>GtkLabel</class> + <name>label33</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <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> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator8</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox8</name> + <child> + <left_attach>0</left_attach> + <right_attach>6</right_attach> + <top_attach>6</top_attach> + <bottom_attach>7</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> + <homogeneous>False</homogeneous> + <spacing>6</spacing> + + <widget> + <class>GtkLabel</class> + <name>label34</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <label>Online NetMeeting settings</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>2</ypad> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator9</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator7</name> + <child> + <left_attach>0</left_attach> + <right_attach>6</right_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> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label16</name> + <label>Details</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkText</class> + <name>text3</name> + <can_focus>True</can_focus> + <editable>False</editable> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label17</name> + <label>Activities</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkText</class> + <name>text2</name> + <can_focus>True</can_focus> + <editable>False</editable> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label18</name> + <label>Certificates</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkText</class> + <name>text4</name> + <can_focus>True</can_focus> + <editable>False</editable> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label19</name> + <label>All Fields</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + </widget> +</widget> + +<widget> + <class>GnomeDialog</class> + <name>dialog2</name> + <visible>False</visible> + <auto_close>False</auto_close> + <hide_on_close>False</hide_on_close> + <allow_shrink>False</allow_shrink> + <allow_grow>False</allow_grow> + <auto_shrink>False</auto_shrink> + + <widget> + <class>GtkVBox</class> + <child_name>GnomeDialog:vbox</child_name> + <name>dialog-vbox2</name> + <child> + <padding>4</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <homogeneous>False</homogeneous> + <spacing>8</spacing> + + <widget> + <class>GtkTable</class> + <name>table2</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <rows>2</rows> + <columns>2</columns> + <homogeneous>False</homogeneous> + <row_spacing>0</row_spacing> + <column_spacing>0</column_spacing> + + <widget> + <class>GtkEntry</class> + <name>entry2</name> + <child> + <left_attach>0</left_attach> + <right_attach>2</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkVBox</class> + <name>vbox1</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>True</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <homogeneous>False</homogeneous> + <spacing>0</spacing> + + <widget> + <class>GtkButton</class> + <name>button31</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <can_focus>True</can_focus> + <label>Add</label> + </widget> + + <widget> + <class>GtkButton</class> + <name>button32</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <can_focus>True</can_focus> + <label>Delete</label> + </widget> + </widget> + + <widget> + <class>GtkScrolledWindow</class> + <name>scrolledwindow1</name> + <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>True</xexpand> + <yexpand>True</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <height>200</height> + <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy> + <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy> + <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> + <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> + + <widget> + <class>GtkCList</class> + <name>clist1</name> + <can_focus>True</can_focus> + <columns>1</columns> + <column_widths>80</column_widths> + <selection_mode>GTK_SELECTION_SINGLE</selection_mode> + <show_titles>True</show_titles> + <shadow_type>GTK_SHADOW_NONE</shadow_type> + + <widget> + <class>GtkLabel</class> + <child_name>CList:title</child_name> + <name>label20</name> + <label>Phone Types</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + </widget> + </widget> + </widget> + + <widget> + <class>GtkHButtonBox</class> + <child_name>GnomeDialog:action_area</child_name> + <name>dialog-action_area2</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>True</fill> + <pack>GTK_PACK_END</pack> + </child> + <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> + + <widget> + <class>GtkButton</class> + <name>button28</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> + </widget> + + <widget> + <class>GtkButton</class> + <name>button29</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button> + </widget> + + <widget> + <class>GtkButton</class> + <name>button30</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> + </widget> + </widget> + </widget> +</widget> + +<widget> + <class>GnomeDialog</class> + <name>dialog-add-phone</name> + <visible>False</visible> + <title>New phone type</title> + <auto_close>False</auto_close> + <hide_on_close>False</hide_on_close> + <allow_shrink>False</allow_shrink> + <allow_grow>False</allow_grow> + <auto_shrink>False</auto_shrink> + + <widget> + <class>GtkVBox</class> + <child_name>GnomeDialog:vbox</child_name> + <name>vbox2</name> + <child> + <padding>4</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <homogeneous>False</homogeneous> + <spacing>8</spacing> + + <widget> + <class>GtkFrame</class> + <name>frame-add-phone</name> + <border_width>4</border_width> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <label>New phone type</label> + <label_xalign>0</label_xalign> + <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type> + + <widget> + <class>GtkAlignment</class> + <name>alignment9</name> + <border_width>9</border_width> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xscale>1</xscale> + <yscale>1</yscale> + + <widget> + <class>GtkEntry</class> + <name>entry-add-phone</name> + <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> + + <widget> + <class>GtkHButtonBox</class> + <child_name>GnomeDialog:action_area</child_name> + <name>hbuttonbox1</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>True</fill> + <pack>GTK_PACK_END</pack> + </child> + <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> + + <widget> + <class>GtkButton</class> + <name>button43</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <label>Add</label> + <stock_pixmap>GNOME_STOCK_PIXMAP_ADD</stock_pixmap> + </widget> + + <widget> + <class>GtkButton</class> + <name>button44</name> + <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/e-contact-editor-strings.h b/addressbook/contact-editor/e-contact-editor-strings.h new file mode 100644 index 0000000000..131dd6fdf4 --- /dev/null +++ b/addressbook/contact-editor/e-contact-editor-strings.h @@ -0,0 +1,48 @@ +/* + * 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_("Contact Editor"); +gchar *s = N_("Business Fax"); +gchar *s = N_("Home"); +gchar *s = N_("Business"); +gchar *s = N_("Mobile"); +gchar *s = N_("Email"); +gchar *s = N_("\tFull Name..."); +gchar *s = N_("Job Title:"); +gchar *s = N_("Company:"); +gchar *s = N_("File As:"); +gchar *s = N_("Web page address:"); +gchar *s = N_("Contacts..."); +gchar *s = N_("Categories..."); +gchar *s = N_("This is the mailing address"); +gchar *s = N_("A_ddress..."); +gchar *s = N_("Business"); +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_("Directory Server:"); +gchar *s = N_("Email alias:"); +gchar *s = N_("Address:"); +gchar *s = N_("Birthday:"); +gchar *s = N_("Assistant's name:"); +gchar *s = N_("Manager's name:"); +gchar *s = N_("Anniversary:"); +gchar *s = N_("Call Now"); +gchar *s = N_("Internet Free-Busy"); +gchar *s = N_("Online NetMeeting settings"); +gchar *s = N_("Details"); +gchar *s = N_("Activities"); +gchar *s = N_("Certificates"); +gchar *s = N_("All Fields"); +gchar *s = N_("Add"); +gchar *s = N_("Delete"); +gchar *s = N_("Phone Types"); +gchar *s = N_("New phone type"); +gchar *s = N_("New phone type"); +gchar *s = N_("Add"); diff --git a/addressbook/contact-editor/e-contact-editor.c b/addressbook/contact-editor/e-contact-editor.c index 73b48a7eb8..6a6c6d982e 100644 --- a/addressbook/contact-editor/e-contact-editor.c +++ b/addressbook/contact-editor/e-contact-editor.c @@ -26,8 +26,14 @@ static void e_contact_editor_init (EContactEditor *card); static void e_contact_editor_class_init (EContactEditorClass *klass); static void e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); static void e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); +static void e_contact_editor_destroy (GtkObject *object); -static GtkNotebookClass *parent_class = NULL; +static GtkWidget *e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info); +static void _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); +static void _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); +static void _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); + +static GtkVBoxClass *parent_class = NULL; #if 0 enum { @@ -44,6 +50,12 @@ enum { ARG_CARD }; +enum { + DYNAMIC_LIST_EMAIL, + DYNAMIC_LIST_PHONE, + DYNAMIC_LIST_ADDRESS +}; + GtkType e_contact_editor_get_type (void) { @@ -63,7 +75,7 @@ e_contact_editor_get_type (void) (GtkClassInitFunc) NULL, }; - contact_editor_type = gtk_type_unique (gtk_notebook_get_type (), &contact_editor_info); + contact_editor_type = gtk_type_unique (gtk_vbox_get_type (), &contact_editor_info); } return contact_editor_type; @@ -73,12 +85,12 @@ static void e_contact_editor_class_init (EContactEditorClass *klass) { GtkObjectClass *object_class; - GtkNotebookClass *notebook_class; + GtkVBoxClass *vbox_class; object_class = (GtkObjectClass*) klass; - notebook_class = (GtkNotebookClass *) klass; + vbox_class = (GtkVBoxClass *) klass; - parent_class = gtk_type_class (gtk_notebook_get_type ()); + parent_class = gtk_type_class (gtk_vbox_get_type ()); #if 0 e_contact_editor_signals[E_CONTACT_EDITOR_RESIZE] = @@ -98,300 +110,140 @@ e_contact_editor_class_init (EContactEditorClass *klass) object_class->set_arg = e_contact_editor_set_arg; object_class->get_arg = e_contact_editor_get_arg; + object_class->destroy = e_contact_editor_destroy; } -static GtkWidget * -_create_page_general_name(EContactEditor *e_contact_editor) -{ - GtkWidget *table; - GtkWidget *alignment; - table = gtk_table_new(3, 4, FALSE); - alignment = gtk_alignment_new(0, 0, 0, 0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("head.png")); - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 4, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Full Name:")), - 1, 2, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Job Title:")), - 1, 2, 1, 2, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Company:")), - 1, 2, 2, 3, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("File as:")), - 1, 2, 3, 4, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 1, 2, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 2, 3, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_combo_new(), - 2, 3, 3, 4, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; -} - -static GtkWidget * -_create_page_general_phone(EContactEditor *e_contact_editor) -{ - GtkWidget *table; - GtkWidget *alignment; - table = gtk_table_new(3, 4, FALSE); - alignment = gtk_alignment_new(0,0,0,0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("phone.png")); - - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 4, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Home:")), - 1, 2, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Car:")), - 1, 2, 1, 2, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Mobile:")), - 1, 2, 2, 3, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Business Fax:")), - 1, 2, 3, 4, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 1, 2, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 2, 3, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 3, 4, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; -} - -static GtkWidget * -_create_page_general_email(EContactEditor *e_contact_editor) -{ - GtkWidget *table; - GtkWidget *alignment; - table = gtk_table_new(3, 1, FALSE); - alignment = gtk_alignment_new(0,0,0,0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("email.png")); - - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Email:")), - 1, 2, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; -} - -static GtkWidget * -_create_page_general_web(EContactEditor *e_contact_editor) +static void +_add_image(GtkTable *table, gchar *image, int left, int right, int top, int bottom) { - GtkWidget *table; - GtkWidget *alignment; - table = gtk_table_new(3, 1, FALSE); - alignment = gtk_alignment_new(0,0,0,0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("web.png")); - - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Web page address:")), - 1, 2, 0, 1, - 0, 0, + gtk_table_attach(table, + gtk_widget_new(gtk_alignment_get_type(), + "child", gnome_pixmap_new_from_file(image), + "xalign", (double) 0, + "yalign", (double) 0, + "xscale", (double) 0, + "yscale", (double) 0, + NULL), + left, right, top, bottom, + GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; } -static GtkWidget * -_create_page_general_snailmail(EContactEditor *e_contact_editor) +static void +_add_images(GtkTable *table) { - GtkWidget *table; - GtkWidget *alignment; - GtkWidget *text; - table = gtk_table_new(3, 3, FALSE); - alignment = gtk_alignment_new(0,0,0,0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("snailmail.png")); - - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Address:")), - 1, 2, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Business:")), - 1, 2, 1, 2, - 0, 0, - 0, 0); - text = gtk_text_new(NULL, NULL); - gtk_object_set(GTK_OBJECT(text), - "editable", TRUE, - NULL); - gtk_table_attach(GTK_TABLE(table), - text, - 2, 3, 0, 2, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_check_button_new_with_label(_("This is the mailing address")), - 2, 3, 2, 3, - 0, 0, - 0, 0); - return table; + _add_image(table, DATADIR "/evolution/head.png", 0, 1, 0, 4); + _add_image(table, DATADIR "/evolution/phone.png", 4, 5, 0, 4); + _add_image(table, DATADIR "/evolution/email.png", 0, 1, 5, 7); + _add_image(table, DATADIR "/evolution/web.png", 0, 1, 8, 10); + _add_image(table, DATADIR "/evolution/snailmail.png", 4, 5, 5, 10); } -static GtkWidget * -_create_page_general_comments(EContactEditor *e_contact_editor) +static void +_add_details_images(GtkTable *table) { - GtkWidget *text; - text = gtk_text_new(NULL, NULL); - gtk_object_set (GTK_OBJECT(text), - "editable", TRUE, - NULL); - return text; + _add_image(table, DATADIR "/evolution/briefcase.png", 0, 1, 0, 2); + _add_image(table, DATADIR "/evolution/head.png", 0, 1, 4, 6); + _add_image(table, DATADIR "/evolution/netmeeting.png", 0, 1, 7, 9); + _add_image(table, DATADIR "/evolution/netfreebusy.png", 0, 1, 10, 12); } -static GtkWidget * -_create_page_general_extras(EContactEditor *e_contact_editor) +static void +_replace_button(EContactEditor *editor, gchar *button_xml, gchar *image, GtkSignalFunc func) { - return gtk_entry_new(); + GladeXML *gui = editor->gui; + GtkWidget *button = glade_xml_get_widget(gui, button_xml); + gchar *image_temp; + image_temp = g_strdup_printf("%s%s", DATADIR "/evolution/", image); + gtk_container_add(GTK_CONTAINER(button), + gnome_pixmap_new_from_file(image_temp)); + g_free(image_temp); + gtk_signal_connect(GTK_OBJECT(button), "button_press_event", func, editor); + } -static GtkWidget * -_create_page_general( EContactEditor *e_contact_editor ) +static void +_replace_buttons(EContactEditor *editor) { - GtkWidget *table; - table = gtk_table_new(2, 5, FALSE); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_name(e_contact_editor), - 0, 1, - 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_phone(e_contact_editor), - 1, 2, - 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_email(e_contact_editor), - 0, 1, - 1, 2, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_web(e_contact_editor), - 0, 1, - 2, 3, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_snailmail(e_contact_editor), - 1, 2, - 1, 3, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_comments(e_contact_editor), - 0, 2, - 3, 4, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_extras(e_contact_editor), - 0, 2, - 4, 5, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; + _replace_button(editor, "button-phone1", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone2", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone3", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone4", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-address1", "arrow.png", _address_arrow_pressed); + _replace_button(editor, "button-email1", "arrow.png", _email_arrow_pressed); } static void e_contact_editor_init (EContactEditor *e_contact_editor) { - GtkNotebook *notebook = GTK_NOTEBOOK (e_contact_editor); + GladeXML *gui; + GtkAdjustment *adjustment; /* e_contact_editor->card = NULL;*/ - e_contact_editor->fields = NULL; + gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL); + e_contact_editor->gui = gui; + gtk_widget_reparent(glade_xml_get_widget(gui, "notebook-contact-editor"), + GTK_WIDGET(e_contact_editor)); + + _add_images(GTK_TABLE(glade_xml_get_widget(gui, "table-contact-editor-general"))); + _add_details_images(GTK_TABLE(glade_xml_get_widget(gui, "table-contact-editor-details"))); + _replace_buttons(e_contact_editor); + + gtk_object_get(GTK_OBJECT(glade_xml_get_widget(gui, "text-comments")), + "vadjustment", &adjustment, + NULL); + gtk_range_set_adjustment(GTK_RANGE(glade_xml_get_widget(gui, "vscrollbar-comments")), + adjustment); + + e_contact_editor->email_info = NULL; + e_contact_editor->phone_info = NULL; + e_contact_editor->address_info = NULL; + e_contact_editor->email_popup = NULL; + e_contact_editor->phone_popup = NULL; + e_contact_editor->address_popup = NULL; + e_contact_editor->email_list = NULL; + e_contact_editor->phone_list = NULL; + e_contact_editor->address_list = NULL; +} + +void +e_contact_editor_destroy (GtkObject *object) { + EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object); + + if (e_contact_editor->email_list) { + g_list_foreach(e_contact_editor->email_list, (GFunc) g_free, NULL); + g_list_free(e_contact_editor->email_list); + } + if (e_contact_editor->email_info) { + g_free(e_contact_editor->email_info); + } + if (e_contact_editor->email_popup) { + gtk_widget_unref(e_contact_editor->email_popup); + } + + if (e_contact_editor->phone_list) { + g_list_foreach(e_contact_editor->phone_list, (GFunc) g_free, NULL); + g_list_free(e_contact_editor->phone_list); + } + if (e_contact_editor->phone_info) { + g_free(e_contact_editor->phone_info); + } + if (e_contact_editor->phone_popup) { + gtk_widget_unref(e_contact_editor->phone_popup); + } + + if (e_contact_editor->address_list) { + g_list_foreach(e_contact_editor->address_list, (GFunc) g_free, NULL); + g_list_free(e_contact_editor->address_list); + } + if (e_contact_editor->address_info) { + g_free(e_contact_editor->address_info); + } + if (e_contact_editor->address_popup) { + gtk_widget_unref(e_contact_editor->address_popup); + } - gtk_notebook_append_page (notebook, - _create_page_general(e_contact_editor), - gtk_label_new(_("General"))); + gtk_object_unref(GTK_OBJECT(e_contact_editor->gui)); } GtkWidget* @@ -436,3 +288,277 @@ e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) break; } } + +static void +_popup_position(GtkMenu *menu, + gint *x, + gint *y, + gpointer data) +{ + GtkWidget *button = GTK_WIDGET(data); + int mh, mw; + gdk_window_get_origin (button->window, x, y); + *x += button->allocation.width; + *y += button->allocation.height; + + mh = GTK_WIDGET(menu)->allocation.height; + mw = GTK_WIDGET(menu)->allocation.width; + + *x -= mw; + if (*x < 0) + *x = 0; + + if (*y < 0) + *y = 0; + + if ((*x + mw) > gdk_screen_width ()) + *x = gdk_screen_width () - mw; + + if ((*y + mh) > gdk_screen_height ()) + *y = gdk_screen_height () - mh; +} + +static void +_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor, GtkWidget *popup, GList **list, GnomeUIInfo **info, gchar *label, gchar *entry, gchar *dialog_title) +{ + gint menu_item; + gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event"); + gtk_widget_realize(popup); + menu_item = gnome_popup_menu_do_popup_modal(popup, _popup_position, widget, button, editor); + if ( menu_item != -1 ) { + if (menu_item == g_list_length (*list)) { + e_contact_editor_build_dialog(editor, entry, label, dialog_title, list, info); + } else { + gtk_object_set(GTK_OBJECT(glade_xml_get_widget(editor->gui, label)), + "label", g_list_nth_data(*list, menu_item), + NULL); + } + } +} + +static void +e_contact_editor_build_ui_info(GList *list, GnomeUIInfo **infop) +{ + GnomeUIInfo *info; + GnomeUIInfo singleton = { GNOME_APP_UI_ITEM, NULL, NULL, NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, 0, 0, 0, NULL }; + GnomeUIInfo end = GNOMEUIINFO_END; + int length; + int i; + + info = *infop; + + if ( info ) + g_free(info); + length = g_list_length( list ); + info = g_new(GnomeUIInfo, length + 2); + for (i = 0; i < length; i++) { + info[i] = singleton; + info[i].label = _(list->data); + list = list->next; + } + info[i] = singleton; + info[i].label = N_("Other..."); + i++; + info[i] = end; + + *infop = info; +} + +static void +_dialog_clicked(GtkWidget *dialog, gint button, EContactEditor *editor) +{ + GtkWidget *label = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_label"); + GtkWidget *entry = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_entry"); + GtkWidget *dialog_entry = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_dialog_entry"); + GList **list = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_list"); + GList **info = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_info"); + switch (button) { + case 0: + gtk_object_set(GTK_OBJECT(label), + "label", gtk_entry_get_text(GTK_ENTRY(dialog_entry)), + NULL); + *list = g_list_append(*list, g_strdup(gtk_entry_get_text(GTK_ENTRY(dialog_entry)))); + g_free(*info); + *info = NULL; + break; + } + gnome_dialog_close(GNOME_DIALOG(dialog)); +} + +static void +_dialog_destroy(EContactEditor *editor, GtkWidget *dialog) +{ + gnome_dialog_close(GNOME_DIALOG(dialog)); +} + +static GtkWidget * +e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info) +{ + GtkWidget *dialog_entry = gtk_entry_new(); + GtkWidget *entry = glade_xml_get_widget(editor->gui, entry_id); + GtkWidget *label = glade_xml_get_widget(editor->gui, label_id); + + 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, + "label", title, + "child", gtk_widget_new(gtk_alignment_get_type(), + "child", dialog_entry, + "xalign", .5, + "yalign", .5, + "xscale", 1.0, + "yscale", 1.0, + "border_width", 9, + NULL), + NULL)); + + gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(dialog), + "Add", + GNOME_STOCK_PIXMAP_ADD); + gnome_dialog_append_button(GNOME_DIALOG(dialog), GNOME_STOCK_BUTTON_CANCEL); + gnome_dialog_set_default(GNOME_DIALOG(dialog), 0); + + gtk_signal_connect(GTK_OBJECT(dialog), "clicked", + _dialog_clicked, editor); + gtk_signal_connect_while_alive(GTK_OBJECT(editor), "destroy", + _dialog_destroy, GTK_OBJECT(dialog), GTK_OBJECT(dialog)); + + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_entry", entry); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_label", label); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_dialog_entry", dialog_entry); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_list", list); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_info", info); + + gtk_widget_show_all(dialog); + return dialog; +} + +static void +_phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) +{ + int which; + int i; + gchar *label; + gchar *entry; + if ( widget == glade_xml_get_widget(editor->gui, "button-phone1") ) { + which = 1; + } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone2") ) { + which = 2; + } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone3") ) { + which = 3; + } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone4") ) { + which = 4; + } else + return; + + label = g_strdup_printf("label-phone%d", which); + entry = g_strdup_printf("entry-phone%d", which); + + if (editor->phone_list == NULL) { + static char *info[] = { + N_("Assistant"), + N_("Business"), + N_("Business 2"), + N_("Business Fax"), + N_("Callback"), + N_("Car"), + N_("Company"), + N_("Home"), + N_("Home 2"), + N_("Home Fax"), + N_("ISDN"), + N_("Mobile"), + N_("Other"), + N_("Other Fax"), + N_("Pager"), + N_("Primary"), + N_("Radio"), + N_("Telex"), + N_("TTY/TDD") + }; + + for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { + editor->phone_list = g_list_append(editor->phone_list, g_strdup(info[i])); + } + } + if (editor->phone_info == NULL) { + e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info); + + if ( editor->phone_popup ) + gtk_widget_unref(editor->phone_popup); + + editor->phone_popup = gnome_popup_menu_new(editor->phone_info); + } + + _arrow_pressed (widget, button, editor, editor->phone_popup, &editor->phone_list, &editor->phone_info, label, entry, "Add new phone number type"); + + g_free(label); + g_free(entry); +} + +static void +_email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) +{ + int i; + if (editor->email_list == NULL) { + static char *info[] = { + N_("Email"), + N_("Email 2"), + N_("Email 3") + }; + + for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { + editor->email_list = g_list_append(editor->email_list, g_strdup(info[i])); + } + } + if (editor->email_info == NULL) { + e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); + + if ( editor->email_popup ) + gtk_widget_unref(editor->email_popup); + + editor->email_popup = gnome_popup_menu_new(editor->email_info); + } + + _arrow_pressed (widget, button, editor, editor->email_popup, &editor->email_list, &editor->email_info, "label-email1", "entry-email1", "Add new Email type"); +} + +static void +_address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) +{ + int i; + if (editor->address_list == NULL) { + static char *info[] = { + N_("Business"), + N_("Home"), + N_("Other") + }; + + for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { + editor->address_list = g_list_append(editor->address_list, g_strdup(info[i])); + } + } + if (editor->address_info == NULL) { + e_contact_editor_build_ui_info(editor->address_list, &editor->address_info); + + if ( editor->address_popup ) + gtk_widget_unref(editor->address_popup); + + editor->address_popup = gnome_popup_menu_new(editor->address_info); + } + + _arrow_pressed (widget, button, editor, editor->address_popup, &editor->address_list, &editor->address_info, "label-address1", "entry-address1", "Add new Address type"); +} diff --git a/addressbook/contact-editor/e-contact-editor.h b/addressbook/contact-editor/e-contact-editor.h index 45f3ae5597..7b914967ee 100644 --- a/addressbook/contact-editor/e-contact-editor.h +++ b/addressbook/contact-editor/e-contact-editor.h @@ -22,6 +22,7 @@ #define __E_CONTACT_EDITOR_H__ #include <gnome.h> +#include <glade/glade.h> #ifdef __cplusplus extern "C" { @@ -49,17 +50,26 @@ typedef struct _EContactEditorClass EContactEditorClass; struct _EContactEditor { - GtkNotebook parent; + GtkVBox parent; /* item specific fields */ /* ECard *card; */ - GList *fields; /* Of type GnomeCanvasItem. */ + GladeXML *gui; + GnomeUIInfo *email_info; + GnomeUIInfo *phone_info; + GnomeUIInfo *address_info; + GtkWidget *email_popup; + GtkWidget *phone_popup; + GtkWidget *address_popup; + GList *email_list; + GList *phone_list; + GList *address_list; }; struct _EContactEditorClass { - GtkNotebookClass parent_class; + GtkVBoxClass parent_class; }; diff --git a/addressbook/contact-editor/netfreebusy.png b/addressbook/contact-editor/netfreebusy.png Binary files differnew file mode 100644 index 0000000000..09ec8a2a5c --- /dev/null +++ b/addressbook/contact-editor/netfreebusy.png diff --git a/addressbook/contact-editor/netmeeting.png b/addressbook/contact-editor/netmeeting.png Binary files differnew file mode 100644 index 0000000000..4cb90c121e --- /dev/null +++ b/addressbook/contact-editor/netmeeting.png diff --git a/addressbook/contact-editor/test-editor.c b/addressbook/contact-editor/test-editor.c index 737c3028c4..49ed7e48bf 100644 --- a/addressbook/contact-editor/test-editor.c +++ b/addressbook/contact-editor/test-editor.c @@ -23,6 +23,7 @@ #include "config.h" #include <gnome.h> +#include <glade/glade.h> #include "e-contact-editor.h" /* This is a horrible thing to do, but it is just a test. */ @@ -30,7 +31,10 @@ GtkWidget *editor; static void destroy_callback(GtkWidget *app, gpointer data) { - exit(0); + static int count = 2; + count --; + if ( count <= 0 ) + exit(0); } static void about_callback( GtkWidget *widget, gpointer data ) @@ -59,6 +63,22 @@ int main( int argc, char *argv[] ) textdomain (PACKAGE);*/ gnome_init( "Contact Editor Test", VERSION, argc, argv); + + glade_gnome_init (); + + app = gnome_app_new("Contact Editor Test", NULL); + + editor = e_contact_editor_new(NULL); + + gnome_app_set_contents( GNOME_APP( app ), editor ); + + /* Connect the signals */ + gtk_signal_connect( GTK_OBJECT( app ), "destroy", + GTK_SIGNAL_FUNC( destroy_callback ), + ( gpointer ) app ); + + gtk_widget_show_all( app ); + app = gnome_app_new("Contact Editor Test", NULL); editor = e_contact_editor_new(NULL); diff --git a/addressbook/gui/contact-editor/Makefile.am b/addressbook/gui/contact-editor/Makefile.am index 0286af7c49..4892d51bbb 100644 --- a/addressbook/gui/contact-editor/Makefile.am +++ b/addressbook/gui/contact-editor/Makefile.am @@ -1,4 +1,13 @@ +images = email.png head.png phone.png snailmail.png web.png arrow.png briefcase.png netmeeting.png netfreebusy.png + +EXTRA_DIST = $(images) +pkgdata_DATA = $(images) + +CPPFLAGS = \ + -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ + -DDATADIR=\""$(datadir)"\" + INCLUDES = \ $(GNOME_INCLUDEDIR) @@ -17,4 +26,10 @@ contact_editor_test_SOURCES = \ contact_editor_test_LDADD = \ $(EXTRA_GNOME_LIBS) \ - libecontacteditor.a + libecontacteditor.a + +gladedir = $(datadir)/evolution/glade + +glade_DATA = \ + contact-editor.glade + diff --git a/addressbook/gui/contact-editor/arrow.png b/addressbook/gui/contact-editor/arrow.png Binary files differnew file mode 100644 index 0000000000..b7f782c1e5 --- /dev/null +++ b/addressbook/gui/contact-editor/arrow.png diff --git a/addressbook/gui/contact-editor/briefcase.png b/addressbook/gui/contact-editor/briefcase.png Binary files differnew file mode 100644 index 0000000000..dd59b8fd39 --- /dev/null +++ b/addressbook/gui/contact-editor/briefcase.png diff --git a/addressbook/gui/contact-editor/contact-editor.glade b/addressbook/gui/contact-editor/contact-editor.glade new file mode 100644 index 0000000000..87251a6f6f --- /dev/null +++ b/addressbook/gui/contact-editor/contact-editor.glade @@ -0,0 +1,2198 @@ +<?xml version="1.0"?> +<GTK-Interface> + +<project> + <name>Contact-editor</name> + <program_name>contact-editor</program_name> + <directory></directory> + <source_directory>src</source_directory> + <pixmaps_directory>pixmaps</pixmaps_directory> + <language>C</language> + <gnome_support>True</gnome_support> + <gettext_support>True</gettext_support> + <use_widget_names>True</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>e-contact-editor-strings.h</translatable_strings_file> +</project> + +<widget> + <class>GtkWindow</class> + <name>contact editor</name> + <visible>False</visible> + <title>Contact Editor</title> + <type>GTK_WINDOW_TOPLEVEL</type> + <position>GTK_WIN_POS_NONE</position> + <allow_shrink>False</allow_shrink> + <allow_grow>True</allow_grow> + <auto_shrink>False</auto_shrink> + + <widget> + <class>GtkNotebook</class> + <name>notebook-contact-editor</name> + <can_focus>True</can_focus> + <show_tabs>True</show_tabs> + <show_border>True</show_border> + <tab_pos>GTK_POS_TOP</tab_pos> + <scrollable>False</scrollable> + <tab_hborder>2</tab_hborder> + <tab_vborder>2</tab_vborder> + <popup_enable>False</popup_enable> + <num_pages>5</num_pages> + + <widget> + <class>GtkTable</class> + <name>table-contact-editor-general</name> + <border_width>7</border_width> + <rows>12</rows> + <columns>8</columns> + <homogeneous>False</homogeneous> + <row_spacing>4</row_spacing> + <column_spacing>4</column_spacing> + + <widget> + <class>GtkEntry</class> + <name>entry-phone1</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-phone2</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-phone3</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-phone4</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</right_attach> + <top_attach>3</top_attach> + <bottom_attach>4</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-fullname</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-web</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>8</top_attach> + <bottom_attach>9</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-phone3</name> + <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> + <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> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-phone2</name> + <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> + <label>Home</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-phone1</name> + <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> + <label>Business</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-phone4</name> + <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> + <label>Mobile</label> + <justify>GTK_JUSTIFY_LEFT</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkText</class> + <name>text-address</name> + <child> + <left_attach>7</left_attach> + <right_attach>8</right_attach> + <top_attach>5</top_attach> + <bottom_attach>9</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> + <width>1</width> + <height>1</height> + <can_focus>True</can_focus> + <editable>True</editable> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-email1</name> + <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> + <label>Email</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-fullname</name> + <child> + <left_attach>1</left_attach> + <right_attach>3</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> + <can_focus>True</can_focus> + <label> Full Name...</label> + </widget> + + <widget> + <class>GtkAccelLabel</class> + <name>accellabel-jobtitle</name> + <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> + <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> + <class>GtkAccelLabel</class> + <name>accellabel-company</name> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <label>Company:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkAccelLabel</class> + <name>accellabel-fileas</name> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>3</top_attach> + <bottom_attach>4</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <label>File As:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkAccelLabel</class> + <name>accellabel-web</name> + <child> + <left_attach>1</left_attach> + <right_attach>3</right_attach> + <top_attach>8</top_attach> + <bottom_attach>9</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> + <label>Web page address:</label> + <justify>GTK_JUSTIFY_LEFT</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox5</name> + <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> + <homogeneous>False</homogeneous> + <spacing>0</spacing> + + <widget> + <class>GtkText</class> + <name>text-comments</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text></text> + </widget> + + <widget> + <class>GtkVScrollbar</class> + <name>vscrollbar-comments</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <policy>GTK_UPDATE_CONTINUOUS</policy> + <vvalue>0</vvalue> + <vlower>0</vlower> + <vupper>0</vupper> + <vstep>0</vstep> + <vpage>0</vpage> + <vpage_size>0</vpage_size> + </widget> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox3</name> + <child> + <left_attach>0</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> + <homogeneous>False</homogeneous> + <spacing>6</spacing> + + <widget> + <class>GtkButton</class> + <name>button-contacts</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <can_focus>True</can_focus> + <label>Contacts...</label> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-contacts</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-categories</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <can_focus>True</can_focus> + <label>Categories...</label> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-categories</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <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>alignment2</name> + <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> + <xalign>0</xalign> + <yalign>0</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkCheckButton</class> + <name>checkbutton-mailingaddress</name> + <can_focus>True</can_focus> + <label>This is the mailing address</label> + <active>False</active> + <draw_indicator>True</draw_indicator> + </widget> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-address</name> + <child> + <left_attach>5</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> + <can_focus>True</can_focus> + <label>A_ddress...</label> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-jobtitle</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry-company</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkCombo</class> + <name>combo-fileas</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>3</top_attach> + <bottom_attach>4</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <case_sensitive>True</case_sensitive> + <use_arrows>True</use_arrows> + <use_arrows_always>False</use_arrows_always> + <items></items> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox4</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>5</top_attach> + <bottom_attach>6</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> + <homogeneous>False</homogeneous> + <spacing>4</spacing> + + <widget> + <class>GtkEntry</class> + <name>entry-email1</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkButton</class> + <name>button23</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment3</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>1</yscale> + + <widget> + <class>GtkButton</class> + <name>button-email1</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment4</name> + <child> + <left_attach>6</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>1</yscale> + + <widget> + <class>GtkButton</class> + <name>button-address1</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment5</name> + <child> + <left_attach>6</left_attach> + <right_attach>7</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkButton</class> + <name>button-phone4</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment7</name> + <child> + <left_attach>6</left_attach> + <right_attach>7</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkButton</class> + <name>button-phone2</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment8</name> + <child> + <left_attach>6</left_attach> + <right_attach>7</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkButton</class> + <name>button-phone1</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label-address1</name> + <child> + <left_attach>5</left_attach> + <right_attach>6</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> + <label>Business</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator6</name> + <child> + <left_attach>0</left_attach> + <right_attach>4</right_attach> + <top_attach>7</top_attach> + <bottom_attach>8</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>hseparator4</name> + <child> + <left_attach>4</left_attach> + <right_attach>8</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</bottom_attach> + <xpad>0</xpad> + <ypad>2</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator5</name> + <child> + <left_attach>0</left_attach> + <right_attach>4</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</bottom_attach> + <xpad>0</xpad> + <ypad>2</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkAlignment</class> + <name>alignment6</name> + <child> + <left_attach>6</left_attach> + <right_attach>7</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> + <xalign>1</xalign> + <yalign>0.5</yalign> + <xscale>0</xscale> + <yscale>0</yscale> + + <widget> + <class>GtkButton</class> + <name>button-phone3</name> + <can_focus>True</can_focus> + + <widget> + <class>Placeholder</class> + </widget> + </widget> + </widget> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label15</name> + <label>General</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkTable</class> + <name>table-contact-editor-details</name> + <border_width>7</border_width> + <rows>12</rows> + <columns>6</columns> + <homogeneous>False</homogeneous> + <row_spacing>4</row_spacing> + <column_spacing>4</column_spacing> + + <widget> + <class>GtkLabel</class> + <name>label21</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <label>Department:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label22</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</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> + <label>Office:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label23</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</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> + <label>Profession:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label24</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</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> + <label>Nickname:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label25</name> + <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> + <label>Spouse's name:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label26</name> + <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> + <label>Directory Server:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label27</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>8</top_attach> + <bottom_attach>9</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> + <label>Email alias:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label28</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>10</top_attach> + <bottom_attach>11</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> + <label>Address:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label31</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</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> + <label>Birthday:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label30</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <label>Assistant's name:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label29</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</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> + <label>Manager's name:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkLabel</class> + <name>label32</name> + <child> + <left_attach>3</left_attach> + <right_attach>4</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> + <label>Anniversary:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry4</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>5</top_attach> + <bottom_attach>6</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry5</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry6</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry7</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>2</top_attach> + <bottom_attach>3</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry8</name> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry9</name> + <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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry10</name> + <child> + <left_attach>2</left_attach> + <right_attach>5</right_attach> + <top_attach>8</top_attach> + <bottom_attach>9</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry11</name> + <child> + <left_attach>2</left_attach> + <right_attach>6</right_attach> + <top_attach>10</top_attach> + <bottom_attach>11</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GnomeDateEdit</class> + <name>dateedit2</name> + <child> + <left_attach>4</left_attach> + <right_attach>6</right_attach> + <top_attach>5</top_attach> + <bottom_attach>6</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> + <show_time>False</show_time> + <use_24_format>False</use_24_format> + <week_start_monday>False</week_start_monday> + <lower_hour>7</lower_hour> + <upper_hour>19</upper_hour> + </widget> + + <widget> + <class>GnomeDateEdit</class> + <name>dateedit1</name> + <child> + <left_attach>4</left_attach> + <right_attach>6</right_attach> + <top_attach>4</top_attach> + <bottom_attach>5</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> + <show_time>False</show_time> + <use_24_format>False</use_24_format> + <week_start_monday>False</week_start_monday> + <lower_hour>7</lower_hour> + <upper_hour>19</upper_hour> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry13</name> + <child> + <left_attach>4</left_attach> + <right_attach>6</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkEntry</class> + <name>entry12</name> + <child> + <left_attach>4</left_attach> + <right_attach>6</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkButton</class> + <name>button-callnow</name> + <child> + <left_attach>5</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>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <can_focus>True</can_focus> + <label>Call Now</label> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox7</name> + <child> + <left_attach>0</left_attach> + <right_attach>6</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> + <homogeneous>False</homogeneous> + <spacing>6</spacing> + + <widget> + <class>GtkLabel</class> + <name>label33</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <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> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator8</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + </widget> + + <widget> + <class>GtkHBox</class> + <name>hbox8</name> + <child> + <left_attach>0</left_attach> + <right_attach>6</right_attach> + <top_attach>6</top_attach> + <bottom_attach>7</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> + <homogeneous>False</homogeneous> + <spacing>6</spacing> + + <widget> + <class>GtkLabel</class> + <name>label34</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <label>Online NetMeeting settings</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>2</ypad> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator9</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + </widget> + </widget> + + <widget> + <class>GtkHSeparator</class> + <name>hseparator7</name> + <child> + <left_attach>0</left_attach> + <right_attach>6</right_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> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label16</name> + <label>Details</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkText</class> + <name>text3</name> + <can_focus>True</can_focus> + <editable>False</editable> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label17</name> + <label>Activities</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkText</class> + <name>text2</name> + <can_focus>True</can_focus> + <editable>False</editable> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label18</name> + <label>Certificates</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + + <widget> + <class>GtkText</class> + <name>text4</name> + <can_focus>True</can_focus> + <editable>False</editable> + <text></text> + </widget> + + <widget> + <class>GtkLabel</class> + <child_name>Notebook:tab</child_name> + <name>label19</name> + <label>All Fields</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + </widget> +</widget> + +<widget> + <class>GnomeDialog</class> + <name>dialog2</name> + <visible>False</visible> + <auto_close>False</auto_close> + <hide_on_close>False</hide_on_close> + <allow_shrink>False</allow_shrink> + <allow_grow>False</allow_grow> + <auto_shrink>False</auto_shrink> + + <widget> + <class>GtkVBox</class> + <child_name>GnomeDialog:vbox</child_name> + <name>dialog-vbox2</name> + <child> + <padding>4</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <homogeneous>False</homogeneous> + <spacing>8</spacing> + + <widget> + <class>GtkTable</class> + <name>table2</name> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <rows>2</rows> + <columns>2</columns> + <homogeneous>False</homogeneous> + <row_spacing>0</row_spacing> + <column_spacing>0</column_spacing> + + <widget> + <class>GtkEntry</class> + <name>entry2</name> + <child> + <left_attach>0</left_attach> + <right_attach>2</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> + <can_focus>True</can_focus> + <editable>True</editable> + <text_visible>True</text_visible> + <text_max_length>0</text_max_length> + <text></text> + </widget> + + <widget> + <class>GtkVBox</class> + <name>vbox1</name> + <child> + <left_attach>1</left_attach> + <right_attach>2</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>True</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <homogeneous>False</homogeneous> + <spacing>0</spacing> + + <widget> + <class>GtkButton</class> + <name>button31</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <can_focus>True</can_focus> + <label>Add</label> + </widget> + + <widget> + <class>GtkButton</class> + <name>button32</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + <can_focus>True</can_focus> + <label>Delete</label> + </widget> + </widget> + + <widget> + <class>GtkScrolledWindow</class> + <name>scrolledwindow1</name> + <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>True</xexpand> + <yexpand>True</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>True</yfill> + </child> + <height>200</height> + <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy> + <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy> + <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> + <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> + + <widget> + <class>GtkCList</class> + <name>clist1</name> + <can_focus>True</can_focus> + <columns>1</columns> + <column_widths>80</column_widths> + <selection_mode>GTK_SELECTION_SINGLE</selection_mode> + <show_titles>True</show_titles> + <shadow_type>GTK_SHADOW_NONE</shadow_type> + + <widget> + <class>GtkLabel</class> + <child_name>CList:title</child_name> + <name>label20</name> + <label>Phone Types</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + </widget> + </widget> + </widget> + </widget> + + <widget> + <class>GtkHButtonBox</class> + <child_name>GnomeDialog:action_area</child_name> + <name>dialog-action_area2</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>True</fill> + <pack>GTK_PACK_END</pack> + </child> + <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> + + <widget> + <class>GtkButton</class> + <name>button28</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> + </widget> + + <widget> + <class>GtkButton</class> + <name>button29</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button> + </widget> + + <widget> + <class>GtkButton</class> + <name>button30</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> + </widget> + </widget> + </widget> +</widget> + +<widget> + <class>GnomeDialog</class> + <name>dialog-add-phone</name> + <visible>False</visible> + <title>New phone type</title> + <auto_close>False</auto_close> + <hide_on_close>False</hide_on_close> + <allow_shrink>False</allow_shrink> + <allow_grow>False</allow_grow> + <auto_shrink>False</auto_shrink> + + <widget> + <class>GtkVBox</class> + <child_name>GnomeDialog:vbox</child_name> + <name>vbox2</name> + <child> + <padding>4</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <homogeneous>False</homogeneous> + <spacing>8</spacing> + + <widget> + <class>GtkFrame</class> + <name>frame-add-phone</name> + <border_width>4</border_width> + <child> + <padding>0</padding> + <expand>True</expand> + <fill>True</fill> + </child> + <label>New phone type</label> + <label_xalign>0</label_xalign> + <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type> + + <widget> + <class>GtkAlignment</class> + <name>alignment9</name> + <border_width>9</border_width> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xscale>1</xscale> + <yscale>1</yscale> + + <widget> + <class>GtkEntry</class> + <name>entry-add-phone</name> + <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> + + <widget> + <class>GtkHButtonBox</class> + <child_name>GnomeDialog:action_area</child_name> + <name>hbuttonbox1</name> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>True</fill> + <pack>GTK_PACK_END</pack> + </child> + <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> + + <widget> + <class>GtkButton</class> + <name>button43</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <label>Add</label> + <stock_pixmap>GNOME_STOCK_PIXMAP_ADD</stock_pixmap> + </widget> + + <widget> + <class>GtkButton</class> + <name>button44</name> + <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/e-contact-editor-strings.h b/addressbook/gui/contact-editor/e-contact-editor-strings.h new file mode 100644 index 0000000000..131dd6fdf4 --- /dev/null +++ b/addressbook/gui/contact-editor/e-contact-editor-strings.h @@ -0,0 +1,48 @@ +/* + * 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_("Contact Editor"); +gchar *s = N_("Business Fax"); +gchar *s = N_("Home"); +gchar *s = N_("Business"); +gchar *s = N_("Mobile"); +gchar *s = N_("Email"); +gchar *s = N_("\tFull Name..."); +gchar *s = N_("Job Title:"); +gchar *s = N_("Company:"); +gchar *s = N_("File As:"); +gchar *s = N_("Web page address:"); +gchar *s = N_("Contacts..."); +gchar *s = N_("Categories..."); +gchar *s = N_("This is the mailing address"); +gchar *s = N_("A_ddress..."); +gchar *s = N_("Business"); +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_("Directory Server:"); +gchar *s = N_("Email alias:"); +gchar *s = N_("Address:"); +gchar *s = N_("Birthday:"); +gchar *s = N_("Assistant's name:"); +gchar *s = N_("Manager's name:"); +gchar *s = N_("Anniversary:"); +gchar *s = N_("Call Now"); +gchar *s = N_("Internet Free-Busy"); +gchar *s = N_("Online NetMeeting settings"); +gchar *s = N_("Details"); +gchar *s = N_("Activities"); +gchar *s = N_("Certificates"); +gchar *s = N_("All Fields"); +gchar *s = N_("Add"); +gchar *s = N_("Delete"); +gchar *s = N_("Phone Types"); +gchar *s = N_("New phone type"); +gchar *s = N_("New phone type"); +gchar *s = N_("Add"); diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index 73b48a7eb8..6a6c6d982e 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -26,8 +26,14 @@ static void e_contact_editor_init (EContactEditor *card); static void e_contact_editor_class_init (EContactEditorClass *klass); static void e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); static void e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); +static void e_contact_editor_destroy (GtkObject *object); -static GtkNotebookClass *parent_class = NULL; +static GtkWidget *e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info); +static void _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); +static void _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); +static void _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); + +static GtkVBoxClass *parent_class = NULL; #if 0 enum { @@ -44,6 +50,12 @@ enum { ARG_CARD }; +enum { + DYNAMIC_LIST_EMAIL, + DYNAMIC_LIST_PHONE, + DYNAMIC_LIST_ADDRESS +}; + GtkType e_contact_editor_get_type (void) { @@ -63,7 +75,7 @@ e_contact_editor_get_type (void) (GtkClassInitFunc) NULL, }; - contact_editor_type = gtk_type_unique (gtk_notebook_get_type (), &contact_editor_info); + contact_editor_type = gtk_type_unique (gtk_vbox_get_type (), &contact_editor_info); } return contact_editor_type; @@ -73,12 +85,12 @@ static void e_contact_editor_class_init (EContactEditorClass *klass) { GtkObjectClass *object_class; - GtkNotebookClass *notebook_class; + GtkVBoxClass *vbox_class; object_class = (GtkObjectClass*) klass; - notebook_class = (GtkNotebookClass *) klass; + vbox_class = (GtkVBoxClass *) klass; - parent_class = gtk_type_class (gtk_notebook_get_type ()); + parent_class = gtk_type_class (gtk_vbox_get_type ()); #if 0 e_contact_editor_signals[E_CONTACT_EDITOR_RESIZE] = @@ -98,300 +110,140 @@ e_contact_editor_class_init (EContactEditorClass *klass) object_class->set_arg = e_contact_editor_set_arg; object_class->get_arg = e_contact_editor_get_arg; + object_class->destroy = e_contact_editor_destroy; } -static GtkWidget * -_create_page_general_name(EContactEditor *e_contact_editor) -{ - GtkWidget *table; - GtkWidget *alignment; - table = gtk_table_new(3, 4, FALSE); - alignment = gtk_alignment_new(0, 0, 0, 0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("head.png")); - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 4, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Full Name:")), - 1, 2, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Job Title:")), - 1, 2, 1, 2, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Company:")), - 1, 2, 2, 3, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("File as:")), - 1, 2, 3, 4, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 1, 2, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 2, 3, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_combo_new(), - 2, 3, 3, 4, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; -} - -static GtkWidget * -_create_page_general_phone(EContactEditor *e_contact_editor) -{ - GtkWidget *table; - GtkWidget *alignment; - table = gtk_table_new(3, 4, FALSE); - alignment = gtk_alignment_new(0,0,0,0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("phone.png")); - - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 4, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Home:")), - 1, 2, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Car:")), - 1, 2, 1, 2, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Mobile:")), - 1, 2, 2, 3, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Business Fax:")), - 1, 2, 3, 4, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 1, 2, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 2, 3, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 3, 4, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; -} - -static GtkWidget * -_create_page_general_email(EContactEditor *e_contact_editor) -{ - GtkWidget *table; - GtkWidget *alignment; - table = gtk_table_new(3, 1, FALSE); - alignment = gtk_alignment_new(0,0,0,0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("email.png")); - - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Email:")), - 1, 2, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; -} - -static GtkWidget * -_create_page_general_web(EContactEditor *e_contact_editor) +static void +_add_image(GtkTable *table, gchar *image, int left, int right, int top, int bottom) { - GtkWidget *table; - GtkWidget *alignment; - table = gtk_table_new(3, 1, FALSE); - alignment = gtk_alignment_new(0,0,0,0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("web.png")); - - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Web page address:")), - 1, 2, 0, 1, - 0, 0, + gtk_table_attach(table, + gtk_widget_new(gtk_alignment_get_type(), + "child", gnome_pixmap_new_from_file(image), + "xalign", (double) 0, + "yalign", (double) 0, + "xscale", (double) 0, + "yscale", (double) 0, + NULL), + left, right, top, bottom, + GTK_FILL, GTK_FILL, 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_entry_new(), - 2, 3, 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; } -static GtkWidget * -_create_page_general_snailmail(EContactEditor *e_contact_editor) +static void +_add_images(GtkTable *table) { - GtkWidget *table; - GtkWidget *alignment; - GtkWidget *text; - table = gtk_table_new(3, 3, FALSE); - alignment = gtk_alignment_new(0,0,0,0); - gtk_container_add(GTK_CONTAINER(alignment), - gnome_pixmap_new_from_file("snailmail.png")); - - gtk_table_attach(GTK_TABLE(table), - alignment, - 0, 1, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Address:")), - 1, 2, 0, 1, - 0, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_label_new(_("Business:")), - 1, 2, 1, 2, - 0, 0, - 0, 0); - text = gtk_text_new(NULL, NULL); - gtk_object_set(GTK_OBJECT(text), - "editable", TRUE, - NULL); - gtk_table_attach(GTK_TABLE(table), - text, - 2, 3, 0, 2, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - gtk_check_button_new_with_label(_("This is the mailing address")), - 2, 3, 2, 3, - 0, 0, - 0, 0); - return table; + _add_image(table, DATADIR "/evolution/head.png", 0, 1, 0, 4); + _add_image(table, DATADIR "/evolution/phone.png", 4, 5, 0, 4); + _add_image(table, DATADIR "/evolution/email.png", 0, 1, 5, 7); + _add_image(table, DATADIR "/evolution/web.png", 0, 1, 8, 10); + _add_image(table, DATADIR "/evolution/snailmail.png", 4, 5, 5, 10); } -static GtkWidget * -_create_page_general_comments(EContactEditor *e_contact_editor) +static void +_add_details_images(GtkTable *table) { - GtkWidget *text; - text = gtk_text_new(NULL, NULL); - gtk_object_set (GTK_OBJECT(text), - "editable", TRUE, - NULL); - return text; + _add_image(table, DATADIR "/evolution/briefcase.png", 0, 1, 0, 2); + _add_image(table, DATADIR "/evolution/head.png", 0, 1, 4, 6); + _add_image(table, DATADIR "/evolution/netmeeting.png", 0, 1, 7, 9); + _add_image(table, DATADIR "/evolution/netfreebusy.png", 0, 1, 10, 12); } -static GtkWidget * -_create_page_general_extras(EContactEditor *e_contact_editor) +static void +_replace_button(EContactEditor *editor, gchar *button_xml, gchar *image, GtkSignalFunc func) { - return gtk_entry_new(); + GladeXML *gui = editor->gui; + GtkWidget *button = glade_xml_get_widget(gui, button_xml); + gchar *image_temp; + image_temp = g_strdup_printf("%s%s", DATADIR "/evolution/", image); + gtk_container_add(GTK_CONTAINER(button), + gnome_pixmap_new_from_file(image_temp)); + g_free(image_temp); + gtk_signal_connect(GTK_OBJECT(button), "button_press_event", func, editor); + } -static GtkWidget * -_create_page_general( EContactEditor *e_contact_editor ) +static void +_replace_buttons(EContactEditor *editor) { - GtkWidget *table; - table = gtk_table_new(2, 5, FALSE); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_name(e_contact_editor), - 0, 1, - 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_phone(e_contact_editor), - 1, 2, - 0, 1, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_email(e_contact_editor), - 0, 1, - 1, 2, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_web(e_contact_editor), - 0, 1, - 2, 3, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_snailmail(e_contact_editor), - 1, 2, - 1, 3, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_comments(e_contact_editor), - 0, 2, - 3, 4, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 0, 0); - gtk_table_attach(GTK_TABLE(table), - _create_page_general_extras(e_contact_editor), - 0, 2, - 4, 5, - GTK_FILL | GTK_EXPAND, 0, - 0, 0); - return table; + _replace_button(editor, "button-phone1", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone2", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone3", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-phone4", "arrow.png", _phone_arrow_pressed); + _replace_button(editor, "button-address1", "arrow.png", _address_arrow_pressed); + _replace_button(editor, "button-email1", "arrow.png", _email_arrow_pressed); } static void e_contact_editor_init (EContactEditor *e_contact_editor) { - GtkNotebook *notebook = GTK_NOTEBOOK (e_contact_editor); + GladeXML *gui; + GtkAdjustment *adjustment; /* e_contact_editor->card = NULL;*/ - e_contact_editor->fields = NULL; + gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL); + e_contact_editor->gui = gui; + gtk_widget_reparent(glade_xml_get_widget(gui, "notebook-contact-editor"), + GTK_WIDGET(e_contact_editor)); + + _add_images(GTK_TABLE(glade_xml_get_widget(gui, "table-contact-editor-general"))); + _add_details_images(GTK_TABLE(glade_xml_get_widget(gui, "table-contact-editor-details"))); + _replace_buttons(e_contact_editor); + + gtk_object_get(GTK_OBJECT(glade_xml_get_widget(gui, "text-comments")), + "vadjustment", &adjustment, + NULL); + gtk_range_set_adjustment(GTK_RANGE(glade_xml_get_widget(gui, "vscrollbar-comments")), + adjustment); + + e_contact_editor->email_info = NULL; + e_contact_editor->phone_info = NULL; + e_contact_editor->address_info = NULL; + e_contact_editor->email_popup = NULL; + e_contact_editor->phone_popup = NULL; + e_contact_editor->address_popup = NULL; + e_contact_editor->email_list = NULL; + e_contact_editor->phone_list = NULL; + e_contact_editor->address_list = NULL; +} + +void +e_contact_editor_destroy (GtkObject *object) { + EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object); + + if (e_contact_editor->email_list) { + g_list_foreach(e_contact_editor->email_list, (GFunc) g_free, NULL); + g_list_free(e_contact_editor->email_list); + } + if (e_contact_editor->email_info) { + g_free(e_contact_editor->email_info); + } + if (e_contact_editor->email_popup) { + gtk_widget_unref(e_contact_editor->email_popup); + } + + if (e_contact_editor->phone_list) { + g_list_foreach(e_contact_editor->phone_list, (GFunc) g_free, NULL); + g_list_free(e_contact_editor->phone_list); + } + if (e_contact_editor->phone_info) { + g_free(e_contact_editor->phone_info); + } + if (e_contact_editor->phone_popup) { + gtk_widget_unref(e_contact_editor->phone_popup); + } + + if (e_contact_editor->address_list) { + g_list_foreach(e_contact_editor->address_list, (GFunc) g_free, NULL); + g_list_free(e_contact_editor->address_list); + } + if (e_contact_editor->address_info) { + g_free(e_contact_editor->address_info); + } + if (e_contact_editor->address_popup) { + gtk_widget_unref(e_contact_editor->address_popup); + } - gtk_notebook_append_page (notebook, - _create_page_general(e_contact_editor), - gtk_label_new(_("General"))); + gtk_object_unref(GTK_OBJECT(e_contact_editor->gui)); } GtkWidget* @@ -436,3 +288,277 @@ e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) break; } } + +static void +_popup_position(GtkMenu *menu, + gint *x, + gint *y, + gpointer data) +{ + GtkWidget *button = GTK_WIDGET(data); + int mh, mw; + gdk_window_get_origin (button->window, x, y); + *x += button->allocation.width; + *y += button->allocation.height; + + mh = GTK_WIDGET(menu)->allocation.height; + mw = GTK_WIDGET(menu)->allocation.width; + + *x -= mw; + if (*x < 0) + *x = 0; + + if (*y < 0) + *y = 0; + + if ((*x + mw) > gdk_screen_width ()) + *x = gdk_screen_width () - mw; + + if ((*y + mh) > gdk_screen_height ()) + *y = gdk_screen_height () - mh; +} + +static void +_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor, GtkWidget *popup, GList **list, GnomeUIInfo **info, gchar *label, gchar *entry, gchar *dialog_title) +{ + gint menu_item; + gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event"); + gtk_widget_realize(popup); + menu_item = gnome_popup_menu_do_popup_modal(popup, _popup_position, widget, button, editor); + if ( menu_item != -1 ) { + if (menu_item == g_list_length (*list)) { + e_contact_editor_build_dialog(editor, entry, label, dialog_title, list, info); + } else { + gtk_object_set(GTK_OBJECT(glade_xml_get_widget(editor->gui, label)), + "label", g_list_nth_data(*list, menu_item), + NULL); + } + } +} + +static void +e_contact_editor_build_ui_info(GList *list, GnomeUIInfo **infop) +{ + GnomeUIInfo *info; + GnomeUIInfo singleton = { GNOME_APP_UI_ITEM, NULL, NULL, NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, 0, 0, 0, NULL }; + GnomeUIInfo end = GNOMEUIINFO_END; + int length; + int i; + + info = *infop; + + if ( info ) + g_free(info); + length = g_list_length( list ); + info = g_new(GnomeUIInfo, length + 2); + for (i = 0; i < length; i++) { + info[i] = singleton; + info[i].label = _(list->data); + list = list->next; + } + info[i] = singleton; + info[i].label = N_("Other..."); + i++; + info[i] = end; + + *infop = info; +} + +static void +_dialog_clicked(GtkWidget *dialog, gint button, EContactEditor *editor) +{ + GtkWidget *label = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_label"); + GtkWidget *entry = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_entry"); + GtkWidget *dialog_entry = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_dialog_entry"); + GList **list = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_list"); + GList **info = gtk_object_get_data(GTK_OBJECT(dialog), + "e_contact_editor_info"); + switch (button) { + case 0: + gtk_object_set(GTK_OBJECT(label), + "label", gtk_entry_get_text(GTK_ENTRY(dialog_entry)), + NULL); + *list = g_list_append(*list, g_strdup(gtk_entry_get_text(GTK_ENTRY(dialog_entry)))); + g_free(*info); + *info = NULL; + break; + } + gnome_dialog_close(GNOME_DIALOG(dialog)); +} + +static void +_dialog_destroy(EContactEditor *editor, GtkWidget *dialog) +{ + gnome_dialog_close(GNOME_DIALOG(dialog)); +} + +static GtkWidget * +e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info) +{ + GtkWidget *dialog_entry = gtk_entry_new(); + GtkWidget *entry = glade_xml_get_widget(editor->gui, entry_id); + GtkWidget *label = glade_xml_get_widget(editor->gui, label_id); + + 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, + "label", title, + "child", gtk_widget_new(gtk_alignment_get_type(), + "child", dialog_entry, + "xalign", .5, + "yalign", .5, + "xscale", 1.0, + "yscale", 1.0, + "border_width", 9, + NULL), + NULL)); + + gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(dialog), + "Add", + GNOME_STOCK_PIXMAP_ADD); + gnome_dialog_append_button(GNOME_DIALOG(dialog), GNOME_STOCK_BUTTON_CANCEL); + gnome_dialog_set_default(GNOME_DIALOG(dialog), 0); + + gtk_signal_connect(GTK_OBJECT(dialog), "clicked", + _dialog_clicked, editor); + gtk_signal_connect_while_alive(GTK_OBJECT(editor), "destroy", + _dialog_destroy, GTK_OBJECT(dialog), GTK_OBJECT(dialog)); + + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_entry", entry); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_label", label); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_dialog_entry", dialog_entry); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_list", list); + gtk_object_set_data(GTK_OBJECT(dialog), + "e_contact_editor_info", info); + + gtk_widget_show_all(dialog); + return dialog; +} + +static void +_phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) +{ + int which; + int i; + gchar *label; + gchar *entry; + if ( widget == glade_xml_get_widget(editor->gui, "button-phone1") ) { + which = 1; + } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone2") ) { + which = 2; + } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone3") ) { + which = 3; + } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone4") ) { + which = 4; + } else + return; + + label = g_strdup_printf("label-phone%d", which); + entry = g_strdup_printf("entry-phone%d", which); + + if (editor->phone_list == NULL) { + static char *info[] = { + N_("Assistant"), + N_("Business"), + N_("Business 2"), + N_("Business Fax"), + N_("Callback"), + N_("Car"), + N_("Company"), + N_("Home"), + N_("Home 2"), + N_("Home Fax"), + N_("ISDN"), + N_("Mobile"), + N_("Other"), + N_("Other Fax"), + N_("Pager"), + N_("Primary"), + N_("Radio"), + N_("Telex"), + N_("TTY/TDD") + }; + + for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { + editor->phone_list = g_list_append(editor->phone_list, g_strdup(info[i])); + } + } + if (editor->phone_info == NULL) { + e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info); + + if ( editor->phone_popup ) + gtk_widget_unref(editor->phone_popup); + + editor->phone_popup = gnome_popup_menu_new(editor->phone_info); + } + + _arrow_pressed (widget, button, editor, editor->phone_popup, &editor->phone_list, &editor->phone_info, label, entry, "Add new phone number type"); + + g_free(label); + g_free(entry); +} + +static void +_email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) +{ + int i; + if (editor->email_list == NULL) { + static char *info[] = { + N_("Email"), + N_("Email 2"), + N_("Email 3") + }; + + for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { + editor->email_list = g_list_append(editor->email_list, g_strdup(info[i])); + } + } + if (editor->email_info == NULL) { + e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); + + if ( editor->email_popup ) + gtk_widget_unref(editor->email_popup); + + editor->email_popup = gnome_popup_menu_new(editor->email_info); + } + + _arrow_pressed (widget, button, editor, editor->email_popup, &editor->email_list, &editor->email_info, "label-email1", "entry-email1", "Add new Email type"); +} + +static void +_address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) +{ + int i; + if (editor->address_list == NULL) { + static char *info[] = { + N_("Business"), + N_("Home"), + N_("Other") + }; + + for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { + editor->address_list = g_list_append(editor->address_list, g_strdup(info[i])); + } + } + if (editor->address_info == NULL) { + e_contact_editor_build_ui_info(editor->address_list, &editor->address_info); + + if ( editor->address_popup ) + gtk_widget_unref(editor->address_popup); + + editor->address_popup = gnome_popup_menu_new(editor->address_info); + } + + _arrow_pressed (widget, button, editor, editor->address_popup, &editor->address_list, &editor->address_info, "label-address1", "entry-address1", "Add new Address type"); +} diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h index 45f3ae5597..7b914967ee 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.h +++ b/addressbook/gui/contact-editor/e-contact-editor.h @@ -22,6 +22,7 @@ #define __E_CONTACT_EDITOR_H__ #include <gnome.h> +#include <glade/glade.h> #ifdef __cplusplus extern "C" { @@ -49,17 +50,26 @@ typedef struct _EContactEditorClass EContactEditorClass; struct _EContactEditor { - GtkNotebook parent; + GtkVBox parent; /* item specific fields */ /* ECard *card; */ - GList *fields; /* Of type GnomeCanvasItem. */ + GladeXML *gui; + GnomeUIInfo *email_info; + GnomeUIInfo *phone_info; + GnomeUIInfo *address_info; + GtkWidget *email_popup; + GtkWidget *phone_popup; + GtkWidget *address_popup; + GList *email_list; + GList *phone_list; + GList *address_list; }; struct _EContactEditorClass { - GtkNotebookClass parent_class; + GtkVBoxClass parent_class; }; diff --git a/addressbook/gui/contact-editor/netfreebusy.png b/addressbook/gui/contact-editor/netfreebusy.png Binary files differnew file mode 100644 index 0000000000..09ec8a2a5c --- /dev/null +++ b/addressbook/gui/contact-editor/netfreebusy.png diff --git a/addressbook/gui/contact-editor/netmeeting.png b/addressbook/gui/contact-editor/netmeeting.png Binary files differnew file mode 100644 index 0000000000..4cb90c121e --- /dev/null +++ b/addressbook/gui/contact-editor/netmeeting.png diff --git a/addressbook/gui/contact-editor/test-editor.c b/addressbook/gui/contact-editor/test-editor.c index 737c3028c4..49ed7e48bf 100644 --- a/addressbook/gui/contact-editor/test-editor.c +++ b/addressbook/gui/contact-editor/test-editor.c @@ -23,6 +23,7 @@ #include "config.h" #include <gnome.h> +#include <glade/glade.h> #include "e-contact-editor.h" /* This is a horrible thing to do, but it is just a test. */ @@ -30,7 +31,10 @@ GtkWidget *editor; static void destroy_callback(GtkWidget *app, gpointer data) { - exit(0); + static int count = 2; + count --; + if ( count <= 0 ) + exit(0); } static void about_callback( GtkWidget *widget, gpointer data ) @@ -59,6 +63,22 @@ int main( int argc, char *argv[] ) textdomain (PACKAGE);*/ gnome_init( "Contact Editor Test", VERSION, argc, argv); + + glade_gnome_init (); + + app = gnome_app_new("Contact Editor Test", NULL); + + editor = e_contact_editor_new(NULL); + + gnome_app_set_contents( GNOME_APP( app ), editor ); + + /* Connect the signals */ + gtk_signal_connect( GTK_OBJECT( app ), "destroy", + GTK_SIGNAL_FUNC( destroy_callback ), + ( gpointer ) app ); + + gtk_widget_show_all( app ); + app = gnome_app_new("Contact Editor Test", NULL); editor = e_contact_editor_new(NULL); diff --git a/addressbook/gui/minicard/e-minicard.c b/addressbook/gui/minicard/e-minicard.c index bef929b36c..f656d98b40 100644 --- a/addressbook/gui/minicard/e-minicard.c +++ b/addressbook/gui/minicard/e-minicard.c @@ -141,9 +141,11 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_WIDTH: - e_minicard->width = GTK_VALUE_DOUBLE (*arg); - _update_card(e_minicard); - gnome_canvas_item_request_update (item); + if (e_minicard->width != GTK_VALUE_DOUBLE (*arg)) { + e_minicard->width = GTK_VALUE_DOUBLE (*arg); + _update_card(e_minicard); + gnome_canvas_item_request_update (item); + } break; case ARG_HAS_FOCUS: if (e_minicard->fields) diff --git a/addressbook/gui/minicard/e-reflow.c b/addressbook/gui/minicard/e-reflow.c index ce2e92e530..e9ff1b6eaa 100644 --- a/addressbook/gui/minicard/e-reflow.c +++ b/addressbook/gui/minicard/e-reflow.c @@ -32,6 +32,8 @@ static void e_reflow_realize (GnomeCanvasItem *item); static void e_reflow_unrealize (GnomeCanvasItem *item); static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height); +static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags); +static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item); static void _update_reflow ( EReflow *reflow ); static void _resize( GtkObject *object, gpointer data ); @@ -112,7 +114,9 @@ e_reflow_class_init (EReflowClass *klass) item_class->event = e_reflow_event; item_class->realize = e_reflow_realize; item_class->unrealize = e_reflow_unrealize; - /* item_class->draw = e_reflow_draw;*/ + item_class->draw = e_reflow_draw; + item_class->update = e_reflow_update; + item_class->point = e_reflow_point; } static void @@ -126,6 +130,8 @@ e_reflow_init (EReflow *reflow) reflow->width = 10; reflow->height = 10; reflow->idle = 0; + + reflow->column_drag = FALSE; } static void @@ -214,6 +220,14 @@ e_reflow_unrealize (GnomeCanvasItem *item) (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item); } +static gint +e_reflow_pick_line (EReflow *e_reflow, gint x) +{ + x += 6; + x /= e_reflow->column_width + 16; + return x; +} + static gboolean e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) { @@ -249,8 +263,56 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) } } } + break; + case GDK_BUTTON_PRESS: + { + GdkEventButton *button = (GdkEventButton *) event; + int n_x; + n_x = button->x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) { + e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x); + e_reflow->start_x = button->x; + e_reflow->temp_column_width = e_reflow->column_width; + e_reflow->column_drag = TRUE; + gnome_canvas_item_request_update(item); + return TRUE; + } + } + break; + case GDK_BUTTON_RELEASE: + if (e_reflow->column_drag) { + GdkEventButton *button = (GdkEventButton *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (button->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if ( e_reflow->temp_column_width < 50 ) + e_reflow->temp_column_width = 50; + gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width)); + e_reflow->column_width = e_reflow->temp_column_width; + e_reflow->column_drag = FALSE; + _update_reflow(e_reflow); + gnome_canvas_item_request_update(item); + return TRUE; + } + break; + case GDK_MOTION_NOTIFY: + if (e_reflow->column_drag) { + double old_width = e_reflow->temp_column_width; + GdkEventMotion *motion = (GdkEventMotion *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if (e_reflow->temp_column_width < 50) + e_reflow->temp_column_width = 50; + if (old_width != e_reflow->temp_column_width) + gnome_canvas_item_request_update(item); + return TRUE; + } + break; default: - break; + break; } if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event) @@ -275,7 +337,7 @@ e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item) } } -#if 0 + static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) { @@ -283,17 +345,25 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, gint running_width; EReflow *e_reflow = E_REFLOW(item); int i; + double column_width; if (GNOME_CANVAS_ITEM_CLASS(parent_class)->draw) GNOME_CANVAS_ITEM_CLASS(parent_class)->draw (item, drawable, x, y, width, height); - - running_width = 7 + e_reflow->column_width + 7; + column_width = e_reflow->column_width; + running_width = 7 + column_width + 7; x_rect = running_width; y_rect = 7; width_rect = 2; height_rect = e_reflow->height - 14; - for (i = 0; i < e_reflow->column_count - 1; i++) { + /* Compute first column to draw. */ + i = x; + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; x_rect = running_width; gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style, drawable, @@ -303,13 +373,94 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, GTK_WIDGET(item->canvas), "reflow", x_rect - x, - y_rect - x, + y_rect - y, width_rect, height_rect); - running_width += 2 + 7 + e_reflow->column_width + 7; + running_width += 2 + 7 + column_width + 7; + } + if (e_reflow->column_drag) { + int start_line = e_reflow_pick_line(e_reflow, + gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value); + i = x - start_line * (column_width + 16); + running_width = start_line * (column_width + 16); + column_width = e_reflow->temp_column_width; + running_width -= start_line * (column_width + 16); + i += start_line * (column_width + 16); + running_width += 7 + column_width + 7; + x_rect = running_width; + y_rect = 7; + width_rect = 2; + height_rect = e_reflow->height - 14; + + /* Compute first column to draw. */ + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; + x_rect = running_width; + gdk_draw_rectangle(drawable, + GTK_WIDGET(item->canvas)->style->fg_gc[GTK_STATE_NORMAL], + TRUE, + x_rect - x, + y_rect - y, + width_rect - 1, + height_rect - 1); + running_width += 2 + 7 + column_width + 7; + } + } +} + +static void +e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags) +{ + double x0, x1, y0, y1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update) + GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags); + + x0 = item->x1; + y0 = item->y1; + x1 = item->x2; + y1 = item->y2; + if ( x0 > 0 ) + x0 = 0; + if ( y0 > 0 ) + y0 = 0; + if ( x1 < E_REFLOW(item)->width ) + x1 = E_REFLOW(item)->width; + if ( x1 < E_REFLOW(item)->height ) + x1 = E_REFLOW(item)->height; + + gnome_canvas_update_bbox(item, x0, y0, x1, y1); +} + +static double +e_reflow_point (GnomeCanvasItem *item, + double x, double y, int cx, int cy, + GnomeCanvasItem **actual_item) +{ + EReflow *e_reflow = E_REFLOW(item); + double distance = 1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->point) + distance = GNOME_CANVAS_ITEM_CLASS(parent_class)->point (item, x, y, cx, cy, actual_item); + if (*actual_item) + return 0; + + if (y >= 7 && y <= e_reflow->height - 7) { + int n_x; + n_x = x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if (n_x < 4) { + *actual_item = item; + return 0; + } } + return distance; } -#endif static void _reflow( EReflow *e_reflow ) @@ -380,6 +531,9 @@ _update_reflow( EReflow *e_reflow ) running_height = 7; list = e_reflow->items; + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); @@ -391,6 +545,9 @@ _update_reflow( EReflow *e_reflow ) list = g_list_next(list); for( ; list; list = g_list_next(list)) { + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); diff --git a/addressbook/gui/minicard/e-reflow.h b/addressbook/gui/minicard/e-reflow.h index 0d0ab4251a..27b96645f8 100644 --- a/addressbook/gui/minicard/e-reflow.h +++ b/addressbook/gui/minicard/e-reflow.h @@ -65,6 +65,12 @@ struct _EReflow double column_width; int idle; + + /* These are all for when the column is being dragged. */ + gboolean column_drag; + gdouble start_x; + gint which_column_dragged; + double temp_column_width; }; struct _EReflowClass diff --git a/addressbook/gui/minicard/test-reflow.c b/addressbook/gui/minicard/test-reflow.c index f03232c72d..067e520754 100644 --- a/addressbook/gui/minicard/test-reflow.c +++ b/addressbook/gui/minicard/test-reflow.c @@ -26,6 +26,7 @@ /* This is a horrible thing to do, but it is just a test. */ GnomeCanvasItem *reflow; GnomeCanvasItem *rect; +GtkAllocation last_alloc; static void destroy_callback(GtkWidget *app, gpointer data) { @@ -35,6 +36,7 @@ static void destroy_callback(GtkWidget *app, gpointer data) static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) { double width; + last_alloc = *allocation; gnome_canvas_item_set( reflow, "height", (double) allocation->height, NULL ); @@ -49,6 +51,20 @@ static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpoi NULL ); } +static void resize(GnomeCanvasItem *item, gpointer data) +{ + double width; + gtk_object_get(GTK_OBJECT(reflow), + "width", &width, + NULL); + width = MAX(width, last_alloc.width); + gnome_canvas_set_scroll_region(item->canvas , 0, 0, width, last_alloc.height ); + gnome_canvas_item_set( rect, + "x2", (double) width, + "y2", (double) last_alloc.height, + NULL ); +} + static void about_callback( GtkWidget *widget, gpointer data ) { @@ -98,6 +114,9 @@ int main( int argc, char *argv[] ) "y", (double) 0, "height", (double) 100, NULL ); + gtk_signal_connect( GTK_OBJECT( reflow ), "resize", + GTK_SIGNAL_FUNC( resize ), + ( gpointer ) app); for ( i = 0; i < 200; i++ ) { GnomeCanvasItem *item; diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c index bef929b36c..f656d98b40 100644 --- a/addressbook/gui/widgets/e-minicard.c +++ b/addressbook/gui/widgets/e-minicard.c @@ -141,9 +141,11 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_WIDTH: - e_minicard->width = GTK_VALUE_DOUBLE (*arg); - _update_card(e_minicard); - gnome_canvas_item_request_update (item); + if (e_minicard->width != GTK_VALUE_DOUBLE (*arg)) { + e_minicard->width = GTK_VALUE_DOUBLE (*arg); + _update_card(e_minicard); + gnome_canvas_item_request_update (item); + } break; case ARG_HAS_FOCUS: if (e_minicard->fields) diff --git a/addressbook/gui/widgets/test-reflow.c b/addressbook/gui/widgets/test-reflow.c index f03232c72d..067e520754 100644 --- a/addressbook/gui/widgets/test-reflow.c +++ b/addressbook/gui/widgets/test-reflow.c @@ -26,6 +26,7 @@ /* This is a horrible thing to do, but it is just a test. */ GnomeCanvasItem *reflow; GnomeCanvasItem *rect; +GtkAllocation last_alloc; static void destroy_callback(GtkWidget *app, gpointer data) { @@ -35,6 +36,7 @@ static void destroy_callback(GtkWidget *app, gpointer data) static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) { double width; + last_alloc = *allocation; gnome_canvas_item_set( reflow, "height", (double) allocation->height, NULL ); @@ -49,6 +51,20 @@ static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpoi NULL ); } +static void resize(GnomeCanvasItem *item, gpointer data) +{ + double width; + gtk_object_get(GTK_OBJECT(reflow), + "width", &width, + NULL); + width = MAX(width, last_alloc.width); + gnome_canvas_set_scroll_region(item->canvas , 0, 0, width, last_alloc.height ); + gnome_canvas_item_set( rect, + "x2", (double) width, + "y2", (double) last_alloc.height, + NULL ); +} + static void about_callback( GtkWidget *widget, gpointer data ) { @@ -98,6 +114,9 @@ int main( int argc, char *argv[] ) "y", (double) 0, "height", (double) 100, NULL ); + gtk_signal_connect( GTK_OBJECT( reflow ), "resize", + GTK_SIGNAL_FUNC( resize ), + ( gpointer ) app); for ( i = 0; i < 200; i++ ) { GnomeCanvasItem *item; diff --git a/e-util/e-text-event-processor-types.h b/e-util/e-text-event-processor-types.h index 3795058225..eb8e0d4a50 100644 --- a/e-util/e-text-event-processor-types.h +++ b/e-util/e-text-event-processor-types.h @@ -75,8 +75,8 @@ enum _ETextEventProcessorCommandAction { E_TEP_MOVE, E_TEP_SELECT, E_TEP_DELETE, - E_TEP_INSERT, + E_TEP_COPY, E_TEP_PASTE, E_TEP_GET_SELECTION, diff --git a/widgets/e-minicard.c b/widgets/e-minicard.c index bef929b36c..f656d98b40 100644 --- a/widgets/e-minicard.c +++ b/widgets/e-minicard.c @@ -141,9 +141,11 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_WIDTH: - e_minicard->width = GTK_VALUE_DOUBLE (*arg); - _update_card(e_minicard); - gnome_canvas_item_request_update (item); + if (e_minicard->width != GTK_VALUE_DOUBLE (*arg)) { + e_minicard->width = GTK_VALUE_DOUBLE (*arg); + _update_card(e_minicard); + gnome_canvas_item_request_update (item); + } break; case ARG_HAS_FOCUS: if (e_minicard->fields) diff --git a/widgets/e-minicard/e-minicard.c b/widgets/e-minicard/e-minicard.c index bef929b36c..f656d98b40 100644 --- a/widgets/e-minicard/e-minicard.c +++ b/widgets/e-minicard/e-minicard.c @@ -141,9 +141,11 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) switch (arg_id){ case ARG_WIDTH: - e_minicard->width = GTK_VALUE_DOUBLE (*arg); - _update_card(e_minicard); - gnome_canvas_item_request_update (item); + if (e_minicard->width != GTK_VALUE_DOUBLE (*arg)) { + e_minicard->width = GTK_VALUE_DOUBLE (*arg); + _update_card(e_minicard); + gnome_canvas_item_request_update (item); + } break; case ARG_HAS_FOCUS: if (e_minicard->fields) diff --git a/widgets/e-minicard/e-reflow.c b/widgets/e-minicard/e-reflow.c index ce2e92e530..e9ff1b6eaa 100644 --- a/widgets/e-minicard/e-reflow.c +++ b/widgets/e-minicard/e-reflow.c @@ -32,6 +32,8 @@ static void e_reflow_realize (GnomeCanvasItem *item); static void e_reflow_unrealize (GnomeCanvasItem *item); static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height); +static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags); +static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item); static void _update_reflow ( EReflow *reflow ); static void _resize( GtkObject *object, gpointer data ); @@ -112,7 +114,9 @@ e_reflow_class_init (EReflowClass *klass) item_class->event = e_reflow_event; item_class->realize = e_reflow_realize; item_class->unrealize = e_reflow_unrealize; - /* item_class->draw = e_reflow_draw;*/ + item_class->draw = e_reflow_draw; + item_class->update = e_reflow_update; + item_class->point = e_reflow_point; } static void @@ -126,6 +130,8 @@ e_reflow_init (EReflow *reflow) reflow->width = 10; reflow->height = 10; reflow->idle = 0; + + reflow->column_drag = FALSE; } static void @@ -214,6 +220,14 @@ e_reflow_unrealize (GnomeCanvasItem *item) (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item); } +static gint +e_reflow_pick_line (EReflow *e_reflow, gint x) +{ + x += 6; + x /= e_reflow->column_width + 16; + return x; +} + static gboolean e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) { @@ -249,8 +263,56 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) } } } + break; + case GDK_BUTTON_PRESS: + { + GdkEventButton *button = (GdkEventButton *) event; + int n_x; + n_x = button->x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) { + e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x); + e_reflow->start_x = button->x; + e_reflow->temp_column_width = e_reflow->column_width; + e_reflow->column_drag = TRUE; + gnome_canvas_item_request_update(item); + return TRUE; + } + } + break; + case GDK_BUTTON_RELEASE: + if (e_reflow->column_drag) { + GdkEventButton *button = (GdkEventButton *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (button->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if ( e_reflow->temp_column_width < 50 ) + e_reflow->temp_column_width = 50; + gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width)); + e_reflow->column_width = e_reflow->temp_column_width; + e_reflow->column_drag = FALSE; + _update_reflow(e_reflow); + gnome_canvas_item_request_update(item); + return TRUE; + } + break; + case GDK_MOTION_NOTIFY: + if (e_reflow->column_drag) { + double old_width = e_reflow->temp_column_width; + GdkEventMotion *motion = (GdkEventMotion *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if (e_reflow->temp_column_width < 50) + e_reflow->temp_column_width = 50; + if (old_width != e_reflow->temp_column_width) + gnome_canvas_item_request_update(item); + return TRUE; + } + break; default: - break; + break; } if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event) @@ -275,7 +337,7 @@ e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item) } } -#if 0 + static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) { @@ -283,17 +345,25 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, gint running_width; EReflow *e_reflow = E_REFLOW(item); int i; + double column_width; if (GNOME_CANVAS_ITEM_CLASS(parent_class)->draw) GNOME_CANVAS_ITEM_CLASS(parent_class)->draw (item, drawable, x, y, width, height); - - running_width = 7 + e_reflow->column_width + 7; + column_width = e_reflow->column_width; + running_width = 7 + column_width + 7; x_rect = running_width; y_rect = 7; width_rect = 2; height_rect = e_reflow->height - 14; - for (i = 0; i < e_reflow->column_count - 1; i++) { + /* Compute first column to draw. */ + i = x; + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; x_rect = running_width; gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style, drawable, @@ -303,13 +373,94 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, GTK_WIDGET(item->canvas), "reflow", x_rect - x, - y_rect - x, + y_rect - y, width_rect, height_rect); - running_width += 2 + 7 + e_reflow->column_width + 7; + running_width += 2 + 7 + column_width + 7; + } + if (e_reflow->column_drag) { + int start_line = e_reflow_pick_line(e_reflow, + gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value); + i = x - start_line * (column_width + 16); + running_width = start_line * (column_width + 16); + column_width = e_reflow->temp_column_width; + running_width -= start_line * (column_width + 16); + i += start_line * (column_width + 16); + running_width += 7 + column_width + 7; + x_rect = running_width; + y_rect = 7; + width_rect = 2; + height_rect = e_reflow->height - 14; + + /* Compute first column to draw. */ + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; + x_rect = running_width; + gdk_draw_rectangle(drawable, + GTK_WIDGET(item->canvas)->style->fg_gc[GTK_STATE_NORMAL], + TRUE, + x_rect - x, + y_rect - y, + width_rect - 1, + height_rect - 1); + running_width += 2 + 7 + column_width + 7; + } + } +} + +static void +e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags) +{ + double x0, x1, y0, y1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update) + GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags); + + x0 = item->x1; + y0 = item->y1; + x1 = item->x2; + y1 = item->y2; + if ( x0 > 0 ) + x0 = 0; + if ( y0 > 0 ) + y0 = 0; + if ( x1 < E_REFLOW(item)->width ) + x1 = E_REFLOW(item)->width; + if ( x1 < E_REFLOW(item)->height ) + x1 = E_REFLOW(item)->height; + + gnome_canvas_update_bbox(item, x0, y0, x1, y1); +} + +static double +e_reflow_point (GnomeCanvasItem *item, + double x, double y, int cx, int cy, + GnomeCanvasItem **actual_item) +{ + EReflow *e_reflow = E_REFLOW(item); + double distance = 1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->point) + distance = GNOME_CANVAS_ITEM_CLASS(parent_class)->point (item, x, y, cx, cy, actual_item); + if (*actual_item) + return 0; + + if (y >= 7 && y <= e_reflow->height - 7) { + int n_x; + n_x = x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if (n_x < 4) { + *actual_item = item; + return 0; + } } + return distance; } -#endif static void _reflow( EReflow *e_reflow ) @@ -380,6 +531,9 @@ _update_reflow( EReflow *e_reflow ) running_height = 7; list = e_reflow->items; + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); @@ -391,6 +545,9 @@ _update_reflow( EReflow *e_reflow ) list = g_list_next(list); for( ; list; list = g_list_next(list)) { + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); diff --git a/widgets/e-minicard/e-reflow.h b/widgets/e-minicard/e-reflow.h index 0d0ab4251a..27b96645f8 100644 --- a/widgets/e-minicard/e-reflow.h +++ b/widgets/e-minicard/e-reflow.h @@ -65,6 +65,12 @@ struct _EReflow double column_width; int idle; + + /* These are all for when the column is being dragged. */ + gboolean column_drag; + gdouble start_x; + gint which_column_dragged; + double temp_column_width; }; struct _EReflowClass diff --git a/widgets/e-minicard/test-reflow.c b/widgets/e-minicard/test-reflow.c index f03232c72d..067e520754 100644 --- a/widgets/e-minicard/test-reflow.c +++ b/widgets/e-minicard/test-reflow.c @@ -26,6 +26,7 @@ /* This is a horrible thing to do, but it is just a test. */ GnomeCanvasItem *reflow; GnomeCanvasItem *rect; +GtkAllocation last_alloc; static void destroy_callback(GtkWidget *app, gpointer data) { @@ -35,6 +36,7 @@ static void destroy_callback(GtkWidget *app, gpointer data) static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) { double width; + last_alloc = *allocation; gnome_canvas_item_set( reflow, "height", (double) allocation->height, NULL ); @@ -49,6 +51,20 @@ static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpoi NULL ); } +static void resize(GnomeCanvasItem *item, gpointer data) +{ + double width; + gtk_object_get(GTK_OBJECT(reflow), + "width", &width, + NULL); + width = MAX(width, last_alloc.width); + gnome_canvas_set_scroll_region(item->canvas , 0, 0, width, last_alloc.height ); + gnome_canvas_item_set( rect, + "x2", (double) width, + "y2", (double) last_alloc.height, + NULL ); +} + static void about_callback( GtkWidget *widget, gpointer data ) { @@ -98,6 +114,9 @@ int main( int argc, char *argv[] ) "y", (double) 0, "height", (double) 100, NULL ); + gtk_signal_connect( GTK_OBJECT( reflow ), "resize", + GTK_SIGNAL_FUNC( resize ), + ( gpointer ) app); for ( i = 0; i < 200; i++ ) { GnomeCanvasItem *item; diff --git a/widgets/e-reflow.c b/widgets/e-reflow.c index ce2e92e530..e9ff1b6eaa 100644 --- a/widgets/e-reflow.c +++ b/widgets/e-reflow.c @@ -32,6 +32,8 @@ static void e_reflow_realize (GnomeCanvasItem *item); static void e_reflow_unrealize (GnomeCanvasItem *item); static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height); +static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags); +static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item); static void _update_reflow ( EReflow *reflow ); static void _resize( GtkObject *object, gpointer data ); @@ -112,7 +114,9 @@ e_reflow_class_init (EReflowClass *klass) item_class->event = e_reflow_event; item_class->realize = e_reflow_realize; item_class->unrealize = e_reflow_unrealize; - /* item_class->draw = e_reflow_draw;*/ + item_class->draw = e_reflow_draw; + item_class->update = e_reflow_update; + item_class->point = e_reflow_point; } static void @@ -126,6 +130,8 @@ e_reflow_init (EReflow *reflow) reflow->width = 10; reflow->height = 10; reflow->idle = 0; + + reflow->column_drag = FALSE; } static void @@ -214,6 +220,14 @@ e_reflow_unrealize (GnomeCanvasItem *item) (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item); } +static gint +e_reflow_pick_line (EReflow *e_reflow, gint x) +{ + x += 6; + x /= e_reflow->column_width + 16; + return x; +} + static gboolean e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) { @@ -249,8 +263,56 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) } } } + break; + case GDK_BUTTON_PRESS: + { + GdkEventButton *button = (GdkEventButton *) event; + int n_x; + n_x = button->x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) { + e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x); + e_reflow->start_x = button->x; + e_reflow->temp_column_width = e_reflow->column_width; + e_reflow->column_drag = TRUE; + gnome_canvas_item_request_update(item); + return TRUE; + } + } + break; + case GDK_BUTTON_RELEASE: + if (e_reflow->column_drag) { + GdkEventButton *button = (GdkEventButton *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (button->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if ( e_reflow->temp_column_width < 50 ) + e_reflow->temp_column_width = 50; + gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width)); + e_reflow->column_width = e_reflow->temp_column_width; + e_reflow->column_drag = FALSE; + _update_reflow(e_reflow); + gnome_canvas_item_request_update(item); + return TRUE; + } + break; + case GDK_MOTION_NOTIFY: + if (e_reflow->column_drag) { + double old_width = e_reflow->temp_column_width; + GdkEventMotion *motion = (GdkEventMotion *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if (e_reflow->temp_column_width < 50) + e_reflow->temp_column_width = 50; + if (old_width != e_reflow->temp_column_width) + gnome_canvas_item_request_update(item); + return TRUE; + } + break; default: - break; + break; } if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event) @@ -275,7 +337,7 @@ e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item) } } -#if 0 + static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) { @@ -283,17 +345,25 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, gint running_width; EReflow *e_reflow = E_REFLOW(item); int i; + double column_width; if (GNOME_CANVAS_ITEM_CLASS(parent_class)->draw) GNOME_CANVAS_ITEM_CLASS(parent_class)->draw (item, drawable, x, y, width, height); - - running_width = 7 + e_reflow->column_width + 7; + column_width = e_reflow->column_width; + running_width = 7 + column_width + 7; x_rect = running_width; y_rect = 7; width_rect = 2; height_rect = e_reflow->height - 14; - for (i = 0; i < e_reflow->column_count - 1; i++) { + /* Compute first column to draw. */ + i = x; + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; x_rect = running_width; gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style, drawable, @@ -303,13 +373,94 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, GTK_WIDGET(item->canvas), "reflow", x_rect - x, - y_rect - x, + y_rect - y, width_rect, height_rect); - running_width += 2 + 7 + e_reflow->column_width + 7; + running_width += 2 + 7 + column_width + 7; + } + if (e_reflow->column_drag) { + int start_line = e_reflow_pick_line(e_reflow, + gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value); + i = x - start_line * (column_width + 16); + running_width = start_line * (column_width + 16); + column_width = e_reflow->temp_column_width; + running_width -= start_line * (column_width + 16); + i += start_line * (column_width + 16); + running_width += 7 + column_width + 7; + x_rect = running_width; + y_rect = 7; + width_rect = 2; + height_rect = e_reflow->height - 14; + + /* Compute first column to draw. */ + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; + x_rect = running_width; + gdk_draw_rectangle(drawable, + GTK_WIDGET(item->canvas)->style->fg_gc[GTK_STATE_NORMAL], + TRUE, + x_rect - x, + y_rect - y, + width_rect - 1, + height_rect - 1); + running_width += 2 + 7 + column_width + 7; + } + } +} + +static void +e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags) +{ + double x0, x1, y0, y1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update) + GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags); + + x0 = item->x1; + y0 = item->y1; + x1 = item->x2; + y1 = item->y2; + if ( x0 > 0 ) + x0 = 0; + if ( y0 > 0 ) + y0 = 0; + if ( x1 < E_REFLOW(item)->width ) + x1 = E_REFLOW(item)->width; + if ( x1 < E_REFLOW(item)->height ) + x1 = E_REFLOW(item)->height; + + gnome_canvas_update_bbox(item, x0, y0, x1, y1); +} + +static double +e_reflow_point (GnomeCanvasItem *item, + double x, double y, int cx, int cy, + GnomeCanvasItem **actual_item) +{ + EReflow *e_reflow = E_REFLOW(item); + double distance = 1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->point) + distance = GNOME_CANVAS_ITEM_CLASS(parent_class)->point (item, x, y, cx, cy, actual_item); + if (*actual_item) + return 0; + + if (y >= 7 && y <= e_reflow->height - 7) { + int n_x; + n_x = x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if (n_x < 4) { + *actual_item = item; + return 0; + } } + return distance; } -#endif static void _reflow( EReflow *e_reflow ) @@ -380,6 +531,9 @@ _update_reflow( EReflow *e_reflow ) running_height = 7; list = e_reflow->items; + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); @@ -391,6 +545,9 @@ _update_reflow( EReflow *e_reflow ) list = g_list_next(list); for( ; list; list = g_list_next(list)) { + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); diff --git a/widgets/e-reflow.h b/widgets/e-reflow.h index 0d0ab4251a..27b96645f8 100644 --- a/widgets/e-reflow.h +++ b/widgets/e-reflow.h @@ -65,6 +65,12 @@ struct _EReflow double column_width; int idle; + + /* These are all for when the column is being dragged. */ + gboolean column_drag; + gdouble start_x; + gint which_column_dragged; + double temp_column_width; }; struct _EReflowClass diff --git a/widgets/e-reflow/e-reflow.c b/widgets/e-reflow/e-reflow.c index ce2e92e530..e9ff1b6eaa 100644 --- a/widgets/e-reflow/e-reflow.c +++ b/widgets/e-reflow/e-reflow.c @@ -32,6 +32,8 @@ static void e_reflow_realize (GnomeCanvasItem *item); static void e_reflow_unrealize (GnomeCanvasItem *item); static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height); +static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags); +static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item); static void _update_reflow ( EReflow *reflow ); static void _resize( GtkObject *object, gpointer data ); @@ -112,7 +114,9 @@ e_reflow_class_init (EReflowClass *klass) item_class->event = e_reflow_event; item_class->realize = e_reflow_realize; item_class->unrealize = e_reflow_unrealize; - /* item_class->draw = e_reflow_draw;*/ + item_class->draw = e_reflow_draw; + item_class->update = e_reflow_update; + item_class->point = e_reflow_point; } static void @@ -126,6 +130,8 @@ e_reflow_init (EReflow *reflow) reflow->width = 10; reflow->height = 10; reflow->idle = 0; + + reflow->column_drag = FALSE; } static void @@ -214,6 +220,14 @@ e_reflow_unrealize (GnomeCanvasItem *item) (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item); } +static gint +e_reflow_pick_line (EReflow *e_reflow, gint x) +{ + x += 6; + x /= e_reflow->column_width + 16; + return x; +} + static gboolean e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) { @@ -249,8 +263,56 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) } } } + break; + case GDK_BUTTON_PRESS: + { + GdkEventButton *button = (GdkEventButton *) event; + int n_x; + n_x = button->x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) { + e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x); + e_reflow->start_x = button->x; + e_reflow->temp_column_width = e_reflow->column_width; + e_reflow->column_drag = TRUE; + gnome_canvas_item_request_update(item); + return TRUE; + } + } + break; + case GDK_BUTTON_RELEASE: + if (e_reflow->column_drag) { + GdkEventButton *button = (GdkEventButton *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (button->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if ( e_reflow->temp_column_width < 50 ) + e_reflow->temp_column_width = 50; + gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width)); + e_reflow->column_width = e_reflow->temp_column_width; + e_reflow->column_drag = FALSE; + _update_reflow(e_reflow); + gnome_canvas_item_request_update(item); + return TRUE; + } + break; + case GDK_MOTION_NOTIFY: + if (e_reflow->column_drag) { + double old_width = e_reflow->temp_column_width; + GdkEventMotion *motion = (GdkEventMotion *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if (e_reflow->temp_column_width < 50) + e_reflow->temp_column_width = 50; + if (old_width != e_reflow->temp_column_width) + gnome_canvas_item_request_update(item); + return TRUE; + } + break; default: - break; + break; } if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event) @@ -275,7 +337,7 @@ e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item) } } -#if 0 + static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) { @@ -283,17 +345,25 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, gint running_width; EReflow *e_reflow = E_REFLOW(item); int i; + double column_width; if (GNOME_CANVAS_ITEM_CLASS(parent_class)->draw) GNOME_CANVAS_ITEM_CLASS(parent_class)->draw (item, drawable, x, y, width, height); - - running_width = 7 + e_reflow->column_width + 7; + column_width = e_reflow->column_width; + running_width = 7 + column_width + 7; x_rect = running_width; y_rect = 7; width_rect = 2; height_rect = e_reflow->height - 14; - for (i = 0; i < e_reflow->column_count - 1; i++) { + /* Compute first column to draw. */ + i = x; + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; x_rect = running_width; gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style, drawable, @@ -303,13 +373,94 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, GTK_WIDGET(item->canvas), "reflow", x_rect - x, - y_rect - x, + y_rect - y, width_rect, height_rect); - running_width += 2 + 7 + e_reflow->column_width + 7; + running_width += 2 + 7 + column_width + 7; + } + if (e_reflow->column_drag) { + int start_line = e_reflow_pick_line(e_reflow, + gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value); + i = x - start_line * (column_width + 16); + running_width = start_line * (column_width + 16); + column_width = e_reflow->temp_column_width; + running_width -= start_line * (column_width + 16); + i += start_line * (column_width + 16); + running_width += 7 + column_width + 7; + x_rect = running_width; + y_rect = 7; + width_rect = 2; + height_rect = e_reflow->height - 14; + + /* Compute first column to draw. */ + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; + x_rect = running_width; + gdk_draw_rectangle(drawable, + GTK_WIDGET(item->canvas)->style->fg_gc[GTK_STATE_NORMAL], + TRUE, + x_rect - x, + y_rect - y, + width_rect - 1, + height_rect - 1); + running_width += 2 + 7 + column_width + 7; + } + } +} + +static void +e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags) +{ + double x0, x1, y0, y1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update) + GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags); + + x0 = item->x1; + y0 = item->y1; + x1 = item->x2; + y1 = item->y2; + if ( x0 > 0 ) + x0 = 0; + if ( y0 > 0 ) + y0 = 0; + if ( x1 < E_REFLOW(item)->width ) + x1 = E_REFLOW(item)->width; + if ( x1 < E_REFLOW(item)->height ) + x1 = E_REFLOW(item)->height; + + gnome_canvas_update_bbox(item, x0, y0, x1, y1); +} + +static double +e_reflow_point (GnomeCanvasItem *item, + double x, double y, int cx, int cy, + GnomeCanvasItem **actual_item) +{ + EReflow *e_reflow = E_REFLOW(item); + double distance = 1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->point) + distance = GNOME_CANVAS_ITEM_CLASS(parent_class)->point (item, x, y, cx, cy, actual_item); + if (*actual_item) + return 0; + + if (y >= 7 && y <= e_reflow->height - 7) { + int n_x; + n_x = x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if (n_x < 4) { + *actual_item = item; + return 0; + } } + return distance; } -#endif static void _reflow( EReflow *e_reflow ) @@ -380,6 +531,9 @@ _update_reflow( EReflow *e_reflow ) running_height = 7; list = e_reflow->items; + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); @@ -391,6 +545,9 @@ _update_reflow( EReflow *e_reflow ) list = g_list_next(list); for( ; list; list = g_list_next(list)) { + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); diff --git a/widgets/e-reflow/e-reflow.h b/widgets/e-reflow/e-reflow.h index 0d0ab4251a..27b96645f8 100644 --- a/widgets/e-reflow/e-reflow.h +++ b/widgets/e-reflow/e-reflow.h @@ -65,6 +65,12 @@ struct _EReflow double column_width; int idle; + + /* These are all for when the column is being dragged. */ + gboolean column_drag; + gdouble start_x; + gint which_column_dragged; + double temp_column_width; }; struct _EReflowClass diff --git a/widgets/e-text-event-processor-types.h b/widgets/e-text-event-processor-types.h index 3795058225..eb8e0d4a50 100644 --- a/widgets/e-text-event-processor-types.h +++ b/widgets/e-text-event-processor-types.h @@ -75,8 +75,8 @@ enum _ETextEventProcessorCommandAction { E_TEP_MOVE, E_TEP_SELECT, E_TEP_DELETE, - E_TEP_INSERT, + E_TEP_COPY, E_TEP_PASTE, E_TEP_GET_SELECTION, diff --git a/widgets/e-text/e-text-event-processor-types.h b/widgets/e-text/e-text-event-processor-types.h index 3795058225..eb8e0d4a50 100644 --- a/widgets/e-text/e-text-event-processor-types.h +++ b/widgets/e-text/e-text-event-processor-types.h @@ -75,8 +75,8 @@ enum _ETextEventProcessorCommandAction { E_TEP_MOVE, E_TEP_SELECT, E_TEP_DELETE, - E_TEP_INSERT, + E_TEP_COPY, E_TEP_PASTE, E_TEP_GET_SELECTION, diff --git a/widgets/misc/e-reflow.c b/widgets/misc/e-reflow.c index ce2e92e530..e9ff1b6eaa 100644 --- a/widgets/misc/e-reflow.c +++ b/widgets/misc/e-reflow.c @@ -32,6 +32,8 @@ static void e_reflow_realize (GnomeCanvasItem *item); static void e_reflow_unrealize (GnomeCanvasItem *item); static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height); +static void e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags); +static double e_reflow_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item); static void _update_reflow ( EReflow *reflow ); static void _resize( GtkObject *object, gpointer data ); @@ -112,7 +114,9 @@ e_reflow_class_init (EReflowClass *klass) item_class->event = e_reflow_event; item_class->realize = e_reflow_realize; item_class->unrealize = e_reflow_unrealize; - /* item_class->draw = e_reflow_draw;*/ + item_class->draw = e_reflow_draw; + item_class->update = e_reflow_update; + item_class->point = e_reflow_point; } static void @@ -126,6 +130,8 @@ e_reflow_init (EReflow *reflow) reflow->width = 10; reflow->height = 10; reflow->idle = 0; + + reflow->column_drag = FALSE; } static void @@ -214,6 +220,14 @@ e_reflow_unrealize (GnomeCanvasItem *item) (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item); } +static gint +e_reflow_pick_line (EReflow *e_reflow, gint x) +{ + x += 6; + x /= e_reflow->column_width + 16; + return x; +} + static gboolean e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) { @@ -249,8 +263,56 @@ e_reflow_event (GnomeCanvasItem *item, GdkEvent *event) } } } + break; + case GDK_BUTTON_PRESS: + { + GdkEventButton *button = (GdkEventButton *) event; + int n_x; + n_x = button->x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if ( button->y >= 7 && button->y <= e_reflow->height - 7 && n_x < 4 ) { + e_reflow->which_column_dragged = e_reflow_pick_line(e_reflow, button->x); + e_reflow->start_x = button->x; + e_reflow->temp_column_width = e_reflow->column_width; + e_reflow->column_drag = TRUE; + gnome_canvas_item_request_update(item); + return TRUE; + } + } + break; + case GDK_BUTTON_RELEASE: + if (e_reflow->column_drag) { + GdkEventButton *button = (GdkEventButton *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (button->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if ( e_reflow->temp_column_width < 50 ) + e_reflow->temp_column_width = 50; + gtk_adjustment_set_value(adjustment, adjustment->value + e_reflow_pick_line(e_reflow, adjustment->value) * (e_reflow->temp_column_width - e_reflow->column_width)); + e_reflow->column_width = e_reflow->temp_column_width; + e_reflow->column_drag = FALSE; + _update_reflow(e_reflow); + gnome_canvas_item_request_update(item); + return TRUE; + } + break; + case GDK_MOTION_NOTIFY: + if (e_reflow->column_drag) { + double old_width = e_reflow->temp_column_width; + GdkEventMotion *motion = (GdkEventMotion *) event; + GtkAdjustment *adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas)); + e_reflow->temp_column_width = e_reflow->column_width + + (motion->x - e_reflow->start_x)/(e_reflow->which_column_dragged - e_reflow_pick_line(e_reflow, adjustment->value)); + if (e_reflow->temp_column_width < 50) + e_reflow->temp_column_width = 50; + if (old_width != e_reflow->temp_column_width) + gnome_canvas_item_request_update(item); + return TRUE; + } + break; default: - break; + break; } if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event) @@ -275,7 +337,7 @@ e_reflow_add_item(EReflow *e_reflow, GnomeCanvasItem *item) } } -#if 0 + static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) { @@ -283,17 +345,25 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, gint running_width; EReflow *e_reflow = E_REFLOW(item); int i; + double column_width; if (GNOME_CANVAS_ITEM_CLASS(parent_class)->draw) GNOME_CANVAS_ITEM_CLASS(parent_class)->draw (item, drawable, x, y, width, height); - - running_width = 7 + e_reflow->column_width + 7; + column_width = e_reflow->column_width; + running_width = 7 + column_width + 7; x_rect = running_width; y_rect = 7; width_rect = 2; height_rect = e_reflow->height - 14; - for (i = 0; i < e_reflow->column_count - 1; i++) { + /* Compute first column to draw. */ + i = x; + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; x_rect = running_width; gtk_paint_flat_box(GTK_WIDGET(item->canvas)->style, drawable, @@ -303,13 +373,94 @@ static void e_reflow_draw (GnomeCanvasItem *item, GdkDrawable *drawable, GTK_WIDGET(item->canvas), "reflow", x_rect - x, - y_rect - x, + y_rect - y, width_rect, height_rect); - running_width += 2 + 7 + e_reflow->column_width + 7; + running_width += 2 + 7 + column_width + 7; + } + if (e_reflow->column_drag) { + int start_line = e_reflow_pick_line(e_reflow, + gtk_layout_get_hadjustment(GTK_LAYOUT(item->canvas))->value); + i = x - start_line * (column_width + 16); + running_width = start_line * (column_width + 16); + column_width = e_reflow->temp_column_width; + running_width -= start_line * (column_width + 16); + i += start_line * (column_width + 16); + running_width += 7 + column_width + 7; + x_rect = running_width; + y_rect = 7; + width_rect = 2; + height_rect = e_reflow->height - 14; + + /* Compute first column to draw. */ + i /= column_width + 16; + running_width += i * (column_width + 16); + + for ( ; i < e_reflow->column_count - 1; i++) { + if ( running_width > x + width ) + break; + x_rect = running_width; + gdk_draw_rectangle(drawable, + GTK_WIDGET(item->canvas)->style->fg_gc[GTK_STATE_NORMAL], + TRUE, + x_rect - x, + y_rect - y, + width_rect - 1, + height_rect - 1); + running_width += 2 + 7 + column_width + 7; + } + } +} + +static void +e_reflow_update (GnomeCanvasItem *item, double affine[6], ArtSVP *clip_path, gint flags) +{ + double x0, x1, y0, y1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->update) + GNOME_CANVAS_ITEM_CLASS(parent_class)->update (item, affine, clip_path, flags); + + x0 = item->x1; + y0 = item->y1; + x1 = item->x2; + y1 = item->y2; + if ( x0 > 0 ) + x0 = 0; + if ( y0 > 0 ) + y0 = 0; + if ( x1 < E_REFLOW(item)->width ) + x1 = E_REFLOW(item)->width; + if ( x1 < E_REFLOW(item)->height ) + x1 = E_REFLOW(item)->height; + + gnome_canvas_update_bbox(item, x0, y0, x1, y1); +} + +static double +e_reflow_point (GnomeCanvasItem *item, + double x, double y, int cx, int cy, + GnomeCanvasItem **actual_item) +{ + EReflow *e_reflow = E_REFLOW(item); + double distance = 1; + + if (GNOME_CANVAS_ITEM_CLASS(parent_class)->point) + distance = GNOME_CANVAS_ITEM_CLASS(parent_class)->point (item, x, y, cx, cy, actual_item); + if (*actual_item) + return 0; + + if (y >= 7 && y <= e_reflow->height - 7) { + int n_x; + n_x = x; + n_x += 3; + n_x %= (int)(e_reflow->column_width + 16); + if (n_x < 4) { + *actual_item = item; + return 0; + } } + return distance; } -#endif static void _reflow( EReflow *e_reflow ) @@ -380,6 +531,9 @@ _update_reflow( EReflow *e_reflow ) running_height = 7; list = e_reflow->items; + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); @@ -391,6 +545,9 @@ _update_reflow( EReflow *e_reflow ) list = g_list_next(list); for( ; list; list = g_list_next(list)) { + gtk_object_set (GTK_OBJECT(list->data), + "width", e_reflow->column_width, + NULL); gtk_object_get (GTK_OBJECT(list->data), "height", &item_height, NULL); diff --git a/widgets/misc/e-reflow.h b/widgets/misc/e-reflow.h index 0d0ab4251a..27b96645f8 100644 --- a/widgets/misc/e-reflow.h +++ b/widgets/misc/e-reflow.h @@ -65,6 +65,12 @@ struct _EReflow double column_width; int idle; + + /* These are all for when the column is being dragged. */ + gboolean column_drag; + gdouble start_x; + gint which_column_dragged; + double temp_column_width; }; struct _EReflowClass diff --git a/widgets/test-reflow.c b/widgets/test-reflow.c index f03232c72d..067e520754 100644 --- a/widgets/test-reflow.c +++ b/widgets/test-reflow.c @@ -26,6 +26,7 @@ /* This is a horrible thing to do, but it is just a test. */ GnomeCanvasItem *reflow; GnomeCanvasItem *rect; +GtkAllocation last_alloc; static void destroy_callback(GtkWidget *app, gpointer data) { @@ -35,6 +36,7 @@ static void destroy_callback(GtkWidget *app, gpointer data) static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) { double width; + last_alloc = *allocation; gnome_canvas_item_set( reflow, "height", (double) allocation->height, NULL ); @@ -49,6 +51,20 @@ static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpoi NULL ); } +static void resize(GnomeCanvasItem *item, gpointer data) +{ + double width; + gtk_object_get(GTK_OBJECT(reflow), + "width", &width, + NULL); + width = MAX(width, last_alloc.width); + gnome_canvas_set_scroll_region(item->canvas , 0, 0, width, last_alloc.height ); + gnome_canvas_item_set( rect, + "x2", (double) width, + "y2", (double) last_alloc.height, + NULL ); +} + static void about_callback( GtkWidget *widget, gpointer data ) { @@ -98,6 +114,9 @@ int main( int argc, char *argv[] ) "y", (double) 0, "height", (double) 100, NULL ); + gtk_signal_connect( GTK_OBJECT( reflow ), "resize", + GTK_SIGNAL_FUNC( resize ), + ( gpointer ) app); for ( i = 0; i < 200; i++ ) { GnomeCanvasItem *item; diff --git a/widgets/text/e-text-event-processor-types.h b/widgets/text/e-text-event-processor-types.h index 3795058225..eb8e0d4a50 100644 --- a/widgets/text/e-text-event-processor-types.h +++ b/widgets/text/e-text-event-processor-types.h @@ -75,8 +75,8 @@ enum _ETextEventProcessorCommandAction { E_TEP_MOVE, E_TEP_SELECT, E_TEP_DELETE, - E_TEP_INSERT, + E_TEP_COPY, E_TEP_PASTE, E_TEP_GET_SELECTION, |