blob: dd25453fd51657794d62cea6e95a15da5fe82b68 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.beans.beaninfo;
import java.io.IOException;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorSupport;
import java.lang.reflect.InvocationTargetException;
import javax.swing.Action;
import javax.swing.GrayFilter;
import org.openide.util.actions.SystemAction;
import org.openide.nodes.Node;
import org.openide.nodes.Children;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.PropertySupport;
import org.openide.nodes.Sheet;
/** The basic node for representing features included in BanInfo. It recognizes
* the type of the BiFeature and creates properties according to it.
* @author Petr Hrebejk
*/
final class BiFeatureNode extends AbstractNode implements Node.Cookie {
/** generated Serialized Version UID */
static final long serialVersionUID = -8680621542479107034L;
// static variables ...........................................................................
/** Property display name constant */
public static final String PROP_DISPLAY_NAME = "displayName"; // NOI18N
/** Property expert constant */
public static final String PROP_EXPERT = "expert"; // NOI18N
/** Property hidden constant
*/
public static final String PROP_HIDDEN = "hidden"; // NOI18N
/** Property name constant */
public static final String PROP_NAME = "name"; // NOI18N
/** Property preffered constant */
public static final String PROP_PREFERRED = "preferred"; // NOI18N
/** Property short description constant */
public static final String PROP_SHORT_DESCRIPTION = "shortDescription"; // NOI18N
/** Property include constant */
public static final String PROP_INCLUDED = "included"; // NOI18N
/** Property include constant */
public static final String PROP_CUSTOMIZER = "customizer"; // NOI18N
/** Property bound constant */
public static final String PROP_BOUND = "bound"; // NOI18N
/** Property constrained constant */
public static final String PROP_CONSTRAINED = "constrained"; // NOI18N
/** Property mode constant */
public static final String PROP_MODE = "mode"; // NOI18N
/** Property editor class constant */
public static final String PROP_EDITOR_CLASS = "propertyEditorClass"; // NOI18N
/** Property non-indexed getter constant */
public static final String PROP_NI_GETTER = "niGetter"; // NOI18N
/** Property non-indexed setter constant */
public static final String PROP_NI_SETTER = "niSetter"; // NOI18N
/** Property unicast constant */
public static final String PROP_UNICAST = "unicast"; // NOI18N
/** Property in default event set constant */
public static final String PROP_IN_DEFAULT_EVENTSET = "inDefaultEventSet"; // NOI18N
// variables ..........................................................................
//private static SystemAction [] staticActions;
// feature mode asociated to this node
protected BiFeature biFeature = null;
//analyser
protected BiAnalyser biAnalyser = null;
static javax.swing.GrayFilter grayFilter = null;
static{
grayFilter = new GrayFilter(true, 5);
}
// constructors .......................................................................
/**
* Creates empty BreakpointContext.
*/
public BiFeatureNode (final BiFeature biFeature, BiAnalyser biAnalyser) {
super (Children.LEAF);
this.biFeature = biFeature;
this.biAnalyser = biAnalyser;
setDisplayName (getName ());
setShortDescription(biFeature.getToolTip());
setIconBaseWithExtension( biFeature.getIconBase(false) + ".gif" );
init ();
}
@Override
public java.awt.Image getIcon( int type ){
if( biFeature instanceof BiFeature.Descriptor && biAnalyser.isNullDescriptor() ) {
//setIconBase( biFeature.getIconBase(true));
return GrayFilter.createDisabledImage(super.getIcon(type));
}
if( ( biFeature instanceof BiFeature.Property || biFeature instanceof BiFeature.IdxProperty ) && biAnalyser.isNullProperties() ) {
//setIconBase( biFeature.getIconBase(true));
return GrayFilter.createDisabledImage(super.getIcon(type));
}
if( biFeature instanceof BiFeature.EventSet && biAnalyser.isNullEventSets() ) {
//setIconBase( biFeature.getIconBase(true));
return GrayFilter.createDisabledImage(super.getIcon(type));
}
if( biFeature instanceof BiFeature.Method && biAnalyser.isNullMethods() ) {
//setIconBase( biFeature.getIconBase(true));
return GrayFilter.createDisabledImage(super.getIcon(type));
}
//setIconBase( biFeature.getIconBase(false));
return super.getIcon(type);
}
private void init () {
createProperties ();
getCookieSet().add ( this );
/*
breakpoint.addPropertyChangeListener (new PropertyChangeListener () {
public void propertyChange (PropertyChangeEvent e) {
String s = e.getPropertyName ();
parameterChanged (e);
}
});
*/
}
@Override
public <T extends Node.Cookie> T getCookie(Class<T> type) {
if ( type == BiFeatureNode.class )
return type.cast(this);
return getCookieSet().getCookie( type );
}
/** Creates properties for this node */
private void createProperties () {
// default sheet with "properties" property set // NOI18N
Sheet sheet = Sheet.createDefault();
Sheet.Set ps = sheet.get(Sheet.PROPERTIES);
ps.put(new PropertySupport.ReadOnly<String> (
PROP_NAME,
String.class,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_NAME ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_NAME )
) {
public String getValue () {
return (!(biFeature instanceof BiFeature.Descriptor )) ? biFeature.getName () : ((BiFeature.Descriptor)biFeature).getBeanName();
}
@Override
public void setValue (String val) throws IllegalAccessException {
throw new IllegalAccessException(GenerateBeanInfoAction.getString("MSG_Cannot_Write"));
}
});
ps.put( BiNode.createProperty ( biFeature, Boolean.TYPE,
PROP_EXPERT,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_EXPERT ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_EXPERT ),
"isExpert", "setExpert" )); // NOI18N
ps.put( BiNode.createProperty ( biFeature, Boolean.TYPE,
PROP_HIDDEN,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_HIDDEN ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_HIDDEN ),
"isHidden", "setHidden" )); // NOI18N
ps.put( BiNode.createProperty ( biFeature, Boolean.TYPE,
PROP_PREFERRED,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_PREFERRED ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_PREFERRED ),
"isPreferred", "setPreferred" )); // NOI18N
ps.put(new CodePropertySupportRW<String>(
PROP_DISPLAY_NAME,
String.class,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_DISPLAY_NAME ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_DISPLAY_NAME )
) {
public String getValue () {
return biFeature.getDisplayName() != null ? biFeature.getDisplayName() : "null"; // NOI18N
}
public void setValue (String val) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
try {
if( "null".equals(val) ) // NOI18N
val = null;
biFeature.setDisplayName ( val );
} catch (ClassCastException e) {
throw new IllegalArgumentException ();
}
}
});
ps.put(new CodePropertySupportRW<String>(//PropertySupport.ReadWrite (
PROP_SHORT_DESCRIPTION,
String.class,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_SHORT_DESCRIPTION ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_SHORT_DESCRIPTION )
) {
public String getValue () {
String toRet = biFeature.getShortDescription () != null ? biFeature.getShortDescription () : "null"; // NOI18N
return toRet;
}
public void setValue (String val) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
try {
if( "null".equals(val) ) // NOI18N
val = null;
biFeature.setShortDescription ( val );
} catch (ClassCastException e) {
throw new IllegalArgumentException ();
}
}
});
// Add special properties according to type of feature
if( ! (biFeature instanceof BiFeature.Descriptor) )
addIncludedProperty( ps );
else
addCustomizerProperty( sheet );
if ( biFeature instanceof BiFeature.Property || biFeature instanceof BiFeature.IdxProperty )
addExpertProperty( sheet );
else if ( biFeature instanceof BiFeature.EventSet )
addExpertEventSet( sheet );
// and set new sheet
setSheet(sheet);
}
protected void addIncludedProperty( Sheet.Set ps ) {
ps.put(new PropertySupport.ReadWrite<Boolean> (
PROP_INCLUDED,
Boolean.TYPE,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_INCLUDED ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_INCLUDED )
) {
public Boolean getValue () {
return biFeature.isIncluded ();
}
public void setValue (Boolean val) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
try {
biFeature.setIncluded ( val );
setIconBaseWithExtension( biFeature.getIconBase(false) + ".gif" );
} catch (ClassCastException e) {
throw new IllegalArgumentException ();
}
}
});
}
protected void addCustomizerProperty( Sheet sheet ) {
Sheet.Set ps = Sheet.createExpertSet();
ps.put(new CodePropertySupportRW<String>(//PropertySupport.ReadWrite (
//ps.put(new PropertySupport.ReadWrite (
PROP_DISPLAY_NAME,
String.class,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_CUSTOMIZER ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_CUSTOMIZER )
) {
public String getValue () {
String toRet = ((BiFeature.Descriptor)biFeature).getCustomizer() != null ? ((BiFeature.Descriptor)biFeature).getCustomizer() : "null"; // NOI18N
return toRet;
}
public void setValue (String val) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
try {
if( "null".equals(val) ) // NOI18N
val = null;
((BiFeature.Descriptor)biFeature).setCustomizer( val );
} catch (ClassCastException e) {
throw new IllegalArgumentException ();
}
}
});
sheet.put( ps );
}
protected void addExpertProperty( Sheet sheet ) {
Sheet.Set ps = Sheet.createExpertSet();
ps.put( BiNode.createProperty ( (BiFeature.Property)biFeature, Boolean.TYPE,
PROP_BOUND,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_BOUND ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_BOUND ),
"isBound", "setBound" )); // NOI18N
ps.put( BiNode.createProperty ( (BiFeature.Property)biFeature, Boolean.TYPE,
PROP_CONSTRAINED,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_CONSTRAINED ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_CONSTRAINED ),
"isConstrained", "setConstrained" )); // NOI18N
ps.put(new PropertySupport<Integer> (
PROP_MODE,
Integer.TYPE, //int.class !!!!????,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_MODE ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_MODE ),
true,
((BiFeature.Property)biFeature).modeChangeable()
) {
public Integer getValue () {
return ((BiFeature.Property)biFeature).getMode();
}
public void setValue (Integer val) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
try {
((BiFeature.Property)biFeature).setMode ( val );
setIconBaseWithExtension( biFeature.getIconBase(false) + ".gif" );
} catch (ClassCastException e) {
throw new IllegalArgumentException ();
}
}
@Override
public PropertyEditor getPropertyEditor () {
return new org.netbeans.modules.beans.ModePropertyEditor();
}
});
ps.put( BiNode.createProperty ( (BiFeature.Property)biFeature, String.class,
PROP_EDITOR_CLASS,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_EDITOR_CLASS ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_EDITOR_CLASS ),
"getPropertyEditorClass", "setPropertyEditorClass" ));
if ( biFeature instanceof BiFeature.IdxProperty ) {
ps.put(new PropertySupport<Boolean> (
PROP_NI_GETTER,
Boolean.TYPE,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_NI_GETTER ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_NI_GETTER ),
true,
((BiFeature.IdxProperty)biFeature).hasNiGetter()
) {
public Boolean getValue () {
return ((BiFeature.IdxProperty)biFeature).isNiGetter ();
}
public void setValue (Boolean val) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
if ( !((BiFeature.IdxProperty)biFeature).hasNiGetter() )
throw new IllegalAccessException ();
try {
((BiFeature.IdxProperty)biFeature).setNiGetter ( val );
} catch (ClassCastException e) {
throw new IllegalArgumentException ();
}
}
});
ps.put(new PropertySupport<Boolean> (
PROP_NI_SETTER,
Boolean.TYPE,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_NI_SETTER ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_NI_SETTER ),
true,
((BiFeature.IdxProperty)biFeature).hasNiSetter()
) {
public Boolean getValue () {
return ((BiFeature.IdxProperty)biFeature).isNiSetter ();
}
public void setValue (Boolean val) throws
IllegalAccessException, IllegalArgumentException, InvocationTargetException {
if ( !((BiFeature.IdxProperty)biFeature).hasNiSetter() )
throw new IllegalAccessException ();
try {
((BiFeature.IdxProperty)biFeature).setNiSetter ( val );
} catch (ClassCastException e) {
throw new IllegalArgumentException ();
}
}
});
}
sheet.put( ps );
}
void addExpertEventSet ( Sheet sheet ) {
Sheet.Set ps = Sheet.createExpertSet();
ps.put( BiNode.createProperty ( (BiFeature.EventSet)biFeature, Boolean.TYPE,
PROP_UNICAST,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_UNICAST ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_UNICAST ),
"isUnicast", null )); // NOI18N
ps.put( BiNode.createProperty ( (BiFeature.EventSet)biFeature, Boolean.TYPE,
PROP_IN_DEFAULT_EVENTSET,
GenerateBeanInfoAction.getString ("PROP_Bi_" + PROP_IN_DEFAULT_EVENTSET ),
GenerateBeanInfoAction.getString ("HINT_Bi_" + PROP_IN_DEFAULT_EVENTSET ),
"isInDefaultEventSet", "setInDefaultEventSet" )); // NOI18N
sheet.put( ps );
}
// implementation of Node ..........................................................
/** Getter for set of actions that should be present in the
* popup menu of this node. This set is used in construction of
* menu returned from getContextMenu and specially when a menu for
* more nodes is constructed.
*
* @return array of system actions that should be in popup menu
*/
@Override
public Action[] getActions(boolean context) {
Action[] staticActions = null;
//if (staticActions == null) {
if( ! (biFeature instanceof BiFeature.Descriptor) ){
staticActions = new Action[] {
SystemAction.get (BiToggleAction.class),
null
/*
SystemAction.get (DeleteAction.class),
null,
SystemAction.get (ToolsAction.class),
SystemAction.get (PropertiesAction.class),
*/
};
}
else {
staticActions = new Action[0];
}
//}
return staticActions;
}
/**
* the feature cannot be removed it can only be disabled from BeanInfo
*
* @return <CODE>true</CODE>
*/
@Override
public boolean canDestroy () {
return false;
}
/**
* Deletes breakpoint and removes the node too.
* Ovverrides destroy() from abstract node.
*/
@Override
public void destroy () throws IOException {
// remove node
// super.destroy ();
}
/** It has default action - it is the toggle of value for include to bean info
* @return <CODE>true</CODE>
*/
public boolean hasDefaultAction () {
return true;
}
/** Toggles the selection of bi feature */
public void toggleSelection() {
biFeature.setIncluded ( !biFeature.isIncluded() );
firePropertyChange( PROP_INCLUDED, !biFeature.isIncluded(), biFeature.isIncluded() );
setIconBaseWithExtension( biFeature.getIconBase(false) + ".gif" );
}
/** Includes/excludes the pattern from bean info */
public void include( boolean value ) {
if (( value && biFeature.isIncluded() ) ||
( !value && !biFeature.isIncluded() ) )
return;
biFeature.setIncluded ( value );
firePropertyChange( PROP_INCLUDED, !biFeature.isIncluded(), biFeature.isIncluded() );
setIconBaseWithExtension( biFeature.getIconBase(false) + ".gif" );
}
/** Executes default action.
*/
public void invokeDefaultAction() {
//System.out.println ( "Default action"); // NOI18N
toggleSelection();
}
// private methods .....................................................................
/**
* Returns the associated BiFature
*/
BiFeature getBiFeature () {
return biFeature;
}
BiAnalyser getBiAnalyser () {
return biAnalyser;
}
/**
* Sets display name and fires property change.
*/
/*
void parameterChanged (PropertyChangeEvent e) {
setDisplayName (getName ());
firePropertyChange (e.getPropertyName (), e.getOldValue (), e.getNewValue ());
}
*/
/**
* Returns human presentable name of this breakpoint containing
* informations about lineNumber, className e.t.c.
*
* @return human presentable name of this breakpoint.
*/
@Override
public String getName () {
return (!(biFeature instanceof BiFeature.Descriptor )) ? biFeature.getName () : ((BiFeature.Descriptor)biFeature).getBeanName();
//return biFeature.getName();
}
public void iconChanged(){
if( biFeature instanceof BiFeature.Descriptor && biAnalyser.isNullDescriptor() ) {
setIconBaseWithExtension( biFeature.getIconBase(true) + ".gif");
}
else if( ( biFeature instanceof BiFeature.Property || biFeature instanceof BiFeature.IdxProperty ) && biAnalyser.isNullProperties() ) {
setIconBaseWithExtension( biFeature.getIconBase(true) + ".gif");
}
else if( biFeature instanceof BiFeature.EventSet && biAnalyser.isNullEventSets() ) {
setIconBaseWithExtension( biFeature.getIconBase(true) + ".gif");
}
else if( biFeature instanceof BiFeature.Method && biAnalyser.isNullMethods() ) {
setIconBaseWithExtension( biFeature.getIconBase(true) + ".gif");
}
else setIconBaseWithExtension( biFeature.getIconBase(false) + ".gif");
fireIconChange();
}
abstract class CodePropertySupportRW<T> extends PropertySupport.ReadWrite<T>
{
CodePropertySupportRW(String name, Class<T> type,
String displayName, String shortDescription) {
super(name, type, displayName, shortDescription);
}
@Override
public PropertyEditor getPropertyEditor() {
return new PropertyEditorSupport() {
@Override
public java.awt.Component getCustomEditor() {
return new CustomCodeEditor(CodePropertySupportRW.this);
}
@Override
public boolean supportsCustomEditor() {
return true;
}
};
}
}
}