/*DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2006-2008. Tim Boudreau. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common
 * Development and Distribution License("CDDL") (collectively, the
 * "License"). You may not use this file except in compliance with the
 * License. You can obtain a copy of the License at
 * http://www.netbeans.org/cddl-gplv2.html. See the License for the
 * specific language governing permissions and limitations under the
 * License.  When distributing the software, include this License Header
 * Notice in each file and include the License file at
 * nbbuild/licenses/CDDL-GPL-2-CP.  This particular file is designated
 * as subject to the "Classpath" exception as provided
 * in the GPL Version 2 section of the License file that
 * accompanied this code.
 */

package net.java.dev.colorchooser;

import java.beans.BeanDescriptor;
import java.beans.EventSetDescriptor;
import java.beans.IntrospectionException;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;

public class ColorChooserBeanInfo extends SimpleBeanInfo {

	// Bean descriptor//GEN-FIRST:BeanDescriptor
	/* lazy BeanDescriptor */
	private static BeanDescriptor getBdescriptor() {
		final BeanDescriptor beanDescriptor = new BeanDescriptor(
				net.java.dev.colorchooser.ColorChooser.class, null); // NOI18N//GEN-HEADEREND:BeanDescriptor

		// Here you can add code for customizing the BeanDescriptor.

		return beanDescriptor;
	}// GEN-LAST:BeanDescriptor

	// Property identifiers//GEN-FIRST:Properties
	private static final int PROPERTY_color = 0;
	private static final int PROPERTY_continuousPalettePreferred = 1;
	private static final int PROPERTY_cursor = 2;
	private static final int PROPERTY_enabled = 3;
	private static final int PROPERTY_height = 4;
	private static final int PROPERTY_maximumSize = 5;
	private static final int PROPERTY_minimumSize = 6;
	private static final int PROPERTY_name = 7;
	private static final int PROPERTY_preferredSize = 8;
	private static final int PROPERTY_toolTipText = 9;
	private static final int PROPERTY_transientColor = 10;
	private static final int PROPERTY_visible = 11;
	private static final int PROPERTY_width = 12;
	private static final int PROPERTY_x = 13;
	private static final int PROPERTY_y = 14;

	// Property array
	/* lazy PropertyDescriptor */
	private static PropertyDescriptor[] getPdescriptor() {
		final PropertyDescriptor[] properties = new PropertyDescriptor[15];

		try {
			properties[PROPERTY_color] = new PropertyDescriptor("color",
					net.java.dev.colorchooser.ColorChooser.class, "getColor",
			"setColor"); // NOI18N
			properties[PROPERTY_color].setPreferred(true);
			properties[PROPERTY_continuousPalettePreferred] = new PropertyDescriptor(
					"continuousPalettePreferred",
					net.java.dev.colorchooser.ColorChooser.class,
					"isContinuousPalettePreferred",
			"setContinuousPalettePreferred"); // NOI18N
			properties[PROPERTY_continuousPalettePreferred].setPreferred(true);
			properties[PROPERTY_cursor] = new PropertyDescriptor("cursor",
					net.java.dev.colorchooser.ColorChooser.class, "getCursor",
			"setCursor"); // NOI18N
			properties[PROPERTY_enabled] = new PropertyDescriptor("enabled",
					net.java.dev.colorchooser.ColorChooser.class, "isEnabled",
			"setEnabled"); // NOI18N
			properties[PROPERTY_height] = new PropertyDescriptor("height",
					net.java.dev.colorchooser.ColorChooser.class, "getHeight",
					null); // NOI18N
			properties[PROPERTY_maximumSize] = new PropertyDescriptor(
					"maximumSize",
					net.java.dev.colorchooser.ColorChooser.class,
					"getMaximumSize", "setMaximumSize"); // NOI18N
			properties[PROPERTY_minimumSize] = new PropertyDescriptor(
					"minimumSize",
					net.java.dev.colorchooser.ColorChooser.class,
					"getMinimumSize", "setMinimumSize"); // NOI18N
			properties[PROPERTY_name] = new PropertyDescriptor("name",
					net.java.dev.colorchooser.ColorChooser.class, "getName",
			"setName"); // NOI18N
			properties[PROPERTY_preferredSize] = new PropertyDescriptor(
					"preferredSize",
					net.java.dev.colorchooser.ColorChooser.class,
					"getPreferredSize", "setPreferredSize"); // NOI18N
			properties[PROPERTY_toolTipText] = new PropertyDescriptor(
					"toolTipText",
					net.java.dev.colorchooser.ColorChooser.class,
					"getToolTipText", "setToolTipText"); // NOI18N
			properties[PROPERTY_transientColor] = new PropertyDescriptor(
					"transientColor",
					net.java.dev.colorchooser.ColorChooser.class,
					"getTransientColor", null); // NOI18N
			properties[PROPERTY_transientColor].setExpert(true);
			properties[PROPERTY_visible] = new PropertyDescriptor("visible",
					net.java.dev.colorchooser.ColorChooser.class, "isVisible",
			"setVisible"); // NOI18N
			properties[PROPERTY_width] = new PropertyDescriptor("width",
					net.java.dev.colorchooser.ColorChooser.class, "getWidth",
					null); // NOI18N
			properties[PROPERTY_x] = new PropertyDescriptor("x",
					net.java.dev.colorchooser.ColorChooser.class, "getX", null); // NOI18N
			properties[PROPERTY_y] = new PropertyDescriptor("y",
					net.java.dev.colorchooser.ColorChooser.class, "getY", null); // NOI18N
		} catch (final IntrospectionException e) {
			e.printStackTrace();
		}// GEN-HEADEREND:Properties

		// Here you can add code for customizing the properties array.

		return properties;
	}// GEN-LAST:Properties

