home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / awt / flowlayout.java < prev    next >
Text File  |  1995-08-11  |  5KB  |  182 lines

  1. /*
  2.  * @(#)FlowLayout.java    1.20 95/01/31 Arthur van Hoff
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19. package awt;
  20.  
  21. import Math.*;
  22.  
  23. /**
  24.  * Flow layout is used to layout buttons in a panel.
  25.  * It will arrange buttons left to right until no
  26.  * more buttons fit on the same line.
  27.  *
  28.  * @version 1.20 31 Jan 1995
  29.  * @author Arthur van Hoff, Sami Shaio
  30.  */
  31. public class FlowLayout extends GapsLayout {
  32.     public static FlowLayout defaultLayout;
  33.  
  34.     static {
  35.     defaultLayout = new FlowLayout();
  36.     defaultLayout.setGaps(4, 4, 4, 4);
  37.     }
  38.  
  39.     /**
  40.      * Preferred Dimension
  41.      */
  42.     public Dimension getPreferredSize(Container pTarget) {
  43.     Dimension dim;
  44.     int insets[] = getInsets(pTarget);
  45.     int rowh = 0;
  46.     int roww = 0;
  47.     int w = 0, h = 0, i;
  48.     int maxwidth = pTarget.width - insets[EAST] - insets[WEST];
  49.     int nmembers = pTarget.children.length();
  50.  
  51.     for (i = 0 ; i < nmembers ; i++) {
  52.         if (i > 0) {
  53.         w += gaps[EAST] + gaps[WEST];
  54.         }
  55.  
  56.         Layoutable m = pTarget.getChild(i);
  57.         Dimension d = m.getPreferredSize();
  58.     
  59.         w += d.width + ((Component)m).marginWidth;
  60.         h = Math.max(h, d.height + (2 * ((Component)m).marginHeight));
  61.  
  62.         if ((w + d.width + ((Component)m).marginWidth) > maxwidth) {
  63.         rowh += h + gaps[SOUTH] + gaps[NORTH];
  64.         roww = Math.max(w, roww);
  65.         w = 0;
  66.         h = 0;
  67.         }
  68.     }
  69.     h += rowh + (gaps[NORTH] + gaps[SOUTH]);
  70.     w = Math.max(w, roww);
  71.     dim = new Dimension(w + insets[WEST] + insets[EAST],
  72.                 h + insets[NORTH] + insets[SOUTH]);
  73.     return dim;
  74.     }
  75.  
  76.     public Dimension minDimension(Container pTarget) {
  77.     Dimension dim = new Dimension(0, 0);
  78.     int n;
  79.     Layoutable c;
  80.     int insets[] = getInsets(pTarget);
  81.     int nmembers = pTarget.nChildren();
  82.  
  83.     dim.height = insets[SOUTH] + insets[NORTH] + gaps[NORTH] + gaps[SOUTH];
  84.     dim.width = insets[EAST] + insets[WEST];
  85.     for (n=0; n < nmembers; n++) {
  86.         c = pTarget.getChild(n);
  87.         if (c instanceof Component) {
  88.         Component m = (Component)c;
  89.         dim.height = Math.max(dim.height, m.height + m.marginHeight);
  90.         dim.width += m.width + m.marginWidth + gaps[WEST] + gaps[EAST];
  91.         }
  92.     }
  93.  
  94.     return dim;
  95.     }
  96.  
  97.     /** 
  98.      * Center the elements in the given row if there is any slack.
  99.      */
  100.     void centerComponents(int x,
  101.               int height,
  102.               int maxwidth,
  103.               int rowStart,
  104.               int rowEnd,
  105.               Container pTarget) {
  106.     int r;
  107.     int gapWidth = gaps[EAST]+gaps[WEST];
  108.  
  109.     if (x < maxwidth) {
  110.         x = (maxwidth - x) / 2;
  111.     } else {
  112.         x = (x - maxwidth) / 2;
  113.     }
  114.     if (x > 0) {
  115.         for (r=rowEnd-1; r >= rowStart; r--) {
  116.         Layoutable rc = pTarget.getChild(r);
  117.         if (rc instanceof Component) {
  118.             Component c = (Component)rc;
  119.             c.move(c.x + x, c.y + ((height - c.height) / 2));
  120.         }
  121.         }
  122.     }
  123.     }
  124.  
  125.  
  126.     /**
  127.      * Layout the container
  128.      */
  129.     public void layout(Container pTarget) {
  130.     int insets[] = getInsets(pTarget);
  131.     int x = insets[WEST];
  132.     int y = insets[NORTH];
  133.     int h = 0;
  134.     int i;
  135.     int maxwidth = pTarget.width - insets[EAST] - insets[WEST] -
  136.         gaps[EAST] - gaps[WEST];
  137.     Layoutable m;
  138.     int nmembers = pTarget.nChildren();
  139.     int lastrow;
  140.     int rowCount;
  141.     int r;
  142.     int slack;
  143.     int mw, mh;
  144.     
  145.     h = 0;
  146.     for (i = 0, lastrow = 0,rowCount=1; i < nmembers ; i++, rowCount++) {
  147.         m = pTarget.getChild(i);
  148.         Dimension d = m.getPreferredSize();
  149.         Component c;
  150.         if (m instanceof Component) {
  151.         c = (Component)m;
  152.         mw = c.marginWidth;
  153.         mh = c.marginHeight;        
  154.         if ((x + d.width + mw) > maxwidth) {
  155.             // center the elements in the previous row if
  156.             // there is any slack left over.
  157.             centerComponents(x, h, maxwidth, lastrow, i, pTarget);
  158.             lastrow = i;
  159.             rowCount = 1;
  160.             x = insets[WEST];
  161.             y += h + gaps[NORTH] + gaps[SOUTH];
  162.             h = 0;
  163.         }
  164.         d.width = Math.min(d.width, maxwidth - x);
  165.         if (c instanceof Container) {
  166.             c.reshape(x, y,
  167.                   d.width + (2 * c.marginWidth),
  168.                   d.height + (2 * c.marginHeight));
  169.         } else {
  170.             c.reshape(x, y, d.width, d.height);
  171.         }
  172.         x += d.width + gaps[EAST] + gaps[WEST] + mw;
  173.         h = Math.max(h, d.height);
  174.         }
  175.     }
  176.     centerComponents(x, h, maxwidth, lastrow, i, pTarget);
  177.     }
  178.  
  179. }
  180.  
  181.  
  182.