1 11 package org.eclipse.core.commands; 12 13 import org.eclipse.core.commands.common.HandleObject; 14 import org.eclipse.core.commands.common.NotDefinedException; 15 import org.eclipse.core.internal.commands.util.Util; 16 17 46 public final class ParameterType extends HandleObject implements Comparable { 47 48 60 private static final boolean isInstanceOf(final Object element, 61 final String type) { 62 if (element == null) { 64 return false; 65 } 66 return isSubtype(element.getClass(), type); 67 } 68 69 81 private static final boolean isSubtype(final Class clazz, final String type) { 82 if (clazz.getName().equals(type)) { 83 return true; 84 } 85 final Class superClass = clazz.getSuperclass(); 86 if (superClass != null && isSubtype(superClass, type)) { 87 return true; 88 } 89 final Class [] interfaces = clazz.getInterfaces(); 90 for (int i = 0; i < interfaces.length; i++) { 91 if (isSubtype(interfaces[i], type)) { 92 return true; 93 } 94 } 95 return false; 96 } 97 98 102 private transient AbstractParameterValueConverter parameterTypeConverter; 103 104 109 private transient String type = null; 110 111 122 ParameterType(final String id) { 123 super(id); 124 } 125 126 133 public final void addListener(final IParameterTypeListener listener) { 134 addListenerObject(listener); 135 } 136 137 147 public final int compareTo(final Object object) { 148 final ParameterType castedObject = (ParameterType) object; 149 int compareTo = Util.compare(defined, castedObject.defined); 150 if (compareTo == 0) { 151 compareTo = Util.compare(id, castedObject.id); 152 } 153 return compareTo; 154 } 155 156 174 public final void define(final String type, 175 final AbstractParameterValueConverter parameterTypeConverter) { 176 177 final boolean definedChanged = !this.defined; 178 this.defined = true; 179 180 this.type = (type == null) ? Object .class.getName() : type; 181 this.parameterTypeConverter = parameterTypeConverter; 182 183 fireParameterTypeChanged(new ParameterTypeEvent(this, definedChanged)); 184 } 185 186 194 private final void fireParameterTypeChanged(final ParameterTypeEvent event) { 195 if (event == null) { 196 throw new NullPointerException ( 197 "Cannot send a null event to listeners."); } 199 200 if (!isListenerAttached()) { 201 return; 202 } 203 204 final Object [] listeners = getListeners(); 205 for (int i = 0; i < listeners.length; i++) { 206 final IParameterTypeListener listener = (IParameterTypeListener) listeners[i]; 207 listener.parameterTypeChanged(event); 208 } 209 } 210 211 219 public final AbstractParameterValueConverter getValueConverter() 220 throws NotDefinedException { 221 if (!isDefined()) { 222 throw new NotDefinedException( 223 "Cannot use getValueConverter() with an undefined ParameterType"); } 225 226 return parameterTypeConverter; 227 } 228 229 242 public boolean isCompatible(Object value) throws NotDefinedException { 243 if (!isDefined()) { 244 throw new NotDefinedException( 245 "Cannot use isCompatible() with an undefined ParameterType"); } 247 return isInstanceOf(value, type); 248 } 249 250 259 public final void removeListener(final IParameterTypeListener listener) { 260 removeListenerObject(listener); 261 } 262 263 269 public final String toString() { 270 if (string == null) { 271 final StringBuffer stringBuffer = new StringBuffer (); 272 stringBuffer.append("ParameterType("); stringBuffer.append(id); 274 stringBuffer.append(','); 275 stringBuffer.append(defined); 276 stringBuffer.append(')'); 277 string = stringBuffer.toString(); 278 } 279 return string; 280 } 281 282 286 public final void undefine() { 287 string = null; 288 289 final boolean definedChanged = defined; 290 defined = false; 291 292 type = null; 293 parameterTypeConverter = null; 294 295 fireParameterTypeChanged(new ParameterTypeEvent(this, definedChanged)); 296 } 297 298 } 299 | Popular Tags |