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-2006 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.vmd.api.model;
042:
043: import java.util.*;
044:
045: /**
046: * This class represents a component descriptor. It is registered in the component descriptor registry and then available
047: * for using in document. Component itself is just a data container and does not know anything about these data.
048: * On the other hand a component descriptor does not contain data but describes types of these data.
049: *
050: * @author David Kaspar
051: */
052: public abstract class ComponentDescriptor {
053:
054: private Collection<PropertyDescriptor> propertyDescriptors;
055: private ComponentDescriptor super Descriptor;
056:
057: /**
058: * Returns a super descriptor.
059: * <p>
060: * Note: This is available when a component is registered by registry.
061: * @return the super descriptor.
062: */
063: public final ComponentDescriptor getSuperDescriptor() {
064: return super Descriptor;
065: }
066:
067: /**
068: * Returns a full collection of all property descriptors.
069: * <p>
070: * Note: This is available when a component is registered by registry.
071: * @return the collection of property descriptors.
072: */
073: public final Collection<PropertyDescriptor> getPropertyDescriptors() {
074: return propertyDescriptors;
075: }
076:
077: /**
078: * Returns a property descriptor for a property.
079: * @param propertyName the property name
080: * @return the property descriptor
081: */
082: public final PropertyDescriptor getPropertyDescriptor(
083: String propertyName) {
084: // HINT - optimize to HashMap
085: for (PropertyDescriptor propertyDescriptor : getPropertyDescriptors()) {
086: if (propertyName.equals(propertyDescriptor.getName()))
087: return propertyDescriptor;
088: }
089: return null;
090: }
091:
092: final void setSuperComponentDescriptor(
093: ComponentDescriptor super Descriptor) {
094: assert Debug.isFriend(GlobalDescriptorRegistry.class,
095: "resolveDescriptor")
096: || Debug.isFriend(GlobalDescriptorRegistry.class,
097: "reloadCore")
098: || Debug.isFriend(DescriptorRegistry.class,
099: "reloadCore"); // NOI18N
100: this .super Descriptor = super Descriptor;
101: }
102:
103: final void setPropertyDescriptors(
104: Collection<PropertyDescriptor> propertyDescriptors) {
105: assert Debug.isFriend(GlobalDescriptorRegistry.class,
106: "resolveDescriptor")
107: || Debug.isFriend(GlobalDescriptorRegistry.class,
108: "reloadCore")
109: || Debug.isFriend(DescriptorRegistry.class,
110: "reloadCore"); // NOI18N
111: this .propertyDescriptors = propertyDescriptors == null ? null
112: : Collections
113: .unmodifiableCollection(new ArrayList<PropertyDescriptor>(
114: propertyDescriptors));
115: }
116:
117: /**
118: * Returns a debug string.
119: * @return the string
120: */
121: @Override
122: public final String toString() {
123: TypeDescriptor typeDescriptor = getTypeDescriptor();
124: if (typeDescriptor == null)
125: return super .toString();
126: return typeDescriptor.getThisType().toString();
127: }
128:
129: /**
130: * Post-initialize created component.
131: * @param component the created component
132: */
133: public void postInitialize(DesignComponent component) {
134: }
135:
136: /**
137: * Returns a type descriptor of this component descriptor.
138: * @return the type descriptor
139: */
140: public abstract TypeDescriptor getTypeDescriptor();
141:
142: /**
143: * Returns a version descriptor of this component descriptor.
144: * @return the version descriptor
145: */
146: public abstract VersionDescriptor getVersionDescriptor();
147:
148: /**
149: * Returns a collection of property names that should be masked/hidden from a collection of property descriptors
150: * that are inherited from the super component descriptor.
151: * @return the collection of property names
152: */
153: public Collection<String> getExcludedPropertyDescriptorNames() {
154: return null;
155: }
156:
157: /**
158: * Returns a list of property descriptors that are newly declared in the component descriptor or override property descriptors from the super component descriptor.
159: * @return the list of property descriptors
160: */
161: public abstract List<PropertyDescriptor> getDeclaredPropertyDescriptors();
162:
163: /**
164: * Returns a palette descriptor.
165: * @return the palette descriptor; if non-null, then default ComponentProducer will be created
166: */
167: // TODO - obsolete - remove this method
168: public PaletteDescriptor getPaletteDescriptor() {
169: return null;
170: }
171:
172: /**
173: * Gather presenters. Override this method when you need to excluded or filter the list of presenter created by super component descriptors.
174: * @param presenters a list of presenters created by super component descriptors
175: */
176: protected void gatherPresenters(ArrayList<Presenter> presenters) {
177: List<? extends Presenter> array = createPresenters();
178: if (array != null)
179: for (Presenter presenter : array) {
180: if (presenter != null)
181: presenters.add(presenter);
182: else
183: Debug.warning("Null presenter", this ); // NOI18N
184: }
185: }
186:
187: /**
188: * Returns a list of new instances of presenters that are declared in the component descriptor or override presenters
189: * from the super component descriptor.
190: * @return the list of presenters
191: */
192: protected abstract List<? extends Presenter> createPresenters();
193:
194: }
|