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