package org.basex.gui.layout;
import static java.awt.event.KeyEvent.*;
import static org.basex.core.Prop.*;
import static org.basex.gui.GUIConstants.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
/**
* This class offers system-dependent key mappings.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
* @author Leo Woerteler
*/
public enum BaseXKeys {
// Cursor
/** Left. */ PREV(VK_LEFT),
/** Right. */ NEXT(VK_RIGHT),
/** Word left. */ PREVWORD(MAC ? ALT : SC, VK_LEFT),
/** Word right. */ NEXTWORD(MAC ? ALT : SC, VK_RIGHT),
/** Beginning of line. */ LINESTART(MAC ? SC : 0, MAC ? VK_LEFT : VK_HOME),
/** End of line. */ LINEEND(MAC ? SC : 0, MAC ? VK_RIGHT : VK_END),
/** Up. */ PREVLINE(VK_UP),
/** Down. */ NEXTLINE(VK_DOWN),
/** Page up. */ PREVPAGE(VK_PAGE_UP),
/** Page down. */ NEXTPAGE(VK_PAGE_DOWN),
/** Beginning of text. */ TEXTSTART(SC, MAC ? VK_UP : VK_HOME),
/** End of text. */ TEXTEND(SC, MAC ? VK_DOWN : VK_END),
/** Scroll up. */ SCROLLUP(MAC ? ALT : SC, VK_UP, true),
/** Scroll down. */ SCROLLDOWN(MAC ? ALT : SC, VK_DOWN, true),
// Find
/** Find search term. */ FIND(SC, VK_F, true),
/** Find next hit. */ FINDNEXT(SC, VK_G, true),
/** Find next hit. */ FINDNEXT2(MAC ? SC : 0, VK_F3, true),
/** Find previous hit. */ FINDPREV(SC | SHF, VK_G, true),
/** Find previous hit. */ FINDPREV2(MAC ? SC | SHF : SHF, VK_F3, true),
// Editing
/** Undo. */ UNDOSTEP(SC, VK_Z, true),
/** Redo. */ REDOSTEP(MAC ? SC | SHF : SC,
MAC ? VK_Z : VK_Y, true),
/** Cut. */ CUT1(SC, VK_X, true),
/** Cut. */ CUT2(SHF, VK_DELETE, true),
/** Copy. */ COPY1(SC, VK_C, true),
/** Copy. */ COPY2(SC, VK_INSERT, true),
/** Paste. */ PASTE1(SC, VK_V, true),
/** Paste. */ PASTE2(SHF, VK_INSERT, true),
/** Select all. */ SELECTALL(SC, VK_A, true),
/** Delete backwards. */ DELPREV(VK_BACK_SPACE),
/** Delete. */ DELNEXT(VK_DELETE),
/** Delete word backwards.
*/ DELPREVWORD(MAC ? ALT : SC, VK_BACK_SPACE, true),
/** Delete word. */ DELNEXTWORD(MAC ? ALT : SC, VK_DELETE, true),
/** Delete line to begin.
*/ DELLINESTART(SC | (MAC ? 0 : SHF),
VK_BACK_SPACE, true),
/** Delete line to end.
*/ DELLINEEND(SC | (MAC ? 0 : SHF), VK_DELETE, true),
/** (Un)comment. */ COMMENT(SC, VK_K, false),
/** Execute. */ EXEC(SC, VK_ENTER, true),
// Navigation
/** Jump to input bar. */ INPUT1(SC, VK_L, true),
/** Jump to input bar. */ INPUT2(MAC ? SC : 0, VK_F6, true),
/** Next panel. */ NEXTTAB(CTRL, VK_TAB, true),
/** Previous panel. */ PREVTAB(CTRL | SHF, VK_TAB, true),
/** Browse back. */ GOBACK(MAC ? SC : ALT, VK_LEFT, true),
/** Browse back. */ GOBACK2(VK_BACK_SPACE, true),
/** Browse forward. */ GOFORWARD(MAC ? SC : ALT, VK_RIGHT, true),
/** Browse up. */ GOUP(MAC ? SC : ALT, VK_UP, true),
/** Browse home. */ GOHOME(MAC ? SC : ALT, VK_HOME, true),
// Font
/** Increment size. */ INCFONT1(SC, VK_PLUS, true),
/** Increment size. */ INCFONT2(SC, VK_EQUALS, true),
/** Decrease size. */ DECFONT(SC, VK_MINUS, true),
/** Standard size. */ NORMFONT(SC, VK_0, true),
// General
/** Escape. */ ESCAPE(VK_ESCAPE),
/** Context menu. */ CONTEXT(VK_CONTEXT_MENU),
/** Space key. */ SPACE(VK_SPACE),
/** Tab key. */ TAB(VK_TAB),
/** Enter. */ ENTER(VK_ENTER);
/** Modifiers. */
private final int mod;
/** Key. */
private final int key;
/** Exclusive modifiers flag. */
private final boolean excl;
/**
* Constructor.
* @param m modifiers
* @param k key code
* @param ex modifiers exclusive
*/
BaseXKeys(final int m, final int k, final boolean ex) {
mod = m;
key = k;
excl = ex;
}
/**
* Constructor for non-exclusive modifiers.
* @param m modifiers
* @param k key code
*/
BaseXKeys(final int m, final int k) {
this(m, k, false);
}
/**
* Constructor for ignoring modifiers.
* @param k key code
* @param ig ignore modifiers
*/
BaseXKeys(final int k, final boolean ig) {
this(0, k, ig);
}
/**
* Constructor without modifiers.
* @param k key code
*/
BaseXKeys(final int k) {
this(0, k);
}
/**
* Returns true if the specified key combination was pressed.
* @param e key event
* @return result of check
*/
public boolean is(final KeyEvent e) {
final int c = e.getKeyCode();
int m = e.getModifiers();
if(!excl) m &= mod;
return m == mod && (c == 0 ? e.getKeyChar() : c) == key;
}
/**
* Returns true if the system's shortcut key was pressed.
* @param e input event
* @return result of check
*/
public static boolean sc(final InputEvent e) {
return (SC & e.getModifiers()) == SC;
}
/**
* Returns true if the pressed key includes a control key.
* @param e key event
* @return result of check
*/
public static boolean control(final KeyEvent e) {
// Mac offers special characters via ALT, Windows/Linux don't..
return e.isControlDown() || e.isMetaDown() || !MAC && e.isAltDown();
}
/**
* Returns true if the pressed key is a modifier key (including 'escape').
* @param e key event
* @return result of check
*/
public static boolean modifier(final KeyEvent e) {
final int c = e.getKeyCode();
return c == VK_ALT || c == VK_SHIFT || c == VK_META || c == VK_CONTROL ||
c == VK_ESCAPE || c == VK_CAPS_LOCK;
}
}