home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / GridLayout.pm < prev    next >
Text File  |  2004-01-12  |  6KB  |  269 lines

  1. package Win32::GUI::GridLayout;
  2.  
  3. $VERSION = "0.03";
  4.  
  5. sub new {
  6.     my($class, $c, $r, $w, $h, $xpad, $ypad) = @_;
  7.     my $r_grid = {
  8.         "cols"   => $c,
  9.         "rows"   => $r,
  10.         "width"  => $w,
  11.         "height" => $h,
  12.         "xPad"   => $xpad,
  13.         "yPad"   => $ypad,
  14.     };
  15.     bless $r_grid, $class;
  16.     return $r_grid;
  17. }
  18.  
  19. sub apply {
  20.     my($class, $to, $c, $r, $xpad, $ypad) = @_;
  21.     my $w = $to->ScaleWidth();
  22.     my $h = $to->ScaleHeight();
  23.     my $r_grid = {
  24.         "cols"   => $c,
  25.         "rows"   => $r,
  26.         "width"  => $w,
  27.         "height" => $h,
  28.         "xPad"   => $xpad,
  29.         "yPad"   => $ypad,
  30.         "source" => $to,
  31.     };
  32.     bless $r_grid, $class;
  33.     return $r_grid;
  34. }
  35.  
  36. sub add {
  37.     my($grid, $o, $c, $r, $align) = @_;    
  38.     my @content = @{$grid->{'content'}};
  39.     my($halign, $valign) = split(/(\s*|\s*,\s*)/, $align);
  40.     push(@content, [$o, $c, $r, $halign, $valign] );
  41.     $grid->{'content'} = [ @content ];
  42. }
  43.  
  44. sub recalc {
  45.     my($grid) = @_;    
  46.     $grid->{'width'}  = $grid->{'source'}->ScaleWidth();
  47.     $grid->{'height'} = $grid->{'source'}->ScaleHeight();
  48.     foreach $inside (@{$grid->{'content'}}) {       
  49.         $widgetWidth  = $inside->[0]->Width();
  50.         $widgetHeight = $inside->[0]->Height();
  51.         $inside->[0]->Move(
  52.             $grid->col($inside->[1], $inside->[3]),
  53.             $grid->row($inside->[2], $inside->[4]),
  54.         );
  55.     }
  56. }
  57.  
  58. sub draw {
  59.     my($grid) = @_;
  60.     return undef unless $grid->{'source'};
  61.     my $DC = $grid->{'source'}->GetDC();
  62.     my $colWidth = int($grid->{'width'} / $grid->{'cols'});
  63.     my $rowHeight = int($grid->{'height'} / $grid->{'rows'});
  64.     my $i;
  65.     for $i (0..$grid->{'cols'}) {
  66.         $DC->MoveTo($i*$colWidth, 0);
  67.         $DC->LineTo($i*$colWidth, $grid->{'height'});
  68.     }
  69.     for $i (0..$grid->{'rows'}) {
  70.         $DC->MoveTo(0, $i*$rowHeight);
  71.         $DC->LineTo($grid->{'width'}, $i*$rowHeight);
  72.     }
  73. }
  74.  
  75. sub column {
  76.     my ($grid_param, $col, $align) = @_;
  77.     $col--;
  78.     $colWidth = int($grid_param->{'width'} / $grid_param->{'cols'});
  79.     $x = ($col * $colWidth) + ($grid_param->{'xPad'});
  80.     $x = int((($colWidth - $widgetWidth) / 2) + $x) 
  81.         if $align =~ /^c/i;
  82.     $x = int((($colWidth - $widgetWidth) - $grid_param->{'xPad'}) + $x) 
  83.         if $align =~ /^r/i;
  84.     $widgetWidth=0; # in case a width declaration is missed or not used
  85.     return $x;
  86. }
  87. sub col { column @_; }
  88.  
  89. sub row {
  90.     my ($grid_param,$row, $align) = @_;
  91.     $row--;
  92.     $rowHeight = int($grid_param->{'height'} / $grid_param->{'rows'});
  93.     $y = ($row * $rowHeight) + ($grid_param->{'yPad'});
  94.     $y = int((($rowHeight - $widgetHeight) / 2) + $y) 
  95.         if $align =~ /^c/i;
  96.     $y = int((($rowHeight - $widgetHeight) - ($grid_param->{'yPad'})) + $y) 
  97.         if $align =~ /^b/i;
  98.     $widgetHeight=0; # same reason as coment in &column
  99.     return $y;
  100. }
  101.  
  102. sub width {
  103.     my ($grid_param,$w) = @_;
  104.     $widgetWidth = $w;
  105.     return $widgetWidth;
  106. }
  107.  
  108. sub height {
  109.     my ($grid_param,$h) = @_;
  110.     $widgetHeight = $h;
  111.     return $widgetHeight;
  112. }
  113.  
  114. 1;
  115.  
  116. __END__
  117.  
  118. =head1 NAME
  119.  
  120. Win32::GUI::GridLayout - Grid layout support for Win32::GUI
  121.  
  122. =head1 SYNOPSIS
  123.  
  124.     use Win32::GUI::
  125.     use Win32::GUI::GridLayout;
  126.  
  127.     # 1. make a "static" grid
  128.     $grid = new Win32::GUI::GridLayout(400, 300, 3, 3, 0, 0);
  129.     
  130.     $win = new Win32::GUI::Window(
  131.     
  132.     $win->AddLabel(
  133.         -name => "label1",
  134.         -text => "Label 1",
  135.         -width  => $grid->width(35),
  136.         -height => $grid->height(11),
  137.         -left   => $grid->col(1, "left"),
  138.         -top    => $grid->row(1, "top"),
  139.     );
  140.     
  141.     # 2. make a "dynamic" grid
  142.     $grid = apply Win32::GUI::GridLayout($win, 3, 3, 0, 0);
  143.     
  144.     $win->AddLabel(
  145.         -name => "label1",
  146.         -text => "Label 1",
  147.     );
  148.     $grid->add($win->label1, 1, 1, "left top");
  149.  
  150.     $grid->recalc();
  151.  
  152. =head1 DESCRIPTION
  153.  
  154.  
  155.  
  156. =head2 Constructors
  157.  
  158. =over 4
  159.  
  160. =item new Win32::GUI::GridLayout(WIDTH, HEIGHT, COLS, ROWS, XPAD, YPAD)
  161.  
  162. =item apply Win32::GUI::GridLayout(WINDOW, COLS, ROWS, XPAD, YPAD)
  163.  
  164. =back
  165.  
  166. =head2 Methods
  167.  
  168. =over 4
  169.  
  170. =item add(CONTROL, COL, ROW, ALIGN)
  171.  
  172. Adds CONTROL to the grid at (COL, ROW).
  173. ALIGN can specify both horizontal and vertical
  174. alignment (see the col() and row() methods),
  175. separated by at least one blank and/or a comma.
  176.  
  177. Example:
  178.  
  179.     $grid->add($win->label1, 1, 1, "left top");
  180.  
  181. =item col(N, ALIGN)
  182.  
  183. Positions the control at the Nth column in the grid,
  184. optionally with an ALIGN; this can be feed to a
  185. C<-left> option when creating a control.
  186.  
  187. ALIGN can be C<left>, C<center> or C<right> (can be 
  188. shortened to C<l>, C<c>, C<r>); default is C<left>.
  189.  
  190. Note that for alignment to work properly, the width()
  191. and height() methods must have been previously
  192. called.
  193.  
  194. Example:
  195.  
  196.     $win->AddLabel(
  197.         -name => "label1",
  198.         -text => "Label 1",
  199.         -width  => $grid->width(35),
  200.         -height => $grid->height(11),
  201.         -left   => $grid->col(1, "left"),
  202.         -top    => $grid->row(1, "top"),
  203.     );      
  204.  
  205. =item draw()
  206.  
  207. Draws the GridLayout in the associated window
  208. (may be useful for debugging); is only meaningful
  209. if the GridLayout was created with the apply()
  210. constructor.
  211.  
  212. =item height(N)
  213.  
  214. Sets the height of the control for subsequent
  215. alignment; this can be feed to a C<-height> option
  216. when creating a control.
  217.  
  218. Example: see col().
  219.  
  220. =item recalc()
  221.  
  222. Recalculates the grid and repositions all the add()ed 
  223. controls, taking into account the actual window and
  224. controls sizes; 
  225. is only meaningful if the GridLayout was created 
  226. with the apply() constructor.
  227.  
  228. Example:
  229.  
  230.     sub Window_Resize {
  231.         $grid->recalc();
  232.     }
  233.  
  234. =item row(N, ALIGN)
  235.  
  236. Positions the control at the Nth row in the grid,
  237. optionally with an ALIGN; this can be feed to a
  238. C<-top> option when creating a control.
  239.  
  240. ALIGN can be C<top>, C<center> or C<bottom> (can be 
  241. shortened to t, c, b); default is top.
  242.  
  243. Note that for alignment to work properly, the width()
  244. and height() methods must have been previously
  245. called.
  246.  
  247. Example: see col().
  248.  
  249. =item width(N)
  250.  
  251. Sets the width of the control for subsequent
  252. alignment; this can be feed to a C<-width> option
  253. when creating a control.
  254.  
  255. Example: see col().
  256.  
  257. =back
  258.  
  259. =head1 VERSION
  260.  
  261. Win32::GUI::GridLayout version 0.03, 13 April 1999.
  262.  
  263. =head1 AUTHOR
  264.  
  265. Mike Kangas ( C<kangas@anlon.com> );
  266. additional coding by Aldo Calpini ( C<dada@perl.it> ).
  267.  
  268. =cut
  269.