alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.modules.form.palette;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;
import java.util.*;
import java.io.*;
import java.lang.reflect.*;
import java.beans.*;

import org.openide.*;
import org.openide.nodes.*;
import org.openide.util.*;
import org.openide.loaders.*;
import org.openide.filesystems.*;

import org.netbeans.modules.form.FormLoaderSettings;

/**
 * The CPManager represents Component Palette content.
 *
 * @author Josef Kozak, Tomas Pavek, Jan Stola
 */

public class CPManager implements ActionListener {

    public static final String PROP_SELECTEDITEM = "selectedItem"; // NOI18N
    public static final String PROP_PALETTE_CONTENT = "paletteContent"; // NOI18N

    /** The instance of CPManager (singleton). */
    private static CPManager instance;   

    //:::::::::::::::::::::::::::::::::::::

    /** PaletteItem which is currently selected (in Add mode). */
    private PaletteItem selectedPaletteItem = null;
        
    /** The support for firing property changes */
    private PropertyChangeSupport propertySupport;
        
    /** Listener of each category in the palette */
    private NodeListener categoryNodeListener;
    
    /** Root palette node - provides palette content (categories and items) */
    private PaletteNode paletteNode;

    /** Category nodes. */
    private Node[] categoryNodes;
   
    /** Selected category node. */
    private Node selectedNode = null;
    
    /** The base component in that component palette is plugged */
    private JComponent palette; // = new JPanel();
    
    /** All items that are in Component Palette (multiple items are not allowed) */
    private PaletteItem[] allItems = null;
    
    /** Determines whether the component palette is about to refresh. */
    private boolean awaitingUpdate = false;

    //:::::::::::::::::::::::::::::::::::::
    
    
    /** Create new instance of CPManager */
    private CPManager() {
        t("-BEG"); // NOI18N
        propertySupport = new PropertyChangeSupport(this);
        paletteNode = PaletteNode.getPaletteNode();

        FormLoaderSettings.getInstance().addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                if (FormLoaderSettings.PROP_SHOW_COMPONENTS_NAMES.equals(evt.getPropertyName())) {
                    propertySupport.firePropertyChange(FormLoaderSettings.PROP_SHOW_COMPONENTS_NAMES, evt.getOldValue(), evt.getNewValue());
                }
            }
        });

        paletteNode.addNodeListener(new NodeAdapter() {
            public void childrenAdded(NodeMemberEvent evt) {
                t("categories added"); // NOI18N
                categoryNodes = null;
                NodeListener listener = getCategoryListener();
                Node[] nodes = evt.getDelta();
                for (int i=0; i < nodes.length; i++)
                    if (PaletteUtils.isValidCategoryNode(nodes[i], false)) {
                        nodes[i].removeNodeListener(listener); // for sure
                        nodes[i].addNodeListener(listener);
                    }
                updatePalette();
            }

            public void childrenRemoved(NodeMemberEvent evt) {
                t("categories removed"); // NOI18N
                categoryNodes = null;
                NodeListener listener = getCategoryListener();
                Node[] nodes = evt.getDelta();
                for (int i=0; i < nodes.length; i++) {
                    nodes[i].removeNodeListener(listener);
                }
                updatePalette();
            }

            public void childrenReordered(NodeReorderEvent evt) {
                t("categories reordered"); // NOI18N
                categoryNodes = null;
                updatePalette();
            }
        });

        t("-END"); // NOI18N
    }
    
    /** Getter for singleton instance of CPManager */
    public synchronized static CPManager getDefault() {
        if (instance == null)
            instance = new CPManager();
        return instance;
    }
    
    /** Sets if UI should display names of beans with beanicons */
    public void setShowComponentsNames(boolean value) {
        FormLoaderSettings.getInstance().setShowComponentsNames(value);
    }
    
    /** Gets if UI should display names of beans with beanicons */
    public boolean getShowComponentsNames() {
        return FormLoaderSettings.getInstance().getShowComponentsNames();
    }    

    /** Get nodes representing palette categories. */
    public Node[] getCategoryNodes() {
        if (categoryNodeListener == null) { // #39599
            Node[] nodes = PaletteUtils.getCategoryNodes(paletteNode, false);
            for (int i=0; i < nodes.length; i++)
                nodes[i].addNodeListener(getCategoryListener());
        }

        if (categoryNodes == null)
            categoryNodes = PaletteUtils.getCategoryNodes(paletteNode, true);

        return categoryNodes;
    }

    /** Get nodes representing palette itmes of given category. */
    public static Node[] getItemNodes(Node categoryNode) {
        return PaletteUtils.getItemNodes(categoryNode, true);
    }

    /** Get the base component in that component palette is plugged */
    public JComponent getPalette() {
        if (palette == null)
            palette = new CPComponentLarge(this);
        return palette;
    }
    
    /** Returns the currently selected PaletteNode(that represents a JavaBean to
     * be added to the form) or null for selection mode.
     * @return the currently selected PaletteNode or null for selection mode
     */
    public PaletteItem getSelectedItem() {
        return selectedPaletteItem;
    }
    
    /** Sets the current add component or selection mode.
     * @param value The new add component or null for selection mode
     */
    public void setSelectedItem(PaletteItem newItem) {
        if (newItem == selectedPaletteItem)
            return;
        
        PaletteItem oldItem = selectedPaletteItem;
        selectedPaletteItem = newItem;

        propertySupport.firePropertyChange(PROP_SELECTEDITEM, oldItem, newItem);
    }
    
    void setSelectedCategoryNode(Node selectedNode) {
        this.selectedNode = selectedNode;
    }
    
    Node getSelectedCategoryNode() {
        return selectedNode;
    }

    /** Get all items that are in Component Palette (multiple items are not allowed) */
    public PaletteItem[] getAllItems() {
        if (allItems == null || allItems.length == 0) {
            ArrayList items = new ArrayList(80);
            Set keys = new HashSet(80);
        
            Node[] categoryNodes = PaletteUtils.getCategoryNodes(paletteNode, false);
            for (int i=0; i < categoryNodes.length; i++) {
                Node[] itemNodes = PaletteUtils.getItemNodes(categoryNodes[i], true);
                for (int j=0; j < itemNodes.length; j++) {
                    PaletteItem item = (PaletteItem) itemNodes[j].getCookie(PaletteItem.class);
                    if (item != null && !keys.contains(item.getId())) {
                        keys.add(item.getId());
                        items.add(item);
                    }
                }
            }
            allItems = new PaletteItem[items.size()];
            items.toArray(allItems);
        }
        return allItems;
    }

    void resetPalette() {
        DataObject[] categories = PaletteUtils.getPaletteDataFolder().getChildren();
        for (int i=0; i < categories.length; i++) {
            if (categories[i] instanceof DataFolder) {
                DataObject[] items = ((DataFolder)categories[i]).getChildren();
                for (int j=0; j < items.length; j++) {
                    if (items[j] instanceof PaletteItemDataObject) {
                        PaletteItemDataObject itemDO = (PaletteItemDataObject)items[j];
                        if (itemDO.isFileRead())
                            itemDO.reloadFile();
                    }
                }
            }
        }
    }

    //:::::::::::::::::::::::::::::::::::::
    
    /** Get the bundle of whole Component Palette */
    public static ResourceBundle getBundle() {
        return NbBundle.getBundle(CPManager.class);
    }

    private NodeListener getCategoryListener() {
        if (categoryNodeListener == null)
            categoryNodeListener = new NodeAdapter() {
                public void childrenAdded(NodeMemberEvent evt) {
                    Node node = (Node) evt.getSource();
                    t("items added to: " + node.getName()); // NOI18N
                    updatePalette();
                }

                public void childrenRemoved(NodeMemberEvent evt) {
                    Node node = (Node) evt.getSource();
                    t("items removed from: " + node.getName()); // NOI18N
                    updatePalette();
                }

                public void childrenReordered(NodeReorderEvent evt) {
                    Node node = (Node) evt.getSource();
                    t("items reordered in: " + node.getName()); // NOI18N
                    updatePalette();
                }

                public void propertyChange(PropertyChangeEvent evt) {
                    if (Node.PROP_NAME.equals(evt.getPropertyName())
                    || Node.PROP_DISPLAY_NAME.equals(evt.getPropertyName())) {
                        Node node = (Node) evt.getSource();
                        t("category node " + evt.getOldValue() // NOI18N
                        + " renamed to " + evt.getNewValue()); // NOI18N
                        updatePalette();
                    }
                }
            };
        return categoryNodeListener;
    }

    //:::::::::::::::::::::::::::::::::::::

    /** Add property listener */
    public void addPropertyChangeListener(PropertyChangeListener l) {
        propertySupport.addPropertyChangeListener(l);
    }

    /** Remove property listener */
    public void removePropertyChangeListener(PropertyChangeListener l) {
        propertySupport.removePropertyChangeListener(l);
    }
    
    private synchronized void updatePalette() {
        if (!awaitingUpdate) {
            // Avoid frequent refresh - collect events
            awaitingUpdate = true;
            Timer timer = new Timer(250, this);
            timer.setRepeats(false);
            timer.start();
        }
    }
    
    /** Called by the timer to force component palette update. */
    public synchronized void actionPerformed(ActionEvent event) {
        awaitingUpdate = false;
        propertySupport.firePropertyChange(PROP_PALETTE_CONTENT, null, null);
    }
    
    //:::::::::::::::::::::::::::::::::::::

    /** For debugging purposes only. */
    static private final boolean TRACE = false;
    
    /** For debugging purposes only. */
    static private void t(String str) {
        if (TRACE)
            if (str != null)
                System.out.println("CPManager: " + str); // NOI18N
            else
                System.out.println(""); // NOI18N
    }

}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.