Hi, I am starting to grok that swing stuff. :) I added TextAction implementations for selecting the current line (backward and forward), the whole text from the current position (backward & forward) and corrected the behavior of single character deletions when the text has a selection.
Or textfield and textareas now do what you would expect from them when pressing
shift-home, shift-end, shift-ctrl-home, shift-ctrl-end and del/backspace when
your text has a selection.
2006-02-07 Robert Schuster <[EMAIL PROTECTED]>
* javax/swing/text/DefaultEditorToolkit.java: Changed behavior
of actions "delete-next" and "delete-previous", added new TextAction
implementations for "selection-begin", "selection-begin-line",
"selection-end" and "selection-end-line".
Please comment.
cya
Robert
Index: javax/swing/text/DefaultEditorKit.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/text/DefaultEditorKit.java,v
retrieving revision 1.27
diff -u -r1.27 DefaultEditorKit.java
--- javax/swing/text/DefaultEditorKit.java 21 Dec 2005 21:59:30 -0000 1.27
+++ javax/swing/text/DefaultEditorKit.java 7 Feb 2006 15:04:10 -0000
@@ -756,11 +756,15 @@
{
try
{
- int pos = t.getCaret().getDot();
- if (pos < t.getDocument().getEndPosition().getOffset())
- {
- t.getDocument().remove(t.getCaret().getDot(), 1);
- }
+ int pos = t.getSelectionStart();
+ int len = t.getSelectionEnd() - pos;
+
+ if (len > 0)
+ t.getDocument().remove(pos, len);
+ else if (pos < t.getDocument().getLength())
+ t.getDocument().remove(pos, 1);
+
+ t.setCaretPosition(pos);
}
catch (BadLocationException e)
{
@@ -778,12 +782,16 @@
{
try
{
- int pos = t.getCaret().getDot();
- if (pos > t.getDocument().getStartPosition().getOffset())
+ int pos = t.getSelectionStart();
+ int len = t.getSelectionEnd() - pos;
+
+ if (len > 0)
{
- t.getDocument().remove(pos - 1, 1);
- t.getCaret().setDot(pos - 1);
+ t.getDocument().remove(pos, len);
+ t.setCaretPosition(pos);
}
+ else if (pos > 0)
+ t.getDocument().remove(pos - 1, 1);
}
catch (BadLocationException e)
{
@@ -840,6 +848,74 @@
}
}
},
+ new TextAction(selectionBeginLineAction)
+ {
+ public void actionPerformed(ActionEvent event)
+ {
+ JTextComponent t = getTextComponent(event);
+
+ try
+ {
+ // TODO: There is a more efficent solution, but
+ // viewToModel doesn't work properly.
+ Point p = t.modelToView(t.getCaret().getDot()).getLocation();
+
+ int cur = t.getCaretPosition();
+ int y = p.y;
+
+ while (y == p.y && cur > 0)
+ y = t.modelToView(--cur).getLocation().y;
+ if (cur != 0)
+ cur++;
+
+ t.getCaret().moveDot(cur);
+ }
+ catch (BadLocationException ble)
+ {
+ // Do nothing here.
+ }
+ }
+ },
+ new TextAction(selectionEndLineAction)
+ {
+ public void actionPerformed(ActionEvent event)
+ {
+ JTextComponent t = getTextComponent(event);
+ try
+ {
+ Point p = t.modelToView(t.getCaret().getDot()).getLocation();
+ int cur = t.getCaretPosition();
+ int y = p.y;
+ int length = t.getDocument().getLength();
+ while (y == p.y && cur < length)
+ y = t.modelToView(++cur).getLocation().y;
+ if (cur != length)
+ cur--;
+
+ t.moveCaretPosition(cur);
+ }
+ catch (BadLocationException ble)
+ {
+ // Nothing to do here
+ }
+ }
+ },
+ new TextAction(selectionEndAction)
+ {
+ public void actionPerformed(ActionEvent event)
+ {
+ JTextComponent t = getTextComponent(event);
+ t.moveCaretPosition(t.getDocument().getLength());
+ }
+ },
+ new TextAction(selectionBeginAction)
+ {
+ public void actionPerformed(ActionEvent event)
+ {
+ JTextComponent t = getTextComponent(event);
+ t.moveCaretPosition(0);
+ }
+ }
};
/**
signature.asc
Description: OpenPGP digital signature
