view usr/src/cmd/krb5/kadmin/gui/visualrt/sunsoft/jws/visual/rt/shadow/java/awt/WindowShadow.java @ 4:1a15d5aaf794

synchronized with onnv_86 (6202) in onnv-gate
author Koji Uno <koji.uno@sun.com>
date Mon, 31 Aug 2009 14:38:03 +0900
parents c9caec207d52
children
line wrap: on
line source

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * ident	"%Z%%M%	%I%	%E% SMI"
 *
 * Copyright (c) 2000 by Sun Microsystems, Inc.
 * All rights reserved.
 */

/*
 *        Copyright (C) 1996  Active Software, Inc.
 *                  All rights reserved.
 *
 * @(#) WindowShadow.java 1.119 - last change made 07/28/97
 */

package sunsoft.jws.visual.rt.shadow.java.awt;

import sunsoft.jws.visual.rt.base.*;
import sunsoft.jws.visual.rt.awt.*;
import sunsoft.jws.visual.rt.type.AnchorEnum;
import sunsoft.jws.visual.rt.base.Global;

import java.util.*;
import java.awt.*;

/* BEGIN JSTYLED */
/**
 * Wraps an AWT widget.  The attributes available for this
 * class are listed below.  In the type column, type names beginning
 * with "sunsoft.jws.visual.rt" have been abbreviated to begin with "rt".
 *
 * <pre>
 name            type                      default value
 -----------------------------------------------------------------------
 location        java.awt.Point            null
 size            java.awt.Dimension        null
 *  < /pre>
*
* location: location for the window, if the location is set before
* the window is mapped, then when the window is mapped, it will come
* up at the specified location.  If the location is set while the
* window is mapped, then window will immediately be moved to the new
* location.
*  < p>
* size: desired size for the window, if set before mapping, the
* window will later be mapped with this size.  However, the size
* dimensions are first checked to ensure that the dimensions are at
* least as big as the preferredSize. If set after mapping and
* non-null, the window will be resized to the new size after maxing
* with preferredSize.  "get" returns the value for the desired size,
* NOT the actual size of the window. The "size" attribute does not
* take effect when in layout mode.
*  < p>
* Check the super class for additional attributes.
*
* @see Window
* @version 1.119, 07/28/97
*/
/* END JSTYLED */

public class WindowShadow extends ContainerShadow {
    private static final int PADX = 100;
    private static final int PADY = 100;
    
    private static Point defaultLocation = new Point(100, 100);
    private static Dimension defaultSize = new Dimension(100, 100);
    
    private boolean packed = false;
    
    public static void setDefaultLocation(Point p) {
        defaultLocation = p;
    }
    
    public static Point getDefaultLocation() {
        return defaultLocation;
    }
    
    public static void setDefaultSize(Dimension d) {
        defaultSize = d;
    }
    
    public static Dimension getDefaultSize() {
        return defaultSize;
    }
    
    private boolean layoutMode = false;
    
    public WindowShadow() {
        attributes.remove(/* NOI18N */"GBConstraints");
        attributes.remove(/* NOI18N */"borderName");
        attributes.remove(/* NOI18N */"flowRank");
        attributes.remove(/* NOI18N */"anchor");
        attributes.remove(/* NOI18N */"insets");
        
        attributes.add(/* NOI18N */"visible",
		       /* NOI18N */"java.lang.Boolean", Boolean.TRUE, NONBODY);
        
        attributes.add(/* NOI18N */"location",
		       /* NOI18N */"java.awt.Point", null, 0);
        attributes.add(/* NOI18N */"layoutLocation",
		       /* NOI18N */"java.awt.Point", null, HIDDEN);
        attributes.add(/* NOI18N */"currentLocation",
		       /* NOI18N */"java.awt.Point", null,
		       HIDDEN | TRANSIENT | READONLY);
        
        attributes.add(/* NOI18N */"size",
		       /* NOI18N */"java.awt.Dimension", null, 0);
        attributes.add(/* NOI18N */"layoutSize",
		       /* NOI18N */"java.awt.Dimension", null, HIDDEN);
        attributes.add(/* NOI18N */"currentSize",
		       /* NOI18N */"java.awt.Dimension", null,
		       HIDDEN | TRANSIENT | READONLY);
    }
    
