package org.geogebra.web.web.gui.properties; import org.geogebra.common.euclidian.event.KeyEvent; import org.geogebra.common.euclidian.event.KeyHandler; import org.geogebra.common.gui.dialog.options.model.SliderModel; import org.geogebra.common.gui.dialog.options.model.SliderModel.ISliderOptionsListener; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.arithmetic.MyDouble; import org.geogebra.common.kernel.arithmetic.NumberValue; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.main.Localization; import org.geogebra.web.html5.gui.inputfield.AutoCompleteTextFieldW; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.web.gui.AngleTextFieldW; import org.geogebra.web.web.gui.dialog.options.CheckboxPanel; import org.geogebra.web.web.gui.dialog.options.model.ExtendedAVModel; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TabPanel; /** * panel for numeric slider * * @author Markus Hohenwarter */ public class SliderPanelW extends OptionPanel implements ISliderOptionsListener { private SliderModel model; private AngleTextFieldW tfMin, tfMax; private AutoCompleteTextFieldW tfWidth; private Label minLabel; private Label maxLabel; private Label widthLabel; private Label widthUnitLabel; private CheckBox cbSliderFixed, cbRandom; private ListBox lbSliderHorizontal; private AnimationStepPanelW stepPanel; private AnimationSpeedPanelW speedPanel; private Kernel kernel; private FlowPanel intervalPanel, sliderPanel, animationPanel; private boolean useTabbedPane; private CheckboxPanel avPanel; private Localization loc; public SliderPanelW(final AppW app, boolean useTabbedPane, boolean includeRandom) { this.loc = app.getLocalization(); kernel = app.getKernel(); model = new SliderModel(app, this); setModel(model); this.useTabbedPane = useTabbedPane; model.setIncludeRandom(includeRandom); intervalPanel = new FlowPanel(); intervalPanel.setStyleName("sliderIntervalPanel"); sliderPanel = new FlowPanel(); FlowPanel positionPanel = new FlowPanel(); positionPanel.setStyleName("optionsPanel"); sliderPanel.add(positionPanel); animationPanel = new FlowPanel(); avPanel = new CheckboxPanel("ShowSliderInAlgebraView", app.getLocalization(), new ExtendedAVModel(null, app)); cbSliderFixed = new CheckBox(); cbSliderFixed.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { model.applyFixed(cbSliderFixed.getValue()); }}); positionPanel.add(cbSliderFixed); cbRandom = new CheckBox(); cbRandom.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { model.applyRandom(cbRandom.getValue()); }}); positionPanel.add(cbRandom); lbSliderHorizontal = new ListBox(); lbSliderHorizontal.addChangeHandler(new ChangeHandler(){ @Override public void onChange(ChangeEvent event) { model.applyDirection(lbSliderHorizontal.getSelectedIndex()); }}); positionPanel.add(lbSliderHorizontal); tfMin = new AngleTextFieldW(6, app); tfMin.addKeyDownHandler(new KeyDownHandler(){ @Override public void onKeyDown(KeyDownEvent event) { if (event.getNativeEvent().getKeyCode() == 13) { applyMin(); } }}); tfMin.enableGGBKeyboard(); tfMin.addBlurHandler(new BlurHandler() { @Override public void onBlur(BlurEvent event) { applyMin(); } }); tfMax = new AngleTextFieldW(6, app); tfMax.addKeyDownHandler(new KeyDownHandler(){ @Override public void onKeyDown(KeyDownEvent event) { if (event.getNativeEvent().getKeyCode() == 13) { applyMax(); } }}); tfMax.enableGGBKeyboard(); tfMax.addBlurHandler(new BlurHandler() { @Override public void onBlur(BlurEvent event) { applyMax(); } }); tfWidth = new AutoCompleteTextFieldW(8, app); tfWidth.removeSymbolTable(); tfWidth.addKeyHandler(new KeyHandler(){ @Override public void keyReleased(KeyEvent e) { if (e.isEnterKey()) { applyWidth(); } }}); tfWidth.enableGGBKeyboard(); tfWidth.addBlurHandler(new BlurHandler() { @Override public void onBlur(BlurEvent event) { applyWidth(); } }); maxLabel = new Label(); minLabel = new Label(); widthLabel = new Label(); widthUnitLabel = new Label(); FlowPanel minPanel = new FlowPanel(); minPanel.add(minLabel); minPanel.add(tfMin); intervalPanel.add(minPanel); FlowPanel maxPanel = new FlowPanel(); maxPanel.add(maxLabel); maxPanel.add(tfMax); intervalPanel.add(maxPanel); FlowPanel widthPanel = new FlowPanel(); widthPanel.setStyleName("optionsPanel"); widthPanel.setStyleName("sliderWidthPanel"); widthPanel.add(widthLabel); widthPanel.add(tfWidth); widthPanel.add(widthUnitLabel); sliderPanel.add(widthPanel); // add increment to intervalPanel stepPanel = new AnimationStepPanelW(app); stepPanel.setPartOfSliderPanel(); intervalPanel.add(stepPanel.getWidget()); speedPanel = new AnimationSpeedPanelW(app); speedPanel.setPartOfSliderPanel(); animationPanel.add(speedPanel.getWidget()); initPanels(); setLabels(); } @Override public OptionPanel updatePanel(Object[] geos) { stepPanel.updatePanel(geos); speedPanel.updatePanel(geos); avPanel.updatePanel(geos); return super.updatePanel(geos); } protected void applyMin() { model.applyMin(getNumberFromInput(tfMin.getText().trim())); } protected void applyMax() { model.applyMax(getNumberFromInput(tfMax.getText().trim())); } protected void applyWidth() { model.applyWidth(getNumberFromInput(tfWidth.getText().trim()).getDouble()); } private void initPanels() { FlowPanel mainPanel = new FlowPanel(); // put together interval, slider options, animation panels if (useTabbedPane) { TabPanel tabPanel = new TabPanel(); tabPanel.add(intervalPanel, loc.getMenu("Interval")); tabPanel.add(sliderPanel, loc.getMenu("Slider")); tabPanel.add(animationPanel, loc.getMenu("Animation")); mainPanel.add(tabPanel); tabPanel.selectTab(0); } else { // no tabs // setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // intervalPanel.setBorder(BorderFactory.createTitledBorder(app // .getPlain("Interval"))); // sliderPanel.setBorder(BorderFactory.createTitledBorder(app // .getPlain("Slider"))); // animationPanel.setBorder(BorderFactory.createTitledBorder(app // .getPlain("Animation"))); mainPanel.add(intervalPanel); mainPanel.add(sliderPanel); mainPanel.add(animationPanel); } mainPanel.add(avPanel.getWidget()); setWidget(mainPanel); } @Override public void setLabels() { cbSliderFixed.setText(loc.getMenu("fixed")); cbRandom.setText(loc.getMenu("Random")); String[] comboStr = { loc.getMenu("horizontal"), loc.getMenu("vertical") }; int selectedIndex = lbSliderHorizontal.getSelectedIndex(); lbSliderHorizontal.clear(); for (int i = 0; i < comboStr.length; ++i) { lbSliderHorizontal.addItem(comboStr[i]); } lbSliderHorizontal.setSelectedIndex(selectedIndex); minLabel.setText(loc.getMenu("min") + ":"); maxLabel.setText(loc.getMenu("max") + ":"); widthLabel.setText(loc.getMenu("Width") + ":"); model.setLabelForWidthUnit(); stepPanel.setLabels(); speedPanel.setLabels(); avPanel.setLabels(); } private NumberValue getNumberFromInput(final String inputText) { boolean emptyString = "".equals(inputText); NumberValue value = new MyDouble(kernel, Double.NaN); if (!emptyString) { value = kernel.getAlgebraProcessor().evaluateToNumeric(inputText, false); } return value; } @Override public void setMinText(String text) { tfMin.setText(text); } @Override public void setMaxText(String text) { tfMax.setText(text); } @Override public void setWidthText(String text) { tfWidth.setText(text); } @Override public void selectFixed(boolean value) { cbSliderFixed.setValue(value); } @Override public void selectRandom(boolean value) { cbRandom.setValue(value); } @Override public void setRandomVisible(boolean value) { cbRandom.setVisible(value); } @Override public void setSliderDirection(int index) { lbSliderHorizontal.setSelectedIndex(index); } @Override public void setWidthUnitText(String text) { widthUnitLabel.setText(text); } public void applyAll(GeoElement geoResult) { Object geos[] = {geoResult}; model.setGeos(geos); model.applyFixed(cbSliderFixed.getValue()); model.applyRandom(cbRandom.getValue()); model.applyDirection(lbSliderHorizontal.getSelectedIndex()); applyMin(); applyMax(); applyWidth(); } }