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.beans.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

import org.openide.nodes.*;
import org.openide.util.HelpCtx;

import org.netbeans.modules.form.FormLoaderSettings;

/**
 * Tabbed pane mode of Component palette.
 *
 * @author Josef Kozak, Jan Rojcek, Tomas Pavek, Jan Stola
 */

public class CPComponentLarge extends JPanel
{
    /** The instance of CPComponentLarge (singleton). */
    protected static CPComponentLarge instance;

    /** The manager of Component Palette that serves functionality*/
    protected CPManager manager;

    /** Toolbar-like component allowing to select one category. */
    private CategorySelectPanel categorySelector;

    /** Panel showing list of items of selected category. */
    private CategoryPresentPanel categoryPresenter;

    /** Listener for various types of events */
    private Listener listener;

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

    /** Create new instance (implementation is in superclass) */
    CPComponentLarge(CPManager mgr) {
        manager = mgr;

        setLayout(new BorderLayout());
        setFocusCycleRoot(true);

        HelpCtx.setHelpIDString(this, "gui.components.palette"); // NOI18N
    }

    public void addNotify() {
        super.addNotify();

        manager.setSelectedItem(null);

        if (categorySelector == null)  { // GUI components not created yet
            listener = new Listener(); // listener for everything

            // create CategorySelectPanel - on the top
            categorySelector = new CategorySelectPanel(listener, listener);
            categorySelector.getAccessibleContext().setAccessibleName(
                PaletteUtils.getBundleString("ACS_PaletteTabbedPane")); // NOI18N
            categorySelector.getAccessibleContext().setAccessibleDescription(
                PaletteUtils.getBundleString("ACSD_PaletteTabbedPane")); // NOI18N
            add(categorySelector, BorderLayout.NORTH);

            // create CategoryPresentPanel - in the middle
            categoryPresenter = new CategoryPresentPanel(listener, listener);
            categoryPresenter.setShowNames(manager.getShowComponentsNames());
            add(categoryPresenter, BorderLayout.CENTER);

            fillCategories();

            // listeners to environment after GUI is created
            manager.addPropertyChangeListener(listener);
        }
    }

    private void fillCategories() {
        if (categorySelector.getCategoryCount() > 0) {
            categorySelector.clearCategories();
            categoryPresenter.clearCategories();
        }

        Node[] nodes = manager.getCategoryNodes();
        for (int i=0; i < nodes.length; i++)
            addCategory(nodes[i], i);
    }
    
    private void addCategory(Node node, int index) {
        categoryPresenter.addCategory(node, index);

        String description = // accessibility description for the category
            java.text.MessageFormat.format(
                PaletteUtils.getBundleString("ACSD_PaletteCategory"), // NOI18N
                new Object[] { node.getDisplayName() });
        categorySelector.addCategory(node.getDisplayName(), description, index);
    }

    private void setSelectedItem(PaletteItem item) {
        if (item == null)
            for (int i=0, n=categoryPresenter.getCategoryCount(); i < n; i++)
                categoryPresenter.getCategoryList(i).clearSelection();
        else {
            Node[] categoryNodes = manager.getCategoryNodes();
            for (int i=0; i < categoryNodes.length; i++) {
                Node[] itemNodes = manager.getItemNodes(categoryNodes[i]);
                for (int j=0; j < itemNodes.length; j++)
                    if (itemNodes[j].getCookie(PaletteItem.class) == item) {
                        if (i != categorySelector.getSelectedIndex())
                            categorySelector.setSelectedIndex(i);
                        categoryPresenter.getCategoryList(i).setSelectedValue(
                                                            itemNodes[j], true);
                        break;
                    }
            }
        }
    }
    
