1 package org.astrogrid.ui;
2
3 import java.awt.*;
4
5
6 public class GridLayout2 extends GridLayout
7 {
8 public GridLayout2() {
9 this(1, 0, 0, 0);
10 }
11
12 public GridLayout2(int rows, int cols) {
13 this(rows, cols, 0, 0);
14 }
15
16 public GridLayout2(int rows, int cols, int hgap, int vgap) {
17 super(rows, cols, hgap, vgap);
18 }
19
20 public Dimension preferredLayoutSize(Container parent) {
21
22 synchronized (parent.getTreeLock()) {
23 Insets insets = parent.getInsets();
24 int ncomponents = parent.getComponentCount();
25 int nrows = getRows();
26 int ncols = getColumns();
27 if (nrows > 0) {
28 ncols = (ncomponents + nrows - 1) / nrows;
29 }
30 else {
31 nrows = (ncomponents + ncols - 1) / ncols;
32 }
33 int[] w = new int[ncols];
34 int[] h = new int[nrows];
35 for (int i = 0; i < ncomponents; i ++) {
36 int r = i / ncols;
37 int c = i % ncols;
38 Component comp = parent.getComponent(i);
39 Dimension d = comp.getPreferredSize();
40 if (w[c] < d.width) {
41 w[c] = d.width;
42 }
43 if (h[r] < d.height) {
44 h[r] = d.height;
45 }
46 }
47 int nw = 0;
48 for (int j = 0; j < ncols; j ++) {
49 nw += w[j];
50 }
51 int nh = 0;
52 for (int i = 0; i < nrows; i ++) {
53 nh += h[i];
54 }
55 return new Dimension(insets.left + insets.right + nw + (ncols-1)*getHgap(),
56 insets.top + insets.bottom + nh + (nrows-1)*getVgap());
57 }
58 }
59
60 public Dimension minimumLayoutSize(Container parent) {
61 System.err.println("minimumLayoutSize");
62 synchronized (parent.getTreeLock()) {
63 Insets insets = parent.getInsets();
64 int ncomponents = parent.getComponentCount();
65 int nrows = getRows();
66 int ncols = getColumns();
67 if (nrows > 0) {
68 ncols = (ncomponents + nrows - 1) / nrows;
69 }
70 else {
71 nrows = (ncomponents + ncols - 1) / ncols;
72 }
73 int[] w = new int[ncols];
74 int[] h = new int[nrows];
75 for (int i = 0; i < ncomponents; i ++) {
76 int r = i / ncols;
77 int c = i % ncols;
78 Component comp = parent.getComponent(i);
79 Dimension d = comp.getMinimumSize();
80 if (w[c] < d.width) {
81 w[c] = d.width;
82 }
83 if (h[r] < d.height) {
84 h[r] = d.height;
85 }
86 }
87 int nw = 0;
88 for (int j = 0; j < ncols; j ++) {
89 nw += w[j];
90 }
91 int nh = 0;
92 for (int i = 0; i < nrows; i ++) {
93 nh += h[i];
94 }
95 return new Dimension(insets.left + insets.right + nw + (ncols-1)*getHgap(),
96 insets.top + insets.bottom + nh + (nrows-1)*getVgap());
97 }
98 }
99
100 public void layoutContainer(Container parent) {
101
102 synchronized (parent.getTreeLock()) {
103 Insets insets = parent.getInsets();
104 int ncomponents = parent.getComponentCount();
105 int nrows = getRows();
106 int ncols = getColumns();
107 if (ncomponents == 0) {
108 return;
109 }
110 if (nrows > 0) {
111 ncols = (ncomponents + nrows - 1) / nrows;
112 }
113 else {
114 nrows = (ncomponents + ncols - 1) / ncols;
115 }
116 int hgap = getHgap();
117 int vgap = getVgap();
118
119 Dimension pd = preferredLayoutSize(parent);
120 double sw = (1.0 * parent.getWidth()) / pd.width;
121 double sh = (1.0 * parent.getHeight()) / pd.height;
122
123 int[] w = new int[ncols];
124 int[] h = new int[nrows];
125 for (int i = 0; i < ncomponents; i ++) {
126 int r = i / ncols;
127 int c = i % ncols;
128 Component comp = parent.getComponent(i);
129 Dimension d = comp.getPreferredSize();
130 d.width = (int) (sw * d.width);
131 d.height = (int) (sh * d.height);
132 if (w[c] < d.width) {
133 w[c] = d.width;
134 }
135 if (h[r] < d.height) {
136 h[r] = d.height;
137 }
138 }
139 for (int c = 0, x = insets.left; c < ncols; c ++) {
140 for (int r = 0, y = insets.top; r < nrows; r ++) {
141 int i = r * ncols + c;
142 if (i < ncomponents) {
143 parent.getComponent(i).setBounds(x, y, w[c], h[r]);
144 }
145 y += h[r] + vgap;
146 }
147 x += w[c] + hgap;
148 }
149 }
150 }
151 }