/** * Selects the text at the specified position. * * @param pos current text position * @param p mouse position * @param finish states if selection is in progress */ void select(final int pos, final Point p, final boolean finish) { if (!finish) text.noMark(); p.y -= 3; final Graphics g = getGraphics(); init(g, pos); if (p.y > y - fontH) { int s = text.pos(); while (true) { // end of line if (p.x > x && p.y < y - fontH) { text.pos(s); break; } // end of text - skip last characters if (!more(g)) { while (text.more()) text.next(); break; } // beginning of line if (p.x <= x && p.y < y) break; // middle of line if (p.x > x && p.x <= x + wordW && p.y > y - fontH && p.y <= y) { while (text.more()) { final int ww = charW(g, text.curr()); if (p.x < x + ww) break; x += ww; text.next(); } break; } s = text.pos(); next(); } if (!finish) text.startMark(); else text.endMark(); text.setCaret(); } repaint(); }
@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); }