    protected boolean useLayoutLocation() {
        if (!layoutMode)
            return false;
        
        if (inDesignerRoot())
	    return true;
        
        Group g = getGroup();
        if (g == null)
            return false;
        
        if (DesignerAccess.getWindow(g) != this)
	    return false;
        
        return (g.inDesignerRoot());
    }
    
    protected boolean useLayoutSize() {
        return (layoutMode && inDesignerRoot());
    }
    
    protected Object getOnBody(String key) {
        Window win = (Window)body;
        
        if (key.equals(/* NOI18N */"location")) {
            return getFromTable(key);
        } else if (key.equals(/* NOI18N */"layoutLocation")) {
            if (useLayoutLocation()) {
                // fix for Sun bug #4037679: layout window locations
                // are not being remembered. This is because
                // win.location() returns the location that the window
                // was created with, rather than the screen location.
                // So if the window moved, the location() method
                // doesn't report the new location. However,
                // locationOnScreen() only works if the window is
                // actually showing. Otherwise it throws an exception.
                //   -- Simran. 5/7/97
                Point loc;
                try {
                    loc = win.getLocationOnScreen();
                } catch (IllegalComponentStateException e) {
                    loc = win.getLocation();
                }
                
                return loc;
            } else
                return getFromTable(key);
        } else if (key.equals(/* NOI18N */"currentLocation")) {
            return win.location();
        } else if (key.equals(/* NOI18N */"size")) {
            return getFromTable(key);
        } else if (key.equals(/* NOI18N */"layoutSize")) {
            if (useLayoutSize())
		return win.size();
            else
                return getFromTable(key);
        } else if (key.equals(/* NOI18N */"currentSize")) {
            return win.size();
        } else {
            return super.getOnBody(key);
        }
    }
    
    protected void setOnBody(String key, Object value) {
        Window win = (Window)body;
        
        if (key.equals(/* NOI18N */"location")) {
            putInTable(key, value);
            if (value != null && !useLayoutLocation()) {
                Point p = getWindowLocation(false);
                win.move(p.x, p.y);
            }
        } else if (key.equals(/* NOI18N */"layoutLocation")) {
            putInTable(key, value);
            if (value != null && useLayoutLocation()) {
                Point p = getWindowLocation(true);
                win.move(p.x, p.y);
            }
        } else if (key.equals(/* NOI18N */"size")) {
            putInTable(key, value);
            if (value != null && !useLayoutSize())
		win.resize(getWindowSize(win, false));
        } else if (key.equals(/* NOI18N */"layoutSize")) {
            putInTable(key, value);
            if (value != null && useLayoutSize())
		win.resize(getWindowSize(win, true));
        } else {
            super.setOnBody(key, value);
        }
    }
    
    // REMIND: if Window had a frame attribute like a dialog it could be
    // instantiated here (but would probably only work on Windows 96 at
    // the moment)
    public void createBody() {};
    
    protected void registerBody() {
        Window win = (Window)body;
        if (!(win.getLayout() instanceof GBLayout)) {
            GBLayout gridbag = new GBLayout();
            double w[] = {1};
            gridbag.columnWeights = w;
            gridbag.rowWeights = w;
            
            win.setLayout(gridbag);
        }
        
        super.registerBody();
    }
    
    protected void postCreate() {
        super.postCreate();
        
        if (body instanceof RootWindow) {
            if (layoutMode)
                ((RootWindow)body).layoutMode();
            else
                ((RootWindow)body).previewMode();
        }
        
        if (!doingShow())
	    showComponent(isVisible());
    }
    
    protected void preDestroy() {
        packed = false;
    }
    
    /**
     * Returns true if the window's group is currently visible,
     * and the window's visible attribute is set to true.
     */
    public boolean isVisible() {
        if (!hasAttribute(/* NOI18N */"visible"))
	    return false;
        
        Boolean v = (Boolean) getFromTable(/* NOI18N */"visible");
        if (!v.booleanValue())
	    return false;
        
        Group g = getRoot().getGroup();
        if (g != null)
            return g.isShowing();
        
        return true;
    }
    
