Up
Authors
- Nicola Pero (
n.pero@mi.flashnet.it
)
-
The GSTable class (a GNU extension)
Copyright: (C) 1999 Free Software Foundation, Inc.
A GSTable object is used to control the disposition (position
and size) of a group of NSViews. The GSTable object offers
two main facilities to the programmer:
-
with a GSTable object, you do not need to specify the
exact position and size of each view. You only specify
the logical position, relative to the other views in the
table. The actual frame of each view is then computed
by the GSTable at run time.
-
when the GSTable is resized (for example, because the
user has resized the window in which the GSTable is),
the GSTable takes care of moving and resizing all its
views automatically. This is done in much a advanced
and customizable way than in the usual standard NSView's
autoresizing mechanism.
You create a GSTable instance with a certain number of rows
and columns. The GSTable object itself is invisible; it is
only a logical device used to specify the subview
position. Then, you place one by one the views you
want to control in the GSTable, by calling a method of the
family
-putView:atRow:column:
. Before placing a view in the table, you should resize it to
the minimum comfortable size you want it to have. The table
then automatically places the views, organizing them in
well-ordered columns and rows.
The initial size of the GSTable is zero; each time you put
a view in the GSTable, the GSTable recomputes sizes and as a
result resizes itself so that it exactly fits the views
it contains. You should not force a GSTable in a size
different from the one it has automatically computed.
The only acceptable, reasonable and meaningful way of
resizing a GSTable is through the appropriate
[NSView -resizeWithOldSuperviewSize:]
message when the GSTable is in the view hierarchy.
When you add a view, you may specify some particular
margins to be used for that view. If nothing is
specified, the view is added to the table with the
margins of 0. You should think of each view and its
margins as a whole. A position in the GSTable is free
or filled with a view and its margins.
The GSTable itself knows what is the minimum size it needs
to have in order to comfortably display the views it
contains. You may get this size by calling the method
-minimumSize
. When first filled, the table has this minimum size. If in
any moment you want the table to restore itself to this
size, you should invoke the method
-sizeToFit
.
When the GSTable receives a
[NSView -resizeWithOldSuperviewSize:]
message, it automatically rearranges the views it contains:
-
If the new width or height is equal or less than the
table's minimum width or height, the GSTable simply
arranges its views in the initial position. In other
words, the GSTable refuse to resize below its minimum
width or height. If you do that, part of the GSTable is
clipped.
-
If the new width or height is bigger than the table's
minimum width or height, the space in excess is
equally distributed between the columns or rows which
have X (or Y) resizing enabled. When a column or a row
is resized, each view in the column or row is resized
together with its margins. By setting the
autoresizingMask of each view, you may
decide how the resizing operation will act on that
particular view and its margins. For example,
setting the autoresizingMask to
NSViewWidthSizable | NSViewHeightSizable
will always leave the margins fixed to their initial
dimensions, and expand/reduce only the view, in
all directions. Setting the autoresizingMask to
NSViewMinXMargin | NSViewMaxXMargin
| NSViewSizable | NSViewHeightSizable
will instead expand/reduce both the margins and the view
in the horizontal direction, but leave the margins fixed
and expand/reduce only the view in the vertical
direction. Whatever the autoresizingMask and the
amount of the resizing, views and margins are never
resized below their minimum comfortable size, as
explained above. For more information on the
autoresizingMask, please refer to the
description of the
-setAutoresizingMask:
method of the NSView class.
We call any view which is added to the GSTable a
prisoner. The purpose of the GSTable is to
effectively manage its prisoners. To do so, the
GSTable creates a special view, called a
jail, for each prisoner. The jails are
subviews of the GSTable; each prisoner, when added
to the GSTable, is made a subview of its jail. The GSTable
always moves and resizes directly the jails. The
moving is automatically transmitted to the prisoners,
which are subviews of the jails; the resizing is
transmitted through the usual autoresizing
machinery, because the jails always have
autoresizing of subviews turned on. This works
because if a prisoner sends to its superview an
[NSView -frame]
message, the frame of the jail (and not the
frame of the GSTable) is returned, so that each
prisoner will autoresize itself in its jail frame.
Moreover, any prisoner, being a subview of its
jail, is clipped in its jail frame. If a prisoner draws
something out of its jail frame, the output is
discarded by the usual subview/view clipping
machinery. This prevents the prisoners from
disturbing each other. The dimension of the jail
is the dimension of the prisoner plus its margins. Since
the GSTable manages directly the jails, each prisoner is
managed together with its margins. When the jail is
resized, the prisoner receives a
[NSView -resizeWithOldSuperviewSize:]
, which makes it resize itself and its margins in the new jail size, according to its autoresizingMask.
When the GSTable is resized, the extra space is equally
divided between the Rows and Columns which have the X
(or Y) resizing enabled. The following methods let you
enable/disable the X (or Y) resizing of each
row and column in the GSTable. Note that when the GSTable
is first created, all its columns and rows have by default
resizing enabled.
-setXResizingEnabled:forColumn:
,
-setYResizingEnabled:forRow:
.
- Declared in:
- GNUstepGUI/GSTable.h
Availability: OpenStep
Description forthcoming.
Instance Variables
Method summary
- (void)
addColumn;
Availability: OpenStep
Add a column to the GSTable. The column is added
void, with zero width and X
Resizing enabled.
- (void)
addRow;
Availability: OpenStep
Add a row to the GSTable. The row is added
void, with zero height and Y
Resizing enabled.
- (id)
init;
Availability: OpenStep
Initialize with a default of 2 columns and 2
rows.
- (id)
initWithNumberOfRows: (int)rows
numberOfColumns: (int)columns;
Availability: OpenStep
Initialize a GSTable with columns
columns and rows
rows. If columns or
rows is negative or null, a warning is
issued and a default of 2 is used instead.
- (BOOL)
isXResizingEnabledForColumn: (int)aColumn;
Availability: OpenStep
Return whether X resizing is enabled for the column
aColumn.
- (BOOL)
isYResizingEnabledForRow: (int)aRow;
Availability: OpenStep
Return whether Y resizing is enabled for the row
aRow.
- (
NSSize)
minimumSize;
Availability: OpenStep
This returns the minimum size the GSTable should be
resized to. Trying to resize the GSTable below this
size will only result in clipping (ie, making it
disappear) part of the GSTable.
- (int)
numberOfColumns;
Availability: OpenStep
Return the number of columns in the GSTable.
- (int)
numberOfRows;
Availability: OpenStep
Return the number of rows in the GSTable.
- (void)
putView: (NSView*)aView
atRow: (int)row
column: (int)column;
Availability: OpenStep
Put aView in the GSTable, in the specified
row and column. Zero (0)
margins are used. If the column
column (or the row
row}) is not enough big to fully display
aView and its margins, the
column (or the row) is resized
(regardless of the fact that X or Y Resizing is
Enabled or not). It is understood that this will
affect each view (and its margins) in the
column (or row) according to
the autoresizing mask of each view.
- (void)
putView: (NSView*)aView
atRow: (int)row
column: (int)column
withMargins: (float)margins;
Availability: OpenStep
Put aView in the GSTable, using
margins as margin in all directions: left,
right, top, bottom.
- (void)
putView: (NSView*)aView
atRow: (int)row
column: (int)column
withMinXMargin: (float)minXMargin
maxXMargin: (float)maxXMargin
minYMargin: (float)minYMargin
maxYMargin: (float)maxYMargin;
Availability: OpenStep
Put aView in the GSTable, using the
specified margins. The names for the margins
are chosen as to be as close as possible to the
autoresizingMask convention. The margins
are to be interpreted as follows:
- minXMargin
-
Left Margin
- maxXMargin
-
Right Margin
- minYMargin
-
Lower Margin (Upper if view is flipped)
- maxYMargin
-
Upper Margin (Lower if view is flipped)
Each view which is added to the GSTable can have
some margins set. The GSTable treats the view and
its margins as a whole. They are given (as a whole)
some space, which is reduced or increased (but only
if X or Y Resizing is Enabled for the
column or the row in which
the view resides) when the GSTable is resized. When
this happens, the space is added (or subtracted) to
the view or to the margins according to the
autoResizeMask of the view.
- (void)
putView: (NSView*)aView
atRow: (int)row
column: (int)column
withXMargins: (float)xMargins
yMargins: (float)yMargins;
Availability: OpenStep
Put aView in the GSTable, using
xMargins as the left and right margins,
and yMargins as the top and bottom margins.
- (void)
setBorder: (float)aBorder;
Availability: OpenStep
Set the GSTable up, bottom, left and right borders to
the same value aBorder. The GSTable is
immediately updated. If aBorder is
negative, the border is reset to the default,
which is zero (0). The border is simply unfilled
space; it is measured in the GSTable coordinate
system.
- (void)
setMaxXBorder: (float)aBorder;
Availability: OpenStep
Same as setXBorder: but set only the right border.
- (void)
setMaxYBorder: (float)aBorder;
Availability: OpenStep
Same as setXBorder: but set only the upper border
(lower if the GSTable is flipped).
- (void)
setMinXBorder: (float)aBorder;
Availability: OpenStep
Same as setXBorder: but set only the left border.
- (void)
setMinYBorder: (float)aBorder;
Availability: OpenStep
Same as setXBorder: but set only the lower border
(upper if the GSTable is flipped).
- (void)
setXBorder: (float)aBorder;
Availability: OpenStep
Set the GSTable left and right borders to
aBorder. If aBorder is
negative, the border is reset to zero. The
GSTable is immediately updated.
- (void)
setXResizingEnabled: (BOOL)aFlag
forColumn: (int)aColumn;
Availability: OpenStep
Enable/disable X Resizing for the column
aColumn} according to aFlag.
Note: at present, enabling/disabling X resizing after
the table has been put in the view hierarchy is not
supported.
- (void)
setYBorder: (float)aBorder;
Availability: OpenStep
Same as setXBorder: but set the up and bottom borders.
- (void)
setYResizingEnabled: (BOOL)aFlag
forRow: (int)aRow;
Availability: OpenStep
Enable/disable Y Resizing for the row
aRow according to aFlag. Note:
at present, enabling/disabling Y resizing after the
table has been put in the view hierarchy is not
supported.
- (void)
sizeToFit;
Availability: OpenStep
If for any reason you need the GSTable to be redrawn
(with minimum size), invoke the following.
Instance Variables for GSTable Class
@protected float* _columnDimension;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float* _columnXOrigin;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected BOOL* _expandColumn;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected BOOL* _expandRow;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected int _expandingColumnNumber;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected int _expandingRowNumber;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected BOOL* _havePrisoner;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected NSView** _jails;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float _maxXBorder;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float _maxYBorder;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float* _minColumnDimension;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float* _minRowDimension;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float _minXBorder;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float _minYBorder;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected NSSize _minimumSize;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected int _numberOfColumns;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected int _numberOfRows;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float* _rowDimension;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
@protected float* _rowYOrigin;
Availability: OpenStep
Warning the underscore at the start of the
name of this instance variable indicates that, even
though it is not technically private, it is
intended for internal use within the package, and
you should not use the variable in other code.
Up