+ Gordon Oliver's patch to the status line for multiple currencies.

+ GUI implementation of the financial calculator.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@2591 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2000-07-17 21:08:54 +00:00
parent f174755ef3
commit 0b0c53fa1d
20 changed files with 4609 additions and 979 deletions

View File

@ -87,6 +87,7 @@ G. Allen Morris III <gam3@ann.softgams.com> for QIF core dump
Brent Neal <brent@baton.phys.lsu.edu> TIAA-CREF support.
Peter Norton <spacey@inch.com> for a valiant attempt at a GTK port
OmNiBuS <webmaster@obsidian.uia.net> web site graphics & content
Gordon Oliver <gordo@pincoya.com> multiple currency status line patch
Myroslav Opyr <mopyr@IPM.Lviv.UA> for misc patches
Dave Peticolas <dave@krondo.com> extensive intelligent patches
Laurent P{'e}lecq <laurent.pelecq@wanadoo.fr> i18n patches with gettext

View File

@ -441,6 +441,10 @@
<dd>web site graphics and content</dd>
<dt><a href="mailto:gordo@pincoya.com">Gordon Oliver</a></dt>
<dd>multiple currency status line patch</dd>
<dt><a href="mailto:mopyr@IPM.Lviv.UA">Myroslav Opyr</a></dt>
<dd>for misc patches</dd>

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,7 @@ LDADD = \
register/gnome/libgncregistergnome.a \
guile/libgncguile.a \
gnome/libgncgnome.a \
calculation/libgnccalc.a \
engine/libgncengine.la \
@GNOME_LIBS@ \
@G_WRAP_LINK_ARGS@ \

View File

@ -126,7 +126,7 @@ bin_PROGRAMS = gnucash
# dependencies need to go away. The libgwrap one in particular is a
# problem with the current version of gwrap, and will go away when
# that's fixed.
LDADD = gnome/libgncgnome.a register/libgncregister.a register/gnome/libgncregistergnome.a guile/libgncguile.a gnome/libgncgnome.a engine/libgncengine.la @GNOME_LIBS@ @G_WRAP_LINK_ARGS@ @GUILE_LINK_ARGS@ @INTLLIBS@
LDADD = gnome/libgncgnome.a register/libgncregister.a register/gnome/libgncregistergnome.a guile/libgncguile.a gnome/libgncgnome.a calculation/libgnccalc.a engine/libgncengine.la @GNOME_LIBS@ @G_WRAP_LINK_ARGS@ @GUILE_LINK_ARGS@ @INTLLIBS@
gnucash_SOURCES = MultiLedger.c SplitLedger.c Destroy.c EuroUtils.c FileDialog.c Refresh.c
@ -161,7 +161,7 @@ FileDialog.o Refresh.o
gnucash_LDADD = $(LDADD)
gnucash_DEPENDENCIES = gnome/libgncgnome.a register/libgncregister.a \
register/gnome/libgncregistergnome.a guile/libgncguile.a \
gnome/libgncgnome.a engine/libgncengine.la
gnome/libgncgnome.a calculation/libgnccalc.a engine/libgncengine.la
gnucash_LDFLAGS =
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)

View File

@ -287,6 +287,7 @@
*
*/
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@ -380,7 +381,6 @@ void exit_parser(
void *vp)
{
parser_env_ptr pe = (parser_env_ptr)(vp);
unsigned j;
var_store_ptr vars,
bv;
@ -423,9 +423,7 @@ void *vp)
unsigned ret = FALSE;
parser_env_ptr pe = (parser_env_ptr)vp;
var_store_ptr nv,
tv,
sv,
uv;
tv;
for ( nv = pe->named_vars , tv = NULL ; nv ; tv = nv , nv = nv->next_var ) {
if ( strcmp(nv->variable_name,var_name) == 0 ) {
@ -521,7 +519,6 @@ parser_env_ptr pe)
static var_store_ptr get_named_var(
parser_env_ptr pe)
{
unsigned cntr;
var_store_ptr retp = NULL,
bv;

View File

@ -2,36 +2,39 @@
noinst_LIBRARIES = libgncgnome.a
libgncgnome_a_SOURCES = \
top-level.c \
window-main.c \
window-register.c \
window-adjust.c \
window-help.c \
cursors.c \
account-tree.c \
dialog-budget.c \
window-reconcile.c \
window-html.c \
dialog-options.c \
dialog-filebox.c \
dialog-transfer.c \
cursors.c \
dialog-account-picker.c \
dialog-add.c \
dialog-budget.c \
dialog-edit.c \
dialog-utils.c \
dialog-filebox.c \
dialog-fincalc.c \
dialog-find-transactions.c \
dialog-options.c \
dialog-print-check.c \
dialog-qif-import.c \
dialog-totd.c \
dialog-transfer.c \
dialog-utils.c \
extensions.c \
file-history.c \
glade-gnc-dialogs.c \
gnc-currency-edit.c \
gnc-datedelta.c \
gnc-dateedit.c \
gtkselect.c \
print-session.c \
query-user.c \
reconcile-list.c \
window-report.c \
gnc-dateedit.c gnc-currency-edit.c \
dialog-qif-import.c \
glade-gnc-dialogs.c \
gnc-datedelta.c \
dialog-account-picker.c \
print-session.c \
file-history.c \
dialog-print-check.c \
dialog-find-transactions.c
top-level.c \
window-adjust.c \
window-help.c \
window-html.c \
window-main.c \
window-reconcile.c \
window-register.c \
window-report.c
gnomeappdir = ${datadir}/gnome/apps/Applications
@ -45,6 +48,7 @@ noinst_HEADERS = \
dialog-add.h \
dialog-budget.h \
dialog-edit.h \
dialog-fincalc.h \
dialog-find-transactions.h \
dialog-options.h \
dialog-print-check.h \
@ -60,6 +64,7 @@ noinst_HEADERS = \
gnc-datedelta.h \
gnc-dateedit.h \
gnome-top-level.h \
gtkselect.h \
print-session.h \
query-user.h \
reconcile-list.h \
@ -81,6 +86,7 @@ CFLAGS = @CFLAGS@ ${GNOME_CFLAGS} ${G_WRAP_COMPILE_ARGS} ${GUILE_COMPILE_ARGS}
INCLUDES = \
-I${top_srcdir}/src \
-I${top_srcdir}/src/calculation \
-I${top_srcdir}/src/engine \
-I${top_srcdir}/src/g-wrap \
-I${top_srcdir}/src/guile \

View File

@ -117,14 +117,14 @@ l = @l@
noinst_LIBRARIES = libgncgnome.a
libgncgnome_a_SOURCES = top-level.c window-main.c window-register.c window-adjust.c window-help.c cursors.c account-tree.c dialog-budget.c window-reconcile.c window-html.c dialog-options.c dialog-filebox.c dialog-transfer.c dialog-add.c dialog-edit.c dialog-utils.c dialog-totd.c extensions.c query-user.c reconcile-list.c window-report.c gnc-dateedit.c gnc-currency-edit.c dialog-qif-import.c glade-gnc-dialogs.c gnc-datedelta.c dialog-account-picker.c print-session.c file-history.c dialog-print-check.c dialog-find-transactions.c
libgncgnome_a_SOURCES = account-tree.c cursors.c dialog-account-picker.c dialog-add.c dialog-budget.c dialog-edit.c dialog-filebox.c dialog-fincalc.c dialog-find-transactions.c dialog-options.c dialog-print-check.c dialog-qif-import.c dialog-totd.c dialog-transfer.c dialog-utils.c extensions.c file-history.c glade-gnc-dialogs.c gnc-currency-edit.c gnc-datedelta.c gnc-dateedit.c gtkselect.c print-session.c query-user.c reconcile-list.c top-level.c window-adjust.c window-help.c window-html.c window-main.c window-reconcile.c window-register.c window-report.c
gnomeappdir = ${datadir}/gnome/apps/Applications
gnomeapp_DATA = gnucash.desktop
noinst_HEADERS = account-tree.h account-treeP.h cursors.h dialog-account-picker.h dialog-add.h dialog-budget.h dialog-edit.h dialog-find-transactions.h dialog-options.h dialog-print-check.h dialog-qif-import.h dialog-totd.h dialog-transfer.h dialog-utils.h extensions.h glade-cb-gnc-dialogs.h glade-gnc-dialogs.h glade-support-gnc-dialogs.h gnc-currency-edit.h gnc-datedelta.h gnc-dateedit.h gnome-top-level.h print-session.h query-user.h reconcile-list.h reconcile-listP.h window-help.h window-html.h window-main.h window-mainP.h window-reconcile.h window-register.h window-report.h
noinst_HEADERS = account-tree.h account-treeP.h cursors.h dialog-account-picker.h dialog-add.h dialog-budget.h dialog-edit.h dialog-fincalc.h dialog-find-transactions.h dialog-options.h dialog-print-check.h dialog-qif-import.h dialog-totd.h dialog-transfer.h dialog-utils.h extensions.h glade-cb-gnc-dialogs.h glade-gnc-dialogs.h glade-support-gnc-dialogs.h gnc-currency-edit.h gnc-datedelta.h gnc-dateedit.h gnome-top-level.h gtkselect.h print-session.h query-user.h reconcile-list.h reconcile-listP.h window-help.h window-html.h window-main.h window-mainP.h window-reconcile.h window-register.h window-report.h
EXTRA_DIST = .cvsignore gnc-dialogs.glade gnucash.desktop
@ -132,7 +132,7 @@ EXTRA_DIST = .cvsignore gnc-dialogs.glade gnucash.desktop
CFLAGS = @CFLAGS@ ${GNOME_CFLAGS} ${G_WRAP_COMPILE_ARGS} ${GUILE_COMPILE_ARGS}
INCLUDES = -I${top_srcdir}/src -I${top_srcdir}/src/engine -I${top_srcdir}/src/g-wrap -I${top_srcdir}/src/guile -I${top_srcdir}/src/register -I${top_srcdir}/src/register/gnome
INCLUDES = -I${top_srcdir}/src -I${top_srcdir}/src/calculation -I${top_srcdir}/src/engine -I${top_srcdir}/src/g-wrap -I${top_srcdir}/src/guile -I${top_srcdir}/src/register -I${top_srcdir}/src/register/gnome
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../../config.h
@ -149,15 +149,15 @@ X_LIBS = @X_LIBS@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
libgncgnome_a_LIBADD =
libgncgnome_a_OBJECTS = top-level.o window-main.o window-register.o \
window-adjust.o window-help.o cursors.o account-tree.o dialog-budget.o \
window-reconcile.o window-html.o dialog-options.o dialog-filebox.o \
dialog-transfer.o dialog-add.o dialog-edit.o dialog-utils.o \
dialog-totd.o extensions.o query-user.o reconcile-list.o \
window-report.o gnc-dateedit.o gnc-currency-edit.o dialog-qif-import.o \
glade-gnc-dialogs.o gnc-datedelta.o dialog-account-picker.o \
print-session.o file-history.o dialog-print-check.o \
dialog-find-transactions.o
libgncgnome_a_OBJECTS = account-tree.o cursors.o \
dialog-account-picker.o dialog-add.o dialog-budget.o dialog-edit.o \
dialog-filebox.o dialog-fincalc.o dialog-find-transactions.o \
dialog-options.o dialog-print-check.o dialog-qif-import.o dialog-totd.o \
dialog-transfer.o dialog-utils.o extensions.o file-history.o \
glade-gnc-dialogs.o gnc-currency-edit.o gnc-datedelta.o gnc-dateedit.o \
gtkselect.o print-session.o query-user.o reconcile-list.o top-level.o \
window-adjust.o window-help.o window-html.o window-main.o \
window-reconcile.o window-register.o window-report.o
AR = ar
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@ -176,16 +176,16 @@ TAR = gtar
GZIP_ENV = --best
DEP_FILES = .deps/account-tree.P .deps/cursors.P \
.deps/dialog-account-picker.P .deps/dialog-add.P .deps/dialog-budget.P \
.deps/dialog-edit.P .deps/dialog-filebox.P \
.deps/dialog-edit.P .deps/dialog-filebox.P .deps/dialog-fincalc.P \
.deps/dialog-find-transactions.P .deps/dialog-options.P \
.deps/dialog-print-check.P .deps/dialog-qif-import.P \
.deps/dialog-totd.P .deps/dialog-transfer.P .deps/dialog-utils.P \
.deps/extensions.P .deps/file-history.P .deps/glade-gnc-dialogs.P \
.deps/gnc-currency-edit.P .deps/gnc-datedelta.P .deps/gnc-dateedit.P \
.deps/print-session.P .deps/query-user.P .deps/reconcile-list.P \
.deps/top-level.P .deps/window-adjust.P .deps/window-help.P \
.deps/window-html.P .deps/window-main.P .deps/window-reconcile.P \
.deps/window-register.P .deps/window-report.P
.deps/gtkselect.P .deps/print-session.P .deps/query-user.P \
.deps/reconcile-list.P .deps/top-level.P .deps/window-adjust.P \
.deps/window-help.P .deps/window-html.P .deps/window-main.P \
.deps/window-reconcile.P .deps/window-register.P .deps/window-report.P
SOURCES = $(libgncgnome_a_SOURCES)
OBJECTS = $(libgncgnome_a_OBJECTS)

568
src/gnome/dialog-fincalc.c Normal file
View File

@ -0,0 +1,568 @@
/********************************************************************\
* dialog-fincalc.c : dialog for a financial calculator *
* Copyright (C) 2000 Dave Peticolas <peticola@cs.ucdavis.edu> *
* *
* 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 *
* 59 Temple Place - Suite 330 Fax: +1-617-542-2652 *
* Boston, MA 02111-1307, USA gnu@gnu.org *
\********************************************************************/
#include "config.h"
#include <gnome.h>
#include <locale.h>
#include <time.h>
#include "dialog-fincalc.h"
#include "dialog-utils.h"
#include "finvar.h"
#include "finproto.h"
#include "glade-gnc-dialogs.h"
#include "gnc-dateedit.h"
#include "query-user.h"
#include "messages.h"
#include "util.h"
typedef enum
{
PAYMENT_PERIODS = 0,
INTEREST_RATE,
PRESENT_VALUE,
PERIODIC_PAYMENT,
FUTURE_VALUE,
NUM_FIN_CALC_VALUES
} FinCalcValue;
/** Datatypes ***********************************************************/
struct _FinCalcDialog
{
GtkWidget *dialog;
GtkWidget *entries[NUM_FIN_CALC_VALUES];
GtkWidget *compounding_menu;
GtkWidget *payment_menu;
GtkWidget *end_of_period_radio;
GtkWidget *discrete_compounding_radio;
financial_info financial_info;
GList *calc_buttons;
};
static unsigned int periods[] =
{
1, /* annual */
2, /* semi-annual */
3, /* tri-annual */
4, /* quarterly */
6, /* bi-monthly */
12, /* monthly */
24, /* semi-monthly */
26, /* bi-weekly */
52, /* weekly */
360, /* daily (360) */
365, /* daily (365) */
};
/* This static indicates the debugging module that this .o belongs to. */
static short module = MOD_GUI;
/** Prototypes **********************************************************/
/** Implementations *****************************************************/
/* Ensure the given argument is one of the values in the periods array
* above and return the index of the value. */
static int
normalize_period(unsigned int *period)
{
int i;
assert(period != NULL);
for (i = (sizeof(periods) / sizeof(unsigned int)) - 1; i >= 0; i--)
if (*period >= periods[i])
{
*period = periods[i];
return i;
}
*period = periods[0];
return 0;
}
/* Copy the values in the financial_info structure to the GUI */
static void
fi_to_gui(FinCalcDialog *fcd)
{
char string[1024];
struct lconv *lc;
int i;
if (fcd == NULL)
return;
lc = gnc_localeconv();
snprintf(string, sizeof(string), "%u", fcd->financial_info.npp);
gtk_entry_set_text(GTK_ENTRY(fcd->entries[PAYMENT_PERIODS]), string);
xaccSPrintAmount(string, fcd->financial_info.ir, PRTNMN, NULL);
gtk_entry_set_text(GTK_ENTRY(fcd->entries[INTEREST_RATE]), string);
xaccSPrintAmount(string, fcd->financial_info.pv, 0, NULL);
gtk_entry_set_text(GTK_ENTRY(fcd->entries[PRESENT_VALUE]), string);
xaccSPrintAmount(string, fcd->financial_info.pmt, 0, NULL);
gtk_entry_set_text(GTK_ENTRY(fcd->entries[PERIODIC_PAYMENT]), string);
xaccSPrintAmount(string, -fcd->financial_info.fv, 0, NULL);
gtk_entry_set_text(GTK_ENTRY(fcd->entries[FUTURE_VALUE]), string);
i = normalize_period(&fcd->financial_info.CF);
gtk_option_menu_set_history(GTK_OPTION_MENU(fcd->compounding_menu), i);
i = normalize_period(&fcd->financial_info.PF);
gtk_option_menu_set_history(GTK_OPTION_MENU(fcd->payment_menu), i);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcd->end_of_period_radio),
!fcd->financial_info.bep);
gtk_toggle_button_set_active
(GTK_TOGGLE_BUTTON(fcd->discrete_compounding_radio),
fcd->financial_info.disc);
}
/* Copy the values in the GUI to the financial_info structure */
static void
gui_to_fi(FinCalcDialog *fcd)
{
GtkToggleButton *toggle;
struct lconv *lc;
char *string;
int i;
if (fcd == NULL)
return;
lc = gnc_localeconv();
string = gtk_entry_get_text(GTK_ENTRY(fcd->entries[PAYMENT_PERIODS]));
fcd->financial_info.npp = strtol(string, NULL, 10);
string = gtk_entry_get_text(GTK_ENTRY(fcd->entries[INTEREST_RATE]));
fcd->financial_info.ir = xaccParseAmount(string, FALSE);
string = gtk_entry_get_text(GTK_ENTRY(fcd->entries[PRESENT_VALUE]));
fcd->financial_info.pv = xaccParseAmount(string, TRUE);
string = gtk_entry_get_text(GTK_ENTRY(fcd->entries[PERIODIC_PAYMENT]));
fcd->financial_info.pmt = xaccParseAmount(string, TRUE);
string = gtk_entry_get_text(GTK_ENTRY(fcd->entries[FUTURE_VALUE]));
fcd->financial_info.fv = -xaccParseAmount(string, TRUE);
i = gnc_option_menu_get_active(fcd->compounding_menu);
fcd->financial_info.CF = periods[i];
i = gnc_option_menu_get_active(fcd->payment_menu);
fcd->financial_info.PF = periods[i];
toggle = GTK_TOGGLE_BUTTON(fcd->end_of_period_radio);
fcd->financial_info.bep = !gtk_toggle_button_get_active(toggle);
toggle = GTK_TOGGLE_BUTTON(fcd->discrete_compounding_radio);
fcd->financial_info.disc = gtk_toggle_button_get_active(toggle);
fcd->financial_info.prec = lc->frac_digits;
}
/* Set the sensitivity of the calculation buttons based on the argument. */
static void
fincalc_allow_calc(FinCalcDialog *fcd, gboolean allow_calc)
{
GList *node;
if (fcd == NULL)
return;
for (node = fcd->calc_buttons; node != NULL; node = node->next)
gtk_widget_set_sensitive(GTK_WIDGET(node->data), allow_calc);
}
/* Free the calc button list and free the FinCalcDialog structure. */
static void
fincalc_dialog_destroy(GtkObject *object, gpointer data)
{
FinCalcDialog *fcd = data;
if (fcd == NULL)
return;
g_list_free(fcd->calc_buttons);
fcd->calc_buttons = NULL;
g_free(fcd);
}
static void
fincalc_entry_changed(GtkEditable *editable, gpointer data)
{
FinCalcDialog *fcd = data;
if (fcd == NULL)
return;
fincalc_allow_calc(fcd, TRUE);
}
static void
fincalc_menu_changed(GtkButton *button, FinCalcDialog *fcd)
{
if (fcd == NULL)
return;
fincalc_allow_calc(fcd, TRUE);
}
static void
connect_fincalc_menu_item(GtkWidget *item, gpointer data)
{
gtk_signal_connect(GTK_OBJECT(item), "activate",
GTK_SIGNAL_FUNC(fincalc_menu_changed), data);
}
static void
fincalc_radio_toggled(GtkToggleButton *togglebutton, gpointer data)
{
FinCalcDialog *fcd = data;
if (fcd == NULL)
return;
fincalc_allow_calc(fcd, TRUE);
}
static void
close_button_clicked(GtkButton *button, FinCalcDialog *fcd)
{
gnc_ui_fincalc_dialog_destroy(fcd);
}
static void
fincalc_clear_clicked(GtkButton *button, GtkEntry *entry)
{
gtk_entry_set_text(GTK_ENTRY(entry), "");
}
static void
init_fi(FinCalcDialog *fcd)
{
struct lconv *lc;
if (fcd == NULL)
return;
lc = gnc_localeconv();
fcd->financial_info.npp = 12;
fcd->financial_info.ir = 8.5;
fcd->financial_info.pv = 15000.0;
fcd->financial_info.pmt = -400.0;
fcd->financial_info.CF = 12;
fcd->financial_info.PF = 12;
fcd->financial_info.bep = FALSE;
fcd->financial_info.disc = TRUE;
fcd->financial_info.prec = lc->frac_digits;
FV(&fcd->financial_info);
}
/* Determine whether the value can be calculated. If it can, return
* NULL. Otherwise, return a string describing the reason. */
static const char *
can_calc_value(FinCalcDialog *fcd, FinCalcValue value)
{
unsigned int uvalue;
const char *string;
double dvalue;
int i;
if (fcd == NULL)
return NULL;
/* Check for missing values */
for (i = 0; i < NUM_FIN_CALC_VALUES; i++)
if (i != value)
{
string = gtk_entry_get_text(GTK_ENTRY(fcd->entries[i]));
if ((string == NULL) || (*string == '\0'))
return CALC_MISSING_MSG;
}
/* Check for zero interest */
switch (value)
{
case PAYMENT_PERIODS:
case PRESENT_VALUE:
case PERIODIC_PAYMENT:
case FUTURE_VALUE:
string = gtk_entry_get_text(GTK_ENTRY(fcd->entries[INTEREST_RATE]));
dvalue = xaccParseAmount(string, FALSE);
if (DEQ(dvalue, 0.0))
return CALC_INTEREST_MSG;
break;
default:
break;
}
/* Check for zero payment periods */
switch (value)
{
case INTEREST_RATE:
case PRESENT_VALUE:
case PERIODIC_PAYMENT:
case FUTURE_VALUE:
string = gtk_entry_get_text(GTK_ENTRY(fcd->entries[PAYMENT_PERIODS]));
uvalue = strtol(string, NULL, 10);
if (uvalue == 0)
return CALC_PAYMENTS_MSG;
break;
default:
break;
}
return NULL;
}
static void
calc_value(FinCalcDialog *fcd, FinCalcValue value)
{
const char *string;
if (fcd == NULL)
return;
string = can_calc_value(fcd, value);
if (string != NULL)
{
gnc_error_dialog_parented(GTK_WINDOW(fcd->dialog), string);
return;
}
gui_to_fi(fcd);
switch (value)
{
case PAYMENT_PERIODS:
N(&fcd->financial_info);
break;
case INTEREST_RATE:
I(&fcd->financial_info);
break;
case PRESENT_VALUE:
PV(&fcd->financial_info);
break;
case PERIODIC_PAYMENT:
PMT(&fcd->financial_info);
break;
case FUTURE_VALUE:
FV(&fcd->financial_info);
break;
default:
PERR("Unknown financial variable");
break;
}
fi_to_gui(fcd);
fincalc_allow_calc(fcd, FALSE);
}
static void
calc_payment_periods(GtkButton *button, FinCalcDialog *fcd)
{
calc_value(fcd, PAYMENT_PERIODS);
}
static void
calc_interest_rate(GtkButton *button, FinCalcDialog *fcd)
{
calc_value(fcd, INTEREST_RATE);
}
static void
calc_present_value(GtkButton *button, FinCalcDialog *fcd)
{
calc_value(fcd, PRESENT_VALUE);
}
static void
calc_periodic_payment(GtkButton *button, FinCalcDialog *fcd)
{
calc_value(fcd, PERIODIC_PAYMENT);
}
static void
calc_future_value(GtkButton *button, FinCalcDialog *fcd)
{
calc_value(fcd, FUTURE_VALUE);
}
FinCalcDialog *
gnc_ui_fincalc_dialog_create()
{
FinCalcDialog *fcd;
GtkObject *fcdo;
GtkWidget *button;
GtkWidget *menu;
fcd = g_new0(FinCalcDialog, 1);
fcd->dialog = create_Financial_Calculator_Dialog();
fcdo = GTK_OBJECT(fcd->dialog);
gtk_signal_connect(fcdo, "destroy",
GTK_SIGNAL_FUNC(fincalc_dialog_destroy), fcd);
fcd->entries[PAYMENT_PERIODS] = gtk_object_get_data(fcdo,
"payment_periods_entry");
gtk_signal_connect(GTK_OBJECT(fcd->entries[PAYMENT_PERIODS]), "changed",
GTK_SIGNAL_FUNC(fincalc_entry_changed), fcd);
fcd->entries[INTEREST_RATE] = gtk_object_get_data(fcdo,
"interest_rate_entry");
gtk_signal_connect(GTK_OBJECT(fcd->entries[INTEREST_RATE]), "changed",
GTK_SIGNAL_FUNC(fincalc_entry_changed), fcd);
fcd->entries[PRESENT_VALUE] = gtk_object_get_data(fcdo,
"present_value_entry");
gtk_signal_connect(GTK_OBJECT(fcd->entries[PRESENT_VALUE]), "changed",
GTK_SIGNAL_FUNC(fincalc_entry_changed), fcd);
fcd->entries[PERIODIC_PAYMENT] =
gtk_object_get_data(fcdo, "periodic_payment_entry");
gtk_signal_connect(GTK_OBJECT(fcd->entries[PERIODIC_PAYMENT]), "changed",
GTK_SIGNAL_FUNC(fincalc_entry_changed), fcd);
fcd->entries[FUTURE_VALUE] = gtk_object_get_data(fcdo,
"future_value_entry");
gtk_signal_connect(GTK_OBJECT(fcd->entries[FUTURE_VALUE]), "changed",
GTK_SIGNAL_FUNC(fincalc_entry_changed), fcd);
button = gtk_object_get_data(fcdo, "payment_periods_calc_button");
fcd->calc_buttons = g_list_prepend(fcd->calc_buttons, button);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(calc_payment_periods), fcd);
button = gtk_object_get_data(fcdo, "interest_rate_calc_button");
fcd->calc_buttons = g_list_prepend(fcd->calc_buttons, button);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(calc_interest_rate), fcd);
button = gtk_object_get_data(fcdo, "present_value_calc_button");
fcd->calc_buttons = g_list_prepend(fcd->calc_buttons, button);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(calc_present_value), fcd);
button = gtk_object_get_data(fcdo, "periodic_payment_calc_button");
fcd->calc_buttons = g_list_prepend(fcd->calc_buttons, button);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(calc_periodic_payment), fcd);
button = gtk_object_get_data(fcdo, "future_value_calc_button");
fcd->calc_buttons = g_list_prepend(fcd->calc_buttons, button);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(calc_future_value), fcd);
button = gtk_object_get_data(fcdo, "payment_periods_clear_button");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(fincalc_clear_clicked),
fcd->entries[PAYMENT_PERIODS]);
button = gtk_object_get_data(fcdo, "interest_rate_clear_button");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(fincalc_clear_clicked),
fcd->entries[INTEREST_RATE]);
button = gtk_object_get_data(fcdo, "present_value_clear_button");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(fincalc_clear_clicked),
fcd->entries[PRESENT_VALUE]);
button = gtk_object_get_data(fcdo, "periodic_payment_clear_button");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(fincalc_clear_clicked),
fcd->entries[PERIODIC_PAYMENT]);
button = gtk_object_get_data(fcdo, "future_value_clear_button");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(fincalc_clear_clicked),
fcd->entries[FUTURE_VALUE]);
menu = gtk_object_get_data(fcdo, "compounding_menu");
fcd->compounding_menu = menu;
gnc_option_menu_init(menu);
menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(menu));
gtk_container_forall(GTK_CONTAINER(menu), connect_fincalc_menu_item, fcd);
menu = gtk_object_get_data(fcdo, "payment_menu");
fcd->payment_menu = menu;
gnc_option_menu_init(menu);
menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(menu));
gtk_container_forall(GTK_CONTAINER(menu), connect_fincalc_menu_item, fcd);
button = gtk_object_get_data(fcdo, "period_payment_radio");
fcd->end_of_period_radio = button;
gtk_signal_connect(GTK_OBJECT(button), "toggled",
GTK_SIGNAL_FUNC(fincalc_radio_toggled), fcd);
button = gtk_object_get_data(fcdo, "discrete_compounding_radio");
fcd->discrete_compounding_radio = button;
gtk_signal_connect(GTK_OBJECT(button), "toggled",
GTK_SIGNAL_FUNC(fincalc_radio_toggled), fcd);
button = gtk_object_get_data(fcdo, "close_button");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(close_button_clicked), fcd);
init_fi(fcd);
fi_to_gui(fcd);
fincalc_allow_calc(fcd, FALSE);
gtk_widget_grab_focus(fcd->entries[PAYMENT_PERIODS]);
gtk_widget_show(fcd->dialog);
return fcd;
}
void
gnc_ui_fincalc_dialog_destroy(FinCalcDialog *fcd)
{
if (fcd == NULL)
return;
if (fcd->dialog != NULL)
gnome_dialog_close(GNOME_DIALOG(fcd->dialog));
}

View File

@ -0,0 +1,37 @@
/********************************************************************\
* dialog-fincalc.h : dialog for a financial calculator *
* Copyright (C) 2000 Dave Peticolas <peticola@cs.ucdavis.edu> *
* *
* 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 *
* 59 Temple Place - Suite 330 Fax: +1-617-542-2652 *
* Boston, MA 02111-1307, USA gnu@gnu.org *
\********************************************************************/
#ifndef __DIALOG_FINCALC_H_
#define __DIALOG_FINCALC_H_
#include "config.h"
#include <gnome.h>
#include "glade-gnc-dialogs.h"
typedef struct _FinCalcDialog FinCalcDialog;
FinCalcDialog * gnc_ui_fincalc_dialog_create();
void gnc_ui_fincalc_dialog_destroy(FinCalcDialog *fcd);
#endif

View File

@ -3190,14 +3190,757 @@ create_Budget_Dialog (void)
}
GtkWidget*
create_window1 (void)
create_Financial_Calculator_Dialog (void)
{
GtkWidget *window1;
GtkWidget *Financial_Calculator_Dialog;
GtkWidget *dialog_vbox10;
GtkWidget *hbox54;
GtkWidget *frame26;
GtkWidget *vbox62;
GtkWidget *vbox66;
GtkWidget *hbox46;
GtkWidget *label790;
GtkWidget *payment_periods_clear_button;
GtkWidget *payment_periods_calc_button;
GtkWidget *payment_periods_entry;
GtkWidget *vbox67;
GtkWidget *hbox55;
GtkWidget *label799;
GtkWidget *interest_rate_clear_button;
GtkWidget *interest_rate_calc_button;
GtkWidget *interest_rate_entry;
GtkWidget *vbox68;
GtkWidget *hbox56;
GtkWidget *label800;
GtkWidget *present_value_clear_button;
GtkWidget *present_value_calc_button;
GtkWidget *present_value_entry;
GtkWidget *vbox69;
GtkWidget *hbox57;
GtkWidget *label801;
GtkWidget *periodic_payment_clear_button;
GtkWidget *periodic_payment_calc_button;
GtkWidget *periodic_payment_entry;
GtkWidget *vbox70;
GtkWidget *hbox58;
GtkWidget *label802;
GtkWidget *future_value_clear_button;
GtkWidget *future_value_calc_button;
GtkWidget *future_value_entry;
GtkWidget *frame27;
GtkWidget *vbox65;
GtkWidget *hbox51;
GtkWidget *vbox63;
GtkWidget *label797;
GtkWidget *label798;
GtkWidget *vbox64;
GtkWidget *compounding_menu;
GtkWidget *compounding_menu_menu;
GtkWidget *glade_menuitem;
GtkWidget *payment_menu;
GtkWidget *payment_menu_menu;
GtkWidget *vbox71;
GSList *period_group_group = NULL;
GtkWidget *period_payment_radio;
GtkWidget *radiobutton4;
GtkWidget *vbox72;
GSList *compouding_group_group = NULL;
GtkWidget *discrete_compounding_radio;
GtkWidget *radiobutton6;
GtkWidget *dialog_action_area10;
GtkWidget *schedule_button;
GtkWidget *close_button;
GtkTooltips *tooltips;
window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_object_set_data (GTK_OBJECT (window1), "window1", window1);
gtk_window_set_title (GTK_WINDOW (window1), _("window1"));
tooltips = gtk_tooltips_new ();
return window1;
Financial_Calculator_Dialog = gnome_dialog_new (_("Financial Calculator"), NULL);
gtk_object_set_data (GTK_OBJECT (Financial_Calculator_Dialog), "Financial_Calculator_Dialog", Financial_Calculator_Dialog);
gtk_window_set_policy (GTK_WINDOW (Financial_Calculator_Dialog), TRUE, TRUE, FALSE);
dialog_vbox10 = GNOME_DIALOG (Financial_Calculator_Dialog)->vbox;
gtk_object_set_data (GTK_OBJECT (Financial_Calculator_Dialog), "dialog_vbox10", dialog_vbox10);
gtk_widget_show (dialog_vbox10);
hbox54 = gtk_hbox_new (FALSE, 0);
gtk_widget_ref (hbox54);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "hbox54", hbox54,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox54);
gtk_box_pack_start (GTK_BOX (dialog_vbox10), hbox54, TRUE, TRUE, 0);
frame26 = gtk_frame_new (NULL);
gtk_widget_ref (frame26);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "frame26", frame26,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (frame26);
gtk_box_pack_start (GTK_BOX (hbox54), frame26, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (frame26), 3);
vbox62 = gtk_vbox_new (FALSE, 6);
gtk_widget_ref (vbox62);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox62", vbox62,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox62);
gtk_container_add (GTK_CONTAINER (frame26), vbox62);
gtk_container_set_border_width (GTK_CONTAINER (vbox62), 5);
vbox66 = gtk_vbox_new (FALSE, 2);
gtk_widget_ref (vbox66);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox66", vbox66,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox66);
gtk_box_pack_start (GTK_BOX (vbox62), vbox66, TRUE, TRUE, 0);
hbox46 = gtk_hbox_new (FALSE, 6);
gtk_widget_ref (hbox46);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "hbox46", hbox46,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox46);
gtk_box_pack_start (GTK_BOX (vbox66), hbox46, TRUE, TRUE, 0);
label790 = gtk_label_new (_("Payment Periods"));
gtk_widget_ref (label790);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "label790", label790,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label790);
gtk_box_pack_start (GTK_BOX (hbox46), label790, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label790), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label790), 0.5, 0.75);
payment_periods_clear_button = gtk_button_new_with_label (_("Clear"));
gtk_widget_ref (payment_periods_clear_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "payment_periods_clear_button", payment_periods_clear_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (payment_periods_clear_button);
gtk_box_pack_end (GTK_BOX (hbox46), payment_periods_clear_button, FALSE, FALSE, 0);
gtk_tooltips_set_tip (tooltips, payment_periods_clear_button, _("Clear the entry"), NULL);
payment_periods_calc_button = gtk_button_new_with_label (_("Calculate"));
gtk_widget_ref (payment_periods_calc_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "payment_periods_calc_button", payment_periods_calc_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (payment_periods_calc_button);
gtk_box_pack_end (GTK_BOX (hbox46), payment_periods_calc_button, FALSE, FALSE, 0);
payment_periods_entry = gtk_entry_new ();
gtk_widget_ref (payment_periods_entry);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "payment_periods_entry", payment_periods_entry,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (payment_periods_entry);
gtk_box_pack_start (GTK_BOX (vbox66), payment_periods_entry, FALSE, FALSE, 0);
vbox67 = gtk_vbox_new (FALSE, 2);
gtk_widget_ref (vbox67);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox67", vbox67,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox67);
gtk_box_pack_start (GTK_BOX (vbox62), vbox67, FALSE, FALSE, 0);
hbox55 = gtk_hbox_new (FALSE, 6);
gtk_widget_ref (hbox55);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "hbox55", hbox55,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox55);
gtk_box_pack_start (GTK_BOX (vbox67), hbox55, TRUE, TRUE, 0);
label799 = gtk_label_new (_("Interest Rate"));
gtk_widget_ref (label799);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "label799", label799,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label799);
gtk_box_pack_start (GTK_BOX (hbox55), label799, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label799), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label799), 0.5, 0.75);
interest_rate_clear_button = gtk_button_new_with_label (_("Clear"));
gtk_widget_ref (interest_rate_clear_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "interest_rate_clear_button", interest_rate_clear_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (interest_rate_clear_button);
gtk_box_pack_end (GTK_BOX (hbox55), interest_rate_clear_button, FALSE, FALSE, 0);
gtk_tooltips_set_tip (tooltips, interest_rate_clear_button, _("Clear the entry"), NULL);
interest_rate_calc_button = gtk_button_new_with_label (_("Calculate"));
gtk_widget_ref (interest_rate_calc_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "interest_rate_calc_button", interest_rate_calc_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (interest_rate_calc_button);
gtk_box_pack_end (GTK_BOX (hbox55), interest_rate_calc_button, FALSE, FALSE, 0);
interest_rate_entry = gtk_entry_new ();
gtk_widget_ref (interest_rate_entry);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "interest_rate_entry", interest_rate_entry,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (interest_rate_entry);
gtk_box_pack_start (GTK_BOX (vbox67), interest_rate_entry, FALSE, FALSE, 0);
vbox68 = gtk_vbox_new (FALSE, 2);
gtk_widget_ref (vbox68);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox68", vbox68,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox68);
gtk_box_pack_start (GTK_BOX (vbox62), vbox68, TRUE, TRUE, 0);
hbox56 = gtk_hbox_new (FALSE, 6);
gtk_widget_ref (hbox56);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "hbox56", hbox56,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox56);
gtk_box_pack_start (GTK_BOX (vbox68), hbox56, TRUE, TRUE, 0);
label800 = gtk_label_new (_("Present Value"));
gtk_widget_ref (label800);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "label800", label800,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label800);
gtk_box_pack_start (GTK_BOX (hbox56), label800, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label800), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label800), 0.5, 0.75);
present_value_clear_button = gtk_button_new_with_label (_("Clear"));
gtk_widget_ref (present_value_clear_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "present_value_clear_button", present_value_clear_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (present_value_clear_button);
gtk_box_pack_end (GTK_BOX (hbox56), present_value_clear_button, FALSE, FALSE, 0);
gtk_tooltips_set_tip (tooltips, present_value_clear_button, _("Clear the entry"), NULL);
present_value_calc_button = gtk_button_new_with_label (_("Calculate"));
gtk_widget_ref (present_value_calc_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "present_value_calc_button", present_value_calc_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (present_value_calc_button);
gtk_box_pack_end (GTK_BOX (hbox56), present_value_calc_button, FALSE, FALSE, 0);
present_value_entry = gtk_entry_new ();
gtk_widget_ref (present_value_entry);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "present_value_entry", present_value_entry,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (present_value_entry);
gtk_box_pack_start (GTK_BOX (vbox68), present_value_entry, FALSE, FALSE, 0);
vbox69 = gtk_vbox_new (FALSE, 2);
gtk_widget_ref (vbox69);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox69", vbox69,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox69);
gtk_box_pack_start (GTK_BOX (vbox62), vbox69, FALSE, FALSE, 0);
hbox57 = gtk_hbox_new (FALSE, 6);
gtk_widget_ref (hbox57);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "hbox57", hbox57,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox57);
gtk_box_pack_start (GTK_BOX (vbox69), hbox57, TRUE, TRUE, 0);
label801 = gtk_label_new (_("Periodic Payment"));
gtk_widget_ref (label801);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "label801", label801,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label801);
gtk_box_pack_start (GTK_BOX (hbox57), label801, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label801), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label801), 0.5, 0.75);
periodic_payment_clear_button = gtk_button_new_with_label (_("Clear"));
gtk_widget_ref (periodic_payment_clear_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "periodic_payment_clear_button", periodic_payment_clear_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (periodic_payment_clear_button);
gtk_box_pack_end (GTK_BOX (hbox57), periodic_payment_clear_button, FALSE, FALSE, 0);
gtk_tooltips_set_tip (tooltips, periodic_payment_clear_button, _("Clear the entry"), NULL);
periodic_payment_calc_button = gtk_button_new_with_label (_("Calculate"));
gtk_widget_ref (periodic_payment_calc_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "periodic_payment_calc_button", periodic_payment_calc_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (periodic_payment_calc_button);
gtk_box_pack_end (GTK_BOX (hbox57), periodic_payment_calc_button, FALSE, FALSE, 0);
periodic_payment_entry = gtk_entry_new ();
gtk_widget_ref (periodic_payment_entry);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "periodic_payment_entry", periodic_payment_entry,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (periodic_payment_entry);
gtk_box_pack_start (GTK_BOX (vbox69), periodic_payment_entry, FALSE, FALSE, 0);
vbox70 = gtk_vbox_new (FALSE, 2);
gtk_widget_ref (vbox70);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox70", vbox70,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox70);
gtk_box_pack_start (GTK_BOX (vbox62), vbox70, TRUE, TRUE, 0);
hbox58 = gtk_hbox_new (FALSE, 6);
gtk_widget_ref (hbox58);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "hbox58", hbox58,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox58);
gtk_box_pack_start (GTK_BOX (vbox70), hbox58, TRUE, TRUE, 0);
label802 = gtk_label_new (_("Future Value"));
gtk_widget_ref (label802);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "label802", label802,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label802);
gtk_box_pack_start (GTK_BOX (hbox58), label802, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label802), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label802), 0.5, 0.75);
future_value_clear_button = gtk_button_new_with_label (_("Clear"));
gtk_widget_ref (future_value_clear_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "future_value_clear_button", future_value_clear_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (future_value_clear_button);
gtk_box_pack_end (GTK_BOX (hbox58), future_value_clear_button, FALSE, FALSE, 0);
gtk_tooltips_set_tip (tooltips, future_value_clear_button, _("Clear the entry"), NULL);
future_value_calc_button = gtk_button_new_with_label (_("Calculate"));
gtk_widget_ref (future_value_calc_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "future_value_calc_button", future_value_calc_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (future_value_calc_button);
gtk_box_pack_end (GTK_BOX (hbox58), future_value_calc_button, FALSE, FALSE, 0);
future_value_entry = gtk_entry_new ();
gtk_widget_ref (future_value_entry);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "future_value_entry", future_value_entry,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (future_value_entry);
gtk_box_pack_start (GTK_BOX (vbox70), future_value_entry, FALSE, FALSE, 0);
frame27 = gtk_frame_new (NULL);
gtk_widget_ref (frame27);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "frame27", frame27,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (frame27);
gtk_box_pack_start (GTK_BOX (hbox54), frame27, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (frame27), 3);
vbox65 = gtk_vbox_new (TRUE, 10);
gtk_widget_ref (vbox65);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox65", vbox65,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox65);
gtk_container_add (GTK_CONTAINER (frame27), vbox65);
gtk_container_set_border_width (GTK_CONTAINER (vbox65), 5);
hbox51 = gtk_hbox_new (FALSE, 3);
gtk_widget_ref (hbox51);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "hbox51", hbox51,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox51);
gtk_box_pack_start (GTK_BOX (vbox65), hbox51, FALSE, FALSE, 0);
vbox63 = gtk_vbox_new (TRUE, 2);
gtk_widget_ref (vbox63);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox63", vbox63,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox63);
gtk_box_pack_start (GTK_BOX (hbox51), vbox63, TRUE, TRUE, 0);
label797 = gtk_label_new (_("Compounding:"));
gtk_widget_ref (label797);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "label797", label797,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label797);
gtk_box_pack_start (GTK_BOX (vbox63), label797, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label797), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (label797), 1, 0.5);
label798 = gtk_label_new (_("Payments:"));
gtk_widget_ref (label798);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "label798", label798,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label798);
gtk_box_pack_start (GTK_BOX (vbox63), label798, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label798), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (label798), 1, 0.5);
vbox64 = gtk_vbox_new (TRUE, 2);
gtk_widget_ref (vbox64);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox64", vbox64,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox64);
gtk_box_pack_start (GTK_BOX (hbox51), vbox64, TRUE, TRUE, 0);
compounding_menu = gtk_option_menu_new ();
gtk_widget_ref (compounding_menu);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "compounding_menu", compounding_menu,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (compounding_menu);
gtk_box_pack_start (GTK_BOX (vbox64), compounding_menu, FALSE, FALSE, 0);
compounding_menu_menu = gtk_menu_new ();
glade_menuitem = gtk_menu_item_new_with_label (_("Annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Semi-annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Tri-annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Quarterly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Bi-monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Semi-monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Bi-weekly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Weekly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Daily (360)"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Daily (365)"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (compounding_menu_menu), glade_menuitem);
gtk_option_menu_set_menu (GTK_OPTION_MENU (compounding_menu), compounding_menu_menu);
payment_menu = gtk_option_menu_new ();
gtk_widget_ref (payment_menu);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "payment_menu", payment_menu,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (payment_menu);
gtk_box_pack_start (GTK_BOX (vbox64), payment_menu, FALSE, FALSE, 0);
payment_menu_menu = gtk_menu_new ();
glade_menuitem = gtk_menu_item_new_with_label (_("Annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Semi-annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Tri-annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Quarterly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Bi-monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Semi-monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Bi-weekly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Weekly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Daily (360)"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Daily (365)"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (payment_menu_menu), glade_menuitem);
gtk_option_menu_set_menu (GTK_OPTION_MENU (payment_menu), payment_menu_menu);
vbox71 = gtk_vbox_new (FALSE, 0);
gtk_widget_ref (vbox71);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox71", vbox71,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox71);
gtk_box_pack_start (GTK_BOX (vbox65), vbox71, FALSE, FALSE, 0);
period_payment_radio = gtk_radio_button_new_with_label (period_group_group, _("End of Period Payments"));
period_group_group = gtk_radio_button_group (GTK_RADIO_BUTTON (period_payment_radio));
gtk_widget_ref (period_payment_radio);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "period_payment_radio", period_payment_radio,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (period_payment_radio);
gtk_box_pack_start (GTK_BOX (vbox71), period_payment_radio, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (period_payment_radio), TRUE);
radiobutton4 = gtk_radio_button_new_with_label (period_group_group, _("Beginning of Period Payments"));
period_group_group = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton4));
gtk_widget_ref (radiobutton4);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "radiobutton4", radiobutton4,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (radiobutton4);
gtk_box_pack_start (GTK_BOX (vbox71), radiobutton4, FALSE, FALSE, 0);
vbox72 = gtk_vbox_new (FALSE, 0);
gtk_widget_ref (vbox72);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "vbox72", vbox72,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox72);
gtk_box_pack_start (GTK_BOX (vbox65), vbox72, TRUE, TRUE, 0);
discrete_compounding_radio = gtk_radio_button_new_with_label (compouding_group_group, _("Discrete Compounding"));
compouding_group_group = gtk_radio_button_group (GTK_RADIO_BUTTON (discrete_compounding_radio));
gtk_widget_ref (discrete_compounding_radio);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "discrete_compounding_radio", discrete_compounding_radio,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (discrete_compounding_radio);
gtk_box_pack_start (GTK_BOX (vbox72), discrete_compounding_radio, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (discrete_compounding_radio), TRUE);
radiobutton6 = gtk_radio_button_new_with_label (compouding_group_group, _("Continuous Compounding"));
compouding_group_group = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton6));
gtk_widget_ref (radiobutton6);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "radiobutton6", radiobutton6,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (radiobutton6);
gtk_box_pack_start (GTK_BOX (vbox72), radiobutton6, FALSE, FALSE, 0);
dialog_action_area10 = GNOME_DIALOG (Financial_Calculator_Dialog)->action_area;
gtk_object_set_data (GTK_OBJECT (Financial_Calculator_Dialog), "dialog_action_area10", dialog_action_area10);
gtk_widget_show (dialog_action_area10);
gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area10), GTK_BUTTONBOX_END);
gtk_button_box_set_spacing (GTK_BUTTON_BOX (dialog_action_area10), 8);
gnome_dialog_append_button (GNOME_DIALOG (Financial_Calculator_Dialog), _("Schedule"));
schedule_button = g_list_last (GNOME_DIALOG (Financial_Calculator_Dialog)->buttons)->data;
gtk_widget_ref (schedule_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "schedule_button", schedule_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (schedule_button);
GTK_WIDGET_SET_FLAGS (schedule_button, GTK_CAN_DEFAULT);
gnome_dialog_append_button (GNOME_DIALOG (Financial_Calculator_Dialog), GNOME_STOCK_BUTTON_CLOSE);
close_button = g_list_last (GNOME_DIALOG (Financial_Calculator_Dialog)->buttons)->data;
gtk_widget_ref (close_button);
gtk_object_set_data_full (GTK_OBJECT (Financial_Calculator_Dialog), "close_button", close_button,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (close_button);
GTK_WIDGET_SET_FLAGS (close_button, GTK_CAN_DEFAULT);
gtk_object_set_data (GTK_OBJECT (Financial_Calculator_Dialog), "tooltips", tooltips);
return Financial_Calculator_Dialog;
}
GtkWidget*
create_Amortization_Schedule_Dialog (void)
{
GtkWidget *Amortization_Schedule_Dialog;
GtkWidget *dialog_vbox11;
GtkWidget *hbox59;
GtkWidget *vbox73;
GtkWidget *label803;
GtkWidget *label804;
GtkWidget *label805;
GtkWidget *label806;
GtkWidget *vbox74;
GtkWidget *hbox60;
GtkWidget *hbox61;
GtkWidget *optionmenu1;
GtkWidget *optionmenu1_menu;
GtkWidget *glade_menuitem;
GtkWidget *optionmenu2;
GtkWidget *optionmenu2_menu;
GtkWidget *dialog_action_area11;
GtkWidget *button60;
GtkWidget *button61;
GtkWidget *button62;
Amortization_Schedule_Dialog = gnome_dialog_new (NULL, NULL);
gtk_object_set_data (GTK_OBJECT (Amortization_Schedule_Dialog), "Amortization_Schedule_Dialog", Amortization_Schedule_Dialog);
gtk_window_set_policy (GTK_WINDOW (Amortization_Schedule_Dialog), FALSE, FALSE, FALSE);
dialog_vbox11 = GNOME_DIALOG (Amortization_Schedule_Dialog)->vbox;
gtk_object_set_data (GTK_OBJECT (Amortization_Schedule_Dialog), "dialog_vbox11", dialog_vbox11);
gtk_widget_show (dialog_vbox11);
hbox59 = gtk_hbox_new (FALSE, 0);
gtk_widget_ref (hbox59);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "hbox59", hbox59,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox59);
gtk_box_pack_start (GTK_BOX (dialog_vbox11), hbox59, TRUE, TRUE, 0);
vbox73 = gtk_vbox_new (TRUE, 2);
gtk_widget_ref (vbox73);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "vbox73", vbox73,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox73);
gtk_box_pack_start (GTK_BOX (hbox59), vbox73, TRUE, TRUE, 0);
label803 = gtk_label_new (_("Effective Date:"));
gtk_widget_ref (label803);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "label803", label803,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label803);
gtk_box_pack_start (GTK_BOX (vbox73), label803, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label803), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (label803), 0.5, 1);
label804 = gtk_label_new (_("Initial Payment:"));
gtk_widget_ref (label804);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "label804", label804,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label804);
gtk_box_pack_start (GTK_BOX (vbox73), label804, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label804), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (label804), 0.5, 1);
label805 = gtk_label_new (_("Compounding:"));
gtk_widget_ref (label805);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "label805", label805,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label805);
gtk_box_pack_start (GTK_BOX (vbox73), label805, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label805), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (label805), 0.5, 1);
label806 = gtk_label_new (_("Payments:"));
gtk_widget_ref (label806);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "label806", label806,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (label806);
gtk_box_pack_start (GTK_BOX (vbox73), label806, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label806), GTK_JUSTIFY_RIGHT);
gtk_misc_set_alignment (GTK_MISC (label806), 0.5, 1);
vbox74 = gtk_vbox_new (TRUE, 2);
gtk_widget_ref (vbox74);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "vbox74", vbox74,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (vbox74);
gtk_box_pack_start (GTK_BOX (hbox59), vbox74, TRUE, TRUE, 0);
hbox60 = gtk_hbox_new (FALSE, 0);
gtk_widget_ref (hbox60);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "hbox60", hbox60,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox60);
gtk_box_pack_start (GTK_BOX (vbox74), hbox60, TRUE, TRUE, 0);
hbox61 = gtk_hbox_new (FALSE, 0);
gtk_widget_ref (hbox61);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "hbox61", hbox61,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (hbox61);
gtk_box_pack_start (GTK_BOX (vbox74), hbox61, TRUE, TRUE, 0);
optionmenu1 = gtk_option_menu_new ();
gtk_widget_ref (optionmenu1);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "optionmenu1", optionmenu1,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (optionmenu1);
gtk_box_pack_start (GTK_BOX (vbox74), optionmenu1, FALSE, FALSE, 0);
optionmenu1_menu = gtk_menu_new ();
glade_menuitem = gtk_menu_item_new_with_label (_("Annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Semi-annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Tri-annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Quarterly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Bi-monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Semi-monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Bi-weekly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Weekly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Daily (360)"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Daily (365)"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu1_menu), glade_menuitem);
gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu1), optionmenu1_menu);
optionmenu2 = gtk_option_menu_new ();
gtk_widget_ref (optionmenu2);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "optionmenu2", optionmenu2,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (optionmenu2);
gtk_box_pack_start (GTK_BOX (vbox74), optionmenu2, FALSE, FALSE, 0);
optionmenu2_menu = gtk_menu_new ();
glade_menuitem = gtk_menu_item_new_with_label (_("Annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Semi-annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Tri-annual"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Quarterly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Bi-monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Semi-monthly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Bi-weekly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Weekly"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Daily (360)"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
glade_menuitem = gtk_menu_item_new_with_label (_("Daily (365)"));
gtk_widget_show (glade_menuitem);
gtk_menu_append (GTK_MENU (optionmenu2_menu), glade_menuitem);
gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu2), optionmenu2_menu);
dialog_action_area11 = GNOME_DIALOG (Amortization_Schedule_Dialog)->action_area;
gtk_object_set_data (GTK_OBJECT (Amortization_Schedule_Dialog), "dialog_action_area11", dialog_action_area11);
gtk_widget_show (dialog_action_area11);
gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area11), GTK_BUTTONBOX_END);
gtk_button_box_set_spacing (GTK_BUTTON_BOX (dialog_action_area11), 8);
gnome_dialog_append_button (GNOME_DIALOG (Amortization_Schedule_Dialog), GNOME_STOCK_BUTTON_OK);
button60 = g_list_last (GNOME_DIALOG (Amortization_Schedule_Dialog)->buttons)->data;
gtk_widget_ref (button60);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "button60", button60,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (button60);
GTK_WIDGET_SET_FLAGS (button60, GTK_CAN_DEFAULT);
gnome_dialog_append_button (GNOME_DIALOG (Amortization_Schedule_Dialog), GNOME_STOCK_BUTTON_APPLY);
button61 = g_list_last (GNOME_DIALOG (Amortization_Schedule_Dialog)->buttons)->data;
gtk_widget_ref (button61);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "button61", button61,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (button61);
GTK_WIDGET_SET_FLAGS (button61, GTK_CAN_DEFAULT);
gnome_dialog_append_button (GNOME_DIALOG (Amortization_Schedule_Dialog), GNOME_STOCK_BUTTON_CANCEL);
button62 = g_list_last (GNOME_DIALOG (Amortization_Schedule_Dialog)->buttons)->data;
gtk_widget_ref (button62);
gtk_object_set_data_full (GTK_OBJECT (Amortization_Schedule_Dialog), "button62", button62,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (button62);
GTK_WIDGET_SET_FLAGS (button62, GTK_CAN_DEFAULT);
return Amortization_Schedule_Dialog;
}

View File

@ -11,4 +11,5 @@ GtkWidget* create_Print_Check_Dialog (void);
GtkWidget* create_Find_Transactions (void);
GtkWidget* create_Select_Date (void);
GtkWidget* create_Budget_Dialog (void);
GtkWidget* create_window1 (void);
GtkWidget* create_Financial_Calculator_Dialog (void);
GtkWidget* create_Amortization_Schedule_Dialog (void);

File diff suppressed because it is too large Load Diff

828
src/gnome/gtkselect.c Normal file
View File

@ -0,0 +1,828 @@
/* gtkselect - select widget for gtk+
* Copyright 1997 Paolo Molaro (from gtkcombo, where this was copied from)
* Copyright 2000 Gordon Oliver
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#include <string.h>
#include "gtk/gtkarrow.h"
#include "gtk/gtklabel.h"
#include "gtk/gtklist.h"
#include "gtk/gtkeventbox.h"
#include "gtk/gtkbutton.h"
#include "gtk/gtklistitem.h"
#include "gtk/gtkscrolledwindow.h"
#include "gtk/gtkmain.h"
#include "gtk/gtksignal.h"
#include "gtk/gtkwindow.h"
#include "gdk/gdkkeysyms.h"
#include "gtkselect.h"
#include "gtk/gtkframe.h"
#include "gtk/gtkbin.h"
#define SELECT_LIST_MAX_HEIGHT (400)
#define EMPTY_LIST_HEIGHT (15)
static void gtk_select_class_init (GtkSelectClass *klass);
static void gtk_select_init (GtkSelect *select);
static void gtk_select_destroy (GtkObject *select);
static void gtk_select_get_pos (GtkSelect *select,
gint *x,
gint *y,
gint *height,
gint *width);
static void gtk_select_popup_list (GtkSelect *select);
static void gtk_select_popup_button_press (GtkWidget *button,
GdkEventButton *event,
GtkSelect *select);
static void gtk_select_popup_button_leave (GtkWidget *button,
GdkEventCrossing *event,
GtkSelect *select);
static void gtk_select_update_entry (GtkList *list,
GtkSelect *select);
static gint gtk_select_button_press (GtkWidget *widget,
GdkEvent *event,
GtkSelect *select);
static gint gtk_select_button_release (GtkWidget *widget,
GdkEvent *event,
GtkSelect *select);
static gint gtk_select_list_enter (GtkWidget *widget,
GdkEventCrossing *event,
GtkSelect *select);
static gint gtk_select_list_key_press (GtkWidget *widget,
GdkEventKey *event,
GtkSelect *select);
//static gint gtk_select_entry_key_press (GtkEntry *widget,
// GdkEventKey *event,
// GtkSelect *select);
static void gtk_select_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static GtkHBoxClass *parent_class = NULL;
static void
gtk_select_class_init (GtkSelectClass * klass)
{
GtkObjectClass *oclass;
GtkWidgetClass *widget_class;
parent_class = gtk_type_class (gtk_hbox_get_type ());
oclass = (GtkObjectClass *) klass;
widget_class = (GtkWidgetClass *) klass;
oclass->destroy = gtk_select_destroy;
widget_class->size_allocate = gtk_select_size_allocate;
}
static void
gtk_select_destroy (GtkObject * select)
{
gtk_widget_destroy (GTK_SELECT (select)->popwin);
gtk_widget_unref (GTK_SELECT (select)->popwin);
gtk_widget_unref (GTK_SELECT (select)->empty);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(*GTK_OBJECT_CLASS (parent_class)->destroy) (select);
}
#if 0
static int
gtk_select_entry_key_press (GtkEntry * entry, GdkEventKey * event, GtkSelect * select)
{
GList *li;
return FALSE;
if (!select->use_arrows || !GTK_LIST (select->list)->children)
return FALSE;
li = NULL;
//li = g_list_find (GTK_LIST (select->list)->children, gtk_select_find (select));
if ((event->keyval == GDK_Up)
|| (event->keyval == GDK_KP_Up)
|| ((event->state & GDK_MOD1_MASK) && ((event->keyval == 'p') || (event->keyval == 'P'))))
{
if (li)
li = li->prev;
if (!li && select->use_arrows_always)
{
li = g_list_last (GTK_LIST (select->list)->children);
}
if (li)
{
gtk_list_select_child (GTK_LIST (select->list), GTK_WIDGET (li->data));
gtk_signal_emit_stop_by_name (GTK_OBJECT (entry), "key_press_event");
return TRUE;
}
}
else if ((event->keyval == GDK_Down)
|| (event->keyval == GDK_KP_Down)
|| ((event->state & GDK_MOD1_MASK) && ((event->keyval == 'n') || (event->keyval == 'N'))))
{
if (li)
li = li->next;
if (!li && select->use_arrows_always)
{
li = GTK_LIST (select->list)->children;
}
if (li)
{
gtk_list_select_child (GTK_LIST (select->list), GTK_WIDGET (li->data));
gtk_signal_emit_stop_by_name (GTK_OBJECT (entry), "key_press_event");
return TRUE;
}
}
return FALSE;
}
#endif
static void
gtk_select_get_pos (GtkSelect * select, gint * x, gint * y, gint * height, gint * width)
{
GtkBin *popwin;
GtkWidget *widget;
GtkScrolledWindow *popup;
gint real_height;
GtkRequisition list_requisition;
gboolean show_hscroll = FALSE;
gboolean show_vscroll = FALSE;
gint avail_height;
gint min_height;
gint alloc_width;
gint work_height;
gint old_height;
gint old_width;
widget = GTK_WIDGET(select);
popup = GTK_SCROLLED_WINDOW (select->popup);
popwin = GTK_BIN (select->popwin);
gdk_window_get_origin (select->entry->window, x, y);
real_height = MIN (select->entry->requisition.height,
select->entry->allocation.height);
*y += real_height;
avail_height = gdk_screen_height () - *y;
gtk_widget_size_request (select->list, &list_requisition);
min_height = MIN (list_requisition.height,
popup->vscrollbar->requisition.height);
if (!GTK_LIST (select->list)->children)
list_requisition.height += EMPTY_LIST_HEIGHT;
alloc_width = (widget->allocation.width -
2 * popwin->child->style->klass->xthickness -
2 * GTK_CONTAINER (popwin->child)->border_width -
2 * GTK_CONTAINER (select->popup)->border_width -
2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width -
2 * GTK_BIN (popup)->child->style->klass->xthickness);
work_height = (2 * popwin->child->style->klass->ythickness +
2 * GTK_CONTAINER (popwin->child)->border_width +
2 * GTK_CONTAINER (select->popup)->border_width +
2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width +
2 * GTK_BIN (popup)->child->style->klass->xthickness);
do
{
old_width = alloc_width;
old_height = work_height;
if (!show_hscroll &&
alloc_width < list_requisition.width)
{
work_height += popup->hscrollbar->requisition.height +
GTK_SCROLLED_WINDOW_CLASS
(GTK_OBJECT (select->popup)->klass)->scrollbar_spacing;
show_hscroll = TRUE;
}
if (!show_vscroll &&
work_height + list_requisition.height > avail_height)
{
if (work_height + min_height > avail_height &&
*y - real_height > avail_height)
{
*y -= (work_height + list_requisition.height + real_height);
break;
}
alloc_width -=
popup->vscrollbar->requisition.width +
GTK_SCROLLED_WINDOW_CLASS
(GTK_OBJECT (select->popup)->klass)->scrollbar_spacing;
show_vscroll = TRUE;
}
} while (old_width != alloc_width || old_height != work_height);
*width = widget->allocation.width;
if (show_vscroll)
*height = avail_height;
else
*height = work_height + list_requisition.height;
if (*x < 0)
*x = 0;
}
static void
gtk_select_popup_list (GtkSelect * select)
{
gint height, width, x, y;
gint old_width, old_height;
old_width = select->popwin->allocation.width;
old_height = select->popwin->allocation.height;
gtk_select_get_pos (select, &x, &y, &height, &width);
/* workaround for gtk_scrolled_window_size_allocate bug */
if (old_width != width || old_height != height)
{
gtk_widget_hide (GTK_SCROLLED_WINDOW (select->popup)->hscrollbar);
gtk_widget_hide (GTK_SCROLLED_WINDOW (select->popup)->vscrollbar);
}
gtk_widget_set_uposition (select->popwin, x, y);
gtk_widget_set_usize (select->popwin, width, height);
gtk_widget_realize (select->popwin);
gdk_window_resize (select->popwin->window, width, height);
gtk_widget_show (select->popwin);
gtk_widget_grab_focus (select->popwin);
}
static void
gtk_select_popup_button_press (GtkWidget *button,
GdkEventButton *event,
GtkSelect *select)
{
if (!GTK_WIDGET_HAS_FOCUS (select->entry))
gtk_widget_grab_focus (select->entry);
if (!select->current_button && (event->button == 1))
gtk_select_popup_list (select);
select->current_button = event->button;
GTK_LIST (select->list)->drag_selection = TRUE;
gdk_pointer_grab (select->list->window, TRUE,
GDK_POINTER_MOTION_HINT_MASK |
GDK_BUTTON1_MOTION_MASK |
GDK_BUTTON_RELEASE_MASK,
NULL, NULL, event->time);
gtk_grab_add (select->list);
}
static void
gtk_select_popup_button_leave (GtkWidget *button,
GdkEventCrossing *event,
GtkSelect *select)
{
if (select->current_button)
gtk_signal_emit_stop_by_name (GTK_OBJECT (button), "leave_notify_event");
}
static void
gtk_select_update_entry (GtkList * list, GtkSelect * select)
{
GtkWidget *selected;
GtkWidget *old_selected;
GList *items;
int posn;
gtk_grab_remove (GTK_WIDGET (select));
gtk_signal_handler_block (GTK_OBJECT (list), select->list_change_id);
if (list->selection) {
selected = list->selection->data;
old_selected = select->selected;
if (old_selected) {
items = g_list_append(NULL, old_selected);
posn = g_list_index(select->entries, old_selected);
gtk_widget_ref(old_selected);
gtk_container_remove(GTK_CONTAINER(select->entry), old_selected);
if (old_selected != select->empty)
gtk_list_insert_items(list, items, posn);
gtk_widget_unref(old_selected);
} else {
gtk_container_remove(GTK_CONTAINER(select->entry), select->empty);
}
if (selected) {
select->selected = selected;
items = g_list_append(NULL, selected);
gtk_widget_ref(selected);
gtk_list_remove_items(list, items);
gtk_container_add(GTK_CONTAINER(select->entry), selected);
gtk_widget_unref(selected);
} else {
gtk_container_add(GTK_CONTAINER(select->entry), select->empty);
select->selected = NULL;
}
}
gtk_signal_handler_unblock (GTK_OBJECT (list), select->list_change_id);
}
static gint
gtk_select_button_press (GtkWidget * widget, GdkEvent * event, GtkSelect * select)
{
GtkWidget *child;
child = gtk_get_event_widget (event);
/* We don't ask for button press events on the grab widget, so
* if an event is reported directly to the grab widget, it must
* be on a window outside the application (and thus we remove
* the popup window). Otherwise, we check if the widget is a child
* of the grab widget, and only remove the popup window if it
* is not.
*/
if (child != widget)
{
while (child)
{
if (child == widget)
return FALSE;
child = child->parent;
}
}
gtk_widget_hide (select->popwin);
gtk_grab_remove (select->popwin);
gdk_pointer_ungrab (event->button.time);
return TRUE;
}
static gint
gtk_select_button_release (GtkWidget * widget, GdkEvent * event, GtkSelect * select)
{
GtkWidget *child;
if ((select->current_button != 0) && (event->button.button == 1))
{
/* This was the initial button press */
GdkEventCrossing tmp_event;
select->current_button = 0;
if (widget != select->button)
gtk_widget_event (select->button, event);
/* Un-pre-hightlight */
tmp_event.type = GDK_LEAVE_NOTIFY;
tmp_event.window = select->button->window;
tmp_event.send_event = TRUE;
tmp_event.subwindow = NULL;
tmp_event.detail = GDK_NOTIFY_ANCESTOR;
gtk_widget_event (select->button, (GdkEvent *)&tmp_event);
/* Check to see if we released inside the button */
child = gtk_get_event_widget ((GdkEvent*) event);
while (child && child != (select->button))
child = child->parent;
if (child == select->button)
{
gtk_grab_add (select->popwin);
gdk_pointer_grab (select->popwin->window, TRUE,
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
GDK_POINTER_MOTION_MASK,
NULL, NULL, GDK_CURRENT_TIME);
return FALSE;
}
}
else
{
/* The user has clicked inside the popwin and released */
if (GTK_WIDGET_HAS_GRAB (select->popwin))
{
gtk_grab_remove (select->popwin);
gdk_pointer_ungrab (event->button.time);
}
}
gtk_widget_hide (select->popwin);
return TRUE;
}
static gint
gtk_select_list_enter (GtkWidget *widget,
GdkEventCrossing *event,
GtkSelect *select)
{
GtkWidget *event_widget;
event_widget = gtk_get_event_widget ((GdkEvent*) event);
if ((event_widget == select->list) &&
(select->current_button != 0) &&
(!GTK_WIDGET_HAS_GRAB (select->list)))
{
GdkEvent tmp_event;
gint x, y;
GdkModifierType mask;
gtk_grab_remove (select->popwin);
/* Transfer the grab over to the list by synthesizing
* a button press event
*/
gdk_window_get_pointer (select->list->window, &x, &y, &mask);
tmp_event.button.type = GDK_BUTTON_PRESS;
tmp_event.button.window = select->list->window;
tmp_event.button.send_event = TRUE;
tmp_event.button.time = GDK_CURRENT_TIME; /* bad */
tmp_event.button.x = x;
tmp_event.button.y = y;
/* We leave all the XInput fields unfilled here, in the expectation
* that GtkList doesn't care.
*/
tmp_event.button.button = select->current_button;
tmp_event.button.state = mask;
gtk_widget_event (select->list, &tmp_event);
}
return FALSE;
}
static int
gtk_select_list_key_press (GtkWidget * widget, GdkEventKey * event, GtkSelect * select)
{
if (event->keyval == GDK_Escape)
{
if (GTK_WIDGET_HAS_GRAB (select->popwin))
{
gtk_grab_remove (select->popwin);
gdk_pointer_ungrab (GDK_CURRENT_TIME);
}
else if (GTK_WIDGET_HAS_GRAB (select->list))
gtk_list_end_drag_selection (GTK_LIST (select->list));
gtk_widget_hide (select->popwin);
if (GTK_WIDGET_HAS_GRAB (select->button))
{
select->current_button = 0;
GTK_BUTTON (select->button)->in_button = FALSE;
gtk_button_released (GTK_BUTTON (select->button));
gtk_grab_remove (select->button);
}
return TRUE;
}
return FALSE;
}
static void
gtk_select_init (GtkSelect * select)
{
GtkWidget *arrow;
GtkWidget *frame;
GtkWidget *event_box;
GdkCursor *cursor;
select->use_arrows = 1;
select->entry = gtk_event_box_new ();
select->button = gtk_button_new ();
select->current_button = 0;
select->empty = gtk_label_new ("");
select->entries = NULL;
select->selected = NULL;
arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
gtk_widget_show (arrow);
gtk_widget_ref(select->empty);
gtk_widget_show (select->empty);
gtk_container_add(GTK_CONTAINER(select->entry), select->empty);
gtk_container_add (GTK_CONTAINER (select->button), arrow);
gtk_box_pack_start (GTK_BOX (select), select->entry, TRUE, TRUE, 0);
gtk_box_pack_end (GTK_BOX (select), select->button, FALSE, FALSE, 0);
GTK_WIDGET_UNSET_FLAGS (select->button, GTK_CAN_FOCUS);
gtk_widget_show (select->entry);
gtk_widget_show (select->button);
// gtk_signal_connect (GTK_OBJECT (select->entry), "key_press_event",
// (GtkSignalFunc) gtk_select_entry_key_press, select);
gtk_signal_connect_after (GTK_OBJECT (select->button), "button_press_event",
(GtkSignalFunc) gtk_select_popup_button_press, select);
/*gtk_signal_connect_after (GTK_OBJECT (select->button), "button_release_event",
(GtkSignalFunc) gtk_select_button_release, select);*/
gtk_signal_connect (GTK_OBJECT (select->button), "leave_notify_event",
(GtkSignalFunc) gtk_select_popup_button_leave, select);
/*gtk_signal_connect(GTK_OBJECT(select->button), "clicked",
(GtkSignalFunc)prelight_bug, select); */
select->popwin = gtk_window_new (GTK_WINDOW_POPUP);
gtk_widget_ref (select->popwin);
gtk_window_set_policy (GTK_WINDOW (select->popwin), 1, 1, 0);
gtk_widget_set_events (select->popwin, GDK_KEY_PRESS_MASK);
event_box = gtk_event_box_new ();
gtk_container_add (GTK_CONTAINER (select->popwin), event_box);
gtk_widget_show (event_box);
gtk_widget_realize (event_box);
cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW);
gdk_window_set_cursor (event_box->window, cursor);
gdk_cursor_destroy (cursor);
frame = gtk_frame_new (NULL);
gtk_container_add (GTK_CONTAINER (event_box), frame);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
gtk_widget_show (frame);
select->popup = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (select->popup),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (select->popup)->hscrollbar, GTK_CAN_FOCUS);
GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (select->popup)->vscrollbar, GTK_CAN_FOCUS);
gtk_container_add (GTK_CONTAINER (frame), select->popup);
gtk_widget_show (select->popup);
select->list = gtk_list_new ();
/* We'll use enter notify events to figure out when to transfer
* the grab to the list
*/
gtk_widget_set_events (select->list, GDK_ENTER_NOTIFY_MASK);
gtk_list_set_selection_mode(GTK_LIST(select->list), GTK_SELECTION_SINGLE);
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (select->popup), select->list);
gtk_container_set_focus_vadjustment (GTK_CONTAINER (select->list),
gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (select->popup)));
gtk_container_set_focus_hadjustment (GTK_CONTAINER (select->list),
gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (select->popup)));
gtk_widget_show (select->list);
select->list_change_id = gtk_signal_connect (GTK_OBJECT (select->list),
"selection_changed",
(GtkSignalFunc) gtk_select_update_entry, select);
gtk_signal_connect (GTK_OBJECT (select->popwin), "key_press_event",
(GtkSignalFunc) gtk_select_list_key_press, select);
gtk_signal_connect (GTK_OBJECT (select->popwin), "button_press_event",
GTK_SIGNAL_FUNC (gtk_select_button_press), select);
gtk_signal_connect_after (GTK_OBJECT (select->list), "button_release_event",
GTK_SIGNAL_FUNC (gtk_select_button_release), select);
/* We connect here on the button, because we'll have a grab on it
* when the event occurs. But we are actually interested in enters
* for the select->list.
*/
gtk_signal_connect (GTK_OBJECT (select->button), "enter_notify_event",
GTK_SIGNAL_FUNC (gtk_select_list_enter), select);
}
guint
gtk_select_get_type (void)
{
static guint select_type = 0;
if (!select_type)
{
static const GtkTypeInfo select_info =
{
"GtkSelect",
sizeof (GtkSelect),
sizeof (GtkSelectClass),
(GtkClassInitFunc) gtk_select_class_init,
(GtkObjectInitFunc) gtk_select_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL,
};
select_type = gtk_type_unique (gtk_hbox_get_type (), &select_info);
}
return select_type;
}
GtkWidget *
gtk_select_new (void)
{
return GTK_WIDGET (gtk_type_new (gtk_select_get_type ()));
}
void
gtk_select_set_use_arrows (GtkSelect * select, gint val)
{
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
select->use_arrows = val;
}
static void
gtk_select_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
GtkSelect *select;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_SELECT (widget));
g_return_if_fail (allocation != NULL);
GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation);
select = GTK_SELECT (widget);
if (select->entry->allocation.height > select->entry->requisition.height)
{
GtkAllocation button_allocation;
button_allocation = select->button->allocation;
button_allocation.height = select->entry->requisition.height;
button_allocation.y = select->entry->allocation.y +
(select->entry->allocation.height - select->entry->requisition.height)
/ 2;
gtk_widget_size_allocate (select->button, &button_allocation);
}
}
void
gtk_select_disable_activate (GtkSelect* select)
{
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
}
static GList *
g_list_insert_list(GList *list, GList *items, gint position)
{
GList *at;
GList *last;
int ll;
if (!items) {
return list;
}
ll = g_list_length(list);
if (ll <= position) {
return g_list_concat(list, items);
}
if (position == 0) {
return g_list_concat(items, list);
}
at = g_list_nth(list, position - 1);
last = g_list_last(items);
last->next = at->next;
if (at->next) {
at->next->prev = last;
}
at->next = items;
items->prev = at;
return list;
}
void
gtk_select_insert_items (GtkSelect *select, GList *items, gint position)
{
GList *copy;
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
copy = g_list_copy(items);
select->entries = g_list_insert_list(select->entries, items, position);
gtk_list_insert_items(GTK_LIST(select->list), copy, position);
}
void
gtk_select_append_items (GtkSelect *select, GList *items)
{
GList *copy;
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
copy = g_list_copy(items);
select->entries = g_list_concat(select->entries, items);
gtk_list_append_items(GTK_LIST(select->list), copy);
}
void
gtk_select_prepend_items (GtkSelect *select, GList *items)
{
GList *copy;
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
copy = g_list_copy(items);
select->entries = g_list_concat(items, select->entries);
gtk_list_prepend_items(GTK_LIST(select->list), copy);
}
void
gtk_select_remove_items_internal (GtkSelect *select, GList *items,
gboolean unref)
{
GList *loop;
int do_free = 0;;
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
for (loop = items; loop; loop = loop->next) {
select->entries = g_list_remove(select->entries, loop->data);
}
if (select->selected && g_list_find(items, select->selected)) {
items = g_list_copy(items);
items = g_list_remove(items, select->selected);
do_free = 1;
if (!unref)
gtk_widget_ref(select->selected);
gtk_container_remove(GTK_CONTAINER(select->entry), select->selected);
gtk_container_add(GTK_CONTAINER(select->entry), select->empty);
select->selected = NULL;
}
if (unref)
gtk_list_remove_items(GTK_LIST(select->list), items);
else
gtk_list_remove_items_no_unref(GTK_LIST(select->list), items);
if (do_free)
g_list_free(items);
}
void
gtk_select_remove_items (GtkSelect *select, GList *items)
{
gtk_select_remove_items_internal(select, items, TRUE);
}
void
gtk_select_clear_items (GtkSelect *select, gint start, gint end)
{
GList *sptr, *eptr;
int len;
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
if (select->entries == NULL) {
return;
}
len = g_list_length(select->entries);
if (end > len)
end = len;
if (start > end)
return;
sptr = g_list_nth(select->entries, start);
eptr = g_list_nth(select->entries, end);
if (sptr->prev)
sptr->prev->next = eptr;
if (eptr && eptr->prev)
eptr->prev->next = NULL;
if (eptr)
eptr->prev = sptr->prev;
if (sptr == select->entries)
select->entries = eptr;
if (select->selected && g_list_find(sptr, select->selected)) {
gtk_container_remove(GTK_CONTAINER(select->entry), select->selected);
gtk_container_add(GTK_CONTAINER(select->entry), select->empty);
select->selected = NULL;
}
gtk_list_remove_items(GTK_LIST(select->list), sptr);
g_list_free(sptr);
}
void
gtk_select_select_item (GtkSelect *select, gint item)
{
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
gtk_list_select_item(GTK_LIST(select->list), item);
}
void
gtk_select_select_child (GtkSelect *select, GtkWidget *child)
{
g_return_if_fail (select != NULL);
g_return_if_fail (GTK_IS_SELECT (select));
gtk_list_select_child(GTK_LIST(select->list), child);
}
gint
gtk_select_child_position (GtkSelect *select, GtkWidget *child)
{
g_return_val_if_fail (select != NULL, -1);
g_return_val_if_fail (GTK_IS_SELECT (select), -1);
return g_list_index(select->entries, child);
}

