001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: /*
043: * BooleanProperty.java
044: *
045: * Created on January 5, 2006, 3:21 PM
046: *
047: */
048:
049: package org.netbeans.modules.xml.schema.ui.nodes.schema.properties;
050:
051: import java.lang.reflect.InvocationTargetException;
052: import java.lang.reflect.Method;
053: import org.netbeans.modules.xml.schema.model.SchemaComponent;
054: import org.netbeans.modules.xml.schema.model.SchemaModel;
055: import org.netbeans.modules.xml.xam.ui.XAMUtils;
056: import org.openide.nodes.PropertySupport;
057:
058: /**
059: * The Base class for schema component properties.
060: * It extends PropertySupport.Reflection
061: * In general all schema properties allow restoring to deafult,
062: * so this class provides skeleton impl of the required methods.
063: * Subclasses can override these methods for different behaviour.
064: * The canWrite method is overridden to mark properties as uneditable,
065: * if schema component belongs to read only model.
066: * This class provides constructors which create properties with localized user
067: * friendly names and description and customized editor classes.
068: * They can be changed after creation, using the setter methods.
069: * This class can be instantiated, but will be subclassed for specific type of properties.
070: * For example the BooleanProperty class subclasses this class to support
071: * boolean properties.
072: * Example usage:
073: * <CODE>
074: * Property myProp = new BaseSchemaProperty(
075: * myComp, // schema component
076: * String.class // value type
077: * "myProperty", // property name
078: * "My property", // display name
079: * "My property Description", // descr
080: * MyPropertyEditor.class // if default value is false
081: * );
082: </CODE>
083: * @author Ajit Bhate
084: */
085: public class BaseSchemaProperty extends PropertySupport.Reflection {
086:
087: /**
088: * Creates a new instance of BaseSchemaProperty.
089: * @param component The schema component which property belongs to.
090: * @param valueType The class type of the property.
091: * @param property The property name.
092: * @param propDispName The display name of the property.
093: * @param propDesc Short description about the property.
094: * @param propEditorClass The property editor class
095: * if the property needs special property editor.
096: * If no property editor class is provided default editor
097: * (for type of property) will be used.
098: * The property editor class must provide a default constructor.
099: * Subclasses can also override
100: * getPropertyEditor method to provide property editor.
101: * @throws java.lang.NoSuchMethodException If no getter and setter for the property are found
102: */
103: public BaseSchemaProperty(SchemaComponent component,
104: Class valueType, String property, String propDispName,
105: String propDesc, Class propEditorClass)
106: throws NoSuchMethodException {
107: super (component, valueType, property);
108: super .setName(property);
109: super .setDisplayName(propDispName);
110: super .setShortDescription(propDesc);
111: if (propEditorClass != null)
112: super .setPropertyEditorClass(propEditorClass);
113: }
114:
115: /**
116: * Creates a new instance of BaseSchemaProperty.
117: * @param component The schema component which property belongs to.
118: * @param valueType The class type of the property.
119: * @param getter The property getter method.
120: * @param setter The property setter method.
121: * @param property The property name.
122: * @param propDispName The display name of the property.
123: * @param propDesc Short description about the property.
124: * @param propEditorClass The property editor class if the property needs
125: * special property editor. If no property editor
126: * class is provided default editor
127: * (for type of property) will be used.
128: * The property editor class must provide a
129: * default constructor. Subclasses can also override
130: * getPropertyEditor method to provide property editor.
131: */
132: public BaseSchemaProperty(SchemaComponent component,
133: Class valueType, Method getter, Method setter,
134: String property, String propDispName, String propDesc,
135: Class propEditorClass) {
136: super (component, valueType, getter, setter);
137: super .setName(property);
138: super .setDisplayName(propDispName);
139: super .setShortDescription(propDesc);
140: if (propEditorClass != null)
141: super .setPropertyEditorClass(propEditorClass);
142: }
143:
144: /**
145: * This api determines if this property is editable
146: * @return Returns true if the property is editable, false otherwise.
147: */
148: @Override
149: public boolean canWrite() {
150: // Check for null model since component may have been removed.
151: SchemaModel model = getComponent().getModel();
152: return XAMUtils.isWritable(model);
153: }
154:
155: // Methods to support restore to default
156: /**
157: * This api determines if this property has default value.
158: * If the property value is null, its considered as default value.
159: * Subclasses can override if different behaviour expected.
160: * @return Returns true if the property is default value, false otherwise.
161: */
162: @Override
163: public boolean isDefaultValue() {
164: try {
165: return getValue() == null;
166: } catch (IllegalArgumentException ex) {
167: } catch (InvocationTargetException ex) {
168: } catch (IllegalAccessException ex) {
169: }
170: return false;
171: }
172:
173: /**
174: * This api determines if this property supports resetting default value.
175: * This returns true always.
176: * Subclasses can override if different behaviour expected.
177: */
178: @Override
179: public boolean supportsDefaultValue() {
180: return true;
181: }
182:
183: /**
184: * This api resets the property to its default value.
185: * It sets property value to null which is considered as default value.
186: * Subclasses can override if different behaviour expected.
187: */
188: @Override
189: public void restoreDefaultValue() throws IllegalAccessException,
190: InvocationTargetException {
191: setValue(null);
192: }
193:
194: protected SchemaComponent getComponent() {
195: return (SchemaComponent) instance;
196: }
197:
198: protected void setComponent(SchemaComponent sc) {
199: instance = sc;
200: }
201:
202: /**
203: * Helper method to convert the first letter of a string to uppercase.
204: * And prefix the string with some next string.
205: */
206: public static String firstLetterToUpperCase(String s, String pref) {
207: switch (s.length()) {
208: case 0:
209: return pref;
210:
211: case 1:
212: return pref + Character.toUpperCase(s.charAt(0));
213:
214: default:
215: return pref + Character.toUpperCase(s.charAt(0))
216: + s.substring(1);
217: }
218: }
219:
220: }
|