package org.ovirt.engine.ui.webadmin.widget.editor; import org.ovirt.engine.ui.webadmin.widget.AbstractValidatedWidgetWithLabel; import org.ovirt.engine.ui.webadmin.widget.Align; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.LabelElement; import com.google.gwt.dom.client.Node; import com.google.gwt.dom.client.Style.BorderStyle; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.dom.client.Style.Float; import com.google.gwt.editor.client.IsEditor; import com.google.gwt.user.client.ui.RadioButton; /** * Composite Editor that uses {@link EntityModelRadioButton}. */ public class EntityModelRadioButtonEditor extends AbstractValidatedWidgetWithLabel<Object, EntityModelRadioButton> implements IsEditor<WidgetWithLabelEditor<Object, TakesValueWithChangeHandlersEditor<Object>, EntityModelRadioButtonEditor>> { private final WidgetWithLabelEditor<Object, TakesValueWithChangeHandlersEditor<Object>, EntityModelRadioButtonEditor> editor; private final boolean useRadioButtonWidgetLabel; public EntityModelRadioButtonEditor(String group) { this(group, Align.RIGHT); } public EntityModelRadioButtonEditor(String group, Align labelAlign) { super(new EntityModelRadioButton(group)); this.editor = WidgetWithLabelEditor.of(getContentWidget().asEditor(), this); this.useRadioButtonWidgetLabel = labelAlign == Align.RIGHT; // In case we use RadioButton widget label instead of declared LabelElement, // align content widget container to the left and hide the LabelElement if (useRadioButtonWidgetLabel) { getContentWidgetContainer().getElement().getStyle().setFloat(Float.LEFT); getLabelElement().getStyle().setDisplay(Display.NONE); } } public RadioButton asRadioButton() { return getContentWidget().asRadioButton(); } @Override public WidgetWithLabelEditor<Object, TakesValueWithChangeHandlersEditor<Object>, EntityModelRadioButtonEditor> asEditor() { return editor; } @Override protected void applyCommonValidationStyles() { // Suppress radio button styling, as different browsers behave // differently when styling radio button input elements getValidatedWidgetStyle().setBorderStyle(BorderStyle.NONE); } @Override protected Element getContentWidgetElement() { // Actual radio button input element is the first child of RadioButton element Node input = asRadioButton().getElement().getChild(0); return Element.as(input); } @Override protected void updateLabelElementId(String elementId) { if (useRadioButtonWidgetLabel) { LabelElement.as(Element.as(asRadioButton().getElement().getChild(1))).setHtmlFor(elementId); } else { super.updateLabelElementId(elementId); } } @Override public String getLabel() { if (useRadioButtonWidgetLabel) { return asRadioButton().getText(); } else { return super.getLabel(); } } @Override public void setLabel(String label) { if (useRadioButtonWidgetLabel) { asRadioButton().setText(label); } else { super.setLabel(label); } } }