115
src/gnome/gtkselect.h Normal file
View File

@ -0,0 +1,115 @@
/* gtkselect - select widget for gtk+
* Copyright 1997 Paolo Molaro (from gtkcombo, where this was copied from)
* Copyright 2000 Gordon Oliver
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#ifndef __GTK_SMART_SELECT_H__
#define __GTK_SMART_SELECT_H__
#include <gtk/gtkhbox.h>
#include <gtk/gtkitem.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define GTK_SELECT(obj) GTK_CHECK_CAST (obj, gtk_select_get_type (), GtkSelect)
#define GTK_SELECT_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_select_get_type (), GtkSelectClass)
#define GTK_IS_SELECT(obj) GTK_CHECK_TYPE (obj, gtk_select_get_type ())
typedef struct _GtkSelect GtkSelect;
typedef struct _GtkSelectClass GtkSelectClass;
/* you should access only the selected field directly */
struct _GtkSelect {
GtkHBox hbox;
GtkWidget *selected;
GtkWidget *entry;
GtkWidget *button;
GtkWidget *popup;
GtkWidget *popwin;
GtkWidget *list;
GtkWidget *empty;
GList *entries;
guint entry_change_id;
guint list_change_id;
guint use_arrows:1;
guint16 current_button;
guint activate_id;
};
struct _GtkSelectClass {
GtkHBoxClass parent_class;
};
guint gtk_select_get_type (void);
GtkWidget *gtk_select_new (void);
/* set/unset arrows working for changing the value (can be annoying */
void gtk_select_set_use_arrows (GtkSelect* select,
gint val);
void gtk_select_disable_activate (GtkSelect* select);
void gtk_select_insert_items (GtkSelect *select,
GList *items,
gint position);
void gtk_select_append_items (GtkSelect *select,
GList *items);
void gtk_select_prepend_items (GtkSelect *select,
GList *items);
void gtk_select_remove_items (GtkSelect *list,
GList *items);
void gtk_select_remove_items_no_unref (GtkSelect *list,
GList *items);
void gtk_select_clear_items (GtkSelect *list,
gint start,
gint end);
void gtk_select_select_item (GtkSelect *list,
gint item);
void gtk_select_select_child (GtkSelect *list,
GtkWidget *child);
gint gtk_select_child_position (GtkSelect *list,
GtkWidget *child);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __GTK_SMART_SELECT_H__ */

