001: /**
002: * L2FProd.com Common Components 7.3 License.
003: *
004: * Copyright 2005-2007 L2FProd.com
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */package com.l2fprod.common.beans;
018:
019: import java.beans.IntrospectionException;
020: import java.beans.PropertyDescriptor;
021: import java.lang.reflect.Method;
022: import java.util.Comparator;
023:
024: /**
025: * ExtendedPropertyDescriptor. <br>
026: *
027: */
028: public class ExtendedPropertyDescriptor extends PropertyDescriptor {
029:
030: private Class tableCellRendererClass = null;
031: private String category = "";
032:
033: public ExtendedPropertyDescriptor(String propertyName,
034: Class beanClass) throws IntrospectionException {
035: super (propertyName, beanClass);
036: }
037:
038: public ExtendedPropertyDescriptor(String propertyName,
039: Method getter, Method setter) throws IntrospectionException {
040: super (propertyName, getter, setter);
041: }
042:
043: public ExtendedPropertyDescriptor(String propertyName,
044: Class beanClass, String getterName, String setterName)
045: throws IntrospectionException {
046: super (propertyName, beanClass, getterName, setterName);
047: }
048:
049: /**
050: * Sets this property category
051: *
052: * @param category
053: * @return this property for chaining calls.
054: */
055: public ExtendedPropertyDescriptor setCategory(String category) {
056: this .category = category;
057: return this ;
058: }
059:
060: /**
061: * @return the category in which this property belongs
062: */
063: public String getCategory() {
064: return category;
065: }
066:
067: /**
068: * Force this property to be readonly
069: *
070: * @return this property for chaining calls.
071: */
072: public ExtendedPropertyDescriptor setReadOnly() {
073: try {
074: setWriteMethod(null);
075: } catch (IntrospectionException e) {
076: e.printStackTrace();
077: }
078: return this ;
079: }
080:
081: /**
082: * You can associate a special tablecellrenderer with a particular
083: * Property. If set to null default renderer will be used.
084: *
085: * @param tableCellRendererClass
086: */
087: public void setPropertyTableRendererClass(
088: Class tableCellRendererClass) {
089: this .tableCellRendererClass = tableCellRendererClass;
090: }
091:
092: /**
093: * @return null or a custom TableCellRenderer-Class for this property
094: */
095: public Class getPropertyTableRendererClass() {
096: return (this .tableCellRendererClass);
097: }
098:
099: public static ExtendedPropertyDescriptor newPropertyDescriptor(
100: String propertyName, Class beanClass)
101: throws IntrospectionException {
102: // the same initialization phase as in the PropertyDescriptor
103: Method readMethod = BeanUtils.getReadMethod(beanClass,
104: propertyName);
105: Method writeMethod = null;
106:
107: if (readMethod == null) {
108: throw new IntrospectionException("No getter for property "
109: + propertyName + " in class " + beanClass.getName());
110: }
111:
112: writeMethod = BeanUtils.getWriteMethod(beanClass, propertyName,
113: readMethod.getReturnType());
114:
115: return new ExtendedPropertyDescriptor(propertyName, readMethod,
116: writeMethod);
117: }
118:
119: public static final Comparator BY_CATEGORY_COMPARATOR = new Comparator() {
120: public int compare(Object o1, Object o2) {
121: PropertyDescriptor desc1 = (PropertyDescriptor) o1;
122: PropertyDescriptor desc2 = (PropertyDescriptor) o2;
123:
124: if (desc1 == null && desc2 == null) {
125: return 0;
126: } else if (desc1 != null && desc2 == null) {
127: return 1;
128: } else if (desc1 == null && desc2 != null) {
129: return -1;
130: } else {
131: if (desc1 instanceof ExtendedPropertyDescriptor
132: && !(desc2 instanceof ExtendedPropertyDescriptor)) {
133: return -1;
134: } else if (!(desc1 instanceof ExtendedPropertyDescriptor)
135: && desc2 instanceof ExtendedPropertyDescriptor) {
136: return 1;
137: } else if (!(desc1 instanceof ExtendedPropertyDescriptor)
138: && !(desc2 instanceof ExtendedPropertyDescriptor)) {
139: return String.CASE_INSENSITIVE_ORDER.compare(desc1
140: .getDisplayName(), desc2.getDisplayName());
141: } else {
142: int category = String.CASE_INSENSITIVE_ORDER
143: .compare(
144: ((ExtendedPropertyDescriptor) desc1)
145: .getCategory() == null ? ""
146: : ((ExtendedPropertyDescriptor) desc1)
147: .getCategory(),
148: ((ExtendedPropertyDescriptor) desc2)
149: .getCategory() == null ? ""
150: : ((ExtendedPropertyDescriptor) desc2)
151: .getCategory());
152: if (category == 0) {
153: return String.CASE_INSENSITIVE_ORDER.compare(
154: desc1.getDisplayName(), desc2
155: .getDisplayName());
156: } else {
157: return category;
158: }
159: }
160: }
161: }
162: };
163:
164: }
|