package org.ovirt.engine.ui.webadmin.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() + "%");
}
}
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");
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
private void initSlides() {
slider = new SplitLayoutPanel() {
@Override
public void onResize() {
// TODO Auto-generated method stub
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";
slider.addStyleName(style);
StyleInjector.inject("." + style
+ ".gwt-SplitLayoutPanel .gwt-SplitLayoutPanel-HDragger { width: 8px !important; background: "
+ getColor() + "; cursor: hand; cursor: pointer; }");
percentLabel = new Label();
setSlidersWidth();
}
private void setSlidersWidth() {
slider.clear();
westPanel = new SimplePanel();
int width = getPivot() - getMin();
westPanel.setWidth((width < 0 ? 0 : width) + "px");
percentLabel.setText(getPercent() + "%");
centerPanel = new SimplePanel();
width = getMax() - getMin();
centerPanel.setWidth((width < 0 ? 0 : width) + "px");
slider.addWest(westPanel, getPivot() - getMin());
slider.add(centerPanel);
}
}