package org.ovirt.engine.ui.userportal.client.components; import com.google.gwt.core.client.GWT; import org.ovirt.engine.core.compat.EventArgs; import org.ovirt.engine.core.compat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicommon.models.RangeEntityModel; import org.ovirt.engine.core.compat.Event; import org.ovirt.engine.core.compat.IEventListener; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.Slider; import com.smartgwt.client.widgets.events.ValueChangedEvent; import com.smartgwt.client.widgets.events.ValueChangedHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.CanvasItem; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; import com.smartgwt.client.widgets.form.fields.events.KeyDownEvent; import com.smartgwt.client.widgets.form.fields.events.KeyDownHandler; import com.smartgwt.client.widgets.form.fields.events.KeyUpEvent; import com.smartgwt.client.widgets.form.fields.events.KeyUpHandler; import com.smartgwt.client.widgets.layout.HLayout; public class SliderItemRangeModelBinded extends CanvasItem { private Slider slider; private TextItem valueBox; private Label minLabel; private Label maxLabel; private RangeEntityModel model; private CanvasItem sp = this; private int min; private int max; String innerID; public SliderItemRangeModelBinded(String title, int width, final RangeEntityModel model, String id) { setTitle(title); setTitleAlign(Alignment.LEFT); this.model = model; slider = new Slider(); slider.setVertical(false); slider.setWidth(width - 30); slider.setShowValue(false); slider.setShowTitle(false); slider.setShowRange(false); slider.setID(id); if (model.getEntity() != null) slider.setValue((Integer)model.getEntity()); if (model.getInterval() != 0) slider.setNumValues(((Double)((max-min+1)/model.getInterval())).intValue()); minLabel = new Label(); minLabel.setAutoFit(true); minLabel.setLayoutAlign(VerticalAlignment.BOTTOM); maxLabel = new Label(); maxLabel.setAutoFit(true); maxLabel.setLayoutAlign(VerticalAlignment.BOTTOM); if (model.getMax() >= model.getMin()) { setMax(((Double)model.getMax()).intValue()); setMin(((Double)model.getMin()).intValue()); } valueBox = new TextItem(); valueBox.setWidth(28); valueBox.setShowTitle(false); valueBox.setDisabled(true); valueBox.setShowDisabled(false); valueBox.setValue(((Float)slider.getValue()).intValue()); // A workaround in order to have a hook for automatic testing, we can't directly set the cell id, so we are setting the 'style' attribute instead valueBox.setCellStyle(id + "_valueBox"); DynamicForm valueBoxForm = new DynamicForm(); valueBoxForm.setItems(valueBox); valueBoxForm.setAutoWidth(); valueBoxForm.setAutoHeight(); slider.setLayoutAlign(VerticalAlignment.CENTER); HLayout sliderLayout = new HLayout(); sliderLayout.setAutoWidth(); sliderLayout.setAutoHeight(); sliderLayout.addMember(valueBoxForm); sliderLayout.addMember(minLabel); sliderLayout.addMember(slider); sliderLayout.addMember(maxLabel); addHandlers(); setCanvas(sliderLayout); } public void setMin(Integer value) { min = value; slider.setMinValue(min); minLabel.setContents(value.toString()); } public void setMax(Integer value) { max = value; slider.setMaxValue(max); maxLabel.setContents(value.toString()); } public void addHandlers() { slider.addValueChangedHandler(new ValueChangedHandler() { @Override public void onValueChanged(ValueChangedEvent event) { int sliderValue = ((Float)slider.getValue()).intValue(); if (sliderValue != 0 && model.getIsAllValuesSet()) { model.setEntity(sliderValue); valueBox.setValue(sliderValue); } } }); model.getPropertyChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { String propertyName = ((PropertyChangedEventArgs)args).PropertyName; if (propertyName.equals("Min")) { setMin(((Double)model.getMin()).intValue()); } else if (propertyName.equals("Max")) { setMax(((Double)model.getMax()).intValue()); } else if (propertyName.equals("Interval") && model.getInterval() != 0) { int interval = ((Double)((max-min)/model.getInterval())).intValue() + 1; if (interval == 1) { slider.setDisabled(true); } else { if (slider.getDisabled()) slider.setDisabled(false); slider.setNumValues(interval); } } if (model.getEntity() != null) slider.setValue((Integer)model.getEntity()); } }); model.getEntityChangedEvent().addListener(new IEventListener() { @Override public void eventRaised(Event ev, Object sender, EventArgs args) { slider.setValue((Integer)model.getEntity()); valueBox.setValue((Integer)model.getEntity()); } }); } }