package org.geogebra.web.web.gui.view.algebra;
import org.geogebra.common.euclidian.event.AbstractEvent;
import org.geogebra.common.main.Feature;
import org.geogebra.web.html5.event.PointerEvent;
import org.geogebra.web.html5.event.ZeroOffset;
import org.geogebra.web.html5.gui.util.CancelEventTimer;
import org.geogebra.web.html5.util.sliderPanel.SliderWJquery;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseEvent;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.Widget;
/**
* Controller for slider items in AV that use RETEX editor.
*
* @author laszlo
*
*/
public class SliderTreeItemRetexController extends LatexTreeItemController
implements ValueChangeHandler<Double> {
private SliderTreeItemRetex slider;
/**
* @param item
* parent item
*/
public SliderTreeItemRetexController(SliderTreeItemRetex item) {
super(item);
slider = item;
}
@Override
protected void onPointerUp(AbstractEvent event) {
selectionCtrl.setSelectHandled(false);
if (slider.getMinMax().isVisible()) {
return;
}
super.onPointerUp(event);
}
@Override
public void onMouseMove(MouseMoveEvent evt) {
if (slider.sliderPanel == null) {
evt.stopPropagation();
return;
}
if (CancelEventTimer.cancelMouseEvent()) {
return;
}
PointerEvent wrappedEvent = PointerEvent.wrapEvent(evt,
ZeroOffset.instance);
onPointerMove(wrappedEvent);
}
@Override
public void onDoubleClick(DoubleClickEvent evt) {
evt.stopPropagation();
if ((isWidgetHit(slider.controls.getAnimPanel(), evt)
|| (slider.getMinMax() != null
&& slider.getMinMax().isVisible())
|| isMarbleHit(evt))) {
return;
}
super.onDoubleClick(evt);
}
@Override
protected boolean handleAVItem(int x, int y, boolean rightClick) {
slider.setForceControls(true);
slider.expandSize(slider.getWidthForEdit());
boolean minHit = slider.sliderPanel != null
&& isWidgetHit(slider.getSlider().getWidget(0), x, y);
boolean maxHit = slider.sliderPanel != null
&& isWidgetHit(slider.getSlider().getWidget(2), x, y);
// Min max panel should be closed
if (isAnotherMinMaxOpen() || isClickedOutMinMax(x, y)) {
MinMaxPanel.closeMinMaxPanel(!(minHit || maxHit));
}
if (isAnotherMinMaxOpen()) {
slider.selectItem(false);
}
if (slider.getMinMax() != null && slider.getMinMax().isVisible()) {
slider.selectItem(true);
return false;
}
if (slider.sliderPanel != null && slider.sliderPanel.isVisible()
&& !rightClick) {
if (minHit || maxHit) {
stopEdit();
slider.getMinMax().show();
if (minHit) {
slider.getMinMax().setMinFocus();
} else if (maxHit) {
slider.getMinMax().setMaxFocus();
}
getApp().getKernel().notifyRepaint();
return true;
}
}
if (!selectionCtrl.isSelectHandled()) {
slider.selectItem(true);
}
return false;
}
@Override
public void onMouseDown(MouseDownEvent event) {
if (handleAVItem(event)) {
event.stopPropagation();
return;
}
super.onMouseDown(event);
}
@Override
public void onMouseUp(MouseUpEvent event) {
SliderWJquery.stopSliders();
super.onMouseUp(event);
}
@Override
protected boolean canEditStart(MouseEvent<?> event) {
return super.canEditStart(event)
&& isWidgetHit(item.getPlainTextItem(), event);
}
private static boolean isWidgetHit(Widget w, int x, int y) {
if (w == null) {
return false;
}
int left = w.getAbsoluteLeft();
int top = w.getAbsoluteTop();
int right = left + w.getOffsetWidth();
int bottom = top + w.getOffsetHeight();
return (x > left && x < right && y > top && y < bottom);
}
/**
* @return true if another SliderTreeItem's min/max panel is showing.
*/
boolean isAnotherMinMaxOpen() {
return (MinMaxPanel.getOpenedPanel() != null
&& MinMaxPanel.getOpenedPanel() != slider.getMinMax());
}
private boolean isClickedOutMinMax(int x, int y) {
return (MinMaxPanel.getOpenedPanel() == slider.getMinMax()
&& !isWidgetHit(slider.getMinMax(), x, y));
}
@Override
public void onValueChange(ValueChangeEvent<Double> event) {
slider.expandSize(slider.getWidthForEdit());
if (getApp().has(Feature.AV_SINGLE_TAP_EDIT) && isEditing()) {
stopEdit();
}
slider.getNum().setValue(event.getValue());
slider.geo.updateCascade();
if (!slider.geo.isAnimating()) {
if (isAnotherMinMaxOpen()) {
MinMaxPanel.closeMinMaxPanel();
}
slider.selectItem(true);
updateSelection(false, false);
}
// updates other views (e.g. Euclidian)
getApp().getKernel().notifyRepaint();
}
}