package org.geogebra.web.web.cas.view; import org.geogebra.common.awt.GPoint; import org.geogebra.common.kernel.geos.GeoCasCell; import org.geogebra.common.util.debug.Log; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.web.gui.view.spreadsheet.CopyPasteCutW; import org.geogebra.web.web.html5.AttachedToDOM; import org.geogebra.web.web.javax.swing.GPopupMenuW; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.user.client.ui.MenuItem; /** * The one popup menu used in web CAS * */ public class RowHeaderPopupMenuW extends org.geogebra.common.cas.view.RowHeaderPopupMenu implements AttachedToDOM { private CASTableW table; private GPopupMenuW rowHeaderPopupMenu; /** * @param casTableW * table * @param appl * application */ public RowHeaderPopupMenuW( CASTableW casTableW, AppW appl) { super(appl); rowHeaderPopupMenu = new GPopupMenuW(appl); table = casTableW; initMenu(); } @SuppressWarnings("javadoc") enum CellAction { COPY_INPUT, PASTE, INSERT_ABOVE, INSERT_BELOW, DELETE, TEXT, COPY, COPY_LATEX } private void initMenu() { // "Insert Above" menuitem boolean canSystemCopy = CopyPasteCutW.checkClipboardSupported(); MenuItem miCopyInput = new MenuItem(loc.getMenu("CopyInput"), new ScheduledCommand() { @Override public void execute() { actionPerformed(CellAction.COPY_INPUT); } }); rowHeaderPopupMenu.addItem(miCopyInput); miCopyInput.addStyleName("mi_no_image"); MenuItem miPaste = new MenuItem(loc.getMenu("Paste"), new ScheduledCommand() { @Override public void execute() { actionPerformed(CellAction.PASTE); } }); rowHeaderPopupMenu.addItem(miPaste); rowHeaderPopupMenu.addSeparator(); miPaste.addStyleName("mi_no_image"); MenuItem miInsertAbove = new MenuItem(loc.getMenu("InsertAbove"), new ScheduledCommand() { @Override public void execute() { actionPerformed(CellAction.INSERT_ABOVE); } }); rowHeaderPopupMenu.addItem(miInsertAbove); miInsertAbove.addStyleName("mi_no_image"); // "Insert Below" menuitem MenuItem miInsertBelow = new MenuItem(loc.getMenu("InsertBelow"), new ScheduledCommand() { @Override public void execute() { actionPerformed(CellAction.INSERT_BELOW); } }); rowHeaderPopupMenu.addItem(miInsertBelow); miInsertBelow.addStyleName("mi_no_image"); int[] selRows = table.getSelectedRows(); String strRows = getDeleteString(selRows); MenuItem miDelete = new MenuItem(strRows, new ScheduledCommand() { @Override public void execute() { actionPerformed(CellAction.DELETE); } }); rowHeaderPopupMenu.addItem(miDelete); miDelete.addStyleName("mi_no_image"); rowHeaderPopupMenu.addSeparator(); MenuItem miUseAsText = new MenuItem(loc.getMenu("CasCellUseAsText"), new ScheduledCommand() { @Override public void execute() { actionPerformed(CellAction.TEXT); } }); rowHeaderPopupMenu.addItem(miUseAsText); miUseAsText.addStyleName("mi_no_image"); if (canSystemCopy) { MenuItem copyItem = new MenuItem(loc.getMenu("Copy"), new ScheduledCommand() { @Override public void execute() { actionPerformed(CellAction.COPY); } }); rowHeaderPopupMenu.addItem(copyItem); copyItem.addStyleName("mi_no_image"); MenuItem latexItem = new MenuItem(loc.getMenu("CopyAsLaTeX"), new ScheduledCommand() { @Override public void execute() { actionPerformed(CellAction.COPY_LATEX); } }); rowHeaderPopupMenu.addItem(latexItem); latexItem.addStyleName("mi_no_image"); } } /** * @param ac * action name */ void actionPerformed(CellAction ac) { int[] selRows = table.getSelectedRows(); if (selRows.length == 0) { return; } boolean undoNeeded = true; switch(ac){ case INSERT_ABOVE: GeoCasCell casCell = new GeoCasCell(app.getKernel() .getConstruction()); app.getKernel().getConstruction().setNotXmlLoading(true); table.insertRow(selRows[0], casCell, true); app.getKernel().getConstruction().setNotXmlLoading(false); undoNeeded = true; break; case INSERT_BELOW: casCell = new GeoCasCell(app.getKernel() .getConstruction()); app.getKernel().getConstruction().setNotXmlLoading(true); table.insertRow(selRows[selRows.length - 1] + 1, casCell, true); app.getKernel().getConstruction().setNotXmlLoading(false); undoNeeded = true; break; case DELETE: undoNeeded = table.getCASView().deleteCasCells(selRows); break; case TEXT: casCell = table.getGeoCasCell(selRows[0]); boolean useAsText = !casCell.isUseAsText(); casCell.setUseAsText(useAsText); for (int i = 1; i < selRows.length; i++) { int selRow = selRows[i]; casCell = table.getGeoCasCell(selRow); casCell.setUseAsText(useAsText); } undoNeeded = true; break; case COPY_LATEX: String toBeCopied = table.getCASView().getLaTeXfromCells(selRows); // it's possible that the last row is the input bar, // and if this is the case, the formula ends by: // \\ undefined \\ if (toBeCopied != null) { // App.debug("*" + toBeCopied + "*"); if (toBeCopied.endsWith("\\\\ undefined \\\\ ")) { toBeCopied = toBeCopied.substring(0, toBeCopied.length() - 14); } else if (toBeCopied.endsWith("\\\\ undefined \\\\")) { toBeCopied = toBeCopied.substring(0, toBeCopied.length() - 13); } app.copyTextToSystemClipboard(toBeCopied); } break; case COPY: toBeCopied = table.getCASView().getTextFromCells(selRows); // it's possible that the last row is the input bar, // and if this is the case, the formula ends by: // \\ undefined \\ if (toBeCopied != null) { app.copyTextToSystemClipboard(toBeCopied); } break; case COPY_INPUT: toBeCopied = table.getCASView().getCellInput(selRows[0]); // it's possible that the last row is the input bar, // and if this is the case, the formula ends by: // \\ undefined \\ if (toBeCopied != null) { app.copyTextToSystemClipboard(toBeCopied); } break; case PASTE: toBeCopied = CopyPasteCutW.getClipboardContents(null); // it's possible that the last row is the input bar, // and if this is the case, the formula ends by: // \\ undefined \\ Log.debug("Pasting" + toBeCopied); if (toBeCopied != null) { table.setCellInput(selRows[0], toBeCopied); } } if (undoNeeded) { // store undo info table.getApplication().storeUndoInfo(); } } @Override public void removeFromDOM() { rowHeaderPopupMenu.removeFromDOM(); } /** * show the popup * * @param gPoint * point where the popup should appear */ public void show(GPoint gPoint) { rowHeaderPopupMenu.show(gPoint); } }