daves patches of Sun, 09 Jan 2000 03:18:52 -0800

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@2000 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas 2000-01-10 03:33:23 +00:00
parent 0ac5892064
commit c8c4ffa54e
56 changed files with 5143 additions and 2344 deletions

143
ChangeLog
View File

@ -1,3 +1,146 @@
2000-01-09 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/scm/prefs.scm: modified the account list option so
that it returns the default-getter value until explicitly
set.
2000-01-09 Robert Graham Merkel <rgmerk@mira.net>
* src/scm/report/transaction-report.scm: Added a pile of stuff,
should now produce a HTML formatted report containing basic info.
Unfortunately, crashes gtk-xmhtml at this stage.
2000-01-08 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/scm/bootstrap.scm.in: Added a check for slib.
2000-01-07 Dave Peticolas <peticola@cs.ucdavis.edu>
* make-gnucash-patch: changed aclocal.m4 to lib/g-wrap/aclocal.m4
in the exclude list, so people can patch the main aclocal.m4 file.
2000-01-07 Jan Schrage <jan.schrage@urz.uni-heidelberg.de>
* configure.in: for --opt-style-install add $prefix/include
and $prefix/lib to $CPPFLAGS and $CFLAGS respectively to fix
broken check for nana.
2000-01-06 Dave Peticolas <peticola@cs.ucdavis.edu>
* various and sundry: apply Laurent P{'e}lecq's i18n with gettext
patch. Move raw strings from gnome code into message database.
* src/gnome/window-report.c: modify for changes to window-html.
Make sure properties dialog callback only changes the window if
we are on that page.
* src/gnome/window-help.c: modify for the changes to window-html
* src/gnome/window-html.c: enhance window. Titles and buttons
are now associated with each history item, not the whole window.
* src/gnome/dialog-options.c: added support for account list
guile options.
2000-01-05 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/gnome/option-util.c: new functions for sending and receiving
lists of accounts to guile.
* src/gnome/account-tree.c: modified this widget so that
it keeps track of a list of selected accounts. Normal mode
is still single selection.
2000-01-04 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/gnome/dialog-add.c (gnc_ui_accWindow_list_select_cb):
prevent user from selecting illegal account types.
2000-01-02 Peter Pointner <peter@wuzel.m.isar.de>
* configure.in: disable qt build by default. --enable-qt enables it.
* Makefile.in: new targets qt.static and qt.disable
* make-gnucash-patch: exclude *.moc
* src/g-wrap/gnc.gwp (current-gnc-compile-flavor): add flavor qt.static
* src/qt/* and src/register/*-qt.*: assorted changes to make the
qt version compile.
2000-01-02 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/gnome/window-register.c: redid this window. Put style, sort
order, and date range into menu bar. Put toolbar under menu.
Added status bar at bottom.
* src/register/table-allgui.c (xaccVerifyCursorPosition): return
boolean indicating whether cursor was repositioned.
(wrapVerifyCursorPosition): use return value from above in
deciding whether to refresh UI.
* src/SplitLedger.c (xaccSRCancelCursorSplitChanges): move off of
an EXACT_ONLY cell, if on one.
2000-01-01 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/register/splitreg.h: uses ints, not shorts for values.
* src/SplitLedger.c (xaccSRLoadRegister): use the function below
to find the cell where to land on.
(xaccSRLoadRegister): fix a bug with auto mode to single/double
mode transition.
* src/register/table-allgui.c (gnc_table_find_valid_cell_horiz):
new function. Find a valid cell in the row, starting at the
given coordinates and fanning out.
* src/register/basiccell.h: add a new kind of io_flag.
XACC_CELL_ALLOW_EXACT_ONLY means a cell can only be entered
when the user specifically indicates that cell. Right now,
this means only a mouse pointer clicked on that cell. This
is used to prevent the reconcile cell from acting strangely.
* src/register/table-allgui.c (gnc_table_traverse_update): do left
traversals a little better.
* src/gnome/window-html.c (htmlKeyCB): handle keyboard horizontal
scrolling.
1999-12-31 Dave Peticolas <peticola@cs.ucdavis.edu>
* Code cleanup with -Wall. Deleted unused variables. Added missing
#include's and missing function declarations.
* src/engine/QIFIO.c (FavorDateType): Christopher Browne's QIF
import patch.
* configure.in: Albert Chin-A-Young's patch to configure.in for
perl config.
* src/MultiLedger.c: nix xaccRegisterCountHack.
It is no longer needed.
* Docs/En/xacc-about.html: added contributors.
* make-gnucash-patch: new script. Make a patch for submission.
* README: added contributors. Added sections on gnucash
development and submitting patches.
1999-12-30 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/SplitLedger.c (xaccSRGetCurrentTrans): Fix error messages.
1999-12-29 Peter Pointner <peter@wuzel.m.isar.de>
* src/motif/FileBox.c (closeBoxCB): reset fileName only if !done.
This fixes the FileBox problems with lesstiff 0.89.1, at least
for me.
* configure.in: change CPPFLAGS used to search for gtk-xmhtml
1999-12-26 Dave Peticolas <peticola@cs.ucdavis.edu>
* src/gnome/window-report.c (reportWindow): Add a properties

View File

@ -103,7 +103,3 @@ dist:
# Get dependencies (if existent).
-include $(shell if [ -e obj ]; then find obj -name "*.d"; fi) ""
# Local Variables:
# tab-width: 2
# End:

View File

@ -41,6 +41,7 @@ default:
@echo "gnome gnome/gtk version"
@echo "gnome-static gnome/gtk statically linked version"
@echo "qt kde/qt version"
@echo "qt-static kde/qt statically linked version"
@echo " "
# This inclusion must come after the first target, and after the
@ -50,6 +51,7 @@ include @top_srcdir@/Makefile.common
# Aliases
motif-static: motif.static
gnome-static: gnome.static
qt-static: qt.static
build-flavor: config.status
@cd lib; $(MAKE) ${FLAVOR}
@ -82,8 +84,23 @@ gnome.disable:
false
qt:
${MAKE} @QT_TARGET@
qt.static:
${MAKE} @QT_STATIC_TARGET@
qt.real:
${MAKE} FLAVOR=qt build-flavor
qt.static.real:
${MAKE} FLAVOR=qt.static build-flavor
#QT_TARGET if qt build disabled by configure
qt.disable:
echo "Qt build disabled by configure. Try configure --enable-qt"
false
depend:
@echo make depend is now superfluous.
@ -98,12 +115,13 @@ config.status: configure
exit 1; \
fi
CLEAN_SUBDIRS += lib src
CLEAN_SUBDIRS += lib src po
TRASH += TAGS *~ *.o *.bak
DIST_TRASH += Makefile *~ *.o *.bak share/scm gnucash.bin
DIST_TRASH += gnucash.motif gnucash.motif.static
DIST_TRASH += gnucash.gnome gnucash.gnome.static gnucash.qt gnucash-shell
DIST_TRASH += gnucash.gnome gnucash.gnome.static
DIST_TRASH += gnucash.qt gnucash.qt.static gnucash-shell
DIST_TRASH += config.cache config.log config.status config.h
tagsfiles := $(shell find . -name "*.[ch]" -print)
@ -120,6 +138,8 @@ install:
# Put these in the opposite order of precedence. Final bin/gnucash link will
# point to the last one that exists...
-[ -e gnucash.qt.static ] && \
${MAKE} FLAVOR=qt.static GNC_BINDIR=${GNC_BINDIR} install-bin
-[ -e gnucash.qt ] && ${MAKE} FLAVOR=qt GNC_BINDIR=${GNC_BINDIR} install-bin
-[ -e gnucash.gnome.static ] && \
${MAKE} FLAVOR=gnome.static GNC_BINDIR=${GNC_BINDIR} install-bin
@ -134,7 +154,8 @@ install:
-e ${GNC_BINDIR}/gnucash.motif.static -o \
-e ${GNC_BINDIR}/gnucash.gnome -o \
-e ${GNC_BINDIR}/gnucash.gnome.static -o \
-e ${GNC_BINDIR}/gnucash.qt \
-e ${GNC_BINDIR}/gnucash.qt -o \
-e ${GNC_BINDIR}/gnucash.qt.static \
]
$(INSTALL) src/quotes/gnc-prices ${GNC_BINDIR}
@ -202,6 +223,8 @@ install:
$(INSTALL_DATA) etc/conf* ${GNC_SHAREDIR}
$(MAKE) -C po install
# # Config directory
# @mkdir -p ${GNC_CONFIGDIR}
#
@ -218,5 +241,5 @@ install:
# done
.PHONY: default install-private install
.PHONY: motif motif-static motif.static gnome gnome-static gnome.static qt
.PHONY: motif motif-static motif.static gnome gnome-static gnome.static qt qt.static
.PHONY: depend dist clean distclean

98
README
View File

@ -4,7 +4,7 @@
The version 1.3.x series of GnuCash are experimental development
releases. They may or may not work. Use at your own risk.
The last stable, production version was gnucash-1.2.0
The last stable, production version was gnucash-1.2.5
The next stable, production version will be gnucash-1.4.x
##############################################
@ -90,6 +90,7 @@ ftp://ftp.ultra.net/pub/eugene/RPMS/i386/
Development versions:
http://linas.org/linux/gnucash/
Running:
--------
Only the Motif version of GnuCash is currently functional. The Gnome version
@ -122,7 +123,7 @@ Motif or Lesstif --
Lesstif 0.86.9 works ... but some menus come out 2 pixels high.(?)
Lesstif 0.87.0: broken (missing symbols for XmeDrawShadows, etc.)
Lesstif 0.88.1 works
Lesstif 0.89.0 broken (FileSelectionDialog in src/motif/FileBox.c broken)
Lesstif 0.89.0 works?
XmHTML -- Provides HTML display capabilities. Used for Help Dialogues, Reports.
Require version 1.1.4 or later
@ -137,6 +138,8 @@ XmHTML -- Provides HTML display capabilities. Used for Help Dialogues, Reports.
solutions; the simplest is probably to download the XmHTML source
package and compile it yourself.
slib -- scheme libraries for guile. Need version slib2c6 or later.
libpng -- portable network graphics library. Any version.
libjpeg -- JPEG image handling library. Any version.
libz -- compression library. Any version.
@ -166,7 +169,6 @@ perl-HTML/HTML-Parser-2.20
http://www.cpan.org/CPAN.html
Invocation:
-----------
You can start GnuCash at the command-line, with "gnucash" or "gnucash
@ -212,6 +214,7 @@ at http://www.zeta.org.au/~grahamc/xacc_rpts.html.
A tool to cleanup & import Quicken files can be found at (insert the url
here).
Building & Installing:
----------------------
These steps does not apply to binary distributions; only to source distributions.
@ -377,6 +380,86 @@ tree do a
cvs -z3 -Pd :pserver:cvs@cvs.gnucash.org:/home/cvs/cvsroot checkout -rxacc-12-patch gnucash
Developing GnuCash
------------------
Before you start developing GnuCash, you should do the following:
1. Read the file src/coding-style.txt to learn about the coding-styles
used in the GnuCash source code.
2. Several of the directories under src contain files called design.txt
which explain many aspects of GnuCash's design. Read those.
3. Go to the gnucash website and skim the archives of the gnucash
development mailing list.
4. Join the GnuCash development mailing list. See the gnucash website
for details on how to do this.
Submitting a Patch
------------------
Once you have done some work that you would like to submit, you need
to send a patch. There is a perl script called make-gnucash-patch
provided with the distribution that you can use to create the
patch. Here is how to use that perl script.
First, set up your development directories as follows:
< GnuCash home development directory >
|
|---- < directory containing original GnuCash sources >
|
|---- < directory containing your modified GnuCash sources >
A concrete example of those directories might be:
/home/me/gnucash
|
|---- /home/me/gnucash/gnucash.pristine (original sources)
|
|---- /home/me/gnucash/gnucash.mywork (original sources + my edits)
Copy the make-gnucash-patch script to the home development directory
(/home/me/gnucash above). Now edit three variables at the top of that
file to reflect the names of your directories. Given the names above,
you would use
my $old = 'gnucash.pristine';
my $new = 'gnucash.mywork';
my $gnc_home = '/home/me/gnucash';
Now run the script. Note that this script requires the programs
'makepatch', 'gzip', 'diff', and 'uuencode' (and, of course, 'perl')
to run.
When you run the script, three files will be generated:
gnc.diff - This file is an ascii text file containing the differences
between the original sources and your edits. At the bottom
of this file is a list of the files which were added,
changed, or deleted.
Please examine this file (especially the list at the bottom)
to make sure that all of your changes (and no other changes)
are present in the file.
Do not submit this file!
gnucash.diff.gz - This is a gzipped version of the above file.
Do not submit this file!
gnucash.diff.gz.uue - This is a uuencoded (ascii-encoded) version
of the above file.
This is the file you submit.
Send gnucash.diff.gz.uue to gnucash-patches@gnucash.org
Thanks in advance for your contribution!
Main Developers:
----------------
Robin Clark <rclark@hmc.edu> wrote the original X-Accountant in Motif
@ -414,6 +497,7 @@ Per Bojsen <bojsen@worldnet.att.net> several core dump fixes
Christopher B. Browne <cbbrowne@hex.net> for perl, scheme scripts
Graham Chapman <grahamc@zeta.org.au> for the xacc-rpts addon package
George Chen <georgec@sco.com> for MS-Money QIF's & fixes
Albert Chin-A-Young <china@thewrittenword.com> configure.in patch
Jeremey Collins <jcollins@gnucash.org> for GnoMoney & GTK port
Patrick Condron <pcondon@rackspace.com> for webserver and T1 connection.
Ciaran Deignan <Ciaran.Deignan@bull.net> for AIX binary version
@ -433,22 +517,26 @@ Sven Kuenzler <sk@xgm.de> for SuSE README file
Graham Leggett <minfrin@sharp.fm> for fixing a hang
Ted Lemon <mellon@andare.fugue.com> for NetBSD port
Yannick Le Ny <y-le-ny@ifrance.com> pour la traduction en francais
Heath Martin <martinh@pegasus.cc.ucf.edu> for extensive gtk fixes
Grant Likely <glikely@nortelnetworks.com> gnome and engine patches
Heath Martin <martinh@pegasus.cc.ucf.edu> gnome and register patches
Robert Graham Merkel <rgmerk@mira.net> reporting, gnome, and config patches.
Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu> port to alpha-dec-osf4.0f
G. Allen Morris III <gam3@ann.softgams.com> for QIF core dump
Peter Norton <spacey@inch.com> for a valiant attempt at a GTK port
OmNiBuS <webmaster@obsidian.uia.net> web site graphics & content
Myroslav Opyr <mopyr@IPM.Lviv.UA> for misc patches
Dave Peticolas <peticola@morpheus.cs.ucdavis.edu> extensive intelligent patches
Laurent P{'e}lecq <laurent.pelecq@wanadoo.fr> i18n patches with gettext
Alain Peyrat <Alain.Peyrat@nmu.alcatel.fr> for configure.in patches
Peter Pointner <peter@wuzel.m.isar.de> QIF import fixes, Qt patches
Gavin Porter <maufk@csv.warwick.ac.uk> for euro style dates
Ron Record <rr@sco.com> for SCO Unixware & OpenServer binaries
Jan Schrage <jan.schrage@urz.uni-heidelberg.de> documentation patches
Christopher Seawood <cls@seawood.org> for XbaeMatrix core dump
Mike Simons <msimons@fsimons01.erols.com> misc configure.in patches
Richard Skelton <rich@brake.demon.co.uk> for Solaris cleanup
Henning Spruth <spruth@bigfoot.com> for German text & euro date rework
Rob Walker <rob@valinux.com> guile and register patches
Ken Yamaguchi <gooch@ic.EECS.Berkeley.EDU> QIF import fixes; MYM import
... and I am sure that I have missed many others ...

95
README.SuSE-6.3 Normal file
View File

@ -0,0 +1,95 @@
How to install gnucash-1.2.5 on SuSE-6.3
========================================
(written 2000-01-07 by Peter Pointner <peter@wuzel.m.isar.de>)
Notes:
- This is only one way to get GnuCash running on SuSE 6.3. I did test
that, but there might be errors anyway, and of course you do all at
your own risk. If you find errors, you might report them to the
gnucash mailing list (gnucash-devel@gnucash.org)
- This is definitely for SuSE 6.3 (Intel). Earlier SuSE distributions
lack some required packages. Later SuSE distributions didn't exist
at the time of writing.
Let's go:
* Make sure you have a running system, including X. For my tests I
started with a default installation and removed some packages to
save diskspace.
* Install the following packages:
+ from series d
eperl guile nana swig xmhtml xmhtmld
and optionally
autoconf automake libtool
(You must install libtool if you have autoconf/automake
installed!)
+ from series x
xdevel
+ from series xdev
lesstiff lesstifd
* Download slib from
ftp://ftp.gnu.org/pub/gnu/jacal/slib2c7.zip
and install it by unpacking it to /usr/share/guile (this will
create a sub-directory slib):
cd /usr/share/guile
su root -c "unzip -L /tmp/slib2c7"
* Download GnuCash from
http://www.gnucash.org/pub/gnucash/sources/stable/gnucash-1.2.5.tar.gz
and unpack it
tar xzf gnucash-1.2.5.tar.gz
* Now apply the patch at the end of this file. The first hunk will
make the file selection box work with lesstiff-0.89.1, the version
which comes with SuSE 6.3. It should not hurt with other versions.
The second hunk changes a hardcoded path to match the default
installation prefix. This change stops gnucash from crashing when
showing a report. You can apply this patch by something like
cd gnucash-1.2.5
patch -p1 < ../README-SuSE-6.3
* Configure, build and install gnucash. Installation must probably be
done as root, the files go to various places in /usr/local.
cd gnucash-1.2.5
./configure
make
su root -c "make install"
=================== patch follows ========================
diff -ru gnucash-1.2.5/src/motif/FileBox.c gnucash-1.2.5.patched/src/motif/File
Box.c
--- gnucash-1.2.5/src/motif/FileBox.c Mon Oct 18 06:18:29 1999
+++ gnucash-1.2.5.patched/src/motif/FileBox.c Fri Jan 7 22:25:17 2000
@@ -208,8 +208,10 @@
{
char **fileName = (char **)cd;
ENTER("closeBoxCB");
- *fileName = NULL;
- done = True;
+ if (! done) {
+ *fileName = NULL;
+ done = True;
+ }
LEAVE("closeBoxCB");
}
diff -ru gnucash-1.2.5/src/reports/Sheet.c gnucash-1.2.5.patched/src/reports/Sh
eet.c
--- gnucash-1.2.5/src/reports/Sheet.c Tue Jul 6 08:44:52 1999
+++ gnucash-1.2.5.patched/src/reports/Sheet.c Fri Jan 7 22:40:35 2000
@@ -235,7 +235,7 @@
}
/* hack afreakin lert -- this path should not be hard-coded ... */
- fullpath = strdup ("/usr/lib/gnucash/");
+ fullpath = strdup ("/usr/local/lib/gnucash/");
fprintf (to_perl,
"<: \n"

438
aclocal.m4 vendored
View File

@ -48,3 +48,441 @@ ifelse([$4], , , [$4
])dnl
fi
])
# Search path for a program which passes the given test.
# Ulrich Drepper <drepper@cygnus.com>, 1996.
#
# This file can be copied and used freely without restrictions. It can
# be used in projects which are not available under the GNU Public License
# but which still want to provide support for the GNU gettext functionality.
# Please note that the actual code is *not* freely available.
# serial 1
dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
AC_DEFUN(AM_PATH_PROG_WITH_TEST,
[# Extract the first word of "$2", so it can be a program name with args.
set dummy $2; ac_word=[$]2
AC_MSG_CHECKING([for $ac_word])
AC_CACHE_VAL(ac_cv_path_$1,
[case "[$]$1" in
/*)
ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
;;
*)
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_dir in ifelse([$5], , $PATH, [$5]); do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
if [$3]; then
ac_cv_path_$1="$ac_dir/$ac_word"
break
fi
fi
done
IFS="$ac_save_ifs"
dnl If no 4th arg is given, leave the cache variable unset,
dnl so AC_PATH_PROGS will keep looking.
ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
])dnl
;;
esac])dnl
$1="$ac_cv_path_$1"
if test -n "[$]$1"; then
AC_MSG_RESULT([$]$1)
else
AC_MSG_RESULT(no)
fi
AC_SUBST($1)dnl
])
# Macro to add for using GNU gettext.
# Ulrich Drepper <drepper@cygnus.com>, 1995.
#
# This file can be copied and used freely without restrictions. It can
# be used in projects which are not available under the GNU Public License
# but which still want to provide support for the GNU gettext functionality.
# Please note that the actual code is *not* freely available.
# serial 5
AC_DEFUN(AM_WITH_NLS,
[AC_MSG_CHECKING([whether NLS is requested])
dnl Default is enabled NLS
AC_ARG_ENABLE(nls,
[ --disable-nls do not use Native Language Support],
USE_NLS=$enableval, USE_NLS=yes)
AC_MSG_RESULT($USE_NLS)
AC_SUBST(USE_NLS)
USE_INCLUDED_LIBINTL=no
dnl If we use NLS figure out what method
if test "$USE_NLS" = "yes"; then
AC_DEFINE(ENABLE_NLS)
AC_MSG_CHECKING([whether included gettext is requested])
AC_ARG_WITH(included-gettext,
[ --with-included-gettext use the GNU gettext library included here],
nls_cv_force_use_gnu_gettext=$withval,
nls_cv_force_use_gnu_gettext=no)
AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
dnl User does not insist on using GNU NLS library. Figure out what
dnl to use. If gettext or catgets are available (in this order) we
dnl use this. Else we have to fall back to GNU NLS library.
dnl catgets is only used if permitted by option --with-catgets.
nls_cv_header_intl=
nls_cv_header_libgt=
CATOBJEXT=NONE
AC_CHECK_HEADER(libintl.h,
[AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc,
[AC_TRY_LINK([#include <libintl.h>], [return (int) gettext ("")],
gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)])
if test "$gt_cv_func_gettext_libc" != "yes"; then
AC_CHECK_LIB(intl, bindtextdomain,
[AC_CACHE_CHECK([for gettext in libintl],
gt_cv_func_gettext_libintl,
[AC_CHECK_LIB(intl, gettext,
gt_cv_func_gettext_libintl=yes,
gt_cv_func_gettext_libintl=no)],
gt_cv_func_gettext_libintl=no)])
fi
if test "$gt_cv_func_gettext_libc" = "yes" \
|| test "$gt_cv_func_gettext_libintl" = "yes"; then
AC_DEFINE(HAVE_GETTEXT)
AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
if test "$MSGFMT" != "no"; then
AC_CHECK_FUNCS(dcgettext)
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
AC_PATH_PROG(GMSGMERGE, msgmerge, :)
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
return _nl_msg_cat_cntr],
[CATOBJEXT=.gmo
DATADIRNAME=share],
[CATOBJEXT=.mo
DATADIRNAME=lib])
INSTOBJEXT=.mo
fi
fi
])
if test "$CATOBJEXT" = "NONE"; then
AC_MSG_CHECKING([whether catgets can be used])
AC_ARG_WITH(catgets,
[ --with-catgets use catgets functions if available],
nls_cv_use_catgets=$withval, nls_cv_use_catgets=no)
AC_MSG_RESULT($nls_cv_use_catgets)
if test "$nls_cv_use_catgets" = "yes"; then
dnl No gettext in C library. Try catgets next.
AC_CHECK_LIB(i, main)
AC_CHECK_FUNC(catgets,
[AC_DEFINE(HAVE_CATGETS)
INTLOBJS="\$(CATOBJS)"
AC_PATH_PROG(GENCAT, gencat, no)dnl
if test "$GENCAT" != "no"; then
AC_PATH_PROG(GMSGFMT, gmsgfmt, no)
if test "$GMSGFMT" = "no"; then
AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt,
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)
fi
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
USE_INCLUDED_LIBINTL=yes
CATOBJEXT=.cat
INSTOBJEXT=.cat
DATADIRNAME=lib
INTLDEPS='$(top_builddir)/intl/libintl.a'
INTLLIBS=$INTLDEPS
LIBS=`echo $LIBS | sed -e 's/-lintl//'`
nls_cv_header_intl=intl/libintl.h
nls_cv_header_libgt=intl/libgettext.h
fi])
fi
fi
if test "$CATOBJEXT" = "NONE"; then
dnl Neither gettext nor catgets in included in the C library.
dnl Fall back on GNU gettext library.
nls_cv_use_gnu_gettext=yes
fi
fi
if test "$nls_cv_use_gnu_gettext" = "yes"; then
dnl Mark actions used to generate GNU NLS library.
INTLOBJS="\$(GETTOBJS)"
AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt)
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
AC_SUBST(MSGFMT)
USE_INCLUDED_LIBINTL=yes
CATOBJEXT=.gmo
INSTOBJEXT=.mo
DATADIRNAME=share
INTLDEPS='$(top_builddir)/intl/libintl.a'
INTLLIBS=$INTLDEPS
LIBS=`echo $LIBS | sed -e 's/-lintl//'`
nls_cv_header_intl=intl/libintl.h
nls_cv_header_libgt=intl/libgettext.h
fi
dnl Test whether we really found GNU xgettext.
if test "$XGETTEXT" != ":"; then
dnl If it is no GNU xgettext we define it as : so that the
dnl Makefiles still can work.
if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
: ;
else
AC_MSG_RESULT(
[found xgettext program is not GNU xgettext; ignore it])
XGETTEXT=":"
fi
fi
# We need to process the po/ directory.
POSUB=po
else
DATADIRNAME=share
nls_cv_header_intl=intl/libintl.h
nls_cv_header_libgt=intl/libgettext.h
fi
AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
AC_OUTPUT_COMMANDS(
[case "$CONFIG_FILES" in *po/Makefile.in*)
sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
esac])
# If this is used in GNU gettext we have to set USE_NLS to `yes'
# because some of the sources are only built for this goal.
if test "$PACKAGE" = gettext; then
USE_NLS=yes
USE_INCLUDED_LIBINTL=yes
fi
dnl These rules are solely for the distribution goal. While doing this
dnl we only have to keep exactly one list of the available catalogs
dnl in configure.in.
for lang in $ALL_LINGUAS; do
GMOFILES="$GMOFILES $lang.gmo"
POFILES="$POFILES $lang.po"
POXFILES="$POXFILES $lang.pox"
done
dnl Make all variables we use known to autoconf.
AC_SUBST(USE_INCLUDED_LIBINTL)
AC_SUBST(CATALOGS)
AC_SUBST(CATOBJEXT)
AC_SUBST(DATADIRNAME)
AC_SUBST(GMOFILES)
AC_SUBST(INSTOBJEXT)
AC_SUBST(INTLDEPS)
AC_SUBST(INTLLIBS)
AC_SUBST(INTLOBJS)
AC_SUBST(POFILES)
AC_SUBST(POXFILES)
AC_SUBST(POSUB)
])
AC_DEFUN(AC_CAN_USE_GNU_GETTEXT,
[AM_LC_MESSAGES
AM_WITH_NLS
if test "x$CATOBJEXT" != "x"; then
if test "x$ALL_LINGUAS" = "x"; then
LINGUAS=
else
AC_MSG_CHECKING(for catalogs to be installed)
NEW_LINGUAS=
for lang in ${LINGUAS=$ALL_LINGUAS}; do
case "$ALL_LINGUAS" in
*$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
esac
done
LINGUAS=$NEW_LINGUAS
AC_MSG_RESULT($LINGUAS)
fi
dnl Construct list of names of catalog files to be constructed.
if test -n "$LINGUAS"; then
for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
fi
fi
dnl The reference to <locale.h> in the installed <libintl.h> file
dnl must be resolved because we cannot expect the users of this
dnl to define HAVE_LOCALE_H.
if test "$ac_cv_header_locale_h" = yes; then
INCLUDE_LOCALE_H="#include <locale.h>"
else
INCLUDE_LOCALE_H="\
/* The system does not provide the header <locale.h>. Take care yourself. */"
fi
AC_SUBST(INCLUDE_LOCALE_H)
dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
dnl Try to locate is.
MKINSTALLDIRS=
if test -n "$ac_aux_dir"; then
MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
fi
if test -z "$MKINSTALLDIRS"; then
MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
fi
AC_SUBST(MKINSTALLDIRS)
dnl Generate list of files to be processed by xgettext which will
dnl be included in po/Makefile.
test -d po || mkdir po
if test "x$srcdir" != "x."; then
if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
posrcprefix="$srcdir/"
else
posrcprefix="../$srcdir/"
fi
else
posrcprefix="../"
fi
rm -f po/POTFILES
sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
< $srcdir/po/POTFILES.in > po/POTFILES
])
# Check whether LC_MESSAGES is available in <locale.h>.
# Ulrich Drepper <drepper@cygnus.com>, 1995.
#
# This file can be copied and used freely without restrictions. It can
# be used in projects which are not available under the GNU Public License
# but which still want to provide support for the GNU gettext functionality.
# Please note that the actual code is *not* freely available.
# serial 1
AC_DEFUN(AM_LC_MESSAGES,
[if test "$ac_cv_header_locale_h" = yes; then
AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
[AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
if test "$am_cv_val_LC_MESSAGES" = yes; then
AC_DEFINE(HAVE_LC_MESSAGES)
fi
fi])
# Do all the work for Automake. This macro actually does too much --
# some checks are only needed if your package does certain things.
# But this isn't really a big deal.
# serial 1
dnl Usage:
dnl AM_INIT_AUTOMAKE(package,version, [no-define])
AC_DEFUN(AM_INIT_AUTOMAKE,
[AC_REQUIRE([AM_PROG_INSTALL])
PACKAGE=[$1]
AC_SUBST(PACKAGE)
VERSION=[$2]
AC_SUBST(VERSION)
dnl test to see if srcdir already configured
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
fi
ifelse([$3],,
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
AC_DEFINE_UNQUOTED(VERSION, "$VERSION"))
AC_REQUIRE([AM_SANITY_CHECK])
AC_REQUIRE([AC_ARG_PROGRAM])
dnl FIXME This is truly gross.
missing_dir=`cd $ac_aux_dir && pwd`
AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
AC_REQUIRE([AC_PROG_MAKE_SET])])
## --------------------------------------------------------- ##
## Use AC_PROG_INSTALL, supplementing it with INSTALL_SCRIPT ##
## substitution. ##
## From Franc,ois Pinard ##
## --------------------------------------------------------- ##
# serial 1
AC_DEFUN(AM_PROG_INSTALL,
[AC_REQUIRE([AC_PROG_INSTALL])
test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
AC_SUBST(INSTALL_SCRIPT)dnl
])
#
# Check to make sure that the build environment is sane.
#
AC_DEFUN(AM_SANITY_CHECK,
[AC_MSG_CHECKING([whether build environment is sane])
# Just in case
sleep 1
echo timestamp > conftestfile
# Do `set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
if test "[$]*" = "X"; then
# -L didn't work.
set X `ls -t $srcdir/configure conftestfile`
fi
if test "[$]*" != "X $srcdir/configure conftestfile" \
&& test "[$]*" != "X conftestfile $srcdir/configure"; then
# If neither matched, then we have a broken ls. This can happen
# if, for instance, CONFIG_SHELL is bash and it inherits a
# broken ls alias from the environment. This has actually
# happened. Such a system could not be considered "sane".
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
alias in your environment])
fi
test "[$]2" = conftestfile
)
then
# Ok.
:
else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
rm -f conftest*
AC_MSG_RESULT(yes)])
## --------------------------------------------------------- ##
## Fake the existence of programs that GNU maintainers use. ##
## --------------------------------------------------------- ##
dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
dnl The program must properly implement --version.
AC_DEFUN(AM_MISSING_PROG,
[AC_MSG_CHECKING(for working $2)
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
if ($2 --version) < /dev/null > /dev/null 2>&1; then
$1=$2
AC_MSG_RESULT(found)
else
$1="$3/missing $2"
AC_MSG_RESULT(missing)
fi
AC_SUBST($1)])

View File

@ -26,6 +26,10 @@
#ifndef __XACC_CONFIG_H__
#define __XACC_CONFIG_H__
/* Package name and version number */
#undef PACKAGE
#undef VERSION
/* Are we bigendian -- needed for reading binary file format */
#undef WORDS_BIGENDIAN
@ -65,4 +69,23 @@
/* Configure found the function malloc_usable_size */
#define HAVE_MALLOC_USABLE_SIZE
/*** Begin i18n ***/
/* internationalization with gettext */
#undef HAVE_GETTEXT
/* internationalization with catgets */
#undef HAVE_CATGETS
/* locale.h contains LC_MESSAGES */
#undef HAVE_LC_MESSAGES
/* specific locale directory */
#undef HAVE_LOCALE_DIR
/* defined if NLS is available */
#undef ENABLE_NLS
/*** End i18n ***/
#endif

873
config.sub vendored
View File

@ -1,873 +0,0 @@
#! /bin/sh
# Configuration validation subroutine script, version 1.1.
# Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
# can handle that machine. It does not imply ALL GNU software can.
#
# This file 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument.
# If it is invalid, we print an error message on stderr and exit with code 1.
# Otherwise, we print the canonical config type on stdout and succeed.
# This file is supposed to be the same for all GNU packages
# and recognize all the CPU types, system types and aliases
# that are meaningful with *any* GNU software.
# Each package is responsible for reporting which valid configurations
# it does not support. The user should be able to distinguish
# a failure to support a valid configuration from a meaningless
# configuration.
# The goal of this file is to map all the various variations of a given
# machine specification into a single specification in the form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
# It is wrong to echo any other type of specification.
if [ x$1 = x ]
then
echo Configuration name missing. 1>&2
echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
echo "or $0 ALIAS" 1>&2
echo where ALIAS is a recognized configuration type. 1>&2
exit 1
fi
# First pass through any local machine types.
case $1 in
*local*)
echo $1
exit 0
;;
*)
;;
esac
# Separate what the user gave into CPU-COMPANY and OS (if any).
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
if [ $basic_machine != $1 ]
then os=`echo $1 | sed 's/.*-/-/'`
else os=; fi
### Let's recognize common machines as not being operating systems so
### that things like config.sub decstation-3100 work. We also
### recognize some manufacturers as not being operating systems, so we
### can provide default operating systems below.
case $os in
-sun*os*)
# Prevent following clause from handling this invalid input.
;;
-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp )
os=
basic_machine=$1
;;
-hiux*)
os=-hiuxwe2
;;
-sco4)
os=-sco3.2v4
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
;;
-sco3.2.[4-9]*)
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
;;
-sco3.2v[4-9]*)
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
;;
-sco*)
os=-sco3.2v2
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
;;
-isc)
os=-isc2.2
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
;;
-clix*)
basic_machine=clipper-intergraph
;;
-isc*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
;;
-lynx*)
os=-lynxos
;;
-ptx*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
;;
-windowsnt*)
os=`echo $os | sed -e 's/windowsnt/winnt/'`
;;
esac
# Decode aliases for certain CPU-COMPANY combinations.
case $basic_machine in
# Recognize the basic CPU types without company name.
# Some are omitted here because they have special meanings below.
tahoe | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm \
| arme[lb] | pyramid \
| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
| alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
| powerpc | powerpcle | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
| pdp11 | mips64el | mips64orion | mips64orionel \
| sparc)
basic_machine=$basic_machine-unknown
;;
# Object if more than one company name word.
*-*-*)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
# Recognize the basic CPU types with company name.
vax-* | tahoe-* | i[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \
| sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
| none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
| hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
| pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
| pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
| mips64el-* | mips64orion-* | mips64orionel-*)
;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
basic_machine=m68000-att
;;
3b*)
basic_machine=we32k-att
;;
alliant | fx80)
basic_machine=fx80-alliant
;;
altos | altos3068)
basic_machine=m68k-altos
;;
am29k)
basic_machine=a29k-none
os=-bsd
;;
amdahl)
basic_machine=580-amdahl
os=-sysv
;;
amiga | amiga-*)
basic_machine=m68k-cbm
;;
amigados)
basic_machine=m68k-cbm
os=-amigados
;;
amigaunix | amix)
basic_machine=m68k-cbm
os=-sysv4
;;
apollo68)
basic_machine=m68k-apollo
os=-sysv
;;
balance)
basic_machine=ns32k-sequent
os=-dynix
;;
convex-c1)
basic_machine=c1-convex
os=-bsd
;;
convex-c2)
basic_machine=c2-convex
os=-bsd
;;
convex-c32)
basic_machine=c32-convex
os=-bsd
;;
convex-c34)
basic_machine=c34-convex
os=-bsd
;;
convex-c38)
basic_machine=c38-convex
os=-bsd
;;
cray | ymp)
basic_machine=ymp-cray
os=-unicos
;;
cray2)
basic_machine=cray2-cray
os=-unicos
;;
crds | unos)
basic_machine=m68k-crds
;;
da30 | da30-*)
basic_machine=m68k-da30
;;
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
basic_machine=mips-dec
;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
basic_machine=m68k-motorola
;;
delta88)
basic_machine=m88k-motorola
os=-sysv3
;;
dpx20 | dpx20-*)
basic_machine=rs6000-bull
os=-bosx
;;
dpx2* | dpx2*-bull)
basic_machine=m68k-bull
os=-sysv3
;;
ebmon29k)
basic_machine=a29k-amd
os=-ebmon
;;
elxsi)
basic_machine=elxsi-elxsi
os=-bsd
;;
encore | umax | mmax)
basic_machine=ns32k-encore
;;
fx2800)
basic_machine=i860-alliant
;;
genix)
basic_machine=ns32k-ns
;;
gmicro)
basic_machine=tron-gmicro
os=-sysv
;;
h3050r* | hiux*)
basic_machine=hppa1.1-hitachi
os=-hiuxwe2
;;
h8300hms)
basic_machine=h8300-hitachi
os=-hms
;;
harris)
basic_machine=m88k-harris
os=-sysv3
;;
hp300-*)
basic_machine=m68k-hp
;;
hp300bsd)
basic_machine=m68k-hp
os=-bsd
;;
hp300hpux)
basic_machine=m68k-hp
os=-hpux
;;
hp9k2[0-9][0-9] | hp9k31[0-9])
basic_machine=m68000-hp
;;
hp9k3[2-9][0-9])
basic_machine=m68k-hp
;;
hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
basic_machine=hppa1.1-hp
;;
hp9k8[0-9][0-9] | hp8[0-9][0-9])
basic_machine=hppa1.0-hp
;;
i370-ibm* | ibm*)
basic_machine=i370-ibm
os=-mvs
;;
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
i[345]86v32)
basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
os=-sysv32
;;
i[345]86v4*)
basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
os=-sysv4
;;
i[345]86v)
basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
os=-sysv
;;
i[345]86sol2)
basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
os=-solaris2
;;
iris | iris4d)
basic_machine=mips-sgi
case $os in
-irix*)
;;
*)
os=-irix4
;;
esac
;;
isi68 | isi)
basic_machine=m68k-isi
os=-sysv
;;
m88k-omron*)
basic_machine=m88k-omron
;;
magnum | m3230)
basic_machine=mips-mips
os=-sysv
;;
merlin)
basic_machine=ns32k-utek
os=-sysv
;;
miniframe)
basic_machine=m68000-convergent
;;
mips3*-*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
;;
mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;;
ncr3000)
basic_machine=i486-ncr
os=-sysv4
;;
news | news700 | news800 | news900)
basic_machine=m68k-sony
os=-newsos
;;
news1000)
basic_machine=m68030-sony
os=-newsos
;;
news-3600 | risc-news)
basic_machine=mips-sony
os=-newsos
;;
next | m*-next )
basic_machine=m68k-next
case $os in
-nextstep* )
;;
-ns2*)
os=-nextstep2
;;
*)
os=-nextstep3
;;
esac
;;
nh3000)
basic_machine=m68k-harris
os=-cxux
;;
nh[45]000)
basic_machine=m88k-harris
os=-cxux
;;
nindy960)
basic_machine=i960-intel
os=-nindy
;;
np1)
basic_machine=np1-gould
;;
pa-hitachi)
basic_machine=hppa1.1-hitachi
os=-hiuxwe2
;;
paragon)
basic_machine=i860-intel
os=-osf
;;
pbd)
basic_machine=sparc-tti
;;
pbb)
basic_machine=m68k-tti
;;
pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
pentium | p5 | p6)
# We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium
basic_machine=i586-intel
;;
pentium-* | p5-* | p6-*)
# We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
i686)
basic_machine=i686-intel
;;
i686-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
k5)
# We don't have specific support for AMD's K5 yet, so just call it a Pentium
basic_machine=i586-amd
;;
nexen)
# We don't have specific support for Nexgen yet, so just call it a Pentium
basic_machine=i586-nexgen
;;
pn)
basic_machine=pn-gould
;;
power) basic_machine=rs6000-ibm
;;
ppc) basic_machine=powerpc-unknown
;;
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
;;
ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ps2)
basic_machine=i386-ibm
;;
rm[46]00)
basic_machine=mips-siemens
;;
rtpc | rtpc-*)
basic_machine=romp-ibm
;;
sequent)
basic_machine=i386-sequent
;;
sh)
basic_machine=sh-hitachi
os=-hms
;;
sps7)
basic_machine=m68k-bull
os=-sysv2
;;
spur)
basic_machine=spur-unknown
;;
sun2)
basic_machine=m68000-sun
;;
sun2os3)
basic_machine=m68000-sun
os=-sunos3
;;
sun2os4)
basic_machine=m68000-sun
os=-sunos4
;;
sun3os3)
basic_machine=m68k-sun
os=-sunos3
;;
sun3os4)
basic_machine=m68k-sun
os=-sunos4
;;
sun4os3)
basic_machine=sparc-sun
os=-sunos3
;;
sun4os4)
basic_machine=sparc-sun
os=-sunos4
;;
sun4sol2)
basic_machine=sparc-sun
os=-solaris2
;;
sun3 | sun3-*)
basic_machine=m68k-sun
;;
sun4)
basic_machine=sparc-sun
;;
sun386 | sun386i | roadrunner)
basic_machine=i386-sun
;;
symmetry)
basic_machine=i386-sequent
os=-dynix
;;
tower | tower-32)
basic_machine=m68k-ncr
;;
udi29k)
basic_machine=a29k-amd
os=-udi
;;
ultra3)
basic_machine=a29k-nyu
os=-sym1
;;
vaxv)
basic_machine=vax-dec
os=-sysv
;;
vms)
basic_machine=vax-dec
os=-vms
;;
vxworks960)
basic_machine=i960-wrs
os=-vxworks
;;
vxworks68)
basic_machine=m68k-wrs
os=-vxworks
;;
vxworks29k)
basic_machine=a29k-wrs
os=-vxworks
;;
xmp)
basic_machine=xmp-cray
os=-unicos
;;
xps | xps100)
basic_machine=xps100-honeywell
;;
none)
basic_machine=none-none
os=-none
;;
# Here we handle the default manufacturer of certain CPU types. It is in
# some cases the only manufacturer, in others, it is the most popular.
mips)
basic_machine=mips-mips
;;
romp)
basic_machine=romp-ibm
;;
rs6000)
basic_machine=rs6000-ibm
;;
vax)
basic_machine=vax-dec
;;
pdp11)
basic_machine=pdp11-dec
;;
we32k)
basic_machine=we32k-att
;;
sparc)
basic_machine=sparc-sun
;;
cydra)
basic_machine=cydra-cydrome
;;
orion)
basic_machine=orion-highlevel
;;
orion105)
basic_machine=clipper-highlevel
;;
*)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
esac
# Here we canonicalize certain aliases for manufacturers.
case $basic_machine in
*-digital*)
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
;;
*-commodore*)
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
;;
*)
;;
esac
# Decode manufacturer-specific aliases for certain operating systems.
if [ x"$os" != x"" ]
then
case $os in
# -solaris* is a basic system type, with this one exception.
-solaris1 | -solaris1.*)
os=`echo $os | sed -e 's|solaris1|sunos4|'`
;;
-solaris)
os=-solaris2
;;
-unixware* | svr4*)
os=-sysv4
;;
-gnu/linux*)
os=`echo $os | sed -e 's|gnu/linux|linux|'`
;;
# First accept the basic system types.
# The portable systems comes first.
# Each alternative MUST END IN A *, to match a version number.
# -sysv* is not here because it comes later, after sysvr4.
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
| -vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[345]* \
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
| -amigados* | -msdos* | -newsos* | -unicos* | -aos* \
| -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
| -riscos* | -linux* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* )
# Remember, each alternative MUST END IN *, to match a version number.
;;
-sunos5*)
os=`echo $os | sed -e 's|sunos5|solaris2|'`
;;
-sunos6*)
os=`echo $os | sed -e 's|sunos6|solaris3|'`
;;
-osfrose*)
os=-osfrose
;;
-osf*)
os=-osf
;;
-utek*)
os=-bsd
;;
-dynix*)
os=-bsd
;;
-acis*)
os=-aos
;;
-ctix* | -uts*)
os=-sysv
;;
# Preserve the version number of sinix5.
-sinix5.*)
os=`echo $os | sed -e 's|sinix|sysv|'`
;;
-sinix*)
os=-sysv4
;;
-triton*)
os=-sysv3
;;
-oss*)
os=-sysv3
;;
-svr4)
os=-sysv4
;;
-svr3)
os=-sysv3
;;
-sysvr4)
os=-sysv4
;;
# This must come after -sysvr4.
-sysv*)
;;
-xenix)
os=-xenix
;;
-none)
;;
*)
# Get rid of the `-' at the beginning of $os.
os=`echo $os | sed 's/[^-]*-//'`
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
exit 1
;;
esac
else
# Here we handle the default operating systems that come with various machines.
# The value should be what the vendor currently ships out the door with their
# machine or put another way, the most popular os provided with the machine.
# Note that if you're going to try to match "-MANUFACTURER" here (say,
# "-sun"), then you have to tell the case statement up towards the top
# that MANUFACTURER isn't an operating system. Otherwise, code above
# will signal an error saying that MANUFACTURER isn't an operating
# system, and we'll never get to this point.
case $basic_machine in
*-acorn)
os=-riscix1.2
;;
arm*-semi)
os=-aout
;;
pdp11-*)
os=-none
;;
*-dec | vax-*)
os=-ultrix4.2
;;
m68*-apollo)
os=-domain
;;
i386-sun)
os=-sunos4.0.2
;;
m68000-sun)
os=-sunos3
# This also exists in the configure program, but was not the
# default.
# os=-sunos4
;;
*-tti) # must be before sparc entry or we get the wrong os.
os=-sysv3
;;
sparc-* | *-sun)
os=-sunos4.1.1
;;
*-ibm)
os=-aix
;;
*-hp)
os=-hpux
;;
*-hitachi)
os=-hiux
;;
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
os=-sysv
;;
*-cbm)
os=-amigados
;;
*-dg)
os=-dgux
;;
*-dolphin)
os=-sysv3
;;
m68k-ccur)
os=-rtu
;;
m88k-omron*)
os=-luna
;;
*-sequent)
os=-ptx
;;
*-crds)
os=-unos
;;
*-ns)
os=-genix
;;
i370-*)
os=-mvs
;;
*-next)
os=-nextstep3
;;
*-gould)
os=-sysv
;;
*-highlevel)
os=-bsd
;;
*-encore)
os=-bsd
;;
*-sgi)
os=-irix
;;
*-siemens)
os=-sysv4
;;
*-masscomp)
os=-rtu
;;
*)
os=-none
;;
esac
fi
# Here we handle the case where we know the os, and the CPU type, but not the
# manufacturer. We pick the logical manufacturer.
vendor=unknown
case $basic_machine in
*-unknown)
case $os in
-riscix*)
vendor=acorn
;;
-sunos*)
vendor=sun
;;
-lynxos*)
vendor=lynx
;;
-aix*)
vendor=ibm
;;
-hpux*)
vendor=hp
;;
-hiux*)
vendor=hitachi
;;
-unos*)
vendor=crds
;;
-dgux*)
vendor=dg
;;
-luna*)
vendor=omron
;;
-genix*)
vendor=ns
;;
-mvs*)
vendor=ibm
;;
-ptx*)
vendor=sequent
;;
-vxworks*)
vendor=wrs
;;
esac
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
;;
esac
echo $basic_machine$os

