| /* |
| * 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; |
| } |
| } |