package org.ovirt.engine.ui.userportal.widget; import org.ovirt.engine.ui.common.idhandler.HasElementId; import org.ovirt.engine.ui.common.widget.tooltip.WidgetTooltip; import com.google.gwt.core.client.GWT; import com.google.gwt.editor.client.IsEditor; import com.google.gwt.editor.client.adapters.TakesValueEditor; import com.google.gwt.resources.client.CssResource; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.TakesValue; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; public class DoublePercentageProgressBar extends Composite implements IsEditor<TakesValueEditor<Object>>, TakesValue<Object>, HasElementId { private static final String ZERO = "0%"; //$NON-NLS-1$ private static final int FULL_WIDTH = 99; private static final int MINIMUM_SIZE_TO_SHOW_TEXT = 10; protected WidgetTooltip tooltip; interface WidgetUiBinder extends UiBinder<Widget, DoublePercentageProgressBar> { WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); } public DoublePercentageProgressBar() { initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); this.tooltip = new WidgetTooltip(this); } private Integer valueA; private Integer valueB; @UiField WidgetStyle style; @UiField Label percentageLabelA; @UiField Label percentageLabelB; @UiField FlowPanel percentageBarA; @UiField FlowPanel percentageBarB; private SafeHtml tooltipText; @Override public void setValue(Object value) { assert value instanceof Integer : "Only integer values are accepted"; //$NON-NLS-1$ } @Override public Object getValue() { return valueB; } public void setValueA(Integer value) { this.valueA = value; } public void setValueB(Integer value) { this.valueB = value; } public void setZeroValue() { percentageBarB.setVisible(false); percentageBarB.setWidth("0px"); //$NON-NLS-1$ percentageBarA.setVisible(true); tooltip.setHtml(tooltipText); percentageBarA.setStyleName(style.empty()); percentageBarA.setWidth(FULL_WIDTH + "%"); //$NON-NLS-1$ percentageLabelA.setText(ZERO); percentageLabelA.setStyleName(style.percentageLabelBlack()); } public void setBars() { if (valueA != null && valueB != null) { int fakeA = valueA; int fakeB = valueB; if (valueA + valueB >= FULL_WIDTH) { double factor = (double) (FULL_WIDTH - 1) / (valueA + valueB); fakeA = (int) Math.round(factor * valueA); fakeB = (int) Math.round(factor * valueB); fakeA = fakeB == 0 ? FULL_WIDTH : fakeA; fakeB = fakeA == 0 ? FULL_WIDTH : fakeB; } setBar(percentageBarA, percentageLabelA, valueA, fakeA, style.percentageLabelBlack()); setBar(percentageBarB, percentageLabelB, valueB, fakeB, style.percentageLabel()); } } private void setBar(FlowPanel percentageBar, Label percentageLabel, Integer value, int fakeValue, String style){ if (value != null) { String percentage = value + "%"; //$NON-NLS-1$ String fakePercentage = fakeValue + "%"; //$NON-NLS-1$ percentageLabel.setText(value < MINIMUM_SIZE_TO_SHOW_TEXT ? "" : percentage); //$NON-NLS-1$ percentageLabel.setStyleName(style); percentageBar.setWidth(fakePercentage); percentageBar.setVisible(value != 0); } } public Object getValueA() { return valueA; } public Object getValueB() { return valueB; } @Override public TakesValueEditor<Object> asEditor() { return TakesValueEditor.of(this); } @Override public void setElementId(String elementId) { // Set percentage label element ID percentageLabelB.getElement().setId(elementId); } interface WidgetStyle extends CssResource { String percentageBarUnlimited(); String percentageBarExceeded(); String empty(); String percentageBarA(); String percentageLabelBlack(); String percentageLabel(); } public void setTooltipText(SafeHtml tooltipText) { this.tooltipText = tooltipText; } }