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

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.UIManager;
  30. /**
  31.  * Layout manager that places elements in a row or column according to 
  32.  * box orientation
  33.  *
  34.  * @author Chen Fishbein
  35.  */
  36. public class BoxLayout extends Layout{
  37.     
  38.     /**
  39.      * Horizontal layout where components are arranged from left to right
  40.      */
  41.     public static final int X_AXIS = 1;
  42.     /**
  43.      * Vertical layout where components are arranged from top to bottom
  44.      */
  45.     public static final int Y_AXIS = 2;
  46.     
  47.     private int axis;
  48.     
  49.     /** 
  50.      * Creates a new instance of BoxLayout
  51.      * 
  52.      * @param axis the axis to lay out components along. 
  53.      * Can be: BoxLayout.X_AXIS or BoxLayout.Y_AXIS
  54.      */
  55.     public BoxLayout(int axis) {
  56.         this.axis = axis;
  57.     }
  58.     
  59.     /**
  60.      * @inheritDoc
  61.      */
  62.     public void layoutContainer(Container parent) {        
  63.         int width = parent.getLayoutWidth() - parent.getSideGap() - parent.getStyle().getPadding(false, Component.RIGHT) - parent.getStyle().getPadding(false, Component.LEFT);
  64.         int height = parent.getLayoutHeight() - parent.getBottomGap() - parent.getStyle().getPadding(false, Component.BOTTOM) - parent.getStyle().getPadding(false, Component.TOP);
  65.         int x = parent.getStyle().getPadding(parent.isRTL(), Component.LEFT);
  66.         int y = parent.getStyle().getPadding(false, Component.TOP);
  67.         int numOfcomponents = parent.getComponentCount();
  68.         
  69.         boolean rtl = parent.isRTL();
  70.         if(rtl) {
  71.          x += parent.getSideGap();
  72.         }
  73.         int initX = x;
  74.         for(int i=0; i< numOfcomponents; i++){
  75.             Component cmp = parent.getComponentAt(i);
  76.             
  77.             if(axis == Y_AXIS){
  78.                 int cmpBottom = height;
  79.                 int cmpH = cmp.getPreferredH();
  80.                 
  81.                 y += cmp.getStyle().getMargin(false, Component.TOP);
  82.                 
  83.                 if(y >= cmpBottom){
  84.                     cmpH = 0;
  85.                 }else if(y + cmpH - parent.getStyle().getPadding(false, Component.TOP) > cmpBottom){
  86.                     cmpH = cmpBottom - y - cmp.getStyle().getMargin(false, Component.BOTTOM);
  87.                 }
  88.                 cmp.setWidth(width - cmp.getStyle().getMargin(parent.isRTL(), Component.LEFT) - cmp.getStyle().getMargin(parent.isRTL(), Component.RIGHT));
  89.                 cmp.setHeight(cmpH);
  90.                 cmp.setX(x + cmp.getStyle().getMargin(parent.isRTL(), Component.LEFT));
  91.                 cmp.setY(y);
  92.                 y += cmp.getHeight() + cmp.getStyle().getMargin(false, Component.BOTTOM);
  93.             }else{
  94.                 int cmpRight = width;
  95.                 int cmpW = cmp.getPreferredW();
  96.                 
  97.                 x += cmp.getStyle().getMargin(false, Component.LEFT);
  98.                 if(x >= cmpRight){
  99.                     cmpW = 0;
  100.                 } else {
  101.                     if(x + cmpW - parent.getStyle().getPadding(false, Component.LEFT) > cmpRight){
  102.                         cmpW = cmpRight - x - cmp.getStyle().getMargin(false, Component.RIGHT);
  103.                     }
  104.                 }
  105.                 cmp.setWidth(cmpW);
  106.                 cmp.setHeight(height- cmp.getStyle().getMargin(false, Component.TOP) - cmp.getStyle().getMargin(false, Component.BOTTOM));
  107.                 if(rtl) {
  108.                  cmp.setX(width + initX - (x - initX) - cmpW);
  109.                 } else {
  110.                  cmp.setX(x);
  111.                 }
  112.                 cmp.setY(y + cmp.getStyle().getMargin(false, Component.TOP));
  113.                 x += cmp.getWidth() + cmp.getStyle().getMargin(false, Component.RIGHT);
  114.             }
  115.         }
  116.     }
  117.     
  118.     /**
  119.      * @inheritDoc
  120.      */
  121.     public Dimension getPreferredSize(Container parent) {
  122.         int width = 0;
  123.         int height = 0;
  124.         int numOfcomponents = parent.getComponentCount();
  125.         for(int i=0; i< numOfcomponents; i++){
  126.             Component cmp = parent.getComponentAt(i);
  127.             
  128.             if(axis == Y_AXIS){
  129.                 int cmpH = cmp.getPreferredH() + cmp.getStyle().getMargin(false, Component.TOP) + cmp.getStyle().getMargin(false, Component.BOTTOM);
  130.                 height += cmpH;
  131.                 width = Math.max(width , cmp.getPreferredW()+ cmp.getStyle().getMargin(false, Component.LEFT) + cmp.getStyle().getMargin(false, Component.RIGHT));
  132.             }else{
  133.                 int cmpW = cmp.getPreferredW() + cmp.getStyle().getMargin(false, Component.LEFT) + cmp.getStyle().getMargin(false, Component.RIGHT);
  134.                 width += cmpW;
  135.                 height = Math.max(height, cmp.getPreferredH() + cmp.getStyle().getMargin(false, Component.TOP) + cmp.getStyle().getMargin(false, Component.BOTTOM));
  136.             }
  137.         }
  138.         Dimension d = new Dimension(width + parent.getStyle().getPadding(false, Component.LEFT)+ parent.getStyle().getPadding(false, Component.RIGHT),
  139.         height + parent.getStyle().getPadding(false, Component.TOP)+ parent.getStyle().getPadding(false, Component.BOTTOM));
  140.         return d;
  141.     }  
  142.     
  143. }