package org.geogebra.web.web.gui.layout.panels;
import org.geogebra.common.main.App;
import org.geogebra.common.main.Feature;
import org.geogebra.common.main.App.InputPosition;
import org.geogebra.web.html5.gui.util.MathKeyboardListener;
import org.geogebra.web.web.gui.layout.DockPanelW;
import org.geogebra.web.web.gui.layout.DockSplitPaneW;
import org.geogebra.web.web.gui.view.algebra.AlgebraViewW;
import org.geogebra.web.web.gui.view.algebra.LatexTreeItem;
import org.geogebra.web.web.gui.view.algebra.LatexTreeItemController;
import org.geogebra.web.web.gui.view.algebra.RadioTreeItem;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.resources.client.ResourcePrototype;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class AlgebraDockPanelW extends DockPanelW {
ScrollPanel algebrap;
SimplePanel simplep;
AlgebraViewW aview = null;
private int savedScrollPosition;
public AlgebraDockPanelW(App app1) {
super(
App.VIEW_ALGEBRA, // view id
"AlgebraWindow", // view title phrase
null, // toolbar string
true, // style bar?
2, // menu order
'A' // menu shortcut
);
if (app1.has(Feature.DYNAMIC_STYLEBAR)) {
setViewImage(getResources().settings());
} else {
setViewImage(getResources().styleBar_algebraView());
}
}
@Override
protected Widget loadComponent() {
if (algebrap == null) {
algebrap = new ScrollPanel();//temporarily
algebrap.setSize("100%", "100%");
algebrap.setAlwaysShowScrollBars(false);
}
if (app != null) {
// force loading the algebra view,
// as loadComponent should only load when needed
setAlgebraView((AlgebraViewW) app.getAlgebraView());
aview.setInputPanel();
}
return algebrap;
}
@Override
protected Widget loadStyleBar() {
return aview.getStyleBar(true);
}
public void setAlgebraView(final AlgebraViewW av) {
if (av != aview) {
if (aview != null && simplep != null) {
simplep.remove(aview);
algebrap.remove(simplep);
}
simplep = new SimplePanel(aview = av);
algebrap.add(simplep);
simplep.addStyleName("algebraSimpleP");
algebrap.addStyleName("algebraPanel");
algebrap.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int bt = simplep.getAbsoluteTop()
+ simplep.getOffsetHeight();
if (event.getClientY() > bt) {
app.getSelectionManager().clearSelectedGeos();
av.resetItems(true);
}
}
}, ClickEvent.getType());
}
}
public ScrollPanel getAbsolutePanel() {
return algebrap;
}
@Override
public void onResize() {
DockSplitPaneW split = getParentSplitPane();
if (split != null && split.isForcedLayout()) {
if (aview != null) {
int w = getOffsetWidth();
aview.setUserWidth(w);
}
}
if (aview != null) {
aview.resize();
}
}
@Override
public ResourcePrototype getIcon() {
return getResources().menu_icon_algebra();
}
/**
* scrolls to a specific position of the panel
*
* @param position
* to scroll to.
*/
public void scrollTo(int position) {
if (this.algebrap != null) {
this.algebrap.setVerticalScrollPosition(position);
}
}
/**
* scrolls to the bottom of the panel
*/
public void scrollToBottom(){
if (this.algebrap != null) {
this.algebrap.scrollToBottom();
}
}
@Override
public MathKeyboardListener getKeyboardListener() {
if (app.getInputPosition() != InputPosition.algebraView) {
return null;
}
return ((AlgebraViewW) app.getAlgebraView()).getActiveTreeItem();
}
public MathKeyboardListener updateKeyboardListener(MathKeyboardListener ml) {
if (aview.getInputTreeItem() != ml) {
return ml;
}
// if no retex editor yet
if (!(ml instanceof LatexTreeItem)) {
return ml;
}
LatexTreeItemController itemController = ((LatexTreeItem) ml).getLatexController();
itemController.initAndShowKeyboard(false);
return itemController.getRetexListener();
}
/**
* Scroll to the item that is selected.
*/
public void scrollToActiveItem() {
final RadioTreeItem item = aview == null ? null
: aview.getActiveTreeItem();
if (item == null) {
return;
}
if (item.isInputTreeItem()) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
algebrap.scrollToBottom();
}
});
return;
}
doScrollToActiveItem();
}
/**
* Saves the current scroll position of the dock panel.
*/
public void saveScrollPosition() {
savedScrollPosition = algebrap.getVerticalScrollPosition();
}
private void doScrollToActiveItem() {
final RadioTreeItem item = aview.getActiveTreeItem();
int spH = algebrap.getOffsetHeight();
int top = item.getElement().getOffsetTop();
int relTop = top - savedScrollPosition;
if (spH < relTop + item.getOffsetHeight()) {
int pos = top + item.getOffsetHeight() - spH;
algebrap.setVerticalScrollPosition(pos);
} else {
// algebrap.setVerticalScrollPosition(savedScrollPosition);
}
}
}