r17352 - gnucash/branches/gobject-engine-dev2/src/engine - Convert GncBudget to be a GObject with parameters and private section.
Phil Longstaff
plongstaff at cvs.gnucash.org
Sun Jul 20 15:12:44 EDT 2008
Author: plongstaff
Date: 2008-07-20 15:12:44 -0400 (Sun, 20 Jul 2008)
New Revision: 17352
Trac: http://svn.gnucash.org/trac/changeset/17352
Modified:
gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.c
gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.h
Log:
Convert GncBudget to be a GObject with parameters and private section.
Modified: gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.c
===================================================================
--- gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.c 2008-07-20 16:28:36 UTC (rev 17351)
+++ gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.c 2008-07-20 19:12:44 UTC (rev 17352)
@@ -39,38 +39,196 @@
static QofLogModule log_module = GNC_MOD_ENGINE;
-struct gnc_budget_private{
- QofInstance inst;
+enum {
+ PROP_0,
+ PROP_NAME,
+ PROP_DESCRIPTION,
+ PROP_NUM_PERIODS,
+ PROP_RECURRENCE,
+};
+struct budget_s
+{
+ QofInstance inst;
+};
+
+typedef struct {
+ QofInstanceClass parent_class;
+} BudgetClass;
+
+typedef struct BudgetPrivate {
+ /* The name is an arbitrary string assigned by the user. */
gchar* name;
+
+ /* The description is an arbitrary string assigned by the user. */
gchar* description;
+
+ /* Recurrence (period info) for the budget */
Recurrence recurrence;
+
+ /* Number of periods */
guint num_periods;
-};
+} BudgetPrivate;
+#define GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE((o), GNC_TYPE_BUDGET, BudgetPrivate))
+
struct _GncBudgetClass
{
QofInstanceClass parent_class;
};
/* GObject Initialization */
-QOF_GOBJECT_IMPL(gnc_budget, GncBudget, QOF_TYPE_INSTANCE);
+G_DEFINE_TYPE(GncBudget, gnc_budget, QOF_TYPE_INSTANCE)
static void
gnc_budget_init(GncBudget* budget)
{
+ BudgetPrivate* priv;
+ GDate date;
+
+ priv = GET_PRIVATE(budget);
+ priv->name = CACHE_INSERT(_("Unnamed Budget"));
+ priv->description = CACHE_INSERT("");
+
+ priv->num_periods = 12;
+ g_date_set_time_t(&date, time(NULL));
+ g_date_subtract_days(&date, g_date_get_day(&date)-1);
+ recurrenceSet(&priv->recurrence, 1, PERIOD_MONTH, &date);
}
static void
-gnc_budget_dispose_real (GObject *budgetp)
+gnc_budget_dispose (GObject *budgetp)
{
+ G_OBJECT_CLASS(gnc_budget_parent_class)->dispose(budgetp);
}
static void
-gnc_budget_finalize_real(GObject* budgetp)
+gnc_budget_finalize(GObject* budgetp)
{
+ G_OBJECT_CLASS(gnc_budget_parent_class)->finalize(budgetp);
}
+static void
+gnc_budget_get_property( GObject* object,
+ guint prop_id,
+ GValue* value,
+ GParamSpec* pspec)
+{
+ GncBudget* budget;
+ BudgetPrivate* priv;
+
+ g_return_if_fail(GNC_IS_BUDGET(object));
+
+ budget = GNC_BUDGET(object);
+ priv = GET_PRIVATE(budget);
+ switch( prop_id ) {
+ case PROP_NAME:
+ g_value_set_string(value, priv->name);
+ break;
+ case PROP_DESCRIPTION:
+ g_value_set_string(value, priv->description);
+ break;
+ case PROP_NUM_PERIODS:
+ g_value_set_uint(value, priv->num_periods);
+ break;
+ case PROP_RECURRENCE:
+ /* TODO: Make this a BOXED type */
+ g_value_set_pointer(value, &priv->recurrence);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gnc_budget_set_property( GObject* object,
+ guint prop_id,
+ const GValue* value,
+ GParamSpec* pspec)
+{
+ GncBudget* budget;
+
+ g_return_if_fail(GNC_IS_BUDGET(object));
+
+ budget = GNC_BUDGET(object);
+ switch( prop_id ) {
+ case PROP_NAME:
+ gnc_budget_set_name(budget, g_value_get_string(value));
+ break;
+ case PROP_DESCRIPTION:
+ gnc_budget_set_description(budget, g_value_get_string(value));
+ break;
+ case PROP_NUM_PERIODS:
+ gnc_budget_set_num_periods(budget, g_value_get_uint(value));
+ break;
+ case PROP_RECURRENCE:
+ gnc_budget_set_recurrence(budget, g_value_get_pointer(value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gnc_budget_class_init(GncBudgetClass* klass)
+{
+ GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
+
+ gobject_class->dispose = gnc_budget_dispose;
+ gobject_class->finalize = gnc_budget_finalize;
+ gobject_class->get_property = gnc_budget_get_property;
+ gobject_class->set_property = gnc_budget_set_property;
+
+ g_type_class_add_private(klass, sizeof(BudgetPrivate));
+
+ g_object_class_install_property(
+ gobject_class,
+ PROP_NAME,
+ g_param_spec_string( "name",
+ "Budget Name",
+ "The name is an arbitrary string "
+ "assigned by the user. It is intended "
+ "to be a short, 5 to 30 character long string "
+ "that is displayed by the GUI as the "
+ "budget mnemonic",
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property(
+ gobject_class,
+ PROP_DESCRIPTION,
+ g_param_spec_string( "description",
+ "Budget Description",
+ "The description is an arbitrary string "
+ "assigned by the user. It is intended "
+ "to be a longer, 1-5 sentence description of "
+ "what the budget is all about.",
+ NULL,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property(
+ gobject_class,
+ PROP_NUM_PERIODS,
+ g_param_spec_uint( "num-periods",
+ "Number of Periods",
+ "The number of periods for this budget.",
+ 0,
+ G_MAXUINT32,
+ 12,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property(
+ gobject_class,
+ PROP_RECURRENCE,
+ g_param_spec_pointer( "recurrence",
+ "Budget Recurrence",
+ "about.",
+ G_PARAM_READWRITE));
+}
+
static void commit_err (QofInstance *inst, QofBackendError errcode)
{
PERR ("Failed to commit: %d", errcode);
@@ -79,19 +237,23 @@
static void
gnc_budget_free(QofInstance *inst)
{
- GncBudget *budget = GNC_BUDGET(inst);
+ GncBudget *budget;
+ BudgetPrivate* priv;
+
if (budget == NULL)
return;
-
g_return_if_fail(GNC_IS_BUDGET(budget));
+ budget = GNC_BUDGET(inst);
+ priv = GET_PRIVATE(budget);
+
/* We first send the message that this object is about to be
* destroyed so that any GUI elements can remove it before it is
* actually gone. */
qof_event_gen( &budget->inst, QOF_EVENT_DESTROY, NULL);
- CACHE_REMOVE(budget->name);
- CACHE_REMOVE(budget->description);
+ CACHE_REMOVE(priv->name);
+ CACHE_REMOVE(priv->description);
/* qof_instance_release (&budget->inst); */
g_object_unref(budget);
@@ -117,23 +279,13 @@
gnc_budget_new(QofBook *book)
{
GncBudget* budget;
- GDate date;
+
g_return_val_if_fail(book, NULL);
ENTER(" ");
budget = g_object_new(GNC_TYPE_BUDGET, NULL);
qof_instance_init_data (&budget->inst, GNC_ID_BUDGET, book);
- g_date_set_time_t(&date, time(NULL));
- g_date_subtract_days(&date, g_date_get_day(&date)-1);
- recurrenceSet(&budget->recurrence, 1, PERIOD_MONTH, &date);
-
- gnc_budget_begin_edit(budget);
- gnc_budget_set_name(budget, _("Unnamed Budget"));
- gnc_budget_set_description(budget, "");
- gnc_budget_set_num_periods(budget, 12);
- gnc_budget_commit_edit(budget);
-
qof_event_gen( &budget->inst, QOF_EVENT_CREATE , NULL);
LEAVE(" ");
@@ -153,10 +305,15 @@
void
gnc_budget_set_name(GncBudget* budget, const gchar* name)
{
+ BudgetPrivate* priv;
+
g_return_if_fail(GNC_IS_BUDGET(budget) && name);
+ priv = GET_PRIVATE(budget);
+ if( name == priv->name ) return;
+
gnc_budget_begin_edit(budget);
- CACHE_REPLACE(budget->name, name);
+ CACHE_REPLACE(priv->name, name);
qof_instance_set_dirty(&budget->inst);
gnc_budget_commit_edit(budget);
@@ -167,17 +324,21 @@
gnc_budget_get_name(GncBudget* budget)
{
g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
- return budget->name;
+ return GET_PRIVATE(budget)->name;
}
void
gnc_budget_set_description(GncBudget* budget, const gchar* description)
{
+ BudgetPrivate* priv;
+
g_return_if_fail(GNC_IS_BUDGET(budget));
g_return_if_fail(description);
+ priv = GET_PRIVATE(budget);
+ if( description == priv->description ) return;
gnc_budget_begin_edit(budget);
- CACHE_REPLACE(budget->description, description);
+ CACHE_REPLACE(priv->description, description);
qof_instance_set_dirty(&budget->inst);
gnc_budget_commit_edit(budget);
@@ -188,15 +349,19 @@
gnc_budget_get_description(GncBudget* budget)
{
g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
- return budget->description;
+ return GET_PRIVATE(budget)->description;
}
void
gnc_budget_set_recurrence(GncBudget *budget, const Recurrence *r)
{
+ BudgetPrivate* priv;
+
g_return_if_fail(budget && r);
+ priv = GET_PRIVATE(budget);
+
gnc_budget_begin_edit(budget);
- budget->recurrence = *r;
+ priv->recurrence = *r;
qof_instance_set_dirty(&budget->inst);
gnc_budget_commit_edit(budget);
@@ -207,7 +372,7 @@
gnc_budget_get_recurrence(GncBudget *budget)
{
g_return_val_if_fail(budget, NULL);
- return (&budget->recurrence);
+ return (&GET_PRIVATE(budget)->recurrence);
}
const GUID*
@@ -221,10 +386,15 @@
void
gnc_budget_set_num_periods(GncBudget* budget, guint num_periods)
{
+ BudgetPrivate* priv;
+
g_return_if_fail(GNC_IS_BUDGET(budget));
+ priv = GET_PRIVATE(budget);
+ if( priv->num_periods == num_periods ) return;
+
gnc_budget_begin_edit(budget);
- budget->num_periods = num_periods;
+ priv->num_periods = num_periods;
qof_instance_set_dirty(&budget->inst);
gnc_budget_commit_edit(budget);
@@ -235,7 +405,7 @@
gnc_budget_get_num_periods(GncBudget* budget)
{
g_return_val_if_fail(GNC_IS_BUDGET(budget), 0);
- return budget->num_periods;
+ return GET_PRIVATE(budget)->num_periods;
}
#define BUF_SIZE (10 + GUID_ENCODING_LENGTH + \
@@ -370,7 +540,7 @@
{
Timespec ts;
timespecFromTime_t(
- &ts, recurrenceGetPeriodTime(&budget->recurrence, period_num, FALSE));
+ &ts, recurrenceGetPeriodTime(&GET_PRIVATE(budget)->recurrence, period_num, FALSE));
return ts;
}
@@ -380,7 +550,7 @@
{
// FIXME: maybe zero is not best error return val.
g_return_val_if_fail(GNC_IS_BUDGET(budget) && acc, gnc_numeric_zero());
- return recurrenceGetAccountPeriodValue(&budget->recurrence,
+ return recurrenceGetAccountPeriodValue(&GET_PRIVATE(budget)->recurrence,
acc, period_num);
}
@@ -441,11 +611,11 @@
/* Static wrapper getters for the recurrence params */
static PeriodType gnc_budget_get_rec_pt(const GncBudget *bgt)
-{ return recurrenceGetPeriodType(&(bgt->recurrence)); }
+{ return recurrenceGetPeriodType(&(GET_PRIVATE(bgt)->recurrence)); }
static guint gnc_budget_get_rec_mult(const GncBudget *bgt)
-{ return recurrenceGetMultiplier(&(bgt->recurrence)); }
+{ return recurrenceGetMultiplier(&(GET_PRIVATE(bgt)->recurrence)); }
static GDate gnc_budget_get_rec_date(const GncBudget *bgt)
-{ return recurrenceGetDate(&(bgt->recurrence)); }
+{ return recurrenceGetDate(&(GET_PRIVATE(bgt)->recurrence)); }
/* Register ourselves with the engine. */
gboolean gnc_budget_register (void)
Modified: gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.h
===================================================================
--- gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.h 2008-07-20 16:28:36 UTC (rev 17351)
+++ gnucash/branches/gobject-engine-dev2/src/engine/gnc-budget.h 2008-07-20 19:12:44 UTC (rev 17352)
@@ -67,7 +67,7 @@
#include <glib.h>
/** The budget data.*/
-typedef struct gnc_budget_private GncBudget;
+typedef struct budget_s GncBudget;
typedef struct _GncBudgetClass GncBudgetClass;
#include "qof.h"
More information about the gnucash-changes
mailing list