package org.geogebra.web.web.gui.view.consprotocol;
import org.geogebra.common.gui.view.consprotocol.ConstructionProtocolNavigation;
import org.geogebra.common.gui.view.consprotocol.ConstructionProtocolView;
import org.geogebra.common.main.App;
import org.geogebra.web.html5.css.GuiResourcesSimple;
import org.geogebra.web.html5.javax.swing.GSpinnerW;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.css.GuiResources;
import org.geogebra.web.web.gui.util.ImageOrText;
import org.geogebra.web.web.gui.util.MyCJButton;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NodeList;
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.safehtml.shared.SafeUri;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PushButton;
public class ConstructionProtocolNavigationW extends ConstructionProtocolNavigation implements ClickHandler{
AppW app;
private Label lbSteps;
ConstructionProtocolViewW prot;
private FlowPanel implPanel;
private PushButton btFirst;
private PushButton btLast;
private PushButton btPrev;
private PushButton btNext;
PushButton btPlay;
GSpinnerW spDelay;
private AutomaticPlayer player;
private MyCJButton btOpenWindow;
private FlowPanel playPanel;
final private Image playIcon = new Image(
GuiResourcesSimple.INSTANCE.icons_play_circle());
final private Image playIconHover = new Image(
GuiResourcesSimple.INSTANCE.icons_play_circle_hover());
final private Image pauseIcon = new Image(
GuiResourcesSimple.INSTANCE.icons_play_pause_circle());
final private Image pauseIconHover = new Image(
GuiResourcesSimple.INSTANCE.icons_play_pause_circle_hover());
public ConstructionProtocolNavigationW(AppW app, int viewID) {
implPanel = new FlowPanel();
this.app = app;
spDelay = new GSpinnerW();
lbSteps = new Label();
setViewID(viewID);
}
public static Image getImageForIcon(SafeUri src) {
return new Image(src);
}
public void initGUI(){
btFirst = new PushButton(new Image(
GuiResources.INSTANCE.icons_play_skipback()));
btFirst.getUpHoveringFace().setImage(
new Image(
GuiResources.INSTANCE.icons_play_skipback_hover()));
btLast = new PushButton(new Image(
GuiResources.INSTANCE.icons_play_skipforward()));
btLast.getUpHoveringFace()
.setImage(
new Image(
GuiResources.INSTANCE.icons_play_skipforward_hover()));
btPrev = new PushButton(new Image(
GuiResources.INSTANCE.icons_play_rewind()));
btPrev.getUpHoveringFace().setImage(
new Image(
GuiResources.INSTANCE.icons_play_rewind_hover()));
btNext = new PushButton(new Image(
GuiResources.INSTANCE.icons_play_fastforward()));
btNext.getUpHoveringFace()
.setImage(
new Image(
GuiResources.INSTANCE.icons_play_fastforward_hover()));
btFirst.addClickHandler(this);
btLast.addClickHandler(this);
btPrev.addClickHandler(this);
btNext.addClickHandler(this);
FlowPanel leftPanel = new FlowPanel();
leftPanel.add(btFirst);
leftPanel.add(btPrev);
leftPanel.add(lbSteps);
leftPanel.add(btNext);
leftPanel.add(btLast);
playPanel = new FlowPanel();
playPanel.setVisible(showPlayButton);
btPlay = new PushButton(); // will be initialized in setLabels()
btPlay.addClickHandler(this);
spDelay.addChangeHandler(new ChangeHandler(){
@Override
public void onChange(ChangeEvent event) {
try {
playDelay = Double.parseDouble(spDelay.getValue().toString());
} catch (Exception ex) {
playDelay = 2;
}
}
});
playPanel.add(btPlay);
playPanel.add(spDelay);
playPanel.add(new Label("s"));
leftPanel.addStyleName("navbar_leftPanel");
playPanel.addStyleName("navbar_playPanel");
implPanel.add(leftPanel);
implPanel.add(playPanel);
btOpenWindow = new MyCJButton();
btOpenWindow.setIcon(new ImageOrText(GuiResources.INSTANCE
.icons_view_construction_protocol_p24()));
// getImageForIcon(
// AppResources.INSTANCE.table().getSafeUri()).toString());
btOpenWindow.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (!app.getGuiManager().showView(
App.VIEW_CONSTRUCTION_PROTOCOL)) {
app.getGuiManager().setShowView(true,
App.VIEW_CONSTRUCTION_PROTOCOL);
btOpenWindow.addStyleName("consProtIsOpen");
} else {
app.getGuiManager().setShowView(false,
App.VIEW_CONSTRUCTION_PROTOCOL);
btOpenWindow.removeStyleName("consProtIsOpen");
}
}
});
btOpenWindow.setVisible(isConsProtButtonVisible());
addPaddingPlayPanel(showConsProtButton);
btOpenWindow.addStyleName("navbar_btOpenWindow");
implPanel.add(btOpenWindow);
setLabels();
update();
}
/**
* Updates the texts that show the current construction step and
* the number of construction steps.
*/
@Override
public void update() {
if (prot != null) {
int currentStep = prot.getCurrentStepNumber();
int stepNumber = prot.getLastStepNumber();
lbSteps.setText(currentStep + " / " + stepNumber);
}
}
@Override
public void register(ConstructionProtocolView constructionProtocolView) {
if (prot == null) {
initGUI();
}
if (constructionProtocolView instanceof ConstructionProtocolViewW) {
prot = (ConstructionProtocolViewW) constructionProtocolView;
prot.registerNavigationBar(this);
}
}
@Override
public void setVisible(boolean visible) {
implPanel.setVisible(visible);
}
@Override
public void setPlayDelay(double delay) {
playDelay = delay;
try {
spDelay.setValue(playDelay + "");
} catch (Exception e) {
spDelay.setValue(Math.round(playDelay) + "");
}
}
@Override
public void setConsProtButtonVisible(boolean flag) {
showConsProtButton = flag;
if (btOpenWindow != null) {
btOpenWindow.setVisible(isConsProtButtonVisible());
addPaddingPlayPanel(isConsProtButtonVisible());
}
}
@Override
public void setLabels() {
if (btPlay != null){
// String btPlayText =
// "<div class=\"gwt-Label\">"+app.getPlain((isPlaying)?"Pause":"Play")+"</div>";
// Image playImage = getImageForIcon(
// ((isPlaying) ? AppResources.INSTANCE.nav_pause() :
// AppResources.INSTANCE.nav_play())
// .getSafeUri());
// btPlay.setHTML(playImage.toString()+btPlayText);
if (isPlaying()) {
btPlay.getUpFace().setImage(playIcon);
btPlay.getUpHoveringFace().setImage(playIconHover);
} else {
btPlay.getUpFace().setImage(pauseIcon);
btPlay.getUpHoveringFace().setImage(pauseIconHover);
}
}
if (btOpenWindow != null){
btOpenWindow.setTitle(app.getLocalization().getPlainTooltip("ConstructionProtocol"));
}
}
private void addPaddingPlayPanel(boolean addPadding) {
if (addPadding) {
playPanel.addStyleName("navbar_playPanel_padding");
} else {
playPanel.removeStyleName("navbar_playPanel_padding");
}
}
public FlowPanel getImpl(){
return implPanel;
}
@Override
public void onClick(ClickEvent event) {
Object source = event.getSource();
//TODO : set cursor for wait cursor
if (source == btFirst) {
prot.firstStep();
}
else if (source == btLast) {
prot.lastStep();
}
else if (source == btPrev) {
prot.previousStep();
}
else if (source == btNext) {
prot.nextStep();
return;
}
else if (source == btPlay){
if (isPlaying()) {
player.stopAnimation();
} else {
player = new AutomaticPlayer();
player.startAnimation();
}
}
prot.scrollToConstructionStep();
}
/**
* Make all components enabled / disabled
* @param flag whether components should be enabled
*/
void setComponentsEnabled(boolean flag) {
NodeList<Element> buttons = implPanel.getElement().getElementsByTagName("button");
for (int i=0; i < buttons.getLength(); i++) {
buttons.getItem(i).setPropertyBoolean("disabled", !flag);
}
btPlay.setEnabled(true);
//? lbSteps.setEnabled(true);
}
@Override
public void setButtonPlay() {
// Image playImage = getImageForIcon(AppResources.INSTANCE.nav_play()
// .getSafeUri());
// btPlay.setHTML(playImage.toString() + "<div class=\"gwt-Label\">"
// + app.getPlain("Play") + "</div>");
btPlay.getUpFace().setImage(playIcon);
btPlay.getUpHoveringFace().setImage(playIconHover);
}
@Override
public void setButtonPause() {
// Image playImage = getImageForIcon(AppResources.INSTANCE.nav_pause()
// .getSafeUri());
// btPlay.setHTML(playImage.toString() + "<div class=\"gwt-Label\">"
// + app.getPlain("Pause") + "</div>");
btPlay.getUpFace().setImage(pauseIcon);
btPlay.getUpHoveringFace().setImage(pauseIconHover);
}
private class AutomaticPlayer{
Timer timer;
/**
* Creates a new player to step through the construction
* automatically.
*/
public AutomaticPlayer() {
timer = new Timer(){
@Override
public void run() {
prot.nextStep();
if (prot.getCurrentStepNumber() == prot.getLastStepNumber()) {
stopAnimation();
}
if (isPlaying()) {
timer.schedule((int) (playDelay * 1000));
}
}
};
}
public synchronized void startAnimation() {
// app.startDispatchingEventsTo(btPlay);
//TODO set cursor:wait
setPlaying(true);
app.setNavBarButtonPause();
setComponentsEnabled(false);
if (prot.getCurrentStepNumber() == prot.getLastStepNumber()) {
prot.setConstructionStep(-1);
}
timer.run();
}
public synchronized void stopAnimation() {
//TODO remove cursor:wait
timer.cancel();
// unblock application events
// app.stopDispatchingEvents();
setPlaying(false);
app.setNavBarButtonPlay();
setComponentsEnabled(true);
}
}
@Override
protected void setPlayPanelVisible(boolean flag) {
if (playPanel != null) {
playPanel.setVisible(flag);
}
}
}