package org.ovirt.engine.ui.common.widget.editor;
import java.util.List;
import org.gwtbootstrap3.client.ui.constants.Styles;
import org.ovirt.engine.ui.common.widget.AbstractValidatedWidgetWithLabel;
import org.ovirt.engine.ui.common.widget.Align;
import org.ovirt.engine.ui.common.widget.PatternFlyCompatible;
import org.ovirt.engine.ui.common.widget.VisibilityRenderer;
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.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.user.client.ui.CheckBox;
public abstract class BaseEntityModelCheckboxEditor<T> extends AbstractValidatedWidgetWithLabel<T, BaseEntityModelCheckbox<T>>
implements IsEditor<WidgetWithLabelEditor<T, BaseEntityModelCheckboxEditor<T>>>, PatternFlyCompatible {
private static final String CBE_RIGHT_OF_LABEL_PFLY_FIX = "cbe_right_of_label_pfly_fix"; //$NON-NLS-1$
private static final String CBE_CHECKBOX_PFLY_FIX = "cbe_checkbox_pfly_fix"; //$NON-NLS-1$
private static final String CBE_LABEL_PFLY_FIX = "cbe_label_pfly_fix"; //$NON-NLS-1$
private final WidgetWithLabelEditor<T, BaseEntityModelCheckboxEditor<T>> editor;
private boolean useCheckBoxWidgetLabel;
public BaseEntityModelCheckboxEditor(BaseEntityModelCheckbox<T> contentWidget) {
this(Align.LEFT, contentWidget);
}
public BaseEntityModelCheckboxEditor(Align labelAlign, BaseEntityModelCheckbox<T> contentWidget) {
this(labelAlign, contentWidget, new VisibilityRenderer.SimpleVisibilityRenderer());
}
public BaseEntityModelCheckboxEditor(Align labelAlign, BaseEntityModelCheckbox<T> contentWidget,
VisibilityRenderer visibilityRenderer) {
this(labelAlign, contentWidget, visibilityRenderer, false);
}
public BaseEntityModelCheckboxEditor(Align labelAlign, BaseEntityModelCheckbox<T> contentWidget,
VisibilityRenderer visibilityRendere, boolean useFullWidthIfAvailable) {
super(contentWidget, visibilityRendere);
this.editor = WidgetWithLabelEditor.of(getContentWidget().asEditor(), this);
this.useCheckBoxWidgetLabel = labelAlign == Align.RIGHT;
// In case we use CheckBox widget label instead of declared LabelElement,
// align content widget container to the left and hide the LabelElement
if (useCheckBoxWidgetLabel) {
getContentWidgetContainer().getElement().getStyle().setFloat(Float.LEFT);
getFormLabel().asWidget().setVisible(false);
if (useFullWidthIfAvailable) {
getContentWidgetContainer().getElement().getStyle().setWidth(100, Unit.PCT);
}
}
// patternfly hacks
getContentWidgetElement().addClassName(CBE_CHECKBOX_PFLY_FIX);
getInternalLabelElement().addClassName(CBE_LABEL_PFLY_FIX);
if (!useCheckBoxWidgetLabel) {
addWrapperStyleName(CBE_RIGHT_OF_LABEL_PFLY_FIX);
}
}
public CheckBox asCheckBox() {
return getContentWidget().asCheckBox();
}
@Override
public void setUsePatternFly(final boolean use) {
super.setUsePatternFly(use);
if (use) {
getCheckboxWidgetLabel().getStyle().setPaddingLeft(10, Unit.PX);
getCheckboxWidgetLabel().getStyle().setPaddingRight(10, Unit.PX);
getCheckboxWidgetLabel().getStyle().setPosition(Position.RELATIVE);
noPaddingNoFixes();
removeWrapperStyleName(CBE_RIGHT_OF_LABEL_PFLY_FIX);
}
}
protected void noPaddingNoFixes() {
getValidatedWidgetStyle().clearPadding();
getCheckboxWidgetLabel().removeClassName(CBE_LABEL_PFLY_FIX);
getContentWidgetElement().removeClassName(CBE_CHECKBOX_PFLY_FIX);
// checkboxes don't use form-control
getContentWidgetElement().removeClassName(Styles.FORM_CONTROL);
removeContentWidgetStyleName(Styles.FORM_CONTROL);
}
protected LabelElement getCheckboxWidgetLabel() {
return LabelElement.as(Element.as(asCheckBox().getElement().getChild(1)));
}
@Override
public WidgetWithLabelEditor<T, BaseEntityModelCheckboxEditor<T>> asEditor() {
return editor;
}
@Override
public void markAsValid() {
super.markAsValid();
getValidatedWidgetStyle().setBorderStyle(BorderStyle.NONE);
}
@Override
public void markAsInvalid(List<String> validationHints) {
super.markAsInvalid(validationHints);
getValidatedWidgetStyle().setBorderStyle(BorderStyle.SOLID);
}
@Override
protected Element getContentWidgetElement() {
// Actual check box input element is the first child of CheckBox element
Node input = asCheckBox().getElement().getChild(0);
return Element.as(input);
}
protected Element getInternalLabelElement() {
Node label = asCheckBox().getElement().getChild(1);
return Element.as(label);
}
@Override
protected void updateLabelElementId(String elementId) {
if (useCheckBoxWidgetLabel) {
LabelElement.as(Element.as(asCheckBox().getElement().getChild(1))).setHtmlFor(elementId);
} else {
super.updateLabelElementId(elementId);
}
}
@Override
public void hideLabel() {
super.hideLabel();
if (useCheckBoxWidgetLabel) {
getCheckboxWidgetLabel().getStyle().setDisplay(Display.NONE);
}
}
@Override
public String getLabel() {
if (useCheckBoxWidgetLabel) {
return asCheckBox().getText();
} else {
return super.getLabel();
}
}
public void useWidgetLabel() {
useCheckBoxWidgetLabel = true;
}
@Override
public void setLabel(String label) {
if (useCheckBoxWidgetLabel) {
asCheckBox().setText(label);
} else {
super.setLabel(label);
}
}
}