1 /* AttributedStringIterator.java -- Class to iterate over AttributedString
2 Copyright (C) 1998, 1999, 2004 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. */
41 import java
.util
.HashMap
;
42 import java
.util
.HashSet
;
43 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 if (attribs
[i
].begin_index
> getEndIndex()
185 || attribs
[i
].end_index
<= getBeginIndex())
188 Set key_set
= attribs
[i
].attribs
.keySet();
189 Iterator iter
= key_set
.iterator();
190 while (iter
.hasNext())
199 /*************************************************************************/
202 * Various methods that determine how far the run extends for various
203 * attribute combinations.
209 return(getRunLimit(getAttributes().keySet()));
213 getRunLimit(AttributedCharacterIterator
.Attribute attrib
)
215 HashSet s
= new HashSet();
218 return(getRunLimit(s
));
221 public synchronized int
222 getRunLimit(Set attribute_set
)
225 int runLimit
= ci
.getEndIndex ();
226 int pos
= ci
.getIndex ();
228 for (int i
= 0; i
< attribs
.length
; ++i
)
230 if (pos
>= attribs
[i
].begin_index
&&
231 pos
<= attribs
[i
].end_index
)
233 Iterator iter
= attribute_set
.iterator();
234 while(iter
.hasNext())
235 if (attribs
[i
].attribs
.containsKey(iter
.next()))
238 runLimit
= Math
.min(runLimit
, attribs
[i
].end_index
);
248 /*************************************************************************/
251 * Various methods that determine where the run begins for various
252 * attribute combinations.
258 return(getRunStart(getAttributes().keySet()));
262 getRunStart(AttributedCharacterIterator
.Attribute attrib
)
264 HashSet s
= new HashSet();
267 return(getRunStart(s
));
271 getRunStart(Set attribute_set
)
275 int pos
= ci
.getIndex ();
277 for (int i
= 0; i
< attribs
.length
; ++i
)
279 if (pos
>= attribs
[i
].begin_index
&&
280 pos
<= attribs
[i
].end_index
)
282 Iterator iter
= attribute_set
.iterator();
283 while(iter
.hasNext())
284 if (attribs
[i
].attribs
.containsKey(iter
.next()))
287 runBegin
= Math
.max(runBegin
, attribs
[i
].begin_index
);
297 /*************************************************************************/
300 getAttribute(AttributedCharacterIterator
.Attribute attrib
)
305 for (int i
= 0; i
< attribs
.length
; i
++)
307 Set key_set
= attribs
[i
].attribs
.keySet();
308 Iterator iter
= key_set
.iterator();
309 while (iter
.hasNext())
311 Object obj
= iter
.next();
313 // Check for attribute match and range match
314 if (obj
.equals(attrib
))
315 if ((ci
.getIndex() >= attribs
[i
].begin_index
) &&
316 (ci
.getIndex() < attribs
[i
].end_index
))
317 return(attribs
[i
].attribs
.get(obj
));
324 /*************************************************************************/
327 * Return a list of all the attributes and values defined for this
333 HashMap m
= new HashMap();
337 for (int i
= 0; i
< attribs
.length
; i
++)
339 if ((ci
.getIndex() >= attribs
[i
].begin_index
) &&
340 (ci
.getIndex() < attribs
[i
].end_index
))
341 m
.putAll(attribs
[i
].attribs
);
347 } // class AttributedStringIterator