Package org.openquark.gems.client.navigator

Source Code of org.openquark.gems.client.navigator.NavTreeCellRenderer

/*
* Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*     * Redistributions of source code must retain the above copyright notice,
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of Business Objects nor the names of its contributors
*       may be used to endorse or promote products derived from this software
*       without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/


/*
* NavTreeCellRenderer.java
* Creation date: Jul 4, 2003
* By: Frank Worsley
*/
package org.openquark.gems.client.navigator;

import java.awt.Component;
import java.util.HashMap;
import java.util.Map;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;

import org.openquark.cal.compiler.ScopedEntity;
import org.openquark.gems.client.GemCutter;
import org.openquark.util.ui.UIUtilities;


/**
* This class implements the cell renderer to use for the navigation tree.
* The cell renderer is the same as the default renderer except that it users custom icons.
*
* @author Frank Worsley
*/
public class NavTreeCellRenderer extends DefaultTreeCellRenderer {

    private static final long serialVersionUID = 7867708447965817398L;

    /** The icon for module nodes. */
    static final ImageIcon moduleNodeIcon = new ImageIcon(GemCutter.class.getResource("/Resources/nav_module.png"));
   
    /** The icon for namespace nodes. */
    static final ImageIcon namespaceNodeIcon = new ImageIcon(GemCutter.class.getResource("/Resources/nav_namespace.png"));
   
    /** The icon for vault nodes. */
    static final ImageIcon vaultNodeIcon = new ImageIcon(GemCutter.class.getResource("/Resources/nav_vault.gif"));
   
    /** The icon for function nodes. */
    static final ImageIcon functionNodeIcon = new ImageIcon(GemCutter.class.getResource("/Resources/nav_function.gif"));
   
    /** The icon for data constructor nodes. */
    static final ImageIcon dataConstructorNodeIcon = new ImageIcon(GemCutter.class.getResource("/Resources/nav_dataconstructor.gif"));
   
    /** The icon for type constructors nodes. */
    static final ImageIcon typeConstructorNodeIcon = new ImageIcon(GemCutter.class.getResource("/Resources/nav_typeconstructor.gif"));
   
    /** The icon for type class nodes. */
    static final ImageIcon typeClassNodeIcon = new ImageIcon(GemCutter.class.getResource("/Resources/nav_typeclass.gif"));
   
    /** The icon for class instance nodes. */
    static final ImageIcon classInstanceNodeIcon = new ImageIcon(GemCutter.class.getResource("/Resources/nav_classinstance.gif"));
  
    /** The icons representing the scopes of gem tree nodes, to be added to the gem icon */
    private static final ImageIcon SCOPE_PUBLIC_ICON = new ImageIcon(Object.class.getResource("/Resources/scope_public.gif"));
    private static final ImageIcon SCOPE_PROTECTED_ICON = new ImageIcon(Object.class.getResource("/Resources/scope_protected.gif"));
    private static final ImageIcon SCOPE_PRIVATE_ICON = new ImageIcon(Object.class.getResource("/Resources/scope_private.gif"));
   
    // Cache for the composite icons
    private final Map<Icon, Icon> imageCache_public = new HashMap<Icon, Icon>();
    private final Map<Icon, Icon> imageCache_protected = new HashMap<Icon, Icon>();
    private final Map<Icon, Icon> imageCache_private = new HashMap<Icon, Icon>();
    /**
     * @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean)
     */
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {

        JLabel renderer = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);

        // Use our custom icons instead of the default icon
        if (value instanceof NavModuleNode) {
            renderer.setIcon(moduleNodeIcon);
        } else if (value instanceof NavModuleNamespaceNode) {
            renderer.setIcon(namespaceNodeIcon);
        } else if (value instanceof NavVaultNode) {
            renderer.setIcon(vaultNodeIcon);
        } else if (value instanceof NavFunctionNode) {
            Icon scopedIcon = addScopeIcon (functionNodeIcon, (NavFunctionNode)value);
            renderer.setIcon(scopedIcon);
        } else if (value instanceof NavTypeConstructorNode) {
            Icon scopedIcon = addScopeIcon (typeConstructorNodeIcon, (NavTypeConstructorNode)value);
            renderer.setIcon(scopedIcon);
        } else if (value instanceof NavTypeClassNode) {
            Icon scopedIcon = addScopeIcon (typeClassNodeIcon, (NavTypeClassNode) value);
            renderer.setIcon(scopedIcon);
        } else if (value instanceof NavClassMethodNode) {
            Icon scopedIcon = addScopeIcon (functionNodeIcon, (NavClassMethodNode) value);
            renderer.setIcon(scopedIcon);
        } else if (value instanceof NavDataConstructorNode) {
            Icon scopedIcon = addScopeIcon (dataConstructorNodeIcon, (NavDataConstructorNode)value);
            renderer.setIcon(scopedIcon);
        } else if (value instanceof NavClassInstanceNode) {
            renderer.setIcon(classInstanceNodeIcon);
        } else if (value instanceof NavInstanceMethodNode) {
            renderer.setIcon(functionNodeIcon);
        }

        return renderer;
    }
   
    /**
     *  Add a scope decal (public, protected, private) to the base icon
     * @param baseImage the underlying icon
     * @param value the node that the new icon is being applied to
     * @return an combined icon that has the scope decal
     */
    private Icon addScopeIcon (Icon baseImage, NavEntityNode value){
        // Uses a cache to store icons already combined
        ScopedEntity entity = value.getEntity();
        Icon baseIcon = baseImage;
        Icon overlayIcon = null;
        Map<Icon, Icon> cache = null;

        if (entity.getScope().isPublic()) {
            cache = imageCache_public;
            overlayIcon = SCOPE_PUBLIC_ICON;

        } else if (entity.getScope().isProtected()) {
            cache = imageCache_protected;
            overlayIcon = SCOPE_PROTECTED_ICON;

        } else { //entity.getScope().isPrivate()
            cache = imageCache_private;
            overlayIcon = SCOPE_PRIVATE_ICON;
        }

        Icon cachedIcon = cache.get(baseIcon);
        if (cachedIcon != null) {
            return cachedIcon;

        } else {
            Icon newIcon = UIUtilities.combineIcons(baseIcon, overlayIcon);
            cache.put(baseIcon, newIcon);
            return newIcon;
        }
    }


}
TOP

Related Classes of org.openquark.gems.client.navigator.NavTreeCellRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.