001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.visualweb.propertyeditors.binding.nodes;
042:
043: import java.beans.BeanInfo;
044: import java.beans.Introspector;
045: import java.beans.PropertyDescriptor;
046: import java.util.Map;
047: import com.sun.rave.designtime.DesignBean;
048: import org.netbeans.modules.visualweb.propertyeditors.binding.BindingTargetNode;
049: import org.netbeans.modules.visualweb.propertyeditors.binding.BindingTargetNodeFactory;
050: import org.netbeans.modules.visualweb.propertyeditors.binding.PropertyBindingHelper;
051: import org.netbeans.modules.visualweb.propertyeditors.util.Bundle;
052:
053: public class MapTargetNodeFactory implements BindingTargetNodeFactory {
054:
055: private static final Bundle bundle = Bundle
056: .getBundle(MapTargetNodeFactory.class);
057:
058: public boolean supportsTargetClass(Class targetClass) {
059: return Map.class.isAssignableFrom(targetClass);
060: }
061:
062: public BindingTargetNode createTargetNode(BindingTargetNode parent,
063: DesignBean bean, PropertyDescriptor[] propPath,
064: Object propInstance) {
065: return new MapTargetNode(parent, bean, propPath, propInstance);
066: }
067:
068: public class MapTargetNode extends PropertyTargetNode {
069: public MapTargetNode(BindingTargetNode parent, DesignBean bean,
070: PropertyDescriptor[] propPath, Object propInstance) {
071: super (parent, bean, propPath, propInstance);
072: }
073:
074: public void lazyLoadCustomTargetNodes() {
075: if (propInstance == null) {
076: propInstance = PropertyBindingHelper.getPropInstance(
077: bean, propPath);
078: }
079: if (propInstance instanceof Map) {
080: Map map = (Map) propInstance;
081: Object[] keys = map.keySet().toArray();
082: for (int i = 0; i < keys.length; i++) {
083: if (keys[i] instanceof String) {
084: super .add(new KeyNode(this , bean, propPath,
085: map, keys[i]));
086: }
087: }
088: }
089: }
090:
091: public class KeyNode extends BindingTargetNode {
092: protected DesignBean bean;
093: protected PropertyDescriptor[] propPath;
094: protected Map map;
095: protected Object key;
096:
097: public KeyNode(BindingTargetNode parent, DesignBean bean,
098: PropertyDescriptor[] propPath, Map map, Object key) {
099: super (parent);
100: this .bean = bean;
101: this .propPath = propPath;
102: this .map = map;
103: this .key = key;
104: }
105:
106: public boolean lazyLoad() {
107: // try {
108: // BeanInfo bi = Introspector.getBeanInfo(getTargetTypeClass());
109: // PropertyDescriptor[] pds = bi.getPropertyDescriptors();
110: // for (int i = 0; pds != null && i < pds.length; i++) {
111: // if (pds[i].getReadMethod() != null) {
112: // PropertyDescriptor[] newPath = new PropertyDescriptor[propPath.length + 1];
113: // System.arraycopy(propPath, 0, newPath, 0, propPath.length);
114: // newPath[newPath.length - 1] = pds[i];
115: // super.add(_createTargetNode(this, bean, newPath, null));
116: // }
117: // }
118: // }
119: // catch (Exception x) {
120: // x.printStackTrace();
121: // }
122: return true;
123: }
124:
125: public boolean isValidBindingTarget() {
126: return true;
127: }
128:
129: public String getBindingExpressionPart() {
130: return "" + key; //NOI18N
131: }
132:
133: public Class getTargetTypeClass() {
134: return map.get(key).getClass();
135: }
136:
137: public String getDisplayText(boolean enableNode) {
138: String tn = getTargetTypeDisplayName();
139: StringBuffer sb = new StringBuffer();
140: sb.append("<html>"); //NOI18N
141: if (!enableNode) {
142: sb.append("<font color=\"gray\">"); //NOI18N
143: }
144: sb.append(bundle.getMessage("key")); //NOI18N
145: sb.append(" "); //NOI18N
146: if (enableNode) {
147: sb.append("<b>"); //NOI18N
148: }
149: sb.append(key);
150: if (enableNode) {
151: sb.append("</b>"); //NOI18N
152: }
153: sb.append(" <font size=\"-1\"><i>"); //NOI18N
154: sb.append(tn);
155: sb.append("</i></font>"); //NOI18N
156: if (!enableNode) {
157: sb.append("</font>"); //NOI18N
158: }
159: sb.append("</html>"); //NOI18N
160: return sb.toString();
161: }
162: }
163: }
164: }
|