1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InvalidObjectException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
22b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilsonimport java.lang.reflect.Field;
23b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilsonimport java.lang.reflect.Modifier;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Set;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Extends the
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link CharacterIterator} interface, adding support for iterating over
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * attributes and not only characters. An
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code AttributedCharacterIterator} also allows the user to find runs and
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * their limits. Runs are defined as ranges of characters that all have the same
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * attributes with the same values.
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic interface AttributedCharacterIterator extends CharacterIterator {
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Defines keys for text attributes.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class Attribute implements Serializable {
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final long serialVersionUID = -9142742483513960612L;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This attribute marks segments from an input method. Most input
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * methods create these segments for words.
479b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The value objects are of the type {@code Annotation} which contain
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@code null}.
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
5103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Attribute INPUT_METHOD_SEGMENT = new Attribute("input_method_segment");
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The attribute describing the language of a character. The value
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * objects are of type {@code Locale} or a subtype of it.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
5703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Attribute LANGUAGE = new Attribute("language");
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * For languages that have different reading directions of text (like
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Japanese), this attribute allows to define which reading should be
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * used. The value objects are of type {@code Annotation} which
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * contain a {@code String}.
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
6503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes        public static final Attribute READING = new Attribute("reading");
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private String name;
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The constructor for an {@code Attribute} with the name passed.
719b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param name
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the name of the new {@code Attribute}.
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Attribute(String name) {
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.name = name;
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Compares this attribute with the specified object. Checks if both
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * objects are the same instance. It is defined final so all subclasses
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * have the same behavior for this method.
839b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param object
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the object to compare against.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return {@code true} if the object passed is equal to this instance;
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         {@code false} otherwise.
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public final boolean equals(Object object) {
919b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson            return this == object;
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the name of this attribute.
969b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the name of this attribute.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected String getName() {
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return name;
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Calculates the hash code for objects of type {@code Attribute}. It
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * is defined final so all sub types calculate their hash code
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * identically.
1079b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the hash code for this instance of {@code Attribute}.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public final int hashCode() {
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.hashCode();
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Resolves a deserialized instance to the correct constant attribute.
1179b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the {@code Attribute} this instance represents.
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws InvalidObjectException
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if this instance is not of type {@code Attribute.class}
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             or if it is not a known {@code Attribute}.
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Object readResolve() throws InvalidObjectException {
124b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson            /*
125b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson             * This class is used like Java enums, where all instances are
126b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson             * defined as fields of their own class. To preserve identity
127b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson             * equality, resolve to the canonical instance when deserialized.
128b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson             */
129b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson            try {
130b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson                for (Field field : getClass().getFields()) {
131b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson                    if (field.getType() == getClass() && Modifier.isStatic(field.getModifiers())) {
132b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson                        Attribute candidate = (Attribute) field.get(null);
133b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson                        if (name.equals(candidate.name)) {
134b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson                            return candidate;
135b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson                        }
136b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson                    }
137b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson                }
138b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson            } catch (IllegalAccessException e) {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
140b10024c7cf6d4cfbcc6016aa9c0e102f59c15d36Jesse Wilson            throw new InvalidObjectException("Failed to resolve " + this);
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the name of the class followed by a "(", the name of the
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * attribute, and a ")".
1469b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson         *
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the string representing this instance.
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String toString() {
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getClass().getName() + '(' + getName() + ')';
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a set of attributes present in the {@code
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * AttributedCharacterIterator}. An empty set is returned if no attributes
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * were defined.
1599b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a set of attribute keys; may be empty.
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Set<Attribute> getAllAttributeKeys();
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value stored in the attribute for the current character. If
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the attribute was not defined then {@code null} is returned.
1679b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attribute the attribute for which the value should be returned.
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the requested attribute for the current character or
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code null} if it was not defined.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getAttribute(Attribute attribute);
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a map of all attributes of the current character. If no
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attributes were defined for the current character then an empty map is
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returned.
1789b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a map of all attributes for the current character or an empty
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         map.
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Map<Attribute, Object> getAttributes();
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the index of the last character in the run having the same
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attributes as the current character.
1879b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the index of the last character of the current run.
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getRunLimit();
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the index of the last character in the run that has the same
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attribute value for the given attribute as the current character.
1959b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attribute
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the attribute which the run is based on.
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the index of the last character of the current run.
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getRunLimit(Attribute attribute);
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the index of the last character in the run that has the same
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attribute values for the attributes in the set as the current character.
2059b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attributes
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the set of attributes which the run is based on.
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the index of the last character of the current run.
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getRunLimit(Set<? extends Attribute> attributes);
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the index of the first character in the run that has the same
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attributes as the current character.
2159b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the index of the last character of the current run.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getRunStart();
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the index of the first character in the run that has the same
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attribute value for the given attribute as the current character.
2239b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attribute
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the attribute which the run is based on.
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the index of the last character of the current run.
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getRunStart(Attribute attribute);
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the index of the first character in the run that has the same
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attribute values for the attributes in the set as the current character.
2339b354e75f2418e54638e02d153216660b67d01b8Jesse Wilson     *
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attributes
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the set of attributes which the run is based on.
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the index of the last character of the current run.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getRunStart(Set<? extends Attribute> attributes);
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
240