/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.text.style;

import android.text.TextPaint;

The classes that affect character-level text formatting extend this class. Most extend its subclass MetricAffectingSpan, but simple ones may just implement UpdateAppearance.
/** * The classes that affect character-level text formatting extend this * class. Most extend its subclass {@link MetricAffectingSpan}, but simple * ones may just implement {@link UpdateAppearance}. */
public abstract class CharacterStyle { public abstract void updateDrawState(TextPaint tp);
A given CharacterStyle can only applied to a single region of a given Spanned. If you need to attach the same CharacterStyle to multiple regions, you can use this method to wrap it with a new object that will have the same effect but be a distinct object so that it can also be attached without conflict.
/** * A given CharacterStyle can only applied to a single region of a given * Spanned. If you need to attach the same CharacterStyle to multiple * regions, you can use this method to wrap it with a new object that * will have the same effect but be a distinct object so that it can * also be attached without conflict. */
public static CharacterStyle wrap(CharacterStyle cs) { if (cs instanceof MetricAffectingSpan) { return new MetricAffectingSpan.Passthrough((MetricAffectingSpan) cs); } else { return new Passthrough(cs); } }
Returns "this" for most CharacterStyles, but for CharacterStyles that were generated by wrap, returns the underlying CharacterStyle.
/** * Returns "this" for most CharacterStyles, but for CharacterStyles * that were generated by {@link #wrap}, returns the underlying * CharacterStyle. */
public CharacterStyle getUnderlying() { return this; }
A Passthrough CharacterStyle is one that passes updateDrawState calls through to the specified CharacterStyle while still being a distinct object, and is therefore able to be attached to the same Spannable to which the specified CharacterStyle is already attached.
/** * A Passthrough CharacterStyle is one that * passes {@link #updateDrawState} calls through to the * specified CharacterStyle while still being a distinct object, * and is therefore able to be attached to the same Spannable * to which the specified CharacterStyle is already attached. */
private static class Passthrough extends CharacterStyle { private CharacterStyle mStyle;
Creates a new Passthrough of the specfied CharacterStyle.
/** * Creates a new Passthrough of the specfied CharacterStyle. */
public Passthrough(CharacterStyle cs) { mStyle = cs; }
Passes updateDrawState through to the underlying CharacterStyle.
/** * Passes updateDrawState through to the underlying CharacterStyle. */
@Override public void updateDrawState(TextPaint tp) { mStyle.updateDrawState(tp); }
Returns the CharacterStyle underlying this one, or the one underlying it if it too is a Passthrough.
/** * Returns the CharacterStyle underlying this one, or the one * underlying it if it too is a Passthrough. */
@Override public CharacterStyle getUnderlying() { return mStyle.getUnderlying(); } } }