package org.geogebra.web.web.gui.view.algebra;
import org.geogebra.common.euclidian.event.PointerEventType;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.main.Feature;
import org.geogebra.common.util.lang.Unicode;
import org.geogebra.web.html5.css.GuiResourcesSimple;
import org.geogebra.web.html5.gui.util.ClickStartHandler;
import org.geogebra.web.web.css.GuiResources;
import org.geogebra.web.web.gui.util.MyToggleButtonW;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PushButton;
/**
* Animation panel for points and sliders
*
*/
public class AnimPanel extends FlowPanel implements ClickHandler {
/**
* Animation speeds
*/
final static double animSpeeds[] = { 0.05, 0.1, 0.15, 0.2, 0.35, 0.75, 1,
1.5, 2, 3.5, 4, 5, 6, 7, 10, 15, 20 };
private final RadioTreeItem radioTreeItem;
private MyToggleButtonW btnSpeedDown;
private PushButton btnSpeedValue;
private MyToggleButtonW btnSpeedUp;
private MyToggleButtonW btnPlay;
private boolean speedButtons = false;
private boolean play = false;
private int speedIndex = 6;
private boolean playOnly;
/**
* @param radioTreeItem
* parent item
*/
public AnimPanel(RadioTreeItem radioTreeItem) {
super();
this.radioTreeItem = radioTreeItem;
addStyleName("elemRow");
playOnly = radioTreeItem.app.has(Feature.AV_PLAY_ONLY);
if (playOnly) {
buildPlayOnly();
} else {
buildPlayWithSpeedButtons();
}
}
private void buildPlayOnly() {
createPlayButton();
btnPlay.addStyleName("playOnly");
add(btnPlay);
}
private void buildPlayWithSpeedButtons() {
btnSpeedDown = new MyToggleButtonW(
GuiResources.INSTANCE.icons_play_rewind());
btnSpeedDown.getUpHoveringFace().setImage(
new Image(GuiResources.INSTANCE.icons_play_rewind_hover()));
btnSpeedDown.setStyleName("avSpeedButton");
btnSpeedDown.addStyleName("slideIn");
btnSpeedUp = new MyToggleButtonW(
GuiResources.INSTANCE.icons_play_fastforward());
btnSpeedUp.getUpHoveringFace().setImage(new Image(
GuiResources.INSTANCE.icons_play_fastforward_hover()));
btnSpeedUp.setStyleName("avSpeedButton");
btnSpeedUp.addStyleName("slideIn");
// btnSpeedUp.removeStyleName("MyToggleButton");
btnSpeedDown.addClickHandler(this);
btnSpeedUp.addClickHandler(this);
btnSpeedValue = new PushButton("");
btnSpeedValue.addStyleName("speedValue");
btnSpeedValue.addStyleName("slideIn");
btnSpeedValue.addClickHandler(this);
setSpeedText(this.radioTreeItem.geo.getAnimationSpeed());
createPlayButton();
add(btnSpeedDown);
add(btnSpeedValue);
add(btnSpeedUp);
add(btnPlay);
showSpeedValue(false);
}
private void createPlayButton() {
btnPlay = new MyToggleButtonW(
GuiResourcesSimple.INSTANCE.icons_play_circle(),
GuiResourcesSimple.INSTANCE.icons_play_pause_circle());
btnPlay.getUpHoveringFace().setImage(
new Image(GuiResourcesSimple.INSTANCE
.icons_play_circle_hover()));
btnPlay.getDownHoveringFace()
.setImage(new Image(GuiResourcesSimple.INSTANCE
.icons_play_pause_circle_hover()));
btnPlay.setStyleName("avPlayButton");
ClickStartHandler.init(btnPlay, new ClickStartHandler() {
@Override
public boolean onClickStart(int x, int y, PointerEventType type,
boolean right) {
if (right) {
return true;
}
getController().stopEdit();
boolean value = !isGeoAnimating();
getGeo().setAnimating(value);
setPlay(value);
getGeo().updateRepaint();
AnimPanel.this.setAnimating(
getGeo().isAnimating());
return true;
}
@Override
public void onClickStart(int x, int y, PointerEventType type) {
onClickStart(x, y, type, false);
}
});
}
/** @return tree item controller */
protected RadioTreeItemController getController() {
return radioTreeItem.getController();
}
/**
* @return geo element
*/
protected GeoElement getGeo() {
return this.radioTreeItem.geo;
}
/**
* Set aniating flag of underlying geo
*
* @param value
* whether animation is on
*/
void setAnimating(boolean value) {
if (!(getGeo().isAnimatable())) {
return;
}
getGeo().setAnimating(value);
getGeo().getKernel().getAnimatonManager().startAnimation();
}
/**
* @param value
* whether animation is playing
*/
void setPlay(boolean value) {
play = value;
if (playOnly) {
return;
}
showSpeedButtons(false);
if (value) {
showSpeedValue(true);
} else {
showSpeedValue(false);
}
}
private void showSpeedValue(boolean value) {
if (playOnly) {
return;
}
setSpeedText(this.radioTreeItem.geo.getAnimationSpeed());
if (value) {
btnSpeedValue.removeStyleName("hidden");
} else {
btnSpeedValue.addStyleName("hidden");
showSpeedButtons(false);
}
}
/**
* @param value
* whether play buttons should be visible
*/
public void showPlay(boolean value) {
btnPlay.setVisible(value);
}
private void showSpeedButtons(boolean value) {
if (playOnly) {
return;
}
if (value) {
setSpeedText(this.radioTreeItem.geo.getAnimationSpeed());
btnSpeedUp.removeStyleName("hidden");
btnSpeedDown.removeStyleName("hidden");
} else {
btnSpeedUp.addStyleName("hidden");
btnSpeedDown.addStyleName("hidden");
}
speedButtons = value;
}
private void setSpeed() {
if (playOnly) {
return;
}
double speed = animSpeeds[this.speedIndex];
this.radioTreeItem.geo.setAnimationSpeed(speed);
setSpeedText(speed);
}
private void setSpeedText(double speed) {
if (playOnly) {
return;
}
String speedStr = speed + " " + Unicode.MULTIPLY;
btnSpeedValue.getUpFace().setText(speedStr);
btnSpeedValue.getUpHoveringFace().setText(speedStr);
btnSpeedValue.getDownFace().setText(speedStr);
btnSpeedValue.getDownHoveringFace().setText(speedStr);
btnSpeedValue.setText(speedStr);
}
@Override
public void onClick(ClickEvent event) {
radioTreeItem.getController().stopEdit();
if (event.getNativeButton() == NativeEvent.BUTTON_RIGHT) {
return;
}
Object source = event.getSource();
if (source == btnSpeedDown) {
speedDown();
this.radioTreeItem.selectItem(true);
} else if (source == btnSpeedUp) {
speedUp();
this.radioTreeItem.selectItem(true);
} else if (source == btnSpeedValue) {
showSpeedButtons(!speedButtons);
}
}
private void speedUp() {
if (this.speedIndex < animSpeeds.length - 1) {
this.speedIndex++;
setSpeed();
}
}
private void speedDown() {
if (this.speedIndex > 0) {
this.speedIndex--;
setSpeed();
}
}
/**
* Update UI
*/
public void update() {
boolean visible = this.radioTreeItem.geo != null
&& this.radioTreeItem.geo.isAnimatable();
if (isGeoAnimating() != play || !isVisible()) {
boolean v = isGeoAnimating();
setPlay(v);
btnPlay.setDown(v);
}
setVisible(visible);
}
/**
* @return whether geo is animating
*/
boolean isGeoAnimating() {
return this.radioTreeItem.geo.isAnimating() && this.radioTreeItem.kernel.getAnimatonManager().isRunning();
}
/**
* Reset UI
*/
public void reset() {
if (playOnly) {
return;
}
showSpeedButtons(false);
showSpeedValue(isGeoAnimating());
}
MyToggleButtonW getPlayButton() {
return btnPlay;
}
}