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  * @(#) ComponentShadow.java 1.82 - last change made 08/05/97
34  */
35 
36 package sunsoft.jws.visual.rt.shadow.java.awt;
37 
38 import sunsoft.jws.visual.rt.base.*;
39 import sunsoft.jws.visual.rt.awt.GBLayout;
40 import sunsoft.jws.visual.rt.awt.GBConstraints;
41 import sunsoft.jws.visual.rt.type.AnchorEnum;
42 import sunsoft.jws.visual.rt.base.Global;
43 
44 import java.awt.Component;
45 import java.awt.Container;
46 import java.awt.Window;
47 import java.awt.LayoutManager;
48 import java.awt.SystemColor;
49 import java.awt.Color;
50 import java.awt.Font;
51 import java.awt.Frame;
52 import java.awt.Panel;
53 
54 /**
55  * Shadow class that wraps the AWT Component class.  The attributes
56  * available for this class are listed below.  Check the super class
57  * for additional attributes.
58  *
59  * <pre>
60 name            type                      default value
61 -----------------------------------------------------------------------
62 anchor          rt.type.AnchorEnum        center
63 background      java.awt.Color            null
64 enabled         java.lang.Boolean         true
65 font            java.awt.Font             null
66 foreground      java.awt.Color            null
67 GBConstraints   rt.awt.GBConstraints      new GBConstraints()
68 insets          java.awt.Insets           null
69 visible         java.lang.Boolean         true
70 *  < /pre>
71 *
72 * All shadow classes(except for the menu-related ones) include the
73 * attributes from the ComponentShadow class in addition to their own,
74 * and they do so by subclassing it.  This class is a super class and
75 * isn't available directly from the palette.
76 *
77 * @see Component
78 * @version 1.75, 05/02/97
79 */
80 public class ComponentShadow extends Shadow {
81 
82     // Set to true while a show operation is in progress
83     protected boolean doingShow = false;
84 
ComponentShadow()85     ComponentShadow() {
86         GBConstraints c = new GBConstraints();
87         c.gridx = 0;
88         c.gridy = 0;
89         attributes.add(/* NOI18N */"GBConstraints",
90 		       /* NOI18N */"sunsoft.jws.visual.rt.awt.GBConstraints",
91 		       c, HIDDEN | NONBODY | CONTAINER);
92 
93         attributes.add(/* NOI18N */"layoutName",
94 		       /* NOI18N */"java.lang.String", null,
95 		       HIDDEN | NONBODY | CONTAINER);
96         attributes.add(/* NOI18N */"anchor",
97 		       /* NOI18N */"sunsoft.jws.visual.rt.type.AnchorEnum",
98 		       new AnchorEnum(GBConstraints.CENTER),
99 		    NONBODY | CONTAINER);
100         attributes.add(/* NOI18N */"insets",
101 		       /* NOI18N */"java.awt.Insets",
102 		    null, NONBODY | CONTAINER);
103 
104         attributes.add(/* NOI18N */"visible",
105 		       /* NOI18N */"java.lang.Boolean", Boolean.TRUE,
106 		       HIDDEN | DEFAULT);
107         attributes.add(/* NOI18N */"enabled",
108 		       /* NOI18N */"java.lang.Boolean", Boolean.TRUE, DEFAULT);
109 
110         if (Global.isMotif()) {
111             // Default colors should be null for motif since they inherit the
112             // colors from the Containers.
113             attributes.add(/* NOI18N */"foreground",
114 			   /* NOI18N */"java.awt.Color",
115 			   null, DEFAULT | DONTFETCH);
116             attributes.add(/* NOI18N */"background",
117 			   /* NOI18N */"java.awt.Color",
118 			   null, DEFAULT | DONTFETCH);
119         } else {
120             // Component bg and fg must be explicitly set for
121             // Windows. Unfortunately, JDK implements setBackground
122             // and setForground the Motif way. That is, if the default
123             // color is null then retrieve the parent's color. This is
124             // not how the peer is implemented. For Windows, the
125             // container's colors are not inherited by the container.
126             attributes.add(/* NOI18N */"foreground",
127 			   /* NOI18N */"java.awt.Color",
128 			   SystemColor.controlText, DONTFETCH);
129             attributes.add(/* NOI18N */"background",
130 			   /* NOI18N */"java.awt.Color",
131 			   SystemColor.control, DONTFETCH);
132         }
133         attributes.add(/* NOI18N */"font",
134 		       /* NOI18N */"java.awt.Font", null,
135 		       DEFAULT | DONTFETCH);
136     }
137 
getOnBody(String key)138     protected Object getOnBody(String key) {
139         Component comp = (Component)body;
140 
141         if (key.equals(/* NOI18N */"visible"))
142 	    return (getFromTable(/* NOI18N */"visible"));
143         else if (key.equals(/* NOI18N */"enabled"))
144             return (new Boolean(comp.isEnabled()));
145         else if (key.equals(/* NOI18N */"foreground"))
146             return (comp.getForeground());
147         else if (key.equals(/* NOI18N */"background"))
148             return (comp.getBackground());
149         else if (key.equals(/* NOI18N */"font"))
150             return (comp.getFont());
151         else
152             return (super.getOnBody(key));
153     }
154 
set(String key, Object value)155     public void set(String key, Object value) {
156         if (key.equals(/* NOI18N */"visible")) {
157             boolean oldValue =
158 		((Boolean)getFromTable(/* NOI18N */"visible")).booleanValue();
159             boolean newValue = ((Boolean)value).booleanValue();
160 
161             if (newValue != oldValue) {
162                 if (newValue) {
163                     if (!isCreated()) {
164                         doingShow = true;
165                         create();
166                         doingShow = false;
167                     }
168 
169                     super.set(key, value);
170 
171                     if (this instanceof ContainerShadow)
172                         ((ContainerShadow)this).showGroups();
173                 } else {
174                     super.set(key, value);
175 
176                     if (this instanceof ContainerShadow)
177                         ((ContainerShadow)this).hideGroups();
178                 }
179 
180                 return;
181             }
182         }
183 
184         super.set(key, value);
185     }
186 
setOnBody(String key, Object value)187     protected void setOnBody(String key, Object value) {
188         Component comp = (Component)body;
189 
190         if (key.equals(/* NOI18N */"visible")) {
191             // Don't let visible be set to false if we are the main container
192             // and we are running inside vjava.
193             if (inDesignerRoot() && isMainContainer() &&
194 		!((Boolean)value).booleanValue()) {
195 		    /* JSTYLED */
196                 throw new VJException(Global.getMsg("sunsoft.jws.visual.rt.awt.java.awt.ComponentShadow.IllegalSetVisible"));
197             }
198 
199             // We don't need to use the doingShow() method, because
200             // the "visible" attribute has the DEFAULT flag set,
201             // therefore setOnBody will be called during creation for
202             // the "visible" attribute only if the "visible" attribute
203             // is false.
204             if (!doingShow)
205                 showComponent(((Boolean) value).booleanValue());
206         } else if (key.equals(/* NOI18N */"enabled"))
207             comp.setEnabled(((Boolean) value).booleanValue());
208         else if (key.equals(/* NOI18N */"foreground")) {
209             comp.setForeground((Color) value);
210         } else if (key.equals(/* NOI18N */"background")) {
211             comp.setBackground((Color) value);
212         } else if (key.equals(/* NOI18N */"font"))
213             comp.setFont((Font) value);
214         else
215             super.setOnBody(key, value);
216     }
217 
isMainContainer()218     protected boolean isMainContainer() {
219         Root r = getRoot();
220         if (r == null)
221             return false;
222 
223         AttributeManager mgr = r.getMainChild();
224         if (mgr instanceof WindowShadow) {
225             WindowShadow win = (WindowShadow)mgr;
226             if (win.isPanel())
227 		mgr = win.getPanel();
228         }
229 
230         return (mgr == this);
231     }
232 
createBody()233     public void createBody() {};
234 
235     /**
236      * Overrides destroyBody() in Shadow so that removeNotify() gets called on
237      * AWT components when there will be no more references to them.
238      */
destroyBody()239     protected void destroyBody() {
240         if (body != null) {
241             ((Component)body).removeNotify();
242             body = null;
243         }
244     }
245 
246     /**
247      * Calls show or hide, depending on the value of cond.
248      */
show(boolean cond)249     public void show(boolean cond) {
250         if (cond)
251             show();
252         else
253             hide();
254     }
255 
256     /**
257      * Sets the visible attribute to true.
258      */
show()259     public void show() {
260         set(/* NOI18N */"visible", Boolean.TRUE);
261     }
262 
263     /**
264      * Sets the visible attribute to false.
265      */
hide()266     public void hide() {
267         set(/* NOI18N */"visible", Boolean.FALSE);
268     }
269 
270     /**
271      * Calls showComponent or hideComponent, depending on the value of cond.
272      */
showComponent(boolean cond)273     public void showComponent(boolean cond) {
274         if (cond)
275             showComponent();
276         else
277             hideComponent();
278     }
279 
280     /**
281      * Shows the component.  Calling showComponent does not affect the
282      * value of the visible attrbute.  You should use "show" instead of
283      * "showComponent".  The only reason this method exists is that
284      * Visual Java needs to use it in certain situations.
285      */
showComponent()286     public void showComponent() {
287         // Call create if it hasn't already been called.
288         if (!isCreated()) {
289             doingShow = true;
290             create();
291             doingShow = false;
292         }
293 
294         ((Component)body).show();
295         validateMain();
296     }
297 
298     /**
299      * Hides the component.  Calling hideComponent does not affect the
300      * value of the visible attrbute.  You should use "hide" instead of
301      * "hideComponent".  The only reason this method exists is that
302      * Visual Java needs to use it in certain situations.
303      */
hideComponent()304     public void hideComponent() {
305         if (body != null)
306 	    {
307 		((Component)body).hide();
308 		validateMain();
309 	    }
310     }
311 
312     /**
313      * Returns true if we are doing a create operation in the
314      * middle of a show operation.  Create likes to call show if the
315      * visible attribute is set to true, but create shouldn't call
316      * show if show caused create to be called if the first place.
317      */
doingShow()318     protected boolean doingShow() {
319         if (doingShow) {
320             return true;
321         } else {
322             Group g = getGroup();
323             if (g != null)
324                 return DesignerAccess.doingShow(g);
325             else
326                 return false;
327         }
328     }
329 
330     /**
331      * Call validate to lay out the component and its children if they
332      * are not valid.
333      */
validate()334     public void validate() {
335         if (body != null)
336             ((Component)body).validate();
337     }
338 
339     /**
340      * Call invalidate to force the component to not be valid, so that
341      * it will be layed out again when validate is called.
342      */
invalidate()343     public void invalidate() {
344         if (body != null)
345             ((Component)body).invalidate();
346     }
347 
348     /**
349      * Returns the result from calling isShowing on the body.
350      */
isShowing()351     public boolean isShowing() {
352         if (body != null)
353             return ((Component)body).isShowing();
354         else
355             return false;
356     }
357 
validateMain()358     public void validateMain()
359     {
360         Root root = getRoot();
361         if (root == null)
362             return;
363         // Try the main container
364         AttributeManager mgr = root.getMainChild();
365         if (mgr instanceof Group)
366             mgr = DesignerAccess.getContainer((Group)mgr);
367 
368         if (mgr instanceof ContainerShadow)
369 	    {
370 		ContainerShadow fs = ((ContainerShadow)mgr);
371 		Container f = (Container)fs.getBody();
372 		f.validate();
373 	    }
374     }
375 }
376