mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
+ 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:
parent
f174755ef3
commit
0b0c53fa1d
1
AUTHORS
1
AUTHORS
@ -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
|
||||
|
@ -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>
|
||||
|
1009
po/gnucash.pot
1009
po/gnucash.pot
File diff suppressed because it is too large
Load Diff
@ -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@ \
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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
568
src/gnome/dialog-fincalc.c
Normal 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));
|
||||
}
|
37
src/gnome/dialog-fincalc.h
Normal file
37
src/gnome/dialog-fincalc.h
Normal 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
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
828
src/gnome/gtkselect.c
Normal 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
115
src/gnome/gtkselect.h
Normal 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__ */
|
@ -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(¤cy_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(¤cy_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 */
|
||||
|
@ -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;
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
@ -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))))
|
||||
|
Loading…
Reference in New Issue
Block a user