package org.geogebra.desktop.cas.view; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import org.geogebra.common.cas.view.CASTableCellController; import org.geogebra.common.kernel.geos.GeoCasCell; import org.geogebra.desktop.main.AppD; /** * Controller for CAS cell * */ public class CASTableCellControllerD extends CASTableCellController implements KeyListener, MouseListener { private CASViewD view; private CASTableD table; private AppD app; private CASTableCellEditorD tableCellEditor; private boolean rightClick = false; /** * @param view * CAS view */ public CASTableCellControllerD(CASViewD view) { this.view = view; this.app = view.getApplication(); table = view.getConsoleTable(); tableCellEditor = table.getEditor(); } @Override public void keyPressed(KeyEvent e) { Object src = e.getSource(); boolean consumed = e.isConsumed(); if (src == tableCellEditor.getInputArea()) { consumed = handleKeyPressedInputTextField(e); } if (!consumed) { view.getApplication().getGlobalKeyDispatcher().handleGeneralKeys(e); } } private boolean handleKeyPressedInputTextField(final KeyEvent e) { if (e.isConsumed()) { return true; } boolean consumeEvent = false; boolean needUndo = false; int selectedRow = table.getSelectedRow(); int rowCount = table.getRowCount(); switch (e.getKeyCode()) { default: // do nothing break; case KeyEvent.VK_A: case KeyEvent.VK_C: case KeyEvent.VK_X: case KeyEvent.VK_V: // don't let ctrl-c pass through // consumeEvent is left false, so that the text is actually // copied/selected etc.. return true; case KeyEvent.VK_ENTER: handleEnterKey(AppD.isControlDown(e), AppD.isAltDown(e), app, true); consumeEvent = true; // needUndo remains false because handleEnterKey handles Undo! break; case KeyEvent.VK_UP: if (selectedRow >= 1) { table.startEditingRow(selectedRow - 1); } else if (view.isRowEmpty(0)) { // insert empty row at beginning table.insertRow(0, null, true); needUndo = true; } consumeEvent = true; break; case KeyEvent.VK_DOWN: if (selectedRow != rowCount - 1) { table.startEditingRow(selectedRow + 1); } else { // insert empty row at end view.insertRow(null, true); needUndo = true; } consumeEvent = true; break; } // consume keyboard event so the table // does not process it again if (consumeEvent) { e.consume(); } if (needUndo) { // store undo info view.getApp().storeUndoInfo(); } return consumeEvent; } /** * @return the rightClick */ public boolean isRightClick() { return rightClick; } /** * @param rightClick * the rightClick to set */ public void setRightClick(boolean rightClick) { this.rightClick = rightClick; } @Override public void mouseReleased(MouseEvent e) { setRightClick(AppD.isRightClickForceMetaDown(e)); if (isRightClick()) { RowContentPopupMenu popupMenu = new RowContentPopupMenu(app, (GeoCasCell) tableCellEditor.getCellEditorValue(), tableCellEditor, table, RowContentPopupMenu.Panel.INPUT); popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } @Override public void keyReleased(KeyEvent arg0) { // do nothing; we use keyPressed } @Override public void keyTyped(KeyEvent arg0) { // do nothing; we use keyPressed } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } }