diff options
| author | Jeff Brown <jeffbrown@google.com> | 2010-12-21 16:38:50 -0800 |
|---|---|---|
| committer | Jeff Brown <jeffbrown@google.com> | 2010-12-21 17:39:12 -0800 |
| commit | c1df907e3950fd8d2efac110edd72ea07b3b441e (patch) | |
| tree | c6bfa074155a655621c36147edc4b712f295b976 /core/java/android/widget/TextView.java | |
| parent | 68e8ed38feffb8608858a6bfc3a14d183bf5a166 (diff) | |
Support invoking key shortcuts using Control.
This enables Select All, Cut, Copy and Paste behavior in TextViews
and provides a general pattern for implementing additional keyboard
accelerators based on Control key shortcuts. The same shortcuts
also apply to menu accelerators.
Bug: 3286262
Change-Id: I7d458ee26abf51e0de1735ce490ce3baf504b471
Diffstat (limited to 'core/java/android/widget/TextView.java')
| -rw-r--r-- | core/java/android/widget/TextView.java | 125 |
1 files changed, 52 insertions, 73 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 0699ac289490..aa2e68f45045 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -7530,36 +7530,31 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override public boolean onKeyShortcut(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_A: - if (canSelectText()) { - return onTextContextMenuItem(ID_SELECT_ALL); - } - - break; - - case KeyEvent.KEYCODE_X: - if (canCut()) { - return onTextContextMenuItem(ID_CUT); - } - - break; - - case KeyEvent.KEYCODE_C: - if (canCopy()) { - return onTextContextMenuItem(ID_COPY); - } - - break; - - case KeyEvent.KEYCODE_V: - if (canPaste()) { - return onTextContextMenuItem(ID_PASTE); + final int filteredMetaState = event.getMetaState() & ~KeyEvent.META_CTRL_MASK; + if (KeyEvent.metaStateHasNoModifiers(filteredMetaState)) { + switch (keyCode) { + case KeyEvent.KEYCODE_A: + if (canSelectText()) { + return onTextContextMenuItem(ID_SELECT_ALL); + } + break; + case KeyEvent.KEYCODE_X: + if (canCut()) { + return onTextContextMenuItem(ID_CUT); + } + break; + case KeyEvent.KEYCODE_C: + if (canCopy()) { + return onTextContextMenuItem(ID_COPY); + } + break; + case KeyEvent.KEYCODE_V: + if (canPaste()) { + return onTextContextMenuItem(ID_PASTE); + } + break; } - - break; } - return super.onKeyShortcut(keyCode, event); } @@ -7889,7 +7884,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener /** * Called when a context menu option for the text view is selected. Currently - * this will be {@link android.R.id#copyUrl} or {@link android.R.id#selectTextMode}. + * this will be {@link android.R.id#copyUrl}, {@link android.R.id#selectTextMode}, + * {@link android.R.id#selectAll}, {@link android.R.id#paste}, {@link android.R.id#cut} + * or {@link android.R.id#copy}. */ public boolean onTextContextMenuItem(int id) { int min = 0; @@ -7934,8 +7931,32 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener startSelectionActionMode(); } return true; - } + case ID_SELECT_ALL: + selectAll(); + // Update controller positions after selection change. + if (hasSelectionController()) { + getSelectionController().show(); + } + return true; + + case ID_PASTE: + paste(min, max); + return true; + + case ID_CUT: + setPrimaryClip(ClipData.newPlainText(null, null, + mTransformed.subSequence(min, max))); + ((Editable) mText).delete(min, max); + stopSelectionActionMode(); + return true; + + case ID_COPY: + setPrimaryClip(ClipData.newPlainText(null, null, + mTransformed.subSequence(min, max))); + stopSelectionActionMode(); + return true; + } return false; } @@ -8292,49 +8313,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mCustomSelectionActionModeCallback.onActionItemClicked(mode, item)) { return true; } - - final int itemId = item.getItemId(); - - if (itemId == ID_SELECT_ALL) { - selectAll(); - // Update controller positions after selection change. - if (hasSelectionController()) { - getSelectionController().show(); - } - return true; - } - - int min = 0; - int max = mText.length(); - - if (isFocused()) { - final int selStart = getSelectionStart(); - final int selEnd = getSelectionEnd(); - - min = Math.max(0, Math.min(selStart, selEnd)); - max = Math.max(0, Math.max(selStart, selEnd)); - } - - switch (item.getItemId()) { - case ID_PASTE: - paste(min, max); - return true; - - case ID_CUT: - setPrimaryClip(ClipData.newPlainText(null, null, - mTransformed.subSequence(min, max))); - ((Editable) mText).delete(min, max); - stopSelectionActionMode(); - return true; - - case ID_COPY: - setPrimaryClip(ClipData.newPlainText(null, null, - mTransformed.subSequence(min, max))); - stopSelectionActionMode(); - return true; - } - - return false; + return onTextContextMenuItem(item.getItemId()); } @Override |
