1
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
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
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