home *** CD-ROM | disk | FTP | other *** search
-
- <HTML>
- <HEAD>
- <TITLE>Tk::Adjuster - Allow size of packed widgets to be adjusted by user</TITLE>
- <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
- <LINK REV="made" HREF="mailto:">
- </HEAD>
-
- <BODY>
- <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
- <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
- <STRONG><P CLASS=block> Tk::Adjuster - Allow size of packed widgets to be adjusted by user</P></STRONG>
- </TD></TR>
- </TABLE>
-
- <A NAME="__index__"></A>
- <!-- INDEX BEGIN -->
-
- <UL>
-
- <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
-
- <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
- <LI><A HREF="#widgetspecific options">WIDGET-SPECIFIC OPTIONS</A></LI>
- <LI><A HREF="#description">DESCRIPTION</A></LI>
- <LI><A HREF="#widget methods">WIDGET METHODS</A></LI>
- <LI><A HREF="#examples">EXAMPLES</A></LI>
- <LI><A HREF="#bugs">BUGS</A></LI>
- </UL>
- <!-- INDEX END -->
-
- <HR>
- <P>
- <H1><A NAME="name">NAME</A></H1>
- <P>Tk::Adjuster - Allow size of packed widgets to be adjusted by user</P>
- <P>
- <HR>
- <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
- <UL>
- <LI>Linux</LI>
- <LI>Solaris</LI>
- <LI>Windows</LI>
- </UL>
- <HR>
- <H1><A NAME="synopsis">SYNOPSIS</A></H1>
- <P>use Tk::Adjuster;</P>
- <P><EM>$adjuster</EM> = <EM>$widget</EM>-><STRONG>Adjuster</STRONG><EM>(?options?)</EM>;</P>
- <P>
- <HR>
- <H1><A NAME="widgetspecific options">WIDGET-SPECIFIC OPTIONS</A></H1>
- <DL>
- <DT><STRONG><A NAME="item_Name%3A_restore">Name: <STRONG>restore</STRONG></A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_Class%3A_Restore">Class: <STRONG>Restore</STRONG></A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_Switch%3A_%2Drestore">Switch: <STRONG>-restore</STRONG></A></STRONG><BR>
- <DD>
- Specifies a boolean value that determines whether the Adjuster
- should forcibly attempt to make room
- for itself (by reducing the size of its managed widget) when it is
- unmapped (for example, due to a size change in a top level window).
- The default value is 1.
- <P></P>
- <DT><STRONG><A NAME="item_Name%3A_side">Name: <STRONG>side</STRONG></A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_Class%3A_Side">Class: <STRONG>Side</STRONG></A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_Switch%3A_%2Dside">Switch: <STRONG>-side</STRONG></A></STRONG><BR>
- <DD>
- Specifies the side on which the managed widget lies relative to the
- Adjuster. In conjunction with the pack geometry manager, this relates to
- the side of the master against which the managed widget and the Adjuster
- are packed.
- Must be <STRONG>left</STRONG>, <STRONG>right</STRONG>, <STRONG>top</STRONG>, or <STRONG>bottom</STRONG>. Defaults to <STRONG>top</STRONG>.
- <P></P>
- <DT><STRONG><A NAME="item_Name%3A_widget">Name: <STRONG>widget</STRONG></A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_Class%3A_Widget">Class: <STRONG>Widget</STRONG></A></STRONG><BR>
- <DD>
- <DT><STRONG><A NAME="item_Switch%3A_%2Dwidget">Switch: <STRONG>-widget</STRONG></A></STRONG><BR>
- <DD>
- Specifies the widget which is to be managed by the Adjuster.
- <P></P></DL>
- <P>
- <HR>
- <H1><A NAME="description">DESCRIPTION</A></H1>
- <P><STRONG>Tk::Adjuster</STRONG> is a Frame containing a ``line'' and a ``blob''.</P>
- <P>Dragging with Mouse Button-1 results in a line being dragged
- to indicate new size. Releasing Button-1 submits GeometryRequests
- on behalf of the managed widget which will cause the packer to change the
- widget's size.</P>
- <P>If Drag is done with Shift button down, then GeometryRequests are made
- in ``real time'' so that text-flow effects can be seen, but as a lot more
- work is done behaviour may be sluggish.</P>
- <P>If widget is packed with -side => left or -side => right then width is
- adjusted. If packed -side => top or -side => bottom then height is adjusted.</P>
- <P><STRONG>packPropagate</STRONG> is turned off for the master window to prevent adjustment
- changing overall window size. Similarly <STRONG>packPropagate</STRONG> is turned off
- for the managed widget if it has things packed inside it. This is so that
- the GeometryRequests made by <STRONG>Tk::Adjuster</STRONG> are not overridden by pack.</P>
- <P>In addition, the managed widget is made non-expandable
- to prevent the geometry manager reallocating freed space in the master
- back to the managed widget.
- Note however that expansion is turned off only after the Adjuster is mapped,
- which allows the managed widget to expand naturally on window creation.</P>
- <P>The Tk::Widget method, <STRONG>packAdjust</STRONG>, calls pack on the widget, then
- creates an instance of <STRONG>Tk::Adjuster</STRONG>,
- and packs that ``after'' the widget. Its use has two disadvantages however: the
- Adjuster widget is not made available to the caller, and
- options cannot be set on the Adjuster. For these reasons, the Tk::Adjuster
- method, <STRONG>packAfter</STRONG> is preferred, but <STRONG>packAdjust</STRONG> is retained
- for backwards compatibility.</P>
- <P>
- <HR>
- <H1><A NAME="widget methods">WIDGET METHODS</A></H1>
- <DL>
- <DT><STRONG><A NAME="item_packAfter"><EM>$adjuster</EM>-><STRONG>packAfter</STRONG>(<EM>managed_widget, ?pack_options?</EM>)</A></STRONG><BR>
- <DD>
- This command configures the Adjuster's <STRONG>-widget</STRONG> and <STRONG>-side</STRONG> options
- respectively to <EM>managed_widget</EM> and the <STRONG>-side</STRONG> value specified in
- <EM>pack_options</EM> (<STRONG>top</STRONG> if not specified). It then packs the Adjuster
- after <EM>managed_widget</EM>, with <STRONG>-fill</STRONG> set to <STRONG>x</STRONG> or <STRONG>y</STRONG> as appropriate.
- <P></P>
- <DT><STRONG><A NAME="item_packForget"><EM>$adjuster</EM>-><STRONG>packForget</STRONG><EM>?(boolean)?</EM></A></STRONG><BR>
- <DD>
- This command calls <STRONG>Tk::Widget::packForget</STRONG> on the Adjuster.
- If a parameter is provided and it has a true boolean value, then
- <STRONG>packForget</STRONG> is also called on the managed widget.
- <P></P>
- <DT><STRONG><A NAME="item_slave"><EM>$adjuster</EM>-><STRONG>slave</STRONG></A></STRONG><BR>
- <DD>
- This command returns the value <EM>$adjuster</EM>-><EM>cget('-widget')</EM>, ie. the
- reference to the managed widget.
- <P></P></DL>
- <P>
- <HR>
- <H1><A NAME="examples">EXAMPLES</A></H1>
- <P><STRONG>Using an Adjuster to separate two widgets, whereby the left widget
- is managed, and right widget expands to fill space on a window resize</STRONG></P>
- <P>a) Using packAfter (preferred interface)</P>
- <PRE>
- use Tk;
- use Tk::Adjuster;</PRE>
- <PRE>
- my $f = MainWindow->new;
- my $lst1 = $f->Listbox();
- my $adj1 = $f->Adjuster();
- my $lst2 = $f->Listbox();</PRE>
- <PRE>
- my $side = 'left';
- $lst1->pack(-side => $side, -fill => 'both', -expand => 1);
- $adj1->packAfter($lst1, -side => $side);
- $lst2->pack(-side => $side, -fill => 'both', -expand => 1);
- MainLoop;</PRE>
- <P>b) Using packAdjust</P>
- <PRE>
- use Tk;
- use Tk::Adjuster;</PRE>
- <PRE>
- my $f = MainWindow->new;
- my $lst1 = $f->Listbox();
- my $lst2 = $f->Listbox();</PRE>
- <PRE>
- my $side = 'left';
- $lst1->packAdjust(-side => $side, -fill => 'both');
- $lst2->pack (-side => $side, -fill => 'both', -expand => 1);
- MainLoop;</PRE>
- <P>c) Using the standard Tk::Widget::pack</P>
- <PRE>
- use Tk;
- use Tk::Adjuster;</PRE>
- <PRE>
- my $f = MainWindow->new;
- my $side = 'left';
- my $lst1 = $f->Listbox();
- my $adj = $f->Adjuster(-widget => $lst1, -side => $side);
- my $lst2 = $f->Listbox();</PRE>
- <PRE>
- $lst1->pack(-side => $side, -fill => 'both', -expand => 1);
- $adj->pack (-side => $side, -fill => 'y');
- $lst2->pack(-side => $side, -fill => 'both', -expand => 1);</PRE>
- <PRE>
- MainLoop;</PRE>
- <P>Changing the above examples so that $side has the value 'right' means the
- left widget expands to fill space on a window resize.</P>
- <P>Changing the above examples so that $side has the value 'top'
- produces a testcase with a horizontal Adjuster.
- Here the bottom widget expands to fill space on a window resize.
- Packing to the 'bottom' makes the top widget expand to fill space on window
- resize.</P>
- <P><STRONG>Using -restore => 0 for multiple columns</STRONG></P>
- <P>In the case of multiple columns (or rows) the ``restore'' functionality of the
- Adjuster can be inconvenient. When the user adjusts the width of one column
- and thereby pushes the Adjuster of another column off the window, this
- adjuster tries to restore itself by reducing the size of its managed widget.
- This has the effect that column widths shrink; and the original size
- is not restored when
- the user reverses the originating change. The <STRONG>-restore</STRONG> option can be
- used to turn off this functionality. (It makes some sense, however, to
- leave <STRONG>-restore</STRONG>
- turned on for the first-packed Adjuster, so that at least one Adjuster
- always remains visible.)</P>
- <PRE>
- use Tk;
- use Tk::Adjuster;
- my $f = MainWindow->new;
- my $lst1 = $f->Listbox();
- my $adj1 = $f->Adjuster();
- my $lst2 = $f->Listbox();
- my $adj2 = $f->Adjuster(-restore => 0);
- my $lst3 = $f->Listbox();</PRE>
- <PRE>
- my $side = 'left';
- $lst1->pack(-side => $side, -fill => 'both', -expand => 1);
- $adj1->packAfter($lst1, -side => $side);
- $lst2->pack(-side => $side, -fill => 'both', -expand => 1);
- $adj2->packAfter($lst2, -side => $side);
- $lst3->pack(-side => $side, -fill => 'both', -expand => 1);</PRE>
- <PRE>
- MainLoop;</PRE>
- <P>
- <HR>
- <H1><A NAME="bugs">BUGS</A></H1>
- <P>It is currently not possible to configure the appearance of the Adjuster.
- It would be nice to be able to set the width and relief of the Adjuster ``line''
- and the presence/absence of the ``blob'' on the Adjuster.</P>
- <P>Tk::Adjuster works theoretically with the grid geometry manager but there
- are currently some problems which seem to be due to bugs in grid:</P>
- <PRE>
- a) There's never an Unmap event for the adjuster, so the "restore"
- functionality has no effect.
- b) After adjusting, widgets protrude into the border of the master.
- c) grid('Propagate', 0) on MainWindow has no effect - window shrinks/grows
- when widgets are adjusted.
- d) Widgets shuffle to correct position on startup</PRE>
- <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
- <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
- <STRONG><P CLASS=block> Tk::Adjuster - Allow size of packed widgets to be adjusted by user</P></STRONG>
- </TD></TR>
- </TABLE>
-
- </BODY>
-
- </HTML>
-