Code
class SelectWordCaret extends DefaultCaret {
private SelectingMode selectingMode = SelectingMode.CHAR;
private int p0; // = Math.min(getDot(), getMark());
private int p1; // = Math.max(getDot(), getMark());
@Override public void mousePressed(MouseEvent e) {
super.mousePressed(e);
int clickCount = e.getClickCount();
if (SwingUtilities.isLeftMouseButton(e) && !e.isConsumed()) {
if (clickCount == 2) {
selectingMode = SelectingMode.WORD;
p0 = Math.min(getDot(), getMark());
p1 = Math.max(getDot(), getMark());
} else if (clickCount >= 3) {
selectingMode = SelectingMode.ROW;
JTextComponent target = getComponent();
int offs = target.getCaretPosition();
try {
p0 = Utilities.getRowStart(target, offs);
p1 = Utilities.getRowEnd(target, offs);
setDot(p0);
moveDot(p1);
} catch (BadLocationException ex) {
UIManager.getLookAndFeel().provideErrorFeedback(target);
}
}
} else {
selectingMode = SelectingMode.CHAR;
}
}
@Override public void mouseDragged(MouseEvent e) {
if (!e.isConsumed() && SwingUtilities.isLeftMouseButton(e)) {
if (selectingMode == SelectingMode.WORD) {
continuouslySelectWords(e);
} else if (selectingMode == SelectingMode.ROW) {
continuouslySelectRows(e);
}
} else {
super.mouseDragged(e);
}
}
// If you continue to drag the mouse after selecting a word with double press:
private void continuouslySelectWords(MouseEvent e) {
Position.Bias[] biasRet = new Position.Bias[1];
JTextComponent c = getComponent();
int pos = getCaretPositionByLocation(c, e.getPoint(), biasRet);
try {
if (p0 < pos && pos < p1) {
setDot(p0);
moveDot(p1, biasRet[0]);
} else if (p1 < pos) {
setDot(p0);
moveDot(Utilities.getWordEnd(c, pos), biasRet[0]);
} else if (p0 > pos) {
setDot(p1);
moveDot(Utilities.getWordStart(c, pos), biasRet[0]);
}
} catch (BadLocationException ex) {
UIManager.getLookAndFeel().provideErrorFeedback(c);
}
}
// If you drag the mouse continuously after selecting the entire line in triple press:
private void continuouslySelectRows(MouseEvent e) {
Position.Bias[] biasRet = new Position.Bias[1];
JTextComponent c = getComponent();
int pos = getCaretPositionByLocation(c, e.getPoint(), biasRet);
try {
if (p0 < pos && pos < p1) {
setDot(p0);
moveDot(p1, biasRet[0]);
} else if (p1 < pos) {
setDot(p0);
moveDot(Utilities.getRowEnd(c, pos), biasRet[0]);
} else if (p0 > pos) {
setDot(p1);
moveDot(Utilities.getRowStart(c, pos), biasRet[0]);
}
} catch (BadLocationException ex) {
UIManager.getLookAndFeel().provideErrorFeedback(c);
}
}
// ...
}
References