@Override public void keyTyped(final KeyEvent e) { if (!hist.active() || control(e) || DELNEXT.is(e) || DELPREV.is(e) || ESCAPE.is(e) || CUT2.is(e)) return; final int caret = editor.pos(); // remember if marked text is to be deleted final StringBuilder sb = new StringBuilder(1).append(e.getKeyChar()); final boolean indent = TAB.is(e) && editor.indent(sb, e.isShiftDown()); // delete marked text final boolean selected = editor.selected() && !indent; if (selected) editor.delete(); final int move = ENTER.is(e) ? editor.enter(sb) : editor.add(sb, selected); // refresh history and adjust cursor position hist.store(editor.text(), caret, editor.pos()); if (move != 0) editor.pos(Math.min(editor.size(), caret + move)); // adjust text height scrollCode.invokeLater(true); e.consume(); }
@Override public void keyTyped(final KeyEvent e) { if (undo == null || control(e) || DELNEXT.is(e) || DELPREV.is(e) || ESCAPE.is(e)) return; text.pos(text.cursor()); // string to be added String ch = String.valueOf(e.getKeyChar()); // remember if marked text is to be deleted boolean del = true; final byte[] txt = text.text(); if (TAB.is(e)) { if (text.marked()) { // check if lines are to be indented final int s = Math.min(text.pos(), text.start()); final int l = Math.max(text.pos(), text.start()) - 1; for (int p = s; p <= l && p < txt.length; p++) del &= txt[p] != '\n'; if (!del) { text.indent(s, l, e.isShiftDown()); ch = null; } } else { boolean c = true; for (int p = text.pos() - 1; p >= 0 && c; p--) { final byte b = txt[p]; c = ws(b); if (b == '\n') break; } if (c) ch = " "; } } // delete marked text if (text.marked() && del) text.delete(); if (ENTER.is(e)) { // adopt indentation from previous line final StringBuilder sb = new StringBuilder(1).append(e.getKeyChar()); int s = 0; for (int p = text.pos() - 1; p >= 0; p--) { final byte b = txt[p]; if (b == '\n') break; if (b == '\t') { s += 2; } else if (b == ' ') { s++; } else { s = 0; } } for (int p = 0; p < s; p++) sb.append(' '); ch = sb.toString(); } if (ch != null) text.add(ch); text.setCaret(); rend.calc(); showCursor(2); e.consume(); }
/** * Adds a character. * * @param e key event * @return true if input was modified */ boolean add(final KeyEvent e) { // backspace/delete... if (DELNEXT.is(e) || DELPREV.is(e)) return true; // skip other control chars final char ch = e.getKeyChar(); if (ch < ' ') return false; flashing = true; text = text.substring(0, pos) + ch + text.substring(pos); ++pos; return true; }
/** * Reacts on key codes. * * @param e key event */ void code(final KeyEvent e) { if (ENTER.is(e) || text == null) stop(); flashing = true; if (LINESTART.is(e)) { pos = 0; } else if (LINEEND.is(e)) { pos = text.length(); } else if (PREV.is(e)) { pos = Math.max(0, pos - 1); } else if (NEXT.is(e)) { pos = Math.min(text.length(), pos + 1); } else if (DELPREV.is(e)) { if (pos > 0) text = text.substring(0, pos - 1) + text.substring(pos--); } else if (DELNEXT.is(e)) { if (pos < text.length()) { text = text.substring(0, pos) + text.substring(pos + 1); } } }
@Override public void keyPressed(final KeyEvent e) { // ignore modifier keys if (specialKey(e) || modifier(e)) return; // re-animate cursor caret(true); // operations without cursor movement... final int fh = rend.fontHeight(); if (SCROLLDOWN.is(e)) { scroll.pos(scroll.pos() + fh); return; } if (SCROLLUP.is(e)) { scroll.pos(scroll.pos() - fh); return; } // set cursor position final boolean selected = editor.selected(); final int pos = editor.pos(); final boolean shift = e.isShiftDown(); boolean down = true, consumed = true; // move caret int lc = Integer.MIN_VALUE; final byte[] txt = editor.text(); if (NEXTWORD.is(e)) { editor.nextWord(shift); } else if (PREVWORD.is(e)) { editor.prevWord(shift); down = false; } else if (TEXTSTART.is(e)) { editor.textStart(shift); down = false; } else if (TEXTEND.is(e)) { editor.textEnd(shift); } else if (LINESTART.is(e)) { editor.lineStart(shift); down = false; } else if (LINEEND.is(e)) { editor.lineEnd(shift); } else if (PREVPAGE_RO.is(e) && !hist.active()) { lc = editor.linesUp(getHeight() / fh, false, lastCol); down = false; } else if (NEXTPAGE_RO.is(e) && !hist.active()) { lc = editor.linesDown(getHeight() / fh, false, lastCol); } else if (PREVPAGE.is(e) && !sc(e)) { lc = editor.linesUp(getHeight() / fh, shift, lastCol); down = false; } else if (NEXTPAGE.is(e) && !sc(e)) { lc = editor.linesDown(getHeight() / fh, shift, lastCol); } else if (NEXTLINE.is(e) && !MOVEDOWN.is(e)) { lc = editor.linesDown(1, shift, lastCol); } else if (PREVLINE.is(e) && !MOVEUP.is(e)) { lc = editor.linesUp(1, shift, lastCol); down = false; } else if (NEXTCHAR.is(e)) { editor.next(shift); } else if (PREVCHAR.is(e)) { editor.previous(shift); down = false; } else { consumed = false; } lastCol = lc == Integer.MIN_VALUE ? -1 : lc; // edit text if (hist.active()) { if (COMPLETE.is(e)) { complete(); return; } if (MOVEDOWN.is(e)) { editor.move(true); } else if (MOVEUP.is(e)) { editor.move(false); } else if (DELLINE.is(e)) { editor.deleteLine(); } else if (DELNEXTWORD.is(e)) { editor.deleteNext(true); } else if (DELLINEEND.is(e)) { editor.deleteNext(false); } else if (DELNEXT.is(e)) { editor.delete(); } else if (DELPREVWORD.is(e)) { editor.deletePrev(true); down = false; } else if (DELLINESTART.is(e)) { editor.deletePrev(false); down = false; } else if (DELPREV.is(e)) { editor.deletePrev(); down = false; } else { consumed = false; } } if (consumed) e.consume(); final byte[] tmp = editor.text(); if (txt != tmp) { // text has changed: add old text to history hist.store(tmp, pos, editor.pos()); scrollCode.invokeLater(down); } else if (pos != editor.pos() || selected != editor.selected()) { // cursor position or selection state has changed cursorCode.invokeLater(down ? 2 : 0); } }
@Override public void keyPressed(final KeyEvent e) { if (modifier(e)) return; // operations that change the focus are put first.. if (PREVTAB.is(e)) { transferFocusBackward(); return; } if (NEXTTAB.is(e)) { transferFocus(); return; } if (FIND.is(e)) { if (find != null) find.requestFocusInWindow(); return; } // re-animate cursor cursor(true); // operations without cursor movement... final int fh = rend.fontH(); if (SCROLLDOWN.is(e)) { scroll.pos(scroll.pos() + fh); return; } if (SCROLLUP.is(e)) { scroll.pos(scroll.pos() - fh); return; } if (COPY1.is(e) || COPY2.is(e)) { copy(); return; } // set cursor position and reset last column text.pos(text.cursor()); if (!PREVLINE.is(e) && !NEXTLINE.is(e)) lastCol = -1; if (FINDNEXT.is(e) || FINDNEXT2.is(e)) { scroll(rend.find(true, true)); return; } if (FINDPREV.is(e) || FINDPREV2.is(e)) { scroll(rend.find(false, true)); return; } if (SELECTALL.is(e)) { selectAll(); return; } // necessary on Macs as the shift button is pressed for REDO final boolean marking = e.isShiftDown() && !DELNEXT.is(e) && !DELPREV.is(e) && !PASTE2.is(e) && !COMMENT.is(e) && !DELLINE.is(e) && !REDOSTEP.is(e); final boolean nomark = !text.marked(); if (marking && nomark) text.startMark(); boolean down = true; boolean consumed = true; // operations that consider the last text mark.. final byte[] txt = text.text(); if (NEXTWORD.is(e)) { text.nextToken(marking); } else if (PREVWORD.is(e)) { text.prevToken(marking); down = false; } else if (TEXTSTART.is(e)) { if (!marking) text.noMark(); text.pos(0); down = false; } else if (TEXTEND.is(e)) { if (!marking) text.noMark(); text.pos(text.size()); } else if (LINESTART.is(e)) { text.bol(marking); down = false; } else if (LINEEND.is(e)) { text.eol(marking); } else if (NEXTPAGE.is(e)) { down(getHeight() / fh, marking); } else if (PREVPAGE.is(e)) { up(getHeight() / fh, marking); down = false; } else if (NEXT.is(e)) { text.next(marking); } else if (PREV.is(e)) { text.prev(marking); down = false; } else if (PREVLINE.is(e)) { up(1, marking); down = false; } else if (NEXTLINE.is(e)) { down(1, marking); } else if (FINDERROR.is(e)) { final int p = text.error(); if (p != -1) setCaret(p); } else { consumed = false; } if (marking) { // refresh scroll position text.endMark(); text.checkMark(); } else if (undo != null) { // edit operations... if (CUT1.is(e) || CUT2.is(e)) { cut(); } else if (PASTE1.is(e) || PASTE2.is(e)) { paste(); } else if (UNDOSTEP.is(e)) { undo(); } else if (REDOSTEP.is(e)) { redo(); } else if (COMMENT.is(e)) { text.comment(rend.getSyntax()); } else if (DELLINE.is(e)) { text.deleteLine(); } else if (DELLINEEND.is(e) || DELNEXTWORD.is(e) || DELNEXT.is(e)) { if (nomark) { if (text.pos() == text.size()) return; text.startMark(); if (DELNEXTWORD.is(e)) { text.nextToken(true); } else if (DELLINEEND.is(e)) { text.eol(true); } else { text.next(true); } text.endMark(); } undo.cursor(text.cursor()); text.delete(); } else if (DELLINESTART.is(e) || DELPREVWORD.is(e) || DELPREV.is(e)) { if (nomark) { if (text.pos() == 0) return; text.startMark(); if (DELPREVWORD.is(e)) { text.prevToken(true); } else if (DELLINESTART.is(e)) { text.bol(true); } else { text.prev(); } text.endMark(); } undo.cursor(text.cursor()); text.delete(); down = false; } else { consumed = false; } } if (consumed) e.consume(); text.setCaret(); if (txt != text.text()) rend.calc(); showCursor(down ? 2 : 0); }