package org.freeplane.view.swing.ui; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JPopupMenu; import org.freeplane.core.resources.ResourceController; import org.freeplane.core.ui.ControllerPopupMenuListener; import org.freeplane.core.ui.IEditHandler; import org.freeplane.core.ui.IEditHandler.FirstAction; import org.freeplane.features.map.NodeModel; import org.freeplane.features.mode.Controller; import org.freeplane.features.mode.ModeController; import org.freeplane.view.swing.map.MainView; import org.freeplane.view.swing.map.MapView; import org.freeplane.view.swing.map.NodeView; /** * The KeyListener which belongs to the node and cares for Events like C-D * (Delete Node). It forwards the requests to NodeController. */ public class DefaultNodeKeyListener implements KeyListener { final private IEditHandler editHandler; public DefaultNodeKeyListener(final IEditHandler editHandler) { this.editHandler = editHandler; } public void keyPressed(final KeyEvent e) { final boolean checkForScrollMap = e.isShiftDown() && e.isControlDown()&& e.isAltDown(); final MapView mapView = (MapView) Controller.getCurrentController().getViewController().getMapView(); if(checkForScrollMap){ switch (e.getKeyCode()) { case KeyEvent.VK_UP: mapView.scrollBy(0, -10); e.consume(); return; case KeyEvent.VK_DOWN: mapView.scrollBy(0, 10); e.consume(); return; case KeyEvent.VK_LEFT: mapView.scrollBy(-10, 0); e.consume(); return; case KeyEvent.VK_RIGHT: mapView.scrollBy(10, 0); e.consume(); } return; } if ((e.isAltDown() || e.isControlDown() || e.isMetaDown())) { return; } switch (e.getKeyCode()) { case KeyEvent.VK_ENTER: case KeyEvent.VK_ESCAPE: case KeyEvent.VK_SHIFT: case KeyEvent.VK_DELETE: case KeyEvent.VK_SPACE: case KeyEvent.VK_INSERT: case KeyEvent.VK_TAB: return; } final boolean continious = e.isShiftDown(); switch (e.getKeyCode()) { case KeyEvent.VK_UP: if (mapView.selectUp(continious)) e.consume(); return; case KeyEvent.VK_DOWN: if (mapView.selectDown(continious)) e.consume(); return; case KeyEvent.VK_LEFT: if (mapView.selectLeft(continious)) e.consume(); return; case KeyEvent.VK_RIGHT: if (mapView.selectRight(continious)) e.consume(); return; case KeyEvent.VK_PAGE_UP: if (mapView.selectPageUp(continious)) e.consume(); return; case KeyEvent.VK_PAGE_DOWN: if (mapView.selectPageDown(continious)) e.consume(); return; case KeyEvent.VK_HOME: case KeyEvent.VK_END: case KeyEvent.VK_BACK_SPACE: if (editHandler != null) { editHandler.edit(e, FirstAction.EDIT_CURRENT, false); } return; case KeyEvent.VK_CONTEXT_MENU: final ModeController modeController = Controller.getCurrentModeController(); final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode(); final NodeView nodeView = mapView.getNodeView(node); final JPopupMenu popupmenu = modeController.getUserInputListenerFactory().getNodePopupMenu(); if (popupmenu != null) { popupmenu.addHierarchyListener(new ControllerPopupMenuListener()); final MainView mainView = nodeView.getMainView(); popupmenu.show(mainView, mainView.getX(), mainView.getY()); } } } public void keyReleased(final KeyEvent e) { } public void keyTyped(final KeyEvent e) { if ((e.isAltDown() || e.isControlDown() || e.isMetaDown())) { return; } final String keyTypeActionString = ResourceController.getResourceController().getProperty("key_type_action", FirstAction.EDIT_CURRENT.toString()); final FirstAction keyTypeAction = FirstAction.valueOf(keyTypeActionString); if (!FirstAction.IGNORE.equals(keyTypeAction)) { if (! isActionEvent(e)) { if (editHandler != null) { editHandler.edit(e, keyTypeAction, false); } return; } } } private boolean isActionEvent(final KeyEvent e) { return e.isActionKey() || isControlCharacter(e.getKeyChar()); } private boolean isControlCharacter(char keyChar) { return keyChar == KeyEvent.CHAR_UNDEFINED || keyChar <= KeyEvent.VK_SPACE|| keyChar == KeyEvent.VK_DELETE; } }