    private void restoreSelectedCategory(Node node) {
        Node[] nodes = manager.getCategoryNodes();
        int i, index;
        for (i=0; i 0) ? 0 : -1;
        } else {
            index = i;
        }
        manager.setSelectedCategoryNode((index < 0) ? null : nodes[index]);
        categorySelector.setSelectedIndex(index);
    }
    
    public boolean requestFocusInWindow() {
        return (categorySelector == null) ? super.requestFocusInWindow() : categorySelector.requestFocusInWindow();
    }

    ///////////////////////////////////////////////////
    
    void showMenuOnCategory(Component comp, Point pos) {
        int i = categorySelector.getSelectedIndex();
        Node[] nodes = manager.getCategoryNodes();
        new ItemPopupMenu(nodes[i], null, manager).show(comp, pos.x, pos.y);
    }
    
    void showMenuOnPalette(boolean button, Component comp, Point pos) {
        Node catNode = null;
        if (button) {
            int index = categorySelector.indexOfComponent(comp);
            if (index >= 0) {
                Node[] nodes = manager.getCategoryNodes();
                catNode = nodes[index];
            }
        }
        new PalettePopupMenu(catNode, manager).show(comp, pos.x, pos.y);
    }

    void showMenuOnItem(Node itemNode, Component comp, Point pos) {
        int i = categorySelector.getSelectedIndex();
        Node[] nodes = manager.getCategoryNodes();
        new ItemPopupMenu(nodes[i], itemNode, manager).show(comp, pos.x, pos.y);
    }

    //////////////////////////////////////////////////
    
    /** Listener for events fired by CPComponentLarge members */
    private class Listener extends MouseAdapter implements
        ListSelectionListener, ChangeListener, PropertyChangeListener {
            
        /** ChangeListener on CategorySelector.
         * Handles change in selected category. */
        public void stateChanged(ChangeEvent e) {
            manager.setSelectedItem(null);
            int index = categorySelector.getSelectedIndex();
            Node[] nodes = manager.getCategoryNodes();
            Node selectedNode = null;
            if ((index >= 0) && index < nodes.length) {
                selectedNode = nodes[index];
            }
            manager.setSelectedCategoryNode(selectedNode);
            if (index >= 0) {
                categoryPresenter.showCategory(index);
            }
        }

        /** ListSelectionListener on category JList.
         * Handles selection of an item.*/
        public void valueChanged(ListSelectionEvent e) {
            JList list = (JList) e.getSource();
            int index = list.getSelectedIndex();
            if (index == -1)
                manager.setSelectedItem(null);
            else if (!e.getValueIsAdjusting()) {
                Node node = (Node) list.getModel().getElementAt(index);
                manager.setSelectedItem((PaletteItem)node.getCookie(PaletteItem.class));
            }
        }

        /** Handles mouse button release on the palette. Invokes popup menus. */
        public void mouseReleased(MouseEvent e) {
            if (!javax.swing.SwingUtilities.isRightMouseButton(e))
                return;

            Object source = e.getSource();

            if (source == categorySelector) {
                showMenuOnPalette(false, e.getComponent(), e.getPoint());
            }
            else if (source instanceof AbstractButton) {
                showMenuOnPalette(true, e.getComponent(), e.getPoint());
            }
            else if (source instanceof JList) {
                JList list = (JList) source;
                Point p = e.getPoint();
                int index = list.locationToIndex(p);
                if (index >= 0 && !list.getCellBounds(index, index).contains(p))
                    index = -1;
                if (index < 0)
                    showMenuOnCategory(e.getComponent(), e.getPoint());
                else
                    showMenuOnItem((Node)list.getModel().getElementAt(index),
                                   e.getComponent(), e.getPoint());
            }
        }

        /** PropertyChangeListener on palette manager. */
        public void propertyChange(PropertyChangeEvent e) {
            String propName = e.getPropertyName();
            
            if (CPManager.PROP_SELECTEDITEM.equals(propName)) {
                setSelectedItem(((PaletteItem)e.getNewValue()));
            } else if (CPManager.PROP_PALETTE_CONTENT.equals(propName)) {
                Node node = manager.getSelectedCategoryNode();
                fillCategories();
                restoreSelectedCategory(node);
                revalidate();
                repaint();
            } else if (FormLoaderSettings.PROP_SHOW_COMPONENTS_NAMES.equals(propName)) {
                categoryPresenter.setShowNames(manager.getShowComponentsNames());
                categoryPresenter.revalidate();
                categoryPresenter.repaint();
            }
        }
    }
}
... 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.