
New formats. This is a major change. The old formats were inflexible
because everything had to be compiled into the application, and then
there was no way to change anything.

Sorting.

Help in *all* dialogs.

Print setup, including landscape mode.

Show page boundaries in the grid.

Get rid of EXTRA_MATH.

Optional A1 references. Absolute and relative references.

Optional letter coordinates on colnum.

Make the C interpreter 1-2-3 compatible.

Limit the amount of memory allocated by cmalloc et al.

Make file formats external.

Date and time (entering, displaying).

Make the .siag file format handle all the info in the .wk1 format.

sin(cos(r1c1)) in the C interpreter.

Optimal recalculation: maintain two lists for each cell, one for the
cells this cell depends on (dep_up) and one for those that depend
on it (dep_dn). When a cell is changed, the following takes place:
1. It is removed from the dep_dn list of every cell in it dep_up list.
2. Its dep_up is cleared.
3. Its value is calculated.
4. All cells in its dep_dn list are recalculated.
5. Its value is calculated again. All referenced cells are added to
   its dep_up.
6. All cells in dep_dn are recalculated again.
7. It is added to the dep_dn lists of all cells in its dep_up.
Steps 4 and 6, recalculation of all cells in dep_dn, require some
clarification. It is clearly not enough to calculate the cells in
dep_dn of the first cell, but it is necessary to also process the
dep_dn lists of those cells and so on, recursively. To avoid looping
over cyclic dependencies, every cell has a serial number.
Cells which have already been done all have the same serial number.
The serial number is a long integer, which should ensure reasonable
uniqueness.
The algorithm will calculate all affected cells twice. This is
to allow cyclic dependencies.
It is still likely that the current algorithm (calculate everything
always) will work more reliably, but it can be combined with the
optimal recalculation.
To handle troublesome cells, individual cells or ranges thereof
can be marked as such. They will then be recalculated every time
as part of the optimal recalculation. There should be a visual cue
that a cell is marked, perhaps with a border in a different colour.

While we're already busy bloating the cell structure, why not add
another field for pre-parsed expressions.

Basic file manipulation routines for the structured file handling and more:
make_directory(dirname, mode) creates a directory hierarchy.
copy_file(from_file, to_file) copies a file.
exist_file(filename) 1 if file exists, 0 if not.
untar_file(filename, directory) unpack a tar archive in a directory
tar_file(filename, directory) create tar archive of directory
All functions return -1 for failure and 0 for success.

Gnuplot can be handled by a dummy handler which separates data from
control, launches gnuplot and controls it. It should be possible to
use pipes to control gnuplot. The EXEC command to the plugin would
then be used.

For all plugins: in addition to moving the plugin, there needs to be
a way to resize it.

A PW plugin will have only the grid widget, which is a Richtext
widget and does not handle small sizes very well. I need to address
that problem if PW is to be a reasonable plugin.

Generally look into how window managers work, since I'm trespassing
on window manager territory. I should probably reparent the windows
into something other than a plain Composite. Something that would
allow me to move and resize using the mouse.

Remove the distinction between windows and buffers and instead have
a 1:1 relationship between them. This will make life much easier for
plugins (or rather, much easier for me), because I won't have to
display a single plugin in several windows. Doing that would be
really tricky.

Form input for gsiag

Form input for tsiag

Menus for tsiag

Click grid, rownum, colnum in gsiag

Split window in tsiag

Confirm delete of nonempty cells

Add Scheme functions to create user interface elements, in order
to make it more customizable.

4th support (but is 4th really flexible enough?)

Perl support

Truncate at cell border (Table widget)

Read csv files as all labels, including numeric fields

Use grid-, row- and column-wide default formats.

Multi-level undo would be trivial to implement. Making undo handle
huge changes or moving ranges is more work.

An eval-expr similar to exec-expr, but returns a value.

Right adjusted text doesn't adjust right ( ;-) ) in the Postscript output.

(remove-window)
(next-window)
(split-window)
(activate-window)
How to reference a window from Lisp
(savematrix path buffer type)
	Path is the full path, buffer is the name of the buffer
	(NIL for current), type is file format
(fsel-input path name patterns fmt)
	Path is starting directory, name is file name, patterns is list
	of extensions, fmt is osmething else
(listsel prompt list)
	list is a list of strings. Returns the index
BORDER-TOP, BORDER-BOTTOM, BORDER-LEFT, BORDER-RIGHT, BORDER-MASK
Stylelist
Fmtstyles
FMT-MASK

Goal seeking.

Record macros.

