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)
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
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
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. */
42 import java
.util
.HashSet
;
44 import java
.util
.HashMap
;
45 import java
.util
.Iterator
;
48 * This class implements the AttributedCharacterIterator interface. It
49 * is used by AttributedString.getIterator().
53 * @author Aaron M. Renn (arenn@urbanophile.com)
55 class AttributedStringIterator
implements AttributedCharacterIterator
58 /*************************************************************************/
65 * The character iterator containing the text
67 private CharacterIterator ci
;
70 * The list of attributes and ranges
72 private AttributedString
.AttributeRange
[] attribs
;
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 /*************************************************************************/
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 /*************************************************************************/
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.
114 return(ci
.current());
126 return(ci
.previous());
144 return(ci
.getIndex());
150 return(ci
.setIndex(index
));
156 return(ci
.getBeginIndex());
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
176 getAllAttributeKeys()
178 HashSet s
= new HashSet();
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())
195 /*************************************************************************/
198 * Various methods that determine how far the run extends for various
199 * attribute combinations.
205 return(getRunLimit(getAttributes().keySet()));
209 getRunLimit(AttributedCharacterIterator
.Attribute attrib
)
211 HashSet s
= new HashSet();
214 return(getRunLimit(s
));
217 public synchronized int
218 getRunLimit(Set attribute_set
)
220 int orig_index
= ci
.getIndex();
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()))
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)
255 /*************************************************************************/
258 * Various methods that determine where the run begins for various
259 * attribute combinations.
265 return(getRunStart(getAttributes().keySet()));
269 getRunStart(AttributedCharacterIterator
.Attribute attrib
)
271 HashSet s
= new HashSet();
274 return(getRunStart(s
));
278 getRunStart(Set attribute_set
)
280 int orig_index
= ci
.getIndex();
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()))
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
)
311 /*************************************************************************/
314 getAttribute(AttributedCharacterIterator
.Attribute attrib
)
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
));
338 /*************************************************************************/
341 * Return a list of all the attributes and values defined for this
347 HashMap m
= new HashMap();
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
);
361 } // class AttributedStringIterator