summaryrefslogtreecommitdiff
path: root/core/java/android/widget/TextView.java
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2010-12-21 16:38:50 -0800
committerJeff Brown <jeffbrown@google.com>2010-12-21 17:39:12 -0800
commitc1df907e3950fd8d2efac110edd72ea07b3b441e (patch)
treec6bfa074155a655621c36147edc4b712f295b976 /core/java/android/widget/TextView.java
parent68e8ed38feffb8608858a6bfc3a14d183bf5a166 (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.java125
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