	// EventSet identifiers//GEN-FIRST:Events
	private static final int EVENT_actionListener = 0;
	private static final int EVENT_componentListener = 1;
	private static final int EVENT_focusListener = 2;
	private static final int EVENT_hierarchyBoundsListener = 3;
	private static final int EVENT_inputMethodListener = 4;
	private static final int EVENT_keyListener = 5;
	private static final int EVENT_mouseListener = 6;
	private static final int EVENT_mouseMotionListener = 7;
	private static final int EVENT_propertyChangeListener = 8;

	// EventSet array
	/* lazy EventSetDescriptor */
	private static EventSetDescriptor[] getEdescriptor() {
		final EventSetDescriptor[] eventSets = new EventSetDescriptor[9];

		try {
			eventSets[EVENT_actionListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"actionListener", java.awt.event.ActionListener.class,
					new String[] { "actionPerformed" }, "addActionListener",
			"removeActionListener"); // NOI18N
			eventSets[EVENT_actionListener].setPreferred(true);
			eventSets[EVENT_componentListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"componentListener",
					java.awt.event.ComponentListener.class, new String[] {
						"componentHidden", "componentMoved",
						"componentResized", "componentShown" },
						"addComponentListener", "removeComponentListener"); // NOI18N
			eventSets[EVENT_focusListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"focusListener", java.awt.event.FocusListener.class,
					new String[] { "focusGained", "focusLost" },
					"addFocusListener", "removeFocusListener"); // NOI18N
			eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"hierarchyBoundsListener",
					java.awt.event.HierarchyBoundsListener.class, new String[] {
						"ancestorMoved", "ancestorResized" },
						"addHierarchyBoundsListener",
			"removeHierarchyBoundsListener"); // NOI18N
			eventSets[EVENT_inputMethodListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"inputMethodListener",
					java.awt.event.InputMethodListener.class, new String[] {
						"caretPositionChanged", "inputMethodTextChanged" },
						"addInputMethodListener", "removeInputMethodListener"); // NOI18N
			eventSets[EVENT_keyListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"keyListener", java.awt.event.KeyListener.class,
					new String[] { "keyPressed", "keyReleased", "keyTyped" },
					"addKeyListener", "removeKeyListener"); // NOI18N
			eventSets[EVENT_mouseListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"mouseListener", java.awt.event.MouseListener.class,
					new String[] { "mouseClicked", "mouseEntered",
						"mouseExited", "mousePressed", "mouseReleased" },
						"addMouseListener", "removeMouseListener"); // NOI18N
			eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"mouseMotionListener",
					java.awt.event.MouseMotionListener.class, new String[] {
						"mouseDragged", "mouseMoved" },
						"addMouseMotionListener", "removeMouseMotionListener"); // NOI18N
			eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor(
					net.java.dev.colorchooser.ColorChooser.class,
					"propertyChangeListener",
					java.beans.PropertyChangeListener.class,
					new String[] { "propertyChange" },
					"addPropertyChangeListener", "removePropertyChangeListener"); // NOI18N
		} catch (final IntrospectionException e) {
			e.printStackTrace();
		}// GEN-HEADEREND:Events

		// Here you can add code for customizing the event sets array.

		return eventSets;
	}// GEN-LAST:Events

	// Method identifiers//GEN-FIRST:Methods

	// Method array
	/* lazy MethodDescriptor */
	private static MethodDescriptor[] getMdescriptor() {
		final MethodDescriptor[] methods = new MethodDescriptor[0];// GEN-HEADEREND:Methods

		// Here you can add code for customizing the methods array.

		return methods;
	}// GEN-LAST:Methods

	private static java.awt.Image iconColor16 = null;// GEN-BEGIN:IconsDef
	private static java.awt.Image iconColor32 = null;
	private static java.awt.Image iconMono16 = null;
	private static java.awt.Image iconMono32 = null;// GEN-END:IconsDef
	private static String iconNameC16 = "/org/netbeans/swing/colorchooser/chooserIcon.gif";// GEN-BEGIN:Icons
	private static String iconNameC32 = "/org/netbeans/swing/colorchooser/chooserIcon32.gif";
	private static String iconNameM16 = null;
	private static String iconNameM32 = null;// GEN-END:Icons

	private static final int defaultPropertyIndex = -1;// GEN-BEGIN:Idx
	private static final int defaultEventIndex = -1;// GEN-END:Idx

	// GEN-FIRST:Superclass

	// Here you can add code for customizing the Superclass BeanInfo.

	// GEN-LAST:Superclass

	/**
	 * Gets the bean's <code>BeanDescriptor</code>s.
	 * 
	 * @return BeanDescriptor describing the editable properties of this bean.
	 *         May return null if the information should be obtained by
	 *         automatic analysis.
	 */
	@Override
	public BeanDescriptor getBeanDescriptor() {
		return getBdescriptor();
	}

	/**
	 * Gets the bean's <code>PropertyDescriptor</code>s.
	 * 
	 * @return An array of PropertyDescriptors describing the editable
	 *         properties supported by this bean. May return null if the
	 *         information should be obtained by automatic analysis.
	 *         <p>
	 *         If a property is indexed, then its entry in the result array will
	 *         belong to the IndexedPropertyDescriptor subclass of
	 *         PropertyDescriptor. A client of getPropertyDescriptors can use
	 *         "instanceof" to check if a given PropertyDescriptor is an
	 *         IndexedPropertyDescriptor.
	 */
	@Override
	public PropertyDescriptor[] getPropertyDescriptors() {
		return getPdescriptor();
	}

	/**
	 * Gets the bean's <code>EventSetDescriptor</code>s.
	 * 
	 * @return An array of EventSetDescriptors describing the kinds of events
	 *         fired by this bean. May return null if the information should be
	 *         obtained by automatic analysis.
	 */
	@Override
	public EventSetDescriptor[] getEventSetDescriptors() {
		return getEdescriptor();
	}

	/**
	 * Gets the bean's <code>MethodDescriptor</code>s.
	 * 
	 * @return An array of MethodDescriptors describing the methods implemented
	 *         by this bean. May return null if the information should be
	 *         obtained by automatic analysis.
	 */
	@Override
	public MethodDescriptor[] getMethodDescriptors() {
		return getMdescriptor();
	}

	/**
	 * A bean may have a "default" property that is the property that will
	 * mostly commonly be initially chosen for update by human's who are
	 * customizing the bean.
	 * 
	 * @return Index of default property in the PropertyDescriptor array
	 *         returned by getPropertyDescriptors.
	 *         <P>
	 *         Returns -1 if there is no default property.
	 */
	@Override
	public int getDefaultPropertyIndex() {
		return defaultPropertyIndex;
	}

	/**
	 * A bean may have a "default" event that is the event that will mostly
	 * commonly be used by human's when using the bean.
	 * 
	 * @return Index of default event in the EventSetDescriptor array returned
	 *         by getEventSetDescriptors.
	 *         <P>
	 *         Returns -1 if there is no default event.
	 */
	@Override
	public int getDefaultEventIndex() {
		return defaultEventIndex;
	}

	/**
	 * This method returns an image object that can be used to represent the
	 * bean in toolboxes, toolbars, etc. Icon images will typically be GIFs, but
	 * may in future include other formats.
	 * <p>
	 * Beans aren't required to provide icons and may return null from this
	 * method.
	 * <p>
	 * There are four possible flavors of icons (16x16 color, 32x32 color, 16x16
	 * mono, 32x32 mono). If a bean choses to only support a single icon we
	 * recommend supporting 16x16 color.
	 * <p>
	 * We recommend that icons have a "transparent" background so they can be
	 * rendered onto an existing background.
	 * 
	 * @param iconKind
	 *            The kind of icon requested. This should be one of the constant
	 *            values ICON_COLOR_16x16, ICON_COLOR_32x32, ICON_MONO_16x16, or
	 *            ICON_MONO_32x32.
	 * @return An image object representing the requested icon. May return null
	 *         if no suitable icon is available.
	 */
	@Override
	public java.awt.Image getIcon(final int iconKind) {
		switch (iconKind) {
		case ICON_COLOR_16x16:
			if (iconNameC16 == null)
				return null;
			else {
				if (iconColor16 == null)
					iconColor16 = loadImage(iconNameC16);
				return iconColor16;
			}
		case ICON_COLOR_32x32:
			if (iconNameC32 == null)
				return null;
			else {
				if (iconColor32 == null)
					iconColor32 = loadImage(iconNameC32);
				return iconColor32;
			}
		case ICON_MONO_16x16:
			if (iconNameM16 == null)
				return null;
			else {
				if (iconMono16 == null)
					iconMono16 = loadImage(iconNameM16);
				return iconMono16;
			}
		case ICON_MONO_32x32:
			if (iconNameM32 == null)
				return null;
			else {
				if (iconMono32 == null)
					iconMono32 = loadImage(iconNameM32);
				return iconMono32;
			}
		default:
			return null;
		}
	}

}
