package org.geogebra.web.web.gui.view.algebra;
import org.geogebra.common.euclidian.event.PointerEventType;
import org.geogebra.common.gui.SetLabels;
import org.geogebra.common.main.Feature;
import org.geogebra.web.html5.css.GuiResourcesSimple;
import org.geogebra.web.html5.gui.util.ClickStartHandler;
import org.geogebra.web.html5.gui.util.NoDragImage;
import org.geogebra.web.web.css.GuiResources;
import org.geogebra.web.web.gui.images.AppResources;
import org.geogebra.web.web.gui.inputbar.InputBarHelpPanelW;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.ToggleButton;
/**
* @author Zbynek
*/
public class MarblePanel extends FlowPanel implements SetLabels {
private Marble marble;
private boolean selected = false;
/** warning triangle / help button */
private ToggleButton btnHelpToggle;
/** plus button (new expression / text, ...) */
ToggleButton btnPlus;
/** av item */
RadioTreeItem item;
/** plus menu */
ContextMenuPlus cmPlus=null;
private boolean noPlus=false;
/**
* @param item
* AV item
*/
public MarblePanel(RadioTreeItem item) {
this.item = item;
marble = new Marble(item);
marble.setStyleName("marble");
marble.setEnabled(shouldShowMarble());
addStyleName("marblePanel");
if (item.app.has(Feature.AV_PLUS) && item.getAV().isInputActive()) {
addStyleName("plus");
initPlus();
return;
}
if (item.getGeo() != null) {
marble.setChecked(item.geo.isEuclidianVisible());
add(marble);
} else {
updateIcons(false);
}
update();
}
/**
* @param selected
* whether this should be highlighted
*/
public void setHighlighted(boolean selected) {
this.selected = selected;
}
/**
* Update marble visibility and highlighting
*/
public void update() {
marble.setEnabled(shouldShowMarble());
marble.setChecked(item.geo != null && item.geo.isEuclidianVisible());
setHighlighted(selected);
}
private boolean shouldShowMarble() {
return item.geo != null && item.geo.isEuclidianShowable()
&& (!item.getApplication().isExam()
|| item.getApplication().enableGraphing());
}
/**
* @param x
* pointer x-coord
* @param y
* pointer y-coord
* @return whether pointer is over this
*/
public boolean isHit(int x, int y) {
return x > getAbsoluteLeft()
&& x < getAbsoluteLeft() + getOffsetWidth()
&& y < getAbsoluteTop() + getOffsetHeight();
}
/**
* @param warning
* whether warning triangle should be visible
*/
public void updateIcons(boolean warning) {
ToggleButton btn = null;
String tooltip="";
boolean textInput = item.getController().isInputAsText();
noPlus = !item.getText().isEmpty();
String img = GuiResources.INSTANCE.icon_help().getSafeUri().asString();
if (item.app.has(Feature.AV_PLUS) && item.isInputTreeItem() ){
initPlus();
img = item.getText().isEmpty() ?
GuiResources.INSTANCE.algebra_new().getSafeUri().asString()
: AppResources.INSTANCE.empty().getSafeUri().asString();
btn = btnPlus;
if (warning) {
tooltip = "";
} else {
tooltip = noPlus ? " ": item.app.getLocalization().getMenu("AddItem");
}
} else {
initHelpToggle();
btn = btnHelpToggle;
tooltip = warning ? "": item.app.getLocalization().getMenu("InputHelp");
}
btn.setTitle(tooltip);
if (warning && !textInput) {
remove(marble);
add(btn);
addStyleName("error");
removeStyleName("help");
}
else if (item.getController().isEditing() || item.geo == null) {
remove(marble);
add(btn);
removeStyleName("error");
addStyleName("error");
} else {
add(marble);
marble.setEnabled(shouldShowMarble());
remove(btn);
removeStyleName("error");
}
if (!textInput) {
if (warning) {
NoDragImage warnIcon = new NoDragImage(
GuiResourcesSimple.INSTANCE.icon_dialog_warning().getSafeUri()
.asString());
btn.getUpFace().setImage(warnIcon);
btn.getUpHoveringFace().setImage(warnIcon);
btn.getDownFace().setImage(warnIcon);
btn.getDownHoveringFace().setImage(warnIcon);
} else {
NoDragImage ndi = new NoDragImage(img,24);
btn.getUpFace().setImage(ndi);
btn.getDownFace().setImage(ndi);
if (btn == btnPlus && !noPlus) {
NoDragImage hover = new NoDragImage(GuiResources.INSTANCE.algebra_new_hover().getSafeUri()
.asString(), 24);
btn.getUpHoveringFace().setImage(hover);
btn.getDownHoveringFace().setImage(hover);
} else {
btn.getUpHoveringFace().setImage(ndi);
btn.getDownHoveringFace().setImage(ndi);
}
}
}
}
private void initHelpToggle() {
if (btnHelpToggle == null) {
btnHelpToggle = new ToggleButton();
ClickStartHandler.init(btnHelpToggle,
new ClickStartHandler(true, true) {
@Override
public void onClickStart(int x, int y,
PointerEventType type) {
item.preventBlur();
item.requestFocus();
if (item.showCurrentError()) {
return;
}
// getBtnHelpToggle()
// .setDown(!getBtnHelpToggle().isDown());
if (getBtnHelpToggle().isDown()) {
item.app.hideKeyboard();
Scheduler.get().scheduleDeferred(
new Scheduler.ScheduledCommand() {
@Override
public void execute() {
item.setShowInputHelpPanel(
true);
((InputBarHelpPanelW) item.app
.getGuiManager()
.getInputHelpPanel())
.focusCommand(
item.getCommand());
}
});
} else {
item.setShowInputHelpPanel(false);
}
}
});
// when clicked, this steals focus
// => we need to push focus to parent item
btnHelpToggle.addFocusHandler(new FocusHandler() {
public void onFocus(FocusEvent event) {
item.setFocus(true, true);
event.preventDefault();
event.stopPropagation();
}
});
}
}
/**
* Crea te plus button if it doesn't exist, update the image
*/
public void initPlus() {
if (btnPlus == null) {
btnPlus = new ToggleButton();
btnPlus.setTitle(item.app.getLocalization().getMenu("AddItem"));
add(btnPlus);
btnPlus.addStyleName("avPlusButton");
ClickStartHandler.init(btnPlus, new ClickStartHandler() {
@Override
public void onClickStart(int x, int y, PointerEventType type) {
if (noPlus) {
return;
}
if (cmPlus == null) {
cmPlus = new ContextMenuPlus(item);
}
item.cancelEditing();
cmPlus.show(btnPlus.getAbsoluteLeft(),
btnPlus.getAbsoluteTop() - 8);
}
});
}
btnPlus.getUpFace().setImage(new NoDragImage(
GuiResources.INSTANCE.algebra_new().getSafeUri()
.asString(),
24));
NoDragImage hoverImg = new NoDragImage(
GuiResources.INSTANCE.algebra_new_hover().getSafeUri()
.asString(), 24);
btnPlus.getUpHoveringFace().setImage(hoverImg);
btnPlus.getDownHoveringFace().setImage(hoverImg);
}
/**
* @return help button
*/
public ToggleButton getBtnHelpToggle() {
return btnHelpToggle;
}
@Override
public void setLabels() {
if (cmPlus != null) {
cmPlus.setLabels();
}
}
public ToggleButton getBtnPlus() {
return btnPlus;
}
}