1232 lines
33 KiB
Plaintext
Executable File
1232 lines
33 KiB
Plaintext
Executable File
CHAPTER 6
|
||
|
||
|
||
XADD REFERENCE
|
||
|
||
|
||
This document is a beta version and may be subject to change.
|
||
|
||
|
||
This chapter describes the changes and additions that have been made to the XADD library as a result of the introduction
|
||
of the Siena and Series 3c machines into the SIBO range.
|
||
|
||
|
||
It documents the new abstract classes GRIDWIN and MATCHWIN which may be subclassed to provide a tabular grid format
|
||
for the display of data. The MATCHWIN class provides highlighted rows, rather than individual cells, and optional
|
||
incremental matching on a chosen column.
|
||
|
||
|
||
Precursors
|
||
Familiarity with the following topics will aid the understanding of this chapter:
|
||
e the wIN class described in the Windows chapter of the HWIM Reference manual
|
||
|
||
|
||
e the List View of the Siena or Series 3c Data application which is an example of a MATCHWIN derived class
|
||
|
||
|
||
Class diagram
|
||
|
||
|
||
matchwin >
|
||
|
||
|
||
GRIDWIN
|
||
|
||
|
||
wn_calc_position
|
||
wn_connect
|
||
wn_dodraw
|
||
|
||
|
||
wn_emphasise
|
||
|
||
|
||
gw_get_cell_rect
|
||
gw_draw_cells
|
||
gw_get_curent
|
||
gw_move_to
|
||
gw_set_col_width
|
||
gw_set_row_height
|
||
gw_zoom
|
||
gw_highlight
|
||
|
||
|
||
gw_get_data
|
||
|
||
|
||
6 XADD REFERENCE
|
||
|
||
|
||
The GRIDWIN class provides a means of displaying data in a tabular form, for example:
|
||
|
||
|
||
GRIDWIN provides for the display of:
|
||
|
||
|
||
data in left aligned columns and rows, clipped to the nearest whole character horizontally and, optionally,
|
||
clipped to the nearest whole row vertically
|
||
|
||
|
||
a highlight showing the currently selected cell
|
||
optionally, dotted gridlines separating rows and columns
|
||
|
||
|
||
optionally, a variable width scroll bar showing the current position relative to the overall height of the grid and the
|
||
size of the currently displayed visible portion relative to the overall height of the grid
|
||
|
||
|
||
optionally, one or more locked topmost columns which are not vertically scrolled
|
||
|
||
|
||
optionally, one of more locked leftmost columns which are not horizontally scrolled
|
||
|
||
|
||
GRIDWIN also provides an extremely efficient intelligent redraw mechanism whereby only grid cells that fall within the
|
||
redraw region are actually drawn and data is only requested for those cells. This can yield massive savings in both
|
||
drawing and data retrieval times especially for applications where actually obtaining the data to display is the limiting
|
||
factor in execution speed.
|
||
|
||
|
||
The GRIDWIN class provides a deferred method - the gw_get_data method - which must be replaced by any subclass to
|
||
create a fully-functioning grid window.
|
||
|
||
|
||
Class definition
|
||
|
||
|
||
Defined in the sub-category file gridwin.cl (generated header file gridwin.g).
|
||
|
||
|
||
SIENA/SERIES 3C UPGRADE
|
||
|
||
|
||
CLASS gridwin bwin
|
||
|
||
|
||
{
|
||
REPLACE
|
||
|
||
|
||
REPLACE
|
||
REPLACE
|
||
REPLACE
|
||
REPLACE
|
||
REPLACE
|
||
REPLACE
|
||
REPLACE
|
||
|
||
|
||
destroy
|
||
wn_init
|
||
wn_redraw
|
||
wn_draw
|
||
wn_key
|
||
wn_set
|
||
wn_sense
|
||
wn_emphasise
|
||
|
||
|
||
ADD gw_get_cell_rect
|
||
ADD gw_draw_cells
|
||
ADD gw_move_to
|
||
|
||
ADD gw_set_col_width
|
||
ADD gw_set_row_height
|
||
ADD gw_get_current
|
||
ADD gw_zoom
|
||
|
||
ADD gw_highlight
|
||
DEFER gw_get_data
|
||
|
||
|
||
CONSTANTS
|
||
|
||
|
||
TYPES
|
||
|
||
|
||
{
|
||
|
||
|
||
PR_GRIDWIN_MIN_COL_WIDTH
|
||
|
||
|
||
PR_GRIDWIN_CELL_HGAP
|
||
PR_GRIDWIN_CELL_LGAP
|
||
PR_GRIDWIN_BORDER_WIDTH
|
||
PR_GRIDWIN_SCROLL_SMALL
|
||
PR_GRIDWIN_SCROLL_LARGE
|
||
PR_GRIDWIN_SCROLL_ARROW
|
||
PR_GRIDWIN_PLOT_X
|
||
PR_GRIDWIN_PLOT_Y
|
||
|
||
|
||
PR_GRIDWIN_COMPLETE_ONLY
|
||
|
||
|
||
PR_GRIDWIN_GRIDLINES
|
||
PR_GRIDWIN_FREE_SIZES
|
||
|
||
|
||
PR_GRIDWIN_GRID_SIZE
|
||
PR_GRIDWIN_LOCK
|
||
PR_GRIDWIN_SIZES
|
||
PR_GRIDWIN_FLAGS
|
||
PR_GRIDWIN_XPLANE
|
||
PR_GRIDWIN_YPLANE
|
||
PR_GRIDWIN_ZOOMBASE
|
||
PR_GRIDWIN_SCROLL
|
||
|
||
|
||
}
|
||
|
||
|
||
{
|
||
typedef struct
|
||
|
||
|
||
{
|
||
|
||
INT locked;
|
||
INT anchor;
|
||
INT current;
|
||
INT visible;
|
||
UBYTE clipped;
|
||
UBYTE full;
|
||
INT total;
|
||
INT *psize;
|
||
INT defsize;
|
||
INT numspec;
|
||
INT scroll;
|
||
INT gutter;
|
||
INT max;
|
||
|
||
INT plot;
|
||
UWORD flags;
|
||
VOID *ptr;
|
||
|
||
} GRID_PLANE;
|
||
|
||
|
||
OODRNNSA
|
||
|
||
|
||
Number of locked cells (unscrollable)
|
||
Lowest visible unlocked cell
|
||
|
||
Currently selected cell
|
||
|
||
Highest number visible
|
||
|
||
Whether visible is clipped
|
||
|
||
Whether entire plane fits in display area
|
||
Total number of cells in plane
|
||
|
||
Pointer to cell size array
|
||
|
||
Default size for any unspecified cells
|
||
Number having individually specified size
|
||
Scroll bar size
|
||
|
||
Width of area beyond cell area
|
||
|
||
Maximum co-ordinate to draw cells to
|
||
Physical direction to plot plane
|
||
|
||
Various flags
|
||
|
||
For use by subclasses
|
||
|
||
|
||
6 XADD REFERENCE
|
||
|
||
|
||
typedef struct
|
||
|
||
|
||
{
|
||
GRID_PLANE xplane; Plane defining the grid columns
|
||
GRID_PLANE yplane; Plane defining the grid rows
|
||
INT zoombase; Zoom base font
|
||
INT zoom; Zoom state
|
||
UWORD flags; Mask flags
|
||
} IN_GRIDWIN;
|
||
}
|
||
PROPERTY
|
||
{
|
||
IN_GRIDWIN params; Current parameters
|
||
P_EXTENT wextent; The full window extent
|
||
UWORD fascent; Ascent of current display font
|
||
UBYTE fstyle; Style used for text display
|
||
}
|
||
}
|
||
Property
|
||
|
||
|
||
gridwin.params
|
||
|
||
|
||
gridwin.wextent
|
||
|
||
|
||
gridwin.fascent
|
||
|
||
|
||
gridwin.fstyle
|
||
|
||
|
||
Grid Planes
|
||
|
||
|
||
A pointer to an IN_GRIDWIN struct whose members are described below. This is a copy of the
|
||
IN_GRIDWIN struct passed to the WN_INIT and WN_SET methods.
|
||
|
||
|
||
xplane
|
||
|
||
|
||
yp lane
|
||
|
||
|
||
zoombase
|
||
|
||
|
||
zoom
|
||
|
||
|
||
flags
|
||
|
||
|
||
A GRID_PLANE struct that defines the x-plane (or columns) of the grid. The fields
|
||
of GRID_PLANE struct are described separately below.
|
||
|
||
|
||
A GRID_PLANE struct that defines the y-plane (or rows) of the grid
|
||
|
||
|
||
The font ID of the smallest font used to display data in the grid. This must be
|
||
specified on initialisation.
|
||
|
||
|
||
A numerical value that is adjusted as the grid is zoomed. This value is added onto
|
||
zoombase to give the font ID used to display data in the grid.
|
||
|
||
|
||
Defines which parts of the IN_GRIDWIN params struct to look at when calling
|
||
WN_SET (the whole struct is examined on WN_INIT):
|
||
|
||
|
||
PR_GRIDWIN_XPLANE Look at the xplane member of the IN_GRIDWIN struct
|
||
PR_GRIDWIN_YPLANE Look at the xplane member of the IN_GRIDWIN struct
|
||
|
||
|
||
PR_GRIDWIN_GRID_SIZE —_ Look at the total member of the specified planes
|
||
|
||
|
||
PR_GRIDWIN_LOCK Look at locked members
|
||
|
||
PR_GRIDWIN_SIZES Look at the psize, defsize and numspec members
|
||
PR_GRIDWIN_SCROLL Look at the scroll members
|
||
|
||
PR_GRIDWIN_FLAGS Look at the flags members
|
||
|
||
PR_GRIDWIN_ZOOMBASE Look at the zoombase member of the IN_GRIDWIN struct
|
||
|
||
|
||
A pointer to a P_EXTENT struct. This holds the current position and size of the grid window.
|
||
This is a copy of the P_EXTENT struct passed to the WN_INIT and wN_SET methods.
|
||
|
||
|
||
The ascent of the current display font. This is used to offset the position of text within a cell
|
||
from the top of the cell.
|
||
|
||
|
||
The current font style used to display data within the grid.
|
||
|
||
|
||
Grid planes describe the properties of a range of cells in a particular physical direction (x or y). They are specified using
|
||
the GRID_PLANE structure described below. Cells in a plane are referred to by index numbers, with the first cell
|
||
|
||
numbered zero. Each cell in a plane has a size in that physical direction (x or y), measured in pixels, which may or may
|
||
not be individually specified.
|
||
|
||
|
||
SIENA/SERIES 3C UPGRADE
|
||
|
||
|
||
GRIDWIN uses two grid planes; gridwin.params.xplane and gridwin.params.yplane to define the grid columns and
|
||
rows respectively. The intersection of these two planes forms the grid.
|
||
|
||
|
||
6 XADD REFERENCE
|
||
|
||
|
||
The IN_GRIDWIN struct that is used to initialise or set the grid contains these x and y planes. Unless otherwise specified, it
|
||
should be assumed that the fields described below must be filled on initialisation.
|
||
|
||
|
||
SIENA/SERIES 3C UPGRADE
|
||
|
||
|
||
Locked
|
||
|
||
|
||
anchor
|
||
current
|
||
|
||
|
||
visible
|
||
|
||
|
||
clipped
|
||
|
||
|
||
full
|
||
|
||
|
||
total
|
||
|
||
|
||
psize
|
||
|
||
|
||
defsize
|
||
|
||
|
||
numspec
|
||
|
||
|
||
scroll
|
||
|
||
|
||
gutter
|
||
|
||
|
||
max
|
||
|
||
|
||
plot
|
||
|
||
|
||
The number of locked cells in the plane. Cells in the plane with indexes 0 to
|
||
locked - 1 will be locked. Locked cells are not scrolled with other cells in the plane and are
|
||
always at the start of the plane. They can be used for column or row headings, for instance.
|
||
|
||
|
||
The lowest indexed cell in the plane that is both visible and not locked.
|
||
|
||
The cell in the plane that is currently selected (highlighted).
|
||
|
||
The highest indexed cell in the plane that is currently visible (on screen).
|
||
|
||
This value is calculated at run-time and need not be specified on initialisation.
|
||
|
||
|
||
Specifies whether the entirety of cell visible is currently visible or if it is clipped to the edge
|
||
of the screen. Contains 1 if visible is clipped, 0 otherwise. The index of the highest
|
||
indexed, fully visible cell can thus be obtained by subtracting clipped from visible.
|
||
|
||
|
||
This value is calculated at run-time and need not be specified on initialisation.
|
||
|
||
|
||
TRUE if the whole of the plane currently fits into the display area. Used to calculate whether a
|
||
scroll-bar is necessary.
|
||
|
||
|
||
This value is calculated at run-time and need not be specified on initialisation.
|
||
The total number of cells in the plane.
|
||
|
||
|
||
A pointer to an array of INTs specifying the size of cells in the plane. psize may be NULL in
|
||
which case an appropriate amount of memory is allocated to store column widths. If GRIDWIN
|
||
itself has to allocate memory, it also frees it on destruction.
|
||
|
||
|
||
The default size of cells for which no specific size is specified. If numspec is less than total,
|
||
i.e. there are some non-specified size cells, then defsize must be specified.
|
||
|
||
|
||
Specifies the number of cells which have an individually specified, and therefore variable, size.
|
||
Cells with indexes above numspec - 1 are assumed to have size defsize and cannot be
|
||
adjusted at runtime. If numspec is non-zero, and psize is not NULL, psize should point to an
|
||
array witha size of at least numspec * sizeof(INT).
|
||
|
||
|
||
The requested width for the scroll-bar. The scroll-bar will only be displayed if full is FALSE.
|
||
When the scroll bar is being displayed, the value of scroll will be copied to gutter.
|
||
|
||
|
||
Any scroll-bar width may be specified but it is recommended that either the set value of
|
||
PR_GRIDWIN_SCROLL_SMALL or PR_GRIDWIN_SCROLL_LARGE be used.
|
||
|
||
|
||
GRIDWIN will use small scroll-bar arrows if scroll is less than PR_GRIDWIN_SCROLL_LARGE
|
||
otherwise large arrows will be used.
|
||
|
||
|
||
GRIDWIN does not support scroll bars for horizontally plotted planes.
|
||
|
||
|
||
Note: Although a vertical scroll bar represents the position within the grid vertically, it is drawn
|
||
in a horizontal plane and is defined by the scroll member of the horizontal GRID_PLANE
|
||
opposed to the one which it represents.
|
||
|
||
|
||
The width of the area beyond the cell display area. The value of scroll is copied here when
|
||
the scroll bar is displayed.
|
||
|
||
|
||
This value is calculated at run-time and need not be specified on initialisation.
|
||
|
||
|
||
The maximum co-ordinate that the plane can draw cells to. This is calculated by subtracting
|
||
PR_GRIDWIN_BORDER_WIDTH and gutter from gridwin.wextent.width.
|
||
|
||
|
||
This value is calculated at run-time and need not be specified on initialisation.
|
||
|
||
|
||
The physical direction to plot the plane on screen. GRIDWIN recognises values of
|
||
PR_GRIDWIN_PLOT_X for a horizontal direction and PR_GRIDWIN_PLOT_Y for a vertical direction.
|
||
GRIDWIN sets the appropriate value for gridwin.params.xplane and gridwin.params.yplane
|
||
on initialisation so this need not be specified.
|
||
|
||
|
||
Various flags controlling properties of the grid:
|
||
|
||
|
||
PR_GRIDWIN_COMPLETE_ONLY Specifies that only fully visible cells are drawn. GRIDWIN does
|
||
|
||
|
||
6 XADD REFERENCE
|
||
|
||
|
||
not recognise this flag for horizontal planes
|
||
|
||
|
||
PR_GRIDWIN_GRIDLINES Draw a dotted dividing line at the furthest edge of each cell in
|
||
the plane.
|
||
|
||
|
||
Solid dividing lines are always drawn at the end of the last
|
||
locked cell, irrespective of this flag.
|
||
|
||
|
||
PR_GRIDWIN_FREE_SIZES Used internally to record the fact that GRIDWIN itself allocated
|
||
the memory used for the cell size array and that it must be freed
|
||
on destruction of the window.
|
||
|
||
|
||
ptr A VOID pointer not used by GRIDWIN but provided for use by subclasses which may, for
|
||
instance, provide additional structs that specify additional plane properties.
|
||
|
||
|
||
GRIDWIN methods
|
||
|
||
|
||
© DESTROY Destroy
|
||
VOID destroy(VOID);
|
||
Destroy the window.
|
||
|
||
|
||
Frees the memory used by gridwin.xplane.psize and gridwin.yplane.psize if gridwin.xplane. flags and/or
|
||
gridwin.yplane. flags, respectively, contain PR_GRIDWIN_FREE_SIZES.
|
||
|
||
|
||
Supersends a DESTROY message.
|
||
|
||
|
||
WN_INIT Initialise grid
|
||
VOID wn_init(PR_WIN *parent, P_EXTENT *wextent, IN_GRIDWIN *init);
|
||
Create and intialise the grid window according to *parent, *wextent and *init.
|
||
|
||
|
||
Creates the grid window as a child of *parent with the position and size specified by *wextent. If the window is to bea
|
||
root window, *parent should be NULL.
|
||
|
||
|
||
The grid is created with the inital parameters specified in *init. The number of locked rows and columns, etc., can
|
||
therefore be set when the grid window is created. For a full description of the the IN_GRIDWIN structure, refer to the
|
||
Property section above.
|
||
|
||
|
||
The supplied wN_INIT method may leave with E_GEN_ARG if certain illegal values are passed.
|
||
|
||
|
||
WN_SET Reset grid parameters
|
||
VOID wn_set(P_EXTENT *wextent, IN_GRIDWIN *pnew);
|
||
|
||
Reset the window to position and size *wextent and/or change one or more GRIDWIN parameters.
|
||
|
||
The wextent parameter may be NULL.
|
||
|
||
|
||
WN_SET will only look at those fields in *pnew specified by pnew->flags.. The number of locked rows and columns,
|
||
etc., can therefore be reset. Fora full description, refer to the Property section above.
|
||
|
||
|
||
WN_SET cannot be used to change the current anchor cell or current select cell; Gw_MOVE_TO must be used for this purpose.
|
||
|
||
|
||
SIENA/SERIES 3C UPGRADE
|
||
|
||
|
||
WN_SENSE Get current grid parameters
|
||
INT wn_sense(IN_GRIDWIN *pparams);
|
||
|
||
|
||
Write the current grid parameters to *pparams. This method does nothing more than copy the contents of
|
||
gridwin.params to *pparams.
|
||
|
||
|
||
Note: A convenience method, gw_get_current, is provided for returning the currently selected cell.
|
||
|
||
|
||
WN_KEY Handle key input
|
||
|
||
|
||
INT wn_key(INT keycode, INT modifiers);
|
||
Handle keypresses passed to the window.
|
||
If keycode is W_KEY_LEFT:
|
||
|
||
|
||
e If modifiers does not contain W_SHIFT_MODIFIER, make current the first cell before
|
||
gridwin.params.xplane.current, in the plane gridwin.params.xplane, that has non-zero size and is not
|
||
locked.
|
||
|
||
|
||
e =If modifiers does contain W_SHIFT_MODIFIER but does not contain W_CTRL_MODIFIER, reduce the width of the
|
||
currently selected column (gridwin.params.xplane.current) by one width unit. A width unit is definined to
|
||
be two thirds of the width of the widest character in the current display font.
|
||
|
||
|
||
e If modifiers contains both w_SHIFT_MODIFIER and W_CTRL_MODIFIER, reduce the width of the currently
|
||
selected column by 8 width units.
|
||
|
||
|
||
If keycode is W_KEY_RIGHT:
|
||
|
||
|
||
e If modifiers does not contain W_SHIFT_MODIFIER, make current the next cell after
|
||
gridwin.params.xplane.current, in the plane gridwin.params.xplane, that has non-zero size
|
||
|
||
|
||
e =If modifiers does contain W_SHIFT_MODIFIER but does not contain Ww_CTRL_MODIFIER, increase the width of the
|
||
currently selected column (gridwin.params.xplane.current) by one width unit. A width unit is definined to
|
||
be two thirds of the width of the widest character in the current display font.
|
||
|
||
|
||
e If modifiers contains both w_SHIFT_MODIFIER and W_CTRL_MODIFIER, increase the width of the currently
|
||
selected column by 8 width units.
|
||
|
||
|
||
If keycode is W_KEY_HOME:
|
||
|
||
e = Make current the first cell in the plane gridwin.params.xplane, that has non-zero size and is not locked.
|
||
If keycode is W_KEY_END:
|
||
|
||
e = Make current the last cell in the plane gridwin. params .xplane, that has non-zero size.
|
||
|
||
|
||
If keycode is W_KEY_UP:
|
||
|
||
|
||
e Make current the first cell before gridwin.params.yplane.current, in the plane gridwin.params.yplane, that
|
||
has non-zero size and is not locked.
|
||
|
||
|
||
If keycode is W_KEY_DOWN:
|
||
|
||
|
||
e = Make current the next cell after gridwin.params.yplane.current, in the plane gridwin. params. yplane, that
|
||
has non-zero size.
|
||
|
||
|
||
6 XADD REFERENCE
|
||
|
||
|
||
If keycode is W_KEY_PAGE_UP:
|
||
|
||
|
||
e If modifiers does not contain W_CTRL_MODIFIER, decrement gridwin.params.yplane. anchor by the number of
|
||
unlocked cells that are currently fully visible in the plane gridwin.params.yplane. Also, unless the first row is
|
||
already visible, decrement gridwin.params.yplane.current to keep the current position within the page
|
||
constant, i.e. ensure that the value of gridwin.params.yplane.current - gridwin.params.yplane.anchor is
|
||
constant.
|
||
|
||
|
||
e If modifiers does contain Ww_CTRL_MODIFIER, make current the first cell in the plane gridwin. params. yplane
|
||
that is not locked and has non-zero size.
|
||
|
||
|
||
If keycode is W_KEY_PAGE_DOWN:
|
||
|
||
|
||
e If modifiers does not contain W_CTRL_MODIFIER, increment gridwin.params.yplane. anchor by the number of
|
||
unlocked cells that are currently fully visible in the plane gridwin.params.yplane. Also, unless the last row is
|
||
already visible, increment gridwin.params.yplane.current to keep the current position within the page
|
||
constant, i.e. ensure that the value of gridwin.params.yplane.current - gridwin.params.yplane.anchor is
|
||
constant.
|
||
|
||
|
||
e If modifiers does contain w_CTRL_MODIFIER, make current the last cell in the plane gridwin.params.yplane
|
||
that has non-zero size.
|
||
|
||
|
||
All movement operations are performed from wN_KEY by sending Gw_MoveE_TO which does much of the validation of the
|
||
new anchor and current positions.
|
||
|
||
|
||
However, a WN_KEY method must ensure the following before passing new values for the current cell and/or anchor cell to
|
||
GW_MOVE_TO:
|
||
|
||
|
||
e the new anchor cell actually exists
|
||
e the new current cell actually exists
|
||
e — the new current cell does not have a zero width
|
||
|
||
|
||
Gw_MOVE_TO performs the rest of the validation and will scroll the screen and adjust the values as necessary if, for
|
||
instance, the new current cell is not currently visible or if the new anchor cell has zero size.
|
||
|
||
|
||
All adjustments of column width are performed from wN_KEY by sending Gw_SET_COL_WIDTH which does all of the
|
||
validation of the new values.
|
||
|
||
|
||
This method returns WN_KEY_CHANGED if it receives any of the keypresses above, otherwise WN_KEY_NO_CHANGE.
|
||
|
||
|
||
WN_REDRAW Handle partial redraw
|
||
|
||
|
||
VOID wn_redraw(P_RECT *prect);
|
||
Validate the area *prect for redrawing and draw the necessary sections of the window.
|
||
|
||
|
||
Sends itself a WN_DRAW message, passing prect.
|
||
|
||
|
||
WN_DRAW Perform intelligent draw
|
||
|
||
|
||
VOID wn_draw(P_RECT *prect);
|
||
Draw all sections of the window that occupy positions in the region specified by *prect.
|
||
|
||
|
||
The supplied method calculates which cells are in the co-ordinate range specified in *prect and then calls
|
||
GW_DRAW_CELLS to draw those cells.
|
||
|
||
|
||
This provides for an extremely efficient drawing mechanism in that:
|
||
|
||
|
||
e — only those areas of the window that need redrawing are validated and drawn to giving large savings in drawing
|
||
time.
|
||
|
||
|
||
e the Gw_GET_DATA method only has to obtain data for those areas that actually need to be drawn. This can give
|
||
massive savings in applications where obtaining the data is relatively slow.
|
||
|
||
|
||
All other screen components such as the scroll bar are drawn if the area they occupy falls with in *prect.
|
||
|
||
|
||
SIENA/SERIES 3C UPGRADE
|
||
|
||
|
||
WN_EMPHASISE Set window highlight
|
||
|
||
|
||
VOID wn_emphasise(UINT flag);
|
||
|
||
|
||
Set or clear the PR_WIN_EMPHASISED bit in win. flags according to flag. Highlight the current selection if flag is TRUE
|
||
else remove the window highlight.
|
||
|
||
|
||
GRIDWIN sets or removes the highlight by calling Gw_HIGHLIGHT as indicated in the following code:
|
||
if (flag != (self->win.flags & PR_WIN_EMPHASISED) )
|
||
|
||
|
||
self->win.flags “= PR_WIN_EMPHASISED;
|
||
gCreateTempGCO(self->win.id);
|
||
p_send2(self, O_GW_HIGHLIGHT);
|
||
gFreeTempGC();
|
||
|
||
|
||
z
|
||
|
||
|
||
GW_GET_CELL_RECT Get screen rectangle for cell
|
||
|
||
|
||
INT gw_get_cell_rect(P_POINT *cell, P_RECT *rect);
|
||
|
||
|
||
Write the screen co-ordinates of the rectangle occupied by the cell *ce11 into *rect.
|
||
Returns TRUE if the cell is currently visible, FALSE if it is not.
|
||
|
||
|
||
Note: If the cell has zero size in either plane, this method will write the cell rectangle to *rect although it will return
|
||
FALSE. In all other circumstances where the cell is not visible, this method will return FALSE immediately.
|
||
|
||
|
||
GW_DRAW_CELLS Draw a range of cells
|
||
|
||
|
||
VOID gw_draw_cells(P_RECT *abs_range);
|
||
Draw the cells with indexes specified in the range *abs_range.
|
||
|
||
|
||
The supplied method performs drawing on a row or partial row basis.
|
||
|
||
For each row specified in *abs_range, it first checks whether it is currently visible and, if so, calls Gw_GET_DATA under
|
||
the protection of p_entersend to obtain the data for that row or section thereof. The method then checks each cell in the
|
||
row and draws it if visible. If GW_GET_DATA called p_leave or returned non-zero, the cells are drawn empty. Grid lines
|
||
are drawn if specified in gridwin.xplane and/or gridwin.yplane.
|
||
|
||
|
||
For further discussion of the operation of the supplied Gw_DRAW_CELLS, refer to the description of Gw_GET_DATA.
|
||
Note: The supplied method may write to *abs_range.
|
||
|
||
|
||
Since all drawing of cells is performed by calling Gw_DRAW_CELLS, a subclass that replaces this method can draw
|
||
whatever it wishes in each cell. A subclass, may for instance wish to draw bitmaps in each cell rather than text.
|
||
|
||
|
||
GW_GET_CURRENT Return current selection
|
||
VOID gw_get_current(P_POINT *ppos);
|
||
Write the absolute coordinates of the currently selected cell to *ppos.
|
||
|
||
|
||
This method does nothing more than copy the contents of gridwin.params.xplane.current and
|
||
gridwin.params.yplane.current to ppos->x and ppos->y, respectively.
|
||
|
||
|
||
GW_MOVE_TO Move to a specific cell
|
||
|
||
|
||
VOID gw_move_to(P_POINT *ppoint, P_POINT *ptl);
|
||
|
||
|
||
Make the cell at coordinates *ppoint the current cell and/or make the cell at coordinates *pt1 the anchor cell in the
|
||
respective planes.
|
||
|
||
|
||
Redraw the screen as necessary.
|
||
|
||
|
||
Either ppoint or pt1l can be NULL.
|
||
|
||
|
||
0-12
|
||
|
||
|
||
6 XADD REFERENCE
|
||
|
||
|
||
This method will adjust the currently selected cell if the postion of the new top-left cell causes the current selection to be
|
||
invisible.
|
||
|
||
|
||
This method will use the nearest cell to that at *pt1 if *pt1 is a cell that has zero size (i.e. is in a row with no height
|
||
and/or a column with nowidth).
|
||
|
||
|
||
Usually, only a subclass that alters the manner in which the grid is scrolled will use the pt1 parameter.
|
||
|
||
|
||
Subclasses should not normally replace this method.
|
||
|
||
|
||
GW_SET COL WIDTH Set the width of a column
|
||
|
||
|
||
INT gw_set_col_width(UINT col, INT new_width);
|
||
|
||
|
||
Set absolute column col to width new_width.
|
||
If the column is currently visible, scroll and redraw the screen as necessary.
|
||
|
||
|
||
Any column may be adjusted with this method, including locked columns and columns that are not currently visible.
|
||
The new_width parameter may be zero for non-locked columns.
|
||
|
||
|
||
Returns TRUE if the column was successfully adjusted, otherwise FALSE if any of the following conditions are met:
|
||
e the column does not exist
|
||
|
||
|
||
e the column is locked and new_width < PR_GRIDWIN_MIN_COL_WIDTH
|
||
|
||
|
||
e the column already has width new_width
|
||
|
||
|
||
e the column cannot have an individually specified width, i.e.
|
||
col >= gridwin.params.xplane.numspec
|
||
|
||
|
||
¢ —new_width is zero and all other non-locked columns have zero width.
|
||
|
||
|
||
GW_SET_ROW_HEIGHT Set the height of a row
|
||
VOID gw_set_row_height(UINT row, INT new_height);
|
||
Set the absolute row row to height new_height .
|
||
|
||
|
||
The supplied method does nothing and is provided for subclasses which may, for instance, wish to provide for user
|
||
alteration of column heights.
|
||
|
||
|
||
GW_ZOOM Zoom the grid
|
||
|
||
|
||
VOID gw_zoom(INT direction);
|
||
|
||
|
||
If direction is TRUE, increase the size of the current display font, otherwise decrease it. Adjust the height of all rows
|
||
accordingly.
|
||
|
||
|
||
The current zoom level is held in gridwin.params.zoom and is in the range 0 to 3. The level is wrapped around above
|
||
and below these limits. The ID of the current display font is obtained by adding gridwin.params.zoom to
|
||
gridwin.params.zoombase.
|
||
|
||
|
||
The grid rows are adjusted by calculating the difference between the character heights of the old and new display fonts
|
||
and adding this to the height of each row in gridwin.params.yplane.psize and to gridwin.params.yplane.defsize.
|
||
|
||
|
||
This method causes the whole window to be redrawn.
|
||
|
||
|
||
A subclass that wishes to change the manner in which the grid zooms, e.g. to restrict the number of zooms levels
|
||
available, should replace this method.
|
||
|
||
|
||
GW_HIGHLIGHT Highlight current selection
|
||
VOID gw_highlight(VOID);
|
||
|
||
|
||
The supplied method inverts the area of the currently selected cell.
|
||
|
||
|
||
SIENA/SERIES 3C UPGRADE
|
||
|
||
|
||
GRIDWIN expects that the operation of a GW_HIGHLIGHT method to be reversible, i.e. calling it a second time removes the
|
||
highlight.
|
||
|
||
|
||
GRIDWIN will only call Gw_HIGHLIGHT whilst the grid window has the emphasis, i.e. the PR_WIN_EMPHASISED bit in
|
||
win. flags is set.
|
||
|
||
|
||
Deferred GRIDWIN methods
|
||
|
||
|
||
GW_GET DATA Get data for cells
|
||
|
||
|
||
INT gw_get_data(TEXT **cols, P_RECT *range);
|
||
Get the data for the specified range of cells.
|
||
This is the only method which a subclass need replace in order to create a fully functional grid window.
|
||
|
||
|
||
This method is called by Gw_DRAW_CELLS to obtain the data to be displayed in a range of cells.
|
||
As discussed above, the supplied gw_draw_cells method performs drawing on a row or partial row basis.
|
||
|
||
|
||
The arguments passed to GW_GET_DATA by the supplied Gw_DRAW_CELLS method are as follows:
|
||
range range->tl.y specifies the row for which data is being requested.
|
||
|
||
|
||
range->t1.x specifies the first column index for which data is being requested,
|
||
range->br.x specifies the last.
|
||
|
||
|
||
range->br.y specifies the maximum row for which data will be requested for this redraw. This
|
||
gives the subclass some opportunity to appropriately cache its retrieval of data if necessary.
|
||
|
||
|
||
cols A pointer to an array of text pointers. The passed array is guaranteed to be exactly big enough to
|
||
hold (range->br.x - range->tl.x) + 1 pointers.
|
||
A subclass should set each element in this array to point to a zero-terminated string for each of
|
||
the cells requested.
|
||
|
||
|
||
The supplied Gw_DRAW_CELLS method calls GWw_GET_DATA under the protection of p_entersend. A GW_GET_DATA method is
|
||
free to call p_leave or return non-zero at any time. In this case, the supplied Gw_DRAW_CELLS method will ignore *cols,
|
||
draw empty cells for the entire row and proceed to the next row. Otherwise, a GW_GET_DATA method should return 0 to
|
||
indicate that it has provided valid pointers in every element of the passed array.
|
||
|
||
|
||
As there will always be a temporary graphics context in existence when Gw_GET_DATA is called, it is possible for a
|
||
subclass to alter the appearance of the grid display on a row for row basis from within the Gw_GET_DATA method.
|
||
|
||
|
||
A subclass may, for instance, wish to display the top line of the grid in a different font to the rest. In this case a subclass
|
||
would set the temporary graphics context to that font and size when asked for data for that line. The subclass must also
|
||
set gridwin. params.zoombase, gridwin.params.zoom, gridwin.fascent and gridwin.fstyle to the appropriate values
|
||
to enable GRIDWIN to properly align the text in that font. The subclass must remember to reset the graphics context and
|
||
gridwin property to their original values when asked for the next row of data.
|
||
|
||
|
||
For any more substantial alteration of the display, for example using differing fonts between cells within rows, a subclass
|
||
will need to provide its own Gw_DRAW_CELLS method.
|
||
|
||
|
||
Since, gw_draw_celts is the only method to call gw_get_data, a subclass that replaces gw_draw_cel\s is free to use
|
||
whatever arguments to gw_get_data it wishes and to get data for cells by whatever mechanism it wishes. A subclass
|
||
may, for instance, call gw_get_data for each cell individually.
|
||
|
||
|
||
MATCHWIN
|
||
|
||
|
||
gw_get_cell_rect
|
||
wn_calc_position i _ini gw_draw_cells
|
||
wn_connect gw_get_curent
|
||
wn_dodraw is gwomeve—te
|
||
i gw_set_col_width
|
||
wn_redraw gw_set_row_height
|
||
wn_draw gw_zoom
|
||
|
||
|
||
wn_emphasise gwhightight
|
||
|
||
|
||
gw_get_data
|
||
|
||
|
||
6 XADD REFERENCE
|
||
|
||
|
||
MATCHWIN
|
||
|
||
|
||
mw_start_match
|
||
mw_stop_match
|
||
mw_hit_maxlen
|
||
|
||
|
||
The MATCHWIN class creates a grid display that is identical to that of the GRIDWIN class with the following changes:
|
||
|
||
|
||
e the concept of a individually selected cell is abandoned in favour of the selection of an entire row. The
|
||
currently selected cell in the x-plane is taken to be the anchor cell. The whole of the currently selected row is
|
||
|
||
|
||
highlighted.
|
||
|
||
|
||
¢ optionally, incremental matching can be preformed on one column whether or not that column is visible.
|
||
|
||
|
||
The GRIDWIN class provides a deferred method - the gw_get_data method - which must be replaced by any subclass of
|
||
|
||
|
||
MATCHWIN to create a fully-functioning incrementally matching grid window.
|
||
|
||
|
||
Class definition
|
||
|
||
|
||
Defined in the sub-category file matchwin.cl (generated header file matchwin.g).
|
||
|
||
|
||
CLASS matchwin gridwin
|
||
{
|
||
REPLACE wn_key
|
||
REPLACE gw_highlight
|
||
REPLACE gw_move_to
|
||
ADD mw_start_match
|
||
ADD mw_stop_match
|
||
ADD mw_hit_maxlen
|
||
|
||
|
||
CONSTANTS
|
||
|
||
|
||
{
|
||
PR_MATCHWIN_UNSET (-1)
|
||
|
||
|
||
}
|
||
|
||
|
||
SIENA/SERIES 3C UPGRADE
|
||
|
||
|
||
TYPES
|
||
{
|
||
typedef struct
|
||
{
|
||
PR_VAROOT *array; Pointer to array for VMATCHER
|
||
UINT maxlen; Maximum length of match
|
||
UWORD txtoff; Offset within array record
|
||
UINT minrec; Minimum index within array to match
|
||
UINT maxrec; Maximum index within array to match
|
||
INT offset; Offsets the index returned from matcher
|
||
UINT column; Column for matching
|
||
INT position; Which row for matched record or _UNSET
|
||
} IN_MATCHWIN;
|
||
}
|
||
PROPERTY 1
|
||
{
|
||
PR_VMATCHER *matcher; Pointer to incremental matcher
|
||
IN_MATCHWIN params; Current parameters
|
||
UBYTE matchlen; Current match length
|
||
UBYTE filler;
|
||
}
|
||
}
|
||
Property
|
||
matchwin.matcher A pointer to a VMATCHER incremental matcher object or NULL if no incremental
|
||
matcher is currently in use.
|
||
matchwin. params A pointer to an IN_MATCHWIN struct. This is a copy of the IN_MATCHWIN struct
|
||
|
||
|
||
passed to the MW_START_MATCH method.
|
||
|
||
|
||
For a full description of the IN_MATCHWIN struct, see the description of the
|
||
MW_START_MATCH method below.
|
||
|
||
|
||
matchwin.matchlen — Holds the current length of the match string. The address of matchwin.matchlen
|
||
is passed to matchwin.matcher when it is initialised.
|
||
|
||
|
||
MATCHWIN methods
|
||
|
||
|
||
WN_KEY Handle key input
|
||
|
||
|
||
INT wn_key(INT keycode, INT modifiers);
|
||
The MATCHWIN wn_key method performs two functions over and above the GRIDWIN method:
|
||
|
||
|
||
e it intercepts the unmodified keycodes w_KEY_LEFT, W_KEY_RIGHT, W_KEY_HOME and W_KEY_END to alter the
|
||
horizontal scrolling behaviour as discussed above. This involves altering the anchor cell rather than the current
|
||
cell on horizontal movement. For MATCHWIN, the current cell will always be the anchor cell in the x-plane.
|
||
Any other movement or cell adjustment keypresses are sent to the GRIDWIN wn_key method.
|
||
|
||
|
||
e it passes any remaining unprocessed keypresses to the incremental matcher if there is one and adjusts the
|
||
highlight position and/or current row depending on the value returned from the matcher.
|
||
|
||
|
||
GW_HIGHLIGHT Highlight current selection
|
||
|
||
|
||
VOID gw_highlight(VOID);
|
||
|
||
|
||
The MATCHWIN gw_highlight method highlights as much as is visible of the currently selected row and positions the
|
||
incremental matcher cursor if incremental matching is active and the cursor is visible.
|
||
|
||
|
||
6 XADD REFERENCE
|
||
|
||
|
||
GW_MOVE_TO Move to a specific cell
|
||
VOID gw_move_to(P_POINT *ppoint, P_POINT *ptl);
|
||
|
||
|
||
MATCHWIN subclasses this method in order to detect any change in the currently selected row and reset the incremental
|
||
matcher accordingly.
|
||
|
||
|
||
This is done by simply recording the value of gridwin.params.yplane.current and comparing it with the value after
|
||
supersending GW_MOVE_TO to GRIDWIN. If the value is altered and a matcher is present, the matcher is reset to the new
|
||
current record.
|
||
|
||
|
||
This procedure enables subclasses to freely navigate around the grid by calling Gw_mMove_To without interferring with the
|
||
operation of the matcher.
|
||
|
||
|
||
MW_START_MATCH Start incremental match
|
||
VOID mw_start_match(IN_MATCHWIN *match);
|
||
|
||
Start incremental matching based on the parameters in *match and copy *match to matchwin. params.
|
||
|
||
The members of the IN_MATCHWIN struct are as follows:
|
||
|
||
|
||
array A pointer to a VA_ROOT array object (or subclass thereof) that the incremental matching is to
|
||
be performed on.
|
||
|
||
|
||
max len The maximum string length to match.
|
||
|
||
txtoff The byte offset from the beginning of items in array to perform incremental matching from.
|
||
minrec The index of the first item in array to match.
|
||
|
||
maxrec The index of the last item in array to match.
|
||
|
||
offset A value that is added onto the value returned from the matcher’s IM_SENSE_VAL method to
|
||
|
||
|
||
offset the grid row to jump to. This removes the need for a exact correlation between
|
||
indexes in array to lines in the grid.
|
||
|
||
|
||
column The column in the grid that array corresponds to, i.e. the column that incremental matching
|
||
is being performed on.
|
||
|
||
|
||
position The number of rows below the last locked row to position the matched row, i.e. after a match,
|
||
gridwin.params.yplane.anchor will be set to matched row - position.
|
||
position may also be set to PR_MATCHWIN_UNSET, in which case the matched row is navigated
|
||
to in such a way as to require the minimum possible screen redrawing.
|
||
|
||
|
||
The matcher is created and initialised with the following code:
|
||
|
||
|
||
self->matchwin.matcher = f_newsend(CAT_XADD_HWIM, C_VMATCHER, O_IM_INIT,
|
||
&self->matchwin.matchlen, match->maxlen, match->array);
|
||
|
||
|
||
p_send5(self->matchwin.matcher, O_IM_SET_RANGE, match->minrec, match->maxrec,
|
||
match->txtoff);
|
||
|
||
|
||
Returns immediately if matching is already active.
|
||
|
||
|
||
MW_STOP_MATCH Stop incremental match
|
||
VOID mw_stop_match(VOID);
|
||
|
||
Stop incremental matching by destroying the incremental matcher and erasing the flashing text cursor.
|
||
|
||
Sets matchwin.matcher to NULL.
|
||
|
||
|
||
This method does nothing if incremental matching is not active, i.e. if matchwin.matcher is NULL.
|
||
|
||
|
||
SIENA/SERIES 3C UPGRADE
|
||
|
||
|
||
MW_HIT MAXLEN Maximum characters matched
|
||
|
||
|
||
VOID mw_hit_maxlen(VOID);
|
||
|
||
|
||
This method is called when the incremental matcher has been unable to match the most recent keypress because
|
||
matchwin.matchlen has reached matchwin.params.maxlen (as opposed to when no strings in the array match).
|
||
|
||
|
||
A subclass may, for instance, wish to perform further matching by some other mechanism or display some message to the
|
||
user.
|
||
|
||
|