View File

@ -51,6 +51,7 @@
#include "dialog-transfer.h"
#include "dialog-edit.h"
#include "dialog-qif-import.h"
#include "dialog-fincalc.h"
#include "dialog-find-transactions.h"
#include "dialog-totd.h"
#include "file-history.h"
@ -59,6 +60,8 @@
#include "util.h"
#include "gnc.h"
#include "gtkselect.h"
/* This static indicates the debugging module that this .o belongs to. */
static short module = MOD_GUI;
@ -73,6 +76,160 @@ enum {
FMB_QUIT,
};
/*
* An accumulator for a given currency.
*
* This is used during the update to the status bar to contain the
* accumulation for a single currency. These are placed in a GList and
* kept around for the duration of the calcualtion. There may, in fact
* be better ways to do this, but none occurred...
*/
struct _GNCCurrencyAcc {
const char *currency;
double assets;
double profits;
};
typedef struct _GNCCurrencyAcc GNCCurrencyAcc;
/*
* An item to appear in the selector box in the status bar.
*
* This is maintained for the duration, where there is one per currency,
* plus (eventually) one for the default currency accumulation (like the
* EURO
*/
struct _GNCCurrencyItem {
const char *currency;
GtkWidget *listitem;
GtkWidget *assets_label;
GtkWidget *profits_label;
gint touched:1;
};
typedef struct _GNCCurrencyItem GNCCurrencyItem;
/*
* Build a single currency item.
*
* This function handles the building of a single currency item for the
* selector. It looks like the old code in the update function, but now
* only handles a single currency.
*/
GNCCurrencyItem *
gnc_ui_build_currency_item(const char *currency)
{
GtkWidget *label;
GtkWidget *topbox;
GtkWidget *hbox;
GtkWidget *listitem;
GNCCurrencyItem *item = g_new0(GNCCurrencyItem, 1);
item->currency = currency;
listitem = gtk_list_item_new();
item->listitem = listitem;
topbox = gtk_hbox_new(FALSE, 2);
gtk_widget_show(topbox);
gtk_container_add(GTK_CONTAINER(listitem), topbox);
hbox = gtk_hbox_new(FALSE, 2);
gtk_widget_show(hbox);
gtk_box_pack_end(GTK_BOX(topbox), hbox, FALSE, FALSE, 5);
label = gtk_label_new(currency);
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
label = gtk_label_new(ASSETS_C_STR);
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
label = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
item->assets_label = label;
hbox = gtk_hbox_new(FALSE, 2);
gtk_widget_show(hbox);
gtk_box_pack_end(GTK_BOX(topbox), hbox, FALSE, FALSE, 5);
label = gtk_label_new(PROFITS_C_STR);
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
label = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
item->profits_label = label;
gtk_widget_show(item->listitem);
return item;
}
/*
* Get a currency accumulator.
*
* This will search the given list, and if no accumulator is found, wil
* allocate a fresh one. This may cause problems with currencies that have
* the same name... let the buyer beware.
*/
static GNCCurrencyAcc *
gnc_ui_get_currency_accumulator(GList **list, const char *currency)
{
GList *current;
GNCCurrencyAcc *found;
for (current = g_list_first(*list); current; current = g_list_next(current)) {
found = current->data;
if (strcmp(found->currency, currency) == 0) {
return found;
}
}
found = g_new0(GNCCurrencyAcc, 1);
found->currency = currency;
found->assets = 0.0;
found->profits = 0.0;
*list = g_list_append(*list, found);
return found;
}
/*
* Get a currency item.
*
* This will search the given list, and if no accumulator is found, wil
* create a fresh one. This may cause problems with currencies that have
* the same name... let the buyer beware.
*
* It looks just like the function above, with some extra stuff to get the
* item into the list.
*/
static GNCCurrencyItem *
gnc_ui_get_currency_item(GList **list, const char *currency, GtkWidget *holder)
{
GList *current;
GNCCurrencyItem *found;
for (current = g_list_first(*list); current; current = g_list_next(current)) {
found = current->data;
if (strcmp(found->currency, currency) == 0) {
return found;
}
}
found = gnc_ui_build_currency_item(currency);
*list = g_list_append(*list, found);
current = g_list_append(NULL, found->listitem);
gtk_select_append_items(GTK_SELECT(holder), current);
return found;
}
/* The gnc_ui_refresh_statusbar() subroutine redraws
* the statusbar at the bottom of the main window. The statusbar
* includes two fields, titled 'profits' and 'assets'. The total
@ -82,11 +239,8 @@ enum {
* using the equity account type correctly (which is not likely).
* Thus we show the sum of assets, rather than the sum of equities.
*
* hack alert XXX this routine rather incorrectly sums together
* account types even if they are of different currencies. In fact,
* it should check the currency types, and keep separate, distinct
* balances for each currency, and report each of those indivudually.
* Or something like that.
* hack alert XXX
* The worst is gone, but the euro needs fixing.
*
* Note the 'convert-to-euro' is a kind of a hack to work around this
* bug: basically, any/all currencies are converted to the euro, and
@ -98,10 +252,6 @@ static void
gnc_ui_refresh_statusbar (void)
{
GNCMainInfo *main_info;
double assets = 0.0;
double profits = 0.0;
double euro_assets = 0.0;
double euro_profits = 0.0;
double amount;
AccountGroup *group;
AccountGroup *children;
@ -111,9 +261,18 @@ gnc_ui_refresh_statusbar (void)
int num_accounts;
int account_type;
const char *account_currency;
const char *default_currency;
GNCCurrencyAcc *currency_accum;
GNCCurrencyAcc *euro_accum = NULL;
GNCCurrencyItem *currency_item;
GList *currency_list;
GList *current;
gboolean euro;
int i;
default_currency = gnc_lookup_string_option("International",
"Default Currency",
"USD");
euro = gnc_lookup_boolean_option("International",
"Enable EURO support",
FALSE);
@ -122,6 +281,11 @@ gnc_ui_refresh_statusbar (void)
if (main_info == NULL)
return;
currency_list = NULL;
if (euro) {
euro_accum = gnc_ui_get_currency_accumulator(&currency_list ,"EURO");
}
group = gncGetCurrentGroup ();
num_accounts = xaccGroupGetNumAccounts(group);
for (i = 0; i < num_accounts; i++)
@ -131,6 +295,8 @@ gnc_ui_refresh_statusbar (void)
account_type = xaccAccountGetType(account);
account_currency = xaccAccountGetCurrency(account);
children = xaccAccountGetChildren(account);
currency_accum = gnc_ui_get_currency_accumulator(&currency_list,
account_currency);
switch (account_type)
{
@ -145,10 +311,10 @@ gnc_ui_refresh_statusbar (void)
if (children != NULL)
amount += xaccGroupGetBalance(children);
assets += amount;
if(euro)
currency_accum->assets += amount;
if(euro && euro_accum != currency_accum)
{
euro_assets += gnc_convert_to_euro(account_currency, amount);
euro_accum->assets += gnc_convert_to_euro(account_currency, amount);
}
break;
case INCOME:
@ -157,10 +323,10 @@ gnc_ui_refresh_statusbar (void)
if (children != NULL)
amount += xaccGroupGetBalance(children);
profits -= amount;
if(euro)
currency_accum->profits -= amount;
if(euro && euro_accum != currency_accum)
{
euro_profits -= gnc_convert_to_euro(account_currency, amount);
euro_accum->profits += gnc_convert_to_euro(account_currency, amount);
}
break;
case EQUITY:
@ -172,25 +338,53 @@ gnc_ui_refresh_statusbar (void)
}
}
xaccSPrintAmount(asset_string, assets, PRTSYM | PRTSEP, NULL);
if(euro)
{
strcat(asset_string, " / ");
xaccSPrintAmount(asset_string + strlen(asset_string), euro_assets,
PRTSYM | PRTSEP | PRTEUR, NULL);
}
gtk_label_set_text(GTK_LABEL(main_info->assets_label), asset_string);
gnc_set_label_color(main_info->assets_label, assets);
xaccSPrintAmount(profit_string, profits, PRTSYM | PRTSEP, NULL);
if(euro)
{
strcat(profit_string, " / ");
xaccSPrintAmount(profit_string + strlen(profit_string), euro_profits,
PRTSYM | PRTSEP | PRTEUR, NULL);
for (current = g_list_first(main_info->totals_list); current;
current = g_list_next(current)) {
currency_item = current->data;
currency_item->touched = 0;
}
for (current = g_list_first(currency_list); current;
current = g_list_next(current)) {
currency_accum = current->data;
currency_item = gnc_ui_get_currency_item(&main_info->totals_list,
currency_accum->currency,
main_info->totals_combo);
currency_item->touched = 1;
xaccSPrintAmount(asset_string, currency_accum->assets,
PRTSYM | PRTSEP, currency_accum->currency);
gtk_label_set_text(GTK_LABEL(currency_item->assets_label), asset_string);
gnc_set_label_color(currency_item->assets_label, currency_accum->assets);
xaccSPrintAmount(profit_string, currency_accum->profits,
PRTSYM | PRTSEP, currency_accum->currency);
gtk_label_set_text(GTK_LABEL(currency_item->profits_label), profit_string);
gnc_set_label_color(currency_item->profits_label, currency_accum->profits);
g_free(currency_accum);
}
if (currency_list)
g_list_free(currency_list);
currency_list = NULL;
current = g_list_first(main_info->totals_list);
while (current) {
GList *next = current->next;
currency_item = current->data;
if (currency_item->touched == 0
&& strcmp(currency_item->currency, default_currency) != 0) {
currency_list = g_list_append(currency_list, currency_item->listitem);
main_info->totals_list = g_list_remove_link(main_info->totals_list,
current);
g_list_free_1(current);
g_free(currency_item);
}
current = next;
}
if (currency_list) {
gtk_select_remove_items(GTK_SELECT(main_info->totals_combo), currency_list);
g_list_free(currency_list);
}
gtk_label_set_text(GTK_LABEL(main_info->profits_label), profit_string);
gnc_set_label_color(main_info->profits_label, profits);
}
static void
@ -488,6 +682,12 @@ gnc_ui_filemenu_cb(GtkWidget *widget, gpointer menuItem)
}
}
static void
gnc_ui_mainWindow_fincalc_cb(GtkWidget *widget, gpointer data)
{
gnc_ui_fincalc_dialog_create();
}
static gboolean
gnc_ui_mainWindow_delete_cb(GtkWidget *widget,
GdkEvent *event,
@ -685,14 +885,16 @@ gnc_configure_account_tree(void *data)
else if (safe_strcmp(node->data, "balance") == 0)
{
new_avi.show_field[ACCOUNT_BALANCE] = TRUE;
if(gnc_lookup_boolean_option("International", "Enable EURO support", FALSE))
if(gnc_lookup_boolean_option("International",
"Enable EURO support", FALSE))
new_avi.show_field[ACCOUNT_BALANCE_EURO] = TRUE;
}
else if (safe_strcmp(node->data, "total") == 0)
{
new_avi.show_field[ACCOUNT_TOTAL] = TRUE;
if(gnc_lookup_boolean_option("International", "Enable EURO support", FALSE))
if(gnc_lookup_boolean_option("International",
"Enable EURO support", FALSE))
new_avi.show_field[ACCOUNT_TOTAL_EURO] = TRUE;
}
}
@ -950,7 +1152,18 @@ gnc_main_create_menus(GnomeApp *app, GtkWidget *account_tree,
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_SUBTREE(SCRUB_MENU_STR_N, scrubmenu),
GNOMEUIINFO_END
};
};
static GnomeUIInfo toolsmenu[] = {
{
GNOME_APP_UI_ITEM,
FIN_CALC_STR_N, TOOLTIP_FIN_CALC_N,
gnc_ui_mainWindow_fincalc_cb, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
GNOMEUIINFO_END
};
static GnomeUIInfo helpmenu[] = {
{
@ -976,6 +1189,7 @@ gnc_main_create_menus(GnomeApp *app, GtkWidget *account_tree,
static GnomeUIInfo mainmenu[] = {
GNOMEUIINFO_MENU_FILE_TREE(filemenu),
GNOMEUIINFO_SUBTREE(ACCOUNTS_MENU_STR_N, accountsmenu),
GNOMEUIINFO_SUBTREE(TOOLS_MENU_STR_N, toolsmenu),
GNOMEUIINFO_MENU_SETTINGS_TREE(optionsmenu),
GNOMEUIINFO_MENU_HELP_TREE(helpmenu),
GNOMEUIINFO_END
@ -1124,32 +1338,21 @@ mainWindow()
/* create the label containing the account balances */
{
GtkWidget *label;
GtkWidget *hbox;
GtkWidget *combo_box;
const char *default_currency;
GNCCurrencyItem *def_item;
hbox = gtk_hbox_new(FALSE, 2);
gtk_box_pack_end(GTK_BOX(statusbar), hbox, FALSE, FALSE, 5);
label = gtk_label_new(ASSETS_C_STR);
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
label = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
main_info->assets_label = label;
hbox = gtk_hbox_new(FALSE, 2);
gtk_box_pack_end(GTK_BOX(statusbar), hbox, FALSE, FALSE, 5);
label = gtk_label_new(PROFITS_C_STR);
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
label = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
main_info->profits_label = label;
default_currency = gnc_lookup_string_option("International",
"Default Currency",
"USD");
combo_box = gtk_select_new();
main_info->totals_combo = combo_box;
main_info->totals_list = NULL;
def_item = gnc_ui_get_currency_item(&main_info->totals_list,
default_currency,
main_info->totals_combo);
gtk_select_select_child(GTK_SELECT(combo_box), def_item->listitem);
gtk_box_pack_end(GTK_BOX(statusbar), combo_box, FALSE, FALSE, 5);
}
/* create scrolled window */

