2011-02-10 15:49:12 -06:00
|
|
|
/********************************************************************\
|
|
|
|
* gnc-addr-quickfill.c -- Create an address line quick-fill *
|
|
|
|
* Copyright (C) 2011 Christian Stimming <christian@cstimming.de> *
|
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or *
|
|
|
|
* modify it under the terms of the GNU General Public License as *
|
|
|
|
* published by the Free Software Foundation; either version 2 of *
|
|
|
|
* the License, or (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
* This program is distributed in the hope that it will be useful, *
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
|
* GNU General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU General Public License*
|
|
|
|
* along with this program; if not, contact: *
|
|
|
|
* *
|
|
|
|
* Free Software Foundation Voice: +1-617-542-5942 *
|
|
|
|
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
|
|
|
|
* Boston, MA 02110-1301, USA gnu@gnu.org *
|
|
|
|
* *
|
|
|
|
\********************************************************************/
|
|
|
|
|
2017-10-26 04:14:21 -05:00
|
|
|
#include <config.h>
|
2011-02-10 15:49:12 -06:00
|
|
|
#include "gnc-addr-quickfill.h"
|
2017-08-10 06:56:00 -05:00
|
|
|
#include "gnc-event.h"
|
|
|
|
#include "gnc-engine.h"
|
|
|
|
#include "gncAddress.h"
|
2011-02-10 15:49:12 -06:00
|
|
|
|
|
|
|
/* This static indicates the debugging module that this .o belongs to. */
|
2012-05-26 18:47:34 -05:00
|
|
|
G_GNUC_UNUSED static QofLogModule log_module = GNC_MOD_REGISTER;
|
2011-02-10 15:49:12 -06:00
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
QuickFill *qf_addr2;
|
|
|
|
QuickFill *qf_addr3;
|
2011-02-12 09:18:46 -06:00
|
|
|
QuickFill *qf_addr4;
|
2011-02-10 15:49:12 -06:00
|
|
|
QuickFillSort qf_sort;
|
|
|
|
QofBook *book;
|
|
|
|
gint listener;
|
|
|
|
} AddressQF;
|
|
|
|
|
|
|
|
static void
|
|
|
|
listen_for_gncaddress_events(QofInstance *entity, QofEventId event_type,
|
|
|
|
gpointer user_data, gpointer event_data)
|
|
|
|
{
|
|
|
|
AddressQF *qfb = user_data;
|
2011-02-12 09:18:46 -06:00
|
|
|
const char *addr2, *addr3, *addr4;
|
2011-02-10 15:49:12 -06:00
|
|
|
|
|
|
|
/* We only listen for GncAddress events */
|
|
|
|
if (!GNC_IS_ADDRESS (entity))
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* We listen for MODIFY (if the description was changed into
|
|
|
|
* something non-empty, so we add the string to the quickfill) and
|
|
|
|
* DESTROY (to remove the description from the quickfill). */
|
|
|
|
if (0 == (event_type & (QOF_EVENT_MODIFY | QOF_EVENT_DESTROY)))
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* g_warning("entity %p, entity type %s, event type %s, user data %p, ecent data %p", */
|
|
|
|
/* entity, entity->e_type, qofeventid_to_string(event_type), user_data, event_data); */
|
|
|
|
|
|
|
|
addr2 = gncAddressGetAddr2(GNC_ADDRESS(entity));
|
|
|
|
addr3 = gncAddressGetAddr3(GNC_ADDRESS(entity));
|
2011-02-12 09:18:46 -06:00
|
|
|
addr4 = gncAddressGetAddr4(GNC_ADDRESS(entity));
|
2011-02-10 15:49:12 -06:00
|
|
|
if (event_type & QOF_EVENT_MODIFY)
|
|
|
|
{
|
|
|
|
/* If the description was changed into something non-empty, so
|
|
|
|
* we add the string to the quickfill */
|
|
|
|
if (addr2 && strlen(addr2) > 0)
|
|
|
|
{
|
|
|
|
/* Add the new string to the quickfill */
|
|
|
|
gnc_quickfill_insert (qfb->qf_addr2, addr2, QUICKFILL_LIFO);
|
|
|
|
}
|
|
|
|
if (addr3 && strlen(addr3) > 0)
|
|
|
|
{
|
|
|
|
/* Add the new string to the quickfill */
|
|
|
|
gnc_quickfill_insert (qfb->qf_addr3, addr3, QUICKFILL_LIFO);
|
|
|
|
}
|
2011-02-12 09:18:46 -06:00
|
|
|
if (addr4 && strlen(addr4) > 0)
|
|
|
|
{
|
|
|
|
/* Add the new string to the quickfill */
|
|
|
|
gnc_quickfill_insert (qfb->qf_addr4, addr4, QUICKFILL_LIFO);
|
|
|
|
}
|
2011-02-10 15:49:12 -06:00
|
|
|
}
|
|
|
|
else if (event_type & QOF_EVENT_DESTROY)
|
|
|
|
{
|
|
|
|
if (addr2 && strlen(addr2) > 0)
|
|
|
|
{
|
|
|
|
/* Remove the description from the quickfill */
|
|
|
|
gnc_quickfill_insert (qfb->qf_addr2, addr2, QUICKFILL_LIFO);
|
|
|
|
}
|
|
|
|
if (addr3 && strlen(addr3) > 0)
|
|
|
|
{
|
|
|
|
/* Remove the description from the quickfill */
|
|
|
|
gnc_quickfill_insert (qfb->qf_addr3, addr3, QUICKFILL_LIFO);
|
|
|
|
}
|
2011-02-12 09:18:46 -06:00
|
|
|
if (addr4 && strlen(addr4) > 0)
|
|
|
|
{
|
|
|
|
/* Remove the description from the quickfill */
|
|
|
|
gnc_quickfill_insert (qfb->qf_addr4, addr4, QUICKFILL_LIFO);
|
|
|
|
}
|
2011-02-10 15:49:12 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
shared_quickfill_destroy (QofBook *book, gpointer key, gpointer user_data)
|
|
|
|
{
|
|
|
|
AddressQF *qfb = user_data;
|
|
|
|
gnc_quickfill_destroy (qfb->qf_addr2);
|
|
|
|
gnc_quickfill_destroy (qfb->qf_addr3);
|
2011-02-12 09:18:46 -06:00
|
|
|
gnc_quickfill_destroy (qfb->qf_addr4);
|
2011-02-10 15:49:12 -06:00
|
|
|
qof_event_unregister_handler (qfb->listener);
|
|
|
|
g_free (qfb);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void address_cb(gpointer data, gpointer user_data)
|
|
|
|
{
|
|
|
|
const GncAddress* address = data;
|
|
|
|
AddressQF *s = (AddressQF *) user_data;
|
|
|
|
|
|
|
|
gnc_quickfill_insert (s->qf_addr2,
|
|
|
|
gncAddressGetAddr2(address),
|
|
|
|
s->qf_sort);
|
|
|
|
|
|
|
|
gnc_quickfill_insert (s->qf_addr3,
|
|
|
|
gncAddressGetAddr3(address),
|
|
|
|
s->qf_sort);
|
2011-02-12 09:18:46 -06:00
|
|
|
|
|
|
|
gnc_quickfill_insert (s->qf_addr4,
|
|
|
|
gncAddressGetAddr4(address),
|
|
|
|
s->qf_sort);
|
2011-02-10 15:49:12 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Creates a new query that searches for all GncAddress items in the
|
|
|
|
* current book. */
|
|
|
|
static QofQuery *new_query_for_addresss(QofBook *book)
|
|
|
|
{
|
|
|
|
QofQuery *query = qof_query_create_for (GNC_ID_ADDRESS);
|
|
|
|
g_assert(book);
|
|
|
|
qof_query_set_book (query, book);
|
|
|
|
|
|
|
|
/* No particular sort order here. */
|
|
|
|
|
|
|
|
return query;
|
|
|
|
}
|
|
|
|
|
|
|
|
static AddressQF* build_shared_quickfill (QofBook *book, const char * key)
|
|
|
|
{
|
|
|
|
AddressQF *result;
|
|
|
|
QofQuery *query = new_query_for_addresss(book);
|
|
|
|
GList *entries = qof_query_run(query);
|
|
|
|
|
|
|
|
/* g_warning("Found %d GncAddress items", g_list_length (entries)); */
|
|
|
|
|
|
|
|
result = g_new0(AddressQF, 1);
|
|
|
|
|
|
|
|
result->qf_addr2 = gnc_quickfill_new();
|
|
|
|
result->qf_addr3 = gnc_quickfill_new();
|
2011-02-12 09:18:46 -06:00
|
|
|
result->qf_addr4 = gnc_quickfill_new();
|
|
|
|
result->qf_sort = QUICKFILL_ALPHA;
|
2011-02-10 15:49:12 -06:00
|
|
|
result->book = book;
|
|
|
|
|
|
|
|
g_list_foreach (entries, address_cb, result);
|
|
|
|
|
|
|
|
qof_query_destroy(query);
|
|
|
|
|
|
|
|
result->listener =
|
|
|
|
qof_event_register_handler (listen_for_gncaddress_events,
|
|
|
|
result);
|
|
|
|
|
|
|
|
qof_book_set_data_fin (book, key, result, shared_quickfill_destroy);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
QuickFill * gnc_get_shared_address_addr2_quickfill (QofBook *book, const char * key)
|
|
|
|
{
|
|
|
|
AddressQF *qfb;
|
|
|
|
|
|
|
|
g_assert(book);
|
|
|
|
g_assert(key);
|
|
|
|
|
|
|
|
qfb = qof_book_get_data (book, key);
|
|
|
|
|
|
|
|
if (!qfb)
|
|
|
|
{
|
|
|
|
qfb = build_shared_quickfill(book, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
return qfb->qf_addr2;
|
|
|
|
}
|
|
|
|
|
|
|
|
QuickFill * gnc_get_shared_address_addr3_quickfill (QofBook *book, const char * key)
|
|
|
|
{
|
|
|
|
AddressQF *qfb;
|
|
|
|
|
|
|
|
g_assert(book);
|
|
|
|
g_assert(key);
|
|
|
|
|
|
|
|
qfb = qof_book_get_data (book, key);
|
|
|
|
|
|
|
|
if (!qfb)
|
|
|
|
{
|
|
|
|
qfb = build_shared_quickfill(book, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
return qfb->qf_addr3;
|
|
|
|
}
|
2011-02-12 09:18:46 -06:00
|
|
|
|
|
|
|
QuickFill * gnc_get_shared_address_addr4_quickfill (QofBook *book, const char * key)
|
|
|
|
{
|
|
|
|
AddressQF *qfb;
|
|
|
|
|
|
|
|
g_assert(book);
|
|
|
|
g_assert(key);
|
|
|
|
|
|
|
|
qfb = qof_book_get_data (book, key);
|
|
|
|
|
|
|
|
if (!qfb)
|
|
|
|
{
|
|
|
|
qfb = build_shared_quickfill(book, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
return qfb->qf_addr4;
|
|
|
|
}
|