blob: 7c51f93eef140a77a16f9301298ad146eb4650f6 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed 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 com.intellij.uiDesigner.lw;
import com.intellij.uiDesigner.compiler.Utils;
import javax.swing.*;
import java.awt.*;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
/**
* @author Anton Katilin
* @author Vladimir Kondratyev
*/
public final class CompiledClassPropertiesProvider implements PropertiesProvider {
private final ClassLoader myLoader;
private final HashMap myCache;
public CompiledClassPropertiesProvider(final ClassLoader loader) {
if (loader == null) {
throw new IllegalArgumentException("loader cannot be null");
}
myLoader = loader;
myCache = new HashMap();
}
public HashMap getLwProperties(final String className) {
if (myCache.containsKey(className)) {
return (HashMap)myCache.get(className);
}
if (Utils.validateJComponentClass(myLoader, className, false) != null) {
return null;
}
final Class aClass;
try {
aClass = Class.forName(className, false, myLoader);
}
catch (final ClassNotFoundException exc) {
throw new RuntimeException(exc.toString()); // should never happen
}
final BeanInfo beanInfo;
try {
beanInfo = Introspector.getBeanInfo(aClass);
}
catch (Throwable e) {
return null;
}
final HashMap result = new HashMap();
final PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < descriptors.length; i++) {
final PropertyDescriptor descriptor = descriptors[i];
final Method readMethod = descriptor.getReadMethod();
final Method writeMethod = descriptor.getWriteMethod();
final Class propertyType = descriptor.getPropertyType();
if (writeMethod == null || readMethod == null || propertyType == null) {
continue;
}
final String name = descriptor.getName();
final LwIntrospectedProperty property = propertyFromClass(propertyType, name);
if (property != null) {
property.setDeclaringClassName(descriptor.getReadMethod().getDeclaringClass().getName());
result.put(name, property);
}
}
myCache.put(className, result);
return result;
}
public static LwIntrospectedProperty propertyFromClass(final Class propertyType, final String name) {
LwIntrospectedProperty property = propertyFromClassName(propertyType.getName(), name);
if (property == null) {
if (Component.class.isAssignableFrom(propertyType)) {
property = new LwIntroComponentProperty(name, propertyType.getName());
}
else if (ListModel.class.isAssignableFrom(propertyType)) {
property = new LwIntroListModelProperty(name, propertyType.getName());
}
else if (propertyType.getSuperclass() != null && "java.lang.Enum".equals(propertyType.getSuperclass().getName())) {
property = new LwIntroEnumProperty(name, propertyType);
}
}
return property;
}
public static LwIntrospectedProperty propertyFromClassName(final String propertyClassName, final String name) {
final LwIntrospectedProperty property;
if (int.class.getName().equals(propertyClassName)) { // int
property = new LwIntroIntProperty(name);
}
else if (boolean.class.getName().equals(propertyClassName)) { // boolean
property = new LwIntroBooleanProperty(name);
}
else if (double.class.getName().equals(propertyClassName)) { // double
property = new LwIntroPrimitiveTypeProperty(name, Double.class);
}
else if (float.class.getName().equals(propertyClassName)) {
property = new LwIntroPrimitiveTypeProperty(name, Float.class);
}
else if (long.class.getName().equals(propertyClassName)) {
property = new LwIntroPrimitiveTypeProperty(name, Long.class);
}
else if (byte.class.getName().equals(propertyClassName)) {
property = new LwIntroPrimitiveTypeProperty(name, Byte.class);
}
else if (short.class.getName().equals(propertyClassName)) {
property = new LwIntroPrimitiveTypeProperty(name, Short.class);
}
else if (char.class.getName().equals(propertyClassName)) {
property = new LwIntroCharProperty(name);
}
else if (String.class.getName().equals(propertyClassName)) { // java.lang.String
property = new LwRbIntroStringProperty(name);
}
else if ("java.awt.Insets".equals(propertyClassName)) { // java.awt.Insets
property = new LwIntroInsetsProperty(name);
}
else if ("java.awt.Dimension".equals(propertyClassName)) { // java.awt.Dimension
property = new LwIntroDimensionProperty(name);
}
else if ("java.awt.Rectangle".equals(propertyClassName)) { // java.awt.Rectangle
property = new LwIntroRectangleProperty(name);
}
else if ("java.awt.Color".equals(propertyClassName)) {
property = new LwIntroColorProperty(name);
}
else if ("java.awt.Font".equals(propertyClassName)) {
property = new LwIntroFontProperty(name);
}
else if ("javax.swing.Icon".equals(propertyClassName)) {
property = new LwIntroIconProperty(name);
}
else {
property = null;
}
return property;
}
}