Bug #707121 - Merge contacts dialogs indefinitely expands by itself

This commit is contained in:
Milan Crha
2014-01-24 14:13:09 +01:00
parent 51cafd4067
commit 90f956ad4a
5 changed files with 196 additions and 463 deletions

View File

@ -87,13 +87,8 @@ dist-hook:
etspec_DATA= e-addressbook-view.etspec
ui_DATA = \
eab-contact-duplicate-detected.ui \
eab-contact-commit-duplicate-detected.ui
EXTRA_DIST = \
$(etspec_DATA) \
$(rule_DATA) \
$(ui_DATA)
$(rule_DATA)
-include $(top_srcdir)/git.mk

View File

@ -1,185 +0,0 @@
<?xml version="1.0"?>
<!--*- mode: xml -*-->
<interface>
<object class="GtkDialog" id="dialog-duplicate-contact">
<property name="border_width">6</property>
<property name="visible">True</property>
<property name="title" translatable="yes">Duplicate Contact Detected</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
<property name="modal">False</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">6</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<object class="GtkButton" id="button3">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-cancel</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
</object>
</child>
<child>
<object class="GtkButton" id="button4">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-save</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
</object>
</child>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
<child>
<object class="GtkTable" id="table1">
<property name="border_width">6</property>
<property name="visible">True</property>
<property name="n_rows">5</property>
<property name="n_columns">2</property>
<property name="homogeneous">False</property>
<property name="row_spacing">6</property>
<property name="column_spacing">6</property>
<child>
<object class="EABContactDisplay" type-func="eab_contact_display_get_type" id="custom-old-contact">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">The name or email of this contact already exists in this folder. Would you like to save the changes anyway?</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options">fill</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="label" translatable="yes" comments="Translators: Heading of the contact which has same name or email address in this folder already.">Conflicting Contact:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_CENTER</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="y_options">fill</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">Changed Contact:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_CENTER</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="EABContactDisplay" type-func="eab_contact_display_get_type" id="custom-new-contact">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0</property>
<property name="xscale">1</property>
<property name="yscale">0</property>
<child>
<object class="GtkImage" id="custom2">
<property name="visible">True</property>
<property name="icon-name">avatar-default</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">5</property>
<property name="x_options">fill</property>
<property name="y_options">fill</property>
</packing>
</child>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="1">button3</action-widget>
<action-widget response="0">button4</action-widget>
</action-widgets>
</object>
</interface>

View File

@ -1,219 +0,0 @@
<?xml version="1.0"?>
<!--*- mode: xml -*-->
<interface>
<object class="GtkDialog" id="dialog-duplicate-contact">
<property name="visible">True</property>
<property name="title" translatable="yes">Duplicate Contact Detected</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="height-request">400</property>
<property name="width-request">500</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<object class="GtkButton" id="button4">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-cancel</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
</object>
</child>
<child>
<object class="GtkButton" id="button3">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-add</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
</object>
</child>
<child>
<object class="GtkButton" id="button5">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Merge</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
</object>
</child>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<object class="GtkViewport" id="viewport1">
<child>
<object class="GtkTable" id="table1">
<property name="border_width">12</property>
<property name="visible">True</property>
<property name="n_rows">5</property>
<property name="n_columns">2</property>
<property name="homogeneous">False</property>
<property name="row_spacing">6</property>
<property name="column_spacing">12</property>
<child>
<object class="EABContactDisplay" type-func="eab_contact_display_get_type" id="custom-old-contact">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">The name or email address of this contact already exists
in this folder. Would you like to add it anyway?</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options">fill</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="label" translatable="yes">Original Contact:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_CENTER</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="y_options">fill</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">New Contact:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_CENTER</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"/>
</packing>
</child>
<child>
<object class="EABContactDisplay" type-func="eab_contact_display_get_type" id="custom-new-contact">
<property name="visible">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0</property>
<property name="xscale">1</property>
<property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child>
<object class="GtkImage" id="custom2">
<property name="visible">True</property>
<property name="icon-name">avatar-default</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">5</property>
<property name="x_options">fill</property>
<property name="y_options">fill</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<action-widgets>
<action-widget response="1">button4</action-widget>
<action-widget response="0">button3</action-widget>
<action-widget response="2">button5</action-widget>
</action-widgets>
</object>
</interface>

View File

