diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-02-26 14:32:13 -0800 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2011-02-26 14:58:04 -0800 |
commit | d17247164b3c4e8a41cbe1dd283ef2442ad76229 (patch) | |
tree | 4ade0182d86267edd0a2b47867b396bacb25093e /core/java/android/text/method | |
parent | 8f34567c71003505456a9b1a0d461a4e62883d70 (diff) | |
download | frameworks_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.java | 67 |
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; } |