package org.geogebra.web.web.cas.view; import org.geogebra.common.cas.view.CASInputHandler; import org.geogebra.common.cas.view.CASView; import org.geogebra.common.euclidian.event.PointerEventType; import org.geogebra.common.main.App; import org.geogebra.common.util.StringUtil; import org.geogebra.web.html5.awt.PrintableW; import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW; import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW.ToolTipLinkType; import org.geogebra.web.html5.gui.util.ClickStartHandler; import org.geogebra.web.html5.gui.util.MathKeyboardListener; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.web.gui.GuiManagerW; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.TouchEndEvent; import com.google.gwt.event.dom.client.TouchMoveEvent; import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; /** * Web implementation of the CAS view * */ public class CASViewW extends CASView implements PrintableW { private CASComponentW component; private AppW app; private CASTableW consoleTable; private CASStylebarW styleBar; private CASSubDialogW subDialog; /** * @param app * application */ public CASViewW(final AppW app) { super(app.getKernel()); component = new CASComponentW(); this.app = app; // CAS input/output cells CASTableControllerW ml = new CASTableControllerW(this, app); consoleTable = new CASTableW(app, ml, this); component.add(consoleTable); // SelectionHandler.disableTextSelectInternal(component.getElement(), // true); // input handler setCasInputHandler(new CASInputHandler(this)); component.addDomHandler(ml, MouseDownEvent.getType()); component.addDomHandler(ml, MouseUpEvent.getType()); component.addDomHandler(ml, MouseMoveEvent.getType()); component.addDomHandler(ml, TouchStartEvent.getType()); component.addDomHandler(ml, TouchMoveEvent.getType()); component.addDomHandler(ml, TouchEndEvent.getType()); app.invokeLater(new Runnable() { @Override public void run() { getCAS().initCurrentCAS(); GuiManagerW gm = (GuiManagerW) app.getGuiManager(); if (gm != null) { gm.reInitHelpPanel(true); } } }); // prevent default: no blur ClickStartHandler.init(component, new ClickStartHandler(true, false) { @Override public void onClickStart(int x, int y, PointerEventType type) { if (!StringUtil .empty(((CASEditorW) getConsoleTable().getEditor()) .getText())) { ((CASEditorW) getConsoleTable().getEditor()).onEnter(true); } } }); } @Override public void clearView() { super.clearView(); } @Override public void repaintView() { // TODO Auto-generated method stub } @Override public boolean hasFocus() { // TODO Auto-generated method stub return false; } @Override public boolean isShowing() { // TODO Auto-generated method stub return false; } @Override public CASTableW getConsoleTable() { return consoleTable; } @Override public AppW getApp() { return app; } @Override public void showSubstituteDialog(String prefix, String evalText, String postfix, int selRow) { if (subDialog != null && subDialog.getDialog().isShowing()) { return; } CASSubDialogW d = new CASSubDialogW(this, prefix, evalText, postfix, selRow); d.getDialog().center(); d.getDialog().show(); subDialog = d; } /** * @return widget */ public CASComponentW getComponent() { return component; } /** * @return style bar */ public CASStylebarW getCASStyleBar() { if (styleBar == null) { styleBar = newCASStyleBar(); } return styleBar; } private CASStylebarW newCASStyleBar() { return new CASStylebarW(this, app); } @Override public boolean suggestRepaint() { // not used for this view return false; } @Override public void setLabels() { super.setLabels(); if (this.styleBar != null) { this.styleBar.setLabels(); } } /** * @return CAS input editor */ public MathKeyboardListener getEditor() { return (MathKeyboardListener) consoleTable.getEditor(); } /** * @param force * make keyboard immediately visible */ public void maybeOpenKeyboard(final boolean force) { if (app.isStartedWithFile() || app.showView(App.VIEW_ALGEBRA)) { return; } final AppW app1 = app; app.invokeLater(new Runnable() { @Override public void run() { app1.showKeyboard(getEditor(), force); getEditor().setFocus(true, true); getConsoleTable().startEditingRow( getConsoleTable().getRowCount() - 1); } }); /* * getEditor().ensureEditing(); getEditor().setFocus(true); */ } /** * Update inputs and outputs on zoom * * @param ratio * CSS pixel ratio */ public void setPixelRatio(double ratio) { if (this.consoleTable != null) { for (int row = 0; row < this.getRowCount(); row++) { if (consoleTable.getWidget(row, CASTableW.COL_CAS_CELLS_WEB) instanceof CASTableCellW) { ((CASTableCellW) consoleTable.getWidget(row, CASTableW.COL_CAS_CELLS_WEB)).setPixelRatio(ratio); } } } } @Override protected void showTooltip(int mode) { if (getApp().showToolBarHelp()) { ToolTipManagerW.sharedInstance().showBottomInfoToolTip( app.getToolTooltipHTML(mode), app.getGuiManager().getTooltipURL(mode), ToolTipLinkType.Help, app, app.getAppletFrame().isKeyboardShowing()); } } @Override public void getPrintable(FlowPanel pPanel, Button btPrint) { // Widget[] printableList = {}; // printableList[0] = new Label("CAS View"); } @Override public void attachView() { super.attachView(); maybeOpenKeyboard(false); } public void resetItems(boolean unselectAll) { this.getConsoleTable().getEditor().onEnter(false); } }