/*
GeoGebra - Dynamic Mathematics for Everyone
http://www.geogebra.org
This file is part of GeoGebra.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation.
*/
package org.geogebra.web.web.gui.view.algebra;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.arithmetic.MyDouble;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.main.Feature;
import org.geogebra.web.html5.gui.util.LayoutUtilW;
import org.geogebra.web.html5.util.sliderPanel.SliderPanelW;
import org.geogebra.web.web.gui.layout.panels.AlgebraDockPanelW;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.Widget;
/**
* Slider item for Algebra View.
*
* @author laszlo
*
*/
public class SliderTreeItemRetex extends LatexTreeItem
implements SliderTreeItemInterface {
private static final int SLIDER_EXT = 15;
/**
* Slider to be shown as part of the extended Slider entries
*/
private SliderPanelW slider;
/**
* panel to correctly display an extended slider entry
*/
FlowPanel sliderPanel = null;
/**
* panel to display animation related controls
*/
private ScheduledCommand resizeCmd = new ScheduledCommand() {
@Override
public void execute() {
resize();
}
};
private MinMaxPanel minMaxPanel;
private GeoNumeric num;
/**
* Creates a SliderTreeItem for AV sliders
*
* @param geo0
* the existing GeoElement to display/edit
*/
public SliderTreeItemRetex(final GeoElement geo0) {
super(geo0);
num = (GeoNumeric) geo;
createSliderGUI();
addControls();
deferredResize();
}
@Override
protected RadioTreeItemController createController() {
return new SliderTreeItemRetexController(this);
}
private SliderTreeItemRetexController getSliderController() {
return (SliderTreeItemRetexController) getController();
}
private void createSliderGUI() {
content.addStyleName("noPadding");
if (!num.isEuclidianVisible()) {
num.initAlgebraSlider();
}
if (num.getIntervalMinObject() != null
&& num.getIntervalMaxObject() != null) {
boolean degree = geo.isGeoAngle()
&& kernel.getAngleUnit() == Kernel.ANGLE_DEGREE;
setSlider(new SliderPanelW(num.getIntervalMin(),
num.getIntervalMax(), app.getKernel(), degree));
updateColor();
getSlider().setValue(num.getValue());
getSlider().setStep(num.getAnimationStep());
getSlider().addValueChangeHandler(getSliderController());
sliderPanel = new FlowPanel();
sliderPanel.add(getSlider());
createMinMaxPanel();
createSliderContent();
styleContentPanel();
addAVEXWidget(content);
sliderContent.add(LayoutUtilW.panelRow(sliderPanel, minMaxPanel));
main.add(sliderContent);
}
}
/**
* resize slider to fit to the panel in a deferred way.
*/
@Override
public void deferredResize() {
if (getSlider() == null) {
return;
}
Scheduler.get().scheduleDeferred(resizeCmd);
}
/** update size */
void resize() {
if (getSlider() == null) {
return;
}
int width = getAV().getOffsetWidth() - 2 * marblePanel.getOffsetWidth()
+ SLIDER_EXT;
if (app.has(Feature.AV_PLAY_ONLY)) {
width -= controls.getAnimPanel().getPlayButton().getOffsetWidth();
}
slider.setWidth(width);
}
private void createMinMaxPanel() {
minMaxPanel = new MinMaxPanel(this);
minMaxPanel.setVisible(false);
}
@Override
protected void styleContentPanel() {
sliderContent.removeStyleName("elemPanel");
sliderContent.addStyleName("avItemContent");
content.addStyleName("avSliderValue");
sliderPanel.setVisible(true);
controls.showAnimPanel(true);
}
private void updateColor() {
getSlider().updateColor(geo.getAlgebraColor());
}
@Override
protected void doUpdate() {
setNeedsUpdate(false);
marblePanel.update();
controls.updateAnimPanel();
getSlider().setScale(app.getArticleElement().getScaleX());
double min = num.getIntervalMin();
double max = num.getIntervalMax();
boolean degree = geo.isGeoAngle()
&& kernel.getAngleUnit() == Kernel.ANGLE_DEGREE;
getSlider().setMinimum(min, degree);
getSlider().setMaximum(max, degree);
getSlider().setStep(num.getAnimationStep());
getSlider().setValue(num.value);
minMaxPanel.update();
if (!getSlider().isAttached()) {
sliderPanel.add(getSlider());
styleContentPanel();
}
updateTextItems();
updateColor();
}
//
// static boolean isWidgetHit(Widget w, MouseEvent<?> evt) {
// return isWidgetHit(w, evt.getClientX(), evt.getClientY());
//
// }
@Override
protected void addAVEXWidget(Widget w) {
if (sliderPanel == null) {
return;
}
sliderPanel.remove(getSlider());
sliderContent.add(w);
sliderPanel.add(getSlider());
}
@Override
public void onResize() {
deferredResize();
super.onResize();
}
@Override
public void setDraggable() {
// slider is not draggable from AV to EV.
}
/**
* cast method with no 'instanceof' check.
*
* @param item
* TreeItem to be casted
* @return Casted item to SliderTreeItem
*/
public static SliderTreeItemRetex as(TreeItem item) {
return (SliderTreeItemRetex) item;
}
@Override
public boolean isInputTreeItem() {
return false;
}
/**
*
* @param geo
* geo element
* @return if geo matches to SliderTreeItem.
*/
public static boolean match(GeoElement geo) {
return geo instanceof GeoNumeric
&& ((GeoNumeric) geo).isShowingExtendedAV() && geo.isSimple()
&& MyDouble.isFinite(((GeoNumeric) geo).value);
}
@Override
public void setSliderVisible(boolean visible) {
sliderPanel.setVisible(visible);
}
@Override
public void selectItem(boolean selected) {
AlgebraDockPanelW dp = getAlgebraDockPanel();
if (first && !dp.hasLongStyleBar()) {
dp.showStyleBarPanel(!selected);
}
super.selectItem(selected);
}
@Override
public void setAnimPanelVisible(boolean visible) {
controls.showAnimPanel(visible);
}
@Override
public void setFocus(boolean b, boolean sv) {
// ignore
}
@Override
public boolean isSliderItem() {
return true;
}
/**
* @return slider
*/
public SliderPanelW getSlider() {
return slider;
}
/**
* @param slider
* slider
*/
public void setSlider(SliderPanelW slider) {
this.slider = slider;
}
@Override
public void expandSize(int width) {
if (getAV().getOffsetWidth() < width) {
getAV().expandWidth(width);
}
}
@Override
public void restoreSize() {
getAV().restoreWidth(false);
}
/**
* @return number
*/
protected GeoNumeric getNum() {
return num;
}
/**
* @return min/max panel
*/
public MinMaxPanel getMinMax() {
return this.minMaxPanel;
}
@Override
protected int getWidthForEdit() {
return MinMaxPanel.MINMAX_MIN_WIDHT;
}
@Override
public boolean onEditStart(boolean substituteNumbers) {
if (minMaxPanel.isVisible()) {
return false;
}
return super.onEditStart(substituteNumbers);
}
}