    public void updateContainerAttribute(AttributeManager child,
					 String key, Object value) {
        if (key.equals(/* NOI18N */"anchor")) {
            GBConstraints c =
		(GBConstraints)child.get(/* NOI18N */"GBConstraints");
            if (c == null)
                return;
            
            int anchor = ((AnchorEnum)value).intValue();
            if (anchor != c.anchor) {
                c.anchor = anchor;
                child.set(/* NOI18N */"GBConstraints", c);
            }
        } else if (key.equals(/* NOI18N */"insets")) {
            GBConstraints c =
		(GBConstraints)child.get(/* NOI18N */"GBConstraints");
            if (c == null)
                return;
            
            Insets insets = (Insets)value;
            if (c.insets != insets) {
                c.insets = insets;
                child.set(/* NOI18N */"GBConstraints", c);
            }
        } else if (key.equals(/* NOI18N */"GBConstraints")) {
            GBConstraints c = (GBConstraints)value;
            if (c == null)
                c = new GBConstraints();
            
            Shadow s = (Shadow)child;
            Component comp = (Component)s.getBody();
            if (comp == null)
                return;
            
            int anchor =
		((AnchorEnum)child.get(/* NOI18N */"anchor")).intValue();
            c.anchor = anchor;
            c.insets = (Insets)child.get(/* NOI18N */"insets");
            
            GBLayout gb = (GBLayout)((Window)body).getLayout();
            gb.setConstraints(comp, c);
        }
    }
    
    public void pack() {
        checkCreate();
        
        // Get the body AFTER the call to checkCreate
        Window win = (Window)body;
        
        boolean hasPeer = (win.getPeer() != null);
        
        if (!hasPeer) {
            //
            // Workaround for SGI: When a frame is shown with size
            // (0,0), it will fill the entire screen area momentarily
            // until reshape is called.  This causes annoying
            // flickering behavior.
            //
            if (Global.isIrix()) {
                Dimension size = win.size();
                if (size.width == 0 || size.height == 0)
                    win.reshape(0, 0, 40, 40);
            }
            
            win.addNotify();
            
            Group g = getGroup();
            if (g != null && DesignerAccess.getWindow(g) == this)
		DesignerAccess.preValidate(g);
            
            preValidate();
        }
        
        // Reshape the window
        resizePreferredSize(win, hasPeer);
        
        // Validate the window.
        win.validate();
        
        // Set the packed flag to true
        packed = true;
    }
    
    /**
     * Shows the component.  Calling showComponent does not affect the
     * value of the visible attrbute.  You should use "show" instead of
     * "showComponent".  The only reason this method exists is that
     * Visual Java needs to use it in certain situations.
     */
    public void showComponent() {
        checkCreate();
        
        // Pack the window if necessary
        Window win = (Window)body;
        
        if (packed && win.getPeer() == null)
	    packed = false;
        
        if (!packed)
            pack();
        
        // Show the window
        win.show();
        
        // Usually, calling show() on a visible Window will bring it
        // to the front.  Unfortunately, it doesn't behave like this.
        if (Global.isWindows()) {
            win.toFront();
        }
        
        // Make sure the window shows up right away.  This tends to make
        // the user happier.
        win.getToolkit().sync();
    }
    
    protected void checkCreate() {
        // Call create if it hasn't already been called.
        if (!isCreated()) {
            doingShow = true;
            create();
            doingShow = false;
        }
    }
    
    private void resizePreferredSize(Window win, boolean hasPeer) {
        Point location = getWindowLocation(useLayoutLocation());
        Dimension size = getWindowSize(win, useLayoutSize());
        
        constrainToScreen(win, location, size);
        
        if (win instanceof Dialog) {
            // Adjust the location the first time the dialog is mapped
            // after the peer has been created.  There is an AWT bug
            // that screws up the location of the dialog, so we have
            // to make this adjustment.
            if (Global.isMotif() && !hasPeer) {
                location.x -= size.width/2;
                location.y -= size.height/2;
            }
            
            win.reshape(location.x, location.y, size.width, size.height);
        } else {
            if (hasPeer)
                win.resize(size.width, size.height);
            else
                win.reshape(location.x, location.y, size.width, size.height);
        }
    }
    
    private Point getDialogLocation(Dialog dialog) {
        Frame frame = (Frame)dialog.getParent();
        Point p = frame.location();
        Dimension fsize = frame.size();
        Dimension dsize = dialog.preferredSize();
        
        p.x += (fsize.width - dsize.width)/2;
        p.y += (fsize.height - dsize.height)/2;
        
        return p;
    }
    
