1  /*
     2   Copyright aswing.org, see the LICENCE.txt.
     3  */
     4  
     5  import org.aswing.*;
     6  import org.aswing.geom.*;
     7  
     8  /**
     9   * The layout manager used by <code>JScrollPane</code>.  
    10   * <code>JScrollPaneLayout</code> is
    11   * responsible for three components: a viewportable's pane, two scrollbars.
    12   * <p>
    13   * @see JScrollPane
    14   * @see Viewportable
    15   * 
    16   * @author iiley
    17   */
    18  class org.aswing.ScrollPaneLayout extends EmptyLayout{
    19  	
    20      /**
    21       * scrollbar are place at top and left
    22       */
    23      public static var TOP_LEFT:Number = 3;
    24      /**
    25       * scrollbar are place at top and right
    26       */
    27      public static var TOP_RIGHT:Number = 2;
    28  	
    29      /**
    30       * scrollbar are place at bottom and left
    31       */
    32      public static var BOTTOM_LEFT:Number = 1;
    33      /**
    34       * scrollbar are place at bottom and right
    35       */
    36      public static var BOTTOM_RIGHT:Number = 0;
    37      	
    38  	private var style:Number;
    39  	
    40  	
    41  	/**
    42  	 * @param style how to place the scrollbars, default is BOTTOM_RIGHT
    43  	 * @see #TOP_LEFT
    44  	 * @see #TOP_RIGHT
    45  	 * @see #BOTTOM_LEFT
    46  	 * @see #BOTTOM_RIGHT
    47  	 */
    48  	public function ScrollPaneLayout(style:Number){
    49  		this.style = (style == undefined ? BOTTOM_RIGHT : style);
    50  	}
    51  	
    52      public function minimumLayoutSize(target:Container):Dimension{
    53      	if(target instanceof JScrollPane){
    54      		var scrollPane:JScrollPane = JScrollPane(target);
    55      		var size:Dimension = getScrollBarsSize(scrollPane);
    56      		var i:Insets = scrollPane.getInsets();
    57      		size = size.increaseSize(i.roundsSize());
    58      		var vsb:JScrollBar = scrollPane.getVerticalScrollBar();
    59  	    	var viewport:Viewportable = scrollPane.getViewport();
    60  	    	if(viewport != null){
    61  	    		i = viewport.getViewportPane().getInsets();
    62  	    		size.increaseSize(i.roundsSize());
    63  	    		size.increaseSize(viewport.getViewportPane().getMinimumSize());
    64  	    	}
    65  	    	return size;
    66      	}else{
    67      		super.minimumLayoutSize(target);
    68      	}
    69      }
    70      
    71      private function getScrollBarsSize(scrollPane:JScrollPane):Dimension{
    72      	var vsb:JScrollBar = scrollPane.getVerticalScrollBar();
    73      	var hsb:JScrollBar = scrollPane.getHorizontalScrollBar();
    74      	var size:Dimension = new Dimension();
    75      	if(vsb != null && scrollPane.getVerticalScrollBarPolicy() == JScrollPane.SCROLLBAR_ALWAYS){
    76      		size.increaseSize(vsb.getPreferredSize());
    77      	}
    78      	if(hsb != null && scrollPane.getHorizontalScrollBarPolicy() == JScrollPane.SCROLLBAR_ALWAYS){
    79      		size.increaseSize(vsb.getPreferredSize());
    80      	}
    81      	return size;
    82      }
    83      
    84  	/**
    85  	 * return target.getSize();
    86  	 */
    87      public function preferredLayoutSize(target:Container):Dimension{
    88      	if(target instanceof JScrollPane){
    89  	    	var scrollPane:JScrollPane = JScrollPane(target);
    90  	    	var i:Insets = scrollPane.getInsets();
    91  	    	var size:Dimension = i.roundsSize();
    92  	    	size.increaseSize(getScrollBarsSize(scrollPane));
    93  	    	
    94  	    	var viewport:Viewportable = scrollPane.getViewport();
    95  	    	if(viewport != null){
    96  	    		size.increaseSize(viewport.getViewportPane().getPreferredSize());
    97  	    	}
    98  	    	return size;
    99      	}else{
   100      		return super.preferredLayoutSize(target);
   101      	}
   102      }
   103  	
   104      public function layoutContainer(target:Container):Void{
   105      	if(target instanceof JScrollPane){
   106      		var scrollPane:JScrollPane = JScrollPane(target);
   107      		var viewport:Viewportable = scrollPane.getViewport();
   108      		var vScrollBar:JScrollBar = scrollPane.getVerticalScrollBar();
   109      		var hScrollBar:JScrollBar = scrollPane.getHorizontalScrollBar();
   110  
   111      		var fcd:Dimension = scrollPane.getSize();
   112      		var insets:Insets = scrollPane.getInsets();
   113      		var cb:Rectangle = insets.getInsideBounds(fcd.getBounds());
   114  			
   115      		var vPreferSize:Dimension = vScrollBar.getPreferredSize();
   116      		var hPreferSize:Dimension = hScrollBar.getPreferredSize();
   117      		var vx:Number, vy:Number, vh:Number, vw:Number;
   118      		var hx:Number, hy:Number, hw:Number, hh:Number;
   119      		
   120      		var vpPane:Component = viewport.getViewportPane();
   121      		var wdis:Number = 0;
   122      		var hdis:Number = 0;
   123      		if(scrollPane.getHorizontalScrollBarPolicy() == JScrollPane.SCROLLBAR_ALWAYS){
   124      			hdis = hPreferSize.height;
   125      		}
   126      		if(scrollPane.getVerticalScrollBarPolicy() == JScrollPane.SCROLLBAR_ALWAYS){
   127      			wdis = vPreferSize.width;
   128      		}
   129      		//inital bounds
   130      		//trace("------------------------------------------------------");
   131  			//trace("----------setViewportTestSize : " + new Dimension(cb.width-wdis, cb.height-hdis));
   132      		viewport.setViewportTestSize(new Dimension(cb.width-wdis, cb.height-hdis));
   133      		var showSize:Dimension = viewport.getExtentSize();
   134      		var viewSize:Dimension = viewport.getViewSize();
   135      		//trace("extentSize : " + showSize);
   136      		//trace("viewSize : " + viewSize);
   137      		vw = vPreferSize.width;
   138      		hh = hPreferSize.height;
   139      		if(scrollPane.getHorizontalScrollBarPolicy() == JScrollPane.SCROLLBAR_NEVER){
   140     				hScrollBar.setVisible(false);
   141      			hh = 0;
   142      		}else if(viewSize.width <= showSize.width){
   143      			if(hScrollBar.isEnabled())
   144      				hScrollBar.setEnabled(false);
   145      			if(scrollPane.getHorizontalScrollBarPolicy() != JScrollPane.SCROLLBAR_ALWAYS){
   146     					hScrollBar.setVisible(false);
   147      				hh = 0;
   148      			}else{
   149      				hScrollBar.setVisible(true); 	
   150      			}
   151      		}else{
   152     				hScrollBar.setVisible(true);
   153      			if(!hScrollBar.isEnabled())
   154      				hScrollBar.setEnabled(true);
   155      		}
   156      		if(hh != hdis){
   157  				//trace("----------Shown HScrollBar setViewportTestSize : " + new Dimension(cb.width, cb.height-hh));
   158      			viewport.setViewportTestSize(new Dimension(cb.width, cb.height-hh));
   159      			showSize = viewport.getExtentSize();
   160      			viewSize = viewport.getViewSize();
   161  	    		//trace("extentSize : " + showSize);
   162  	    		//trace("viewSize : " + viewSize);
   163      		}
   164      		if(scrollPane.getVerticalScrollBarPolicy() == JScrollPane.SCROLLBAR_NEVER){
   165     				vScrollBar.setVisible(false);
   166      			vw = 0;
   167      		}else if(viewSize.height <= showSize.height){
   168      			vScrollBar.setEnabled(false);
   169      			if(scrollPane.getVerticalScrollBarPolicy() != JScrollPane.SCROLLBAR_ALWAYS){
   170     					vScrollBar.setVisible(false);
   171      				vw = 0;
   172      			}else{
   173     					vScrollBar.setVisible(true);
   174      			}
   175      		}else{
   176     				vScrollBar.setVisible(true);
   177      			if(!vScrollBar.isEnabled())
   178      				vScrollBar.setEnabled(true);    
   179      		}
   180      		
   181      		if(vw != wdis){
   182  				//trace("----------Shown VScrollBar setViewportTestSize : " + new Dimension(cb.width-vw, cb.height-hh));
   183      			viewport.setViewportTestSize(new Dimension(cb.width-vw, cb.height-hh));
   184      			showSize = viewport.getExtentSize();
   185      			viewSize = viewport.getViewSize();
   186      			//trace("extentSize : " + showSize);
   187      			//trace("viewSize : " + viewSize);
   188      		}
   189      		if(viewSize.width > showSize.width && scrollPane.getHorizontalScrollBarPolicy() == JScrollPane.SCROLLBAR_AS_NEEDED){
   190      			if(!hScrollBar.isVisible()){
   191      				hScrollBar.setEnabled(true);
   192      				hScrollBar.setVisible(true);
   193      				hh = hPreferSize.height;
   194  					//trace("----------Shown HScrollBar setViewportTestSize : " + new Dimension(cb.width-vw, cb.height-hh));
   195      				viewport.setViewportTestSize(new Dimension(cb.width-vw, cb.height-hh));
   196  	    			showSize = viewport.getExtentSize();
   197  	    			viewSize = viewport.getViewSize();
   198  	    			//trace("extentSize : " + showSize);
   199  	    			//trace("viewSize : " + viewSize);
   200      			}
   201      		}
   202      		
   203      		
   204      		var viewPortX:Number = cb.x;
   205      		var viewPortY:Number = cb.y;
   206      		
   207      		if(style == TOP_LEFT){
   208      			vx = cb.x;
   209      			vy = cb.y + hh;
   210      			vh = cb.height - hh;
   211      			
   212      			hx = cb.x + vw;
   213      			hy = cb.y;
   214      			hw = cb.width - vw;
   215      			
   216      			viewPortY += hh;
   217      			viewPortX += vw;
   218      		}else if(style == TOP_RIGHT){
   219      			vx = cb.x + cb.width - vw;
   220      			vy = cb.y + hh;
   221      			vh = cb.height - hh;
   222      			
   223      			hx = cb.x;
   224      			hy = cb.y;
   225      			hw = cb.width - vw;
   226      			
   227      			viewPortY += hh;
   228      		}else if(style == BOTTOM_LEFT){
   229      			vx = cb.x;
   230      			vy = cb.y;
   231      			vh = cb.height - hh;
   232      			
   233      			hx = cb.x + vw;
   234      			hy = cb.y + cb.height - hh;
   235      			hw = cb.width - vw;
   236      			
   237      			viewPortX += vw;
   238      		}else{
   239      			vx = cb.x + cb.width - vw;
   240      			vy = cb.y;
   241      			vh = cb.height - hh;
   242      			
   243      			hx = cb.x;
   244      			hy = cb.y + cb.height - hh;
   245      			hw = cb.width - vw;
   246      		}
   247      		if(vScrollBar.isVisible()){
   248      			vScrollBar.setBounds(vx, vy, vw, vh);
   249      		}
   250      		if(hScrollBar.isVisible()){
   251      			hScrollBar.setBounds(hx, hy, hw, hh);
   252      		}
   253      			
   254  			//trace("----------setViewportTestSize final : " + new Dimension(cb.width - vw, cb.height - hh));
   255      		vpPane.setBounds(viewPortX, viewPortY, cb.width - vw, cb.height - hh);
   256      		    		
   257  			if(hScrollBar.isVisible()){
   258      			hScrollBar.setValues(Math.max(Math.min(hScrollBar.getValue(), viewSize.width - showSize.width), 0), showSize.width, 0, viewSize.width);
   259      			hScrollBar.setUnitIncrement(viewport.getHorizontalUnitIncrement());
   260      			hScrollBar.setBlockIncrement(viewport.getHorizontalBlockIncrement());
   261  			}
   262  			if(vScrollBar.isVisible()){
   263      			vScrollBar.setValues(Math.max(Math.min(vScrollBar.getValue(), viewSize.height - showSize.height), 0), showSize.height, 0, viewSize.height);
   264      			vScrollBar.setUnitIncrement(viewport.getVerticalUnitIncrement());
   265      			vScrollBar.setBlockIncrement(viewport.getVerticalBlockIncrement());
   266  			}
   267      	}
   268      }
   269  	
   270  }
   271