View File

@ -29,8 +29,8 @@ typedef struct _GNCMainInfo GNCMainInfo;
struct _GNCMainInfo
{
GtkWidget *account_tree;
GtkWidget *assets_label;
GtkWidget *profits_label;
GtkWidget *totals_combo;
GList *totals_list;
SCM main_window_change_callback_id;
SCM euro_change_callback_id;

View File

@ -83,6 +83,9 @@
"choose an account to reconcile.\n")
#define AMOUNT_NUM_MSG _("The amount must be a number.")
#define BALANCE_NUM_MSG _("The balance must be a number.")
#define CALC_INTEREST_MSG _("The interest rate cannot be zero.")
#define CALC_MISSING_MSG _("You must enter values for the other quantities.")
#define CALC_PAYMENTS_MSG _("The number of payments cannot be zero.")
#define CHANGE_RECN_MSG _("Do you really want to mark this transaction "\
"not reconciled?\nDoing so might make future "\
"reconciliation difficult!")
@ -228,7 +231,8 @@
#define TOOLTIP_EXIT_N N_("Exit GnuCash")
#define TOOLTIP_EXIT _(TOOLTIP_EXIT_N)
#define TOOLTIP_EXPORT_REPORT _("Export HTML-formatted report to file")
#define TOOLTIP_FIND_N N_("Find transactions with a search.")
#define TOOLTIP_FIN_CALC_N N_("Use the financial calculator")
#define TOOLTIP_FIND_N N_("Find transactions with a search")
#define TOOLTIP_FIND _(TOOLTIP_FIND_N)
#define TOOLTIP_HELP_N N_("Open the GnuCash help window")
#define TOOLTIP_HELP _(TOOLTIP_HELP_N)
@ -415,6 +419,8 @@
#define SORT_ORDER_MENU_STR _(SORT_ORDER_MENU_STR_N)
#define STYLE_MENU_STR_N N_("_Style")
#define STYLE_MENU_STR _(STYLE_MENU_STR_N)
#define TOOLS_MENU_STR_N N_("_Tools")
#define TOOLS_MENU_STR _(TOOLS_MENU_STR_N)
#define TOTD_MENU_STR_N N_("_Tips Of The Day")
#define TOTD_MENU_STR _(TOTD_MENU_STR_N)
#define TRANSACTION_MENU_STR_N N_("_Transaction")
@ -448,6 +454,8 @@
#define END_BALN_STR _("Ending Balance")
#define END_DATE_STR _("End date")
#define EXPORT_TO_STR _("Export To")
#define FIN_CALC_STR_N N_("Financial Calculator")
#define FIN_CALC_STR _("FIN_CALC_STR_N")
#define FINISH_STR _("Finish")
#define FROM_NOW_STR _("From Now")
#define GENERAL_LEDGER_STR _("General Ledger")

