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

  1. /*
  2.  * @(#)ColumnLayout.java    1.8 95/02/16 Sami Shaio
  3.  *
  4.  * Copyright (c) 1995 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. import Math.max;
  21. import Math.min;
  22. public class ColumnLayout extends GapsLayout {
  23.     int maxheight;
  24.     int maxwidth;
  25.     boolean isCentered;
  26.  
  27.     public ColumnLayout(boolean isCentered) {
  28.     this.isCentered = isCentered;
  29.     }
  30.  
  31.     public ColumnLayout() {
  32.     this(false);
  33.     }
  34.  
  35.     /**
  36.      * Preferred Dimension
  37.      */
  38.     public Dimension getPreferredSize(Container pTarget) {
  39.     Dimension dim;
  40.     int nmembers = pTarget.children.length();
  41.     int lastMarginHeight = 0;
  42.     int lastMarginWidth = 0;
  43.     int i;
  44.  
  45.     dim = new Dimension(0,0);
  46.  
  47.     for (i = 0 ; i < nmembers ; i++) {
  48.         Layoutable m = pTarget.getChild(i);
  49.         Dimension d = m.getPreferredSize();
  50.  
  51.         if (m instanceof Component) {
  52.         Component comp = (Component)m;
  53.  
  54.         lastMarginHeight = comp.marginHeight;
  55.         lastMarginWidth = comp.marginWidth;
  56.         dim.height += d.height + comp.marginHeight;
  57.         dim.width = Math.max(d.width + comp.marginWidth,
  58.                      dim.width);
  59.         }
  60.     }
  61.     
  62.     maxheight = dim.height;
  63.     maxwidth = dim.width;
  64.     return dim;
  65.     }
  66.  
  67.     public Dimension minDimension(Container pTarget) {
  68.     return getPreferredSize(pTarget);
  69.     }
  70.  
  71.     /** 
  72.      * Center the elements in the given row if there is any slack.
  73.      */
  74.     void centerComponents(Container pTarget,
  75.               int y,
  76.               int width,
  77.               int maxheight,
  78.               int rowStart,
  79.               int rowEnd) {
  80.     int r;
  81.     int xoff;
  82.  
  83.     if (y < maxheight) {
  84.         y = (maxheight - y) / 2;
  85.     } else {
  86.         y = (y - maxheight) / 2;
  87.     }
  88.     if (y > 0) {
  89.         for (r=rowEnd-1; r >= rowStart; r--) {
  90.         Layoutable rc = pTarget.getChild(r);
  91.         if (rc instanceof Component) {
  92.             Component c = (Component)rc;
  93.             xoff = ((width - c.width) / 2);
  94.             if (xoff < 0) {
  95.             xoff = 0;
  96.             }
  97.             c.move(c.x + xoff, c.y + y);
  98.         }
  99.         }
  100.     } else {
  101.         // we need to move the components to their positions
  102.         // because this wasn't done in expectation that they would
  103.         // get moved again to be centered.
  104.         for (r=rowEnd-1; r >= rowStart; r--) {
  105.         Layoutable rc = pTarget.getChild(r);
  106.         if (rc instanceof Component) {
  107.             Component c = (Component)rc;
  108.             c.move(c.x, c.y);
  109.         }
  110.         }        
  111.     }
  112.     }
  113.  
  114.     public void layout(Container pTarget) {
  115.     Dimension dim;
  116.     int nmembers = pTarget.children.length();
  117.     int cx = pTarget.x;
  118.     int cy = pTarget.y;
  119.     int w, h;
  120.     int i;
  121.  
  122.     if (pTarget instanceof Window) {
  123.         cx = cy = 0;
  124.     }
  125.  
  126.     dim = new Dimension(0,0);
  127.  
  128.     for (i = 0 ; i < nmembers ; i++) {
  129.         Layoutable m = pTarget.getChild(i);
  130.         Dimension d = m.getPreferredSize();
  131.  
  132.         if (m instanceof Component) {
  133.         Component comp = (Component)m;
  134.  
  135.         if (comp.width != d.width ||
  136.             comp.height != d.height) {
  137.             if (cx + d.width > pTarget.width) {
  138.             d.width = pTarget.width - cx;
  139.             }
  140.             if (cy + d.height > pTarget.height) {
  141.             d.height = pTarget.height - cy;
  142.             }
  143.             comp.reshape(cx, cy, d.width, d.height);
  144.         } else {
  145.             if (isCentered) {
  146.             comp.x = cx;
  147.             comp.y = cy;
  148.             } else {
  149.             comp.move(cx, cy);
  150.             }
  151.         }
  152.         if (comp instanceof Container) {
  153.             comp.reshape(cx, cy, pTarget.width, d.height);
  154.         }
  155.         cy += d.height + comp.marginHeight;
  156.         }
  157.     }
  158.     if (isCentered) {
  159.         centerComponents(pTarget, cy, pTarget.width, pTarget.height, 0, nmembers);
  160.     }
  161.     }
  162. }
  163.