ExtractEditText.java revision 459ac63adae54bafff2391f1f60c607f5deece4a
115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/* 215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project 315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License. 615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at 715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * http://www.apache.org/licenses/LICENSE-2.0 915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software 1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and 1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License. 1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */ 1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.inputmethodservice; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.ExtractedText; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.EditText; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*** 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specialization of {@link EditText} for showing and interacting with the 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extracted text in a full-screen input method. 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ExtractEditText extends EditText { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private InputMethodService mIME; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSettingExtractedText; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExtractEditText(Context context) { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, null); 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExtractEditText(Context context, AttributeSet attrs) { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, com.android.internal.R.attr.editTextStyle); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExtractEditText(Context context, AttributeSet attrs, int defStyle) { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setIME(InputMethodService ime) { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIME = ime; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start making changes that will not be reported to the client. That 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is, {@link #onSelectionChanged(int, int)} will not result in sending 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new selection to the client 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startInternalChanges() { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingExtractedText += 1; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finish making changes that will not be reported to the client. That 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is, {@link #onSelectionChanged(int, int)} will not result in sending 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the new selection to the client 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishInternalChanges() { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingExtractedText -= 1; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implement just to keep track of when we are setting text from the 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * client (vs. seeing changes in ourself from the user). 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public void setExtractedText(ExtractedText text) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingExtractedText++; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setExtractedText(text); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSettingExtractedText--; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report to the underlying text editor about selection changes. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override protected void onSelectionChanged(int selStart, int selEnd) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSettingExtractedText == 0 && mIME != null && selStart >= 0 && selEnd >= 0) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIME.onExtractedSelectionChanged(selStart, selEnd); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Redirect clicks to the IME for handling there. First allows any 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on click handler to run, though. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean performClick() { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!super.performClick() && mIME != null) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIME.onExtractedTextClicked(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean onTextContextMenuItem(int id) { 101459ac63adae54bafff2391f1f60c607f5deece4aGilles Debunne if (mIME != null && mIME.onExtractTextContextMenuItem(id)) { 102459ac63adae54bafff2391f1f60c607f5deece4aGilles Debunne return true; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onTextContextMenuItem(id); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We are always considered to be an input method target. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 110e67b58a347109b444070a34e86e81ce119f266b3Gilles Debunne @Override 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isInputMethodTarget() { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the edit text is currently showing a scroll bar. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasVerticalScrollBar() { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeVerticalScrollRange() > computeVerticalScrollExtent(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pretend like the window this view is in always has focus, so its 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * highlight and cursor will be displayed. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean hasWindowFocus() { 127e67b58a347109b444070a34e86e81ce119f266b3Gilles Debunne return this.isEnabled(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pretend like this view always has focus, so its 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * highlight and cursor will be displayed. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean isFocused() { 135e67b58a347109b444070a34e86e81ce119f266b3Gilles Debunne return this.isEnabled(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pretend like this view always has focus, so its 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * highlight and cursor will be displayed. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean hasFocus() { 143e67b58a347109b444070a34e86e81ce119f266b3Gilles Debunne return this.isEnabled(); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 146