1
4
5 import org.aswing.*;
6 import org.aswing.geom.*;
7
8
18 class org.aswing.ScrollPaneLayout extends EmptyLayout{
19
20
23 public static var TOP_LEFT:Number = 3;
24
27 public static var TOP_RIGHT:Number = 2;
28
29
32 public static var BOTTOM_LEFT:Number = 1;
33
36 public static var BOTTOM_RIGHT:Number = 0;
37
38 private var style:Number;
39
40
41
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
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
130
131
132 viewport.setViewportTestSize(new Dimension(cb.width-wdis, cb.height-hdis));
133 var showSize:Dimension = viewport.getExtentSize();
134 var viewSize:Dimension = viewport.getViewSize();
135
136
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
158 viewport.setViewportTestSize(new Dimension(cb.width, cb.height-hh));
159 showSize = viewport.getExtentSize();
160 viewSize = viewport.getViewSize();
161
162
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
183 viewport.setViewportTestSize(new Dimension(cb.width-vw, cb.height-hh));
184 showSize = viewport.getExtentSize();
185 viewSize = viewport.getViewSize();
186
187
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
195 viewport.setViewportTestSize(new Dimension(cb.width-vw, cb.height-hh));
196 showSize = viewport.getExtentSize();
197 viewSize = viewport.getViewSize();
198
199
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
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