home *** CD-ROM | disk | FTP | other *** search
- # Copyright (c) 1990-1994 The Regents of the University of California.
- # Copyright (c) 1994-1996 Sun Microsystems, Inc.
- # See the file "license.terms" for information on usage and redistribution
- # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- #
- #
-
- =head1 NAME
-
- Tk::pack - Geometry manager that packs around edges of cavity
-
- =for category Tk Geometry Management
-
- =head1 SYNOPSIS
-
- S< >I<$widget>-E<gt>B<pack>?(I<args>)?
-
- S< >I<$widget>-E<gt>B<pack>I<Option>?(I<args>)?
-
- =head1 DESCRIPTION
-
- The B<pack> method is used to communicate with the packer,
- a geometry manager that arranges the children of a parent by
- packing them in order around the edges of the parent.
-
- In this B<perl> port of Tk it is normal to pack widgets one-at-a-time
- using the widget object to be packed to invoke a method call.
- This is a slight distortion of underlying Tk interface (which
- can handle lists of windows to one pack method call) but has proven
- effective in practice.
-
- The B<pack> method can have any of several forms, depending
- on I<Option>:
-
- =over 4
-
- =item I<$slave>-E<gt>B<pack>?(I<options>)?
-
- The options consist of pairs of arguments that specify how
- to manage the slave.
- See L<"THE PACKER ALGORITHM"> below for details on how the options
- are used by the packer.
- The following options are supported:
-
- =over 8
-
- =item B<-after> =E<gt> I<$other>
-
- I<$other> must be another window.
- Use its master as the master for the slave, and insert
- the slave just after I<$other> in the packing order.
-
- =item B<-anchor> =E<gt> I<anchor>
-
- I<Anchor> must be a valid anchor position such as B<n>
- or B<sw>; it specifies where to position each slave in its
- parcel.
- Defaults to B<center>.
-
- =item B<-before> =E<gt> I<$other>
-
- I<$other> must be another window.
- Use its master as the master for the slave, and insert
- the slave just before I<$other> in the packing order.
-
- =item B<-expand> =E<gt> I<boolean>
-
- Specifies whether the slave should be expanded to consume
- extra space in their master.
- I<Boolean> may have any proper boolean value, such as B<1>
- or B<no>.
- Defaults to 0.
-
- =item B<-fill> =E<gt> I<style>
-
- If a slave's parcel is larger than its requested dimensions, this
- option may be used to stretch the slave.
- I<Style> must have one of the following values:
-
- =over 12
-
- =item B<none>
-
- Give the slave its requested dimensions plus any internal padding
- requested with B<-ipadx> or B<-ipady>. This is the default.
-
- =item B<x>
-
- Stretch the slave horizontally to fill the entire width of its
- parcel (except leave external padding as specified by B<-padx>).
-
- =item B<y>
-
- Stretch the slave vertically to fill the entire height of its
- parcel (except leave external padding as specified by B<-pady>).
-
- =item B<both>
-
- Stretch the slave both horizontally and vertically.
-
- =back
-
- =item B<-in> =E<gt> I<$master>
-
- Insert the slave(s) at the end of the packing order for the master
- window given by I<$master>.
-
- =item B<-ipadx> =E<gt> I<amount>
-
- I<Amount> specifies how much horizontal internal padding to
- leave on each side of the slave(s).
- I<Amount> must be a valid screen distance, such as B<2> or B<.5c>.
- It defaults to 0.
-
- =item B<-ipady> =E<gt> I<amount>
-
- I<Amount> specifies how much vertical internal padding to
- leave on each side of the slave(s).
- I<Amount> defaults to 0.
-
- =item B<-padx> =E<gt> I<amount>
-
- I<Amount> specifies how much horizontal external padding to
- leave on each side of the slave(s).
- I<Amount> defaults to 0.
-
- =item B<-pady> =E<gt> I<amount>
-
- I<Amount> specifies how much vertical external padding to
- leave on each side of the slave(s).
- I<Amount> defaults to 0.
-
- =item B<-side> =E<gt> I<side>
-
- Specifies which side of the master the slave(s) will be packed against.
- Must be B<left>, B<right>, B<top>, or B<bottom>.
- Defaults to B<top>.
-
- =back
-
- =back
-
- If no B<-in>, B<-after> or B<-before> option is specified
- then slave will be inserted at the end of the packing list
- for its parent unless it is already managed by the packer (in which
- case it will be left where it is).
- If one of these options is specified then slave will be
- inserted at the specified point.
- If the slave are already managed by the geometry manager
- then any unspecified options for them retain their previous values rather
- than receiving default values.
-
- =over 4
-
- =item I<$slave>-E<gt>B<packConfigure>?(I<options>)?
-
- Same as B<pack>.
-
- =item I<$slave>-E<gt>B<packForget>
-
- Removes I<slave> from the packing order for its
- master and unmaps its window.
- The slave will no longer be managed by the packer.
-
- =item I<$slave>-E<gt>B<packInfo>
-
- Returns a list whose elements are the current configuration state of
- the slave given by I<$slave> in the same option-value form that
- might be specified to B<packConfigure>.
- The first two elements of the list are ``B<-in>=E<gt>I<$master>'' where
- I<$master> is the slave's master.
-
- =item I<$master>-E<gt>B<packPropagate>?(I<boolean>)?
-
- If I<boolean> has a true boolean value such as B<1> or B<on>
- then propagation is enabled for I<$master>,
- (see L<"GEOMETRY PROPAGATION"> below).
- If I<boolean> has a false boolean value then propagation is
- disabled for I<$master>.
- In either of these cases an empty string is returned.
- If I<boolean> is omitted then the method returns B<0> or
- B<1> to indicate whether propagation is currently enabled
- for I<$master>.
- Propagation is enabled by default.
-
- =item I<$master>-E<gt>B<packSlaves>
-
- Returns a list of all of the slaves in the packing order for I<$master>.
- The order of the slaves in the list is the same as their order in
- the packing order.
- If I<$master> has no slaves then an empty list/string is returned in
- array/scalar context, respectively
-
- =back
-
- =head1 THE PACKER ALGORITHM
-
- For each master the packer maintains an ordered list of slaves
- called the I<packing list>.
- The B<-in>, B<-after>, and B<-before> configuration
- options are used to specify the master for each slave and the slave's
- position in the packing list.
- If none of these options is given for a slave then the slave
- is added to the end of the packing list for its parent.
-
- The packer arranges the slaves for a master by scanning the
- packing list in order.
- At the time it processes each slave, a rectangular area within
- the master is still unallocated.
- This area is called the I<cavity>; for the first slave it
- is the entire area of the master.
-
- For each slave the packer carries out the following steps:
-
- =over 4
-
- =item [1]
-
- The packer allocates a rectangular I<parcel> for the slave
- along the side of the cavity given by the slave's B<-side> option.
- If the side is top or bottom then the width of the parcel is
- the width of the cavity and its height is the requested height
- of the slave plus the B<-ipady> and B<-pady> options.
- For the left or right side the height of the parcel is
- the height of the cavity and the width is the requested width
- of the slave plus the B<-ipadx> and B<-padx> options.
- The parcel may be enlarged further because of the B<-expand>
- option (see L<"EXPANSION"> below)
-
- =item [2]
-
- The packer chooses the dimensions of the slave.
- The width will normally be the slave's requested width plus
- twice its B<-ipadx> option and the height will normally be
- the slave's requested height plus twice its B<-ipady>
- option.
- However, if the B<-fill> option is B<x> or B<both>
- then the width of the slave is expanded to fill the width of the parcel,
- minus twice the B<-padx> option.
- If the B<-fill> option is B<y> or B<both>
- then the height of the slave is expanded to fill the width of the parcel,
- minus twice the B<-pady> option.
-
- =item [3]
-
- The packer positions the slave over its parcel.
- If the slave is smaller than the parcel then the B<-anchor>
- option determines where in the parcel the slave will be placed.
- If B<-padx> or B<-pady> is non-zero, then the given
- amount of external padding will always be left between the
- slave and the edges of the parcel.
-
- Once a given slave has been packed, the area of its parcel
- is subtracted from the cavity, leaving a smaller rectangular
- cavity for the next slave.
- If a slave doesn't use all of its parcel, the unused space
- in the parcel will not be used by subsequent slaves.
- If the cavity should become too small to meet the needs of
- a slave then the slave will be given whatever space is
- left in the cavity.
- If the cavity shrinks to zero size, then all remaining slaves
- on the packing list will be unmapped from the screen until
- the master window becomes large enough to hold them again.
-
- =back
-
- =head1 EXPANSION
-
- If a master window is so large that there will be extra space
- left over after all of its slaves have been packed, then the
- extra space is distributed uniformly among all of the slaves
- for which the B<-expand> option is set.
- Extra horizontal space is distributed among the expandable
- slaves whose B<-side> is B<left> or B<right>,
- and extra vertical space is distributed among the expandable
- slaves whose B<-side> is B<top> or B<bottom>.
-
- =head1 GEOMETRY PROPAGATION
-
- The packer normally computes how large a master must be to
- just exactly meet the needs of its slaves, and it sets the
- requested width and height of the master to these dimensions.
- This causes geometry information to propagate up through a
- window hierarchy to a top-level window so that the entire
- sub-tree sizes itself to fit the needs of the leaf windows.
- However, the B<packPropagate> method may be used to
- turn off propagation for one or more masters.
- If propagation is disabled then the packer will not set
- the requested width and height of the packer.
- This may be useful if, for example, you wish for a master
- window to have a fixed size that you specify.
-
- =head1 RESTRICTIONS ON MASTER WINDOWS
-
- The master for each slave must either be the slave's parent
- (the default) or a descendant of the slave's parent.
- This restriction is necessary to guarantee that the
- slave can be placed over any part of its master that is
- visible without danger of the slave being clipped by its parent.
-
- =head1 PACKING ORDER
-
- If the master for a slave is not its parent then you must make sure
- that the slave is higher in the stacking order than the master.
- Otherwise the master will obscure the slave and it will appear as
- if the slave hasn't been packed correctly.
- The easiest way to make sure the slave is higher than the master is
- to create the master window first: the most recently created window
- will be highest in the stacking order.
- Or, you can use the B<raise> and B<lower> methods to change
- the stacking order of either the master or the slave.
-
- =head1 SEE ALSO
-
- L<Tk::form|Tk::form>
- L<Tk::grid|Tk::grid>
- L<Tk::place|Tk::place>
-
- =head1 KEYWORDS
-
- geometry manager, location, packer, parcel, propagation, size
-
- =cut
-
-