package org.geogebra.web.web.gui.view.algebra;
import org.geogebra.common.euclidian.event.PointerEventType;
import org.geogebra.common.main.Feature;
import org.geogebra.common.util.debug.Log;
import org.geogebra.web.html5.gui.util.ClickStartHandler;
import org.geogebra.web.web.css.GuiResources;
import org.geogebra.web.web.css.MaterialDesignResources;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.ToggleButton;
/**
* Item action bar
*
*/
public class ItemControls extends FlowPanel {
/**
*
*/
final RadioTreeItem radioTreeItem;
/** Deletes the whole item */
protected PushButton btnDelete;
/** opens context menu */
protected ToggleButton btnMore;
/** animation controls */
protected AnimPanel animPanel = null;
private ContextMenuMore cmMore = null;
private boolean playOnly;
/**
* @param radioTreeItem
* parent item
*/
public ItemControls(RadioTreeItem radioTreeItem) {
this.radioTreeItem = radioTreeItem;
playOnly = radioTreeItem.app.has(Feature.AV_PLAY_ONLY);
addStyleName("AlgebraViewObjectStylebar");
addStyleName("smallStylebar");
buildGUI();
if (hasMoreMenu()) {
add(getMoreButton());
}
}
/**
* Gets (and creates if there is not yet) the delete button which geo
* item can be removed with from AV.
*
* @return The "X" button.
*/
public PushButton getDeleteButton() {
if (btnDelete == null) {
btnDelete = new PushButton(
new Image(GuiResources.INSTANCE.algebra_delete()));
btnDelete.getUpHoveringFace().setImage(new Image(
GuiResources.INSTANCE.algebra_delete_hover()));
btnDelete.addStyleName("XButton");
btnDelete.addStyleName("shown");
btnDelete.addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
if (event
.getNativeButton() == NativeEvent.BUTTON_RIGHT) {
return;
}
event.stopPropagation();
getController().removeGeo();
}
});
}
return btnDelete;
}
/**
*
* @return The more button which opens the context menu.
*/
public ToggleButton getMoreButton() {
if (btnMore == null) {
btnMore = new ToggleButton(
new Image(MaterialDesignResources.INSTANCE
.more_vert_black()));
btnMore.getUpHoveringFace().setImage(new Image(
MaterialDesignResources.INSTANCE.more_vert_purple()));
btnMore.addStyleName("XButton");
btnMore.addStyleName("shown");
ClickStartHandler.init(btnMore, new ClickStartHandler() {
@Override
public void onClickStart(int x, int y, PointerEventType type) {
showMoreContexMenu();
}
});
}
return btnMore;
}
/**
* Show the More context menu
*/
protected void showMoreContexMenu() {
if (cmMore == null) {
cmMore = new ContextMenuMore(radioTreeItem);
}
radioTreeItem.cancelEditing();
cmMore.show(btnMore.getAbsoluteLeft(), btnMore.getAbsoluteTop() - 8);
}
/**
* @param value
* whether to show animation panel
*/
public void showAnimPanel(boolean value) {
if (hasAnimPanel()) {
animPanel.setVisible(value);
}
}
private void buildGUI() {
radioTreeItem.setFirst(radioTreeItem.first);
clear();
buildAnimPanel();
if (!hasMoreMenu()) {
add(getDeleteButton());
}
}
private void buildAnimPanel() {
if (radioTreeItem.geo.isAnimatable()) {
if (animPanel == null) {
createAnimPanel();
}
add(animPanel);
reset();
updateAnimPanel();
showAnimPanel(true);
} else {
showAnimPanel(false);
}
}
private boolean hasMoreMenu() {
return radioTreeItem.app.has(Feature.AV_MORE_MENU);
}
/**
*
*/
protected void createAnimPanel() {
animPanel = radioTreeItem.geo.isAnimatable()
? new AnimPanel(radioTreeItem)
: null;
}
/**
* Update animation panel
*/
public void updateAnimPanel() {
if (hasAnimPanel()) {
animPanel.update();
}
}
/**
* @return animation panel
*/
public AnimPanel getAnimPanel() {
return animPanel;
}
/**
* @param showX
* whether to show x button
* @return whether this is shown (when single geo selected)
*/
public boolean update(boolean showX) {
radioTreeItem.setFirst(radioTreeItem.first);
if (radioTreeItem.geo == null) {
return false;
}
boolean ret = false;
if (getController().selectionCtrl.isSingleGeo()
|| getController().selectionCtrl.isEmpty()) {
radioTreeItem.setFirst(radioTreeItem.first);
clear();
if (radioTreeItem.geo.isAnimatable()) {
if (animPanel == null) {
createAnimPanel();
}
add(animPanel);
}
if (radioTreeItem.getPButton() != null) {
add(radioTreeItem.getPButton());
}
if (showX) {
add(hasMoreMenu() ? getMoreButton(): getDeleteButton());
}
setVisible(true);
if (!getController().isEditing()) {
radioTreeItem.maybeSetPButtonVisibility(false);
}
radioTreeItem.getAV().setActiveTreeItem(radioTreeItem);
ret = true;
} else {
radioTreeItem.getAV().removeCloseButton();
}
updateAnimPanel();
return ret;
}
/**
* Remove animation panel
*/
public void removeAnimPanel() {
if (hasAnimPanel()) {
remove(animPanel);
}
}
/**
* Reset animation panel
*/
public void reset() {
if (hasAnimPanel()) {
animPanel.reset();
}
}
/**
* @return whether animation panel exists
*/
public boolean hasAnimPanel() {
return animPanel != null;
}
@Override
public void setVisible(boolean b) {
if (getController().isEditing()) {
return;
}
super.setVisible(b);
}
/**
* Called when item selected, shows the x button in edit mode
*
* @param value
* whether this is the only selected item
*/
public void show(boolean value) {
if (radioTreeItem.app.has(Feature.AV_MORE_MENU)) {
super.setVisible(true);
return;
}
if (!radioTreeItem.app.has(Feature.AV_SINGLE_TAP_EDIT)) {
return;
}
boolean b = value || getController().isEditing();
if (value && isVisible()) {
return;
}
setVisible(b);
if (value) {
buildGUI();
Log.debug("Control repositionig. width: " + getOffsetWidth());
}
}
/**
* Update position
*/
public void reposition() {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
// ScrollPanel algebraPanel = ((AlgebraDockPanelW)
// radioTreeItem.app
// .getGuiManager().getLayout().getDockManager()
// .getPanel(App.VIEW_ALGEBRA)).getAbsolutePanel();
// int scrollPos = algebraPanel.getHorizontalScrollPosition();
// extra margin if vertical scrollbar is visible.
// int sw = Browser.isTabletBrowser() ? 0
// : RadioTreeItem.BROWSER_SCROLLBAR_WIDTH;
// int margin = radioTreeItem.getAV().getOffsetHeight()
// + getOffsetHeight() > algebraPanel.getOffsetHeight()
// ? sw : 0;
int right = 0;
int itemWidth = radioTreeItem.getOffsetWidth();
int avWidth = radioTreeItem.getAV().getOffsetWidth();
if (avWidth < itemWidth) {
right = itemWidth - avWidth;
}
getElement().getStyle().setRight(right, Unit.PX);
}
});
}
/**
* @return controller
*/
RadioTreeItemController getController() {
return this.radioTreeItem.getController();
}
}