1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * ident	"%Z%%M%	%I%	%E% SMI"
24 *
25 * Copyright (c) 2000 by Sun Microsystems, Inc.
26 * All rights reserved.
27 */
28
29/*
30 *        Copyright (C) 1996  Active Software, Inc.
31 *                  All rights reserved.
32 *
33 * @(#) GBPanel.java 1.35 - last change made 06/17/97
34 */
35
36package sunsoft.jws.visual.rt.awt;
37
38import sunsoft.jws.visual.rt.base.Global;
39
40import sunsoft.jws.visual.rt.base.*;
41import java.awt.*;
42
43public class GBPanel extends VJPanel {
44
45    private static Class gbclass;
46
47    private boolean runtime = true;
48    private GBContainer cntr;
49    private GBLayout mgr;
50
51    public GBPanel() {
52        setLayout(new GBLayout());
53    }
54
55    public boolean handleEvent(Event evt) {
56        if (cntr != null)
57            return cntr.handleEvent(evt);
58        else
59            return super.handleEvent(evt);
60    }
61
62    public void setRuntime(boolean rt) {
63        if (runtime == rt)
64            return;
65
66        runtime = rt;
67
68        if (runtime) {
69            cntr.setGBPanel(null);
70            cntr = null;
71        } else {
72            if (gbclass == null)
73                gbclass = DesignerAccess.getGBPanelClass();
74
75            try {
76                cntr = (GBContainer)gbclass.newInstance();
77            }
78            catch (IllegalAccessException ex) {
79                throw new Error(ex.toString());
80            }
81            catch (InstantiationException ex) {
82                throw new Error(ex.toString());
83            }
84
85            cntr.setGBPanel(this);
86        }
87    }
88
89    public GBContainer getGBContainer() {
90        return cntr;
91    }
92
93    //
94    // Special hack for flow layout so that it
95    // can re-adjust its vertical
96    // size based on the horizontal space available.
97    // This method is needed
98    // to make the flow layout take up more space
99    // vertically when it runs
100    // short on horizontal space.
101    //
102    public void layout() {
103        boolean hasFlow = false;
104        int count = countComponents();
105        GBLayout gridbag = (GBLayout)getLayout();
106        Component comp;
107        LayoutManager mgr;
108
109        for (int i = 0; i < count; i++) {
110            comp = getComponent(i);
111            if (comp instanceof Container) {
112                mgr = ((Container)comp).getLayout();
113                if (mgr instanceof VJFlowLayout) {
114                    hasFlow = true;
115                    ((VJFlowLayout)mgr).setMinimumWidth(0);
116                }
117            }
118        }
119
120        if (hasFlow) {
121            gridbag.layoutContainerNoReshape(this);
122
123            for (int i = 0; i < count; i++) {
124                comp = getComponent(i);
125                if (comp instanceof Container) {
126                    mgr = ((Container)comp).getLayout();
127                    if (mgr instanceof VJFlowLayout) {
128                        GBConstraints c = gridbag.getConstraints(comp);
129                        if (c.size != null)
130                            ((VJFlowLayout)mgr).setMinimumWidth(
131								c.size.width);
132                    }
133                }
134            }
135        }
136
137        super.layout();
138
139        if (hasFlow) {
140            for (int i = 0; i < count; i++) {
141                comp = getComponent(i);
142                if (comp instanceof Container) {
143                    mgr = ((Container)comp).getLayout();
144                    if (mgr instanceof VJFlowLayout) {
145                        ((VJFlowLayout)mgr).setMinimumWidth(0);
146                    }
147                }
148            }
149        }
150
151        if (cntr != null)
152            cntr.layout();
153    }
154
155    //
156    // Forwarding of container methods
157    //
158
159    public void setLayout(LayoutManager mgr) {
160        if (cntr != null)
161            cntr.setLayout(mgr);
162        else
163            super.setLayout(mgr);
164        updateLayout();
165    }
166
167    public void setLayoutSuper(LayoutManager mgr) {
168        super.setLayout(mgr);
169        updateLayout();
170    }
171
172    private void updateLayout() {
173        LayoutManager m = getLayout();
174        if (m instanceof GBLayout)
175            mgr = (GBLayout)m;
176        else
177            mgr = null;
178    }
179
180    // #ifdef JDK1.1
181    protected void addImpl(Component comp, Object constraints,
182			   int index) {
183        super.addImpl(comp, constraints, index);
184        doAdd(comp);
185    }
186    // #else
187    // public Component add(Component comp, int pos) {
188    //   super.add(comp, pos);
189    //   doAdd(comp);
190    //   return comp;
191    // }
192    // #endif
193
194
195    private void doAdd(Component comp) {
196        if (cntr != null)
197            cntr.add(comp);
198    }
199
200    public void remove(Component comp) {
201        super.remove(comp);
202        if (cntr != null)
203            cntr.remove(comp);
204    }
205
206    public void removeAll() {
207        super.removeAll();
208        if (cntr != null)
209            cntr.removeAll();
210    }
211
212    public void update(Graphics g) {
213        if (Global.isWindows())
214            g = getGraphics();
215
216        if (cntr != null)
217            cntr.update(g);
218
219        super.update(g);
220    }
221
222    public void paint(Graphics g) {
223        if (Global.isWindows())
224            g = getGraphics();
225
226        if (cntr != null)
227            cntr.paint(g);
228
229        super.paint(g);
230    }
231
232    public void reshape(int x, int y, int w, int h) {
233        super.reshape(x, y, w, h);
234        if (cntr != null)
235            cntr.reshape(x, y, w, h);
236    }
237
238    //
239    // Layout and Preview modes
240    //
241
242    public void layoutMode() {
243        if (cntr != null)
244            cntr.layoutMode();
245    }
246
247    public void previewMode() {
248        if (cntr != null)
249            cntr.previewMode();
250    }
251
252    //
253    // Constraints
254    //
255
256    public void setConstraints(Component comp, GBConstraints c) {
257        if (c == null)
258            /* JSTYLED */
259	    throw new Error(Global.getMsg("sunsoft.jws.visual.rt.awt.GBPanel.null__constraints"));
260
261        if (cntr != null)
262            cntr.setConstraints(comp, c);
263        else if (mgr != null)
264            mgr.setConstraints(comp, c);
265    }
266
267    public GBConstraints getConstraints(Component comp) {
268        if (cntr != null)
269            return cntr.getConstraints(comp);
270        else if (mgr != null)
271            return mgr.getConstraints(comp);
272        else
273            return null;
274    }
275
276    //
277    // GBLayout attributes
278    //
279
280    public void setColumnWeights(double w[]) {
281        if (cntr != null)
282            cntr.setColumnWeights(w);
283        else if (mgr != null)
284            mgr.columnWeights = w;
285    }
286
287    public void setRowWeights(double w[]) {
288        if (cntr != null)
289            cntr.setRowWeights(w);
290        else if (mgr != null)
291            mgr.rowWeights = w;
292    }
293
294    public double [] getColumnWeights() {
295        if (cntr != null)
296            return cntr.getColumnWeights();
297        else if (mgr != null)
298            return mgr.columnWeights;
299        else
300            return null;
301    }
302
303    public double [] getRowWeights() {
304        if (cntr != null)
305            return cntr.getRowWeights();
306        else if (mgr != null)
307            return mgr.rowWeights;
308        else
309            return null;
310    }
311
312    public void setColumnWidths(int w[]) {
313        if (cntr != null)
314            cntr.setColumnWidths(w);
315        else if (mgr != null)
316            mgr.columnWidths = w;
317    }
318
319    public void setRowHeights(int h[]) {
320        if (cntr != null)
321            cntr.setRowHeights(h);
322        else if (mgr != null)
323            mgr.rowHeights = h;
324    }
325
326    public int[] getColumnWidths() {
327        if (cntr != null)
328            return cntr.getColumnWidths();
329        else if (mgr != null)
330            return mgr.columnWidths;
331        else
332            return null;
333    }
334
335    public int[] getRowHeights() {
336        if (cntr != null)
337            return cntr.getRowHeights();
338        else if (mgr != null)
339            return mgr.rowHeights;
340        else
341            return null;
342    }
343}
344