    private Point getWindowLocation(boolean layoutLocation) {
        if (body instanceof Dialog)
            return getDialogLocation((Dialog)body);
        
        ContainerShadow panel = getPanel();
        Point location = null;
        
        if (layoutLocation) {
            if (panel != null)
                location = (Point) panel.get(/* NOI18N */"layoutLocation");
            else
                location = (Point) getFromTable(/* NOI18N */"layoutLocation");
            
            if (location == null)
                location = getDefaultLocation();
        } else {
            location = (Point) getFromTable(/* NOI18N */"location");
            
            if (location == null)
                location = getDefaultLocation();
        }
        
        return location;
    }
    
    private Dimension getWindowSize(Window win, boolean layoutSize) {
        ContainerShadow panel = getPanel();
        Dimension size;
        
        if (layoutSize) {
            if (panel != null)
                size = (Dimension) panel.get(/* NOI18N */"layoutSize");
            else
                size = (Dimension) getFromTable(/* NOI18N */"layoutSize");
            
            if (size == null)
                size = getDefaultSize();
        } else {
            Dimension prefSize = win.preferredSize();
            size = (Dimension) getFromTable(/* NOI18N */"size");
            
            if (size == null) {
                size = prefSize;
            } else {
                size.width = Math.max(size.width, prefSize.width);
                size.height = Math.max(size.height, prefSize.height);
            }
        }
        
        return size;
    }
    
    private void constrainToScreen(Window win, Point location, Dimension size) {
        // Constrain the window to fit on the screen
        Dimension screenSize = getScreenSize(win);
        
        int x = screenSize.width - size.width;
        if (location.x > x)
            location.x = x;
        if (location.x < 0)
            location.x = 0;
        
        int y = screenSize.height - size.height;
        if (location.y > y)
            location.y = y;
        if (location.y < 0)
            location.y = 0;
        
        int width = screenSize.width - location.x;
        if (size.width > width)
            size.width = width;
        
        int height = screenSize.height - location.y;
        if (size.height > height)
            size.height = height;
    }
    
    private Dimension getScreenSize(Window win) {
        Dimension d = win.getToolkit().getScreenSize();
        d.width -= 6;
        d.height -= 6;
        
        if (Global.isWindows95()) {
            // Subtract some extra space for the icon bar
            d.height -= 30;
        }
        
        return d;
    }
    
    private void recurseInvalidate(Component comp) {
        comp.invalidate();
        if (comp instanceof Container) {
            Container cntr = (Container)comp;
            int count = cntr.countComponents();
            for (int i = 0; i < count; i++)
                recurseInvalidate(cntr.getComponent(i));
        }
    }
    
    /**
     * Disposes of the AWT top-level window so that window system
     * resources are reclaimed.
     */
    protected void destroyBody() {
        //
        // Cache the location when the window is destroyed.
        //
        // "put" is called directly because "set" won't work if
        // "isPanel" is true.
        //
        if (useLayoutLocation()) {
            Point location = ((Window)body).location();
            putInTable(/* NOI18N */"layoutLocation", location);
        }
        
        ((Window)body).dispose();
        body = null;
    }
    
    /**
     * "isPanel" flag.  If this flag is set, then this frame exists only
     * to allow the panel to be edited in the builder.  When a saving or
     * generation is performed, this window should be omitted.
     */
    
    private boolean isPanel = false;
    private String prevTitle = /* NOI18N */"Unnamed Window";
    
    public boolean isPanel() {
        return isPanel;
    }
    
    public void isPanel(boolean isPanel) {
        if (this.isPanel != isPanel) {
            if (isPanel) {
                prevTitle = (String)get(/* NOI18N */"title");
                set(/* NOI18N */"title", /* NOI18N */"PANEL");
                this.isPanel = isPanel;		// this must be last
            } else {
                // Ordering is important here.  As soon as isPanel is
                // changed, the nature of this window changes (and
                // affects the isUniqueName call, for example.)  While
                // isPanel is still true, get("name") returns the name
                // of the surrounded panel.
                //
                this.isPanel = isPanel;		// this must be first
                
                // It is possible that a new frame has been imported
                // or created that has the same name as this one (that
                // was surrounding a panel and was invisible in the
                // hierarchy.)  Until a frame has isPanel set to
                // false, it is never included in a unique name check,
                // so make sure that the window's name is unique in
                // the Root tree.  If the frame isn't in a Root tree
                // then don't worry about it.
                //
                if (getRoot() != null) {
                    String name = (String) get(/* NOI18N */"name");
                    if ((name == null)
                        || !DesignerAccess.isUniqueName(getRoot(), name, this))
			set(/* NOI18N */"name",
			    DesignerAccess.getUniqueName(getRoot(), this));
                }
                
                set(/* NOI18N */"title", prevTitle);
            }
        }
    }
    
