package org.openswing.swing.client;
import java.beans.*;
import java.util.*;
import javax.swing.*;
import org.openswing.swing.message.receive.java.*;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Editor used in design time to select an attribute name from the value object.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
*
* <p> This file is part of OpenSwing Framework.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the (LGPL) Lesser General Public
* License as published by the Free Software Foundation;
*
* GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* The author may be contacted at:
* maurocarniel@tin.it</p>
*
* @author Mauro Carniel
* @version 1.0
*/
public class AttributeNameEditor extends PropertyEditorSupport {
/** default value object */
private static final Class DEFAULT_VO_CLASS_NAME = ValueObjectImpl.class;
/** v.o. class linked to this Form panel; used only in design time */
private static Class designVOClass;
/** list of tags */
private String[] attributeNames;
public AttributeNameEditor() {
}
public String[] getTags() {
attributeNames = new String[0];
try {
if (designVOClass==null) {
if (designVOClass==null) {
designVOClass = DEFAULT_VO_CLASS_NAME;
}
}
Object o = designVOClass.newInstance();
if (o instanceof ValueObject) {
try {
ArrayList attrList = new ArrayList();
analyzeClassFields("",attrList,designVOClass);
attributeNames = (String[])attrList.toArray(new String[attrList.size()]);
}
catch (Exception ex) {
JOptionPane.showMessageDialog(null,"Error while fetching attribute names:\n"+ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(null,designVOClass.getName()+" does not extend ValueObject class.","Error",JOptionPane.ERROR_MESSAGE);
}
}
catch (Throwable ex) {
JOptionPane.showMessageDialog(null,"Error while analyzing Value Object:\n"+ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
}
return attributeNames;
}
private void analyzeClassFields(String prefix,ArrayList attributes,Class classType) {
try {
if (classType!=null) {
if (prefix.split("\\.").length>3) {
return;
}
}
BeanInfo info = Introspector.getBeanInfo(classType);
// retrieve attribute properties...
PropertyDescriptor[] props = info.getPropertyDescriptors();
for (int i = 0; i < props.length; i++) {
if (props[i].getReadMethod()!=null &&
props[i].getReadMethod().getParameterTypes().length==0 &&
ValueObject.class.isAssignableFrom( props[i].getReadMethod().getReturnType() )
) {
analyzeClassFields(prefix+props[i].getName()+".",attributes,props[i].getReadMethod().getReturnType());
}
if (props[i].getReadMethod().getReturnType()!=null &&
isCompatible(props[i].getReadMethod().getReturnType()) &&
!props[i].getName().equals("class"))
attributes.add(prefix+props[i].getName());
}
}
catch (Throwable ex) {
}
}
/**
* @param attrType tipo dell'attributo
* @return "true" se i due tipi sono compatibili, "false" altrimenti
*/
protected boolean isCompatible(Class attrType) {
return true;
}
public String getJavaInitializationString() {
if (attributeNames==null)
getTags();
if (attributeNames==null)
return "";
for(int i=0;i<attributeNames.length;i++)
if (getValue().equals(attributeNames[i]))
return "\""+attributeNames[i]+"\"";
return "";
}
public void setAsText(String text) throws IllegalArgumentException {
setValue(text);
}
public String getAsText() {
return (String)getValue();
}
public static void setDesignVOClass(Class voClass) {
designVOClass = voClass;
}
}