1  /*
     2   Copyright aswing.org, see the LICENCE.txt.
     3  */
     4   
     5  import org.aswing.Component;
     6  import org.aswing.Event;
     7  import org.aswing.geom.Dimension;
     8  import org.aswing.geom.Point;
     9  import org.aswing.JScrollBar;
    10  import org.aswing.JScrollPane;
    11  import org.aswing.LookAndFeel;
    12  import org.aswing.plaf.ScrollPaneUI;
    13  import org.aswing.Viewportable;
    14   
    15  /**
    16   *
    17   * @author iiley
    18   */
    19  class org.aswing.plaf.basic.BasicScrollPaneUI extends ScrollPaneUI{
    20  	
    21  	private var scrollPane:JScrollPane;
    22  	private var adjusterListener:Object;
    23  	private var scrollPaneListener:Object;
    24  	private var viewportStateChangeListener:Object;
    25  	private var viewportChangedListener:Object;
    26  	private var lastViewport:Viewportable;
    27  	
    28  	public function BasicScrollPaneUI(){
    29  	}
    30      	
    31      public function installUI(c:Component):Void{
    32  		scrollPane = JScrollPane(c);
    33  		installDefaults();
    34  		installComponents();
    35  		installListeners();
    36      }
    37      
    38  	public function uninstallUI(c:Component):Void{
    39  		scrollPane = JScrollPane(c);
    40  		uninstallDefaults();
    41  		uninstallComponents();
    42  		uninstallListeners();
    43      }
    44  	
    45  	private function installDefaults():Void{
    46  		LookAndFeel.installBasicProperties(scrollPane, "ScrollPane.border");
    47          LookAndFeel.installBorder(scrollPane, "ScrollPane.border");
    48  	}
    49      
    50      private function uninstallDefaults():Void{
    51      	LookAndFeel.uninstallBorder(scrollPane);
    52      }
    53      
    54  	private function installComponents():Void{
    55      }
    56  	private function uninstallComponents():Void{
    57      }
    58  	
    59  	private function installListeners():Void{
    60  		scrollPaneListener = scrollPane.addEventListener(JScrollPane.ON_COM_ADDED, __comAdded, this);
    61  		adjusterListener = scrollPane.addAdjustmentListener(__adjustChanged, this);
    62  		viewportChangedListener = scrollPane.addEventListener(JScrollPane.ON_VIEWPORT_CHANGED, __viewportChanged, this);
    63  		__viewportChanged();
    64  	}
    65      
    66      private function uninstallListeners():Void{
    67      	scrollPane.removeEventListener(scrollPaneListener);
    68      	scrollPane.removeEventListener(adjusterListener);
    69      	scrollPane.getViewport().removeEventListener(viewportStateChangeListener);
    70      }
    71      
    72  	//-------------------------listeners--------------------------
    73      private function syncScrollPaneWithViewport():Void{
    74  		var viewport:Viewportable = scrollPane.getViewport();
    75  		var vsb:JScrollBar = scrollPane.getVerticalScrollBar();
    76  		var hsb:JScrollBar = scrollPane.getHorizontalScrollBar();
    77  		if (viewport != null) {
    78  		    var extentSize:Dimension = viewport.getExtentSize();
    79  		    var viewSize:Dimension = viewport.getViewSize();
    80  		    var viewPosition:Point = viewport.getViewPosition();
    81  			
    82  		    if (vsb != null) {
    83  				var extent:Number = extentSize.height;
    84  				var max:Number = viewSize.height;
    85  				var value:Number = Math.max(0, Math.min(viewPosition.y, max - extent));
    86  				vsb.setValues(value, extent, 0, max);
    87  				vsb.setUnitIncrement(viewport.getVerticalUnitIncrement());
    88  				vsb.setBlockIncrement(viewport.getVerticalBlockIncrement());
    89  	    	}
    90  
    91  		    if (hsb != null) {
    92  				var extent:Number = extentSize.width;
    93  				var max:Number = viewSize.width;
    94  				var value:Number = Math.max(0, Math.min(viewPosition.x, max - extent));
    95  				hsb.setValues(value, extent, 0, max);
    96  				hsb.setUnitIncrement(viewport.getHorizontalUnitIncrement());
    97  				hsb.setBlockIncrement(viewport.getHorizontalBlockIncrement());
    98  	    	}
    99  		}
   100      }	
   101  	
   102  	private function __viewportChanged(event:Event):Void{
   103  		lastViewport.removeEventListener(viewportStateChangeListener);
   104  		lastViewport = scrollPane.getViewport();
   105  		viewportStateChangeListener = lastViewport.addChangeListener(__viewportStateChanged, this);
   106  	}
   107  	
   108  	private function __viewportStateChanged(event:Event):Void{
   109  		syncScrollPaneWithViewport();
   110  	}
   111  	
   112  	private function __comAdded(event:Event):Void{
   113  		var viewportCom:Component = scrollPane.getViewport().getViewportPane();
   114  		if(event.com == viewportCom){
   115  			viewportCom.addEventListener(viewportStateChangeListener);
   116  			syncScrollPaneWithViewport();
   117  		}
   118  	}
   119      private function __adjustChanged(event:Event):Void{
   120      	var viewport:Viewportable = scrollPane.getViewport();
   121      	viewport.scrollRectToVisible(scrollPane.getVisibleRect());
   122      }
   123  }
   124