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

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.Dimension;
  29. import com.sun.lwuit.plaf.Style;
  30. import com.sun.lwuit.plaf.UIManager;
  31. /**
  32.  * Flows elements in a row so they can spill over when reaching line end
  33.  *
  34.  * @author Nir Shabi
  35.  */
  36. public class FlowLayout extends Layout{
  37.     
  38.     private int orientation = Component.LEFT;
  39.     
  40.     
  41.     /** 
  42.      * Creates a new instance of FlowLayout with left alignment
  43.      */
  44.     public FlowLayout() {
  45.     }
  46.       
  47.     /** 
  48.      * Creates a new instance of FlowLayout with the given orientation one of
  49.      * LEFT, RIGHT or CENTER
  50.      * 
  51.      * @param orientation the orientation value
  52.      */
  53.     public FlowLayout(int orientation) {
  54.         this.orientation = orientation;
  55.     }
  56.     /**
  57.      * @inheritDoc
  58.      */    
  59.     public void layoutContainer(Container parent) {
  60.         int x = parent.getStyle().getPadding(parent.isRTL(), Component.LEFT);
  61.         int width = parent.getLayoutWidth() - parent.getSideGap() - parent.getStyle().getPadding(parent.isRTL(), Component.RIGHT) - x;
  62.         boolean rtl = parent.isRTL();
  63.         if(rtl) {
  64.          x += parent.getSideGap();
  65.         }
  66.         int initX = x;
  67.         int y = parent.getStyle().getPadding(false, Component.TOP);
  68.         int rowH=0;
  69.         int start=0;
  70.         
  71.         int maxComponentWidth = width - parent.getStyle().getPadding(parent.isRTL(), Component.LEFT);
  72.         int maxComponentHeight = parent.getLayoutHeight() - y - parent.getStyle().getPadding(false, Component.BOTTOM);
  73.         if(maxComponentHeight > parent.getHeight()) {
  74.             maxComponentHeight = parent.getHeight();
  75.         }
  76.         
  77.         int numOfcomponents = parent.getComponentCount();
  78.         for(int i=0; i< numOfcomponents; i++){
  79.             Component cmp = parent.getComponentAt(i);
  80.             Style style = cmp.getStyle();
  81.             
  82.             int marginY = style.getMargin(false, Component.TOP) + style.getMargin(false, Component.BOTTOM);
  83.             int marginX = style.getMargin(false, Component.LEFT) + style.getMargin(false, Component.RIGHT);
  84.             
  85.             cmp.setWidth(Math.min(maxComponentWidth - marginX, cmp.getPreferredW()));
  86.             cmp.setHeight(Math.min(cmp.getPreferredH(), maxComponentHeight - marginY));
  87.             
  88.             if((x == parent.getStyle().getPadding(parent.isRTL(), Component.LEFT)) || ( x+ cmp.getPreferredW() < width) ) {
  89.                 // We take the actual LEFT since drawing is done in reverse
  90.                 x += cmp.getStyle().getMargin(false, Component.LEFT);
  91.              if(rtl) {
  92.                  cmp.setX(Math.max(width + initX - (x - initX) - cmp.getPreferredW(), style.getMargin(false, Component.LEFT)));
  93.              } else {
  94.              cmp.setX(x);
  95.              }
  96.                 cmp.setY(y + cmp.getStyle().getMargin(cmp.isRTL(), Component.TOP));
  97.                 
  98.                 x += cmp.getPreferredW() + cmp.getStyle().getMargin(false, Component.RIGHT);
  99.                 rowH = Math.max(rowH, cmp.getPreferredH() + cmp.getStyle().getMargin(false, Component.TOP)+ cmp.getStyle().getMargin(false, Component.BOTTOM));
  100.             } else {
  101.                 moveComponents(parent, parent.getStyle().getPadding(parent.isRTL(), Component.LEFT), y, width - x, rowH, start, i);
  102.                 x = initX+cmp.getStyle().getMargin(false, Component.LEFT);
  103.                 y += rowH;
  104.                 if(rtl) {
  105.                  cmp.setX(Math.max(width + initX - (x - initX) - cmp.getPreferredW(), style.getMargin(false, Component.LEFT)));
  106.                 } else {
  107.                  cmp.setX(x);
  108.                 }
  109.                 cmp.setY(y + cmp.getStyle().getMargin(false, Component.TOP));
  110.                 rowH = cmp.getPreferredH()+ cmp.getStyle().getMargin(false, Component.TOP)+ cmp.getStyle().getMargin(false, Component.BOTTOM);
  111.                 x += cmp.getPreferredW()+ cmp.getStyle().getMargin(false, Component.RIGHT);
  112.                 start = i;
  113.                 
  114.             }
  115.         }
  116.         moveComponents(parent, parent.getStyle().getPadding(parent.isRTL(), Component.LEFT), y, width - x, rowH, start, numOfcomponents);
  117.     }
  118.     
  119.     
  120.     private void moveComponents(Container target, int x, int y, int width, int height, int rowStart, int rowEnd ) {
  121.         switch (orientation) {
  122.             case Component.CENTER:
  123.                 // this will remove half of last gap
  124.                 if (target.isRTL()) {
  125.                  x -= (width) / 2;  
  126.                 } else {
  127.                  x += (width) / 2;
  128.                 }
  129.                 break;
  130.             case Component.RIGHT:
  131.                    x+=width;  // this will remove the last gap 
  132.                 break;
  133.         }
  134.         for (int i = rowStart ; i < rowEnd ; i++) {
  135.             Component m = target.getComponentAt(i);
  136.             
  137.             m.setX(m.getX()+ x);
  138.             m.setY(y + m.getStyle().getMargin(false, Component.TOP) + (height - m.getPreferredH()) / 2);
  139.             
  140.         }
  141.         
  142.     }    
  143.     /**
  144.      * @inheritDoc
  145.      */    
  146.     public  Dimension getPreferredSize(Container parent) {
  147.         int width = 0;
  148.         int height = 0;
  149.         
  150.         int numOfcomponents = parent.getComponentCount();
  151.         for(int i=0; i< numOfcomponents; i++){
  152.             Component cmp = parent.getComponentAt(i);
  153.             height = Math.max(height, cmp.getPreferredH() + cmp.getStyle().getMargin(false, Component.TOP)+ cmp.getStyle().getMargin(false, Component.BOTTOM));
  154.             width += cmp.getPreferredW()+ cmp.getStyle().getMargin(false, Component.RIGHT)+ cmp.getStyle().getMargin(false, Component.LEFT);
  155.         }
  156.         return new Dimension(width + parent.getStyle().getPadding(false, Component.LEFT)+ parent.getStyle().getPadding(false, Component.RIGHT),
  157.         height + parent.getStyle().getPadding(false, Component.TOP)+ parent.getStyle().getPadding(false, Component.BOTTOM));
  158.         
  159.     }
  160.     
  161.     
  162. }