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

Telnet客户端

开发平台:

Java

  1. package org.tn5250j.tools;
  2. /**
  3.  * Title: tn5250J
  4.  * Copyright:   Copyright (c) 2001
  5.  * Company:
  6.  * @author  Kenneth J. Pouncey
  7.  * @version 0.1
  8.  *
  9.  * Description:
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2, or (at your option)
  14.  * any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this software; see the file COPYING.  If not, write to
  23.  * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  24.  * Boston, MA 02111-1307 USA
  25.  *
  26.  */
  27. import java.awt.Container;
  28. import java.awt.Component;
  29. import java.util.Hashtable;
  30. public class AlignLayout extends ENHGridLayout {
  31.    protected Hashtable alignment;
  32.    protected Hashtable resize_width, resize_height;
  33.    public static final int TOP = 1;
  34.    public static final int MIDDLE = 4;
  35.    public static final int BOTTOM = 5;
  36.    /**
  37.     * Creates an aligner layout with 2 columns, a variable number of rows,
  38.     * and a gap of 5 pixels.
  39.     */
  40.    public AlignLayout() {
  41.       this(2, 5, 5);
  42.    }
  43.    /**
  44.     * Creates an aligner layout with the specified number of columns and gaps.
  45.     * @param cols the number of columns (should be a multiple of 2)
  46.     * @param hgap the horizontal gap variable
  47.     * @param vgap the vertical gap variable
  48.     * @exception IllegalArgumentException If the rows and columns are invalid.
  49.     */
  50.    public AlignLayout(int cols, int hgap, int vgap) {
  51.       super(VARIABLE, cols, hgap, vgap);
  52.    }
  53.    private int get(Hashtable table, Component comp, int def) {
  54.       Object v = (table != null) ? table.get(""+comp.hashCode()) : null;
  55.       return (v != null) ? ((Integer)v).intValue() : def;
  56.    }
  57.    private boolean get(Hashtable table, Component comp, boolean def) {
  58.       Object v = (table != null) ? table.get(""+comp.hashCode()) : null;
  59.       return (v != null) ? ((Boolean)v).booleanValue() : def;
  60.    }
  61.    /**
  62.     * Gets the vertical position of a label relative to its control.
  63.     * @see #setLabelVerticalAlignment
  64.     */
  65.    public int getLabelVerticalAlignment(Component child) {
  66.       return get(alignment, child, MIDDLE);
  67.    }
  68.    /**
  69.     * Sets the vertical position of a label relative to its control.
  70.     * @param align TOP, MIDDLE (default), or BOTTOM.
  71.     * @exception IllegalArgumentException If an invalid value is set
  72.     */
  73.    public void setLabelVerticalAlignment(Component child, int align) {
  74.       if (alignment == null) alignment = new Hashtable(5);
  75.       alignment.put(""+child.hashCode(), new Integer(align));
  76.    }
  77.    /** Gets the component's RezizeWidth value.
  78.     * @see #setResizeWidth
  79.     */
  80.    public boolean getResizeWidth(Component child) {
  81.       return get(resize_width, child, false);
  82.    }
  83.    /** Sets whether the control should be resized horizontally to its parent's
  84.     * right edge if it is in the last column (default: false).
  85.     */
  86.    public void setResizeWidth(Component child, boolean v) {
  87.       if (resize_width == null) resize_width = new Hashtable(5);
  88.       resize_width.put(""+child.hashCode(), new Boolean(v));
  89.    }
  90.    /** Gets the component's RezizeHeight value.
  91.     * @see #setResizeHeight
  92.     */
  93.    public boolean getResizeHeight(Component child) {
  94.       return get(resize_height, child, false);
  95.    }
  96.    /** Sets whether the control should be resized vertically to the height of the
  97.     * largest component in its row (default: false). This value is ignored for
  98.     * labels (the components in odd columns).
  99.     */
  100.    public void setResizeHeight(Component child, boolean v) {
  101.       if (resize_height == null) resize_height = new Hashtable(5);
  102.       resize_height.put(""+child.hashCode(), new Boolean(v));
  103.    }
  104.    protected boolean isLabel(int col) { return (col % 2) == 0; }
  105.    /**
  106.     * Positions the component.
  107.     * @param pos the component's index in its parents child list
  108.     * @param row,col component's position
  109.     */
  110.    protected void setBounds(int pos, int row, int col, Component comp,
  111.                      int x, int y, int col_width, int row_height) {
  112.       int comp_w = col_width, comp_h = row_height;
  113.       if (isLabel(col) || !getResizeHeight(comp)) {
  114.          comp_h = comp.getPreferredSize().height;
  115.       }
  116.       /* Resize a control to its parent's right edge if its resizeWidth value
  117.        * is true, and it is in the last column
  118.        */
  119.       if (!isLabel(col)) {
  120.          if (col < col_widths.length-1) {
  121.          }
  122.          else if (getResizeWidth(comp)) {
  123.             Container parent = comp.getParent();
  124.             comp_w = parent.getSize().width - parent.getInsets().right - x;
  125.          }
  126.          else {
  127.             comp_w = comp.getPreferredSize().width;
  128.          }
  129.          comp.setBounds(x, y, comp_w, comp_h);
  130.          return;
  131.       }
  132.       int control_h = row_height;
  133.       if (pos < comp.getParent().getComponentCount()-1) {
  134.          Component control = comp.getParent().getComponents()[pos+1];
  135.          if (control != null && !getResizeHeight(control)) {
  136.             control_h = control.getPreferredSize().height;
  137.          }
  138.       }
  139.       switch (getLabelVerticalAlignment(comp)) {
  140.       case MIDDLE:
  141.          y += (control_h - comp_h) / 2;
  142.          break;
  143.       case BOTTOM:
  144.          y += control_h - comp_h;
  145.          break;
  146.       }
  147.       comp.setBounds(x, y, comp_w, comp_h);
  148.    }
  149. }