@ -597,28 +597,210 @@ check_if_same (EContact *contact,
return res;
}
static GtkWidget *
create_iconic_button (const gchar *label,
const gchar *icon_name)
{
GtkWidget *button, *image;
button = gtk_button_new_with_mnemonic (label);
if (icon_name) {
image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
gtk_button_set_image (GTK_BUTTON (button), image);
}
return button;
}
static GtkWidget *
create_duplicate_contact_detected_dialog (EContact *old_contact,
EContact *new_contact,
gboolean disable_merge,
gboolean is_for_commit)
{
GtkWidget *widget, *scrolled;
GtkContainer *container;
GtkDialog *dialog;
const gchar *text;
widget = gtk_dialog_new ();
dialog = GTK_DIALOG (widget);
g_object_set (G_OBJECT (dialog),
"title", _("Duplicate Contact Detected"),
"default-width", 500,
"default-height", 400,
NULL);
gtk_dialog_add_action_widget (dialog, create_iconic_button (_("_Cancel"), GTK_STOCK_CANCEL), GTK_RESPONSE_CANCEL);
if (is_for_commit) {
gtk_dialog_add_action_widget (dialog, create_iconic_button (_("_Save"), "document-save"), GTK_RESPONSE_OK);
} else {
gtk_dialog_add_action_widget (dialog, create_iconic_button (_("_Add"), "list-add"), GTK_RESPONSE_OK);
gtk_dialog_add_action_widget (dialog, create_iconic_button (_("_Merge"), NULL), GTK_RESPONSE_APPLY);
}
if (disable_merge)
gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_APPLY, FALSE);
container = GTK_CONTAINER (gtk_dialog_get_content_area (dialog));
widget = gtk_grid_new ();
g_object_set (G_OBJECT (widget),
"orientation", GTK_ORIENTATION_HORIZONTAL,
"hexpand", TRUE,
"halign", GTK_ALIGN_FILL,
"vexpand", TRUE,
"valign", GTK_ALIGN_FILL,
"margin", 12,
NULL);
gtk_container_add (container, widget);
container = GTK_CONTAINER (widget);
widget = gtk_image_new_from_icon_name ("avatar-default", GTK_ICON_SIZE_BUTTON);
g_object_set (G_OBJECT (widget),
"hexpand", FALSE,
"halign", GTK_ALIGN_START,
"vexpand", FALSE,
"valign", GTK_ALIGN_START,
"margin-right", 12,
NULL);
gtk_container_add (container, widget);
widget = gtk_grid_new ();
g_object_set (G_OBJECT (widget),
"orientation", GTK_ORIENTATION_VERTICAL,
"hexpand", TRUE,
"halign", GTK_ALIGN_FILL,
"vexpand", TRUE,
"valign", GTK_ALIGN_FILL,
NULL);
gtk_container_add (container, widget);
container = GTK_CONTAINER (widget);
if (is_for_commit)
text = _("The name or email address of this contact already exists\n"
"in this folder. Would you like to save the changes anyway?");
else
text = _("The name or email address of this contact already exists\n"
"in this folder. Would you like to add it anyway?");
widget = gtk_label_new (text);
g_object_set (G_OBJECT (widget),
"hexpand", FALSE,
"halign", GTK_ALIGN_START,
"vexpand", FALSE,
"valign", GTK_ALIGN_START,
"margin-bottom", 6,
NULL);
gtk_container_add (container, widget);
if (is_for_commit)
text = _("Changed Contact:");
else
text = _("New Contact:");
widget = gtk_label_new (text);
g_object_set (G_OBJECT (widget),
"hexpand", FALSE,
"halign", GTK_ALIGN_START,
"vexpand", FALSE,
"valign", GTK_ALIGN_START,
"margin-bottom", 6,
NULL);
gtk_container_add (container, widget);
scrolled = gtk_scrolled_window_new (NULL, NULL);
g_object_set (G_OBJECT (scrolled),
"hexpand", TRUE,
"halign", GTK_ALIGN_FILL,
"hscrollbar-policy", GTK_POLICY_AUTOMATIC,
"vexpand", TRUE,
"valign", GTK_ALIGN_FILL,
"vscrollbar-policy", GTK_POLICY_AUTOMATIC,
"margin-bottom", 6,
NULL);
gtk_container_add (container, scrolled);
widget = eab_contact_display_new ();
g_object_set (G_OBJECT (widget),
"hexpand", TRUE,
"halign", GTK_ALIGN_FILL,
"vexpand", TRUE,
"valign", GTK_ALIGN_FILL,
"contact", new_contact,
"mode", EAB_CONTACT_DISPLAY_RENDER_COMPACT,
NULL);
gtk_container_add (GTK_CONTAINER (scrolled), widget);
if (is_for_commit)
text = _("Conflicting Contact:");
else
text = _("Old Contact:");
widget = gtk_label_new (text);
g_object_set (G_OBJECT (widget),
"hexpand", FALSE,
"halign", GTK_ALIGN_START,
"vexpand", FALSE,
"valign", GTK_ALIGN_START,
"margin-bottom", 6,
NULL);
gtk_container_add (container, widget);
scrolled = gtk_scrolled_window_new (NULL, NULL);
g_object_set (G_OBJECT (scrolled),
"hexpand", TRUE,
"halign", GTK_ALIGN_FILL,
"hscrollbar-policy", GTK_POLICY_AUTOMATIC,
"vexpand", TRUE,
"valign", GTK_ALIGN_FILL,
"vscrollbar-policy", GTK_POLICY_AUTOMATIC,
NULL);
gtk_container_add (container, scrolled);
widget = eab_contact_display_new ();
g_object_set (G_OBJECT (widget),
"hexpand", TRUE,
"halign", GTK_ALIGN_FILL,
"vexpand", TRUE,
"valign", GTK_ALIGN_FILL,
"contact", old_contact,
"mode", EAB_CONTACT_DISPLAY_RENDER_COMPACT,
NULL);
gtk_container_add (GTK_CONTAINER (scrolled), widget);
gtk_widget_show_all (gtk_dialog_get_content_area (dialog));
return GTK_WIDGET (dialog);
}
static void
response (GtkWidget *dialog,
gint response,
EContactMergingLookup *lookup)
{
static gint merge_response;
switch (response) {
case 0:
case GTK_RESPONSE_OK:
doit (lookup, FALSE);
break;
case 1:
case GTK_RESPONSE_CANCEL:
cancelit (lookup);
break;
case 2:
merge_response = mergeit (lookup);
if (merge_response)
case GTK_RESPONSE_APPLY:
if (mergeit (lookup))
break;
return;
case GTK_RESPONSE_DELETE_EVENT:
cancelit (lookup);
break;
default:
g_warn_if_reached ();
break;
}
gtk_widget_destroy (dialog);
@ -631,7 +813,7 @@ match_query_callback (EContact *contact,
gpointer closure)
{
EContactMergingLookup *lookup = closure;
gint flag;
gboolean flag;
gboolean same_uids;
if (lookup->op == E_CONTACT_MERGING_FIND) {
@ -656,63 +838,25 @@ match_query_callback (EContact *contact,
if ((gint) type <= (gint) EAB_CONTACT_MATCH_VAGUE || same_uids) {
doit (lookup, same_uids);
} else {
GtkBuilder *builder;
GtkWidget *container;
GtkWidget *merge_button;
GtkWidget *widget;
builder = gtk_builder_new ();
GtkWidget *dialog;
lookup->match = g_object_ref (match);
if (lookup->op == E_CONTACT_MERGING_ADD) {
/* Compares all the values of contacts and return true, if they match */
flag = check_if_same (contact, match);
e_load_ui_builder_definition (
builder, "eab-contact-duplicate-detected.ui");
merge_button = e_builder_get_widget (builder, "button5");
/* Merge Button not sensitive when all values are same */
if (flag)
gtk_widget_set_sensitive (GTK_WIDGET (merge_button), FALSE);
dialog = create_duplicate_contact_detected_dialog (match, contact, flag, FALSE);
} else if (lookup->op == E_CONTACT_MERGING_COMMIT) {
e_load_ui_builder_definition (
builder, "eab-contact-commit-duplicate-detected.ui");
dialog = create_duplicate_contact_detected_dialog (match, contact, FALSE, TRUE);
} else {
doit (lookup, FALSE);
g_object_unref (builder);
return;
}
widget = e_builder_get_widget (builder, "custom-old-contact");
eab_contact_display_set_mode (
EAB_CONTACT_DISPLAY (widget),
EAB_CONTACT_DISPLAY_RENDER_COMPACT);
eab_contact_display_set_contact (
EAB_CONTACT_DISPLAY (widget), match);
widget = e_builder_get_widget (builder, "custom-new-contact");
eab_contact_display_set_mode (
EAB_CONTACT_DISPLAY (widget),
EAB_CONTACT_DISPLAY_RENDER_COMPACT);
eab_contact_display_set_contact (
EAB_CONTACT_DISPLAY (widget), contact);
widget = e_builder_get_widget (builder, "dialog-duplicate-contact");
gtk_widget_ensure_style (widget);
container = gtk_dialog_get_action_area (GTK_DIALOG (widget));
gtk_container_set_border_width (GTK_CONTAINER (container), 12);
container = gtk_dialog_get_content_area (GTK_DIALOG (widget));
gtk_container_set_border_width (GTK_CONTAINER (container), 0);
g_signal_connect (
widget, "response",
dialog, "response",
G_CALLBACK (response), lookup);
gtk_widget_show_all (widget);
g_object_unref (builder);
gtk_widget_show_all (dialog);
}
}

View File

@ -9,8 +9,6 @@ addressbook/gui/contact-editor/e-contact-quick-add.c
[type: gettext/glade]addressbook/gui/contact-editor/fullname.ui
[type: gettext/glade]addressbook/gui/contact-list-editor/contact-list-editor.ui
addressbook/gui/contact-list-editor/e-contact-list-editor.c
[type: gettext/glade]addressbook/gui/widgets/eab-contact-commit-duplicate-detected.ui
[type: gettext/glade]addressbook/gui/widgets/eab-contact-duplicate-detected.ui
addressbook/gui/widgets/eab-contact-merging.c
addressbook/gui/widgets/addresstypes.xml
addressbook/gui/widgets/e-addressbook-model.c