package org.ovirt.engine.ui.webadmin.widget; import org.ovirt.engine.ui.webadmin.idhandler.HasElementId; import org.ovirt.engine.ui.webadmin.widget.editor.EditorWidget; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.LabelElement; import com.google.gwt.event.dom.client.HasAllKeyHandlers; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; /** * Base class for validated widgets that have a label associated with them. * * @param <W> * Content widget type. */ public abstract class AbstractValidatedWidgetWithLabel<T, W extends EditorWidget<T, ?>> extends AbstractValidatedWidget implements HasLabel, HasEnabled, HasAccess, HasAllKeyHandlers, Focusable, HasElementId { interface WidgetUiBinder extends UiBinder<Widget, AbstractValidatedWidgetWithLabel<?, ?>> { WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); } interface Style extends CssResource { String labelEnabled(); String labelDisabled(); } private final W contentWidget; @UiField HTMLPanel wrapperPanel; @UiField LabelElement labelElement; @UiField SimplePanel contentWidgetContainer; @UiField Style style; public AbstractValidatedWidgetWithLabel(W contentWidget) { this.contentWidget = contentWidget; initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); } @Override protected void initWidget(Widget wrapperWidget) { super.initWidget(wrapperWidget); contentWidgetContainer.setWidget(contentWidget); // Adjust content widget width contentWidget.asWidget().setWidth("100%"); // Assign ID to content widget element if it's missing or empty Element contentWidgetElement = getContentWidgetElement(); if (contentWidgetElement.getId() == null || contentWidgetElement.getId().isEmpty()) { contentWidgetElement.setId(DOM.createUniqueId()); } // Connect label with content widget for better accessibility updateLabelElementId(contentWidgetElement.getId()); } protected void updateLabelElementId(String elementId) { labelElement.setHtmlFor(elementId); } protected W getContentWidget() { return contentWidget; } protected Element getContentWidgetElement() { return contentWidget.asWidget().getElement(); } protected SimplePanel getContentWidgetContainer() { return contentWidgetContainer; } protected LabelElement getLabelElement() { return labelElement; } @Override public void setElementId(String elementId) { getContentWidgetElement().setId(elementId); updateLabelElementId(elementId); } @Override protected Widget getValidatedWidget() { return getContentWidget().asWidget(); } @Override public String getLabel() { return labelElement.getInnerText(); } @Override public void setLabel(String label) { labelElement.setInnerText(label); } @Override public boolean isAccessible() { return wrapperPanel.isVisible(); } @Override public void setAccessible(boolean accessible) { wrapperPanel.setVisible(accessible); } @Override public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) { return contentWidget.addKeyDownHandler(handler); } @Override public HandlerRegistration addKeyPressHandler(KeyPressHandler handler) { return contentWidget.addKeyPressHandler(handler); } @Override public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) { return contentWidget.addKeyUpHandler(handler); } @Override public int getTabIndex() { return contentWidget.getTabIndex(); } @Override public void setAccessKey(char key) { contentWidget.setAccessKey(key); } @Override public void setFocus(boolean focused) { contentWidget.setFocus(focused); } @Override public void setTabIndex(int index) { contentWidget.setTabIndex(index); } @Override public boolean isEnabled() { return contentWidget.isEnabled(); } @Override public void setEnabled(boolean enabled) { contentWidget.setEnabled(enabled); if (enabled) { labelElement.replaceClassName(style.labelDisabled(), style.labelEnabled()); } else { labelElement.replaceClassName(style.labelEnabled(), style.labelDisabled()); } } public void addContentWidgetStyleName(String styleName) { contentWidgetContainer.addStyleName(styleName); } public void setLabelStyleName(String styleName) { labelElement.setClassName(styleName); } public void addLabelStyleName(String styleName) { labelElement.addClassName(styleName); } }