1  /*
     2   Copyright aswing.org, see the LICENCE.txt.
     3  */
     4   
     5  import org.aswing.*;
     6  import org.aswing.geom.*;
     7  
     8  /**
     9   * SoftBoxLayout layout the components to a list as same width/height but their preffered height/width.
    10   * 
    11   * @see BoxLayout
    12   * @author iiley
    13   */
    14  class org.aswing.SoftBoxLayout extends EmptyLayout{
    15  	
    16      /**
    17       * Specifies that components should be laid out left to right.
    18       */
    19      public static var X_AXIS:Number = 0;
    20      
    21      /**
    22       * Specifies that components should be laid out top to bottom.
    23       */
    24      public static var Y_AXIS:Number = 1;
    25      
    26      
    27      private var axis:Number;
    28      private var gap:Number;
    29      
    30      /**
    31       * <br>
    32       * BoxLayout(axis:Number)<br>
    33       * BoxLayout(axis:Number)<br>
    34       * @param axis the layout axis, default X_AXIS
    35       * @param gap the gap between each component, default 0
    36       * @see #X_AXIS
    37       * @see #X_AXIS
    38       */
    39      public function SoftBoxLayout(axis:Number, gap:Number){
    40      	this.axis = (axis == undefined ? X_AXIS : axis);
    41      	this.gap = (gap == undefined ? 0 : gap);
    42      }
    43      	
    44  	/**
    45  	 * return target.getSize();
    46  	 */
    47      public function preferredLayoutSize(target:Container):Dimension{
    48      	var count:Number = target.getComponentCount();
    49      	var insets:Insets = target.getInsets();
    50      	var width:Number = 0;
    51      	var height:Number = 0;
    52      	var wTotal:Number = 0;
    53      	var hTotal:Number = 0;
    54      	for(var i:Number=0; i<count; i++){
    55      		var c:Component = target.getComponent(i);
    56      		if(c.isVisible()){
    57  	    		var size:Dimension = c.getPreferredSize();
    58  	    		width = Math.max(width, size.width);
    59  	    		height = Math.max(height, size.height);
    60  	    		var g:Number = i > 0 ? gap : 0;
    61  	    		wTotal += (size.width + g);
    62  	    		hTotal += (size.height + g);
    63      		}
    64      	}
    65      	if(axis == Y_AXIS){
    66      		height = hTotal;
    67      	}else{
    68      		width = wTotal;
    69      	}
    70      	
    71      	var dim:Dimension = new Dimension(width, height);
    72      	return insets.roundsSize(dim);
    73      }
    74  
    75  	/**
    76  	 * target.getSize();
    77  	 */
    78      public function minimumLayoutSize(target:Container):Dimension{
    79      	var count:Number = target.getComponentCount();
    80      	var insets:Insets = target.getInsets();
    81      	var width:Number = 0;
    82      	var height:Number = 0;
    83      	var wTotal:Number = 0;
    84      	var hTotal:Number = 0;
    85      	for(var i:Number=0; i<count; i++){
    86      		var c:Component = target.getComponent(i);
    87      		if(c.isVisible()){
    88  	    		var size:Dimension = c.getMinimumSize();
    89  	    		width = Math.max(width, size.width);
    90  	    		height = Math.max(height, size.height);
    91  	    		var g:Number = i > 0 ? gap : 0;
    92  	    		wTotal += (size.width + g);
    93  	    		hTotal += (size.height + g);
    94      		}
    95      	}
    96      	if(axis == Y_AXIS){
    97      		height = hTotal;
    98      	}else{
    99      		width = wTotal;
   100      	}
   101      	var dim:Dimension = new Dimension(width, height);
   102      	return insets.roundsSize(dim);
   103      }
   104      
   105  	/**
   106  	 * return new Dimension(Number.MAX_VALUE, Number.MAX_VALUE);
   107  	 */
   108      public function maximumLayoutSize(target:Container):Dimension{
   109      	var count:Number = target.getComponentCount();
   110      	var insets:Insets = target.getInsets();
   111      	var width:Number = 0;
   112      	var height:Number = 0;
   113      	var wTotal:Number = 0;
   114      	var hTotal:Number = 0;
   115      	for(var i:Number=0; i<count; i++){
   116  	    	var c:Component = target.getComponent(i);
   117      		if(c.isVisible()){
   118  	    		var size:Dimension = c.getMaximumSize();
   119  	    		width = Math.max(width, size.width);
   120  	    		height = Math.max(height, size.height);
   121  	    		var g:Number = i > 0 ? gap : 0;
   122  	    		wTotal += (size.width + g);
   123  	    		hTotal += (size.height + g);
   124      		}
   125      	}
   126      	if(axis == Y_AXIS){
   127      		height = hTotal;
   128      	}else{
   129      		width = wTotal;
   130      	}
   131      	var dim:Dimension = new Dimension(width, height);
   132      	return insets.roundsSize(dim);
   133      }    
   134      
   135      /**
   136       * do nothing
   137       */
   138      public function layoutContainer(target:Container):Void{
   139      	var count:Number = target.getComponentCount();
   140      	var size:Dimension = target.getSize();
   141      	var insets:Insets = target.getInsets();
   142      	var rd:Rectangle = insets.getInsideBounds(size.getBounds());
   143      	var ch:Number = rd.height;
   144      	var cw:Number = rd.width;
   145      	var x:Number = rd.x;
   146      	var y:Number = rd.y;
   147      	for(var i:Number=0; i<count; i++){
   148      		var c:Component = target.getComponent(i);
   149      		if(c.isVisible()){
   150  	    		var ps:Dimension = c.getPreferredSize();
   151  	    		if(axis == Y_AXIS){
   152  	    			c.setBounds(x, y, cw, ps.height);
   153  	    			y += (ps.height + gap);
   154  	    		}else{
   155  	    			c.setBounds(x, y, ps.width, ch);
   156  	    			x += (ps.width + gap);
   157  	    		}
   158      		}
   159      	}
   160      }
   161      
   162  	/**
   163  	 * return 0.5
   164  	 */
   165      public function getLayoutAlignmentX(target:Container):Number{
   166      	return 0.5;
   167      }
   168  
   169  	/**
   170  	 * return 0.5
   171  	 */
   172      public function getLayoutAlignmentY(target:Container):Number{
   173      	return 0.5;
   174      }
   175  }
   176