package org.geogebra.web.html5.util.sliderPanel; import org.geogebra.common.awt.GColor; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.StringTemplate; import org.geogebra.web.html5.awt.GDimensionW; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.html5.util.Dom; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.HasChangeHandlers; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.user.client.ui.Label; public class SliderPanelW extends FlowPanel implements HasChangeHandlers, HasValue<Double> { private SliderWI slider; private Label minLabel; private Label maxLabel; private Kernel kernel; private String[] parts = new String[2]; private Double currentMin = null; private Double currentMax = null; private Double currentStep = null; public SliderPanelW(double min, double max, Kernel kernel, boolean degrees) { this.kernel = kernel; minLabel = new Label(); add(minLabel); slider = new SliderWJquery(min, max); slider.setScale(((AppW) kernel.getApplication()).getArticleElement() .getScaleX()); add(slider); maxLabel = new Label(); setMinimum(min, degrees); setMaximum(max, degrees); add(maxLabel); setStyleName("optionsSlider"); } @Override public Double getValue() { return slider.getValue(); } public void setMinimum(double min, boolean degrees) { if (currentMin == null || !Kernel.isEqual(currentMin, min)) { currentMin = min; slider.setMinimum(min); printParts(minLabel, min, degrees); } } private void printParts(Label label, double val, boolean degrees) { if (degrees) { label.setText(kernel.formatAngle(val, StringTemplate.defaultTemplate, true).toString()); return; } parts = StringTemplate.printLimitedWidth(val, kernel, parts); if (parts[1] == null) { label.setText(parts[0]); } else { label.setText(parts[0] + "\u00D7 10"); Element exponent = DOM.createElement("sup"); exponent.setInnerText(parts[1]); label.getElement().appendChild(exponent); } } public void setMaximum(double max, boolean degrees) { if (currentMax == null || !Kernel.isEqual(currentMax, max)) { currentMax = max; slider.setMaximum(max); printParts(maxLabel, max, degrees); } } public void setStep(double step) { if (currentStep == null || !Kernel.isEqual(currentStep, step)) { currentStep = step; slider.setStep(step); } } public GDimensionW getPreferredSize() { return new GDimensionW(180, 10); } @Override public HandlerRegistration addValueChangeHandler( ValueChangeHandler<Double> handler) { return slider.addValueChangeHandler(handler); } @Override public void setValue(Double value) { slider.setValue(value, false); } @Override public void setValue(Double value, boolean fireEvents) { slider.setValue(value, fireEvents); } @Override public HandlerRegistration addChangeHandler(ChangeHandler handler) { return slider.addChangeHandler(handler); } public void setWidth(double width) { double w = width - minLabel.getOffsetWidth() - maxLabel.getOffsetWidth(); slider.asWidget().getElement().getStyle().setWidth(w, Unit.PX); } public void updateColor(GColor color) { GColor c = color.deriveWithAlpha(102); // String sColor = GColor.getColorString(color); // minLabel.getElement().getStyle().setColor(sColor); // maxLabel.getElement().getStyle().setColor(sColor); // slider.asWidget().getElement().getStyle() // .setBackgroundColor(GColor.getColorString(c)); Style uiStyle = Dom.querySelectorForElement(getElement(), "ui-slider") .getStyle(); uiStyle.setBackgroundColor(GColor.getColorString(c)); setUIStyle(getElement(), color); } private static void setUIStyle(Element elem, GColor color) { GColor c = color.deriveWithAlpha(102); Style style = Dom.querySelectorForElement(elem, "ui-state-default").getStyle(); style.setBackgroundColor(GColor.getColorString(color)); style.setBorderColor(GColor.getColorString(c)); } /** * @param scale * scale of the app, NOT including browser zoom */ public void setScale(double scale) { if (slider != null) { slider.setScale(scale); } } }