    /**
     * If the "isPanel" flag is set, all the attributes should come from
     * the child panel, not the frame.
     */
    
    public ContainerShadow getPanel() {
        if (!isPanel)
            return null;
        
        if (getChildCount() == 0)
	    return null;
        
        return (ContainerShadow)getChildList().nextElement();
    }
    
    // Bug 4054883 Mark Davison July 9, 1997
    // The next series of methods are implemented as a work around in which
    // attributes are set on the VJLayout frame instead of the GBPanel
    // if isPanel == false. This is just a quick and safe fix. The real solution
    // is to get rid of the isPanel flag and associated behaviour altogether.
    
    private static Class enclosingFrame = null;
    
    /**
     * Caching method which returns the enclosing frame (most likely VJLayout)
     */
    private Class getEnclosingFrameClass() {
        if (enclosingFrame == null)
            enclosingFrame = DesignerAccess.getFrameClass();
        
        return enclosingFrame;
    }
    
    /**
     * Tests to see if the object is an enclosing frame.
     */
    private boolean isEnclosingFrame(Object obj) {
        Class frame = getEnclosingFrameClass();
        if (frame != null && frame.isInstance(body))
	    return true;
        else
            return false;
    }
    
    /**
     * Puts the attribute on the enclosed PanelShadow rather than on the 
     * WindowShadow.
     * This bypasses the getPanel method because if VJLayout represents
     * a Frame
     * or Dialog, the attributes will be set on the VJLayout (which
     * is incorrect).
     */
    protected void setOnPanel(String key, Object value) {
        ContainerShadow panel = (ContainerShadow)getChildList().nextElement();
        if (panel != null && panel instanceof PanelShadow)
            panel.set(key, value);
    }
    
    /**
     * Retrieves the attributes from the panel thereby bypassing the
     * isPanel flag.
     */
    protected Object getOnPanel(String key) {
        ContainerShadow panel = (ContainerShadow)getChildList().nextElement();
        if (panel != null && panel instanceof PanelShadow)
            return panel.get(key);
        return null;
    }
    
    public void set(String key, Object value) {
        ContainerShadow panel = getPanel();
        
        if (panel != null &&
	    !key.equals(/* NOI18N */"location") &&
	    !key.equals(/* NOI18N */"layoutLocation") &&
	    !key.equals(/* NOI18N */"size") &&
	    !key.equals(/* NOI18N */"layoutSize")) {
            panel.set(key, value);
        } else if (key.equals(/* NOI18N */"visible")) {
            if (!hasAttribute(/* NOI18N */"visible"))
		return;
            
            Boolean oldValue, newValue;
            
            oldValue = (Boolean)get(/* NOI18N */"visible");
            newValue = (Boolean)value;
            
            // Don't let visible be set to false if we are the main
            // container and we are running inside vjava.
            if (inDesignerRoot() && isMainContainer()
		&& !newValue.booleanValue()) {
		    /* JSTYLED */
                throw new VJException(Global.getMsg("sunsoft.jws.visual.rt.awt.java.awt.WindowShadow.IllegalSetVisible"));
            }
            
            super.set(key, value);
            
            if (!doingShow()) {
                if (oldValue.booleanValue() != newValue.booleanValue()) {
                    showComponent(isVisible());
                }
            }
        } else {
            // If the body is an enclosing frame, the atributes should not be
            // set on the body.
            if (isEnclosingFrame(body)) {
                if (key.equals(/* NOI18N */"background") ||
		    key.equals(/* NOI18N */"foreground")) {
                    setOnPanel(key, value);
                    return;
                }
            }
            
            super.set(key, value);
        }
    }
    
    public Object get(String key) {
        ContainerShadow panel = getPanel();
        if (panel != null &&
	    !key.equals(/* NOI18N */"location") &&
	    !key.equals(/* NOI18N */"layoutLocation") &&
	    !key.equals(/* NOI18N */"size") &&
	    !key.equals(/* NOI18N */"layoutSize"))
	    return panel.get(key);
        else {
            // If the body is an enclosing frame, the atributes should
            // be retrieved from the panel.
            if (isEnclosingFrame(body)) {
                if (key.equals(/* NOI18N */"background") ||
		    key.equals(/* NOI18N */"foreground"))
		    return getOnPanel(key);
            }
            
            return super.get(key);
        }
    }
    
