aboutsummaryrefslogtreecommitdiff
path: root/vendor/x11iraf/obm/ObmW/RowCol.man
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/x11iraf/obm/ObmW/RowCol.man')
-rw-r--r--vendor/x11iraf/obm/ObmW/RowCol.man482
1 files changed, 482 insertions, 0 deletions
diff --git a/vendor/x11iraf/obm/ObmW/RowCol.man b/vendor/x11iraf/obm/ObmW/RowCol.man
new file mode 100644
index 00000000..1d719b38
--- /dev/null
+++ b/vendor/x11iraf/obm/ObmW/RowCol.man
@@ -0,0 +1,482 @@
+.\"remove .ig hn for full docs
+.de hi
+.ig eh
+..
+.de eh
+..
+.TH "" 3 "" "Version 3.0" "Free Widget Foundation"
+.SH NAME
+XfwfRowCol
+.SH DESCRIPTION
+The RowCol widget forces all its children into rows and columns. The
+children keep their preferred size, but the preferred position is
+ignored. Resources determine how many rows or columns their should be
+(or as many as will fit) and if the children should be layed out in
+rows or in columns. In both methods, the children are placed on a
+grid, the size of which is determined by the width (height) of the
+widest (tallest) child.
+
+The children can be aligned in several ways: they can be placed in the
+center of their grid cell or against the edges. This is controlled by
+a resource of type \fIAlignment\fP.
+
+.SS "Public variables"
+
+.ps-2
+.TS
+center box;
+cBsss
+lB|lB|lB|lB
+l|l|l|l.
+XfwfRowCol
+Name Class Type Default
+XtNstoreByRow XtCStoreByRow Boolean True
+XtNrows XtCRows Int 0
+XtNcolumns XtCColumns Int 0
+XtNalignment XtCAlignment Alignment XfwfTopLeft
+XtNshrinkToFit XtCShrinkToFit Boolean False
+
+.TE
+.ps
+
+.TP
+.I "XtNstoreByRow"
+The child widgets can be layed out in rows (left to right) or in
+columns (top to bottom). The resource \fIstoreByRow\fP can be \fITrue\fP or
+\fIFalse\fP. \fITrue\fP means children are added to the right of the previous
+one until the row is full, like words are added to a text. \fIFalse\fP
+means children are added below the previous one, until the column is
+full.
+
+.hi
+
+.nf
+Boolean storeByRow = True
+.fi
+
+.eh
+
+.TP
+.I "XtNrows"
+The number of rows can be set with \fIrows\fP, or the number of columns
+can be set with \fIcolumns\fP. If both are non-zero, \fIrows\fP will be
+ignored. If \fIrows\fP is zero, there will be as many rows as needed. If
+\fIcolumns\fP is zero, there will be as many columns as needed. However,
+if both are zero, there will be as many columns as will fit in the
+current width of the RowCol widget. By default, both \fIrows\fP and
+\fIcolumns\fP are zero.
+
+.hi
+
+.nf
+int rows = 0
+.fi
+
+.eh
+
+.TP
+.I "XtNcolumns"
+
+.hi
+
+.nf
+int columns = 0
+.fi
+
+.eh
+
+.TP
+.I "XtNalignment"
+The area of the RowCol widget is partitioned into rectangular cells
+(a grid). The cells are just large enough to contain the widest and
+the tallest of the children. Within the cell, the children can be put
+in the top left corner (the default) or against one of the edges or in
+the center. This is set with the \fIalignment\fP resource. The type
+\fIAlignment\fP is defined in the ancestor class `Common'.
+
+.hi
+
+.nf
+Alignment alignment = XfwfTopLeft
+.fi
+
+.eh
+
+.TP
+.I "XtNshrinkToFit"
+The resource \fIshrinkToFit\fP determines how the size of the RowCol
+widget itself is computed. When it is \fIFalse\fP (default), the
+\fIlocation\fP resource is used to compute the widget's preferred size.
+When the value is \fITrue\fP, the preferred size is computed fromthe total
+width and height of the children. For example, when the widest child
+has a width of \fIw\fP and \fIcolumns > 0\fP, the preferred width will be
+\fIcolumns * w +\fP frame width. A similar computation is used for the
+height. If \fIcolumns > 0\fP, only the height is computed this way. If
+\fIcolumns = 0, rows > 0\fP, only the width is computed.
+
+.hi
+
+.nf
+Boolean shrinkToFit = False
+.fi
+
+.eh
+
+.TP
+.I "XtNframeType"
+The inherited resource \fIframeType\fP is given a default value of
+\fIXfwfSunken\fP, instead of the inherited default \fIXfwfRaised\fP. The frame
+width is set to a default of 2 pixels, instead of 0.
+
+.hi
+
+.nf
+ frameType = XfwfSunken
+.fi
+
+.eh
+
+.TP
+.I "XtNframeWidth"
+
+.hi
+
+.nf
+ frameWidth = 2
+.fi
+
+.eh
+
+.ps-2
+.TS
+center box;
+cBsss
+lB|lB|lB|lB
+l|l|l|l.
+XfwfBoard
+Name Class Type Default
+XtNabs_x XtCAbs_x Position 0
+XtNrel_x XtCRel_x Float "0.0"
+XtNabs_y XtCAbs_y Position 0
+XtNrel_y XtCRel_y Float "0.0"
+XtNabs_width XtCAbs_width Position 0
+XtNrel_width XtCRel_width Float "1.0"
+XtNabs_height XtCAbs_height Position 0
+XtNrel_height XtCRel_height Float "1.0"
+XtNhunit XtCHunit Float "1.0"
+XtNvunit XtCVunit Float "1.0"
+XtNlocation XtCLocation String NULL
+
+.TE
+.ps
+
+.ps-2
+.TS
+center box;
+cBsss
+lB|lB|lB|lB
+l|l|l|l.
+XfwfFrame
+Name Class Type Default
+XtNcursor XtCCursor Cursor None
+XtNframeType XtCFrameType FrameType XfwfRaised
+XtNframeWidth XtCFrameWidth Dimension 0
+XtNouterOffset XtCOuterOffset Dimension 0
+XtNinnerOffset XtCInnerOffset Dimension 0
+XtNshadowScheme XtCShadowScheme ShadowScheme XfwfAuto
+XtNtopShadowColor XtCTopShadowColor Pixel compute_topcolor
+XtNbottomShadowColor XtCBottomShadowColor Pixel compute_bottomcolor
+XtNtopShadowStipple XtCTopShadowStipple Bitmap NULL
+XtNbottomShadowStipple XtCBottomShadowStipple Bitmap NULL
+
+.TE
+.ps
+
+.ps-2
+.TS
+center box;
+cBsss
+lB|lB|lB|lB
+l|l|l|l.
+XfwfCommon
+Name Class Type Default
+XtNtraversalOn XtCTraversalOn Boolean True
+XtNhighlightThickness XtCHighlightThickness Dimension 2
+XtNhighlightColor XtCHighlightColor Pixel XtDefaultForeground
+XtNhighlightPixmap XtCHighlightPixmap Pixmap None
+XtNnextTop XtCNextTop Callback NULL
+XtNuserData XtCUserData Pointer NULL
+
+.TE
+.ps
+
+.ps-2
+.TS
+center box;
+cBsss
+lB|lB|lB|lB
+l|l|l|l.
+Composite
+Name Class Type Default
+XtNchildren XtCChildren WidgetList NULL
+insertPosition XtCInsertPosition XTOrderProc NULL
+numChildren XtCNumChildren Cardinal 0
+
+.TE
+.ps
+
+.ps-2
+.TS
+center box;
+cBsss
+lB|lB|lB|lB
+l|l|l|l.
+Core
+Name Class Type Default
+XtNx XtCX Position 0
+XtNy XtCY Position 0
+XtNwidth XtCWidth Dimension 0
+XtNheight XtCHeight Dimension 0
+borderWidth XtCBorderWidth Dimension 0
+XtNcolormap XtCColormap Colormap NULL
+XtNdepth XtCDepth Int 0
+destroyCallback XtCDestroyCallback XTCallbackList NULL
+XtNsensitive XtCSensitive Boolean True
+XtNtm XtCTm XTTMRec NULL
+ancestorSensitive XtCAncestorSensitive Boolean False
+accelerators XtCAccelerators XTTranslations NULL
+borderColor XtCBorderColor Pixel 0
+borderPixmap XtCBorderPixmap Pixmap NULL
+background XtCBackground Pixel 0
+backgroundPixmap XtCBackgroundPixmap Pixmap NULL
+mappedWhenManaged XtCMappedWhenManaged Boolean True
+XtNscreen XtCScreen Screen * NULL
+
+.TE
+.ps
+
+.hi
+.SS "Private variables"
+
+The width of the widest and the height of the tallest child are kept
+in private variables, for quicker access.
+
+.nf
+Dimension max_width
+.fi
+
+.nf
+Dimension max_height
+.fi
+
+.hi
+
+.hi
+.SS "Methods"
+
+If a child becomes managed or unmanaged, the RowCol widget
+recomputes the positions of all managed children. That is done by a
+method \fIlayout\fP. In the process, the widget may ask its parent for a
+different size if \fIshrinkToFit = True\fP.
+
+.nf
+change_managed($)
+{
+ $layout($, $shrinkToFit);
+}
+.fi
+
+The \fIlayout\fP function is responsible for moving the children to their
+positions in the grid. It is called from \fIchange_managed\fP,
+\fIgeometry_manager\fP and \fIresize\fP.
+
+The function first computes the maximum width and height of all the
+children, including their borders. Then it computes the number of rows
+and columns. All children are moved to their proper positions with the
+help of a utility function \fIalign_child\fP, which aligns a child widget
+to the grid.
+
+If \fIshrink = True\fP, the RowCol widget also asks its parent for a new
+width and/or height, depending on the resulting layout.
+
+.nf
+layout($, int shrink)
+{
+ int nrows, ncols, i, nchild, n;
+ Position left, top, x, y;
+ Dimension width, height, w, h;
+ Widget child;
+
+ nchild = 0;
+ $max_width = 0;
+ $max_height = 0;
+ for (i = 0; i < $num_children; i++) {
+ child = $children[i];
+ if (! XtIsManaged(child)) continue;
+ nchild++;
+ $max_width = max($max_width, $child$width + 2*$child$border_width);
+ $max_height = max($max_height, $child$height + 2*$child$border_width);
+
+ }
+
+ $compute_inside($, left, top, width, height);
+
+ if ($columns != 0) {
+ ncols = $columns;
+ nrows = (nchild + ncols - 1)/ncols;
+ } else if ($rows != 0) {
+ nrows = $rows;
+ ncols = (nchild + nrows - 1)/nrows;
+ } else {
+ ncols = $max_width != 0 ? width/$max_width : 1;
+ if (ncols == 0) ncols = 1;
+ nrows = (nchild + ncols - 1)/ncols;
+ }
+
+ x = left;
+ y = top;
+ n = 0;
+ if ($storeByRow) {
+ for (i = 0; i < $num_children; i++) {
+ child = $children[i];
+ if (! XtIsManaged(child)) continue;
+ align_child(child, x, y, $max_width, $max_height, $alignment);
+ n++;
+ if (n == ncols) {
+ n = 0;
+ x = left;
+ y += $max_height;
+ } else
+ x += $max_width;
+ }
+ } else {
+ for (i = 0; i < $num_children; i++) {
+ child = $children[i];
+ if (! XtIsManaged(child)) continue;
+ align_child(child, x, y, $max_width, $max_height, $alignment);
+ n++;
+ if (n == nrows) {
+ n = 0;
+ y = top;
+ x += $max_width;
+ } else
+ y += $max_height;
+ }
+ }
+
+ if (shrink) {
+ w = 2*left + ncols * $max_width;
+ h = 2*top + nrows * $max_height;
+ if ($columns != 0)
+ XtVaSetValues($, XtNwidth, w, XtNheight, h, NULL);
+ else
+ XtVaSetValues($, XtNheight, h, NULL);
+ }
+}
+.fi
+
+When a child wants to change its size or border width, it calls its
+parent's \fIgeometry_manager\fP method (through a call to
+\fIXtMakeGeometryRequest\fP or \fIXtMakeResizeRequest\fP.) The RowCol widget
+always grants size changes to its children. The size change is carried
+out immediately and a new layout is computed. If a child requests a
+change of position, the request is denied. A request for a change in
+stacking order is ignored.
+
+.nf
+XtGeometryResult geometry_manager(Widget child, XtWidgetGeometry * request, XtWidgetGeometry * reply)
+{
+ Dimension newwd, newht, newbd;
+
+ if (request->request_mode (CWX | CWY)) return XtGeometryNo;
+ if (request->request_mode XtCWQueryOnly) return XtGeometryYes;
+
+ newwd = request->request_mode CWWidth ? request->width : $child$width;
+ newht = request->request_mode CWHeight ? request->height : $child$height;
+ newbd = request->request_mode CWBorderWidth
+ ? request->border_width : $child$border_width;
+
+ if (newwd == $child$width newht == $child$height
+ newbd == $child$border_width) return XtGeometryNo;
+
+ XtResizeWidget(child, newwd, newht, newbd);
+ $layout($, $shrinkToFit);
+ return XtGeometryDone;
+}
+.fi
+
+The \fIresize\fP method is called when the widget is resized. If the
+\fIrows\fP and \fIcolumns\fP resources are both zero, the children will have
+to be be re-aligned. In this case, there is no sense in asking the
+parent for a new size, so \fIlayout\fP is passed a value of \fIFalse\fP.
+
+.nf
+resize($)
+{
+ if ($rows == 0 $columns == 0) $layout($, False);
+}
+.fi
+
+The initialize method sets the private variables, in this case only
+\fImax_width\fP and \fImax_height\fP. There is no need to check if the resources
+have sensible values.
+
+.nf
+initialize(Widget request, $, ArgList args, Cardinal * num_args)
+{
+ $max_width = $max_height = 0;
+}
+.fi
+
+The RowCol widget needs to recompute the positions of the children
+when one of the resources changes. When the layout changes, the widget
+also needs to be redrawn, of course. The private variables are not
+dependent on the resources, so they don't need recomputing.
+
+.nf
+Boolean set_values(Widget old, Widget request, $, ArgList args, Cardinal * num_args)
+{
+ Boolean need_layout = False;
+ Boolean need_redisplay = False;
+
+ if ($old$storeByRow != $storeByRow) need_layout = True;
+ if ($old$rows != $rows) need_layout = True;
+ if ($old$columns != $columns) need_layout = True;
+ if ($old$alignment != $alignment) need_layout = True;
+ if ($old$shrinkToFit != $shrinkToFit) need_layout = True;
+ if (need_layout) {
+ $layout($, $shrinkToFit);
+ need_redisplay = True;
+ }
+ return need_redisplay;
+}
+.fi
+
+.hi
+
+.hi
+.SH "Utilities"
+
+.nf
+char rcsid[] = "$Header: RowCol.w,v 1.1 92/10/14 18:36:36 bert Exp $"
+.fi
+
+\fIalign_child\fP puts a widget in the proper position in the cell given by
+\fIcx\fP, \fIcy\fP, \fIwidth\fP and \fIheight\fP.
+
+.nf
+align_child($, int cx, int cy, int width, int height, Alignment alignment)
+{
+ Position x, y;
+
+ if (alignment XfwfLeft) x = cx;
+ else if (alignment XfwfRight) x = cx + width - $width;
+ else x = cx + (width - $width) / 2;
+ if (alignment XfwfTop) y = cy;
+ else if (alignment XfwfBottom) y = cy + height - $height;
+ else y = cy + (height - $height) / 2;
+ XtMoveWidget($, x, y);
+}
+.fi
+
+.hi