OSDN Git Service

resolved conflicts for merge of 115b9dc3 to master
authorGilles Debunne <debunne@google.com>
Mon, 4 Oct 2010 21:02:50 +0000 (14:02 -0700)
committerGilles Debunne <debunne@google.com>
Mon, 4 Oct 2010 21:02:50 +0000 (14:02 -0700)
Change-Id: I37ee3a50fcafbaa7de510b3af8e133a89bd9e339

1  2 
core/java/android/widget/TextView.java

@@@ -6658,15 -6601,14 +6657,17 @@@ public class TextView extends View impl
  
              hideInsertionPointCursorController();
              if (this instanceof ExtractEditText) {
 -                // terminateTextSelectionMode would remove selection, which we want to keep when
 +                // terminateTextSelectionMode removes selection, which we want to keep when
                  // ExtractEditText goes out of focus.
 -                mIsInTextSelectionMode = false;
 +                final int selStart = getSelectionStart();
 +                final int selEnd = getSelectionEnd();
 +                terminateSelectionActionMode();
 +                Selection.setSelection((Spannable) mText, selStart, selEnd);
              } else {
 -                terminateTextSelectionMode();
 +                terminateSelectionActionMode();
              }
+             mLastTouchOffset = -1;
          }
  
          startStopMarquee(focused);
          }
      }
  
 -    private void stopTextSelectionMode() {
 -        if (mIsInTextSelectionMode) {
 -            Selection.setSelection((Spannable) mText, getSelectionEnd());
 +    private void stopSelectionActionMode() {
 +        if (mSelectionActionMode != null) {
 +            mSelectionActionMode.finish();
 +        }
 +    }
 +
 +    private class SelectionActionModeCallback implements ActionMode.Callback {
 +
 +        @Override
 +        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
 +            if (mSelectionModifierCursorController == null) {
 +                Log.w(LOG_TAG, "TextView has no selection controller. Action mode cancelled.");
 +                return false;
 +            }
 +
 +            if (!requestFocus()) {
 +                return false;
 +            }
 +
 +            mode.setTitle(mContext.getString(com.android.internal.R.string.textSelectionCABTitle));
 +            mode.setSubtitle(null);
 +
 +            selectCurrentWord();
 +
 +            boolean atLeastOne = false;
 +
-             if (canSelectAll()) {
++            if (canSelectText()) {
 +                menu.add(0, ID_SELECT_ALL, 0, com.android.internal.R.string.selectAll).
 +                    setIcon(com.android.internal.R.drawable.ic_menu_select_all).
 +                    setAlphabeticShortcut('a');
 +                atLeastOne = true;
 +            }
 +
 +            if (canCut()) {
 +                menu.add(0, ID_CUT, 0, com.android.internal.R.string.cut).
 +                    setIcon(com.android.internal.R.drawable.ic_menu_cut).
 +                    setAlphabeticShortcut('x');
 +                atLeastOne = true;
 +            }
 +
 +            if (canCopy()) {
 +                menu.add(0, ID_COPY, 0, com.android.internal.R.string.copy).
 +                    setIcon(com.android.internal.R.drawable.ic_menu_copy).
 +                    setAlphabeticShortcut('c');
 +                atLeastOne = true;
 +            }
 +
 +            if (canPaste()) {
 +                menu.add(0, ID_PASTE, 0, com.android.internal.R.string.paste).
 +                        setIcon(com.android.internal.R.drawable.ic_menu_paste).
 +                        setAlphabeticShortcut('v');
 +                atLeastOne = true;
 +            }
 +
 +            if (atLeastOne) {
 +                mSelectionModifierCursorController.show();
 +                return true;
 +            } else {
 +                return false;
 +            }
 +        }
 +
 +        @Override
 +        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
 +            return true;
 +        }
 +
 +        @Override
 +        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
 +            final int itemId = item.getItemId();
 +
 +            if (itemId == ID_SELECT_ALL) {
 +                Selection.setSelection((Spannable) mText, 0, mText.length());
 +                // Update controller positions after selection change.
 +                if (mSelectionModifierCursorController != null) {
 +                    mSelectionModifierCursorController.show();
 +                }
 +                return true;
 +            }
 +
 +            ClipboardManager clipboard = (ClipboardManager) getContext().
 +                    getSystemService(Context.CLIPBOARD_SERVICE);
 +
 +            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:
 +                    ClipData clip = clipboard.getPrimaryClip();
 +                    if (clip != null) {
 +                        boolean didfirst = false;
 +                        for (int i=0; i<clip.getItemCount(); i++) {
 +                            CharSequence paste = clip.getItem(i).coerceToText(getContext());
 +                            if (paste != null) {
 +                                if (!didfirst) {
 +                                    Selection.setSelection((Spannable) mText, max);
 +                                    ((Editable) mText).replace(min, max, paste);
 +                                } else {
 +                                    ((Editable) mText).insert(getSelectionEnd(), "\n");
 +                                    ((Editable) mText).insert(getSelectionEnd(), paste);
 +                                }
 +                            }
 +                        }
 +                        stopSelectionActionMode();
 +                    }
 +
 +                    return true;
 +
 +                case ID_CUT:
 +                    clipboard.setPrimaryClip(ClipData.newPlainText(null, null,
 +                            mTransformed.subSequence(min, max)));
 +                    ((Editable) mText).delete(min, max);
 +                    stopSelectionActionMode();
 +                    return true;
 +
 +                case ID_COPY:
 +                    clipboard.setPrimaryClip(ClipData.newPlainText(null, null,
 +                            mTransformed.subSequence(min, max)));
 +                    stopSelectionActionMode();
 +                    return true;
 +            }
 +
 +            return false;
 +        }
 +
 +        @Override
 +        public void onDestroyActionMode(ActionMode mode) {
 +            Selection.setSelection((Spannable) mText, getSelectionStart());
              if (mSelectionModifierCursorController != null) {
                  mSelectionModifierCursorController.hide();
              }