package org.ovirt.engine.ui.common.widget;
import java.util.List;
import org.gwtbootstrap3.client.ui.constants.ColumnSize;
import org.ovirt.engine.ui.common.widget.dialog.InfoIcon;
import org.ovirt.engine.ui.common.widget.label.EnableableFormLabel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasEnabled;
import com.google.gwt.user.client.ui.Widget;
public class EntityModelWidgetWithInfo extends Composite implements HasValidation, HasEnabled {
interface WidgetUiBinder extends UiBinder<Widget, EntityModelWidgetWithInfo> {
WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
}
protected interface Style extends CssResource {
String floatLeft();
String overflowAuto();
}
@UiField(provided = true)
EnableableFormLabel label;
@UiField(provided = true)
InfoIcon infoIcon;
@UiField
FlowPanel labelPanel;
@UiField
FlowPanel container;
@UiField
FlowPanel contentWidgetContainer;
@UiField
Style style;
protected Widget contentWidget;
Align alignment;
boolean usePatternfly = false;
public EntityModelWidgetWithInfo(EnableableFormLabel label, Widget contentWidget) {
this(label, contentWidget, Align.RIGHT);
}
/**
* The content will provide its own label.
* @param contentWidget The content widget
* @param alignment The alignment (LEFT/RIGHT);
*/
public EntityModelWidgetWithInfo(Widget contentWidget, Align alignment) {
this(null, contentWidget, alignment);
}
public EntityModelWidgetWithInfo(EnableableFormLabel label, Widget contentWidget, Align alignment) {
if (label != null) {
this.label = label;
} else {
this.label = new EnableableFormLabel();
this.label.setVisible(false);
}
this.contentWidget = contentWidget;
this.alignment = alignment;
infoIcon = new InfoIcon(SafeHtmlUtils.EMPTY_SAFE_HTML);
initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
}
public void setExplanation(SafeHtml text) {
infoIcon.setText(text);
}
public void setUsePatternFly(boolean usePatternFly) {
this.usePatternfly = usePatternFly;
}
public void setLabelColSize(ColumnSize size) {
labelPanel.addStyleName(size.getCssName());
switchToBootstrapMode();
}
public void setWidgetColSize(ColumnSize size) {
contentWidgetContainer.addStyleName(size.getCssName());
switchToBootstrapMode();
}
private void switchToBootstrapMode() {
container.removeStyleName(style.overflowAuto());
}
@Override
public void onAttach() {
super.onAttach();
if (contentWidget instanceof PatternFlyCompatible) {
((PatternFlyCompatible)contentWidget).setUsePatternFly(usePatternfly);
}
if (alignment == Align.LEFT) {
labelPanel.insert(contentWidgetContainer, 0);
contentWidgetContainer.addStyleName(style.floatLeft());
}
contentWidgetContainer.add(contentWidget);
}
@Override
public void markAsValid() {
if (contentWidget instanceof HasValidation) {
((HasValidation) contentWidget).markAsValid();
}
}
@Override
public void markAsInvalid(List<String> validationHints) {
if (contentWidget instanceof HasValidation) {
((HasValidation) contentWidget).markAsInvalid(validationHints);
}
}
@Override
public boolean isValid() {
if (contentWidget instanceof HasValidation) {
return ((HasValidation) contentWidget).isValid();
}
return true;
}
@Override
public void setEnabled(boolean enabled) {
label.setEnabled(enabled);
if (contentWidget instanceof HasEnabled) {
HasEnabled enableableWidget = (HasEnabled) this.contentWidget;
enableableWidget.setEnabled(enabled);
}
}
@Override
public boolean isEnabled() {
return label.isEnabled();
}
}