diff --git a/gnucash/gnome/dialog-invoice.c b/gnucash/gnome/dialog-invoice.c
index 0e3bf45ee7..903310aedc 100644
--- a/gnucash/gnome/dialog-invoice.c
+++ b/gnucash/gnome/dialog-invoice.c
@@ -73,7 +73,10 @@
#include "gnc-main-window.h"
#include "gnc-state.h"
+#include "dialog-assoc.h"
+#include "dialog-assoc-utils.h"
#include "dialog-transfer.h"
+#include "gnc-uri-utils.h"
/* Disable -Waddress. GCC 4.2 warns (and fails to compile with -Werror) when
* passing the address of a guid on the stack to QOF_BOOK_LOOKUP_ENTITY via
@@ -166,6 +169,8 @@ struct _invoice_window
GtkWidget * active_check;
GtkWidget * paid_label;
+ GtkWidget * assoc_link_button;
+
GtkWidget * owner_box;
GtkWidget * owner_label;
GtkWidget * owner_choice;
@@ -229,12 +234,12 @@ static GtkWidget *
iw_get_window (InvoiceWindow *iw)
{
if (iw->page)
- return gnc_plugin_page_get_window(iw->page);
+ return gnc_plugin_page_get_window (iw->page);
return iw->dialog;
}
GtkWidget *
-gnc_invoice_get_register(InvoiceWindow *iw)
+gnc_invoice_get_register (InvoiceWindow *iw)
{
if (iw)
return (GtkWidget *)iw->reg;
@@ -242,7 +247,7 @@ gnc_invoice_get_register(InvoiceWindow *iw)
}
GtkWidget *
-gnc_invoice_get_notes(InvoiceWindow *iw)
+gnc_invoice_get_notes (InvoiceWindow *iw)
{
if (iw)
return (GtkWidget *)iw->notes_text;
@@ -313,6 +318,24 @@ iw_get_invoice (InvoiceWindow *iw)
return gncInvoiceLookup (iw->book, &iw->invoice_guid);
}
+GncInvoice *
+gnc_invoice_window_get_invoice (InvoiceWindow *iw)
+{
+ if (!iw)
+ return NULL;
+
+ return iw_get_invoice (iw);
+}
+
+GtkWidget *
+gnc_invoice_window_get_assoc_link_button (InvoiceWindow *iw)
+{
+ if (!iw)
+ return NULL;
+
+ return iw->assoc_link_button;
+}
+
static void
set_gncEntry_switch_type (gpointer data, gpointer user_data)
{
@@ -2371,6 +2394,15 @@ gnc_invoice_save_page (InvoiceWindow *iw,
gnc_table_save_state (table, group_name);
}
+static gboolean
+assoc_link_button_cb (GtkLinkButton *button, InvoiceWindow *iw)
+{
+ GncInvoice *invoice = gncInvoiceLookup (iw->book, &iw->invoice_guid);
+ gnc_assoc_open_uri (GTK_WINDOW(iw->dialog), gncInvoiceGetAssociation (invoice));
+
+ return TRUE;
+}
+
GtkWidget *
gnc_invoice_create_page (InvoiceWindow *iw, gpointer page)
{
@@ -2383,6 +2415,7 @@ gnc_invoice_create_page (InvoiceWindow *iw, gpointer page)
const gchar *prefs_group = NULL;
gboolean is_credit_note = FALSE;
const gchar *style_label = NULL;
+ const gchar *assoc_uri;
invoice = gncInvoiceLookup (iw->book, &iw->invoice_guid);
is_credit_note = gncInvoiceGetIsCreditNote (invoice);
@@ -2413,6 +2446,23 @@ gnc_invoice_create_page (InvoiceWindow *iw, gpointer page)
iw->job_box = GTK_WIDGET (gtk_builder_get_object (builder, "page_job_hbox"));
iw->paid_label = GTK_WIDGET (gtk_builder_get_object (builder, "paid_label"));
+ iw->assoc_link_button = GTK_WIDGET(gtk_builder_get_object (builder, "assoc_link_button"));
+ g_signal_connect (G_OBJECT(iw->assoc_link_button), "activate-link",
+ G_CALLBACK(assoc_link_button_cb), iw);
+
+ /* invoice association */
+ assoc_uri = gncInvoiceGetAssociation (invoice);
+ if (assoc_uri)
+ {
+ gchar *display_uri = gnc_assoc_get_unescaped_just_uri (assoc_uri);
+ gtk_button_set_label (GTK_BUTTON(iw->assoc_link_button), _("Open Association:"));
+ gtk_link_button_set_uri (GTK_LINK_BUTTON(iw->assoc_link_button), display_uri);
+ gtk_widget_show (GTK_WIDGET (iw->assoc_link_button));
+ g_free (display_uri);
+ }
+ else
+ gtk_widget_hide (GTK_WIDGET (iw->assoc_link_button));
+
// Add a style context for this label so it can be easily manipulated with css
gnc_widget_style_context_add_class (GTK_WIDGET(iw->paid_label), "gnc-class-highlight");
diff --git a/gnucash/gnome/dialog-invoice.h b/gnucash/gnome/dialog-invoice.h
index 073268d403..392b5abebc 100644
--- a/gnucash/gnome/dialog-invoice.h
+++ b/gnucash/gnome/dialog-invoice.h
@@ -77,6 +77,10 @@ gchar *gnc_invoice_get_help (InvoiceWindow *iw);
gchar *gnc_invoice_get_title (InvoiceWindow *iw);
+GncInvoice * gnc_invoice_window_get_invoice (InvoiceWindow *iw);
+
+GtkWidget * gnc_invoice_window_get_assoc_link_button (InvoiceWindow *iw);
+
GncInvoiceType gnc_invoice_get_type_from_window(InvoiceWindow *iw);
#ifdef __GNC_PLUGIN_PAGE_H
diff --git a/gnucash/gnome/gnc-plugin-page-invoice.c b/gnucash/gnome/gnc-plugin-page-invoice.c
index fb74f75a2e..bb8c12e0ea 100644
--- a/gnucash/gnome/gnc-plugin-page-invoice.c
+++ b/gnucash/gnome/gnc-plugin-page-invoice.c
@@ -40,8 +40,11 @@
#include "gnucash-register.h"
#include "gnc-prefs.h"
#include "gnc-ui-util.h"
+#include "gnc-uri-utils.h"
#include "gnc-window.h"
#include "dialog-utils.h"
+#include "dialog-assoc.h"
+#include "dialog-assoc-utils.h"
#include "gncInvoice.h"
/* This static indicates the debugging module that this .o belongs to. */
@@ -85,6 +88,9 @@ static void gnc_plugin_page_invoice_cmd_duplicateEntry (GtkAction *action, GncPl
static void gnc_plugin_page_invoice_cmd_pay_invoice (GtkAction *action, GncPluginPageInvoice *plugin_page);
static void gnc_plugin_page_invoice_cmd_save_layout (GtkAction *action, GncPluginPageInvoice *plugin_page);
static void gnc_plugin_page_invoice_cmd_reset_layout (GtkAction *action, GncPluginPageInvoice *plugin_page);
+static void gnc_plugin_page_invoice_cmd_associate (GtkAction *action, GncPluginPageInvoice *plugin_page);
+static void gnc_plugin_page_invoice_cmd_associate_remove (GtkAction *action, GncPluginPageInvoice *plugin_page);
+static void gnc_plugin_page_invoice_cmd_associate_open (GtkAction *action, GncPluginPageInvoice *plugin_page);
static void gnc_plugin_page_invoice_cmd_company_report (GtkAction *action, GncPluginPageInvoice *plugin_page);
static void gnc_plugin_page_redraw_help_cb( GnucashRegister *gsr, GncPluginPageInvoice *invoice_page );
@@ -201,6 +207,21 @@ static GtkActionEntry gnc_plugin_page_invoice_actions [] =
"Create a new invoice for the same owner as the current one",
G_CALLBACK (gnc_plugin_page_invoice_cmd_new_invoice)
},
+ {
+ "BusinessAssociationAction", NULL, "_Update Association for Invoice", NULL,
+ "Update Association for current Invoice",
+ G_CALLBACK (gnc_plugin_page_invoice_cmd_associate)
+ },
+ {
+ "BusinessAssociationOpenAction", NULL, "_Open Association for Invoice", NULL,
+ "Open Association for current Invoice",
+ G_CALLBACK (gnc_plugin_page_invoice_cmd_associate_open)
+ },
+ {
+ "BusinessAssociationRemoveAction", NULL, "_Remove Association from Invoice", NULL,
+ "Remove Association from Invoice",
+ G_CALLBACK (gnc_plugin_page_invoice_cmd_associate_remove)
+ },
{
"ToolsProcessPaymentAction", GNC_ICON_INVOICE_PAY, "_Pay Invoice", NULL,
"Enter a payment for the owner of this invoice",
@@ -246,6 +267,8 @@ static const gchar *invoice_book_readwrite_actions[] =
"EditDuplicateInvoiceAction",
"BusinessNewInvoiceAction",
"ToolsProcessPaymentAction",
+ "BusinessAssociationAction",
+ "BusinessAssociationRemoveAction",
NULL
};
@@ -285,6 +308,9 @@ static action_toolbar_labels invoice_action_labels[] =
{"EditUnpostInvoiceAction", N_("_Unpost Invoice")},
{"BusinessNewInvoiceAction", N_("New _Invoice")},
{"ToolsProcessPaymentAction", N_("_Pay Invoice")},
+ {"BusinessAssociationAction", N_("_Update Association for Invoice")},
+ {"BusinessAssociationOpenAction", N_("_Open Association for Invoice")},
+ {"BusinessAssociationRemoveAction", N_("_Remove Association from Invoice")},
{NULL, NULL},
};
@@ -304,6 +330,9 @@ static action_toolbar_labels bill_action_labels[] =
{"EditUnpostInvoiceAction", N_("_Unpost Bill")},
{"BusinessNewInvoiceAction", N_("New _Bill")},
{"ToolsProcessPaymentAction", N_("_Pay Bill")},
+ {"BusinessAssociationAction", N_("_Update Association for Bill")},
+ {"BusinessAssociationOpenAction", N_("_Open Association for Bill")},
+ {"BusinessAssociationRemoveAction", N_("_Remove Association from Bill")},
{NULL, NULL},
};
@@ -323,6 +352,9 @@ static action_toolbar_labels voucher_action_labels[] =
{"EditUnpostInvoiceAction", N_("_Unpost Voucher")},
{"BusinessNewInvoiceAction", N_("New _Voucher")},
{"ToolsProcessPaymentAction", N_("_Pay Voucher")},
+ {"BusinessAssociationAction", N_("_Update Association for Voucher")},
+ {"BusinessAssociationOpenAction", N_("_Open Association for Voucher")},
+ {"BusinessAssociationRemoveAction", N_("_Remove Association from Voucher")},
{NULL, NULL},
};
@@ -342,6 +374,9 @@ static action_toolbar_labels creditnote_action_labels[] =
{"EditUnpostInvoiceAction", N_("_Unpost Credit Note")},
{"BusinessNewInvoiceAction", N_("New _Credit Note")},
{"ToolsProcessPaymentAction", N_("_Pay Credit Note")},
+ {"BusinessAssociationAction", N_("_Update Association for Credit Note")},
+ {"BusinessAssociationOpenAction", N_("_Open Association for Credit Note")},
+ {"BusinessAssociationRemoveAction", N_("_Remove Association from Credit Note")},
{NULL, NULL},
};
@@ -356,6 +391,9 @@ static action_toolbar_labels invoice_action_tooltips[] = {
{"BlankEntryAction", N_("Move to the blank entry at the bottom of the invoice")},
{"ToolsProcessPaymentAction", N_("Enter a payment for the owner of this invoice") },
{"ReportsCompanyReportAction", N_("Open a company report window for the owner of this invoice") },
+ {"BusinessAssociationAction", N_("Update Association for current invoice")},
+ {"BusinessAssociationOpenAction", N_("Open Association for current invoice")},
+ {"BusinessAssociationRemoveAction", N_("Remove Association from invoice")},
{NULL, NULL},
};
@@ -375,6 +413,9 @@ static action_toolbar_labels bill_action_tooltips[] = {
{"BlankEntryAction", N_("Move to the blank entry at the bottom of the bill")},
{"ToolsProcessPaymentAction", N_("Enter a payment for the owner of this bill") },
{"ReportsCompanyReportAction", N_("Open a company report window for the owner of this bill") },
+ {"BusinessAssociationAction", N_("Update Association for current bill")},
+ {"BusinessAssociationOpenAction", N_("Open Association for current bill")},
+ {"BusinessAssociationRemoveAction", N_("Remove Association from bill")},
{NULL, NULL},
};
@@ -394,6 +435,9 @@ static action_toolbar_labels voucher_action_tooltips[] = {
{"BlankEntryAction", N_("Move to the blank entry at the bottom of the voucher")},
{"ToolsProcessPaymentAction", N_("Enter a payment for the owner of this voucher") },
{"ReportsCompanyReportAction", N_("Open a company report window for the owner of this voucher") },
+ {"BusinessAssociationAction", N_("Update Association for current voucher")},
+ {"BusinessAssociationOpenAction", N_("Open Association for current voucher")},
+ {"BusinessAssociationRemoveAction", N_("Remove Association from voucher")},
{NULL, NULL},
};
@@ -413,6 +457,9 @@ static action_toolbar_labels creditnote_action_tooltips[] = {
{"BlankEntryAction", N_("Move to the blank entry at the bottom of the credit note")},
{"ToolsProcessPaymentAction", N_("Enter a payment for the owner of this credit note") },
{"ReportsCompanyReportAction", N_("Open a company report window for the owner of this credit note") },
+ {"BusinessAssociationAction", N_("Update Association for credit note")},
+ {"BusinessAssociationOpenAction", N_("Open Association for credit note")},
+ {"BusinessAssociationRemoveAction", N_("Remove Association from credit note")},
{NULL, NULL},
};
@@ -550,6 +597,17 @@ gnc_plugin_page_invoice_finalize (GObject *object)
LEAVE(" ");
}
+static void
+update_assoc_actions (GncPluginPage *plugin_page, gboolean has_uri)
+{
+ GtkAction *uri_action;
+
+ uri_action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(plugin_page), "BusinessAssociationOpenAction");
+ gtk_action_set_sensitive (uri_action, has_uri);
+ uri_action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(plugin_page), "BusinessAssociationRemoveAction");
+ gtk_action_set_sensitive (uri_action, has_uri);
+}
+
static void
gnc_plugin_page_invoice_action_update (GtkActionGroup *action_group,
action_toolbar_labels *action_list,
@@ -590,11 +648,13 @@ gnc_plugin_page_invoice_update_menus (GncPluginPage *page, gboolean is_posted, g
GtkActionGroup *action_group;
GncPluginPageInvoicePrivate *priv;
GncInvoiceType invoice_type;
+ GncInvoice *invoice;
gint i, j;
action_toolbar_labels *label_list;
action_toolbar_labels *tooltip_list;
action_toolbar_labels *label_layout_list;
action_toolbar_labels *tooltip_layout_list;
+ gboolean has_uri = FALSE;
gboolean is_readonly = qof_book_is_readonly(gnc_get_current_book());
@@ -678,6 +738,13 @@ gnc_plugin_page_invoice_update_menus (GncPluginPage *page, gboolean is_posted, g
gnc_plugin_page_invoice_action_update (action_group, label_layout_list, (void*)gtk_action_set_label);
/* update the layout action tooltips */
gnc_plugin_page_invoice_action_update (action_group, tooltip_layout_list, (void*)gtk_action_set_tooltip);
+
+ // update association buttons
+ invoice = gnc_invoice_window_get_invoice (priv->iw);
+ if (gncInvoiceGetAssociation (invoice))
+ has_uri = TRUE;
+
+ update_assoc_actions (page, has_uri);
}
@@ -1269,6 +1336,107 @@ gnc_plugin_page_invoice_cmd_reset_layout (GtkAction *action,
LEAVE(" ");
}
+static void
+gnc_plugin_page_invoice_cmd_associate (GtkAction *action,
+ GncPluginPageInvoice *plugin_page)
+{
+ GncPluginPageInvoicePrivate *priv;
+ GtkWindow *parent;
+ GtkAction *uri_action;
+ GncInvoice *invoice;
+ const gchar *uri;
+ gchar *ret_uri;
+ gboolean has_uri = FALSE;
+
+ g_return_if_fail (GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
+ ENTER("(action %p, plugin_page %p)", action, plugin_page);
+ priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
+ parent = GTK_WINDOW(gnc_plugin_page_get_window (GNC_PLUGIN_PAGE(plugin_page)));
+
+ invoice = gnc_invoice_window_get_invoice (priv->iw);
+ uri = gncInvoiceGetAssociation (invoice);
+
+ ret_uri = gnc_assoc_get_uri_dialog (parent, _("Change a Business Association"), uri);
+
+ if (ret_uri && g_strcmp0 (uri, ret_uri) != 0)
+ {
+ GtkWidget *assoc_link_button = gnc_invoice_window_get_assoc_link_button (priv->iw);
+
+ if (assoc_link_button)
+ {
+ if (g_strcmp0 (ret_uri, "") == 0)
+ gtk_widget_hide (GTK_WIDGET(assoc_link_button));
+ else
+ {
+ gchar *display_uri = gnc_assoc_get_unescaped_just_uri (ret_uri);
+ gtk_link_button_set_uri (GTK_LINK_BUTTON(assoc_link_button), display_uri);
+ gtk_widget_show (GTK_WIDGET(assoc_link_button));
+ g_free (display_uri);
+ }
+ }
+ gncInvoiceSetAssociation (invoice, ret_uri);
+ has_uri = TRUE;
+ }
+
+ // update the menu actions
+ update_assoc_actions (GNC_PLUGIN_PAGE(plugin_page), has_uri);
+
+ g_free (ret_uri);
+ LEAVE(" ");
+}
+
+static void
+gnc_plugin_page_invoice_cmd_associate_remove (GtkAction *action,
+ GncPluginPageInvoice *plugin_page)
+{
+ GncPluginPageInvoicePrivate *priv;
+ GtkWindow *parent;
+ GtkAction *uri_action;
+ GncInvoice *invoice;
+ GtkWidget *assoc_link_button;
+
+ g_return_if_fail (GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
+ ENTER("(action %p, plugin_page %p)", action, plugin_page);
+ priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
+ parent = GTK_WINDOW(gnc_plugin_page_get_window (GNC_PLUGIN_PAGE(plugin_page)));
+
+ invoice = gnc_invoice_window_get_invoice (priv->iw);
+ gncInvoiceSetAssociation (invoice, "");
+
+ assoc_link_button = gnc_invoice_window_get_assoc_link_button (priv->iw);
+
+ if (assoc_link_button)
+ gtk_widget_hide (GTK_WIDGET(assoc_link_button));
+
+ // update the menu actions
+ update_assoc_actions (GNC_PLUGIN_PAGE(plugin_page), FALSE);
+
+ LEAVE(" ");
+}
+
+static void
+gnc_plugin_page_invoice_cmd_associate_open (GtkAction *action,
+ GncPluginPageInvoice *plugin_page)
+{
+ GncPluginPageInvoicePrivate *priv;
+ GtkWindow *parent;
+ GncInvoice *invoice;
+ const gchar *uri = NULL;
+
+ g_return_if_fail(GNC_IS_PLUGIN_PAGE_INVOICE(plugin_page));
+ ENTER("(action %p, plugin_page %p)", action, plugin_page);
+ priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(plugin_page);
+ parent = GTK_WINDOW(gnc_plugin_page_get_window (GNC_PLUGIN_PAGE(plugin_page)));
+
+ invoice = gnc_invoice_window_get_invoice (priv->iw);
+ uri = gncInvoiceGetAssociation (invoice);
+
+ if (uri)
+ gnc_assoc_open_uri (parent, uri);
+
+ LEAVE(" ");
+}
+
static void
gnc_plugin_page_invoice_cmd_company_report (GtkAction *action,
GncPluginPageInvoice *plugin_page)
diff --git a/gnucash/gtkbuilder/dialog-invoice.glade b/gnucash/gtkbuilder/dialog-invoice.glade
index fd9aa3c6ad..6cb0c11581 100644
--- a/gnucash/gtkbuilder/dialog-invoice.glade
+++ b/gnucash/gtkbuilder/dialog-invoice.glade
@@ -381,22 +381,61 @@
False
0
-
diff --git a/gnucash/ui/gnc-plugin-page-invoice-ui.xml b/gnucash/ui/gnc-plugin-page-invoice-ui.xml
index 8a823271e1..45ce7eea83 100644
--- a/gnucash/ui/gnc-plugin-page-invoice-ui.xml
+++ b/gnucash/ui/gnc-plugin-page-invoice-ui.xml
@@ -39,6 +39,11 @@