BorderLayout.java
上传用户:haobig99
上传日期:2022-06-15
资源大小:369k
文件大小:12k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
  3.  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4.  *
  5.  * This code is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License version 2 only, as
  7.  * published by the Free Software Foundation.  Sun designates this
  8.  * particular file as subject to the "Classpath" exception as provided
  9.  * by Sun in the LICENSE file that accompanied this code.
  10.  *
  11.  * This code is distributed in the hope that it will be useful, but WITHOUT
  12.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * version 2 for more details (a copy is included in the LICENSE file that
  15.  * accompanied this code).
  16.  *
  17.  * You should have received a copy of the GNU General Public License version
  18.  * 2 along with this work; if not, write to the Free Software Foundation,
  19.  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20.  *
  21.  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22.  * CA 95054 USA or visit www.sun.com if you need additional information or
  23.  * have any questions.
  24.  */
  25. package com.sun.lwuit.layouts;
  26. import com.sun.lwuit.Component;
  27. import com.sun.lwuit.Container;
  28. import com.sun.lwuit.geom.*;
  29. import com.sun.lwuit.plaf.Style;
  30. import com.sun.lwuit.plaf.UIManager;
  31. /**
  32.  * A border layout lays out a container, arranging and resizing its 
  33.  * components to fit in five regions: north, south, east, west, and center. 
  34.  * Each region may contain no more than one component, and is identified by a 
  35.  * corresponding constant: NORTH, SOUTH, EAST, WEST, and CENTER. 
  36.  * When adding a component to a container with a border layout, use one of 
  37.  * these five constants.
  38.  *
  39.  * @author Nir
  40.  */
  41. public class BorderLayout extends Layout {
  42.     private Component north;
  43.     private Component south;
  44.     private Component center;
  45.     private Component west;
  46.     private Component east;
  47.     /**
  48.      * The north layout constraint (top of container).
  49.      */
  50.     public static final String NORTH = "North";
  51.     /**
  52.      * The south layout constraint (bottom of container).
  53.      */
  54.     public static final String SOUTH = "South";
  55.     /**
  56.      * The center layout constraint (middle of container)
  57.      */
  58.     public static final String CENTER = "Center";
  59.     /**
  60.      * The west layout constraint (left of container).
  61.      */
  62.     public static final String WEST = "West";
  63.     /**
  64.      * The east layout constraint (right of container).
  65.      */
  66.     public static final String EAST = "East";
  67.     /** 
  68.      * Creates a new instance of BorderLayout 
  69.      */
  70.     public BorderLayout() {
  71.     }
  72.     /**
  73.      * @inheritDoc
  74.      */
  75.     public void addLayoutComponent(Object name, Component comp, Container c) {
  76.         // helper check for a common mistake...
  77.         if (name == null) {
  78.             throw new IllegalArgumentException("Cannot add component to BorderLayout Container without constraint parameter");
  79.         }
  80.         Component previous = null;
  81.         /* Assign the component to one of the known regions of the layout.
  82.          */
  83.         if (CENTER.equals(name)) {
  84.             previous = center;
  85.             center = comp;
  86.         } else if (NORTH.equals(name)) {
  87.             previous = north;
  88.             north = comp;
  89.         } else if (SOUTH.equals(name)) {
  90.             previous = south;
  91.             south = comp;
  92.         } else if (EAST.equals(name)) {
  93.             previous = east;
  94.             east = comp;
  95.         } else if (WEST.equals(name)) {
  96.             previous = west;
  97.             west = comp;
  98.         } else {
  99.             throw new IllegalArgumentException("cannot add to layout: unknown constraint: " + name);
  100.         }
  101.         if (previous != null && previous != comp) {
  102.             c.removeComponent(previous);
  103.         }
  104.     }
  105.     /**
  106.      * @inheritDoc
  107.      */
  108.     public void removeLayoutComponent(Component comp) {
  109.         if (comp == center) {
  110.             center = null;
  111.         } else if (comp == north) {
  112.             north = null;
  113.         } else if (comp == south) {
  114.             south = null;
  115.         } else if (comp == east) {
  116.             east = null;
  117.         } else if (comp == west) {
  118.             west = null;
  119.         }
  120.     }
  121.     /**
  122.      * Returns the component constraint
  123.      * 
  124.      * @param comp the component whose constraint is queried
  125.      * @return one of the constraints defined in this class
  126.      */
  127.     public Object getComponentConstraint(Component comp) {
  128.         if (comp == center) {
  129.             return CENTER;
  130.         } else if (comp == north) {
  131.             return NORTH;
  132.         } else if (comp == south) {
  133.             return SOUTH;
  134.         } else if (comp == east) {
  135.             return EAST;
  136.         } else {
  137.             return WEST;
  138.         }
  139.     }
  140.     /**
  141.      * @inheritDoc
  142.      */
  143.     public void layoutContainer(Container target) {
  144.         Style s = target.getStyle();
  145.         int top = s.getPadding(false, Component.TOP);
  146.         int bottom = target.getLayoutHeight() - target.getBottomGap() - s.getPadding(false, Component.BOTTOM);
  147.         int left = s.getPadding(target.isRTL(), Component.LEFT);
  148.         int right = target.getLayoutWidth() - target.getSideGap() - s.getPadding(target.isRTL(), Component.RIGHT);
  149.         int targetWidth = target.getWidth();
  150.         int targetHeight = target.getHeight();
  151.         boolean rtl = target.isRTL();
  152.         if (rtl) {
  153.          left+=target.getSideGap();
  154.         }
  155.         if (north != null) {
  156.             Component c = north;
  157.             positionTopBottom(target, c, right, left, targetHeight);
  158.             c.setY(top + c.getStyle().getMargin(false, Component.TOP));
  159.             top += (c.getHeight() + c.getStyle().getMargin(false, Component.TOP) + c.getStyle().getMargin(false, Component.BOTTOM));
  160.         }
  161.         if (south != null) {
  162.             Component c = south;
  163.             positionTopBottom(target, c, right, left, targetHeight);
  164.             c.setY(bottom - c.getHeight() - c.getStyle().getMargin(false, Component.TOP));
  165.             bottom -= (c.getHeight() + c.getStyle().getMargin(false, Component.TOP) + c.getStyle().getMargin(false, Component.BOTTOM));
  166.         }
  167.         Component realEast = east;
  168.         Component realWest = west;
  169.         if (rtl) {
  170.          realEast = west;
  171.          realWest = east;
  172.         }
  173.         if (realEast != null) {
  174.             Component c = realEast;
  175.             positionLeftRight(realEast, targetWidth, bottom, top);
  176.             c.setX(right - c.getWidth() - c.getStyle().getMargin(target.isRTL(), Component.RIGHT));
  177.             right -= (c.getWidth() + c.getStyle().getMargin(false, Component.LEFT) + c.getStyle().getMargin(false, Component.RIGHT));
  178.         }
  179.         if (realWest != null) {
  180.             Component c = realWest;
  181.             positionLeftRight(realWest, targetWidth, bottom, top);
  182.             c.setX(left + c.getStyle().getMargin(target.isRTL(), Component.LEFT));
  183.             left += (c.getWidth() + c.getStyle().getMargin(false, Component.LEFT) + c.getStyle().getMargin(false, Component.RIGHT));
  184.         }
  185.         if (center != null) {
  186.             Component c = center;
  187.             c.setWidth(right - left - c.getStyle().getMargin(false, Component.LEFT) - c.getStyle().getMargin(false, Component.RIGHT));
  188.             c.setHeight(bottom - top - c.getStyle().getMargin(false, Component.TOP) - c.getStyle().getMargin(false, Component.BOTTOM)); //verify I want to use the remaining size
  189.             c.setX(left + c.getStyle().getMargin(target.isRTL(), Component.LEFT));
  190.             c.setY(top + c.getStyle().getMargin(false, Component.TOP));
  191.         }
  192.     }
  193.     /**
  194.      * Position the east/west component variables
  195.      */
  196.     private void positionLeftRight(Component c, int targetWidth, int bottom, int top) {
  197.         c.setWidth(Math.min(targetWidth, c.getPreferredW()));
  198.         c.setHeight(bottom - top - c.getStyle().getMargin(false, Component.TOP) - c.getStyle().getMargin(false, Component.BOTTOM)); //verify I want to use tge prefered size
  199.         c.setY(top + c.getStyle().getMargin(false, Component.TOP));
  200.     }
  201.     
  202.     private void positionTopBottom(Component target, Component c, int right, int left, int targetHeight) {
  203.         c.setWidth(right - left - c.getStyle().getMargin(false, Component.LEFT) - c.getStyle().getMargin(false, Component.RIGHT));
  204.         c.setHeight(Math.min(targetHeight, c.getPreferredH())); //verify I want to use tge prefered size
  205.         c.setX(left + c.getStyle().getMargin(target.isRTL(), Component.LEFT));
  206.     }
  207.     
  208.     /**
  209.      * @inheritDoc
  210.      */
  211.     public Dimension getPreferredSize(Container parent) {
  212.         Dimension dim = new Dimension(0, 0);
  213.         if (east != null) {
  214.             dim.setWidth(east.getPreferredW() + east.getStyle().getMargin(false, Component.LEFT) + east.getStyle().getMargin(false, Component.RIGHT));
  215.             dim.setHeight(Math.max(east.getPreferredH() + east.getStyle().getMargin(false, Component.TOP) + east.getStyle().getMargin(false, Component.BOTTOM), dim.getHeight()));
  216.         }
  217.         if (west != null) {
  218.             dim.setWidth(dim.getWidth() + west.getPreferredW() + west.getStyle().getMargin(false, Component.LEFT) + west.getStyle().getMargin(false, Component.RIGHT));
  219.             dim.setHeight(Math.max(west.getPreferredH() + west.getStyle().getMargin(false, Component.TOP) + west.getStyle().getMargin(false, Component.BOTTOM), dim.getHeight()));
  220.         }
  221.         if (center != null) {
  222.             dim.setWidth(dim.getWidth() + center.getPreferredW() + center.getStyle().getMargin(false, Component.LEFT) + center.getStyle().getMargin(false, Component.RIGHT));
  223.             dim.setHeight(Math.max(center.getPreferredH() + center.getStyle().getMargin(false, Component.TOP) + center.getStyle().getMargin(false, Component.BOTTOM), dim.getHeight()));
  224.         }
  225.         if (north != null) {
  226.             dim.setWidth(Math.max(north.getPreferredW() + north.getStyle().getMargin(false, Component.LEFT) + north.getStyle().getMargin(false, Component.RIGHT), dim.getWidth()));
  227.             dim.setHeight(dim.getHeight() + north.getPreferredH() + north.getStyle().getMargin(false, Component.TOP) + north.getStyle().getMargin(false, Component.BOTTOM));
  228.         }
  229.         if (south != null) {
  230.             dim.setWidth(Math.max(south.getPreferredW() + south.getStyle().getMargin(false, Component.LEFT) + south.getStyle().getMargin(false, Component.RIGHT), dim.getWidth()));
  231.             dim.setHeight(dim.getHeight() + south.getPreferredH() + south.getStyle().getMargin(false, Component.TOP) + south.getStyle().getMargin(false, Component.BOTTOM));
  232.         }
  233.         dim.setWidth(dim.getWidth() + parent.getStyle().getPadding(false, Component.LEFT) + parent.getStyle().getPadding(false, Component.RIGHT));
  234.         dim.setHeight(dim.getHeight() + parent.getStyle().getPadding(false, Component.TOP) + parent.getStyle().getPadding(false, Component.BOTTOM));
  235.         return dim;
  236.     }
  237.     /**
  238.      * Returns the component in the south location
  239.      * 
  240.      * @return the component in the constraint
  241.      */
  242.     protected Component getSouth() {
  243.         return south;
  244.     }
  245.     /**
  246.      * Returns the component in the center location
  247.      * 
  248.      * @return the component in the constraint
  249.      */
  250.     protected Component getCenter() {
  251.         return center;
  252.     }
  253.     /**
  254.      * Returns the component in the north location
  255.      * 
  256.      * @return the component in the constraint
  257.      */
  258.     protected Component getNorth() {
  259.         return north;
  260.     }
  261.     /**
  262.      * Returns the component in the east location
  263.      * 
  264.      * @return the component in the constraint
  265.      */
  266.     protected Component getEast() {
  267.         return east;
  268.     }
  269.     /**
  270.      * Returns the component in the west location
  271.      * 
  272.      * @return the component in the constraint
  273.      */
  274.     protected Component getWest() {
  275.         return west;
  276.     }
  277. }