package pt.ist.renderers; import pt.ist.renderers.CollectionRenderer.CollectionTabularLayout; import pt.ist.renderers.components.HtmlComponent; import pt.ist.renderers.components.HtmlContainer; import pt.ist.renderers.components.HtmlInlineContainer; import pt.ist.renderers.components.HtmlInputComponent; import pt.ist.renderers.components.HtmlSimpleValueComponent; import pt.ist.renderers.components.HtmlText; import pt.ist.renderers.components.Validatable; import pt.ist.renderers.layouts.Layout; import pt.ist.renderers.layouts.TabularLayout; import pt.ist.renderers.model.MetaSlot; import pt.ist.renderers.validators.HtmlChainValidator; /** * This renderer allows to edit all objects of a collection at the same time. * The presentation is very similar to the one of * {@link pt.ist.renderers.CollectionRenderer} but instead of * presentig the slot's value in each cell, the slot's editor is shown. * *

* Example: * * * * * * * * * * * * * * * * * * * *
NameAgeGender
* * @author cfgi */ public class TabularInputRenderer extends InputRenderer { private CollectionRenderer collectionRenderer; private String validatorClasses; private boolean hideValidators = true; private boolean allValidatorsInline = false; public TabularInputRenderer() { this.collectionRenderer = new CollectionRenderer() { @Override protected HtmlComponent renderSlot(MetaSlot slot) { return TabularInputRenderer.this.renderSlot(slot); } }; } public String getClasses() { return this.collectionRenderer.getClasses(); } public String getStyle() { return this.collectionRenderer.getStyle(); } public String getTitle() { return this.collectionRenderer.getTitle(); } public String getCaption() { return this.collectionRenderer.getCaption(); } public String getSummary() { return collectionRenderer.getSummary(); } public String getHeaderClasses() { return this.collectionRenderer.getHeaderClasses(); } public String getColumnClasses() { return this.collectionRenderer.getColumnClasses(); } public String getRowClasses() { return this.collectionRenderer.getRowClasses(); } public String getPrefixes() { return this.collectionRenderer.getPrefixes(); } public String getSuffixes() { return this.collectionRenderer.getSuffixes(); } public String getBundle(String name) { return this.collectionRenderer.getBundle(name); } public String getKey(String name) { return this.collectionRenderer.getKey(name); } public String getLink(String name) { return this.collectionRenderer.getLink(name); } public String getModule(String name) { return this.collectionRenderer.getModule(name); } public String getOrder(String name) { return this.collectionRenderer.getOrder(name); } public String getParam(String name) { return this.collectionRenderer.getParam(name); } public String getText(String name) { return this.collectionRenderer.getText(name); } public boolean isExcludedFromFirst(String name) { return this.collectionRenderer.isExcludedFromFirst(name); } public boolean isExcludedFromLast(String name) { return this.collectionRenderer.isExcludedFromLast(name); } public String getVisibleIf(String name) { return this.collectionRenderer.getVisibleIf(name); } public String getVisibleIfNot(String name) { return this.collectionRenderer.getVisibleIfNot(name); } public String getLinkFormat(String name) { return this.collectionRenderer.getLinkFormat(name); } public String getContextRelative(String name) { return this.collectionRenderer.getContextRelative(name); } public String getCustomLink(String name) { return this.collectionRenderer.getCustomLink(name); } public boolean getDisplayHeaders() { return this.collectionRenderer.getDisplayHeaders(); } public String getLinkGroupSeparator() { return this.collectionRenderer.getLinkGroupSeparator(); } public boolean isGroupLinks() { return this.collectionRenderer.isGroupLinks(); } public boolean isRowForLinks() { return this.collectionRenderer.isRowForLinks(); } /** * {@inheritDoc} * * @property */ public void setCaption(String caption) { this.collectionRenderer.setCaption(caption); } /** * {@inheritDoc} * * @property */ public void setSummary(String summary) { collectionRenderer.setSummary(summary); } /** * {@inheritDoc} * * @property */ public void setClasses(String classes) { this.collectionRenderer.setClasses(classes); } /** * {@inheritDoc} * * @property */ public void setStyle(String style) { this.collectionRenderer.setStyle(style); } /** * {@inheritDoc} * * @property */ public void setTitle(String title) { this.collectionRenderer.setTitle(title); } /** * The classes to be used in each header cell. See * {@link CollectionRenderer#setHeaderClasses(String)}. * * @property */ public void setHeaderClasses(String headerClasses) { this.collectionRenderer.setHeaderClasses(headerClasses); } /** * The classes to be used in each row's cell. See * {@link CollectionRenderer#setColumnClasses(String)}. * * @property */ public void setColumnClasses(String columnClasses) { this.collectionRenderer.setColumnClasses(columnClasses); } /** * The classes to be used in each row. See * {@link CollectionRenderer#setRowClasses(String)}. * * @property */ public void setRowClasses(String rowClasses) { this.collectionRenderer.setRowClasses(rowClasses); } /** * The text to be added as a prefix to each cell. * * @property */ public void setPrefixes(String prefixes) { this.collectionRenderer.setPrefixes(prefixes); } /** * The text to be added as a suffix of each cell. * * @property */ public void setSuffixes(String suffixes) { this.collectionRenderer.setSuffixes(suffixes); } /** * Allows you choose the order of the objects in the table. See * {@link CollectionRenderer#setSortBy(String)}. * * @property */ public void setSortBy(String sortBy) { this.collectionRenderer.setSortBy(sortBy); } /** * See {@link CollectionRenderer#setBundle(String, String)}. * * @property */ public void setBundle(String name, String value) { this.collectionRenderer.setBundle(name, value); } /** * See {@link CollectionRenderer#setKey(String, String)}. * * @property */ public void setKey(String name, String value) { this.collectionRenderer.setKey(name, value); } /** * See {@link CollectionRenderer#setLink(String, String)}. * * @property */ public void setLink(String name, String value) { this.collectionRenderer.setLink(name, value); } /** * See {@link CollectionRenderer#setModule(String, String)}. * * @property */ public void setModule(String name, String value) { this.collectionRenderer.setModule(name, value); } /** * See {@link CollectionRenderer#setOrder(String, String)}. * * @property */ public void setOrder(String name, String value) { this.collectionRenderer.setOrder(name, value); } /** * See {@link CollectionRenderer#setParam(String, String)}. * * @property */ public void setParam(String name, String value) { this.collectionRenderer.setParam(name, value); } /** * See {@link CollectionRenderer#setText(String, String)}. * * @property */ public void setText(String name, String value) { this.collectionRenderer.setText(name, value); } /** * See {@link CollectionRenderer#setExcludedFromFirst(String, String)}. * * @property */ public void setExcludedFromFirst(String name, String value) { this.collectionRenderer.setExcludedFromFirst(name, value); } /** * See {@link CollectionRenderer#setExcludedFromLast(String, String)}. * * @property */ public void setExcludedFromLast(String name, String value) { this.collectionRenderer.setExcludedFromLast(name, value); } /** * See {@link CollectionRenderer#setVisibleIf(String, String)}. * * @property */ public void setVisibleIf(String name, String value) { this.collectionRenderer.setVisibleIf(name, value); } /** * See {@link CollectionRenderer#setVisibleIfNot(String, String)}. * * @property */ public void setVisibleIfNot(String name, String value) { this.collectionRenderer.setVisibleIfNot(name, value); } /** * See {@link CollectionRenderer#setLinkFormat(String, String)}. * * @property */ public void setLinkFormat(String name, String value) { this.collectionRenderer.setLinkFormat(name, value); } /** * See {@link CollectionRenderer#setContextRelative(String, String)}. * * @property */ public void setContextRelative(String name, String value) { this.collectionRenderer.setContextRelative(name, value); } /** * See {@link CollectionRenderer#setCustomLink(String, String)}. * * @property */ public void setCustomLink(String name, String value) { this.collectionRenderer.setCustomLink(name, value); } /** * See {@link CollectionRenderer#setDisplayHeaders(boolean)}. * * @property */ public void setDisplayHeaders(boolean displayHeaders) { this.collectionRenderer.setDisplayHeaders(displayHeaders); } /** * See {@link CollectionRenderer#setGroupLinks(boolean)}. * * @property */ public void setGroupLinks(boolean groupLinks) { this.collectionRenderer.setGroupLinks(groupLinks); } /** * See {@link CollectionRenderer#setLinkGroupSeparator(String)}. * * @property */ public void setLinkGroupSeparator(String linkGroupSeparator) { this.collectionRenderer.setLinkGroupSeparator(linkGroupSeparator); } /** * See {@link CollectionRenderer#setRowForLinks(boolean)}. * * @property */ public void setRowForLinks(boolean rowForLinks) { this.collectionRenderer.setRowForLinks(rowForLinks); } public String getValidatorClasses() { return validatorClasses; } public void setValidatorClasses(String validatorClasses) { this.validatorClasses = validatorClasses; } public boolean isHideValidators() { return hideValidators; } public void setHideValidators(boolean hideValidators) { this.hideValidators = hideValidators; } public void setAllValidatorsInline(boolean allValidatorsInline) { this.allValidatorsInline = allValidatorsInline; } public boolean isAllValidatorsInline() { return allValidatorsInline; } @Override protected Layout getLayout(Object object, Class type) { this.collectionRenderer.setContext(getContext()); final CollectionTabularLayout layout = (CollectionTabularLayout) this.collectionRenderer.getLayout(object, type); return new TabularLayout() { @Override protected boolean hasHeader() { return layout.hasHeader(); } @Override protected int getNumberOfColumns() { return layout.getNumberOfColumns(); } @Override protected int getNumberOfRows() { return layout.getNumberOfRows(); } @Override protected HtmlComponent getHeaderComponent(int columnIndex) { return layout.getHeaderComponent(columnIndex); } @Override protected HtmlComponent getComponent(int rowIndex, int columnIndex) { HtmlComponent component = layout.getComponent(rowIndex, columnIndex); Validatable validatable = findValidatableComponent(component); if (validatable instanceof HtmlInputComponent) { HtmlInputComponent input = (HtmlInputComponent) validatable; String label = layout.getLabel(columnIndex); if (label != null && label.length() > 0) { input.setAlternateText(HtmlText.escape(label)); } component = addInlineValidators(columnIndex, component, input); } else if (isAllValidatorsInline()) { HtmlSimpleValueComponent input = (HtmlSimpleValueComponent) validatable; component = addInlineValidators(columnIndex, component, input); } return component; } private HtmlComponent addInlineValidators(int columnIndex, HtmlComponent component, HtmlSimpleValueComponent input) { MetaSlot metaSlot = getContext().getMetaObject().getSlots().get(columnIndex); HtmlChainValidator chainValidator = getChainValidator(input, metaSlot); if (chainValidator != null && !chainValidator.isEmpty() && !isHideValidators()) { chainValidator.setClasses(getValidatorClasses()); if (component instanceof HtmlContainer) { HtmlContainer container = (HtmlContainer) component; container.addChild(chainValidator); } else { HtmlContainer container = new HtmlInlineContainer(); container.addChild(component); container.addChild(chainValidator); return container; } } return component; } }; } }