summaryrefslogtreecommitdiffstats
path: root/core/java/android/text/method
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-02-26 14:32:13 -0800
committerJeff Brown <jeffbrown@google.com>2011-02-26 14:58:04 -0800
commitd17247164b3c4e8a41cbe1dd283ef2442ad76229 (patch)
tree4ade0182d86267edd0a2b47867b396bacb25093e /core/java/android/text/method
parent8f34567c71003505456a9b1a0d461a4e62883d70 (diff)
downloadframeworks_base-d17247164b3c4e8a41cbe1dd283ef2442ad76229.zip
frameworks_base-d17247164b3c4e8a41cbe1dd283ef2442ad76229.tar.gz
frameworks_base-d17247164b3c4e8a41cbe1dd283ef2442ad76229.tar.bz2
Make SHIFT+Backspace be forward delete.
Bug: 3416383 Change-Id: I8f20a6793abd15741aff222edcfe33f7019b9095
Diffstat (limited to 'core/java/android/text/method')
-rw-r--r--core/java/android/text/method/BaseKeyListener.java67
1 files changed, 23 insertions, 44 deletions
diff --git a/core/java/android/text/method/BaseKeyListener.java b/core/java/android/text/method/BaseKeyListener.java
index 191c250..7e29dc7 100644
--- a/core/java/android/text/method/BaseKeyListener.java
+++ b/core/java/android/text/method/BaseKeyListener.java
@@ -33,23 +33,6 @@ public abstract class BaseKeyListener extends MetaKeyKeyListener
implements KeyListener {
/* package */ static final Object OLD_SEL_START = new NoCopySpan.Concrete();
- private static final int MODIFIER_NONE = 0;
- private static final int MODIFIER_ALT = 1;
- private static final int MODIFIER_INVALID = 2;
-
- private static int getModifier(Editable content, KeyEvent event) {
- if (event.hasModifiers(KeyEvent.META_ALT_ON)) {
- return MODIFIER_ALT;
- }
- if (!event.hasNoModifiers()) {
- return MODIFIER_INVALID;
- }
- if (getMetaState(content, META_ALT_ON) == 1) {
- return MODIFIER_ALT;
- }
- return MODIFIER_NONE;
- }
-
/**
* Performs the action that happens when you press the {@link KeyEvent#KEYCODE_DEL} key in
* a {@link TextView}. If there is a selection, deletes the selection; otherwise,
@@ -59,27 +42,7 @@ public abstract class BaseKeyListener extends MetaKeyKeyListener
* @return true if anything was deleted; false otherwise.
*/
public boolean backspace(View view, Editable content, int keyCode, KeyEvent event) {
- int modifier = getModifier(content, event);
- if (modifier == MODIFIER_INVALID) {
- return false;
- }
-
- if (deleteSelection(view, content)) {
- return true;
- }
-
- if (modifier == MODIFIER_ALT && deleteLine(view, content)) {
- return true;
- }
-
- final int start = Selection.getSelectionEnd(content);
- final int end = TextUtils.getOffsetBefore(content, start);
- if (start != end) {
- content.delete(Math.min(start, end), Math.max(start, end));
- return true;
- }
-
- return false;
+ return backspaceOrForwardDelete(view, content, keyCode, event, false);
}
/**
@@ -91,26 +54,42 @@ public abstract class BaseKeyListener extends MetaKeyKeyListener
* @return true if anything was deleted; false otherwise.
*/
public boolean forwardDelete(View view, Editable content, int keyCode, KeyEvent event) {
- int modifier = getModifier(content, event);
- if (modifier == MODIFIER_INVALID) {
+ return backspaceOrForwardDelete(view, content, keyCode, event, true);
+ }
+
+ private boolean backspaceOrForwardDelete(View view, Editable content, int keyCode,
+ KeyEvent event, boolean isForwardDelete) {
+ // Ensure the key event does not have modifiers except ALT or SHIFT.
+ if (!KeyEvent.metaStateHasNoModifiers(event.getMetaState()
+ & ~(KeyEvent.META_SHIFT_MASK | KeyEvent.META_ALT_MASK))) {
return false;
}
+ // If there is a current selection, delete it.
if (deleteSelection(view, content)) {
return true;
}
- if (modifier == MODIFIER_ALT && deleteLine(view, content)) {
- return true;
+ // Alt+Backspace or Alt+ForwardDelete deletes the current line, if possible.
+ if (event.isAltPressed() || getMetaState(content, META_ALT_ON) == 1) {
+ if (deleteLine(view, content)) {
+ return true;
+ }
}
+ // Delete a character.
final int start = Selection.getSelectionEnd(content);
- final int end = TextUtils.getOffsetAfter(content, start);
+ final int end;
+ if (isForwardDelete || event.isShiftPressed()
+ || getMetaState(content, META_SHIFT_ON) == 1) {
+ end = TextUtils.getOffsetAfter(content, start);
+ } else {
+ end = TextUtils.getOffsetBefore(content, start);
+ }
if (start != end) {
content.delete(Math.min(start, end), Math.max(start, end));
return true;
}
-
return false;
}