FixedCenterLayout.java
上传用户:xiekaiwei
上传日期:2015-07-04
资源大小:620k
文件大小:7k
源码类别:

Telnet客户端

开发平台:

Java

  1. /**
  2.  * Title: tn5250J
  3.  * Copyright:   Copyright (c) 2001
  4.  * Company:
  5.  * @author  Kenneth J. Pouncey
  6.  * @version 0.5
  7.  *
  8.  * Description:
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this software; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  23.  * Boston, MA 02111-1307 USA
  24.  *
  25.  */
  26. package org.tn5250j.tools;
  27. import java.awt.LayoutManager2;
  28. import java.io.Serializable;
  29. import java.awt.Component;
  30. import java.awt.Dimension;
  31. import java.awt.Container;
  32. import java.awt.BorderLayout;
  33. import java.awt.Insets;
  34. /**
  35.  * Fixed Center layout.
  36.  */
  37. public class FixedCenterLayout implements LayoutManager2, Serializable {
  38.     protected int hgap;
  39.     protected Component west;
  40.     protected Component east;
  41.     protected Component center;
  42.     /**
  43.      * Constructs a new layout with no gap between components.
  44.      */
  45.     public FixedCenterLayout() {
  46.         this(0);
  47.     }
  48.     /**
  49.      * Constructs a layout with the specified gaps between components.
  50.      */
  51.     public FixedCenterLayout(int hgap) {
  52.         this.hgap = hgap;
  53.     }
  54.     /**
  55.      * Returns the horizontal gap between components.
  56.      */
  57.     public int getHgap() {
  58.         return hgap;
  59.     }
  60.     /**
  61.      * Sets the horizontal gap between components.
  62.      */
  63.     public void setHgap(int hgap) {
  64.         this.hgap = hgap;
  65.     }
  66.     /**
  67.      * Adds the specified component to the layout.
  68.      */
  69.     public void addLayoutComponent(Component comp, Object constraints) {
  70.         synchronized (comp.getTreeLock()) {
  71.             if ((constraints == null) || (constraints instanceof String)) {
  72.                 addLayoutComponent((String)constraints, comp);
  73.             } else {
  74.                 throw new IllegalArgumentException("Cannot add to layout: constraint must be a string or null");
  75.             }
  76.         }
  77.     }
  78.     /**
  79.      * We are forced to support it by <code>LayoutManager</code>.
  80.      */
  81.     public void addLayoutComponent(String name, Component comp) {
  82.         synchronized (comp.getTreeLock()) {
  83.             if (name == null || BorderLayout.CENTER.equals(name)) {
  84.                 center = comp;
  85.             } else if (BorderLayout.EAST.equals(name)) {
  86.                 east = comp;
  87.             } else if (BorderLayout.WEST.equals(name)) {
  88.                 west = comp;
  89.             } else {
  90.                 throw new IllegalArgumentException("cannot add to layout: unknown constraint: " + name);
  91.             }
  92.         }
  93.     }
  94.     /**
  95.      * Removes the specified component from this layout.
  96.      */
  97.     public void removeLayoutComponent(Component component) {
  98.         synchronized (component.getTreeLock()) {
  99.             if (component == center) {
  100.                 center = null;
  101.             } else if (component == east) {
  102.                 east = null;
  103.             } else if (component == west) {
  104.                 west = null;
  105.             }
  106.         }
  107.     }
  108.     /**
  109.      * Determines the minimum size of the target.
  110.      */
  111.     public Dimension minimumLayoutSize(Container target) {
  112.         synchronized (target.getTreeLock()) {
  113.             Dimension d = new Dimension(0, 0);
  114.             addMinimumSize(d, east);
  115.             addMinimumSize(d, west);
  116.             addMinimumSize(d, center);
  117.             Insets insets = target.getInsets();
  118.             d.width += insets.left + insets.right;
  119.             d.height += insets.top + insets.bottom;
  120.             return d;
  121.         }
  122.     }
  123.     /**
  124.      * Determines the preferred size of the target.
  125.      */
  126.     public Dimension preferredLayoutSize(Container target) {
  127.         synchronized (target.getTreeLock()) {
  128.             Dimension d = new Dimension(0, 0);
  129.             addPreferredSize(d, east);
  130.             addPreferredSize(d, west);
  131.             addPreferredSize(d, center);
  132.             Insets insets = target.getInsets();
  133.             d.width += insets.left + insets.right;
  134.             d.height += insets.top + insets.bottom;
  135.             return d;
  136.         }
  137.     }
  138.     /**
  139.      * Determines the maximum size of the target.
  140.      */
  141.     public Dimension maximumLayoutSize(Container target) {
  142.         return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
  143.     }
  144.     /**
  145.      * Returns the alignment along the x axis.
  146.      */
  147.     public float getLayoutAlignmentX(Container parent) {
  148.         return 0.5f;
  149.     }
  150.     /**
  151.      * Returns the alignment along the y axis.
  152.      */
  153.     public float getLayoutAlignmentY(Container parent) {
  154.         return 0.5f;
  155.     }
  156.     /**
  157.      * Invalidates the layout, indicating that if the layout manager
  158.      * has cached information it should be discarded.
  159.      */
  160.     public void invalidateLayout(Container target) {
  161.     }
  162.     /**
  163.      * Lays out the target argument using this layout.
  164.      */
  165.     public void layoutContainer(Container target) {
  166.         synchronized (target.getTreeLock()) {
  167.             Insets insets = target.getInsets();
  168.             int top = insets.top;
  169.             // int bottom = target.getHeight() - insets.bottom;
  170.             int bottom = target.getBounds().height - insets.bottom;
  171.             int left = insets.left;
  172.             // int right = target.getWidth() - insets.right;
  173.             int right = target.getBounds().width - insets.right;
  174.             int leftCenter = (right-left)/2;
  175.             int rightCenter = leftCenter;
  176.             if (center != null) {
  177.                 Dimension d = center.getPreferredSize();
  178.                 leftCenter = (right-left-d.width)/2;
  179.                 rightCenter = leftCenter+d.width;
  180.                 center.setBounds(leftCenter, top, d.width, bottom-top);
  181.             }
  182.             if (west != null) {
  183.                 west.setBounds(left, top, leftCenter-left-hgap, bottom-top);
  184.             }
  185.             if (east != null) {
  186.                 east.setBounds(rightCenter+hgap, top, right-rightCenter-2*hgap, bottom-top);
  187.             }
  188.         }
  189.     }
  190.     private void addMinimumSize(Dimension d, Component c) {
  191.         if (c != null) {
  192.             addSize(d, c.getMinimumSize());
  193.         }
  194.     }
  195.     private void addPreferredSize(Dimension d, Component c) {
  196.         if (c != null) {
  197.             addSize(d, c.getPreferredSize());
  198.         }
  199.     }
  200.     private void addSize(Dimension d, Dimension size) {
  201.         d.width += size.width + hgap;
  202.         d.height = Math.max(size.height, d.height);
  203.     }
  204.     /**
  205.      * Returns a string representation of the state of this layout.
  206.      */
  207.     public String toString() {
  208.         return getClass().getName() + "[hgap=" + hgap + "]";
  209.     }
  210. } // FixedCenterLayout