1
4
5 import org.aswing.Component;
6 import org.aswing.Container;
7 import org.aswing.EmptyLayout;
8 import org.aswing.geom.Dimension;
9 import org.aswing.Insets;
10
11
15 class org.aswing.GridLayout extends EmptyLayout{
16
24 private var hgap:Number;
25
33 private var vgap:Number;
34
44 private var rows:Number;
45
55 private var cols:Number;
56
57
58
59
87 public function GridLayout(rows:Number, cols:Number, hgap:Number, vgap:Number) {
88 if ((rows == 0) && (cols == 0)) {
89 trace("rows and cols cannot both be zero");
90 throw new Error("rows and cols cannot both be zero");
91 }
92
93 if(rows == undefined) rows = 1;
94 if(cols == undefined) cols = 0;
95 if(hgap == undefined) hgap = 0;
96 if(vgap == undefined) vgap = 0;
97
98 this.rows = rows;
99 this.cols = cols;
100 this.hgap = hgap;
101 this.vgap = vgap;
102 }
103
104
109 public function getRows():Number {
110 return rows;
111 }
112
113
119 public function setRows(rows:Number):Void {
120 if ((rows == 0) && (this.cols == 0)) {
121 trace("rows and cols cannot both be zero");
122 throw new Error("rows and cols cannot both be zero");
123 }
124 this.rows = rows;
125 }
126
127
132 public function getColumns():Number {
133 return cols;
134 }
135
136
148 public function setColumns(cols:Number):Void {
149 if ((cols == 0) && (this.rows == 0)) {
150 trace("rows and cols cannot both be zero");
151 throw new Error("rows and cols cannot both be zero");
152 }
153 this.cols = cols;
154 }
155
156
161 public function getHgap():Number {
162 return hgap;
163 }
164
165
170 public function setHgap(hgap:Number):Void {
171 this.hgap = hgap;
172 }
173
174
179 public function getVgap():Number {
180 return vgap;
181 }
182
183
188 public function setVgap(vgap:Number):Void {
189 this.vgap = vgap;
190 }
191
192 public function preferredLayoutSize(target:Container):Dimension{
193 var insets:Insets = target.getInsets();
194 var ncomponents:Number = target.getComponentCount();
195 var nrows:Number = rows;
196 var ncols:Number = cols;
197 if (nrows > 0){
198 ncols = Math.floor(((ncomponents + nrows) - 1) / nrows);
199 }else{
200 nrows = Math.floor(((ncomponents + ncols) - 1) / ncols);
201 }
202 var w:Number = 0;
203 var h:Number = 0;
204 for (var i:Number = 0; i < ncomponents; i++){
205 var comp:Component = target.getComponent(i);
206 var d:Dimension = comp.getPreferredSize();
207 if (w < d.width){
208 w = d.width;
209 }
210 if (h < d.height){
211 h = d.height;
212 }
213 }
214 return new Dimension((((insets.left + insets.right) + (ncols * w)) + ((ncols - 1) * hgap)), (((insets.top + insets.bottom) + (nrows * h)) + ((nrows - 1) * vgap)));
215 }
216
217 public function minimumLayoutSize(target:Container):Dimension{
218 var insets:Insets = target.getInsets();
219 var ncomponents:Number = target.getComponentCount();
220 var nrows:Number = rows;
221 var ncols:Number = cols;
222 if (nrows > 0){
223 ncols = Math.floor(((ncomponents + nrows) - 1) / nrows);
224 }else{
225 nrows = Math.floor(((ncomponents + ncols) - 1) / ncols);
226 }
227 var w:Number = 0;
228 var h:Number = 0;
229 for (var i:Number = 0; i < ncomponents; i++)
230 {
231 var comp:Component = target.getComponent(i);
232 var d:Dimension = comp.getMinimumSize();
233 if (w < d.width)
234 {
235 w = d.width;
236 }
237 if (h < d.height)
238 {
239 h = d.height;
240 }
241 }
242 return new Dimension((((insets.left + insets.right) + (ncols * w)) + ((ncols - 1) * hgap)), (((insets.top + insets.bottom) + (nrows * h)) + ((nrows - 1) * vgap)));
243 }
244
245
248 public function maximumLayoutSize(target:Container):Dimension{
249 return new Dimension(Number.MAX_VALUE, Number.MAX_VALUE);
250 }
251
252 public function layoutContainer(target:Container):Void{
253 var insets:Insets = target.getInsets();
254 var ncomponents:Number = target.getComponentCount();
255 var nrows:Number = rows;
256 var ncols:Number = cols;
257 if (ncomponents == 0){
258 return ;
259 }
260 if (nrows > 0){
261 ncols = Math.floor(((ncomponents + nrows) - 1) / nrows);
262 }else{
263 nrows = Math.floor(((ncomponents + ncols) - 1) / ncols);
264 }
265 var w:Number = (target.getWidth() - (insets.left + insets.right));
266 var h:Number = (target.getHeight() - (insets.top + insets.bottom));
267 w = ((w - ((ncols - 1) * hgap)) / ncols);
268 h = ((h - ((nrows - 1) * vgap)) / nrows);
269 var x:Number = insets.left;
270 var y:Number = insets.top;
271 for (var c:Number = 0; c < ncols; c++){
272 y = insets.top;
273 for (var r:Number = 0; r < nrows; r++){
274 var i:Number = ((r * ncols) + c);
275 if (i < ncomponents){
276 target.getComponent(i).setBounds(x, y, w, h);
277 }
278 y += (h + vgap);
279 }
280 x += (w + hgap);
281 }
282 }
283 public function toString():String{
284 return ((((((((("GridLayout[hgap=") + hgap) + ",vgap=") + vgap) + ",rows=") + rows) + ",cols=") + cols) + "]");
285 }
286
287
290 public function getLayoutAlignmentX(target:Container):Number{
291 return 0.5;
292 }
293
294
297 public function getLayoutAlignmentY(target:Container):Number{
298 return 0.5;
299 }
300 }
301