View File

@ -62,7 +62,7 @@
(define (gnc:report-menu-setup win)
(define menu (gnc:make-menu "_Reports" (list "_Settings")))
(define menu (gnc:make-menu "_Reports" (list "_Accounts")))
(define menu-namer (gnc:new-menu-namer))
(define (add-report-menu-item name report)

View File

@ -1230,17 +1230,16 @@
'options-generator budget-report-options-generator
'renderer gnc:budget-renderer)
(if (gnc:debugging?)
(let ()
(define budget-item
(gnc:make-menu-item
"Budget Dialog (Testing)"
"Test the budget dialog."
(list "Extensions" "")
(lambda ()
(gnc:budget-dialog-create
gnc:budget-entries
(lambda () (display "Applied the budget.\n"))))))
(let ()
(define budget-item
(gnc:make-menu-item
"Budget (Testing, Unfinished)"
"Test the budget dialog"
(list "_Tools" "")
(lambda ()
(gnc:budget-dialog-create
gnc:budget-entries
(lambda () (display "Applied the budget.\n"))))))
(gnc:hook-add-dangler gnc:*main-window-opened-hook*
(lambda (win) (gnc:add-extension budget-item)))))
(gnc:hook-add-dangler gnc:*main-window-opened-hook*
(lambda (win) (gnc:add-extension budget-item))))