2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / libjava / java / text / AttributedStringIterator.java
blobd3193382bfdea77a1661251884e3898d735481c1
1 /* AttributedStringIterator.java -- Class to iterate over AttributedString
2 Copyright (C) 1998, 1999 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA.
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package java.text;
41 import java.util.Set;
42 import java.util.HashSet;
43 import java.util.Map;
44 import java.util.HashMap;
45 import java.util.Iterator;
47 /**
48 * This class implements the AttributedCharacterIterator interface. It
49 * is used by AttributedString.getIterator().
51 * @version 0.0
53 * @author Aaron M. Renn (arenn@urbanophile.com)
55 class AttributedStringIterator implements AttributedCharacterIterator
58 /*************************************************************************/
60 /**
61 * Instance Variables
64 /**
65 * The character iterator containing the text
67 private CharacterIterator ci;
69 /**
70 * The list of attributes and ranges
72 private AttributedString.AttributeRange[] attribs;
74 /**
75 * The list of attributes that the user is interested in. We may,
76 * at our option, not return any other attributes.
78 private AttributedCharacterIterator.Attribute[] restricts;
80 /*************************************************************************/
83 * Constructors
86 AttributedStringIterator(StringCharacterIterator sci,
87 AttributedString.AttributeRange[] attribs,
88 int begin_index, int end_index,
89 AttributedCharacterIterator.Attribute[] restricts)
91 this.ci = new StringCharacterIterator(sci, begin_index, end_index);
92 this.attribs = attribs;
93 this.restricts = restricts;
96 /*************************************************************************/
99 * Instance Methods
102 // First we have a bunch of stupid redirects. If StringCharacterIterator
103 // weren't final, I just would have extended that for this class. Alas, no.
105 public Object
106 clone()
108 return(ci.clone());
111 public char
112 current()
114 return(ci.current());
117 public char
118 next()
120 return(ci.next());
123 public char
124 previous()
126 return(ci.previous());
129 public char
130 first()
132 return(ci.first());
135 public char
136 last()
138 return(ci.last());
141 public int
142 getIndex()
144 return(ci.getIndex());
147 public char
148 setIndex(int index)
150 return(ci.setIndex(index));
153 public int
154 getBeginIndex()
156 return(ci.getBeginIndex());
159 public int
160 getEndIndex()
162 return(ci.getEndIndex());
166 * Here is where the AttributedCharacterIterator methods start.
169 /*************************************************************************/
172 * Returns a list of all the attribute keys that are defined anywhere
173 * on this string.
175 public Set
176 getAllAttributeKeys()
178 HashSet s = new HashSet();
179 if (attribs == null)
180 return(s);
182 for (int i = 0; i < attribs.length; i++)
184 Set key_set = attribs[i].attribs.keySet();
185 Iterator iter = key_set.iterator();
186 while (iter.hasNext())
188 s.add(iter.next());
192 return(s);
195 /*************************************************************************/
198 * Various methods that determine how far the run extends for various
199 * attribute combinations.
202 public int
203 getRunLimit()
205 return(getRunLimit(getAttributes().keySet()));
208 public int
209 getRunLimit(AttributedCharacterIterator.Attribute attrib)
211 HashSet s = new HashSet();
212 s.add(attrib);
214 return(getRunLimit(s));
217 public synchronized int
218 getRunLimit(Set attribute_set)
220 int orig_index = ci.getIndex();
221 int run_limit;
225 run_limit = ci.getIndex();
227 Map attribute_map = getAttributes();
229 boolean found = false;
230 Iterator iter = attribute_set.iterator();
231 while(iter.hasNext())
232 if (!attribute_map.containsKey(iter.next()))
234 found = true;
235 break;
238 if (found)
239 break;
241 while (ci.next() != CharacterIterator.DONE);
243 boolean hit_end = (ci.previous() == CharacterIterator.DONE);
245 ci.setIndex(orig_index);
247 if (run_limit == orig_index)
248 return(-1); // No characters match the given attributes
249 // else if (!hit_end)
250 // --run_limit;
252 return(run_limit);
255 /*************************************************************************/
258 * Various methods that determine where the run begins for various
259 * attribute combinations.
262 public int
263 getRunStart()
265 return(getRunStart(getAttributes().keySet()));
268 public int
269 getRunStart(AttributedCharacterIterator.Attribute attrib)
271 HashSet s = new HashSet();
272 s.add(attrib);
274 return(getRunStart(s));
277 public int
278 getRunStart(Set attribute_set)
280 int orig_index = ci.getIndex();
281 int run_start;
285 run_start = ci.getIndex();
287 Map attribute_map = getAttributes();
289 Iterator iter = attribute_set.iterator();
290 while(iter.hasNext())
291 if (!attribute_map.containsKey(iter.next()))
292 break;
294 if (iter.hasNext())
295 break;
297 while (ci.previous() != CharacterIterator.DONE);
299 boolean hit_beginning = (ci.previous() == CharacterIterator.DONE);
301 ci.setIndex(orig_index);
303 if (run_start == orig_index)
304 return(-1); // No characters match the given attributes
305 else if (!hit_beginning)
306 ++run_start;
308 return(run_start);
311 /*************************************************************************/
313 public Object
314 getAttribute(AttributedCharacterIterator.Attribute attrib)
316 if (attribs == null)
317 return(null);
319 for (int i = 0; i < attribs.length; i++)
321 Set key_set = attribs[i].attribs.keySet();
322 Iterator iter = key_set.iterator();
323 while (iter.hasNext())
325 Object obj = iter.next();
327 // Check for attribute match and range match
328 if (obj.equals(attrib))
329 if ((ci.getIndex() >= attribs[i].begin_index) &&
330 (ci.getIndex() <= attribs[i].end_index))
331 return(attribs[i].attribs.get(obj));
335 return(null);
338 /*************************************************************************/
341 * Return a list of all the attributes and values defined for this
342 * character
344 public Map
345 getAttributes()
347 HashMap m = new HashMap();
348 if (attribs == null)
349 return(m);
351 for (int i = 0; i < attribs.length; i++)
353 if ((ci.getIndex() >= attribs[i].begin_index) &&
354 (ci.getIndex() <= attribs[i].end_index))
355 m.putAll(attribs[i].attribs);
358 return(m);
361 } // class AttributedStringIterator