    public String getType(String key) {
        ContainerShadow panel = getPanel();
        if (panel != null)
            return panel.getType(key);
        else
            return super.getType(key);
    }
    
    public int getFlags(String key) {
        ContainerShadow panel = getPanel();
        if (panel != null)
            return panel.getFlags(key);
        else
            return super.getFlags(key);
    }
    
    public boolean hasAttribute(String key) {
        ContainerShadow panel = getPanel();
        if (panel != null)
            return panel.hasAttribute(key);
        else
            return super.hasAttribute(key);
    }
    
    public boolean hasAttribute(String key, String type) {
        ContainerShadow panel = getPanel();
        if (panel != null)
            return panel.hasAttribute(key, type);
        else
            return super.hasAttribute(key, type);
    }
    
    public AttributeList getAttributeList() {
        ContainerShadow panel = getPanel();
        if (panel != null)
            return panel.getAttributeList();
        else
            return super.getAttributeList();
    }
    
    public void refetchAttributeList() {
        ContainerShadow panel = getPanel();
        if (panel != null)
            panel.refetchAttributeList();
        else
            super.refetchAttributeList();
    }
    
    public void layoutMode() {
        super.layoutMode();
        setLayout(true);
    }
    
    public void previewMode() {
        super.previewMode();
        setPreview(true);
    }
    
    public void setLayout(boolean shouldResize) {
        if (layoutMode)
            return;
        
        layoutMode = true;
        
        if (body != null) {
            Window win = (Window)body;
            
            if (body instanceof RootWindow)
                ((RootWindow)body).layoutMode();
            
            if (shouldResize) {
                if (win.getPeer() != null) {
                    if (useLayoutLocation() || useLayoutSize()) {
                        Point p = getWindowLocation(useLayoutLocation());
                        Dimension d = getWindowSize(win, useLayoutSize());
                        win.reshape(p.x, p.y, d.width, d.height);
                    }
                }
                
                win.validate();
            }
        }
    }
    
    public void setPreview(boolean shouldResize) {
        if (!layoutMode)
            return;
        
        if (body != null) {
            Window win = (Window)body;
            
            if (win instanceof RootWindow)
                ((RootWindow)win).previewMode();
            
            if (shouldResize) {
                if (win.getPeer() != null) {
                    if (useLayoutLocation()) {
                        putInTable(/* NOI18N */"layoutLocation",
				   win.location());
                    }
                    if (useLayoutSize()) {
                        putInTable(/* NOI18N */"layoutSize", win.size());
                    }
                    
                    if (useLayoutLocation() || useLayoutSize()) {
                        // fix for bug id 1263220 -kp commented out
                        // was in their originally
                        //	    Point p = getWindowLocation(false);
                        Point p = getWindowLocation(useLayoutLocation());
                        Dimension d = getWindowSize(win, false);
                        constrainToScreen(win, p, d);
                        win.reshape(p.x, p.y, d.width, d.height);
                    }
                }
                
                win.validate();
            }
        }
        
        layoutMode = false;
    }
    
    public Dimension previewSize() {
        boolean isLayout = layoutMode;
        
        if (isLayout) {
            setPreview(false);
            super.previewMode();
        }
        
        Dimension size = ((Window)body).preferredSize();
        size = new Dimension(size.width, size.height);
        
        if (isLayout) {
            setLayout(false);
            super.layoutMode();
        }
        
        return size;
    }
    
    public boolean handleEvent(Message msg, Event evt) {
        if (msg.target == this && evt.id == Event.WINDOW_MOVED) {
            ContainerShadow panel = getPanel();
            if (panel != null) {
                boolean dirty = DesignerAccess.getChangesMade();
                panel.set(/* NOI18N */"layoutLocation",
			  get(/* NOI18N */"layoutLocation"));
                panel.set(/* NOI18N */"layoutSize",
			  get(/* NOI18N */"layoutSize"));
                DesignerAccess.setChangesMade(dirty);
            }
        }
        
        return super.handleEvent(msg, evt);
    }
}