pack.sa
Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
---------------------------> Sather 1.1 source file <--------------------------
-- pack.sa: Configuration - packing
-- Author: Benedict A. Gomes <gomes@samosa.ICSI.Berkeley.EDU>
-- Copyright (C) 1995, International Computer Science Institute
-- pack.sa,v 1.1 1995/11/15 03:36:47 gomes Exp
--
-- COPYRIGHT NOTICE: This code is provided WITHOUT ANY WARRANTY
-- and is subject to the terms of the SATHER LIBRARY GENERAL PUBLIC
-- LICENSE contained in the file: Sather/Doc/License of the
-- Sather distribution. The license is also available from ICSI,
-- 1947 Center St., Suite 600, Berkeley CA 94704, USA.
class TK_PACK
class TK_PACK is
include TK_ARG_UTIL;
-- Configuring
-- Look at GUI_UTIL for the meaningful incarnations of the packer
--
-- I *VERY STRONGLY* recommend that you take the time to read
-- the packing algorithm described below or from the Tk manual.
-- It is quite easy to understand, and you will be paid back many
-- times over in improved understanding of what's going on.
--
-- In summary: each widget has a "strong" and a "weak" dimension,
-- determined by the side it is attached to.
-- If it is attached to the left or right, its strong dim is vertical
-- If it is attached to the top or bottom, its strong dim is horizontal
-- A widget will grow in its strong dimension
-- if fill is true for the strong dimension.
-- A widget will grow in its weak dimension
-- if fill is true for the weak dimension.
-- *and* expand is true
-- The Tk packing algorithm:(from the packer man page)
--
-- The packing algorithm consists of two phases (STRONG) and (WEAK)
-- (STRONG) allocates all available space in the "strong" dimension
-- (WEAK) allocates extra left-over space in the "weak" dimension.
--
-- Terms
-- Requested size: Refers to the width or height requested by the
-- widget through the "height" and "width" configuration options
-- Parcel: Some preliminary space allocation, into which
-- the widget will actually be placed.
-- Fill (x or y): Indicates whether the widget can grow within the
-- parcel in that dimension
-- Expand: Indicates whether the *parcel* itself can grow when space
-- is available in the weak dimension.
-- Expand may more appropriately be called expand_weak
-- (STRONG)
-- --------
-- (1)Allocate parcel: First allocate a parcel along the reqested side
-- The initial parcel occupies all of the space in the strong
-- dimension + the requested size in the weak dimension.
-- (2)Allocate space in parcel:
-- First give the widget its requested width and height
-- (as specified by the width and height options)
-- *within the already allocated parcel*
-- (3)Fill out the parcel:
-- If fill is true in the strong dimension, grow the widget to
-- to take up the remaining space - in this phase the parcel will
-- get no extra space in the weak dimension.
-- (4)Place the actual slave:
-- If the widget is smaller than its parcel, use "anchor"
-- to determine the location within
-- IMPORTANT:
-- Subsequent widgets do NOT MAKE use the left-over space in a parcel
-- until the (WEAK) phase
-- (WEAK)
-- -----
-- If there is space not used by widgets in (STRONG).
-- (1) Distribute the remaining space evenly among widgets in their
-- weak dimension, _if_they_have_expand_set_to_true_.
-- (2) Fill out the new parcels:
-- If fill is true in the weak dimension, then grow the widget
--
-- BEWARE!!
-- Expand just allocates *parcels*. If fill is not set for the weak
-- dimension, the space will be left empty!
--
private const t: BOOL := true;
private const f: BOOL := false;
----------------- PREDEFINED PACKING VERSIONS ---------------------
-- I believe these are all the meaningful combinations
-- of (4) sides x (4) fill styles x (2) expand or not
-- Don't grow. Stick with requested width and height, if available.
left: TK_PACK is res::=#TK_PACK; return res.left_side end;
right: TK_PACK is res::=#TK_PACK; return res.right_side end;
top: TK_PACK is res::=#TK_PACK; return res.top_side end;
bot: TK_PACK is res::=#TK_PACK; return res.bot_side end;
-- Grow strongly in one dimension, by attaching to an appropriate side
left_grow_vert: TK_PACK is return left.fill(f,t) end;
right_grow_vert:TK_PACK is return right.fill(f,t) end;
top_grow_horiz: TK_PACK is return top.fill(t,f) end;
bot_grow_horiz: TK_PACK is return bot.fill(t,f) end;
-- Grow (weakly) in the non-standard dimension, using leftover expand space
left_n_grow_horiz:TK_PACK is return left.fill(t,f).expand(t) end;
right_n_grow_horiz:TK_PACK is return right.fill(t,f).expand(t) end;
top_n_grow_vert: TK_PACK is return top.fill(f,t).expand(t) end;
bot_n_grow_vert: TK_PACK is return bot.fill(f,t).expand(t) end;
-- Grow strongly in one dimension and weakly in the other dimension
-- using "expand" space
left_grow_vert_n_horiz:TK_PACK is return left.fill(t,t).expand(t) end;
right_grow_vert_n_horiz:TK_PACK is return right.fill(t,t).expand(t) end;
top_grow_horiz_n_vert: TK_PACK is return top.fill(t,t).expand(t) end;
bot_grow_horiz_n_vert: TK_PACK is return bot.fill(t,t).expand(t) end;
none: TK_PACK is return #TK_PACK end;
create: SAME is res ::= new; return res end;
str: STR is
return ""
+pair("side",side)
+pair("fill",fill)
+pair("expand",exp_str)
+pair("ipadx",ipadx)
+pair("ipady",ipady)
+pair("padx",padx)
+pair("pady",pady)
+pair("anchor",anchor);
end;
private attr fill,exp_str,ipadx,ipady,padx,pady: STR;
private attr side: STR;
-- The ability to set individual parameters in a package
attr anchor: TK_ANCHOR;
anchor(a: TK_ANCHOR): SAME is anchor := a; return self; end;
internal_padding(x,y: FLT) is ipadx := x.str; ipady := y.str; end;
external_padding(x,y: FLT) is padx := x.str; pady := y.str; end;
internal_padding(x,y: FLT): SAME
is internal_padding(x,y); return self; end;
external_padding(x,y: FLT): SAME
is external_padding(x,y); return self; end;
private right_side: SAME is side := "right"; return self; end;
private left_side: SAME is side := "left"; return self; end;
private top_side: SAME is side := "top"; return self; end;
private bot_side: SAME is side := "bottom"; return self; end;
private expand(v: BOOL): SAME is
if v then exp_str:="true" else exp_str:="false" end;
return self;
end;
private fill(x,y: BOOL): SAME is
if x and y then fill := "both"
elsif x then fill := "x"
elsif y then fill := "y"
else fill := "none" end;
return self;
end;
end; -- class TK_PACK