ExtractEditText.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.inputmethodservice; 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedText; 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.EditText; 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specialization of {@link EditText} for showing and interacting with the 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extracted text in a full-screen input method. 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ExtractEditText extends EditText { 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private InputMethodService mIME; 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSettingExtractedText; 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExtractEditText(Context context) { 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, null); 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExtractEditText(Context context, AttributeSet attrs) { 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, com.android.internal.R.attr.editTextStyle); 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExtractEditText(Context context, AttributeSet attrs, int defStyle) { 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setIME(InputMethodService ime) { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIME = ime; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start making changes that will not be reported to the client. That 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is, {@link #onSelectionChanged(int, int)} will not result in sending 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new selection to the client 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startInternalChanges() { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingExtractedText += 1; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finish making changes that will not be reported to the client. That 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is, {@link #onSelectionChanged(int, int)} will not result in sending 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new selection to the client 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishInternalChanges() { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingExtractedText -= 1; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implement just to keep track of when we are setting text from the 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * client (vs. seeing changes in ourself from the user). 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public void setExtractedText(ExtractedText text) { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingExtractedText++; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setExtractedText(text); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingExtractedText--; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report to the underlying text editor about selection changes. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override protected void onSelectionChanged(int selStart, int selEnd) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSettingExtractedText == 0 && mIME != null && selStart >= 0 && selEnd >= 0) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIME.onExtractedSelectionChanged(selStart, selEnd); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Redirect clicks to the IME for handling there. First allows any 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on click handler to run, though. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean performClick() { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!super.performClick() && mIME != null) { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIME.onExtractedTextClicked(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean onTextContextMenuItem(int id) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIME != null) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIME.onExtractTextContextMenuItem(id)) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onTextContextMenuItem(id); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We are always considered to be an input method target. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isInputMethodTarget() { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the edit text is currently showing a scroll bar. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasVerticalScrollBar() { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeVerticalScrollRange() > computeVerticalScrollExtent(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pretend like the window this view is in always has focus, so its 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * highlight and cursor will be displayed. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean hasWindowFocus() { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.isEnabled() ? true : false; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pretend like this view always has focus, so its 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * highlight and cursor will be displayed. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean isFocused() { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.isEnabled() ? true : false; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pretend like this view always has focus, so its 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * highlight and cursor will be displayed. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean hasFocus() { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.isEnabled() ? true : false; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 131