1587
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,12 @@
### commands depend on them):
AC_INIT(src/guile/gnucash.h.in)
AM_INIT_AUTOMAKE(gnucash,1.3.1)
dnl Set of available languages.
ALL_LINGUAS="fr de"
AC_PROG_INSTALL
AC_PROG_RANLIB
@ -52,7 +58,9 @@ AC_ARG_ENABLE( color,
AC_ARG_WITH( opt-style-install,
[ --with-opt-style-install install everything in subdirs of --prefix],
OPT_STYLE_INSTALL=1,
OPT_STYLE_INSTALL=1
CPPFLAGS="$CPPFLAGS -I$prefix/include"
CFLAGS="$CLFAGS -L$prefix/lib",
OPT_STYLE_INSTALL=0)
AC_SUBST(OPT_STYLE_INSTALL)
@ -69,6 +77,26 @@ AC_ARG_ENABLE( warnings,
LDFLAGS="${LDFLAGS} -g -Wall"
AC_DEFINE(DEBUG_MEMORY,1) AC_DEFINE(USE_DEBUG,1) )
### --------------------------------------------------------------------------
## qt-version of gnucash
# The qt version of gnucash is far from doing anything usefull, so most people
# don't care about it. Those who want to play with it, must specify --enable-qt
AC_ARG_ENABLE(qt,
[ --enable-qt enable building of the Qt version of gnucash],
GNC_QT_ENABLED=yes)
if test x"$GNC_QT_ENABLED" = xyes; then
QT_TARGET="qt.real"
QT_STATIC_TARGET="qt.static.real"
else
QT_TARGET="qt.disable"
QT_STATIC_TARGET="qt.disable"
fi
AC_SUBST(QT_TARGET)
AC_SUBST(QT_STATIC_TARGET)
### --------------------------------------------------------------------------
### Programs
@ -98,7 +126,7 @@ AC_SUBST(PERL)
# I'm reasonably sure it's correct.
# PERLINCL="/usr/lib/perl5/i386-linux/5.00404"
#
PERLINCL=`perl -MConfig -e 'print $Config{"archlibexp"}'`
PERLINCL=`$PERL -MConfig -e 'print $Config{"archlibexp"}'`
AC_ARG_WITH( perl-includes,
[ --with-perl-includes=DIR specify where to look for perl includes],
PERLINCL="$with_perl_includes" )
@ -272,7 +300,7 @@ AC_SUBST(XMHTML_INC)
## If there's a better way to tackle this please let me know!
OLDCPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS `$GNOME_CONFIG_BIN --cflags glib`"
CPPFLAGS="$CPPFLAGS `$GNOME_CONFIG_BIN --cflags gnome`"
# gnome targets if all goes well
@ -309,7 +337,6 @@ LDFLAGS="$OLDLDFLAGS"
AC_SUBST(GNOME_TARGET)
AC_SUBST(GNOME_STATIC_TARGET)
### --------------------------------------------------------------------------
## Nana
# XXX - There should probably be a --without-nana option (e.g., for
@ -495,6 +522,19 @@ AC_SUBST(GNC_RUNTIME_CONFIGDIR)
ABSOLUTE_TOP_SRCDIR=`pwd`
AC_SUBST(ABSOLUTE_TOP_SRCDIR)
### Begin i18n
AC_ARG_WITH( locale-dir,
[ --with-locale-dir=PATH specify where to look for locale-specific information],
LOCALE_DIR="$with_locale_dir",
LOCALE_DIR="$prefix/share/locale")
AC_SUBST(LOCALE_DIR)
AC_CHECK_HEADER(locale.h, ac_cv_header_locale_h=yes, ac_cv_header_locale_h=no)
AC_CAN_USE_GNU_GETTEXT
### End i18n
AC_CONFIG_HEADER(config.h)
AC_OUTPUT(Makefile
@ -502,6 +542,7 @@ AC_OUTPUT(Makefile
src/Makefile
src/engine/Makefile
src/guile/Makefile
src/guile/i18n.h
src/scm/Makefile
src/g-wrap/Makefile
src/gnome/Makefile
@ -513,6 +554,9 @@ AC_OUTPUT(Makefile
src/reports/pathconfig.h
src/swig/Makefile
src/swig/perl5/Makefile
po/Makefile.in
po/extract-macros.perl
include/messages_i18n.h
lib/Makefile
lib/Xbae-4.6.2-linas/Makefile
lib/Xbae-4.6.2-linas/src/Makefile
@ -522,4 +566,4 @@ chmod +x gnucash
${MAKE-make} -f Makefile.config.finish prefix=${prefix} \
GNC_SHAREDIR=${GNC_SHAREDIR} \
GNC_CONFIGDIR=${GNC_SHAREDIR}
GNC_CONFIGDIR=${GNC_SHAREDIR}

View File

@ -75,7 +75,7 @@ motif motif.static: g-wrap-install
gnome gnome.static: g-wrap-install
qt: g-wrap-install
qt qt.static: g-wrap-install
.PHONY: all gnome gnome.static motif motif.static qt dist
.PHONY: all gnome gnome.static motif motif.static qt qt.static dist

129
make-gnucash-patch Executable file
View File

@ -0,0 +1,129 @@
#!/usr/bin/perl
#
# This perl script is used to make a patch for your GnuCash
# development work. All patches should be submitted to the
# mailing list gnucash-patches@gnucash.org. For more info
# consult the README.
#
# This script requires the programs 'makepatch', 'gzip',
# 'diff', and 'uuencode'.
#
# Author: Dave Peticolas <peticola@cs.ucdavis.edu>
###########################################################
# This section must be configured for your own setup. #
###########################################################
# The directory with the original gnucash sources
my $old = 'gnucash.pristine';
# The directory where you do your development
my $new = 'gnucash';
# The directory where the above two directories reside
my $gnc_home = '/usr/src/misc/gnc';
###########################################################
# This section should not need to be modified. #
###########################################################
# Switch to the home directory
chdir $gnc_home or die "Can't cd!\n";
# Erase the old files
unlink('gnc.diff', 'gnucash.diff.gz', 'gnucash.diff.gz.uue');
# Start out with our basic makepatch arguments
my @args = ('-diff', 'diff -u', '-exclude-vc');
# Add in the exclude patterns from the __DATA__ section
foreach my $pat (<DATA>) {
chomp($pat);
push(@args, '-exclude', $pat) if $pat;
}
# Add the from and to directories for makepatch
push(@args, $old, $new);
# Invoke makepatch with standard out redirected to 'gnucash.diff'
open(OLDOUT, ">&STDOUT");
open(STDOUT, "> gnucash.diff") || die "Can't redirect stdout";
system('makepatch', @args);
close(STDOUT);
open(STDOUT, ">&OLDOUT");
# Make a copy of the ascii diff in 'gnc.diff'
system('cp gnucash.diff gnc.diff');
# Compress the patch
system('gzip -9vf gnucash.diff');
# UU encode the compressed patch
# 'gnucash.diff.gz.uue' is the file you send.
system('uuencode gnucash.diff.gz gnucash.diff.gz > gnucash.diff.gz.uue');
exit(0);
__DATA__
obj
g-wrap-install
Makefile
Makefile.init
config.cache
config.log
config.status
config.h
*.tar.gz
*.log
*.bin
*.patch
*.diff
*.diffs
xacc
*.xac.*.xac
errs*
.#*
TAGS
#*#
libtool
conf.h
stamp-h
configure
.deps
.libs
*.i
gnucash.pm
gnucash-engine-perl5_wrap.c
g-wrap-guile
libgwrapguile.la
gnc-autogen.h
src/g-wrap/gnc.c
src/g-wrap/gnc.h
src/g-wrap/gnc.html
src/guile/gnucash.h
src/scm/bootstrap.scm
src/swig/perl5/gnucash.engine_wrap.doc
g-wrap.info
lib/g-wrap/Makefile.in
lib/g-wrap/rscheme/g-wrap-rs
src/quotes/gnc-prices
gtksheet*
*.wrap
*.orig
*.rej
src/reports/pathconfig.h
*.moc
*.gmo
*.mo
po/Makefile.in
POTFILES
cat-id-tbl.c
gnucash.pot
po/pseudo-source.c
stamp-cat-id
po/extract-macros.perl
include/messages_i18n.h
lib/g-wrap/aclocal.m4

32
mkinstalldirs Executable file
View File

@ -0,0 +1,32 @@
#!/bin/sh
# mkinstalldirs --- make directory hierarchy
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Last modified: 1994-03-25
# Public domain
errstatus=0
for file in ${1+"$@"} ; do
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
shift
pathcomp=
for d in ${1+"$@"} ; do
pathcomp="$pathcomp$d"
case "$pathcomp" in
-* ) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp" 1>&2
mkdir "$pathcomp" || errstatus=$?
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus
# mkinstalldirs ends here

View File

@ -70,13 +70,13 @@ gnome gnome.static: ${GNOME_OBJS}
@cd guile; $(MAKE) default
@cd gnome; $(MAKE) $@
qt: $(QT_OBJS)
qt qt.static: $(QT_OBJS)
@cd engine; $(MAKE) default
@cd register; $(MAKE) qt
@cd reports; $(MAKE) default
@cd g-wrap; $(MAKE) qt
@cd swig; $(MAKE) qt
@cd guile; $(MAKE) default
@cd qt; $(MAKE) qt
@cd qt; $(MAKE) $@
.PHONY: default qt gnome gnome.static motif motif.static all
.PHONY: default qt qt.static gnome gnome.static motif motif.static all

View File

@ -54,7 +54,7 @@ static short module = MOD_LEDGER;
* present a rather natural place for the locks to be placed. *
\********************************************************************/
int
static int
ledgerListCount (xaccLedgerDisplay **list)
{
int n = 0;
@ -65,7 +65,7 @@ ledgerListCount (xaccLedgerDisplay **list)
/* ------------------------------------------------------ */
xaccLedgerDisplay **
static xaccLedgerDisplay **
ledgerListAdd (xaccLedgerDisplay **oldlist, xaccLedgerDisplay *addreg)
{
xaccLedgerDisplay **newlist;
@ -95,7 +95,7 @@ ledgerListAdd (xaccLedgerDisplay **oldlist, xaccLedgerDisplay *addreg)
/* ------------------------------------------------------ */
void
static void
ledgerListRemove (xaccLedgerDisplay **list, xaccLedgerDisplay *delreg)
{
int n, i;
@ -273,6 +273,20 @@ xaccLedgerDisplayAccGroup (Account *acc)
return retval;
}
static gncUIWidget
xaccLedgerDisplayParent(void *user_data)
{
xaccLedgerDisplay *regData = user_data;
if (regData == NULL)
return NULL;
if (regData->get_parent == NULL)
return NULL;
return (regData->get_parent)(regData);
}
/********************************************************************\
* xaccLedgerDisplayLedger *
* opens up a ledger window for a list of accounts *
@ -325,6 +339,7 @@ xaccLedgerDisplayGeneral (Account *lead_acc, Account **acclist, int ledger_type)
regData->leader = lead_acc;
regData->redraw = NULL;
regData->destroy = NULL;
regData->get_parent = NULL;
regData->gui_hook = NULL;
regData->dirty = 0;
regData->balance = 0.0;
@ -358,6 +373,8 @@ xaccLedgerDisplayGeneral (Account *lead_acc, Account **acclist, int ledger_type)
* but will not do the gui init */
regData->ledger = xaccMallocSplitRegister (ledger_type);
xaccSRSetData(regData->ledger, regData, xaccLedgerDisplayParent);
regData->dirty = 1;
xaccLedgerDisplayRefresh (regData);
@ -384,8 +401,8 @@ xaccLedgerDisplayRefresh (xaccLedgerDisplay *regData)
* new splits and get them into the system.
*/
xaccSRLoadRegister (regData->ledger,
xaccQueryGetSplits (regData->query),
regData->leader);
xaccQueryGetSplits (regData->query),
regData->leader);
/* hack alert -- this computation of totals is incorrect
@ -462,31 +479,6 @@ xaccRegisterRefresh (SplitRegister *splitreg)
}
}
/********************************************************************\
* sort of a quick hack involving the layout of the register.
\********************************************************************/
void
xaccRegisterCountHack (SplitRegister *splitreg)
{
xaccLedgerDisplay *regData;
int n;
if (!fullList) return;
/* find the ledger which contains this register */
n = 0; regData = fullList[n];
while (regData) {
if (splitreg == regData->ledger) {
xaccSRCountRows (splitreg,
xaccQueryGetSplits (regData->query),
regData->leader);
return;
}
n++; regData = fullList[n];
}
}
/********************************************************************\
* mark dirty *all* register windows which contain this account *
\********************************************************************/

View File

@ -71,6 +71,7 @@ struct _xaccLedgerDisplay {
void *gui_hook; /* GUI-specific state */
void (*redraw) (xaccLedgerDisplay *); /* redraw callback */
void (*destroy) (xaccLedgerDisplay *); /* destroy callback */
gncUIWidget (*get_parent) (xaccLedgerDisplay *); /* get parent widget */
};
@ -132,12 +133,9 @@ int ledgerIsMember (xaccLedgerDisplay *reg, Account * acc);
*/
void xaccLedgerDisplayClose (xaccLedgerDisplay *);
/********************************************************************\
* sort of a quick hack involving the layout of the register.
\********************************************************************/
void xaccRegisterCountHack (SplitRegister *splitreg);
/*
* close all ledger windows containing this account.
*/
void xaccDestroyLedgerDisplay (Account *acc);
#endif /* __MULTI_LEDGER_H__ */

View File

@ -25,7 +25,7 @@
* =====================================================================
* Some notes on Commit/Rollback:
*
* There's an engine compnenent and a gui componenet to the commit/rollback
* There's an engine component and a gui component to the commit/rollback
* scheme. On the engine side, one must always call BeginEdit()
* before starting to edit a transaction. When you think you're done,
* you can call CommitEdit() to commit the changes, or RollbackEdit() to
@ -50,14 +50,14 @@
* Some notes on Reloads & Redraws:
*
* Reloads and redraws tend to be heavyweight. We try to use change flags
* as much as possible in this code, but imagine the following senario:
* as much as possible in this code, but imagine the following scenario:
*
* Create two bank accounts. Transfer money from one to the other.
* Open two registers, showing each account. Change the amount in one window.
* Note that the other window also redraws, to show the new correct amount.
*
* Since you changed an amount value, potentially *all* displayed balances change
* in *both* register windows (as well as the leger balance in the main window).
* in *both* register windows (as well as the ledger balance in the main window).
* Three or more windows may be involved if you have e.g. windows open for bank,
* employer, taxes and your entering a paycheck... (or correcting a typo in an
* old paycheck)... changing a date might even cause all entries in all three
@ -89,7 +89,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include <assert.h>
#include <stdio.h>
#include "top-level.h"
@ -119,6 +118,12 @@ struct _SRInfo
/* The default account where new splits are added */
Account *default_source_account;
/* User data for users of SplitRegisters */
void *user_data;
/* hook to get parent widget */
gncUIWidget (*get_parent) (void * user_data);
};
@ -130,7 +135,7 @@ struct _SRInfo
* If this flag is set, then any new split will be put into
* the leader account. What happens visually is that it appears
* as if there are two transactions, one debiting and one crediting
* this acount by exactly the same amount. Thus, the user is forced
* this account by exactly the same amount. Thus, the user is forced
* to deal with this somewhat nutty situation.
*
* If this flag is *not* set, then the split just sort of
@ -147,6 +152,12 @@ static int force_double_entry_awareness = 0;
/* This static indicates the debugging module that this .o belongs to. */
static short module = MOD_LEDGER;
/* static prototypes */
static Transaction * xaccSRGetTrans (SplitRegister *reg,
int phys_row, int phys_col);
/* The routines below create, access, and destroy the SRInfo structure
* used by SplitLedger routines to store data for a particular register.
* This is the only code that should access the user_data member of a
@ -184,6 +195,31 @@ xaccSRGetInfo(SplitRegister *reg)
return (SRInfo *) reg->user_data;
}
static gncUIWidget
xaccSRGetParent(SplitRegister *reg)
{
SRInfo *info = xaccSRGetInfo(reg);
assert(reg != NULL);
if (info->get_parent == NULL)
return NULL;
return (info->get_parent)(info->user_data);
}
void
xaccSRSetData(SplitRegister *reg, void *user_data,
SRGetParentCallback get_parent)
{
SRInfo *info = xaccSRGetInfo(reg);
assert(reg != NULL);
info->user_data = user_data;
info->get_parent = get_parent;
}
/* ======================================================== */
/* this callback gets called when the user clicks on the gui
* in such a way as to leave the current transaction, and to
@ -215,19 +251,15 @@ LedgerMoveCursor (Table *table,
int new_phys_row = *p_new_phys_row;
int new_phys_col = *p_new_phys_col;
SplitRegister *reg = (SplitRegister *) client_data;
SRInfo *info = xaccSRGetInfo(reg);
Transaction *newtrans = NULL;
Locator *locator;
Split *split;
int style;
PINFO ("LedgerMoveCursor(): start calback %d %d \n",
PINFO ("LedgerMoveCursor(): start callback %d %d \n",
new_phys_row, new_phys_col);
/* The split where we are moving to */
split = xaccGetUserData (reg->table, new_phys_row, new_phys_col);
if (split != NULL)
newtrans = xaccSplitGetParent(split);
/* The transaction where we are moving to */
newtrans = xaccSRGetTrans(reg, new_phys_row, new_phys_col);
/* commit the contents of the cursor into the database */
xaccSRSaveRegEntry (reg, newtrans);
@ -237,38 +269,35 @@ LedgerMoveCursor (Table *table,
new_phys_row, new_phys_col);
reg->cursor_phys_row = new_phys_row;
reg->cursor_phys_col = new_phys_col;
locator = table->locators[new_phys_row][new_phys_col];
reg->cursor_virt_row = locator->virt_row;
/* if auto-expansion is enabled, we need to redraw the register
* to expand out the splits at the new location. We do some
* tomfoolery here to trick the code into expanding the new location.
* This little futz is sleazy, but it does suceed in getting the
* This little futz is sleazy, but it does succeed in getting the
* LoadRegister code into expanding the appropriate split.
*
*/
style = ((reg->type) & REG_STYLE_MASK);
if ((REG_SINGLE_DYNAMIC == style) ||
(REG_DOUBLE_DYNAMIC == style))
{
Split *split, *oldsplit;
oldsplit = xaccSRGetCurrentSplit (reg);
Split *split;
split = xaccGetUserData (reg->table, new_phys_row, new_phys_col);
reg->table->current_cursor->user_data = (void *) split;
/* if a null split, provide a hint for where the cursor should go */
if (NULL == split) {
reg->cursor_phys_row = new_phys_row;
// reg->cursor_virt_row = reg->table->current_cursor_virt_row;
info->cursor_hint_trans = xaccSplitGetParent (oldsplit);
}
xaccRegisterRefresh (reg);
gnc_refresh_main_window();
/* indicate what row we *should* have gone to */
*p_new_phys_row = table->current_cursor_phys_row;
*p_new_phys_col = table->current_cursor_phys_col;
PINFO ("LedgerMoveCursor(): after dynamic %d %d stored val %d\n",
*p_new_phys_row, new_phys_col, reg->cursor_phys_row);
*p_new_phys_row, *p_new_phys_col, reg->cursor_phys_row);
}
}
@ -285,61 +314,65 @@ LedgerTraverse (Table *table,
int *p_new_phys_col,
void * client_data)
{
int new_phys_row = *p_new_phys_row;
int new_phys_col = *p_new_phys_col;
SplitRegister *reg = (SplitRegister *) client_data;
SRInfo *info = xaccSRGetInfo(reg);
int style;
#ifdef GNOME
static const char *message =
"You have made changes to the current transaction.\n"
"Do you want to record your changes?";
/* For now, just do nothing. The auto mode handling is done entirely
* by LedgerMoveCursor above. */
return;
SplitRegister *reg = client_data;
SRInfo *info = xaccSRGetInfo(reg);
Transaction *trans, *new_trans;
int phys_row = *p_new_phys_row;
int phys_col = *p_new_phys_col;
int virt_row, virt_col;
unsigned int changed;
GNCVerifyResult result;
/* if auto-expansion is enabled, we need to redraw the register
* to expand out the splits at the new location. We do some
* tomfoolery here to trick the code into expanding the new location.
* This little futz is sleazy, but it does suceed in getting the
* LoadRegister code into expanding the appropriate split.
*/
style = ((reg->type) & REG_STYLE_MASK);
if ((REG_SINGLE_DYNAMIC == style) ||
(REG_DOUBLE_DYNAMIC == style))
{
Split *split, *oldsplit;
int save_num_phys_rows, save_num_virt_rows;
int save_cursor_phys_row, save_cursor_virt_row;
trans = xaccSRGetCurrentTrans(reg);
if (trans == NULL)
return;
/* Save the values that xaccSRCountRows will futz up */
save_num_phys_rows = reg->num_phys_rows;
save_num_virt_rows = reg->num_virt_rows;
save_cursor_phys_row = reg->cursor_phys_row;
save_cursor_virt_row = reg->cursor_virt_row;
/* no changes, no worries */
changed = xaccSplitRegisterGetChangeFlag(reg);
if (!changed && (info->pending_trans != trans))
return;
ENTER ("LedgerTraverse with %d %d \n", new_phys_row , new_phys_col);
oldsplit = xaccSRGetCurrentSplit (reg);
split = xaccGetUserData (reg->table, new_phys_row, new_phys_col);
reg->table->current_cursor->user_data = (void *) split;
/* Now see if we are changing cursors. If not, no problems */
if ((phys_row >= 0) && (phys_col >= 0) &&
(phys_row < table->num_phys_rows) && (phys_col < table->num_phys_cols))
{
virt_row = table->locators[phys_row][phys_col]->virt_row;
virt_col = table->locators[phys_row][phys_col]->virt_col;
/* if a null split, provide a hint for where the cursor should go */
if (NULL == split) {
reg->cursor_phys_row = new_phys_row;
// reg->cursor_virt_row = reg->table->current_cursor_virt_row;
info->cursor_hint_trans = xaccSplitGetParent (oldsplit);
}
if ((virt_row == table->current_cursor_virt_row) &&
(virt_col == table->current_cursor_virt_col))
return;
}
xaccRegisterCountHack (reg);
reg->table->current_cursor->user_data = (void *) oldsplit;
/* Same transaction, no problem */
new_trans = xaccSRGetTrans(reg, phys_row, phys_col);
if (trans == new_trans)
return;
LEAVE ("LedgerTraverse with %d \n", reg->cursor_phys_row);
/* indicate what row we *should* go to */
*p_new_phys_row = reg->cursor_phys_row;
/* Ok, we are changing transactions and the current transaction has
* changed. See what the user wants to do. */
/* Restore the values */
reg->num_phys_rows = save_num_phys_rows;
reg->num_virt_rows = save_num_virt_rows;
reg->cursor_phys_row = save_cursor_phys_row;
reg->cursor_virt_row = save_cursor_virt_row;
}
result = gnc_verify_cancel_dialog_parented(xaccSRGetParent(reg),
message, GNC_VERIFY_YES);
switch (result)
{
case GNC_VERIFY_NO:
xaccSRCancelCursorTransChanges(reg);
break;
case GNC_VERIFY_CANCEL:
*p_new_phys_row = table->current_cursor_phys_row;
*p_new_phys_col = table->current_cursor_phys_col;
break;
default:
break;
}
#endif
}
/* ======================================================== */
@ -381,6 +414,42 @@ LedgerDestroy (SplitRegister *reg)
/* ======================================================== */
static Transaction *
xaccSRGetTrans (SplitRegister *reg, int phys_row, int phys_col)
{
Split *split;
int vr, vc;
if ((phys_row < 0) || (phys_col < 0) ||
(phys_row >= reg->table->num_phys_rows) ||
(phys_col >= reg->table->num_phys_cols))
return NULL;
split = xaccGetUserData(reg->table, phys_row, phys_col);
if (split != NULL)
return xaccSplitGetParent(split);
/* Split is blank. Assume it is the blank split of a multi-line
* transaction. Go back one row to find a split in the transaction. */
vr = reg->table->locators[phys_row][phys_col]->virt_row;
vc = reg->table->locators[phys_row][phys_col]->virt_col;
vr --;
if ((0 > vr) || (0 > vc)) {
PERR ("Internal Error: xaccSRGetTrans(): bad row \n");
return NULL;
}
split = (Split *) reg->table->user_data[vr][vc];
if (split == NULL) {
PERR ("Internal Error: xaccSRGetTrans(): no parent \n");
return NULL;
}
return xaccSplitGetParent(split);
}
/* ======================================================== */
Transaction *
xaccSRGetCurrentTrans (SplitRegister *reg)
{
@ -400,13 +469,13 @@ xaccSRGetCurrentTrans (SplitRegister *reg)
vc = reg->table->locators[pr][pc]->virt_col;
vr --;
if ((0 > vr) || (0 > vc)) {
PERR ("Internal Error: SaveRegEntry(): bad row \n");
PERR ("Internal Error: xaccSRGetCurrentTrans(): bad row \n");
return NULL;
}
split = (Split *) reg->table->user_data[vr][vc];
if (split == NULL) {
PERR ("Internal Error: SaveRegEntry(): no parent \n");
PERR ("Internal Error: xaccSRGetCurrentTrans(): no parent \n");
return NULL;
}
@ -685,6 +754,8 @@ xaccSRCancelCursorSplitChanges (SplitRegister *reg)
{
Split * split;
unsigned int changed;
int row = reg->cursor_phys_row;
int col = reg->cursor_phys_col;
changed = xaccSplitRegisterGetChangeFlag(reg);
if (!changed)
@ -694,8 +765,12 @@ xaccSRCancelCursorSplitChanges (SplitRegister *reg)
/* When cancelling edits, reload the cursor from the transaction */
split = xaccSRGetCurrentSplit(reg);
xaccSRLoadRegEntry(reg, split);
xaccRefreshTableGUI(reg->table);
xaccSplitRegisterClearChangeFlag(reg);
if (gnc_table_find_valid_cell_horiz(reg->table, &row, &col, GNC_F))
xaccMoveCursorGUI(reg->table, row, col);
xaccRefreshTableGUI(reg->table);
}
/* ======================================================== */
@ -760,7 +835,6 @@ xaccSRCancelCursorTransChanges (SplitRegister *reg)
void
xaccSRRedrawRegEntry (SplitRegister *reg)
{
Split *split;
Transaction *trans;
unsigned int changed;
@ -769,8 +843,7 @@ xaccSRRedrawRegEntry (SplitRegister *reg)
changed = xaccSplitRegisterGetChangeFlag (reg);
if (!changed) return;
split = xaccSRGetCurrentSplit (reg);
trans = xaccSplitGetParent (split);
trans = xaccSRGetCurrentTrans (reg);
/* refresh the register windows */
/* This split belongs to a transaction that might be displayed
@ -1077,17 +1150,17 @@ xaccSRLoadTransEntry (SplitRegister *reg, Split *split, int do_commit)
double amt;
char * accname=NULL;
Transaction *trans = xaccSplitGetParent (split);
secs = xaccTransGetDateL (trans);
xaccSetDateCellValueSecsL (reg->dateCell, secs);
xaccSetBasicCellValue (reg->numCell, xaccTransGetNum (trans));
xaccSetQuickFillCellValue (reg->descCell, xaccTransGetDescription (trans));
buff[0] = xaccSplitGetReconcile (split);
buff[1] = 0x0;
xaccSetBasicCellValue (reg->recnCell, buff);
/* For income and expense acounts, we have to reverse
* the meaning of balance, since, in a dual entry
* system, income will show up as a credit to a
@ -1099,7 +1172,7 @@ xaccSRLoadTransEntry (SplitRegister *reg, Split *split, int do_commit)
baln = -baln;
}
xaccSetPriceCellValue (reg->balanceCell, baln);
xaccSetPriceCellValue (reg->shrsCell, xaccSplitGetShareBalance (split));
xaccSetComboCellValue (reg->actionCell, xaccSplitGetAction (split));
@ -1162,51 +1235,24 @@ xaccSRLoadTransEntry (SplitRegister *reg, Split *split, int do_commit)
/* ======================================================== */
#define xaccSRLoadSplitEntry xaccSRLoadTransEntry
#ifdef LATER
static void
xaccSRLoadSplitEntry (SplitRegister *reg, Split *split, int do_commit)
{
char buff[2];
if (!split) {
} else {
}
reg->table->current_cursor->user_data = (void *) split;
/* copy cursor contents into the table */
if (do_commit) {
xaccCommitCursor (reg->table);
}
}
#endif
/* ======================================================== */
void
xaccSRLoadRegEntry (SplitRegister *reg, Split *split)
{
xaccSRLoadTransEntry (reg, split, 0);
/* copy cursor contents into the table */
xaccCommitCursor (reg->table);
xaccSRLoadTransEntry (reg, split, GNC_T);
}
/* ======================================================== */
void
xaccSRCountRows (SplitRegister *reg, Split **slist,
Account *default_source_acc)
static void
xaccSRCountRows (SplitRegister *reg, Split **slist)
{
SRInfo *info = xaccSRGetInfo(reg);
int i;
Split *split = NULL;
Split *save_current_split = NULL;
Transaction *save_current_trans = NULL;
int save_cursor_phys_row = -1;
int save_cursor_virt_row = -1;
int save_cursor_phys_row;
int save_cursor_virt_row;
Table *table;
int num_phys_rows;
int num_virt_rows;
@ -1281,7 +1327,7 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
do_expand = multi_line;
do_expand = do_expand ||
(dynamic && xaccIsPeerSplit(split,save_current_split));
if (NULL == save_current_split) {
if (dynamic && (NULL == save_current_split)) {
trans = xaccSplitGetParent (split);
do_expand = do_expand || (trans == info->cursor_hint_trans);
}
@ -1362,16 +1408,15 @@ xaccSRCountRows (SplitRegister *reg, Split **slist,
/* check to make sure we got a good cursor position */
if ((num_phys_rows <= save_cursor_phys_row) ||
(num_virt_rows <= save_cursor_virt_row))
{
save_cursor_phys_row = num_phys_rows - reg->split_cursor->numRows;
save_cursor_virt_row = num_virt_rows - 1;
(num_virt_rows <= save_cursor_virt_row)) {
save_cursor_phys_row = num_phys_rows - reg->split_cursor->numRows;
save_cursor_virt_row = num_virt_rows;
}
if ((save_cursor_phys_row < (reg->header->numRows)) ||
(save_cursor_virt_row < 1))
{
save_cursor_phys_row = reg->header->numRows;
save_cursor_virt_row = 1;
(save_cursor_virt_row < 1)) {
save_cursor_phys_row = reg->header->numRows;
save_cursor_virt_row = 1;
}
/* finally, record the values */
@ -1389,11 +1434,11 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
{
SRInfo *info = xaccSRGetInfo(reg);
int i = 0;
Split *split=NULL, *last_split=NULL;
Split *save_current_split=NULL;
Split *split = NULL;
Split *last_split = NULL;
Split *save_current_split = NULL;
Table *table;
int phys_row;
int save_phys_col;
int vrow;
int type, style;
int multi_line, dynamic;
@ -1414,14 +1459,18 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
lead_cursor = reg->double_cursor;
}
/* count the number of rows */
xaccSRCountRows (reg, slist, default_source_acc);
/* save the current cursor location; we do this by saving a pointer
* to the currently edited split and physical column; we restore
* the cursor to this location when we are done. */
save_current_split = xaccSRGetCurrentSplit (reg);
save_phys_col = table->current_cursor_phys_col;
/* If we are in dynamic mode on a blank split, remember the
* current transaction for determining expansion. */
if (dynamic && (save_current_split == NULL))
info->cursor_hint_trans = xaccSRGetCurrentTrans(reg);
/* count the number of rows */
xaccSRCountRows (reg, slist);
/* disable move callback -- we con't want the cascade of
* callbacks while we are fiddling with loading the register */
@ -1467,7 +1516,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
do_expand = multi_line;
do_expand = do_expand ||
(dynamic && xaccIsPeerSplit(split,save_current_split));
if (NULL == save_current_split) {
if (dynamic && (NULL == save_current_split)) {
trans = xaccSplitGetParent (split);
do_expand = do_expand || (trans == info->cursor_hint_trans);
}
@ -1479,7 +1528,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
xaccSetCursor (table, reg->trans_cursor, phys_row, 0, vrow, 0);
xaccMoveCursor (table, phys_row, 0);
xaccSRLoadTransEntry (reg, split, 1);
xaccSRLoadRegEntry (reg, split);
vrow ++;
phys_row += reg->trans_cursor->numRows;
@ -1493,7 +1542,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
if (secondary != split) {
xaccSetCursor (table, reg->split_cursor, phys_row, 0, vrow, 0);
xaccMoveCursor (table, phys_row, 0);
xaccSRLoadSplitEntry (reg, secondary, 1);
xaccSRLoadRegEntry (reg, secondary);
PINFO ("xaccSRLoadRegister(): "
"load split %d at phys row %d addr=%p \n",
j, phys_row, secondary);
@ -1508,7 +1557,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
/* the simple case ... */
xaccSetCursor (table, lead_cursor, phys_row, 0, vrow, 0);
xaccMoveCursor (table, phys_row, 0);
xaccSRLoadTransEntry (reg, split, 1);
xaccSRLoadRegEntry (reg, split);
vrow ++;
phys_row += lead_cursor->numRows;
}
@ -1516,7 +1565,6 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
PINFO ("xaccSRLoadRegister(): "
"skip trans %d (blank split) \n", i);
}
last_split = split;
i++;
@ -1560,7 +1608,7 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
/* do the transaction row of the blank split */
xaccSetCursor (table, reg->trans_cursor, phys_row, 0, vrow, 0);
xaccMoveCursor (table, phys_row, 0);
xaccSRLoadTransEntry (reg, split, 1);
xaccSRLoadRegEntry (reg, split);
vrow ++;
phys_row += reg->trans_cursor->numRows;
@ -1568,31 +1616,28 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist,
split = xaccTransGetSplit (trans, 1);
xaccSetCursor (table, reg->split_cursor, phys_row, 0, vrow, 0);
xaccMoveCursor (table, phys_row, 0);
xaccSRLoadSplitEntry (reg, split, 1);
xaccSRLoadRegEntry (reg, split);
vrow ++;
phys_row += reg->split_cursor->numRows;
} else {
xaccSetCursor (table, lead_cursor, phys_row, 0, vrow, 0);
xaccMoveCursor (table, phys_row, 0);
xaccSRLoadTransEntry (reg, split, 1);
xaccSRLoadRegEntry (reg, split);
vrow ++;
phys_row += lead_cursor->numRows;
}
/* restore the cursor to its rightful position */
i = 0;
while ((save_phys_col + i < reg->num_cols) || (save_phys_col > 0)) {
if (gnc_register_cell_valid(table, reg->cursor_phys_row,
save_phys_col + i)) {
xaccMoveCursorGUI (table, reg->cursor_phys_row, save_phys_col + i);
break;
{
int row = reg->cursor_phys_row;
int col = reg->cursor_phys_col;
if (gnc_table_find_valid_cell_horiz(table, &row, &col, GNC_F))
{
xaccMoveCursorGUI(table, row, col);
reg->cursor_phys_row = row;
reg->cursor_phys_col = col;
}
if (gnc_register_cell_valid(table, reg->cursor_phys_row,
save_phys_col - i)) {
xaccMoveCursorGUI (table, reg->cursor_phys_row, save_phys_col - i);
break;
}
i++;
}
/* If we didn't find the pending transaction, it was removed

View File

@ -20,11 +20,10 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include "top-level.h"
#include <gnome.h>
#include "config.h"
#include "top-level.h"
#include "gnucash.h"
#include "messages.h"
#include "AccWindow.h"
@ -103,9 +102,9 @@ gnc_account_tree_new_with_root(Account * root)
static void
gnc_account_tree_init(GNCAccountTree *tree)
{
tree->root_account = NULL;
tree->current_account = NULL;
tree->ignore_unselect = GNC_F;
tree->root_account = NULL;
tree->current_accounts = NULL;
tree->ignore_unselect = GNC_F;
gnc_init_account_view_info(&tree->avi);
@ -269,14 +268,17 @@ gnc_account_tree_refresh(GNCAccountTree * tree)
{
GtkCList *clist = GTK_CLIST(tree);
GHashTable *expanded_accounts;
GList *current_accounts;
GtkAdjustment *adjustment;
gfloat save_value = 0.0;
gfloat save_value = 0.0;
adjustment = gtk_clist_get_vadjustment(GTK_CLIST(tree));
if (adjustment != NULL)
save_value = adjustment->value;
expanded_accounts = gnc_account_tree_save_expanded(tree);
current_accounts = tree->current_accounts;
tree->current_accounts = NULL;
gtk_clist_freeze(clist);
@ -291,8 +293,7 @@ gnc_account_tree_refresh(GNCAccountTree * tree)
gnc_account_tree_update_column_visibility(tree);
if (!gnc_account_tree_select_account(tree, tree->current_account, FALSE))
tree->current_account = NULL;
gnc_account_tree_select_accounts(tree, current_accounts, FALSE);
if (adjustment != NULL)
{
@ -304,6 +305,7 @@ gnc_account_tree_refresh(GNCAccountTree * tree)
gtk_clist_thaw(clist);
g_hash_table_destroy(expanded_accounts);
g_list_free(current_accounts);
}
@ -347,12 +349,13 @@ gnc_account_tree_get_view_info(GNCAccountTree *tree, AccountViewInfo *info)
/********************************************************************\
* gnc_account_tree_select_account *
* select an account in the tree and possibly expands and scrolls *
* the tree to ensure it is visible *
* select an account in the tree and expands the tree to make *
* sure it could be visible. It may also scroll the tree to *
* ensure it is visible *
* *
* Args: tree - tree to be modified *
* account - account to be selected *
* show - if true, expand and show the tree *
* show - if true, scroll the tree *
* Returns: true if the account was found *
\********************************************************************/
gboolean
@ -373,9 +376,6 @@ gnc_account_tree_select_account(GNCAccountTree *tree,
/* Select it */
gtk_ctree_select(ctree, node);
if (!show)
return TRUE;
/* Expand all the parents */
row = GTK_CTREE_ROW(node);
while ((n = row->parent) != NULL)
@ -384,6 +384,9 @@ gnc_account_tree_select_account(GNCAccountTree *tree,
row = GTK_CTREE_ROW(n);
}
if (!show)
return TRUE;
/* Make sure it's visible */
if (gtk_ctree_node_is_visible(ctree, node) != GTK_VISIBILITY_FULL)
gtk_ctree_node_moveto(ctree, node, 0, 0.5, 0.0);
@ -392,6 +395,44 @@ gnc_account_tree_select_account(GNCAccountTree *tree,
}
/********************************************************************\
* gnc_account_tree_select_accounts *
* select a list of accounts in the tree, expanding the parents *
* of each one. If 'show' is true, the last one is made visible. *
* *
* Args: tree - tree to be modified *
* account_list - list of accounts to be selected *
* show - determines if last account is made visible *
* Returns: true if the last account was found in the list *
\********************************************************************/
gboolean
gnc_account_tree_select_accounts(GNCAccountTree *tree,
GList *account_list,
gboolean show_last)
{
Account *account;
gboolean real_show;
gboolean result = FALSE;
gtk_clist_freeze(GTK_CLIST(tree));
while (account_list != NULL)
{
account = account_list->data;
real_show = (account_list->next == NULL) ? show_last : FALSE;
result = gnc_account_tree_select_account(tree, account, real_show);
account_list = account_list->next;
}
gtk_clist_thaw(GTK_CLIST(tree));
return result;
}
/********************************************************************\
* gnc_account_tree_remove_account *
* removes an account from the tree *
@ -495,7 +536,7 @@ gnc_account_tree_update_column_visibility(GNCAccountTree *tree)
/********************************************************************\
* gnc_account_tree_get_current_account *
* returns the current account selected, or NULL if none *
* returns the first account selected, or NULL if none *
* *
* Args: tree - tree to get current account from *
* Returns: current account *
@ -503,7 +544,30 @@ gnc_account_tree_update_column_visibility(GNCAccountTree *tree)
Account *
gnc_account_tree_get_current_account (GNCAccountTree *tree)
{
return tree->current_account;
if (tree == NULL)
return NULL;
if (tree->current_accounts == NULL)
return NULL;
return tree->current_accounts->data;
}
/********************************************************************\
* gnc_account_tree_get_current_accounts *
* returns a g_malloc'd GList of the selected accounts *
* *
* Args: tree - tree to get current accounts from *
* Returns: GList of selected accounts *
\********************************************************************/
GList *
gnc_account_tree_get_current_accounts (GNCAccountTree *tree)
{
if (tree == NULL)
return NULL;
return g_list_copy(tree->current_accounts);
}
@ -557,13 +621,14 @@ gnc_account_tree_set_view_info_real(GNCAccountTree *tree)
static gint
gnc_account_tree_key_press(GtkWidget *widget, GdkEventKey *event)
{
GNCAccountTree *account_tree = GNC_ACCOUNT_TREE(widget);
GNCAccountTree *tree = GNC_ACCOUNT_TREE(widget);
Account *account = gnc_account_tree_get_current_account(tree);
if ((event->keyval == GDK_Return) && (account_tree->current_account != NULL))
if ((event->keyval == GDK_Return) && (account != NULL))
{
gtk_signal_emit(GTK_OBJECT(account_tree),
gtk_signal_emit(GTK_OBJECT(tree),
account_tree_signals[ACTIVATE_ACCOUNT],
account_tree->current_account);
account);
return TRUE;
}
@ -601,7 +666,7 @@ gnc_account_tree_button_press(GtkWidget *widget,
gtk_signal_emit(GTK_OBJECT(widget),
account_tree_signals[ACTIVATE_ACCOUNT],
account);
account);
return TRUE;
}
@ -619,15 +684,19 @@ gnc_account_tree_select_row(GtkCTree *ctree,
gint column)
{
GNCAccountTree *tree = GNC_ACCOUNT_TREE(ctree);
Account *account;
GList *node;
tree->ignore_unselect = GNC_F;
tree->current_account = gtk_ctree_node_get_row_data(ctree,
GTK_CTREE_NODE(row));
account = gtk_ctree_node_get_row_data(ctree, GTK_CTREE_NODE(row));
node = g_list_find(tree->current_accounts, account);
if (node == NULL)
tree->current_accounts = g_list_prepend(tree->current_accounts, account);
gtk_signal_emit(GTK_OBJECT(ctree),
account_tree_signals[SELECT_ACCOUNT],
tree->current_account);
account);
GTK_CTREE_CLASS(parent_class)->tree_select_row(ctree, row, column);
}
@ -639,6 +708,7 @@ gnc_account_tree_unselect_row(GtkCTree *ctree,
{
GNCAccountTree *tree = GNC_ACCOUNT_TREE(ctree);
Account *account;
GList *node;
if (tree->ignore_unselect)
{
@ -648,8 +718,14 @@ gnc_account_tree_unselect_row(GtkCTree *ctree,
account = gtk_ctree_node_get_row_data(ctree, GTK_CTREE_NODE(row));
if (account == tree->current_account)
tree->current_account = NULL;
node = g_list_find(tree->current_accounts, account);
while (node != NULL)
{
tree->current_accounts = g_list_remove_link(tree->current_accounts, node);
g_list_free_1(node);
node = g_list_find(tree->current_accounts, account);
}
gtk_signal_emit(GTK_OBJECT(ctree),
account_tree_signals[UNSELECT_ACCOUNT],
@ -752,6 +828,9 @@ gnc_account_tree_destroy(GtkObject *object)
tree->deficit_style = NULL;
}
g_list_free(tree->current_accounts);
tree->current_accounts = NULL;
if (GTK_OBJECT_CLASS(parent_class)->destroy)
(* GTK_OBJECT_CLASS(parent_class)->destroy) (object);
}

View File

@ -59,7 +59,8 @@ struct _GNCAccountTree
GtkStyle *deficit_style;
Account *root_account;
Account *current_account;
GList *current_accounts;
gboolean ignore_unselect;
};
@ -97,6 +98,10 @@ gboolean gnc_account_tree_select_account (GNCAccountTree *tree,
Account *account,
gboolean show_account);
gboolean gnc_account_tree_select_accounts(GNCAccountTree *tree,
GList *account_list,
gboolean show_last);
void gnc_account_tree_insert_account (GNCAccountTree *tree,
Account *account);
@ -108,6 +113,7 @@ void gnc_account_tree_show_categories (GNCAccountTree *tree);
void gnc_account_tree_hide_categories (GNCAccountTree *tree);
Account * gnc_account_tree_get_current_account (GNCAccountTree *tree);
GList * gnc_account_tree_get_current_accounts (GNCAccountTree *tree);
void gnc_account_tree_hide_all_but_name (GNCAccountTree *tree);

View File

@ -23,10 +23,11 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include "config.h"
#include <gnome.h>
#include "ui-callbacks.h"
#include "cursors.h"

View File

@ -28,10 +28,10 @@
* -- tooltips for the widgets in the window
*/
#include <gnome.h>
#include "top-level.h"
#include <gnome.h>
#include "AccWindow.h"
#include "MainWindow.h"
#include "FileDialog.h"
@ -88,6 +88,12 @@ gnc_ui_accWindow_list_select_cb(GtkCList * type_list, gint row, gint column,
if(accData == NULL)
return;
if (!gtk_clist_get_selectable(type_list, row))
{
gtk_clist_unselect_row(type_list, row, 0);
return;
}
accData->type = row;
_accWindow_last_used_account_type = row;
@ -164,7 +170,7 @@ gnc_ui_accWindow_list_box_create(AccWindow * accData)
{
GtkWidget *frame, *hbox;
frame = gtk_frame_new("Type of Account");
frame = gtk_frame_new(ACC_TYPE_STR);
gtk_widget_show(frame);
hbox = gtk_hbox_new(TRUE, 0);
@ -177,9 +183,10 @@ gnc_ui_accWindow_list_box_create(AccWindow * accData)
gtk_container_border_width(GTK_CONTAINER(accData->type_list), 3);
gtk_widget_show(GTK_WIDGET(accData->type_list));
gnc_ui_accWindow_list_fill(accData->type_list);
gtk_clist_columns_autosize(GTK_CLIST(accData->type_list));
gtk_signal_connect(GTK_OBJECT(accData->type_list), "select-row",
GTK_SIGNAL_FUNC(gnc_ui_accWindow_list_select_cb),
accData);
@ -263,7 +270,7 @@ gnc_ui_accWindow_tree_select(GNCAccountTree *tree,
parentAccType = xaccAccountGetType(account);
/* set the alowable account types for this parent */
/* set the allowable account types for this parent */
for (type = 0; type < NUM_ACCOUNT_TYPES; type++)
{
compatible = xaccAccountTypesCompatible(parentAccType, type);
@ -300,7 +307,6 @@ gnc_ui_accWindow_account_tree_box_create(AccWindow * accData)
gtk_clist_column_titles_hide(GTK_CLIST(accountTree));
gnc_account_tree_hide_all_but_name(GNC_ACCOUNT_TREE(accountTree));
gnc_account_tree_refresh(GNC_ACCOUNT_TREE(accountTree));
gtk_widget_show(accountTree);
accData->tree = GNC_ACCOUNT_TREE(accountTree);
@ -315,7 +321,7 @@ gnc_ui_accWindow_account_tree_box_create(AccWindow * accData)
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollWin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(frame), scrollWin);
gtk_container_border_width (GTK_CONTAINER (scrollWin), 5);
gtk_container_add(GTK_CONTAINER(scrollWin), accountTree);
@ -403,6 +409,9 @@ gnc_accWindow_create(AccWindow *accData)
/* don't close on buttons */
gnome_dialog_set_close(GNOME_DIALOG(dialog), FALSE);
/* allow grow and shrink, no auto-shrink */
gtk_window_set_policy(GTK_WINDOW(dialog), TRUE, TRUE, FALSE);
/* Account field edit box */
widget = gnc_ui_account_field_box_create(&accData->edit_info, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
@ -444,8 +453,6 @@ gnc_accWindow_create(AccWindow *accData)
widget = gnc_ui_notes_frame_create(&accData->edit_info.notes_entry);
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
gtk_widget_show_all(dialog);
gnc_account_tree_select_account(accData->tree, accData->parentAccount, TRUE);
return dialog;
@ -462,18 +469,19 @@ gnc_accWindow_create(AccWindow *accData)
AccWindow *
accWindow (AccountGroup *this_is_not_used)
{
gint result;
AccWindow *accData = g_new0(AccWindow, 1);
GtkWidget *dialog;
AccountFieldStrings strings;
GtkWidget *dialog;
gint result;
accData->parentAccount = gnc_get_current_account();
accData->newAccount = xaccMallocAccount();
accData->type = _accWindow_last_used_account_type;
xaccAccountSetName(accData->newAccount, "New top level account");
xaccAccountSetName(accData->newAccount, NEW_TOP_ACCT_STR);
dialog = gnc_accWindow_create(accData);
gtk_widget_show_all(dialog);
while (1)
{
@ -490,8 +498,7 @@ accWindow (AccountGroup *this_is_not_used)
/* check for valid name */
if (safe_strcmp(strings.name, "") == 0)
{
gnc_error_dialog_parented(GTK_WINDOW(dialog),
"You must enter a valid account name.");
gnc_error_dialog_parented(GTK_WINDOW(dialog), ACC_NO_NAME_MSG);
gnc_ui_free_field_strings(&strings);
continue;
}
@ -499,8 +506,7 @@ accWindow (AccountGroup *this_is_not_used)
/* check for valid type */
if (accData->type == BAD_TYPE)
{
gnc_error_dialog_parented(GTK_WINDOW(dialog),
"You must select an account type.");
gnc_error_dialog_parented(GTK_WINDOW(dialog), ACC_TYPE_MSG);
gnc_ui_free_field_strings(&strings);
continue;
}

View File

@ -24,12 +24,11 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include "top-level.h"
#include <gnome.h>
#include <stdio.h>
#include "top-level.h"
#include "AccWindow.h"
#include "MainWindow.h"
#include "Refresh.h"
@ -93,7 +92,7 @@ gnc_ui_EditAccWindow_ok_cb(GtkWidget * widget,
/* check for valid name */
if (safe_strcmp(strings.name, "") == 0)
{
gnc_error_dialog("You must enter a valid account name.");
gnc_error_dialog(ACC_NO_NAME_MSG);
gnc_ui_free_field_strings(&strings);
return;
}

View File

@ -23,11 +23,10 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include <gnome.h>
#include "top-level.h"
#include "config.h"
#include <gnome.h>
#include "FileBox.h"
#include "messages.h"
#include "util.h"

View File

@ -17,12 +17,18 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include <top-level.h>
#include <gnome.h>
#include "dialog-options.h"
#include "dialog-utils.h"
#include "option-util.h"
#include "query-user.h"
#include "gnc-helpers.h"
#include "account-tree.h"
#include "global-options.h"
#include "messages.h"
#include "util.h"
/* This static indicates the debugging module that this .o belongs to. */
@ -82,7 +88,7 @@ gnc_option_set_ui_value(GNCOption *option, gboolean use_default)
{
int index;
index = gnc_option_value_permissible_value_index(option, value);
index = gnc_option_permissible_value_index(option, value);
if (index < 0)
bad_value = TRUE;
else
@ -92,6 +98,30 @@ gnc_option_set_ui_value(GNCOption *option, gboolean use_default)
GINT_TO_POINTER(index));
}
}
else if (safe_strcmp(type, "date") == 0)
{
Timespec ts;
if (gnc_timepair_p(value))
{
ts = gnc_timepair2timespec(value);
gnome_date_edit_set_time(GNOME_DATE_EDIT(option->widget), ts.tv_sec);
}
else
bad_value = TRUE;
}
else if (safe_strcmp(type, "account-list") == 0)
{
GList *list;
list = gnc_scm_to_account_list(value);
gtk_clist_unselect_all(GTK_CLIST(option->widget));
gnc_account_tree_select_accounts(GNC_ACCOUNT_TREE(option->widget),
list, TRUE);
g_list_free(list);
}
else
{
PERR("gnc_option_set_ui_value: Unknown type. Ignoring.\n");
@ -148,7 +178,28 @@ gnc_option_get_ui_value(GNCOption *option)
"gnc_multichoice_index");
index = GPOINTER_TO_INT(_index);
result = gnc_option_value_permissible_value(option, index);
result = gnc_option_permissible_value(option, index);
}
else if (safe_strcmp(type, "date") == 0)
{
Timespec ts;
ts.tv_sec = gnome_date_edit_get_date(GNOME_DATE_EDIT(option->widget));
ts.tv_nsec = 0;
result = gnc_timespec2timepair(ts);
}
else if (safe_strcmp(type, "account-list") == 0)
{
GNCAccountTree *tree;
GList *list;
tree = GNC_ACCOUNT_TREE(option->widget);
list = gnc_account_tree_get_current_accounts(tree);
result = gnc_account_list_to_scm(list);
g_list_free(list);
}
else
{
@ -178,9 +229,8 @@ default_button_cb(GtkButton *button, gpointer data)
static GtkWidget *
gnc_option_create_default_button(GNCOption *option)
{
GtkWidget *default_button = gtk_button_new_with_label("Set to default");
GtkWidget *default_button = gtk_button_new_with_label(SET_TO_DEFAULT_STR);
gtk_widget_show(default_button);
gtk_container_set_border_width(GTK_CONTAINER(default_button), 2);
gtk_signal_connect(GTK_OBJECT(default_button), "clicked",
@ -247,7 +297,7 @@ gnc_option_create_multichoice_widget(GNCOption *option)
int num_values;
int i;
num_values = gnc_option_value_num_permissible_values(option);
num_values = gnc_option_num_permissible_values(option);
g_return_val_if_fail(num_values >= 0, NULL);
@ -255,8 +305,8 @@ gnc_option_create_multichoice_widget(GNCOption *option)
for (i = 0; i < num_values; i++)
{
info[i].name = gnc_option_value_permissible_value_name(option, i);
info[i].tip = gnc_option_value_permissible_value_description(option, i);
info[i].name = gnc_option_permissible_value_name(option, i);
info[i].tip = gnc_option_permissible_value_description(option, i);
info[i].callback = gnc_option_multichoice_cb;
info[i].user_data = option;
}
@ -273,15 +323,131 @@ gnc_option_create_multichoice_widget(GNCOption *option)
return widget;
}
static void
gnc_option_account_cb(GNCAccountTree *tree, Account * account, gpointer data)
{
GNCOption *option = data;
GtkWidget *pbox;
option->changed = TRUE;
pbox = gtk_widget_get_toplevel(GTK_WIDGET(tree));
gnome_property_box_changed(GNOME_PROPERTY_BOX(pbox));
}
static void
gnc_option_account_select_all_cb(GtkWidget *widget, gpointer data)
{
GNCOption *option = data;
GtkWidget *pbox;
gtk_clist_select_all(GTK_CLIST(option->widget));
option->changed = TRUE;
pbox = gtk_widget_get_toplevel(GTK_WIDGET(widget));
gnome_property_box_changed(GNOME_PROPERTY_BOX(pbox));
}
static void
gnc_option_account_clear_all_cb(GtkWidget *widget, gpointer data)
{
GNCOption *option = data;
GtkWidget *pbox;
gtk_clist_unselect_all(GTK_CLIST(option->widget));
option->changed = TRUE;
pbox = gtk_widget_get_toplevel(GTK_WIDGET(widget));
gnome_property_box_changed(GNOME_PROPERTY_BOX(pbox));
}
static GtkWidget *
gnc_option_set_ui_widget(GNCOption *option)
gnc_option_create_account_widget(GNCOption *option, char *name)
{
gboolean multiple_selection;
GtkWidget *scroll_win;
GtkWidget *button;
GtkWidget *frame;
GtkWidget *tree;
GtkWidget *vbox;
GtkWidget *bbox;
multiple_selection = gnc_option_multiple_selection(option);
frame = gtk_frame_new(name);
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(frame), vbox);
tree = gnc_account_tree_new();
gtk_clist_column_titles_hide(GTK_CLIST(tree));
gnc_account_tree_hide_all_but_name(GNC_ACCOUNT_TREE(tree));
gnc_account_tree_refresh(GNC_ACCOUNT_TREE(tree));
if (multiple_selection)
gtk_clist_set_selection_mode(GTK_CLIST(tree), GTK_SELECTION_MULTIPLE);
gtk_signal_connect(GTK_OBJECT(tree), "select_account",
GTK_SIGNAL_FUNC(gnc_option_account_cb), option);
gtk_signal_connect(GTK_OBJECT(tree), "unselect_account",
GTK_SIGNAL_FUNC(gnc_option_account_cb), option);
scroll_win = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_box_pack_start(GTK_BOX(vbox), scroll_win, FALSE, FALSE, 0);
gtk_container_border_width(GTK_CONTAINER(scroll_win), 5);
gtk_container_add(GTK_CONTAINER(scroll_win), tree);
bbox = gtk_hbutton_box_new();
gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD);
gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 10);
if (multiple_selection)
{
button = gtk_button_new_with_label(SELECT_ALL_STR);
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gnc_option_account_select_all_cb),
option);
button = gtk_button_new_with_label(CLEAR_ALL_STR);
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gnc_option_account_clear_all_cb),
option);
}
button = gtk_button_new_with_label(SELECT_DEFAULT_STR);
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(default_button_cb), option);
option->widget = tree;
return frame;
}
static void
gnc_option_set_ui_widget(GNCOption *option, GtkBox *page_box)
{
GtkWidget *enclosing = NULL;
GtkWidget *value = NULL;
gboolean packed = FALSE;
char *name, *documentation;
char *type;
type = gnc_option_type(option);
if (type == NULL)
return;
name = gnc_option_name(option);
documentation = gnc_option_documentation(option);
@ -347,29 +513,91 @@ gnc_option_set_ui_widget(GNCOption *option)
gnc_option_create_default_button(option),
FALSE, FALSE, 0);
}
else if (safe_strcmp(type, "date") == 0)
{
GtkWidget *entry;
GtkWidget *label;
gchar *colon_name;
gboolean show_time;
gboolean use24;
colon_name = g_strconcat(name, ":", NULL);
label= gtk_label_new(colon_name);
gtk_misc_set_alignment(GTK_MISC(label), 0.95, 0.5);
g_free(colon_name);
enclosing = gtk_hbox_new(FALSE, 5);
show_time = gnc_option_show_time(option);
use24 = gnc_lookup_boolean_option("International",
"Use 24-hour time format", FALSE);
value = gnome_date_edit_new(time(NULL), show_time, use24);
option->widget = value;
gnc_option_set_ui_value(option, FALSE);
entry = GNOME_DATE_EDIT(value)->date_entry;
gnc_set_tooltip(entry, documentation);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
GTK_SIGNAL_FUNC(gnc_option_changed_cb), option);
if (show_time)
{
entry = GNOME_DATE_EDIT(value)->time_entry;
gnc_set_tooltip(entry, documentation);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
GTK_SIGNAL_FUNC(gnc_option_changed_cb), option);
}
gtk_box_pack_start(GTK_BOX(enclosing), label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(enclosing), value, FALSE, FALSE, 0);
gtk_box_pack_end(GTK_BOX(enclosing),
gnc_option_create_default_button(option),
FALSE, FALSE, 0);
}
else if (safe_strcmp(type, "account-list") == 0)
{
enclosing = gnc_option_create_account_widget(option, name);
value = option->widget;
gnc_set_tooltip(enclosing, documentation);
gtk_box_pack_start(page_box, enclosing, FALSE, FALSE, 5);
packed = TRUE;
gtk_widget_realize(value);
gnc_option_set_ui_value(option, FALSE);
gtk_clist_set_row_height(GTK_CLIST(value), 0);
gtk_widget_set_usize(value, 0, GTK_CLIST(value)->row_height * 10);
}
else
{
PERR("gnc_option_set_ui_widget: Unknown type. Ignoring.\n");
}
if (!packed && (enclosing != NULL))
gtk_box_pack_start(page_box, enclosing, FALSE, FALSE, 0);
if (value != NULL)
gnc_set_tooltip(value, documentation);
if (enclosing != NULL)
gtk_widget_show_all(enclosing);
free(documentation);
free(name);
if (documentation != NULL)
free(documentation);
if (name != NULL)
free(name);
free(type);
return enclosing;
}
static void
gnc_options_dialog_add_option(GtkWidget *page, GNCOption *option)
{
gtk_box_pack_start(GTK_BOX(page), gnc_option_set_ui_widget(option),
FALSE, FALSE, 0);
gnc_option_set_ui_widget(option, GTK_BOX(page));
}
static void

View File

@ -17,11 +17,12 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include <gnome.h>
#include "top-level.h"
#include <gnome.h>
#include "dialog-transfer.h"
#include "dialog-utils.h"
#include "MultiLedger.h"
#include "FileDialog.h"
#include "Refresh.h"
@ -110,9 +111,10 @@ gnc_xfer_dialog_create_tree_frame(Account *initial, gchar *title,
}
}
button = gtk_check_button_new_with_label("Show Categories");
button = gtk_check_button_new_with_label(SHOW_CATEGORIES_STR);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), is_category);
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
gnc_set_tooltip(button, SHOW_CAT_MSG);
gtk_signal_connect(GTK_OBJECT(button), "toggled",
GTK_SIGNAL_FUNC(gnc_xfer_dialog_toggle_cb),
@ -151,7 +153,7 @@ gnc_xfer_dialog_create(GtkWidget * parent, Account * initial,
{
GtkWidget *frame, *vbox, *hbox, *label;
frame = gtk_frame_new(_("Transfer Information"));
frame = gtk_frame_new(XFER_INFO);
gtk_container_set_border_width(GTK_CONTAINER(frame), 5);
gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox),
@ -316,17 +318,14 @@ gnc_xfer_dialog(GtkWidget * parent, Account * initial)
if (!xaccAccountsHaveCommonCurrency(from, to))
{
gnc_error_dialog_parented(GTK_WINDOW(dialog),
"You cannot transfer between those accounts." \
"\nThey do not have a common currency.");
gnc_error_dialog_parented(GTK_WINDOW(dialog), XFER_CURR_MSG);
continue;
}
string = gtk_entry_get_text(GTK_ENTRY(xferData.amount_entry));
if (sscanf(string, "%lf", &amount) != 1)
{
gnc_error_dialog_parented(GTK_WINDOW(dialog),
"The amount must be a number.");
gnc_error_dialog_parented(GTK_WINDOW(dialog), AMOUNT_NUM_MSG);
continue;
}

View File

@ -42,7 +42,7 @@ gnc_ui_notes_frame_create(GtkEditable **notes_entry)
{
GtkWidget *frame, *text, *table, *vscr;
frame = gtk_frame_new("Notes");
frame = gtk_frame_new(NOTES_STR);
gtk_container_border_width(GTK_CONTAINER(frame), 5);
gtk_widget_show(frame);
@ -109,7 +109,7 @@ gnc_ui_account_field_box_create(AccountEditInfo * info,
{
GtkWidget *frame, *vbox, *hbox, *widget;
frame = gtk_frame_new("Account Info");
frame = gtk_frame_new(ACC_INFO_STR);
gtk_container_border_width(GTK_CONTAINER(frame), 5);
gtk_widget_show(frame);
@ -188,7 +188,7 @@ gnc_get_source_name(gint source)
switch (source)
{
case SOURCE_NONE :
return "None";
return NONE_STR;
case SOURCE_YAHOO :
return "Yahoo";
case SOURCE_FIDELITY :
@ -296,7 +296,7 @@ gnc_ui_account_source_box_create(AccountEditInfo * info)
{
GtkWidget *frame, *hbox, *widget, *omenu;
frame = gtk_frame_new("Quote Source");
frame = gtk_frame_new(QUOTE_SRC_STR);
gtk_container_border_width(GTK_CONTAINER(frame), 5);
gtk_widget_show(frame);
@ -304,7 +304,7 @@ gnc_ui_account_source_box_create(AccountEditInfo * info)
gtk_container_border_width(GTK_CONTAINER(hbox), 5);
gtk_widget_show(hbox);
widget = gtk_label_new("Source for stock quotes:");
widget = gtk_label_new(QUOTE_SRC_MSG);
gtk_misc_set_alignment (GTK_MISC(widget), 0.95, 0.5);
gtk_widget_show(widget);

View File

@ -17,6 +17,8 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include "top-level.h"
#include <gnome.h>
#include "global-options.h"
@ -25,13 +27,15 @@
#include "option-util.h"
#include "query-user.h"
#include "guile-util.h"
#include "messages.h"
#include "util.h"
/* This static indicates the debugging module that this .o belongs to. */
static short module = MOD_GUI;
static GNCOptionDB *global_options = NULL;
static SCM guile_global_options = SCM_UNDEFINED;
static SCM guile_global_options = SCM_UNDEFINED;
static SCM guile_global_options_id = SCM_UNDEFINED;
/********************************************************************\
@ -71,8 +75,10 @@ gnc_options_shutdown()
gnc_option_db_destroy(global_options);
global_options = NULL;
gnc_unregister_c_side_scheme_ptr(guile_global_options);
if (guile_global_options_id != SCM_UNDEFINED)
gnc_unregister_c_side_scheme_ptr_id(guile_global_options_id);
guile_global_options = SCM_UNDEFINED;
guile_global_options_id = SCM_UNDEFINED;
}
@ -209,7 +215,7 @@ void
_gnc_register_global_options(SCM options)
{
guile_global_options = options;
gnc_register_c_side_scheme_ptr(options);
guile_global_options_id = gnc_register_c_side_scheme_ptr(options);
}
@ -257,7 +263,7 @@ gnc_show_options_dialog()
gnc_build_options_dialog_contents(options_dialog, global_options);
gnc_option_db_clean(global_options);
gtk_window_set_title(GTK_WINDOW(options_dialog), "GnuCash Preferences");
gtk_window_set_title(GTK_WINDOW(options_dialog), GNC_PREFS);
gtk_signal_connect(GTK_OBJECT(options_dialog), "apply",
GTK_SIGNAL_FUNC(gnc_options_dialog_apply_cb),

View File

@ -17,11 +17,17 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include <time.h>
#include <g-wrap.h>
#include "top-level.h"
#include "guile-util.h"
#include "option-util.h"
#include "dialog-options.h"
#include "gnc-helpers.h"
#include "gnc.h"
#include "window-main.h"
#include "ui-callbacks.h"
#include "util.h"
@ -63,7 +69,7 @@ struct _Getters
SCM setter;
SCM default_getter;
SCM value_validator;
SCM permissible_values;
SCM option_data;
};
@ -181,7 +187,7 @@ gnc_option_db_destroy(GNCOptionDB *odb)
option = option_node->data;
/* Should we check return value? */
gnc_unregister_c_side_scheme_ptr(option->guile_option_id);
gnc_unregister_c_side_scheme_ptr_id(option->guile_option_id);
option_node = option_node->next;
}
@ -280,8 +286,7 @@ initialize_getters()
gh_eval_str("gnc:option-default-getter");
getters.value_validator =
gh_eval_str("gnc:option-value-validator");
getters.permissible_values =
gh_eval_str("gnc:option-permissible-values");
getters.option_data = gh_eval_str("gnc:option-data");
getters_initialized = TRUE;
}
@ -447,7 +452,7 @@ gnc_option_value_validator(GNCOption *option)
/********************************************************************\
* gnc_option_value_num_permissible_values *
* gnc_option_num_permissible_values *
* returns the number of permissible values in the option, or *
* -1 if there are no values available. *
* *
@ -455,15 +460,13 @@ gnc_option_value_validator(GNCOption *option)
* Returns: number of permissible options or -1 *
\********************************************************************/
int
gnc_option_value_num_permissible_values(GNCOption *option)
gnc_option_num_permissible_values(GNCOption *option)
{
SCM values;
initialize_getters();
values = gnc_guile_call1_to_list(getters.permissible_values,
option->guile_option);
values = gnc_guile_call1_to_list(getters.option_data, option->guile_option);
if (values == SCM_UNDEFINED)
return -1;
@ -472,7 +475,7 @@ gnc_option_value_num_permissible_values(GNCOption *option)
/********************************************************************\
* gnc_option_value_permissible_value_index *
* gnc_option_permissible_value_index *
* returns the index of the permissible value matching the *
* provided value, or -1 if it couldn't be found *
* *
@ -481,7 +484,7 @@ gnc_option_value_num_permissible_values(GNCOption *option)
* Returns: index of permissible value, or -1 *
\********************************************************************/
int
gnc_option_value_permissible_value_index(GNCOption *option, SCM search_value)
gnc_option_permissible_value_index(GNCOption *option, SCM search_value)
{
SCM values, vector, value;
int num_values, i;
@ -491,9 +494,7 @@ gnc_option_value_permissible_value_index(GNCOption *option, SCM search_value)
initialize_getters();
values = gnc_guile_call1_to_list(getters.permissible_values,
option->guile_option);
values = gnc_guile_call1_to_list(getters.option_data, option->guile_option);
if (values == SCM_UNDEFINED)
return -1;
@ -516,7 +517,7 @@ gnc_option_value_permissible_value_index(GNCOption *option, SCM search_value)
/********************************************************************\
* gnc_option_value_permissible_value *
* gnc_option_permissible_value *
* returns the SCM handle to the indexth permissible value in the *
* option, or SCM_UNDEFINED if the index was out of range or *
* there was some other problem. *
@ -526,7 +527,7 @@ gnc_option_value_permissible_value_index(GNCOption *option, SCM search_value)
* Returns: SCM handle to option value or SCM_UNDEFINED *
\********************************************************************/
SCM
gnc_option_value_permissible_value(GNCOption *option, int index)
gnc_option_permissible_value(GNCOption *option, int index)
{
SCM values, vector, value;
@ -535,9 +536,7 @@ gnc_option_value_permissible_value(GNCOption *option, int index)
initialize_getters();
values = gnc_guile_call1_to_list(getters.permissible_values,
option->guile_option);
values = gnc_guile_call1_to_list(getters.option_data, option->guile_option);
if (values == SCM_UNDEFINED)
return SCM_UNDEFINED;
@ -557,7 +556,7 @@ gnc_option_value_permissible_value(GNCOption *option, int index)
/********************************************************************\
* gnc_option_value_permissible_value_name *
* gnc_option_permissible_value_name *
* returns the malloc'd name of the indexth permissible value in *
* the option, or NULL if the index was out of range or there are *
* no values available. *
@ -567,7 +566,7 @@ gnc_option_value_permissible_value(GNCOption *option, int index)
* Returns: malloc'd name of permissible value or NULL *
\********************************************************************/
char *
gnc_option_value_permissible_value_name(GNCOption *option, int index)
gnc_option_permissible_value_name(GNCOption *option, int index)
{
SCM values, vector, name;
@ -576,9 +575,7 @@ gnc_option_value_permissible_value_name(GNCOption *option, int index)
initialize_getters();
values = gnc_guile_call1_to_list(getters.permissible_values,
option->guile_option);
values = gnc_guile_call1_to_list(getters.option_data, option->guile_option);
if (values == SCM_UNDEFINED)
return NULL;
@ -598,7 +595,7 @@ gnc_option_value_permissible_value_name(GNCOption *option, int index)
/********************************************************************\
* gnc_option_value_permissible_value_description *
* gnc_option_permissible_value_description *
* returns the malloc'd description of the indexth permissible *
* value in the option, or NULL if the index was out of range or *
* there are no values available. *
@ -608,7 +605,7 @@ gnc_option_value_permissible_value_name(GNCOption *option, int index)
* Returns: malloc'd description of permissible value or NULL *
\********************************************************************/
char *
gnc_option_value_permissible_value_description(GNCOption *option, int index)
gnc_option_permissible_value_description(GNCOption *option, int index)
{
SCM values, vector, help;
@ -617,9 +614,7 @@ gnc_option_value_permissible_value_description(GNCOption *option, int index)
initialize_getters();
values = gnc_guile_call1_to_list(getters.permissible_values,
option->guile_option);
values = gnc_guile_call1_to_list(getters.option_data, option->guile_option);
if (values == SCM_UNDEFINED)
return NULL;
@ -638,6 +633,48 @@ gnc_option_value_permissible_value_description(GNCOption *option, int index)
}
/********************************************************************\
* gnc_option_show_time *
* returns true if the gui should display the time as well as *
* the date for this option. Only use this for date options. *
* *
* Args: option - the GNCOption *
* Returns: true if time should be shown *
\********************************************************************/
gboolean
gnc_option_show_time(GNCOption *option)
{
SCM value;
initialize_getters();
value = gh_call1(getters.option_data, option->guile_option);
return !gh_scm2bool(gh_not(value));
}
/********************************************************************\
* gnc_option_multiple_selection *
* returns true if the gui should allow multiple selection of *
* accounts. Only use this for account options. *
* *
* Args: option - the GNCOption *
* Returns: true if multiple selection allowed *
\********************************************************************/
gboolean
gnc_option_multiple_selection(GNCOption *option)
{
SCM value;
initialize_getters();
value = gh_call1(getters.option_data, option->guile_option);
return !gh_scm2bool(gh_not(value));
}
static gint
compare_sections(gconstpointer a, gconstpointer b)
{
@ -950,6 +987,9 @@ gnc_commit_option(GNCOption *option)
/* Validate the ui's value */
value = gnc_option_get_ui_value(option);
if (value == SCM_UNDEFINED)
return;
validator = gnc_option_value_validator(option);
result = gh_call1(validator, value);
@ -1172,3 +1212,149 @@ gnc_option_db_lookup_multichoice_option(GNCOptionDB *odb, char *section,
return strdup(default_value);
}
/********************************************************************\
* gnc_option_db_lookup_date_option *
* looks up a date option. If present, returns its value in the *
* set_value argument provided, otherwise copies the default_value*
* argument (if non-NULL) to the set_value argument. If the *
* default_value argument is NULL, copies the current date to *
* set_value. Whatever value is stored in set_value is return *
* as an approximate (no nanoseconds) time_t value. set_value *
* may be NULL, in which case only the return value can be used. *
* *
* Args: odb - option database to search in *
* section - section name of option *
* name - name of option *
* set_value - location to store option value *
* default - default value if not found *
* Return: time_t approximation of set_value *
\********************************************************************/
time_t
gnc_option_db_lookup_date_option(GNCOptionDB *odb, char *section, char *name,
Timespec *set_value, Timespec *default_value)
{
GNCOption *option;
Timespec temp;
SCM getter;
SCM value;
if (set_value == NULL)
set_value = &temp;
option = gnc_option_db_get_option_by_name(odb, section, name);
if (option != NULL)
{
getter = gnc_option_getter(option);
if (getter != SCM_UNDEFINED)
{
value = gh_call0(getter);
if (gnc_timepair_p(value))
*set_value = gnc_timepair2timespec(value);
}
}
else
{
if (default_value == NULL)
{
set_value->tv_sec = time(NULL);
set_value->tv_nsec = 0;
}
else
*set_value = *default_value;
}
return set_value->tv_sec;
}
/********************************************************************\
* gnc_account_list_to_scm *
* Turn a list of accounts into an SCM. *
* *
* Args: account_list - list of accounts to SCMify *
* Return: SCM list of accounts *
\********************************************************************/
SCM
gnc_account_list_to_scm(GList *account_list)
{
SCM list;
Account *account;
POINTER_TOKEN pt;
SCM scm_account;
list = gh_eval_str("()");
while (account_list != NULL)
{
account = account_list->data;
pt = make_POINTER_TOKEN("Account*", account);
scm_account = POINTER_TOKEN_to_SCM(pt);
list = gh_cons(scm_account, list);
account_list = account_list->next;
}
return list;
}
/********************************************************************\
* gnc_scm_to_account_list *
* Turn an SCM into a g_malloc's account list *
* *
* Args: scm_list - SCM list of accounts *
* Return: GList of accounts *
\********************************************************************/
GList *
gnc_scm_to_account_list(SCM scm_list)
{
POINTER_TOKEN pt;
GList *account_list = NULL;
Account *account;
SCM scm_pt;
if (!gh_list_p(scm_list))
return NULL;
while (!gh_null_p(scm_list))
{
scm_pt = gh_car(scm_list);
if (is_a_POINTER_TOKEN(scm_pt) == SCM_BOOL_T)
{
pt = (POINTER_TOKEN) gh_cdr(scm_pt);
account = pt->pdata;
account_list = g_list_prepend(account_list, account);
}
scm_list = gh_cdr(scm_list);
}
return account_list;
}
/********************************************************************\
* gnc_get_current_accounts *
* Return an SCMified list of the current accounts *
* *
* Args: none *
* Return: SCM list of current accounts *
\********************************************************************/
SCM
_gnc_get_current_accounts()
{
GList *list;
SCM scm_list;
list = gnc_get_current_accounts();
scm_list = gnc_account_list_to_scm(list);
g_list_free(list);
return scm_list;
}

View File

@ -65,12 +65,13 @@ SCM gnc_option_getter(GNCOption *option);
SCM gnc_option_setter(GNCOption *option);
SCM gnc_option_default_getter(GNCOption *option);
SCM gnc_option_value_validator(GNCOption *option);
int gnc_option_value_num_permissible_values(GNCOption *option);
int gnc_option_value_permissible_value_index(GNCOption *option, SCM value);
SCM gnc_option_value_permissible_value(GNCOption *option, int index);
char * gnc_option_value_permissible_value_name(GNCOption *option, int index);
char * gnc_option_value_permissible_value_description(GNCOption *option,
int index);
int gnc_option_num_permissible_values(GNCOption *option);
int gnc_option_permissible_value_index(GNCOption *option, SCM value);
SCM gnc_option_permissible_value(GNCOption *option, int index);
char * gnc_option_permissible_value_name(GNCOption *option, int index);
char * gnc_option_permissible_value_description(GNCOption *option, int index);
gboolean gnc_option_show_time(GNCOption *option);
gboolean gnc_option_multiple_selection(GNCOption *option);
guint gnc_option_db_num_sections(GNCOptionDB *odb);
@ -108,5 +109,11 @@ char * gnc_option_db_lookup_multichoice_option(GNCOptionDB *odb,
void _gnc_option_db_register_option(GNCOptionDBHandle handle,
SCM guile_option);
/* These should be in src/guile or src/g-wrap, but they use glib */
SCM gnc_account_list_to_scm(GList *account_list);
GList * gnc_scm_to_account_list(SCM scm_list);
SCM _gnc_get_current_accounts();
#endif /* __OPTION_UTIL_H__ */

View File

@ -17,15 +17,20 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include <gnome.h>
#include "top-level.h"
#include <gnome.h>
#include "ui-callbacks.h"
#include "messages.h"
#include "query-user.h"
#include "util.h"
/* This static indicates the debugging module that this .o belongs to. */
static short module = MOD_GUI;
/********************************************************************
gnc_foundation_query_dialog
@ -199,6 +204,66 @@ gnc_foundation_query_dialog(const gchar *title,
return query_dialog;
}
/********************************************************************\
* gnc_verify_cancel_dialog *
* display a message, and asks the user to press "Yes", "No", or *
* "Cancel"
* *
* NOTE: This function does not return until the dialog is closed *
* *
* Args: message - the message to display *
* default - the button that will be the default *
* Return: the result the user selected *
\********************************************************************/
GNCVerifyResult
gnc_verify_cancel_dialog_parented(GtkWidget *parent, const char *message,
GNCVerifyResult default_result)
{
GtkWidget *verify_box = NULL;
gint default_button;
gint result;
verify_box = gnome_message_box_new(message,
GNOME_MESSAGE_BOX_QUESTION,
GNOME_STOCK_BUTTON_YES,
GNOME_STOCK_BUTTON_NO,
GNOME_STOCK_BUTTON_CANCEL,
NULL);
switch (default_result)
{
case GNC_VERIFY_YES:
default_button = 0;
break;
case GNC_VERIFY_NO:
default_button = 1;
break;
case GNC_VERIFY_CANCEL:
default_button = 2;
break;
default:
PWARN("gnc_verify_cancel_dialog: bad default button\n");
default_button = 0;
break;
}
gnome_dialog_set_default(GNOME_DIALOG(verify_box), default_button);
if (parent != NULL)
gnome_dialog_set_parent(GNOME_DIALOG(verify_box), GTK_WINDOW(parent));
result = gnome_dialog_run_and_close(GNOME_DIALOG(verify_box));
switch (result)
{
case 0:
return GNC_VERIFY_YES;
case 1:
return GNC_VERIFY_NO;
case 2:
default:
return GNC_VERIFY_CANCEL;
}
}
/********************************************************************\
* gnc_verify_dialog *
@ -209,7 +274,7 @@ gnc_foundation_query_dialog(const gchar *title,
* Args: message - the message to display *
* yes_is_default - If true, "Yes" is default, *
* "No" is the default button. *
* Return: none *
* Return: true for "Yes", false for "No" *
\********************************************************************/
gncBoolean
gnc_verify_dialog(const char *message, gncBoolean yes_is_default)
@ -228,7 +293,7 @@ gnc_verify_dialog(const char *message, gncBoolean yes_is_default)
* message - the message to display *
* yes_is_default - If true, "Yes" is default, *
* "No" is the default button. *
* Return: none *
* Return: true for "Yes", false for "No" *
\********************************************************************/
gncBoolean
gnc_verify_dialog_parented(GtkWindow *parent, const char *message,

View File

@ -1,7 +1,6 @@
#ifndef __QUERY_USER_H__
#define __QUERY_USER_H__
#include "gnc-common.h"
#include <guile/gh.h>
enum

View File

@ -19,11 +19,10 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include "top-level.h"
#include <gnome.h>
#include "config.h"
#include "top-level.h"
#include "gnucash.h"
#include "messages.h"
#include "reconcile-listP.h"
@ -90,7 +89,7 @@ static void
gnc_reconcile_list_init(GNCReconcileList *list)
{
GtkCList *clist = GTK_CLIST(list);
static gchar * titles[] =
gchar * titles[] =
{
DATE_STR,
NUM_STR,

View File

@ -17,6 +17,8 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include <gnome.h>
#include "scripts_menu.h"
#include "top-level.h"

View File

@ -20,7 +20,6 @@
#ifndef __SCRIPTS_MENU_H__
#define __SCRIPTS_MENU_H__
#include <gnome.h>
#include <guile/gh.h>
void gnc_extensions_menu_add_item(char *name, char *hint, SCM script);

View File

@ -19,12 +19,12 @@
* *
\********************************************************************/
#include "top-level.h"
#include <stdlib.h>
#include <guile/gh.h>
#include <gnome.h>
#include "top-level.h"
#include "window-main.h"
#include "global-options.h"
#include "gnucash-sheet.h"

View File

@ -1,5 +0,0 @@
// Contains the version of GnuCash
#include <glib.h>
gchar *VERSION = "1.1.26";

View File

@ -23,11 +23,11 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include "top-level.h"
#include <gnome.h>
#include <time.h>
#include "top-level.h"
#include "ui-callbacks.h"
#include "MultiLedger.h"
#include "AdjBWindow.h"
@ -95,8 +95,7 @@ gnc_ui_AdjBWindow_ok_cb(GtkWidget * widget, gpointer data)
if(sscanf(string, "%lf", &new_balance) != 1)
{
gnc_error_dialog_parented(GTK_WINDOW(adjBData->dialog),
"Balance must be a number.");
gnc_error_dialog_parented(GTK_WINDOW(adjBData->dialog), BALANCE_NUM_MSG);
return;
}

View File

@ -24,9 +24,9 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include <gnome.h>
#include <top-level.h>
#include "config.h"
#include <gnome.h>
#include "window-help.h"
#include "window-html.h"
@ -44,6 +44,7 @@ typedef struct _HelpData HelpData;
struct _HelpData
{
gchar *htmlfile;
gchar *title;
gchar *label;
gchar *text;
};
@ -52,64 +53,82 @@ struct _HelpData
static HelpData *
help_data_new()
{
HelpData *hd;
HelpData *help_data;
hd = g_new0(HelpData, 1);
help_data = g_new0(HelpData, 1);
return hd;
return help_data;
}
static void
help_data_destroy(HTMLHistoryData history_data)
help_data_destroy(HTMLUserData history_data)
{
HelpData *hd = history_data;
HelpData *help_data = history_data;
g_free(hd->htmlfile);
hd->htmlfile = NULL;
g_free(help_data->htmlfile);
help_data->htmlfile = NULL;
g_free(hd->label);
hd->label = NULL;
g_free(help_data->title);
help_data->title = NULL;
g_free(hd->text);
hd->text = NULL;
g_free(help_data->label);
help_data->label = NULL;
g_free(hd);
g_free(help_data->text);
help_data->text = NULL;
g_free(help_data);
}
static void
help_data_set_file(HelpData *hd, const gchar *htmlfile)
help_data_set_file(HelpData *help_data, const gchar *htmlfile)
{
g_free(hd->htmlfile);
hd->htmlfile = g_strdup(htmlfile);
g_free(help_data->htmlfile);
help_data->htmlfile = g_strdup(htmlfile);
}
static void
help_data_set_label(HelpData *hd, const gchar *label)
help_data_set_title(HelpData *help_data, const gchar *title)
{
g_free(hd->label);
hd->label = g_strdup(label);
g_free(help_data->title);
help_data->title = g_strdup(title);
}
static void
help_data_set_text(HelpData *hd, const gchar *text)
help_data_set_label(HelpData *help_data, const gchar *label)
{
g_free(hd->text);
hd->text = g_strdup(text);
g_free(help_data->label);
help_data->label = g_strdup(label);
}
static void
help_data_set_text(HelpData *help_data, const gchar *text)
{
g_free(help_data->text);
help_data->text = g_strdup(text);
}
static HTMLHistoryData
helpAnchorCB(XmHTMLAnchorCallbackStruct *acbs, HTMLHistoryData history_data)
static HTMLData *
helpAnchorCB(XmHTMLAnchorCallbackStruct *acbs, HTMLUserData user_data)
{
HelpData *hd;
HelpData *user = user_data;
HTMLData *html_data;
HelpData *help_data;
switch(acbs->url_type)
{
/* a local file with a possible jump to label */
case ANCHOR_FILE_LOCAL:
hd = help_data_new();
help_data_set_file(hd, acbs->href);
return hd;
help_data = help_data_new();
help_data_set_file(help_data, acbs->href);
help_data_set_title(help_data, user->title);
html_data = gnc_html_data_new(user->title, help_data,
help_data_destroy,
NULL, 0);
return html_data;
/* other types are unsupported, but it would be fun if they were ... */
case ANCHOR_FTP:
@ -131,51 +150,51 @@ helpAnchorCB(XmHTMLAnchorCallbackStruct *acbs, HTMLHistoryData history_data)
}
static void
helpJumpCB(HTMLHistoryData history_data, char **set_text, char **set_label)
helpJumpCB(HTMLUserData user_data, char **set_text, char **set_label)
{
HelpData *hd = (HelpData *) history_data;
HelpData *help_data = user_data;
char *text = NULL;
char *label = NULL;
*set_text = NULL;
*set_label = NULL;
if (hd->text != NULL)
if (help_data->text != NULL)
{
*set_text = hd->text;
*set_label = hd->label;
*set_text = help_data->text;
*set_label = help_data->label;
return;
}
if (hd->htmlfile == NULL)
if (help_data->htmlfile == NULL)
return;
/* see if this anchor contains a jump */
label = strpbrk(hd->htmlfile, "#?");
label = strpbrk(help_data->htmlfile, "#?");
if (label != NULL)
{
help_data_set_label(hd, label);
help_data_set_label(help_data, label);
/* truncate # from name */
hd->htmlfile[label - hd->htmlfile] = 0x0;
help_data->htmlfile[label - help_data->htmlfile] = 0x0;
}
/* see if the anchor is an "active gnucash page" */
if (strstr(hd->htmlfile, ".phtml"))
text = gncReport(hd->htmlfile);
if (strstr(help_data->htmlfile, ".phtml"))
text = gncReport(help_data->htmlfile);
/* if text to display wasn't specified, use the truncated name to read */
if (text == NULL)
text = gncReadFile(hd->htmlfile);
text = gncReadFile(help_data->htmlfile);
if (text != NULL)
{
help_data_set_text(hd, text);
help_data_set_text(help_data, text);
free(text);
}
*set_text = hd->text;
*set_label = hd->label;
*set_text = help_data->text;
*set_label = help_data->label;
}
@ -191,16 +210,19 @@ helpJumpCB(HTMLHistoryData history_data, char **set_text, char **set_label)
void
helpWindow(GtkWidget *parent, const char *title, const char *htmlfile)
{
HelpData *hd;
HTMLData *html_data;
HelpData *help_data;
if (helpwindow == NULL)
helpwindow = gnc_html_window_new(help_data_destroy, helpAnchorCB,
helpJumpCB);
hd = help_data_new();
help_data_set_file(hd, htmlfile);
helpwindow = gnc_html_window_new(helpAnchorCB, helpJumpCB);
htmlWindow(parent, &helpwindow, title, hd, NULL, 0);
help_data = help_data_new();
help_data_set_file(help_data, htmlfile);
help_data_set_title(help_data, title);
html_data = gnc_html_data_new(title, help_data, help_data_destroy, NULL, 0);
htmlWindow(parent, &helpwindow, html_data);
}

View File

@ -25,10 +25,6 @@
#ifndef __WINDOW_HELP_H__
#define __WINDOW_HELP_H__
#include <gnome.h>
#include "config.h"
/** PROTOTYPES ******************************************************/

View File

@ -29,6 +29,7 @@
#include "top-level.h"
#include "window-html.h"
#include "messages.h"
#include "File.h"
#include "util.h"
@ -40,33 +41,118 @@ static short module = MOD_HTML;
* hack alert -- these are gui-independent, and should be moved *
* to a central location *
\********************************************************************/
struct _HTMLData
{
char *title;
GnomeUIInfo *user_buttons;
int num_user_buttons;
HTMLUserData user_data;
HTMLDestroyUserDataFunc destroy;
};
typedef struct _HTMLHistoryNode HTMLHistoryNode;
struct _HTMLHistoryNode
{
HTMLHistoryNode *next;
HTMLHistoryNode *last;
HTMLHistoryData history_data;
HTMLData *data;
};
typedef struct _HTMLHistory HTMLHistory;
struct _HTMLHistory
{
HTMLHistoryNode *current_node;
HTMLHistoryDestroyDataFunc destroy;
};
/********************************************************************\
* gnc_html_data_new *
* construct a new html data structure *
* *
* Args: title - the title of the html window *
* user_data - html user data, whatever you like *
* destroy - function to destroy user data, or NULL*
* user_buttons - new buttons for the toolbar *
* num_user_buttons - number of new buttons *
* Return: html data structure *
\********************************************************************/
HTMLData *
gnc_html_data_new(const char *title, HTMLUserData user_data,
HTMLDestroyUserDataFunc destroy,
GnomeUIInfo *user_buttons,
int num_user_buttons)
{
HTMLData *data;
data = malloc(sizeof(HTMLData));
assert(data != NULL);
if (title != NULL)
{
data->title = strdup(title);
assert(title != NULL);
}
else
data->title = NULL;
if (num_user_buttons == 0)
data->user_buttons = NULL;
else
{
int i;
data->user_buttons = calloc(num_user_buttons, sizeof(GnomeUIInfo));
assert(data->user_buttons != NULL);
for (i = 0; i < num_user_buttons; i++)
data->user_buttons[i] = user_buttons[i];
}
data->num_user_buttons = num_user_buttons;
data->user_data = user_data;
data->destroy = destroy;
return data;
}
static void
html_data_destroy(HTMLData *data)
{
if (data == NULL)
return;
if (data->title != NULL)
free(data->title);
data->title = NULL;
if (data->user_buttons != NULL)
free(data->user_buttons);
data->user_buttons = NULL;
data->num_user_buttons = 0;
if ((data->destroy != NULL) &&
(data->user_data != NULL))
(data->destroy)(data->user_data);
data->destroy = NULL;
free(data);
}
static HTMLHistoryNode *
history_node_new(const HTMLHistoryData history_data)
history_node_new(HTMLData *data)
{
HTMLHistoryNode *new;
new = malloc(sizeof(HTMLHistoryNode));
assert(new != NULL);
new->history_data = history_data;
new->data = data;
new->last = NULL;
new->next = NULL;
@ -77,14 +163,14 @@ history_node_new(const HTMLHistoryData history_data)
* is the first element in the history. If not last element
* in history, all next pages are deleted */
static gncBoolean
historyInsert(HTMLHistory *history, const HTMLHistoryData history_data)
historyInsert(HTMLHistory *history, HTMLData *data)
{
HTMLHistoryNode *new;
HTMLHistoryNode *temp;
assert(history != NULL);
new = history_node_new(history_data);
new = history_node_new(data);
if (history->current_node == NULL)
{
@ -97,8 +183,8 @@ historyInsert(HTMLHistory *history, const HTMLHistoryData history_data)
while(temp != NULL)
{
history->current_node->next = temp->next;
if (temp->history_data != NULL)
(history->destroy)(temp->history_data);
html_data_destroy(temp->data);
temp->data = NULL;
free(temp);
temp = history->current_node->next;
@ -112,7 +198,7 @@ historyInsert(HTMLHistory *history, const HTMLHistoryData history_data)
}
/* Move forward in history, and return current history data */
static HTMLHistoryData
static HTMLData *
historyFwd(HTMLHistory *history)
{
if (history == NULL)
@ -123,11 +209,11 @@ historyFwd(HTMLHistory *history)
if (history->current_node->next != NULL)
history->current_node = history->current_node->next;
return history->current_node->history_data;
return history->current_node->data;
}
/* Move back in history, and return current history data */
static HTMLHistoryData
static HTMLData *
historyBack(HTMLHistory *history)
{
if (history == NULL)
@ -138,10 +224,10 @@ historyBack(HTMLHistory *history)
if (history->current_node->last != NULL)
history->current_node = history->current_node->last;
return history->current_node->history_data;
return history->current_node->data;
}
/* Remove all entries from history: */
/* Remove all entries from history */
static void
historyClear(HTMLHistory *history)
{
@ -160,19 +246,19 @@ historyClear(HTMLHistory *history)
HTMLHistoryNode *temp = history->current_node->next;
history->current_node->next = temp->next;
if (temp->history_data != NULL)
(history->destroy)(temp->history_data);
html_data_destroy(temp->data);
temp->data = NULL;
free(temp);
}
/* delete current page: */
if (history->current_node->history_data != NULL)
(history->destroy)(history->current_node->history_data);
html_data_destroy(history->current_node->data);
history->current_node->data = NULL;
free(history->current_node);
history->current_node = NULL;
}
static HTMLHistoryData
static HTMLData *
historyData(HTMLHistory *history)
{
if (history == NULL)
@ -180,11 +266,23 @@ historyData(HTMLHistory *history)
if (history->current_node == NULL)
return NULL;
return history->current_node->history_data;
return history->current_node->data;
}
static HTMLUserData
historyUserData(HTMLHistory *history)
{
HTMLData *data;
data = historyData(history);
if (data == NULL)
return NULL;
return data->user_data;
}
static HTMLHistory *
historyNew(HTMLHistoryDestroyDataFunc destroy)
historyNew()
{
HTMLHistory *history;
@ -192,7 +290,6 @@ historyNew(HTMLHistoryDestroyDataFunc destroy)
assert(history != NULL);
history->current_node = NULL;
history->destroy = destroy;
return history;
}
@ -220,6 +317,8 @@ struct _HTMLWindow
GtkWidget *forward;
GtkWidget *back;
GtkWidget *toolbar;
HTMLHistory *history;
HTMLAnchorCB anchor_cb;
@ -246,19 +345,19 @@ static void htmlSetButtonStates(HTMLWindow *hw);
/********************************************************************\
* gnc_html_window_history_data *
* return the current history data for the window *
* gnc_html_window_user_data *
* return the current user data for the window *
* *
* Args: none *
* Return: history data for the window *
* Return: user data for the window *
\********************************************************************/
HTMLHistoryData
gnc_html_window_history_data(HTMLWindow *hw)
HTMLUserData
gnc_html_window_user_data(HTMLWindow *hw)
{
if (hw == NULL)
return NULL;
return historyData(hw->history);
return historyUserData(hw->history);
}
@ -266,18 +365,18 @@ gnc_html_window_history_data(HTMLWindow *hw)
* gnc_html_window_new *
* g_malloc and initialize HTMLWindow structure *
* *
* Args: none *
* Args: anchor_cb - callback for new html pages *
* jump_cb - callback for html text *
* Return: g_malloc'd initialized HTMLWindow structure *
\********************************************************************/
HTMLWindow *
gnc_html_window_new(HTMLHistoryDestroyDataFunc destroy,
HTMLAnchorCB anchor_cb, HTMLJumpCB jump_cb)
gnc_html_window_new(HTMLAnchorCB anchor_cb, HTMLJumpCB jump_cb)
{
HTMLWindow *hw;
hw = g_new0(HTMLWindow, 1);
hw->history = historyNew(destroy);
hw->history = historyNew();
hw->anchor_cb = anchor_cb;
hw->jump_cb = jump_cb;
@ -309,20 +408,20 @@ gnc_html_window_destroy(HTMLWindow *hw)
}
static GtkWidget *
create_html_toolbar(HTMLWindow *hw, GnomeUIInfo *user_buttons,
gint num_buttons)
static void
gnc_html_window_fill_toolbar(HTMLWindow *hw)
{
GnomeUIInfo *toolbar_info;
GtkWidget *toolbar;
gint num_start, num_end;
GList *children, *node;
HTMLData *data;
gint i;
GnomeUIInfo toolbar_start[] =
{
{ GNOME_APP_UI_ITEM,
"Back",
"Move back one step in the history.",
BACK_STR,
TOOLTIP_HTML_BACK,
htmlBackCB, hw,
NULL,
GNOME_APP_PIXMAP_STOCK,
@ -330,8 +429,8 @@ create_html_toolbar(HTMLWindow *hw, GnomeUIInfo *user_buttons,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
"Forward",
"Move forward one step in the history.",
FORWARD_STR,
TOOLTIP_HTML_FORW,
htmlFwdCB, hw,
NULL,
GNOME_APP_PIXMAP_STOCK,
@ -343,8 +442,8 @@ create_html_toolbar(HTMLWindow *hw, GnomeUIInfo *user_buttons,
GnomeUIInfo toolbar_end[] =
{
{ GNOME_APP_UI_ITEM,
"Close",
"Close this HTML window.",
CLOSE_STR,
TOOLTIP_CLOSE_HTML,
closeHtmlWinCB, hw,
NULL,
GNOME_APP_PIXMAP_STOCK,
@ -354,30 +453,42 @@ create_html_toolbar(HTMLWindow *hw, GnomeUIInfo *user_buttons,
GNOMEUIINFO_END
};
data = historyData(hw->history);
if (data == NULL)
return;
if (hw->toolbar == NULL)
return;
node = children = gtk_container_children(GTK_CONTAINER(hw->toolbar));
while (node != NULL)
{
gtk_container_remove(GTK_CONTAINER(hw->toolbar), GTK_WIDGET(node->data));
node = node->next;
}
g_list_free(children);
num_start = sizeof(toolbar_start) / sizeof(GnomeUIInfo);
num_end = sizeof(toolbar_end) / sizeof(GnomeUIInfo);
toolbar_info = g_new0(GnomeUIInfo, num_start + num_buttons + num_end);
toolbar_info = g_new0(GnomeUIInfo,
num_start + data->num_user_buttons + num_end);
for (i = 0; i < num_start; i++)
toolbar_info[i] = toolbar_start[i];
for (i = 0; i < num_buttons; i++)
toolbar_info[i + num_start] = user_buttons[i];
for (i = 0; i < data->num_user_buttons; i++)
toolbar_info[i + num_start] = data->user_buttons[i];
for (i = 0; i < num_end; i++)
toolbar_info[i + num_start + num_buttons] = toolbar_end[i];
toolbar_info[i + num_start + data->num_user_buttons] = toolbar_end[i];
toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH);
gnome_app_fill_toolbar(GTK_TOOLBAR(toolbar), toolbar_info, NULL);
gnome_app_fill_toolbar(GTK_TOOLBAR(hw->toolbar), toolbar_info, NULL);
hw->back = toolbar_info[0].widget;
hw->forward = toolbar_info[1].widget;
g_free(toolbar_info);
return toolbar;
}
@ -387,23 +498,19 @@ create_html_toolbar(HTMLWindow *hw, GnomeUIInfo *user_buttons,
* *
* Args: parent - the parent widget *
* hwp - the htmlwindow structure pointer *
* title - the title of the window *
* history_data - the history data *
* new_buttons - array of buttons to add to icon bar *
* data - the data for the window *
* user_buttons - array of buttons to add to icon bar *
* num_buttons - number of buttons in list *
* Return: none *
\********************************************************************/
void
htmlWindow(GtkWidget * parent,
HTMLWindow ** hwp,
const char * const title,
HTMLHistoryData history_data,
GnomeUIInfo *user_buttons,
gint num_buttons)
htmlWindow(GtkWidget *parent,
HTMLWindow **hwp,
HTMLData *data)
{
HTMLWindow *hw = *hwp;
historyInsert(hw->history, history_data);
historyInsert(hw->history, data);
/* If the help window is already created, just load the new
* page into the existing widget and raise the window. */
@ -429,7 +536,6 @@ htmlWindow(GtkWidget * parent,
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
hw->window = window;
gtk_window_set_title(GTK_WINDOW (window), title);
gtk_window_set_policy(GTK_WINDOW (window), TRUE, TRUE, FALSE);
gtk_window_set_default_size(GTK_WINDOW(window), 675, 400);
@ -438,9 +544,10 @@ htmlWindow(GtkWidget * parent,
dock_item = gnome_dock_item_new("toolbar", GNOME_DOCK_ITEM_BEH_EXCLUSIVE);
toolbar = create_html_toolbar(hw, user_buttons, num_buttons);
toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH);
gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);
gtk_container_add(GTK_CONTAINER(dock_item), toolbar);
hw->toolbar = toolbar;
gnome_dock_add_item (GNOME_DOCK(dock), GNOME_DOCK_ITEM(dock_item),
GNOME_DOCK_TOP, 0, 0, 0, TRUE);
@ -505,46 +612,56 @@ htmlSetButtonStates(HTMLWindow *hw)
* Return: none *
\********************************************************************/
static gboolean
htmlKeyCB( GtkWidget *widget, GdkEventKey *event, gpointer data )
htmlKeyCB(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
HTMLWindow *hw = (HTMLWindow *) data;
GtkXmHTML *html = GTK_XMHTML(hw->htmlwidget);
GtkAdjustment *adj;
gfloat value;
GtkAdjustment *vadj, *hadj;
gfloat v_value, h_value;
if (html->vsba == NULL)
return FALSE;
adj = GTK_ADJUSTMENT(html->vsba);
vadj = GTK_ADJUSTMENT(html->vsba);
hadj = GTK_ADJUSTMENT(html->hsba);
value = adj->value;
v_value = vadj->value;
h_value = hadj->value;
switch (event->keyval)
{
case GDK_KP_Left:
case GDK_Left:
h_value -= hadj->step_increment;
break;
case GDK_KP_Right:
case GDK_Right:
h_value += hadj->step_increment;
break;
case GDK_KP_Up:
case GDK_Up:
value -= adj->step_increment;
v_value -= vadj->step_increment;
break;
case GDK_KP_Down:
case GDK_Down:
value += adj->step_increment;
v_value += vadj->step_increment;
break;
case GDK_KP_Page_Up:
case GDK_Page_Up:
value -= adj->page_increment;
v_value -= vadj->page_increment;
break;
case GDK_KP_Page_Down:
case GDK_Page_Down:
case GDK_space:
value += adj->page_increment;
v_value += vadj->page_increment;
break;
case GDK_KP_Home:
case GDK_Home:
value = adj->lower;
v_value = vadj->lower;
break;
case GDK_KP_End:
case GDK_End:
value = adj->upper;
v_value = vadj->upper;
break;
case GDK_Escape:
gtk_widget_destroy(hw->window);
@ -553,9 +670,11 @@ htmlKeyCB( GtkWidget *widget, GdkEventKey *event, gpointer data )
return FALSE;
}
value = CLAMP(value, adj->lower, adj->upper - adj->page_size);
v_value = CLAMP(v_value, vadj->lower, vadj->upper - vadj->page_size);
h_value = CLAMP(h_value, hadj->lower, hadj->upper - hadj->page_size);
gtk_adjustment_set_value(adj, value);
gtk_adjustment_set_value(vadj, v_value);
gtk_adjustment_set_value(hadj, h_value);
return TRUE;
}
@ -573,9 +692,8 @@ static void
htmlBackCB(GtkWidget *widget, gpointer data)
{
HTMLWindow *hw = (HTMLWindow *) data;
HTMLHistoryData history_data;
history_data = historyBack(hw->history);
historyBack(hw->history);
gnc_html_load(hw);
@ -595,9 +713,8 @@ static void
htmlFwdCB(GtkWidget *widget, gpointer data)
{
HTMLWindow *hw = (HTMLWindow *) data;
HTMLHistoryData history_data;
history_data = historyFwd(hw->history);
historyFwd(hw->history);
gnc_html_load(hw);
@ -660,7 +777,7 @@ htmlAnchorCB(GtkWidget *widget, XmHTMLAnchorCallbackStruct *acbs,
gpointer data)
{
HTMLWindow *hw = (HTMLWindow *) data;
HTMLHistoryData history_data;
HTMLData *html_data;
if (acbs->reason != XmCR_ACTIVATE) return;
@ -675,11 +792,11 @@ htmlAnchorCB(GtkWidget *widget, XmHTMLAnchorCallbackStruct *acbs,
if (hw->anchor_cb == NULL)
return;
history_data = (hw->anchor_cb)(acbs, historyData(hw->history));
if (history_data == NULL)
html_data = (hw->anchor_cb)(acbs, historyUserData(hw->history));
if (html_data == NULL)
return;
historyInsert(hw->history, history_data);
historyInsert(hw->history, html_data);
gnc_html_load(hw);
break;
}
@ -691,13 +808,13 @@ htmlAnchorCB(GtkWidget *widget, XmHTMLAnchorCallbackStruct *acbs,
/********************************************************************\
* gnc_html_load - load the current location into the html window *
* *
* Args: hw - the html window structure *
* Args: hw - the html window structure *
* Return: none *
\********************************************************************/
void
gnc_html_load(HTMLWindow *hw)
{
HTMLHistoryData history_data;
HTMLData *data;
char *label = NULL;
char *text = NULL;
@ -706,9 +823,12 @@ gnc_html_load(HTMLWindow *hw)
if (hw->jump_cb == NULL)
return;
history_data = historyData(hw->history);
data = historyData(hw->history);
(hw->jump_cb)(history_data, &text, &label);
gtk_window_set_title(GTK_WINDOW(hw->window), data->title);
gnc_html_window_fill_toolbar(hw);
(hw->jump_cb)(data->user_data, &text, &label);
if (text == NULL)
return;

View File

@ -30,31 +30,33 @@
typedef struct _HTMLWindow HTMLWindow;
typedef void * HTMLHistoryData;
typedef struct _HTMLData HTMLData;
typedef void * HTMLUserData;
typedef void (*HTMLHistoryDestroyDataFunc)(HTMLHistoryData);
typedef void (*HTMLDestroyUserDataFunc)(HTMLUserData);
typedef HTMLHistoryData (*HTMLAnchorCB)(XmHTMLAnchorCallbackStruct *acbs,
HTMLHistoryData history_data);
typedef HTMLData* (*HTMLAnchorCB)(XmHTMLAnchorCallbackStruct *acbs,
HTMLUserData user_data);
typedef void (*HTMLJumpCB)(HTMLHistoryData history_data,
typedef void (*HTMLJumpCB)(HTMLUserData user_data,
char **text, char **label);
HTMLHistoryData gnc_html_window_history_data(HTMLWindow *hw);
HTMLUserData gnc_html_window_user_data(HTMLWindow *hw);
HTMLWindow * gnc_html_window_new(HTMLHistoryDestroyDataFunc destroy,
HTMLAnchorCB anchor_cb, HTMLJumpCB jump_cb);
HTMLWindow * gnc_html_window_new(HTMLAnchorCB anchor_cb, HTMLJumpCB jump_cb);
void gnc_html_window_destroy(HTMLWindow *hw);
void htmlWindow(GtkWidget * parent,
HTMLWindow ** hwp,
const char * const title,
HTMLHistoryData history_data,
GnomeUIInfo *user_buttons,
gint num_buttons);
HTMLData * gnc_html_data_new(const char *title, HTMLUserData user_data,
HTMLDestroyUserDataFunc destroy,
GnomeUIInfo *user_buttons,
int num_user_buttons);
void htmlWindow(GtkWidget *parent,
HTMLWindow **hwp,
HTMLData *data);
void gnc_html_load(HTMLWindow *hw);

View File

@ -19,12 +19,12 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include "top-level.h"
#include <gnome.h>
#include <guile/gh.h>
#include <string.h>
#include "top-level.h"
#include "AccWindow.h"
#include "AdjBWindow.h"
#include "global-options.h"
@ -33,10 +33,9 @@
#include "gnucash.h"
#include "MainWindow.h"
#include "Destroy.h"
#include "messages.h"
#include "enriched-messages.h"
#include "RegWindow.h"
#include "Refresh.h"
#include "version.h"
#include "window-main.h"
#include "window-mainP.h"
#include "window-reconcile.h"
@ -53,7 +52,7 @@
/* This static indicates the debugging module that this .o belongs to. */
static short module = MOD_GUI;
/* Codes for the file menu */
enum {
FMB_NEW,
FMB_OPEN,
@ -63,258 +62,6 @@ enum {
FMB_QUIT,
};
/** Menus ***********************************************************/
static GnomeUIInfo filemenu[] = {
GNOMEUIINFO_MENU_NEW_ITEM(N_("New"),
N_("Create New File."),
gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_NEW)),
GNOMEUIINFO_MENU_OPEN_ITEM(gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_OPEN)),
GNOMEUIINFO_MENU_SAVE_ITEM(gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_SAVE)),
GNOMEUIINFO_MENU_SAVE_AS_ITEM(gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_SAVEAS)),
GNOMEUIINFO_SEPARATOR,
{
GNOME_APP_UI_ITEM,
N_("Import..."), N_("Import QIF File."),
gnc_ui_filemenu_cb, GINT_TO_POINTER(FMB_IMPORT), NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_CONVERT,
'i', GDK_CONTROL_MASK, NULL
},
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_MENU_EXIT_ITEM(gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_QUIT)),
GNOMEUIINFO_END
};
static GnomeUIInfo optionsmenu[] = {
{
GNOME_APP_UI_ITEM,
N_("Preferences"), N_("Preferences"),
gnc_ui_options_cb, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF,
0, 0, NULL
},
#if 0
{
GNOME_APP_UI_ITEM,
N_("Gnucash News"), N_("News"),
gnc_ui_news_callback, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF,
0, 0, NULL
},
#endif
GNOMEUIINFO_END
};
static GnomeUIInfo scrubmenu[] = {
{
GNOME_APP_UI_ITEM,
N_("_Scrub Account"), N_("Scrub the account clean"),
gnc_ui_mainWindow_scrub, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
{
GNOME_APP_UI_ITEM,
N_("Scrub S_ubaccounts"), N_("Scrub the account and all its "
"subaccounts clean"),
gnc_ui_mainWindow_scrub_sub, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
{
GNOME_APP_UI_ITEM,
N_("Scrub _All"), N_("Scrub all the accounts clean"),
gnc_ui_mainWindow_scrub_all, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
GNOMEUIINFO_END
};
static GnomeUIInfo accountsmenu[] = {
{
GNOME_APP_UI_ITEM,
N_("_View..."), N_("View account"),
gnc_ui_mainWindow_toolbar_open, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN,
'v', GDK_CONTROL_MASK, NULL
},
{
GNOME_APP_UI_ITEM,
N_("View S_ubaccounts..."), N_("View account and subaccounts"),
gnc_ui_mainWindow_toolbar_open_subs, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN,
0, 0, NULL
},
{
GNOME_APP_UI_ITEM,
N_("_Edit..."), N_("Edit account information"),
gnc_ui_mainWindow_toolbar_edit, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PROP,
'e', GDK_CONTROL_MASK, NULL
},
GNOMEUIINFO_SEPARATOR,
{
GNOME_APP_UI_ITEM,
N_("Re_concile..."), N_("Reconcile the account"),
gnc_ui_mainWindow_reconcile, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
{
GNOME_APP_UI_ITEM,
N_("_Transfer..."), N_("Transfer funds from one account to another"),
gnc_ui_mainWindow_transfer, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
't', GDK_CONTROL_MASK, NULL
},
{
GNOME_APP_UI_ITEM,
N_("Adjust _Balance..."), N_("Adjust the balance of the account"),
gnc_ui_mainWindow_adjust_balance, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
'b', GDK_CONTROL_MASK, NULL
},
GNOMEUIINFO_SEPARATOR,
{
GNOME_APP_UI_ITEM,
N_("_Add..."), N_("Add Account"),
gnc_ui_add_account, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_ADD,
'a', GDK_CONTROL_MASK, NULL
},
{
GNOME_APP_UI_ITEM,
N_("_Remove"), N_("Remove Account"),
gnc_ui_delete_account_cb, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_REMOVE,
'r', GDK_CONTROL_MASK, NULL
},
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_SUBTREE(N_("_Scrub"), scrubmenu),
GNOMEUIINFO_END
};
static GnomeUIInfo helpmenu[] = {
GNOMEUIINFO_MENU_ABOUT_ITEM(gnc_ui_about_cb, NULL),
GNOMEUIINFO_SEPARATOR,
{
GNOME_APP_UI_ITEM,
N_("_Help..."), N_("Gnucash Help."),
gnc_ui_help_cb, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
GNOMEUIINFO_END
};
static GnomeUIInfo scriptsmenu[] = {
GNOMEUIINFO_END
};
static GnomeUIInfo mainmenu[] = {
GNOMEUIINFO_MENU_FILE_TREE(filemenu),
GNOMEUIINFO_SUBTREE(N_("_Accounts"), accountsmenu),
GNOMEUIINFO_SUBTREE(N_("_Options"), optionsmenu),
GNOMEUIINFO_SUBTREE(N_("_Extensions"), scriptsmenu),
GNOMEUIINFO_MENU_HELP_TREE(helpmenu),
GNOMEUIINFO_END
};
/** TOOLBAR ************************************************************/
static GnomeUIInfo toolbar[] =
{
{ GNOME_APP_UI_ITEM,
N_("Open"),
N_("Open File."),
gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_OPEN),
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_OPEN,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
N_("Save"),
N_("Save File."),
gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_SAVE),
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_SAVE,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
N_("Import"),
N_("Import QIF File."),
gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_IMPORT),
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_CONVERT,
0, 0, NULL
},
GNOMEUIINFO_SEPARATOR,
{ GNOME_APP_UI_ITEM,
N_("View"),
N_("View selected account."),
gnc_ui_mainWindow_toolbar_open,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_JUMP_TO,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
N_("Edit"),
N_("Edit account information."),
gnc_ui_mainWindow_toolbar_edit,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_PROPERTIES,
0, 0, NULL
},
GNOMEUIINFO_SEPARATOR,
{ GNOME_APP_UI_ITEM,
N_("Add"),
N_("Add a new account."),
gnc_ui_add_account,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_ADD,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
N_("Remove"),
N_("Remove selected account."),
gnc_ui_delete_account_cb,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_REMOVE,
0, 0, NULL
},
GNOMEUIINFO_SEPARATOR,
{ GNOME_APP_UI_ITEM,
N_("Exit"),
N_("Exit GnuCash."),
gnc_ui_exit_cb,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_QUIT,
0, 0, NULL
},
GNOMEUIINFO_END
};
static void
gnc_ui_refresh_statusbar()
@ -369,8 +116,9 @@ gnc_ui_refresh_statusbar()
asset_string = g_strdup(xaccPrintAmount(assets, PRTSYM | PRTSEP));
profit_string = g_strdup(xaccPrintAmount(profits, PRTSYM | PRTSEP));
label_string = g_strconcat("Assets: ", asset_string,
" Profits: ", profit_string, " ", NULL);
label_string = g_strconcat(ASSETS_STR, ": ", asset_string, " ",
PROFITS_STR, ": ", profit_string, " ",
NULL);
label = gtk_object_get_data(GTK_OBJECT(gnc_get_ui_data()),
"balance_label");
@ -401,15 +149,14 @@ static void
gnc_ui_about_cb (GtkWidget *widget, gpointer data)
{
GtkWidget *about;
const gchar *copyright = "(C) 1998-1999 Linas Vepstas";
const gchar *authors[] = {
"Linas Vepstas <linas@linas.org>",
NULL
};
about = gnome_about_new("GnuCash", "1.3 (development version)",
"(C) 1998-1999 Linas Vepstas",
authors,
"The GnuCash personal finance manager.\nThe GNU way to manage your money!", NULL);
about = gnome_about_new("GnuCash", VERSION, copyright,
authors, ABOUT_MSG, NULL);
gnome_dialog_run_and_close(GNOME_DIALOG(about));
}
@ -448,12 +195,19 @@ static void
gnc_ui_delete_account_cb ( GtkWidget *widget, gpointer data )
{
Account *account = gnc_get_current_account();
if (account)
{
if (gnc_verify_dialog("Are you sure you want to delete this account?",
GNC_F))
gchar *name;
gchar *message;
name = xaccAccountGetName(account);
message = g_strdup_printf(ACC_DEL_SURE_MSG, name);
if (gnc_verify_dialog(message, GNC_F))
gnc_ui_delete_account(account);
g_free(message);
}
else
gnc_error_dialog(ACC_DEL_MSG);
@ -467,7 +221,7 @@ gnc_ui_mainWindow_toolbar_open ( GtkWidget *widget, gpointer data )
if (account == NULL)
{
gnc_error_dialog("You must select an account to open first.");
gnc_error_dialog(ACC_OPEN_MSG);
return;
}
@ -485,7 +239,7 @@ gnc_ui_mainWindow_toolbar_open_subs(GtkWidget *widget, gpointer data)
if (account == NULL)
{
gnc_error_dialog("You must select an account to open first.");
gnc_error_dialog(ACC_OPEN_MSG);
return;
}
@ -522,7 +276,7 @@ gnc_ui_mainWindow_reconcile(GtkWidget *widget, gpointer data)
gnc_ui_reconcile_window_raise(recnData);
}
else
gnc_error_dialog("You must select an account");
gnc_error_dialog(ACC_RECONCILE_MSG);
}
static void
@ -539,7 +293,7 @@ gnc_ui_mainWindow_adjust_balance(GtkWidget *widget, gpointer data)
if (account != NULL)
adjBWindow(account);
else
gnc_error_dialog("You must select an account to adjust first.");
gnc_error_dialog(ACC_ADJUST_MSG);
}
static void
@ -549,7 +303,7 @@ gnc_ui_mainWindow_scrub(GtkWidget *widget, gpointer data)
if (account == NULL)
{
gnc_error_dialog("You must select an account to scrub first.");
gnc_error_dialog(ACC_SCRUB_MSG);
return;
}
@ -567,7 +321,7 @@ gnc_ui_mainWindow_scrub_sub(GtkWidget *widget, gpointer data)
if (account == NULL)
{
gnc_error_dialog("You must select an account to scrub first.");
gnc_error_dialog(ACC_SCRUB_MSG);
return;
}
@ -652,7 +406,13 @@ gnc_ui_mainWindow_destroy_cb(GtkWidget *widget,
GNCAccountTree *
gnc_get_current_account_tree()
{
return gtk_object_get_data(GTK_OBJECT(gnc_get_ui_data()), "account_tree");
GtkWidget *widget;
widget = gnc_get_ui_data();
if (widget == NULL)
return NULL;
return gtk_object_get_data(GTK_OBJECT(widget), "account_tree");
}
Account *
@ -662,6 +422,13 @@ gnc_get_current_account()
return gnc_account_tree_get_current_account(tree);
}
GList *
gnc_get_current_accounts()
{
GNCAccountTree * tree = gnc_get_current_account_tree();
return gnc_account_tree_get_current_accounts(tree);
}
static void
gnc_account_tree_activate_cb(GNCAccountTree *tree,
Account *account,
@ -789,30 +556,280 @@ gnc_configure_account_tree(gpointer data)
gnc_account_tree_set_view_info(tree, &new_avi);
}
static void
gnc_main_create_toolbar(GnomeApp *app)
{
GnomeUIInfo toolbar[] =
{
{ GNOME_APP_UI_ITEM,
OPEN_STR,
TOOLTIP_OPEN_FILE,
gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_OPEN),
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_OPEN,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
SAVE_STR,
TOOLTIP_SAVE_FILE,
gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_SAVE),
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_SAVE,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
IMPORT_STR,
TOOLTIP_IMPORT_QIF,
gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_IMPORT),
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_CONVERT,
0, 0, NULL
},
GNOMEUIINFO_SEPARATOR,
{ GNOME_APP_UI_ITEM,
OPEN_STR,
TOOLTIP_OPEN,
gnc_ui_mainWindow_toolbar_open,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_JUMP_TO,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
EDIT_STR,
TOOLTIP_EDIT,
gnc_ui_mainWindow_toolbar_edit,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_PROPERTIES,
0, 0, NULL
},
GNOMEUIINFO_SEPARATOR,
{ GNOME_APP_UI_ITEM,
NEW_STR,
TOOLTIP_NEW,
gnc_ui_add_account,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_ADD,
0, 0, NULL
},
{ GNOME_APP_UI_ITEM,
DELETE_STR,
TOOLTIP_DELETE,
gnc_ui_delete_account_cb,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_REMOVE,
0, 0, NULL
},
GNOMEUIINFO_SEPARATOR,
{ GNOME_APP_UI_ITEM,
EXIT_STR,
TOOLTIP_EXIT,
gnc_ui_exit_cb,
NULL,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_QUIT,
0, 0, NULL
},
GNOMEUIINFO_END
};
gnome_app_create_toolbar(app, toolbar);
}
static void
gnc_main_create_menus(GnomeApp *app, GtkWidget *account_tree)
{
GtkWidget *popup;
GnomeUIInfo filemenu[] = {
GNOMEUIINFO_MENU_NEW_ITEM(NEW_FILE_STR,
TOOLTIP_NEW_FILE,
gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_NEW)),
GNOMEUIINFO_MENU_OPEN_ITEM(gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_OPEN)),
GNOMEUIINFO_MENU_SAVE_ITEM(gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_SAVE)),
GNOMEUIINFO_MENU_SAVE_AS_ITEM(gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_SAVEAS)),
GNOMEUIINFO_SEPARATOR,
{
GNOME_APP_UI_ITEM,
IMPORT_QIF_E_STR, TOOLTIP_IMPORT_QIF,
gnc_ui_filemenu_cb, GINT_TO_POINTER(FMB_IMPORT), NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_CONVERT,
'i', GDK_CONTROL_MASK, NULL
},
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_MENU_EXIT_ITEM(gnc_ui_filemenu_cb,
GINT_TO_POINTER(FMB_QUIT)),
GNOMEUIINFO_END
};
GnomeUIInfo optionsmenu[] = {
{
GNOME_APP_UI_ITEM,
PREFERENCES_STR, TOOLTIP_PREFERENCES,
gnc_ui_options_cb, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF,
0, 0, NULL
},
GNOMEUIINFO_END
};
GnomeUIInfo scrubmenu[] = {
{
GNOME_APP_UI_ITEM,
SCRUB_ACCT_STR, TOOLTIP_SCRUB_ACCT,
gnc_ui_mainWindow_scrub, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
{
GNOME_APP_UI_ITEM,
SCRUB_SUBACCTS_STR, TOOLTIP_SCRUB_SUB,
gnc_ui_mainWindow_scrub_sub, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
{
GNOME_APP_UI_ITEM,
SCRUB_ALL_STR, TOOLTIP_SCRUB_ALL,
gnc_ui_mainWindow_scrub_all, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
GNOMEUIINFO_END
};
GnomeUIInfo accountsmenu[] = {
{
GNOME_APP_UI_ITEM,
OPEN_ACC_E_STR, TOOLTIP_OPEN,
gnc_ui_mainWindow_toolbar_open, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN,
'v', GDK_CONTROL_MASK, NULL
},
{
GNOME_APP_UI_ITEM,
OPEN_SUB_E_STR, TOOLTIP_OPEN_SUB,
gnc_ui_mainWindow_toolbar_open_subs, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN,
0, 0, NULL
},
{
GNOME_APP_UI_ITEM,
EDIT_ACCT_E_STR, TOOLTIP_EDIT,
gnc_ui_mainWindow_toolbar_edit, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PROP,
'e', GDK_CONTROL_MASK, NULL
},
GNOMEUIINFO_SEPARATOR,
{
GNOME_APP_UI_ITEM,
RECONCILE_E_STR, TOOLTIP_RECONCILE,
gnc_ui_mainWindow_reconcile, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
{
GNOME_APP_UI_ITEM,
TRANSFER_E_STR, TOOLTIP_TRANSFER,
gnc_ui_mainWindow_transfer, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
't', GDK_CONTROL_MASK, NULL
},
{
GNOME_APP_UI_ITEM,
ADJ_BALN_E_STR, TOOLTIP_ADJUST,
gnc_ui_mainWindow_adjust_balance, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
'b', GDK_CONTROL_MASK, NULL
},
GNOMEUIINFO_SEPARATOR,
{
GNOME_APP_UI_ITEM,
NEW_ACC_E_STR, TOOLTIP_NEW,
gnc_ui_add_account, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_ADD,
'a', GDK_CONTROL_MASK, NULL
},
{
GNOME_APP_UI_ITEM,
DEL_ACC_E_STR, TOOLTIP_DELETE,
gnc_ui_delete_account_cb, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_REMOVE,
'r', GDK_CONTROL_MASK, NULL
},
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_SUBTREE(SCRUB_STR, scrubmenu),
GNOMEUIINFO_END
};
GnomeUIInfo helpmenu[] = {
GNOMEUIINFO_MENU_ABOUT_ITEM(gnc_ui_about_cb, NULL),
GNOMEUIINFO_SEPARATOR,
{
GNOME_APP_UI_ITEM,
HELP_E_STR, TOOLTIP_HELP,
gnc_ui_help_cb, NULL, NULL,
GNOME_APP_PIXMAP_NONE, NULL,
0, 0, NULL
},
GNOMEUIINFO_END
};
GnomeUIInfo scriptsmenu[] = {
GNOMEUIINFO_END
};
GnomeUIInfo mainmenu[] = {
GNOMEUIINFO_MENU_FILE_TREE(filemenu),
GNOMEUIINFO_SUBTREE(ACCOUNTS_STR, accountsmenu),
GNOMEUIINFO_MENU_SETTINGS_TREE(optionsmenu),
GNOMEUIINFO_SUBTREE(EXTENSIONS_STR, scriptsmenu),
GNOMEUIINFO_MENU_HELP_TREE(helpmenu),
GNOMEUIINFO_END
};
gnome_app_create_menus(app, mainmenu);
gnome_app_install_menu_hints(app, mainmenu);
popup = gnome_popup_menu_new(accountsmenu);
gnome_popup_menu_attach(popup, account_tree, NULL);
}
void
mainWindow()
{
GtkWidget *app = gnc_get_ui_data();
GtkWidget *popup;
GtkWidget *scrolled_win;
GtkWidget *statusbar;
GtkWidget *account_tree;
GtkWidget *label;
account_tree = gnc_account_tree_new();
gtk_object_set_data (GTK_OBJECT (app), "account_tree", account_tree);
gtk_object_set_data(GTK_OBJECT (app), "account_tree", account_tree);
gnc_configure_account_tree(NULL);
gnc_register_option_change_callback(gnc_configure_account_tree, NULL);
gtk_signal_connect(GTK_OBJECT (account_tree), "activate_account",
GTK_SIGNAL_FUNC (gnc_account_tree_activate_cb), NULL);
popup = gnome_popup_menu_new(accountsmenu);
gnome_popup_menu_attach(GTK_WIDGET(popup), GTK_WIDGET(account_tree), NULL);
gnome_app_create_toolbar(GNOME_APP(app), toolbar);
gnome_app_create_menus(GNOME_APP(app), mainmenu);
/* create statusbar and add it to the application. */
statusbar = gnome_appbar_new(GNC_F, /* no progress bar, maybe later? */
GNC_T, /* has status area */
@ -820,6 +837,9 @@ mainWindow()
gnome_app_set_statusbar(GNOME_APP(app), GTK_WIDGET(statusbar));
gnc_main_create_menus(GNOME_APP(app), account_tree);
gnc_main_create_toolbar(GNOME_APP(app));
/* create the label containing the account balances */
label = gtk_label_new("");
gtk_object_set_data (GTK_OBJECT (app), "balance_label", label);
@ -844,8 +864,6 @@ mainWindow()
gh_call2(run_danglers, hook, window);
}
gnome_app_install_menu_hints(GNOME_APP(app), mainmenu);
/* Attach delete and destroy signals to the main window */
gtk_signal_connect (GTK_OBJECT (app), "delete_event",
GTK_SIGNAL_FUNC (gnc_ui_mainWindow_delete_cb),

View File

@ -26,7 +26,10 @@
/** PROTOTYPES ******************************************************/
void mainWindow(void);
GNCAccountTree * gnc_get_current_account_tree();
Account * gnc_get_current_account();
GList * gnc_get_current_accounts();
#endif

View File

@ -25,10 +25,6 @@
#ifndef __WINDOW_MAINP_H__
#define __WINDOW_MAINP_H__
#include <gnome.h>
#include "top-level.h"
/** PROTOTYPES ******************************************************/
static void gnc_ui_refresh_statusbar(void);

View File

@ -23,11 +23,12 @@
\********************************************************************/
#define _GNU_SOURCE
#include <stdio.h>
#include <gnome.h>
#include "top-level.h"
#include <stdio.h>
#include <gnome.h>
#include "date.h"
#include "MultiLedger.h"
#include "MainWindow.h"
@ -39,7 +40,7 @@
#include "Refresh.h"
#include "query-user.h"
#include "window-help.h"
#include "messages.h"
#include "enriched-messages.h"
#include "util.h"
@ -173,7 +174,7 @@ recnRecalculateBalance(RecnWindow *recnData)
* diff - returns the amount from ending balance field *
* Return: True, if the user presses "Ok", else False *
\********************************************************************/
gboolean
static gboolean
startRecnWindow(GtkWidget *parent, Account *account, double *diff)
{
GtkWidget *dialog, *end_value;
@ -266,8 +267,7 @@ startRecnWindow(GtkWidget *parent, Account *account, double *diff)
}
else
{
gnc_error_dialog_parented(GTK_WINDOW(parent),
"Ending balance must be a number.");
gnc_error_dialog_parented(GTK_WINDOW(parent), BALANCE_NUM_MSG);
continue;
}
}
@ -443,11 +443,10 @@ gnc_ui_reconcile_window_delete_cb(GtkButton *button, gpointer data)
return;
{
gchar * buf = "Are you sure you want to delete the current transaction?";
gboolean result;
result = gnc_verify_dialog_parented(GTK_WINDOW(recnData->dialog),
buf, GNC_F);
TRANS_DEL2_MSG, GNC_F);
if (!result)
return;
@ -599,35 +598,41 @@ recnWindow(GtkWidget *parent, Account *account)
bbox = gtk_hbutton_box_new();
gtk_box_pack_start(GTK_BOX(hbox), bbox, FALSE, FALSE, 0);
button = gtk_button_new_with_label("New");
button = gtk_button_new_with_label(NEW_STR);
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
gnc_set_tooltip(button, "Add a new transaction to the account");
gnc_set_tooltip(button, TOOLTIP_NEW_TRANS);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gnc_ui_reconcile_window_new_cb),
recnData);
button = gtk_button_new_with_label("Edit");
button = gtk_button_new_with_label(EDIT_STR);
recnData->edit_button = button;
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
gnc_set_tooltip(button, "Edit the current transaction");
gnc_set_tooltip(button, TOOLTIP_EDIT_TRANS);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gnc_ui_reconcile_window_edit_cb),
recnData);
button = gtk_button_new_with_label("Delete");
button = gtk_button_new_with_label(DELETE_STR);
recnData->delete_button = button;
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
gnc_set_tooltip(button, "Delete the current transaction");
gnc_set_tooltip(button, TOOLTIP_DEL_TRANS);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gnc_ui_reconcile_window_delete_cb),
recnData);
button = gtk_button_new_with_label("Edit Info...");
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
gnc_set_tooltip(button, "Adjust the ending balance");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gnc_ui_reconcile_window_change_cb),
recnData);
{
gchar *s = g_strconcat(END_BALN_STR, "...", NULL);
button = gtk_button_new_with_label(s);
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);
gnc_set_tooltip(button, TOOLTIP_ADJUST_END);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gnc_ui_reconcile_window_change_cb),
recnData);
g_free(s);
}
/* frame to hold totals */
frame = gtk_frame_new(NULL);
@ -785,9 +790,7 @@ recnOkCB(GtkWidget *w, gpointer data)
if (!DEQ(recnRecalculateBalance(recnData), 0.0))
if (!gnc_verify_dialog_parented(GTK_WINDOW(recnData->dialog),
"The account is not balanced.\n" \
"Are you sure you want to finish?",
GNC_F))
RECN_BALN_WARN, GNC_F))
return;
gnc_reconcile_list_commit(GNC_RECONCILE_LIST(recnData->credit));

View File

@ -25,12 +25,6 @@
#ifndef __WINDOW_RECONCILE_H__
#define __WINDOW_RECONCILE_H__
#include <gtk/gtk.h>
#include "config.h"
#include "top-level.h"
/** GLOBALS *********************************************************/

File diff suppressed because it is too large Load Diff

View File

@ -20,8 +20,6 @@
#ifndef __WINDOW_REGISTER_H__
#define __WINDOW_REGISTER_H__
#include "top-level.h"
void gnc_register_raise(RegWindow *regData);
void gnc_register_jump_to_blank(RegWindow *regData);
void gnc_register_jump_to_split(RegWindow *regData, Split *split);

View File

@ -24,15 +24,16 @@
* Huntington Beach, CA 92648-4632 *
\********************************************************************/
#include <gnome.h>
#include "top-level.h"
#include "config.h"
#include <gnome.h>
#include "window-report.h"
#include "window-html.h"
#include "option-util.h"
#include "guile-util.h"
#include "dialog-options.h"
#include "messages.h"
#include "util.h"
static short module = MOD_HTML;
@ -50,73 +51,83 @@ struct _ReportData
GtkWidget *option_dialog;
SCM rendering_thunk;
SCM rendering_thunk_id;
SCM guile_options;
SCM guile_options_id;
};
static ReportData *
report_data_new()
{
ReportData *rd;
ReportData *report_data;
rd = g_new0(ReportData, 1);
report_data = g_new0(ReportData, 1);
rd->guile_options = SCM_UNDEFINED;
rd->rendering_thunk = SCM_UNDEFINED;
report_data->guile_options = SCM_UNDEFINED;
report_data->guile_options_id = SCM_UNDEFINED;
return rd;
report_data->rendering_thunk = SCM_UNDEFINED;
report_data->rendering_thunk_id = SCM_UNDEFINED;
return report_data;
}
static void
report_data_destroy(HTMLHistoryData history_data)
report_data_destroy(HTMLUserData user_data)
{
ReportData *rd = history_data;
ReportData *report_data = user_data;
g_free(rd->text);
rd->text = NULL;
g_free(report_data->text);
report_data->text = NULL;
gnc_option_db_destroy(rd->odb);
rd->odb = NULL;
gnc_option_db_destroy(report_data->odb);
report_data->odb = NULL;
if (rd->option_dialog != NULL)
gtk_widget_destroy(rd->option_dialog);
rd->option_dialog = NULL;
if (report_data->option_dialog != NULL)
gtk_widget_destroy(report_data->option_dialog);
report_data->option_dialog = NULL;
if (rd->guile_options != SCM_UNDEFINED)
gnc_unregister_c_side_scheme_ptr(rd->guile_options);
rd->guile_options = SCM_UNDEFINED;
if (report_data->guile_options_id != SCM_UNDEFINED)
gnc_unregister_c_side_scheme_ptr_id(report_data->guile_options_id);
report_data->guile_options = SCM_UNDEFINED;
report_data->guile_options_id = SCM_UNDEFINED;
if (rd->rendering_thunk != SCM_UNDEFINED)
gnc_unregister_c_side_scheme_ptr(rd->rendering_thunk);
rd->rendering_thunk = SCM_UNDEFINED;
if (report_data->rendering_thunk_id != SCM_UNDEFINED)
gnc_unregister_c_side_scheme_ptr_id(report_data->rendering_thunk_id);
report_data->rendering_thunk = SCM_UNDEFINED;
report_data->rendering_thunk_id = SCM_UNDEFINED;
g_free(rd);
g_free(report_data);
}
static void
report_data_set_text(ReportData *rd, const gchar *text)
report_data_set_text(ReportData *report_data, const gchar *text)
{
g_free(rd->text);
rd->text = g_strdup(text);
g_free(report_data->text);
report_data->text = g_strdup(text);
}
static void
report_data_set_rendering_thunk(ReportData *rd, const SCM rendering_thunk)
report_data_set_rendering_thunk(ReportData *report_data,
const SCM rendering_thunk)
{
if (rd->rendering_thunk != SCM_UNDEFINED)
gnc_unregister_c_side_scheme_ptr(rd->rendering_thunk);
if (report_data->rendering_thunk_id != SCM_UNDEFINED)
gnc_unregister_c_side_scheme_ptr_id(report_data->rendering_thunk_id);
rd->rendering_thunk = rendering_thunk;
report_data->rendering_thunk = rendering_thunk;
report_data->rendering_thunk_id = gnc_register_c_side_scheme_ptr(rendering_thunk);
}
static void
gnc_options_dialog_apply_cb(GnomePropertyBox *propertybox,
gint arg1, gpointer user_data)
{
ReportData *rd = user_data;
ReportData *report_data = user_data;
if (arg1 == -1)
gnc_option_db_commit(rd->odb);
gnc_option_db_commit(report_data->odb);
}
static void
@ -128,52 +139,55 @@ gnc_options_dialog_help_cb(GnomePropertyBox *propertybox,
static void
report_data_set_guile_options(ReportData *rd, const SCM guile_options)
report_data_set_guile_options(ReportData *report_data, const SCM guile_options)
{
GnomePropertyBox *prop_box;
if (rd->guile_options != SCM_UNDEFINED)
if (report_data->guile_options_id != SCM_UNDEFINED)
{
gnc_unregister_c_side_scheme_ptr(rd->guile_options);
gnc_option_db_destroy(rd->odb);
gnc_unregister_c_side_scheme_ptr_id(report_data->guile_options_id);
gnc_option_db_destroy(report_data->odb);
}
if (rd->option_dialog != NULL)
gtk_widget_destroy(rd->option_dialog);
if (report_data->option_dialog != NULL)
gtk_widget_destroy(report_data->option_dialog);
if (gh_scm2bool(gh_not(guile_options)))
{
rd->guile_options = SCM_UNDEFINED;
rd->option_dialog = NULL;
report_data->guile_options = SCM_UNDEFINED;
report_data->option_dialog = NULL;
return;
}
rd->guile_options = guile_options;
gnc_register_c_side_scheme_ptr(guile_options);
report_data->guile_options = guile_options;
report_data->guile_options_id =
gnc_register_c_side_scheme_ptr(guile_options);
rd->odb = gnc_option_db_new();
report_data->odb = gnc_option_db_new();
gnc_option_db_init(rd->odb, guile_options);
gnc_option_db_init(report_data->odb, guile_options);
rd->option_dialog = gnome_property_box_new();
gnome_dialog_close_hides(GNOME_DIALOG(rd->option_dialog), TRUE);
report_data->option_dialog = gnome_property_box_new();
gnome_dialog_close_hides(GNOME_DIALOG(report_data->option_dialog), TRUE);
prop_box = GNOME_PROPERTY_BOX(rd->option_dialog);
gnc_build_options_dialog_contents(prop_box, rd->odb);
prop_box = GNOME_PROPERTY_BOX(report_data->option_dialog);
gnc_build_options_dialog_contents(prop_box, report_data->odb);
gnc_option_db_clean(rd->odb);
gnc_option_db_clean(report_data->odb);
gtk_signal_connect(GTK_OBJECT(rd->option_dialog), "apply",
GTK_SIGNAL_FUNC(gnc_options_dialog_apply_cb), rd);
gtk_signal_connect(GTK_OBJECT(report_data->option_dialog), "apply",
GTK_SIGNAL_FUNC(gnc_options_dialog_apply_cb),
report_data);
gtk_signal_connect(GTK_OBJECT(rd->option_dialog), "help",
GTK_SIGNAL_FUNC(gnc_options_dialog_help_cb), rd);
gtk_signal_connect(GTK_OBJECT(report_data->option_dialog), "help",
GTK_SIGNAL_FUNC(gnc_options_dialog_help_cb),
report_data);
}
static HTMLHistoryData
static HTMLData *
reportAnchorCB(XmHTMLAnchorCallbackStruct *acbs,
HTMLHistoryData history_data)
HTMLUserData user_data)
{
switch(acbs->url_type)
{
@ -201,25 +215,25 @@ reportAnchorCB(XmHTMLAnchorCallbackStruct *acbs,
}
static void
reportJumpCB(HTMLHistoryData history_data, char **set_text, char **set_label)
reportJumpCB(HTMLUserData user_data, char **set_text, char **set_label)
{
ReportData *rd = (ReportData *) history_data;
ReportData *report_data = user_data;
char *text;
SCM text_scm;
*set_text = NULL;
*set_label = NULL;
if (rd->text != NULL)
if (report_data->text != NULL)
{
*set_text = rd->text;
*set_text = report_data->text;
return;
}
if (!gh_procedure_p(rd->rendering_thunk))
if (!gh_procedure_p(report_data->rendering_thunk))
return;
text_scm = gh_call0(rd->rendering_thunk);
text_scm = gh_call0(report_data->rendering_thunk);
if (!gh_string_p(text_scm))
return;
@ -228,41 +242,42 @@ reportJumpCB(HTMLHistoryData history_data, char **set_text, char **set_label)
if (text == NULL)
return;
report_data_set_text(rd, text);
report_data_set_text(report_data, text);
free(text);
*set_text = rd->text;
*set_text = report_data->text;
}
static void
gnc_report_options_changed_cb(gpointer data)
{
HTMLWindow *hw = data;
HTMLHistoryData hd;
ReportData *rd;
ReportData *report_data = data;
ReportData *real_data;
hd = gnc_html_window_history_data(hw);
if (hd == NULL)
if (report_data == NULL)
return;
rd = (ReportData *) hd;
report_data_set_text(rd, NULL);
report_data_set_text(report_data, NULL);
gnc_html_load(hw);
real_data = gnc_html_window_user_data(reportwindow);
if (report_data != real_data)
return;
gnc_html_load(reportwindow);
}
static void
gnc_report_properties_cb(GtkWidget *widget, gpointer data)
{
ReportData *rd = data;
ReportData *report_data = data;
if (rd->option_dialog == NULL)
if (report_data->option_dialog == NULL)
return;
gtk_widget_show_all(rd->option_dialog);
gdk_window_raise(GTK_WIDGET(rd->option_dialog)->window);
gtk_widget_show_all(report_data->option_dialog);
gdk_window_raise(GTK_WIDGET(report_data->option_dialog)->window);
}
@ -277,37 +292,38 @@ gnc_report_properties_cb(GtkWidget *widget, gpointer data)
void
reportWindow(const char *title, SCM rendering_thunk, SCM guile_options)
{
ReportData *rd;
ReportData *report_data;
HTMLData *html_data;
if (reportwindow == NULL)
reportwindow = gnc_html_window_new(report_data_destroy, reportAnchorCB,
reportJumpCB);
reportwindow = gnc_html_window_new(reportAnchorCB, reportJumpCB);
rd = report_data_new();
report_data_set_rendering_thunk(rd, rendering_thunk);
report_data_set_guile_options(rd, guile_options);
report_data = report_data_new();
report_data_set_rendering_thunk(report_data, rendering_thunk);
report_data_set_guile_options(report_data, guile_options);
if (rd->odb != NULL)
gnc_option_db_register_change_callback(rd->odb,
if (report_data->odb != NULL)
gnc_option_db_register_change_callback(report_data->odb,
gnc_report_options_changed_cb,
reportwindow);
report_data);
if (rd->option_dialog != NULL)
if (report_data->option_dialog != NULL)
{
gchar *prop_title;
prop_title = g_strconcat(title, " (Parameters)", NULL);
gtk_window_set_title(GTK_WINDOW(rd->option_dialog), prop_title);
prop_title = g_strconcat(title, " (", PARAMETERS_STR, ")", NULL);
gtk_window_set_title(GTK_WINDOW(report_data->option_dialog), prop_title);
g_free(prop_title);
}
if (report_data->option_dialog != NULL)
{
GnomeUIInfo user_buttons[] =
{
{ GNOME_APP_UI_ITEM,
"Properties",
"Set the properties for this report.",
gnc_report_properties_cb, rd,
PARAMETERS_STR,
TOOLTIP_REPORT_PARM,
gnc_report_properties_cb, report_data,
NULL,
GNOME_APP_PIXMAP_STOCK,
GNOME_STOCK_PIXMAP_PROPERTIES,
@ -317,8 +333,15 @@ reportWindow(const char *title, SCM rendering_thunk, SCM guile_options)
gint num_buttons = sizeof(user_buttons) / sizeof(GnomeUIInfo);
htmlWindow(NULL, &reportwindow, title, rd, user_buttons, num_buttons);
html_data = gnc_html_data_new(title, report_data,
report_data_destroy,
user_buttons, num_buttons);
}
else
html_data = gnc_html_data_new(title, report_data,
report_data_destroy, NULL, 0);
htmlWindow(NULL, &reportwindow, html_data);
}

View File

@ -7,6 +7,20 @@
;; (use-modules (gnc))
;; Test for slib.
(let* ((try-slib (lambda () (use-modules (ice-9 slib))))
(handler (lambda args #f))
(result (catch #t try-slib handler)))
(if (not result)
(begin
(newline)
(display "It appears you do not have the 'slib' scheme\n")
(display "library installed. You need slib2c6 or later\n")
(display "to run GnuCash.\n")
(newline)
(exit))))
(define (build-path firstelement . restofpath)
(define separator "/")
(define (bp first rest)

View File

@ -1,5 +1,5 @@
(define gnc:register-c-side-scheme-ptr #f)
(define gnc:unregister-c-side-scheme-ptr #f)
(define gnc:unregister-c-side-scheme-ptr-id #f)
(let ((next-registration-id 0)
;; Not sure this has to be prime, and not sure how large it needs
@ -12,8 +12,10 @@
(hashv-set! pointer-storage id ptr)
id))
(define (unregister-c-side-scheme-ptr id)
(hashv-remove! pointer-storage id))
(define (unregister-c-side-scheme-ptr-id id)
(if (hashv-ref pointer-storage id)
(hashv-remove! pointer-storage id)
(gnc:error "unregister-c-side-scheme-ptr-id: no such id\n")))
(set! gnc:register-c-side-scheme-ptr register-c-side-scheme-ptr)
(set! gnc:unregister-c-side-scheme-ptr unregister-c-side-scheme-ptr))
(set! gnc:unregister-c-side-scheme-ptr-id unregister-c-side-scheme-ptr-id))

View File

@ -64,12 +64,7 @@
;; on success, and (#f "failure-message") on failure. If #t,
;; the supplied value will be used by the gui to set the option.
value-validator
;; permissible-values (multichoice options only)
;; a list of vectors giving the value, a name,
;; and description of the permissible values.
;; Values are unevaluated Scheme symbols, names and
;; descriptions are strings which are used by the GUI.
permissible-values)
option-data)
(vector section
name
sort-tag
@ -80,7 +75,7 @@
default-getter
generate-restore-form
value-validator
permissible-values))
option-data))
(define (gnc:make-string-option
section
@ -94,8 +89,9 @@
(lambda (x) (set! option x))
(lambda () default-value)
#f
(lambda (x) (cond ((string? x)(list #t x))
(else (list #f #f))))
(lambda (x)
(cond ((string? x)(list #t x))
(else (list #f "string-option: not a string"))))
#f )))
(define (gnc:make-simple-boolean-option
@ -110,36 +106,105 @@
(lambda (x) (set! option x))
(lambda () default-value)
#f
(lambda (x) (list #t x))
(lambda (x)
(if (boolean? x)
(list #t x)
(list #f "boolean-option: not a boolean")))
#f )))
(define (gnc:make-multichoice-option
section
name
sort-tag
documentation-string
default-value
ok-values)
(let ((option default-value))
(define (multichoice-legal val p-vals)
(cond ((null? p-vals) #f)
((eq? val (vector-ref (car p-vals) 0)) #t)
(else multichoice-legal (cdr p-vals))))
(gnc:make-option
section name sort-tag 'multichoice documentation-string
(lambda () option)
(lambda (x)
(if (multichoice-legal x ok-values)
(set! option x)
(gnc:error "Illegal Multichoice option set")))
(lambda () default-value)
#f
(lambda (x)
(if (multichoice-legal x ok-values)
(list #t x)
(list #f #f)))
ok-values)))
;; date options use the option-data as a boolean value. If true,
;; the gui should allow the time to be entered as well.
(define (gnc:make-date-option
section
name
sort-tag
documentation-string
default-getter
show-time)
(let ((option (default-getter)))
(define (date-legal date)
(and (pair? date) (exact? (car date)) (exact? (cdr date))))
(gnc:make-option section name sort-tag 'date documentation-string
(lambda () option)
(lambda (date)
(if (date-legal date)
(set! option date)
(gnc:error "Illegal date value set")))
default-getter
#f
(lambda (date)
(if (date-legal date)
(list #t date)
(list #f "date-option: illegal date")))
show-time )))
;; account-list options use the option-data as a boolean value. If
;; true, the gui should allow the user to select multiple accounts.
;; values are always a list of accounts.
(define (gnc:make-account-list-option
section
name
sort-tag
documentation-string
default-getter
value-validator
multiple-selection)
(let ((option (default-getter))
(option-set #f)
(validator
(if (not value-validator)
(lambda (account-list) (list #t account-list))
value-validator)))
(gnc:make-option
section name sort-tag 'account-list documentation-string
(lambda () (if option-set option (default-getter)))
(lambda (account-list)
(let* ((result (validator account-list))
(valid (car result))
(value (cadr result)))
(if valid
(begin
(set! option value)
(set! option-set #t))
(gnc:error "Illegal account list value set"))))
default-getter
#f
validator
multiple-selection )))
;; multichoice options use the option-data as a list of vectors.
;; Each vector contains a permissible value (scheme symbol) and
;; a description string.
(define (gnc:make-multichoice-option
section
name
sort-tag
documentation-string
default-value
ok-values)
(let ((option default-value))
(define (multichoice-legal val p-vals)
(cond ((null? p-vals) #f)
((eq? val (vector-ref (car p-vals) 0)) #t)
(else multichoice-legal (cdr p-vals))))
(gnc:make-option
section name sort-tag 'multichoice documentation-string
(lambda () option)
(lambda (x)
(if (multichoice-legal x ok-values)
(set! option x)
(gnc:error "Illegal Multichoice option set")))
(lambda () default-value)
#f
(lambda (x)
(if (multichoice-legal x ok-values)
(list #t x)
(list #f "multichoice-option: illegal choice")))
ok-values)))
(define (gnc:option-section option)
(vector-ref option 0))
@ -161,7 +226,7 @@
(vector-ref option 8))
(define (gnc:option-value-validator option)
(vector-ref option 9))
(define (gnc:option-permissible-values option)
(define (gnc:option-data option)
(vector-ref option 10))
(define (gnc:register-option options new-option)
@ -308,6 +373,11 @@
"International" "Default Currency"
"b" "Default Currency For New Accounts" "USD"))
(gnc:register-configuration-option
(gnc:make-simple-boolean-option
"International" "Use 24-hour time format"
"c" "Use a 24 hour (instead of a 12 hour) time format." #f))
(gnc:register-configuration-option
(gnc:make-multichoice-option
"Register" "Default Register Mode"

View File

@ -32,10 +32,41 @@
"Page Two" "String Option"
"b" "This is a string option" "Hello, World.")))
(define dateop
(gnc:register-dummy-option
(gnc:make-date-option
"Time and Date" "Just a Date Option"
"a" "This is a date option"
(lambda () (cons (current-time) 0))
#f)))
(define dateop2
(gnc:register-dummy-option
(gnc:make-date-option
"Time and Date" "Time and Date Option"
"a" "This is a date option with time"
(lambda () (cons (current-time) 0))
#t)))
(define account-list-op
(gnc:register-dummy-option
(gnc:make-account-list-option
"Page One" "An account list option"
"b" "This is an account list option"
(lambda () (gnc:get-current-accounts))
#f #t)))
(define (op-value op)
(let ((getter (gnc:option-getter op)))
(getter)))
(define (account-list)
(let* ((accounts (op-value account-list-op))
(names (map gnc:account-get-name accounts)))
(list "<ul>"
(map (lambda (name) (list "<li>" name "</li>")) names)
"</ul>")))
(gnc:define-report
;; version
1
@ -45,16 +76,26 @@
gnc:*dummy-options*
;; Rendering thunk. See report.scm for details.
(lambda (options)
(list
"<html>"
"<body bgcolor=#99ccff>"
"The current time is " (strftime "%c" (localtime (current-time))) "."
"<br>"
"The boolean op is " (if (op-value boolop) "true." "false.")
"<br>"
"The multi op is " (symbol->string (op-value multop))
"<br>"
"The string op is " (op-value strop)
"</body>"
"</html>")))
(let ((time-string (strftime "%c" (localtime (current-time))))
(date-string (strftime "%x" (localtime (car (op-value dateop)))))
(date-string2 (strftime "%c" (localtime (car (op-value dateop2))))))
(list
"<html>"
"<body bgcolor=#99ccff>"
"The current time is " time-string "."
"<br>"
"The boolean op is " (if (op-value boolop) "true." "false.")
"<br>"
"The multi op is " (symbol->string (op-value multop))
"<br>"
"The string op is " (op-value strop)
"<br>"
"The date op is " date-string
"<br>"
"The date and time op is " date-string2
"<br>"
"The accounts are:"
(account-list)
"</body>"
"</html>"))))
)

View File

@ -1,22 +1,116 @@
;; -*-scheme-*-
;; transaction-report.scm
;; Report on all transactions in an account
;; Robert Merkel (rgmerk@mira.net)
;; something like
;; for(i = first; i < last; i+= step) { thunk(i);}
(use-modules (ice-9 slib))
(require 'printf)
(gnc:depend "text-export.scm")
(define gnc:*transaction-report-options* '())
;;returns a list contains elements of the-list for which predictate is
;; true
(define (gnc:filter-list the-list predicate)
(cond ((not (list? the-list))
(gnc:error("Attempted to filter a non-list object")))
((null? the-list) '())
((predicate (car the-list))
(cons (car the-list)
(gnc:filter-list (cdr the-list) predicate)))
(else (gnc:filter-list (cdr the-list) predicate))))
(define (gnc:register-trep-option new-option)
(set! gnc:*transaction-report-options*
(gnc:register-option gnc:*transaction-report-options* new-option))
new-option)
;; from date
;; hack alert - could somebody set this to an appropriate date?
(define begindate
(gnc:register-trep-option
(gnc:make-date-option
"Report Options" "From"
"a" "Report Items from this date"
(lambda ()
(let ((bdtime (localtime (current-time))))
(set-tm:sec bdtime 0)
(set-tm:min bdtime 0)
(set-tm:hour bdtime 0)
(set-tm:mday bdtime 1)
(set-tm:mon bdtime 0)
(let ((time (car (mktime bdtime))))
(cons time 0))))
#f)))
;; to-date
(define enddate
(gnc:register-trep-option
(gnc:make-date-option
"Report Options" "To"
"b" "Report items up to and including this date"
(lambda () (cons (current-time) 0))
#f)))
;; account to do report on
;; hack alert - default setting doesn't work!
(define tr-report-account-op
(gnc:register-trep-option
(gnc:make-account-list-option
"Report Options" "Account"
"c" "Do transaction report on this account"
(lambda () (list (gnc:group-get-account (gnc:get-current-group) 0)))
#f #f)))
;; extract fields out of the scheme split representation
(define (gnc:tr-report-get-memo split-scm)
(vector-ref split-scm 0))
(define (gnc:tr-report-get-action split-scm)
(vector-ref split-scm 1))
(define (gnc:tr-report-get-description split-scm)
(vector-ref split-scm 2))
(define (gnc:tr-report-get-date split-scm)
(vector-ref split-scm 3))
(define (gnc:tr-report-get-reconcile-state split-scm)
(vector-ref split-scm 4))
(define (gnc:tr-report-get-reconcile-date split-scm)
(vector-ref split-scm 5))
(define (gnc:tr-report-get-share-amount split-scm)
(vector-ref split-scm 6))
(define (gnc:tr-report-get-share-price split-scm)
(vector-ref split-scm 7))
(define (gnc:tr-report-get-value split-scm)
(vector-ref split-scm 8))
(define (gnc:tr-report-get-docref split-scm)
(vector-ref split-scm 9))
(define (gnc:tr-report-get-other-splits split-scm)
(vector-ref split-scm 10))
;;; something like
;;; for(i = first; i < last; i+= step) { thunk(i);}
(define (gnc:for-loop thunk first last step)
(cond ((< first last) (thunk first)
(gnc:for-loop thunk (+ first step) last step))
(else #f)))
;; applies thunk to each split in account account
;;; applies thunk to each split in account account
(define (gnc:for-each-split-in-account account thunk)
(gnc:for-loop (lambda (x) (thunk (gnc:account-get-split account x)))
0 (gnc:account-get-split-count account) 1))
(define (gnc:split-get-corresponding-account-name-and-values split)
(list (cons "Not implemented yet." 0)))
0 (gnc:account-get-split-count account) 1))
(define (gnc:split-get-transaction-date split)
(gnc:transaction-get-date-posted (gnc:split-get-parent split)))
@ -24,6 +118,37 @@
(define (gnc:split-get-description-from-parent split)
(gnc:transaction-get-description (gnc:split-get-parent split)))
(define (gnc:split-get-account-name split)
(gnc:account-get-name (gnc:split-get-account split)))
;; builds a list of the account name and values for the other
;; splits in a transaction
;; hack alert - lots of debugging cruft in here
(define (gnc:split-get-corresponding-account-name-and-values split)
(let* ((my-sign (positive? (gnc:split-get-value split)))
(diff-list '())
(parent-transaction (gnc:split-get-parent split))
(num-splits (gnc:transaction-get-split-count parent-transaction)))
(gnc:for-loop
(lambda (n)
(let ((split-in-trans
(gnc:transaction-get-split parent-transaction n)))
(if (not (eq? my-sign
(positive? (gnc:split-get-value split-in-trans))))
(set! diff-list
(cons
(list
(gnc:split-get-account-name split-in-trans)
(gnc:split-get-value split-in-trans))
diff-list)))))
0 num-splits 1)
(reverse diff-list)))
;; takes a C split, extracts relevant data and converts to a scheme
;; representation
(define (gnc:make-split-scheme-data split)
(vector (gnc:split-get-memo split)
(gnc:split-get-action split)
@ -32,38 +157,106 @@
(gnc:split-get-reconcile-state split)
(gnc:split-get-reconciled-date split)
(gnc:split-get-share-amount split)
(gnc:split-get-share-amount split)
(gnc:split-get-share-price split)
(gnc:split-get-value split)
(gnc:split-get-docref split)
(gnc:split-get-corresponding-account-name-and-values split)))
(define (gnc:split-represent-scheme-data-textually split)
(call-with-output-string (lambda (x) (write (gnc:make-split-scheme-data split) x))))
(define (gnc:timepair-to-datestring tp)
(let ((bdtime (localtime (car tp))))
(strftime "%x" bdtime)))
(define (gnc:timepair-earlier-or-eq t1 t2)
(let ((time1 (car t1))
(time2 (car t2)))
(<= time1 time2)))
(define (gnc:timepair-later-or-eq t1 t2)
(gnc:timepair-earlier-or-eq t2 t1))
(define (gnc:tr-report-make-filter-predicate early-date late-date)
(lambda (split-scm)
(let ((split-date (gnc:tr-report-get-date split-scm)))
(and (gnc:timepair-later-or-eq split-date early-date)
(gnc:timepair-earlier-or-eq split-date late-date)))))
;; converts a scheme split representation to a line of HTML,
;; updates the values of total-inflow and total-outflow based
;; on the split value
(define (gnc:tr-report-split-to-html split-scm total-inflow total-outflow
starting-balance)
(let ((other-splits (gnc:tr-report-get-other-splits split-scm)))
(string-append
"<TR><TD>"
(gnc:timepair-to-datestring
(gnc:tr-report-get-date split-scm))
"</TD><TD>"
(gnc:tr-report-get-docref split-scm)
"</TD><TD>"
(gnc:tr-report-get-description split-scm)
"</TD><TD>"
(gnc:tr-report-get-memo split-scm)
"</TD><TD>"
(cond ((null? other-splits) "")
((= (length other-splits) 1) (caar other-splits))
(else "Multi-split (not implemented yet)"))
"</TD><TD>"
(cond ((> (gnc:tr-report-get-value split-scm) 0)
(set! total-inflow (+ total-inflow
(gnc:tr-report-get-value split-scm)))
(sprintf #f "%.2f" (gnc:tr-report-get-value split-scm)))
(else
(set! total-outflow (+ total-outflow
(- (gnc:tr-report-get-value split-scm))))
(string-append
(sprintf #f "%.2f"
(- (gnc:tr-report-get-value split-scm))))))
"</TD></TR>")))
;; hack alert - stub for testing
(define (gnc:tr-report-get-starting-balance scm-split-list beginning-date)
0)
(gnc:define-report
;; version
;; version
1
;; Name
"Account Transactions"
;; Options
#f
gnc:*transaction-report-options*
;; renderer
(lambda (options)
(let ( (test-account (gnc:group-get-account (gnc:get-current-group) 0))
(prefix (list "<HTML>" "<BODY bgcolor=#99ccff>" "<PRE>"))
(suffix (list "</PRE>" "</BODY>" "</HTML>"))
(report-lines (list)))
(gnc:for-each-split-in-account
test-account
(lambda (split)
; (newline)
; (write report-lines)
(set! report-lines (append! report-lines (list (gnc:split-represent-scheme-data-textually split))))))
; (write prefix)
; (newline)
; (write suffix)
; (newline)
; (write report-lines)
(let* ((prefix (list "<HTML>" "<BODY bgcolor=#99ccff>" "<TABLE>"))
(suffix (list "</TABLE>" "</BODY>" "</HTML>"))
(report-lines '())
(date-filter-pred (gnc:tr-report-make-filter-predicate
(op-value begindate)
(op-value enddate)))
(total-inflow 0)
(total-outflow 0)
(starting-balance 0)
(accounts (op-value tr-report-account-op))
(html-mapper (lambda (split-scm) (gnc:tr-report-split-to-html
split-scm
total-inflow
total-outflow
starting-balance))))
(if (null? accounts)
(set! report-lines
(list "<TR><TD>You have not selected an account.</TD></TR>"))
(begin
(gnc:for-each-split-in-account
(car accounts)
(lambda (split)
(set! report-lines
(append! report-lines
(list (gnc:make-split-scheme-data split))))))
(set! starting-balance
(gnc:tr-report-get-starting-balance
report-lines (op-value begindate)))
(set! report-lines (gnc:filter-list report-lines date-filter-pred))
(set! report-lines (map html-mapper report-lines))))
(append prefix report-lines suffix))))

View File

@ -0,0 +1,69 @@
;; -*-scheme-*-
;; something like
;; for(i = first; i < last; i+= step) { thunk(i);}
(define (gnc:for-loop thunk first last step)
(cond ((< first last) (thunk first)
(gnc:for-loop thunk (+ first step) last step))
(else #f)))
;; applies thunk to each split in account account
(define (gnc:for-each-split-in-account account thunk)
(gnc:for-loop (lambda (x) (thunk (gnc:account-get-split account x)))
0 (gnc:account-get-split-count account) 1))
(define (gnc:split-get-corresponding-account-name-and-values split)
(list (cons "Not implemented yet." 0)))
(define (gnc:split-get-transaction-date split)
(gnc:transaction-get-date-posted (gnc:split-get-parent split)))
(define (gnc:split-get-description-from-parent split)
(gnc:transaction-get-description (gnc:split-get-parent split)))
(define (gnc:make-split-scheme-data split)
(vector (gnc:split-get-memo split)
(gnc:split-get-action split)
(gnc:split-get-description-from-parent split)
(gnc:split-get-transaction-date split)
(gnc:split-get-reconcile-state split)
(gnc:split-get-reconciled-date split)
(gnc:split-get-share-amount split)
(gnc:split-get-share-amount split)
(gnc:split-get-share-price split)
(gnc:split-get-value split)
(gnc:split-get-docref split)
(gnc:split-get-corresponding-account-name-and-values split)))
(define (gnc:split-represent-scheme-data-textually split)
(call-with-output-string (lambda (x) (write (gnc:make-split-scheme-data split) x))))
(gnc:define-report
;; version
1
;; Name
"Account Transactions"
;; Options
#f
;; renderer
(lambda (options)
(let ( (test-account (gnc:group-get-account (gnc:get-current-group) 0))
(prefix (list "<HTML>" "<BODY bgcolor=#99ccff>" "<PRE>"))
(suffix (list "</PRE>" "</BODY>" "</HTML>"))
(report-lines (list)))
(gnc:for-each-split-in-account
test-account
(lambda (split)
; (newline)
; (write report-lines)
(set! report-lines (append! report-lines (list (gnc:split-represent-scheme-data-textually split))))))
; (write prefix)
; (newline)
; (write suffix)
; (newline)
; (write report-lines)
(append prefix report-lines suffix))))

View File

@ -28,8 +28,21 @@
#include <gnc-common.h>
typedef enum
{
GNC_VERIFY_NO,
GNC_VERIFY_YES,
GNC_VERIFY_CANCEL
} GNCVerifyResult;
void gnc_refresh_main_window( void );
GNCVerifyResult
gnc_verify_cancel_dialog_parented(gncUIWidget parent,
const char *message,
GNCVerifyResult default_result);
gncBoolean gnc_verify_dialog( const char *message,
gncBoolean yes_is_default );
void gnc_error_dialog( const char *message );