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

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