package org.ovirt.engine.ui.common.widget.form; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.StyleInjector; 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.DockLayoutPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.SplitLayoutPanel; import com.google.gwt.user.client.ui.Widget; public class Slider extends Composite { private static final int SPLITER_WIDTH = 8; interface WidgetUiBinder extends UiBinder<Widget, Slider> { WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class); } public interface SliderValueChange { public void onSliderValueChange(String name, int value); } SliderValueChange sliderValueChange; private String name; public SliderValueChange getSliderValueChange() { return sliderValueChange; } public void setSliderValueChange(String name, SliderValueChange sliderValueChange) { this.sliderValueChange = sliderValueChange; this.name = name; } @UiField(provided = true) SplitLayoutPanel slider; @UiField(provided = true) Label percentLabel; SimplePanel centerPanel; SimplePanel westPanel; int pivot; int min; int max; int scale; private String color; public int getScale() { return scale; } public void setScale(int scale) { this.scale = scale; } public int getPivot() { return pivot; } public void setPivot(int pivot) { this.pivot = pivot; if (percentLabel != null) { percentLabel.setText(getPercent() + "%"); //$NON-NLS-1$ } } public void setValue(int value) { if (value < 0) { return; } setPivot(value * getScale()); setSlidersWidth(); } public int getMin() { return min; } public void setMin(int min) { this.min = min; } public int getMax() { return max; } public void setMax(int max) { this.max = max; } public int getPercent() { return getPivot() / getScale(); } public Slider(int scale, int min, int max, int pivot, String color) { setColor(color); setScale(scale); setMin(min * getScale()); setMax(max * getScale()); setPivot(pivot * getScale()); initSlides(); initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this)); slider.setWidth(getMax() - getMin() + "px"); //$NON-NLS-1$ } public String getColor() { return color; } public void setColor(String color) { this.color = color; } private void initSlides() { slider = new SplitLayoutPanel() { @Override public void onResize() { super.onResize(); setSliderWidth(); } public void setSliderWidth() { double d = ((DockLayoutPanel.LayoutData) westPanel.getLayoutData()).size; setPivot((int) d + getMin()); if (getPercent() == getMax() / getScale() - SPLITER_WIDTH / getScale()) { setPivot(getPivot() + SPLITER_WIDTH); } if (sliderValueChange != null) { sliderValueChange.onSliderValueChange(name, getPercent()); } } }; String style = "A" + getColor().replace('#', '_') + "_clusterPolicy"; //$NON-NLS-1$ //$NON-NLS-2$ slider.addStyleName(style); StyleInjector.inject("." + style //$NON-NLS-1$ + ".gwt-SplitLayoutPanel .gwt-SplitLayoutPanel-HDragger { width: 8px !important; background: " //$NON-NLS-1$ + getColor() + "; cursor: pointer; }"); //$NON-NLS-1$ percentLabel = new Label(); setSlidersWidth(); } private void setSlidersWidth() { slider.clear(); westPanel = new SimplePanel(); int width = getPivot() - getMin(); westPanel.setWidth((width < 0 ? 0 : width) + "px"); //$NON-NLS-1$ percentLabel.setText(getPercent() + "%"); //$NON-NLS-1$ centerPanel = new SimplePanel(); width = getMax() - getMin(); centerPanel.setWidth((width < 0 ? 0 : width) + "px"); //$NON-NLS-1$ slider.addWest(westPanel, getPivot() - getMin()); slider.add(centerPanel); } }