@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 final void mousePressed(final MouseEvent e) { if (!isEnabled() || !isFocusable()) return; requestFocusInWindow(); caret(true); if (SwingUtilities.isMiddleMouseButton(e)) copy(); final boolean shift = e.isShiftDown(); final boolean selected = editor.selected(); if (SwingUtilities.isLeftMouseButton(e)) { final int c = e.getClickCount(); if (c == 1) { // selection mode if (shift) editor.startSelection(true); select(e.getPoint(), !shift); } else if (c == 2) { editor.selectWord(); } else { editor.selectLine(); } } else if (!selected) { select(e.getPoint(), true); } }
@Override public void mouseReleased(final MouseEvent e) { if (linkListener == null) return; if (SwingUtilities.isLeftMouseButton(e)) { editor.endSelection(); // evaluate link if (!editor.selected()) { final TextIterator iter = rend.jump(e.getPoint()); final String link = iter.link(); if (link != null) linkListener.linkClicked(link); } } }
/** * Replaces the text. * * @param rc replace context */ final void replace(final ReplaceContext rc) { try { final int[] select = rend.replace(rc); if (rc.text != null) { final boolean sel = editor.selected(); setText(rc.text); editor.select(select[0], select[sel ? 1 : 0]); release(Action.CHECK); } gui.status.setText(Text.STRINGS_REPLACED); } catch (final Exception ex) { final String msg = Util.message(ex).replaceAll(Prop.NL + ".*", ""); gui.status.setError(Text.REGULAR_EXPR + Text.COLS + msg); } }
/** * Pastes a string. * * @param string string to be pasted */ public final void paste(final String string) { final int pos = editor.pos(); if (editor.selected()) editor.delete(); editor.add(string); finish(pos); }
@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); } }
/** * Tests if text has been selected. * * @return result of check */ public final boolean selected() { return editor.selected(); }