view usr/src/cmd/krb5/kadmin/gui/visualrt/sunsoft/jws/visual/rt/shadow/CardPanelShadow.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.
 *
 * @(#) CardPanelShadow.java 1.33 - last change made 07/25/97
 */

package sunsoft.jws.visual.rt.shadow;

import sunsoft.jws.visual.rt.awt.*;
import sunsoft.jws.visual.rt.base.*;
import sunsoft.jws.visual.rt.shadow.java.awt.*;

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

/**
 * CardPanelShadow - Panel with card layout.
 * 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
-----------------------------------------------------------------------
cards           [Lrt.shadow.GBPanelShadow initial label
delayedCreation java.lang.Boolean         true
currentCard     java.lang.String          null
*  < /pre>
*
* Check the super class for additional attributes. < p>
*
* The "delayedCreation" attribute delays the creation of cards until
* after they are shown.  This is good for performance.  But it is bad
* because the initial size of the card panel will be determined by the
* first card, and not by the largest card in the panel.  So if
* "delayedCreation" is set to true, you need to make sure that the
* initial card is bigger than all the other cards.
*
* @see CardLayout
* @version 	1.33, 07/25/97
*/
public class CardPanelShadow extends VJPanelShadow {
    
    protected CardPanel cardPanel;
    private GBPanelShadow cards[];
    
    // Layout mode stuff
    private boolean inDesignerRoot;
    private Choice cardMenu;
    private GBLayout gridbag;
    private GBConstraints cardMenuConstraints;
    
    public CardPanelShadow() {
        attributes.add(/* NOI18N */"cards",
	       /* NOI18N */"[Lsunsoft.jws.visual.rt.shadow.GBPanelShadow;",
		       null, DEFAULT | TRANSIENT);
        attributes.add(/* NOI18N */"delayedCreation",
		       /* NOI18N */"java.lang.Boolean", Boolean.FALSE, 0);
        attributes.add(/* NOI18N */"currentCard",
		       /* NOI18N */"java.lang.String", null,
		       HIDDEN | TRANSIENT);
    }
    
    //
    // Public methods
    //
    
    public void show(String name) {
        set(/* NOI18N */"currentCard", name);
    }
    
    public GBPanelShadow getCard(String name) {
        GBPanelShadow cards[] = getCards();
        String str;
        
        for (int i = 0; i < cards.length; i++) {
            str = (String)cards[i].get(/* NOI18N */"layoutName");
            if (str != null && str.equals(name))
                return cards[i];
        }
        
        return null;
    }
    
    //
    // Attributes
    //
    
    protected Object getOnBody(String key) {
        if (key.equals(/* NOI18N */"cards")) {
            return getCards();
        } else if (key.equals(/* NOI18N */"delayedCreation")) {
            return getFromTable(key);
        } else if (key.equals(/* NOI18N */"currentCard")) {
            return cardPanel.getCurrentCard();
        } else {
            return super.getOnBody(key);
        }
    }
    
    protected void setOnBody(String key, Object value) {
        if (key.equals(/* NOI18N */"cards")) {
            setCards((GBPanelShadow[])value);
        } else if (key.equals(/* NOI18N */"delayedCreation")) {
            putInTable(key, value);
            if (!((Boolean)value).booleanValue())
                create();
        } else if (key.equals(/* NOI18N */"currentCard")) {
            if (value != null)
                cardPanel.show((String)value);
        } else {
            super.setOnBody(key, value);
        }
    }
    
    public void updateContainerAttribute(AttributeManager child,
					 String key, Object value) {
        if (!key.equals(/* NOI18N */"layoutName"))
            return;
        
        GBPanelShadow cards[] = getCards();
        int i;
        for (i = 0; i < cards.length; i++) {
            if (cards[i] == child)
                break;
        }
        
        String name = (String)value;
        if (name == null)
            name = /* NOI18N */"null";
        
        if (cardPanel != null) {
            Component comp = (Component)((Shadow)child).getBody();
            if (comp != null)
                cardPanel.renameTab(cardPanel.getCardName(comp), name);
            else
                cardPanel.renameTab(cardPanel.getTab(i), name);
        }
    }
    
    //
    // Private methods
    //
    
    private void createCard(String name) {
        GBPanelShadow card = getCard(name);
        if (card != null) {
            if (!card.isCreated()) {
                Group base = null;
                Group g = getGroup();
                if (g != null)
                    base = g.getBase();
                
                if (base != null)
                    base.setCursor(Frame.WAIT_CURSOR);
                card.create();
                if (base != null)
                    base.setCursor(Group.RESTORE_CURSOR);
            }
        }
    }
    
    private void updateCards() {
        GBPanelShadow cards[] = getCards();
        Component comp;
        
        for (int i = 0; i < cards.length; i++) {
            comp = (Component)cards[i].getBody();
            
            boolean shadowVisible =
		/* JSTYLED */
		((Boolean)cards[i].get(/* NOI18N */"visible")).booleanValue();
            boolean compVisible =
		(comp == null) ? false : comp.isVisible();
            
            
            if (shadowVisible != compVisible) {
                // Update the card in the option menu
                if (compVisible && cardMenu != null)
                    cardMenu.select(i);
                
                cards[i].set(/* NOI18N */"visible",
			     new Boolean(compVisible));
            }
        }
    }
    
    protected synchronized GBPanelShadow[] getCards() {
        if (cards == null) {
            int i = 0;
            cards = new GBPanelShadow[getChildCount()];
            
            Enumeration e = getChildList();
            while (e.hasMoreElements())
                cards[i++] = (GBPanelShadow)e.nextElement();
        }
        
        return cards;
    }
    
    protected void setCards(GBPanelShadow cards[]) {
        boolean showFirst = false;
        GBPanelShadow currentCard = getCard(cardPanel.getCurrentCard());
        
        // Remove all cards, and destroy cards that are no longer used.
        Enumeration e = getChildList();
        while (e.hasMoreElements()) {
            GBPanelShadow s = (GBPanelShadow)e.nextElement();
            
            remove(s);
            
            if (cards == null) {
                if (s == currentCard)
                    showFirst = true;
                s.destroy();
            } else {
                int i;
                for (i = 0; i < cards.length; i++) {
                    if (cards[i] == s)
                        break;
                }
                if (i == cards.length) {
                    if (s == currentCard)
                        showFirst = true;
                    s.destroy();
                }
            }
        }
        
        if (cards != null) {
            boolean createFirst = true;
            
            for (int i = 0; i < cards.length; i++) {
                if (cards[i].getParent() != this) {
                    // All new cards start out non-visible
                    cards[i].set(/* NOI18N */"visible", Boolean.FALSE);
                    add(cards[i]);
                    
                    // Make sure the card is created if we
                    // are not delaying creation.
                    if (!isDelayed()) {
                        cards[i].create();
                    }
                } else if (cards[i] == currentCard) {
                    createFirst = false;
                }
            }
            
            if (createFirst && cards.length > 0 && isDelayed()) {
                cards[0].create();
            }
        }
        
        this.cards = cards;
        
        if (showFirst && cards.length > 0) {
            cardPanel.show(
		(String)cards[0].get(/* NOI18N */"layoutName"));
        }
        
        resetChoice();
    }
    
    private boolean isDelayed() {
        return (
	    (Boolean)get(/* NOI18N */"delayedCreation")).booleanValue();
    }
    
    private void resetChoice() {
        if (inDesignerRoot) {
            GBPanelShadow cards[] = getCards();
            Panel panel = (Panel)body;
            
            if (cardMenu != null) {
                panel.remove(cardMenu);
                cardMenu.removeNotify();
                cardMenu = null;
            }
            
            if (cards != null && cards.length != 0) {
                cardMenu = new Choice();
                
                for (int i = 0; i < cards.length; i++)
                    cardMenu.addItem(
			(String)cards[i].get(/* NOI18N */"layoutName"));
                
                gridbag.setConstraints(((Panel)body).add(cardMenu),
				       cardMenuConstraints);
                
                String current = cardPanel.getCurrentCard();
                if (current != null)
                    cardMenu.select(current);
            }
        }
    }
    
    public void add(AttributeManager child) {
        if (cardPanel != null)
            cardPanel.addTab(
		(String)child.get(/* NOI18N */"layoutName"));
        cards = null;
        
        super.add(child);
    }
    
    public void remove(AttributeManager child) {
        if (cardPanel != null)
            cardPanel.removeTab(
		(String)child.get(/* NOI18N */"layoutName"));
        cards = null;
        
        super.remove(child);
    }
    
    public void addChildBody(Shadow child) {
        if (body != null) {
            cardPanel.addCard(
		(String)child.get(/* NOI18N */"layoutName"),
		(Component)child.getBody());
            updateContainerAttributes((AMContainer)this, child);
        }
    }
    
    public void removeChildBody(Shadow child) {
        if (body != null) {
            // Cause the card to be removed, but not the tab
            //  (if the tab is still there).
            String name = (String)child.get(/* NOI18N */"layoutName");
            int index = cardPanel.getTabIndex(name);
            if (index != -1) {
                cardPanel.removeTab(name);
                cardPanel.addTab(name, index);
            }
        }
    }
    
    public void createChildren() {
        if (isDelayed()) {
            super.createChildren();
        } else {
            // Force creation of all the children
            Enumeration e = getChildList();
            while (e.hasMoreElements()) {
                AttributeManager mgr =
		    (AttributeManager) e.nextElement();
                mgr.create();
            }
        }
    }
    
    public void createBody() {
        inDesignerRoot = inDesignerRoot();
        
        if (inDesignerRoot) {
            gridbag = new GBLayout();
            GBConstraints c = new GBConstraints();
            
            VJPanel panel = new VJPanel();
            panel.setLayout(gridbag);
            
            c.insets = new Insets(2, 2, 3, 5);
            c.gridx = 0;
            c.gridy = 0;
            cardMenuConstraints = (GBConstraints)c.clone();
            
            cardPanel = new CardPanel();
            c.insets = new Insets(2, 2, 2, 2);
            c.gridx = 0;
            c.gridy = 1;
            c.weightx = 1;
            c.weighty = 1;
            c.fill = GBConstraints.BOTH;
            gridbag.setConstraints(panel.add(cardPanel), c);
            
            body = panel;
        } else {
            cardPanel = new CardPanel();
            body = cardPanel;
        }
    }
    
    public CardPanel getCardPanel() {
        return cardPanel;
    }
    
    protected void registerBody() {
        GBPanelShadow cards[] = getCards();
        for (int i = 0; i < cards.length; i++) {
            cardPanel.addTab(
		(String)cards[i].get(/* NOI18N */"layoutName"));
        }
        
        super.registerBody();
    }
    
    protected void postCreate() {
        super.postCreate();
        
        if (inDesignerRoot)
            resetChoice();
    }
    
    protected void destroyBody() {
        super.destroyBody();
        cardPanel = null;
        cardMenu = null;
    }
    
    //
    // Layout and preview modes
    //
    
    public void layoutMode() {
        super.layoutMode();
        
        if (inDesignerRoot) {
            VJPanel panel = (VJPanel)body;
            
            if (cardMenu != null)
                cardMenu.show();
            
            GBConstraints c = gridbag.getConstraints(cardPanel);
            c.insets = new Insets(2, 2, 2, 2);
            gridbag.setConstraints(cardPanel, c);
        }
    }
    
    public void previewMode() {
        super.previewMode();
        
        if (inDesignerRoot) {
            if (cardMenu != null)
                cardMenu.hide();
            
            GBConstraints c = gridbag.getConstraints(cardPanel);
            c.insets = null;
            gridbag.setConstraints(cardPanel, c);
        }
    }
    
    //
    // Events
    //
    
    public boolean handleEvent(Message msg, Event evt) {
        if (evt.target == cardPanel) {
            if (evt.id == CardPanel.CURRENTCARD) {
                updateCards();
            } else if (evt.id == CardPanel.FETCHCARD) {
                if (isDelayed())
                    createCard((String)evt.arg);
            }
        }
        
        return super.handleEvent(msg, evt);
    }
    
    public boolean action(Message msg, Event evt, Object what) {
        if (cardMenu != null && msg.target == cardMenu) {
            cardPanel.show((String)what);
        }
        
        return false;
    }
}