001 // Copyright 2007, 2008, 2010, 2011 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5.corelib.components;
016
017 import org.apache.tapestry5.BindingConstants;
018 import org.apache.tapestry5.ComponentResources;
019 import org.apache.tapestry5.annotations.Parameter;
020 import org.apache.tapestry5.annotations.Property;
021 import org.apache.tapestry5.annotations.SupportsInformalParameters;
022 import org.apache.tapestry5.beaneditor.BeanModel;
023 import org.apache.tapestry5.beaneditor.PropertyModel;
024 import org.apache.tapestry5.internal.beaneditor.BeanModelUtils;
025 import org.apache.tapestry5.ioc.annotations.Inject;
026 import org.apache.tapestry5.services.BeanModelSource;
027
028 /**
029 * Used to display the properties of a bean, using an underlying {@link BeanModel}. The output definition list: a
030 * <dl> element containing a series of <dt>/<dd> pairs. The property label is used as the <dt>
031 * and the property value (formatted as per the datatype) is the <dd>. Only properties that have a known data type
032 * are displayed.
033 * <p/>
034 * The property id is used as the class attribute of the <dt> and <dd> element, allowing CSS customization
035 * per property. This does not occur when lean is bound to true.
036 * <p/>
037 * The outer <dl> element has the CSS class "t-beandisplay".
038 *
039 * @see org.apache.tapestry5.beaneditor.DataType
040 * @see BeanModel
041 * @tapestrydoc
042 * @see BeanEditForm
043 * @see Grid
044 */
045 @SupportsInformalParameters
046 public class BeanDisplay
047 {
048
049 /**
050 * The object to be rendered; if not explicitly bound, a default binding to a property whose name matches this
051 * component's id will be used.
052 */
053 @Parameter(required = true, allowNull = false, autoconnect = true)
054 @Property(write = false)
055 private Object object;
056
057 /**
058 * If true, then the CSS class attribute on the <dt> and <dd> elements will be ommitted.
059 */
060 @Parameter(value = "false")
061 private boolean lean;
062
063 /**
064 * The model that identifies the parameters to be edited, their order, and every other aspect. If not specified, a
065 * default bean model will be created from the type of the object bound to the object parameter. The add, include,
066 * exclude and reorder
067 * parameters are <em>only</em> applied to a default model, not an explicitly provided one.
068 */
069 @Parameter
070 @Property(write = false)
071 private BeanModel model;
072 /**
073 * A comma-separated list of property names to be retained from the
074 * {@link org.apache.tapestry5.beaneditor.BeanModel} (only used
075 * when a default model is created automatically).
076 * Only these properties will be retained, and the properties will also be reordered. The names are
077 * case-insensitive.
078 */
079 @Parameter(defaultPrefix = BindingConstants.LITERAL)
080 private String include;
081
082 /**
083 * A comma-separated list of property names to be removed from the {@link org.apache.tapestry5.beaneditor.BeanModel}
084 * (only used
085 * when a default model is created automatically).
086 * The names are case-insensitive.
087 */
088 @Parameter(defaultPrefix = BindingConstants.LITERAL)
089 private String exclude;
090
091 /**
092 * A comma-separated list of property names indicating the order in which the properties should be presented. The
093 * names are case insensitive. Any properties not indicated in the list will be appended to the end of the display
094 * orde. Only used
095 * when a default model is created automatically.
096 */
097 @Parameter(defaultPrefix = BindingConstants.LITERAL)
098 private String reorder;
099
100 /**
101 * A comma-separated list of property names to be added to the {@link org.apache.tapestry5.beaneditor.BeanModel}
102 * (only used
103 * when a default model is created automatically).
104 */
105 @Parameter(defaultPrefix = BindingConstants.LITERAL)
106 private String add;
107
108 /**
109 * Where to search for local overrides of property display blocks as block parameters. Further, the container of the
110 * overrides is used as the source for overridden validation messages. This is normally the component itself, but
111 * when the component is used within a BeanEditForm, it will be the BeanEditForm's block parameter that will be
112 * searched.
113 */
114 @Parameter(value = "componentResources")
115 @Property(write = false)
116 private ComponentResources overrides;
117
118 @Inject
119 private ComponentResources resources;
120
121 @Inject
122 private BeanModelSource modelSource;
123
124 @Property
125 private String propertyName;
126
127 void setupRender()
128 {
129 if (model == null)
130 {
131 model = modelSource.createDisplayModel(object.getClass(), overrides.getContainerMessages());
132
133 BeanModelUtils.modify(model, add, include, exclude, reorder);
134 }
135 }
136
137 /**
138 * Returns the property model for the current property.
139 */
140 public PropertyModel getPropertyModel()
141 {
142 return model.get(propertyName);
143 }
144
145 public String getPropertyClass()
146 {
147 return lean ? null : getPropertyModel().getId();
148 }
149 }