19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.text.style;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextPaint;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The classes that affect character-level text formatting extend this
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class.  Most extend its subclass {@link MetricAffectingSpan}, but simple
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ones may just implement {@link UpdateAppearance}.
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class CharacterStyle {
278a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock    public abstract void updateDrawState(TextPaint tp);
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A given CharacterStyle can only applied to a single region of a given
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Spanned.  If you need to attach the same CharacterStyle to multiple
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * regions, you can use this method to wrap it with a new object that
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will have the same effect but be a distinct object so that it can
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * also be attached without conflict.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static CharacterStyle wrap(CharacterStyle cs) {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cs instanceof MetricAffectingSpan) {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new MetricAffectingSpan.Passthrough((MetricAffectingSpan) cs);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Passthrough(cs);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns "this" for most CharacterStyles, but for CharacterStyles
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that were generated by {@link #wrap}, returns the underlying
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * CharacterStyle.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharacterStyle getUnderlying() {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A Passthrough CharacterStyle is one that
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * passes {@link #updateDrawState} calls through to the
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified CharacterStyle while still being a distinct object,
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and is therefore able to be attached to the same Spannable
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to which the specified CharacterStyle is already attached.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class Passthrough extends CharacterStyle {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private CharacterStyle mStyle;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Creates a new Passthrough of the specfied CharacterStyle.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Passthrough(CharacterStyle cs) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStyle = cs;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Passes updateDrawState through to the underlying CharacterStyle.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void updateDrawState(TextPaint tp) {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStyle.updateDrawState(tp);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the CharacterStyle underlying this one, or the one
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * underlying it if it too is a Passthrough.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharacterStyle getUnderlying() {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mStyle.getUnderlying();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
88