The basic grid class is jzgrid, and this provides facilities that should be required for any grid, including:
scrolling
mouse events
keyboard events
setting attributes, e.g. font, color, border, cell size
While the jzgrid class could in theory be used directly (for a very simple grid), there would typically be another class on top of the basic grid class that provides a specific type of grid, for example the watch class jwgrid. This would include data-related definitions such as providing formatted data for the grid and support for copying and editing.
As well as the grid classes, yet another class is needed for the Windows form definition. This will include
If you create a new form using File|New Class, the Form Editor Wizard can be used to add the appropriate definitions.
See Watch Example for a typical class structure.
The following example using the watch grid illustrates the class paths:
dat=. ?30 30$100
This defines some data to be watched.
load 'jwatch'
This loads the class jwatch into the jwatch locale, which in turn loads the scripts jwgrid and jinput, each into their own locale. jwgrid in turn loads the basic grid script, jzgrid. At this stage, all that has happened is that these scripts have been loaded, and the locale namelist looks like:
conl '' +----+-+------+------+------+------+-+ |base|j|jinput|jwatch|jwgrid|jzgrid|z| +----+-+------+------+------+------+-+
No locale path settings have been made, so each locale has a path of z, as is the case with all new locales.
a=. conew 'jwatch'
This creates a new object (numbered locale) referenced by a
. In a new session, it would be named '0
' :
conl'' +-+----+-+------+------+------+------+-+ |0|base|j|jinput|jwatch|jwgrid|jzgrid|z| +-+----+-+------+------+------+------+-+
The new locale is empty, but has a locale path that includes jwatch and z.
create__a 'dat'
create__a
is called in the new locale, and gets its definition from jwatch. This verb creates a new form to display the grid, and then itself calls conew
to create a jwgrid object and sets its path to include jwgrid and jzgrid:
grid=: ''conew'jwgrid'
Therefore the locale list now includes two numbered locales:
conl'' +-+-+----+-+------+------+------+------+-+ |0|1|base|j|jinput|jwatch|jwgrid|jzgrid|z| +-+-+----+-+------+------+------+------+-+
The paths in these two numbered locales are:
copath a locale '0' +------+-+ |jwatch|z| +------+-+ copath grid__a locale '1' +------+------+-+ |jwgrid|jzgrid|z| +------+------+-+
The structure of numbered locales is returned by costate
:
costate'' +----+--+-------+---------------+ |refs|id|creator|path | +----+--+-------+---------------+ |a |0 |base |jwatch z | +----+--+-------+---------------+ | |1 |0 |jwgrid jzgrid z| +----+--+-------+---------------+
Now suppose the mouse is clicked on one of the grid cells. The form is defined in locale a
, so the mouse event handler watch_grid_mbldown
will be called there. Since this locale has no event handlers of its own, the definition in the jwatch
locale is used. This is defined as:
watch_grid_mbldown=: 3 : 'mbldown__grid sysdata'
Therefore the actual handler called is mbldown
in the grid
locale, which will pick its definition up from either jwgrid
or jzgrid
, whichever it sees first.