All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alkacon.acacia.client.Renderer Maven / Gradle / Ivy

Go to download

A GWT based resource editor. This component is used as a part of OpenCms, an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

There is a newer version: 2.1
Show newest version
/*
 * This library is part of the Acacia Editor -
 * an open source inline and form based content editor for GWT.
 *
 * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package com.alkacon.acacia.client;

import com.alkacon.acacia.client.css.I_LayoutBundle;
import com.alkacon.acacia.client.ui.AttributeValueView;
import com.alkacon.acacia.client.ui.InlineEntityWidget;
import com.alkacon.acacia.client.ui.ValuePanel;
import com.alkacon.acacia.client.widgets.I_EditWidget;
import com.alkacon.acacia.shared.TabInfo;
import com.alkacon.acacia.shared.Type;
import com.alkacon.geranium.client.I_HasResizeOnShow;
import com.alkacon.geranium.client.ui.TabbedPanel;
import com.alkacon.geranium.client.ui.TabbedPanel.TabbedPanelStyle;
import com.alkacon.geranium.client.util.PositionBean;
import com.alkacon.vie.client.I_Vie;
import com.alkacon.vie.shared.I_Entity;
import com.alkacon.vie.shared.I_EntityAttribute;
import com.alkacon.vie.shared.I_Type;

import java.util.Iterator;
import java.util.List;

import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;

/**
 * Renders the widgets for an in-line form.

*/ public class Renderer implements I_EntityRenderer { /** * Calls resize on tab selection on the tabs child hierarchy.

*/ protected class TabSelectionHandler implements SelectionHandler { /** The tabbed panel. */ TabbedPanel m_tabsPanel; /** * Constructor.

* * @param tabsPanel the tabbed panel */ TabSelectionHandler(TabbedPanel tabsPanel) { m_tabsPanel = tabsPanel; } /** * @see com.google.gwt.event.logical.shared.SelectionHandler#onSelection(com.google.gwt.event.logical.shared.SelectionEvent) */ public void onSelection(final SelectionEvent event) { Scheduler.get().scheduleDeferred(new ScheduledCommand() { public void execute() { FlowPanel tab = m_tabsPanel.getWidget(event.getSelectedItem().intValue()); for (Widget w : tab) { if (w instanceof I_HasResizeOnShow) { ((I_HasResizeOnShow)w).resizeOnShow(); } } } }); } } /** * Handles the size of a tabbed panel.

*/ protected class TabSizeHandler implements SelectionHandler, ValueChangeHandler, ResizeHandler { /** The context panel. */ private Panel m_context; /** The tabbed panel. */ private TabbedPanel m_tabbedPanel; /** * Constructor.

* * @param tabbedPanel the tabbed panel * @param context the context panel */ public TabSizeHandler(TabbedPanel tabbedPanel, Panel context) { m_tabbedPanel = tabbedPanel; m_context = context; } /** * @see com.google.gwt.event.logical.shared.ResizeHandler#onResize(com.google.gwt.event.logical.shared.ResizeEvent) */ public void onResize(ResizeEvent event) { triggerHeightAdjustment(); } /** * @see com.google.gwt.event.logical.shared.SelectionHandler#onSelection(com.google.gwt.event.logical.shared.SelectionEvent) */ public void onSelection(SelectionEvent event) { triggerHeightAdjustment(); } /** * @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent) */ public void onValueChange(ValueChangeEvent event) { triggerHeightAdjustment(); } /** * Adjusts the tabbed panel height to the height of the current tab content.

*/ protected void adjustContextHeight() { int tabIndex = m_tabbedPanel.getSelectedIndex(); FlowPanel tab = m_tabbedPanel.getWidget(tabIndex); int height = PositionBean.getInnerDimensions(tab.getElement()).getHeight(); m_context.getElement().getStyle().setHeight(50 + height, Unit.PX); } /** * Triggers the tab panel height adjustment scheduled after the browsers event loop.

*/ private void triggerHeightAdjustment() { Scheduler.get().scheduleDeferred(new ScheduledCommand() { public void execute() { adjustContextHeight(); } }); } } /** * The widget value change handler.

*/ protected class WidgetChangeHandler implements ValueChangeHandler { /** The attribute handler. */ private AttributeHandler m_attributeHandler; /** The value index. */ private int m_valueIndex; /** * Constructor.

* * @param attributeHandler the attribute handler * @param valueIndex the value index, only relevant for in-line rendering */ protected WidgetChangeHandler(AttributeHandler attributeHandler, int valueIndex) { m_attributeHandler = attributeHandler; m_valueIndex = valueIndex; } /** * @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent) */ public void onValueChange(ValueChangeEvent event) { m_attributeHandler.handleValueChange(m_valueIndex, event.getValue()); } } /** The entity CSS class. */ public static final String ENTITY_CLASS = I_LayoutBundle.INSTANCE.form().entity(); /** The attribute label CSS class. */ public static final String LABEL_CLASS = I_LayoutBundle.INSTANCE.form().label(); /** The renderer name. */ public static final String RENDERER_NAME = "default"; /** The widget holder CSS class. */ public static final String WIDGET_HOLDER_CLASS = I_LayoutBundle.INSTANCE.form().widgetHolder(); /** The VIE instance. */ I_Vie m_vie; /** The widget service. */ I_WidgetService m_widgetService; /** * Constructor.

* * @param vie the VIE instance * @param widgetService the widget service */ public Renderer(I_Vie vie, I_WidgetService widgetService) { m_vie = vie; m_widgetService = widgetService; } /** * Gets the paths of nested choice attributes starting from a given type.

* * @param attributeType the type from which to start * @param startingAtChoiceAttribute true if the attribute is a synthetic CHOICE_ATTRIBUTE * * @return the list of nested choice attribute name paths */ public static List getChoiceEntries(I_Type attributeType, boolean startingAtChoiceAttribute) { ChoiceMenuEntryBean rootEntry = new ChoiceMenuEntryBean(null); collectChoiceEntries(attributeType, startingAtChoiceAttribute, rootEntry); return rootEntry.getChildren(); } /** * Sets the attribute choices if present.

* * @param widgetService the widget service to use * @param valueWidget the value widget * @param attributeType the attribute type */ public static void setAttributeChoice( I_WidgetService widgetService, AttributeValueView valueWidget, I_Type attributeType) { if (attributeType.isChoice()) { List menuEntries = getChoiceEntries(attributeType, false); for (ChoiceMenuEntryBean menuEntry : menuEntries) { valueWidget.addChoice(widgetService, menuEntry); } } } /** * Recursive helper method to create a tree structure of choice menu entries for a choice type.

* * @param startType the type from which to start * @param startingAtChoiceAttribute true if the recursion starts at a synthetic choice attribute * @param currentEntry the current menu entry bean */ private static void collectChoiceEntries( I_Type startType, boolean startingAtChoiceAttribute, ChoiceMenuEntryBean currentEntry) { if (startingAtChoiceAttribute || startType.isChoice()) { I_Type choiceType = startingAtChoiceAttribute ? startType : startType.getAttributeType(Type.CHOICE_ATTRIBUTE_NAME); for (String choiceName : choiceType.getAttributeNames()) { ChoiceMenuEntryBean subEntry = currentEntry.addChild(choiceName); I_Type includedType = choiceType.getAttributeType(choiceName); collectChoiceEntries(includedType, false, subEntry); } } } /** * @see com.alkacon.acacia.client.I_EntityRenderer#configure(java.lang.String) */ public I_EntityRenderer configure(String configuration) { return this; } /** * @see com.alkacon.acacia.client.I_EntityRenderer#getName() */ public String getName() { return RENDERER_NAME; } /** * @see com.alkacon.acacia.client.I_EntityRenderer#renderAttributeValue(com.alkacon.vie.shared.I_Entity, com.alkacon.acacia.client.AttributeHandler, int, com.google.gwt.user.client.ui.Panel) */ public void renderAttributeValue( I_Entity parentEntity, AttributeHandler attributeHandler, int attributeIndex, Panel context) { I_Type entityType = m_vie.getType(parentEntity.getTypeName()); I_Type attributeType = attributeHandler.getAttributeType(); String attributeName = attributeHandler.getAttributeName(); int minOccurrence = entityType.getAttributeMinOccurrence(attributeName); I_EntityAttribute attribute = parentEntity.getAttribute(attributeName); if ((attribute == null) && (minOccurrence > 0)) { attribute = createEmptyAttribute(parentEntity, attributeName, minOccurrence); } ValuePanel attributeElement = new ValuePanel(); context.add(attributeElement); context.addStyleName(ENTITY_CLASS); RootHandler parentHandler = new RootHandler(); parentHandler.setHandler(attributeIndex, attributeName, attributeHandler); attributeHandler.setSingleValueIndex(attributeIndex); String label = m_widgetService.getAttributeLabel(attributeName); String help = m_widgetService.getAttributeHelp(attributeName); if (attribute != null) { I_EntityRenderer renderer = m_widgetService.getRendererForAttribute(attributeName, attributeType); AttributeValueView valueWidget = new AttributeValueView(attributeHandler, label, help); if (attributeType.isChoice() && (entityType.getAttributeMaxOccurrence(attributeName) == 1)) { valueWidget.setCollapsed(true); } attributeElement.add(valueWidget); if (attribute.isSimpleValue()) { valueWidget.setValueWidget( m_widgetService.getAttributeFormWidget(attributeName), attribute.getSimpleValues().get(attributeIndex), m_widgetService.getDefaultAttributeValue(attributeName), true); if (m_widgetService.isDisplayCompact(attributeName)) { // widget should be displayed in compact view, using only 50% of the available width valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_FIRST_COLUMN); } else { if (m_widgetService.isDisplaySingleLine(attributeName)) { valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_SINGLE_LINE); } } } else { valueWidget.setValueEntity(renderer, attribute.getComplexValues().get(attributeIndex)); if (m_widgetService.isDisplayCompact(attributeName)) { valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_NESTED); } } setAttributeChoice(valueWidget, attributeType); } attributeHandler.updateButtonVisisbility(); } /** * @see com.alkacon.acacia.client.I_EntityRenderer#renderForm(com.alkacon.vie.shared.I_Entity, java.util.List, com.google.gwt.user.client.ui.Panel, com.alkacon.acacia.client.I_AttributeHandler, int) */ @SuppressWarnings("unchecked") public TabbedPanel renderForm( I_Entity entity, List tabInfos, Panel context, I_AttributeHandler parentHandler, int attributeIndex) { if ((tabInfos == null) || (tabInfos.size() < 2)) { renderForm(entity, context, parentHandler, attributeIndex); return null; } else { context.getElement().getStyle().setHeight(600, Unit.PX); context.getElement().setAttribute("typeof", entity.getTypeName()); context.getElement().setAttribute("about", entity.getId()); context.getElement().getStyle().setPadding(0, Unit.PX); TabbedPanel tabbedPanel = new TabbedPanel(TabbedPanelStyle.classicTabs); final TabSizeHandler tabSizeHandler = new TabSizeHandler(tabbedPanel, context); tabbedPanel.addSelectionHandler(tabSizeHandler); if (entity instanceof HasValueChangeHandlers) { ((HasValueChangeHandlers)entity).addValueChangeHandler(tabSizeHandler); } // adjust the tab panel height after a delay as some widgets may need time to initialize Scheduler.get().scheduleFixedDelay(new RepeatingCommand() { private int counter = 0; /** * @see com.google.gwt.core.client.Scheduler.RepeatingCommand#execute() */ public boolean execute() { tabSizeHandler.adjustContextHeight(); counter++; return counter < 6; } }, 200); AttributeHandler.setResizeHandler(tabSizeHandler); tabbedPanel.addSelectionHandler(new TabSelectionHandler(tabbedPanel)); tabbedPanel.getElement().getStyle().setBorderWidth(0, Unit.PX); Iterator tabIt = tabInfos.iterator(); TabInfo currentTab = tabIt.next(); TabInfo nextTab = tabIt.next(); FlowPanel tabPanel = createTab(); tabbedPanel.addNamed(tabPanel, currentTab.getTabName(), currentTab.getTabId()); I_Type entityType = m_vie.getType(entity.getTypeName()); List attributeNames = entityType.getAttributeNames(); AttributeValueView lastCompactView = null; boolean collapsed = currentTab.isCollapsed() && ((nextTab != null) && attributeNames.get(1).endsWith("/" + nextTab.getStartName())); for (final String attributeName : attributeNames) { if ((nextTab != null) && attributeName.endsWith("/" + nextTab.getStartName())) { currentTab = nextTab; nextTab = tabIt.hasNext() ? tabIt.next() : null; tabPanel = createTab(); tabbedPanel.addNamed(tabPanel, currentTab.getTabName(), currentTab.getTabId()); // check if the tab content may be collapsed if (currentTab.isCollapsed()) { int currentIndex = attributeNames.indexOf(attributeName); collapsed = ((currentIndex + 1) == attributeNames.size()) || ((nextTab != null) && attributeNames.get(currentIndex + 1).endsWith( "/" + nextTab.getStartName())); } if (lastCompactView != null) { // previous widget was set to first column mode, // revert that as no following widget will occupy the second column lastCompactView.setCompactMode(AttributeValueView.COMPACT_MODE_WIDE); } } AttributeHandler handler = new AttributeHandler(m_vie, entity, attributeName, m_widgetService); parentHandler.setHandler(attributeIndex, attributeName, handler); I_Type attributeType = entityType.getAttributeType(attributeName); int minOccurrence = entityType.getAttributeMinOccurrence(attributeName); I_EntityAttribute attribute = entity.getAttribute(attributeName); // only single complex values may be collapsed if (collapsed && (attribute != null) && !attributeType.isSimpleType() && (minOccurrence == 1) && (entityType.getAttributeMaxOccurrence(attributeName) == 1)) { I_EntityRenderer renderer = m_widgetService.getRendererForAttribute(attributeName, attributeType); renderer.renderForm(attribute.getComplexValue(), tabPanel, handler, 0); } else { ValuePanel attributeElement = new ValuePanel(); tabPanel.add(attributeElement); if ((attribute == null) && (minOccurrence > 0)) { attribute = createEmptyAttribute(entity, attributeName, minOccurrence); } lastCompactView = renderAttribute( entityType, attributeType, attribute, handler, attributeElement, attributeName, lastCompactView); } handler.updateButtonVisisbility(); } if (lastCompactView != null) { // previous widget was set to first column mode, // revert that as no following widget will occupy the second column lastCompactView.setCompactMode(AttributeValueView.COMPACT_MODE_WIDE); } context.add(tabbedPanel); return tabbedPanel; } } /** * @see com.alkacon.acacia.client.I_EntityRenderer#renderForm(com.alkacon.vie.shared.I_Entity, com.google.gwt.user.client.ui.Panel, com.alkacon.acacia.client.I_AttributeHandler, int) */ public void renderForm(I_Entity entity, Panel context, I_AttributeHandler parentHandler, int attributeIndex) { context.addStyleName(ENTITY_CLASS); context.getElement().setAttribute("typeof", entity.getTypeName()); context.getElement().setAttribute("about", entity.getId()); I_Type entityType = m_vie.getType(entity.getTypeName()); AttributeValueView lastCompactView = null; if (entityType.isChoice()) { I_EntityAttribute attribute = entity.getAttribute(Type.CHOICE_ATTRIBUTE_NAME); assert (attribute != null) && attribute.isComplexValue() : "a choice type must have a choice attribute"; AttributeHandler handler = new AttributeHandler(m_vie, entity, Type.CHOICE_ATTRIBUTE_NAME, m_widgetService); parentHandler.setHandler(attributeIndex, Type.CHOICE_ATTRIBUTE_NAME, handler); ValuePanel attributeElement = new ValuePanel(); for (I_Entity choiceEntity : attribute.getComplexValues()) { I_Type choiceType = m_vie.getType(choiceEntity.getTypeName()); List choiceAttributes = choiceEntity.getAttributes(); assert (choiceAttributes.size() == 1) && choiceAttributes.get(0).isSingleValue() : "each choice entity may only have a single attribute with a single value"; I_EntityAttribute choiceAttribute = choiceAttributes.get(0); I_Type attributeType = choiceType.getAttributeType(choiceAttribute.getAttributeName()); I_EntityRenderer renderer = m_widgetService.getRendererForAttribute( choiceAttribute.getAttributeName(), attributeType); String label = m_widgetService.getAttributeLabel(choiceAttribute.getAttributeName()); String help = m_widgetService.getAttributeHelp(choiceAttribute.getAttributeName()); context.add(attributeElement); AttributeValueView valueWidget = new AttributeValueView(handler, label, help); attributeElement.add(valueWidget); if (choiceAttribute.isSimpleValue()) { valueWidget.setValueWidget( m_widgetService.getAttributeFormWidget(choiceAttribute.getAttributeName()), choiceAttribute.getSimpleValue(), m_widgetService.getDefaultAttributeValue(choiceAttribute.getAttributeName()), true); if (m_widgetService.isDisplaySingleLine(choiceAttribute.getAttributeName())) { valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_SINGLE_LINE); } } else { valueWidget.setValueEntity(renderer, choiceAttribute.getComplexValue()); if (m_widgetService.isDisplayCompact(choiceAttribute.getAttributeName())) { valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_NESTED); } } setAttributeChoice(valueWidget, entityType); } handler.updateButtonVisisbility(); } else { List attributeNames = entityType.getAttributeNames(); for (String attributeName : attributeNames) { int minOccurrence = entityType.getAttributeMinOccurrence(attributeName); I_EntityAttribute attribute = entity.getAttribute(attributeName); if ((attribute == null) && (minOccurrence > 0)) { attribute = createEmptyAttribute(entity, attributeName, minOccurrence); } I_Type attributeType = entityType.getAttributeType(attributeName); ValuePanel attributeElement = new ValuePanel(); context.add(attributeElement); AttributeHandler handler = new AttributeHandler(m_vie, entity, attributeName, m_widgetService); parentHandler.setHandler(attributeIndex, attributeName, handler); lastCompactView = renderAttribute( entityType, attributeType, attribute, handler, attributeElement, attributeName, lastCompactView); } } if (lastCompactView != null) { // previous widget was set to first column mode, // revert that as no following widget will occupy the second column lastCompactView.setCompactMode(AttributeValueView.COMPACT_MODE_WIDE); } } /** * @see com.alkacon.acacia.client.I_EntityRenderer#renderInline(com.alkacon.vie.shared.I_Entity, com.alkacon.acacia.client.I_InlineFormParent, com.alkacon.acacia.client.I_InlineHtmlUpdateHandler) */ public void renderInline(I_Entity entity, I_InlineFormParent formParent, I_InlineHtmlUpdateHandler updateHandler) { I_Type entityType = m_vie.getType(entity.getTypeName()); List attributeNames = entityType.getAttributeNames(); for (String attributeName : attributeNames) { I_Type attributeType = entityType.getAttributeType(attributeName); I_EntityRenderer renderer = m_widgetService.getRendererForAttribute(attributeName, attributeType); renderer.renderInline( entity, attributeName, formParent, updateHandler, entityType.getAttributeMinOccurrence(attributeName), entityType.getAttributeMaxOccurrence(attributeName)); } } /** * @see com.alkacon.acacia.client.I_EntityRenderer#renderInline(com.alkacon.vie.shared.I_Entity, java.lang.String, com.alkacon.acacia.client.I_InlineFormParent, com.alkacon.acacia.client.I_InlineHtmlUpdateHandler, int, int) */ public void renderInline( I_Entity parentEntity, String attributeName, I_InlineFormParent formParent, I_InlineHtmlUpdateHandler updateHandler, int minOccurrence, int maxOccurrence) { I_EntityAttribute attribute = parentEntity.getAttribute(attributeName); if (attribute != null) { List elements = m_vie.getAttributeElements(parentEntity, attributeName, formParent.getElement()); if (!elements.isEmpty()) { AttributeHandler handler = new AttributeHandler(m_vie, parentEntity, attributeName, m_widgetService); for (int i = 0; i < elements.size(); i++) { Element element = elements.get(i); I_EditWidget widget = m_widgetService.getAttributeInlineWidget( attributeName, (com.google.gwt.user.client.Element)element); if (attribute.isSimpleValue() && (widget != null)) { Element tempSpan = DOM.createSpan(); tempSpan.setInnerHTML(attribute.getSimpleValues().get(i)); String value = tempSpan.getInnerHTML().trim(); // verify the current value equals the element content String innerHtml = element.getInnerHTML().trim(); if (innerHtml.equals(value)) { widget.addValueChangeHandler(new WidgetChangeHandler(handler, i)); formParent.adoptWidget(widget); } else { InlineEntityWidget.createWidgetForEntity( element, formParent, parentEntity, handler, i, updateHandler, m_widgetService); } } else { InlineEntityWidget.createWidgetForEntity( element, formParent, parentEntity, handler, i, updateHandler, m_widgetService); } } } if (attribute.isComplexValue()) { for (I_Entity entity : attribute.getComplexValues()) { renderInline(entity, formParent, updateHandler); } } } else { List elements = m_vie.getAttributeElements(parentEntity, attributeName, formParent.getElement()); if (!elements.isEmpty() && (elements.size() == 1)) { AttributeHandler handler = new AttributeHandler(m_vie, parentEntity, attributeName, m_widgetService); InlineEntityWidget.createWidgetForEntity( elements.get(0), formParent, parentEntity, handler, -1, updateHandler, m_widgetService); } } } /** * Creates an empty attribute.

* * @param parentEntity the parent entity * @param attributeName the attribute name * @param minOccurrence the minimum occurrence of the attribute * * @return the entity attribute */ protected I_EntityAttribute createEmptyAttribute(I_Entity parentEntity, String attributeName, int minOccurrence) { I_EntityAttribute result = null; I_Type attributeType = m_vie.getType(parentEntity.getTypeName()).getAttributeType(attributeName); if (attributeType.isSimpleType()) { for (int i = 0; i < minOccurrence; i++) { parentEntity.addAttributeValue(attributeName, m_widgetService.getDefaultAttributeValue(attributeName)); } result = parentEntity.getAttribute(attributeName); } else { for (int i = 0; i < minOccurrence; i++) { parentEntity.addAttributeValue(attributeName, m_vie.createEntity(null, attributeType.getId())); } result = parentEntity.getAttribute(attributeName); } return result; } /** * Creates a tab.

* * @return the created tab */ private FlowPanel createTab() { FlowPanel tabPanel; tabPanel = new FlowPanel(); tabPanel.addStyleName(ENTITY_CLASS); tabPanel.addStyleName(I_LayoutBundle.INSTANCE.form().formParent()); tabPanel.getElement().getStyle().setMargin(0, Unit.PX); return tabPanel; } /** * Renders a single attribute.

* * @param entityType the type of the entity containing the attribute * @param attributeType the attribute type * @param attribute the attribute, or null if not set * @param handler the attribute handler * @param attributeElement the attribute parent element * @param attributeName the attribute name * @param lastCompactView the previous attribute view that was rendered in compact mode if present * * @return the last attribute view that was rendered in compact mode if present */ private AttributeValueView renderAttribute( I_Type entityType, I_Type attributeType, I_EntityAttribute attribute, AttributeHandler handler, ValuePanel attributeElement, String attributeName, AttributeValueView lastCompactView) { String label = m_widgetService.getAttributeLabel(attributeName); String help = m_widgetService.getAttributeHelp(attributeName); if (attribute != null) { I_EntityRenderer renderer = m_widgetService.getRendererForAttribute(attributeName, attributeType); for (int i = 0; i < attribute.getValueCount(); i++) { AttributeValueView valueWidget = new AttributeValueView(handler, label, help); if (attributeType.isChoice() && (entityType.getAttributeMaxOccurrence(attributeName) == 1)) { valueWidget.setCollapsed(true); } attributeElement.add(valueWidget); if (attribute.isSimpleValue()) { valueWidget.setValueWidget( m_widgetService.getAttributeFormWidget(attributeName), attribute.getSimpleValues().get(i), m_widgetService.getDefaultAttributeValue(attributeName), true); // check for compact view setting if (m_widgetService.isDisplayCompact(attributeName)) { // widget should be displayed in compact view, using only 50% of the available width if (lastCompactView == null) { // set mode to first column valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_FIRST_COLUMN); lastCompactView = valueWidget; } else { // previous widget is displayed as first column, set second column mode valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_SECOND_COLUMN); lastCompactView = null; } } else { if (lastCompactView != null) { // previous widget was set to first column mode, // revert that as the current widget will be displayed in a new line lastCompactView.setCompactMode(AttributeValueView.COMPACT_MODE_WIDE); lastCompactView = null; } if (m_widgetService.isDisplaySingleLine(attributeName)) { valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_SINGLE_LINE); } } } else { valueWidget.setValueEntity(renderer, attribute.getComplexValues().get(i)); if (lastCompactView != null) { // previous widget was set to first column mode, // revert that as the current widget will be displayed in a new line lastCompactView.setCompactMode(AttributeValueView.COMPACT_MODE_WIDE); lastCompactView = null; } if (m_widgetService.isDisplayCompact(attributeName)) { valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_NESTED); } } setAttributeChoice(valueWidget, attributeType); } } else { AttributeValueView valueWidget = new AttributeValueView(handler, label, help); attributeElement.add(valueWidget); if (attributeType.isSimpleType()) { // create a deactivated widget, to add the attribute on click valueWidget.setValueWidget( m_widgetService.getAttributeFormWidget(attributeName), "", m_widgetService.getDefaultAttributeValue(attributeName), false); // check for compact view setting if (m_widgetService.isDisplayCompact(attributeName)) { // widget should be displayed in compact view, using only 50% of the available width if (lastCompactView == null) { // set mode to first column valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_FIRST_COLUMN); lastCompactView = valueWidget; } else { // previous widget is displayed as first column, set second column mode valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_SECOND_COLUMN); lastCompactView = null; } } else { if (lastCompactView != null) { // previous widget was set to first column mode, // revert that as the current widget will be displayed in a new line lastCompactView.setCompactMode(AttributeValueView.COMPACT_MODE_WIDE); lastCompactView = null; } if (m_widgetService.isDisplaySingleLine(attributeName)) { valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_SINGLE_LINE); } } } else { if (lastCompactView != null) { // previous widget was set to first column mode, // revert that as the current widget will be displayed in a new line lastCompactView.setCompactMode(AttributeValueView.COMPACT_MODE_WIDE); lastCompactView = null; } if (m_widgetService.isDisplayCompact(attributeName)) { valueWidget.setCompactMode(AttributeValueView.COMPACT_MODE_NESTED); } } setAttributeChoice(valueWidget, attributeType); } handler.updateButtonVisisbility(); return lastCompactView; } /** * Sets the attribute choices if present.

* * @param valueWidget the value widget * @param attributeType the attribute type */ private void setAttributeChoice(AttributeValueView valueWidget, I_Type attributeType) { setAttributeChoice(m_widgetService, valueWidget, attributeType); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy