Frames | No Frames |
1: /* CombinedAttributes.java -- A two combined sets of attributes 2: Copyright (C) 2006 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 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. 10: 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. 15: 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., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 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. 25: 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. */ 37: 38: 39: package gnu.javax.swing.text.html; 40: 41: import java.io.Serializable; 42: import java.util.Enumeration; 43: 44: import javax.swing.text.AttributeSet; 45: import javax.swing.text.SimpleAttributeSet; 46: 47: /** 48: * Contains the two combined attribute sets what are searched subsequently. 49: * This is used to combine style sheet attributes with the HTML view attributes. 50: * The parent cannot be used as the view may have its own attribute hierarchy. 51: * 52: * @author Audrius Meskauskas (AudriusA@Bioinformatics.org) 53: */ 54: public class CombinedAttributes implements AttributeSet, Serializable 55: { 56: /** 57: * Returns the elements from both enumerations. 58: */ 59: class CombinedEnumeration implements Enumeration 60: { 61: /** 62: * Create a combined enumeration that enumerates over two enumerations. 63: * 64: * @param first the first enumeration to enumerate 65: * @param second the second enumeration to enumerate 66: */ 67: CombinedEnumeration(Enumeration first, Enumeration second) 68: { 69: a = first; 70: b = second; 71: } 72: 73: /** 74: * The first enumeration (elements returned first) 75: */ 76: final Enumeration a; 77: 78: /** 79: * The second enumeration (elements returned later) 80: */ 81: final Enumeration b; 82: 83: /** @inheritDoc */ 84: public boolean hasMoreElements() 85: { 86: return a.hasMoreElements() || b.hasMoreElements(); 87: } 88: 89: /** @inheritDoc */ 90: public Object nextElement() 91: { 92: return a.hasMoreElements() ? a.nextElement():b.nextElement(); 93: } 94: } 95: 96: 97: /** 98: * The first attribute set. 99: */ 100: final AttributeSet a; 101: 102: /** 103: * The second attribute set. 104: */ 105: final AttributeSet b; 106: 107: /** 108: * Create the CombinedAttributes what search in the two sets. If any of the 109: * two passed sets is null, another set is returned. Otherwise, the combined 110: * attribute set is returned. 111: * 112: * @param primary the first set (searched first) 113: * @param secondary the second set (searched later). 114: */ 115: public static AttributeSet combine(AttributeSet primary, 116: AttributeSet secondary) 117: { 118: if (primary == null) 119: return secondary; 120: else if (secondary == null) 121: return primary; 122: else 123: return new CombinedAttributes(primary, secondary); 124: } 125: 126: /** 127: * Create the CombinedAttributes what search in the two sets. 128: * 129: * @param primary the first set (searched first) 130: * @param secondary the second set (searched later). 131: */ 132: private CombinedAttributes(AttributeSet primary, AttributeSet secondary) 133: { 134: a = primary; 135: b = secondary; 136: } 137: 138: /** @inheritDoc */ 139: public boolean containsAttribute(Object name, Object value) 140: { 141: return a.containsAttribute(name, value) || b.containsAttribute(name, value); 142: } 143: 144: /** @inheritDoc */ 145: public boolean containsAttributes(AttributeSet attributes) 146: { 147: Enumeration names = attributes.getAttributeNames(); 148: Object name; 149: while (names.hasMoreElements()) 150: { 151: name = names.nextElement(); 152: if (!containsAttribute(name, attributes.getAttribute(name))) 153: return false; 154: } 155: return true; 156: } 157: 158: /** @inheritDoc */ 159: public AttributeSet copyAttributes() 160: { 161: SimpleAttributeSet copy = new SimpleAttributeSet(); 162: copy.addAttributes(a); 163: copy.addAttributes(b); 164: return copy; 165: } 166: 167: /** @inheritDoc */ 168: public Object getAttribute(Object key) 169: { 170: Object value = a.getAttribute(key); 171: if (value == null) 172: value = b.getAttribute(key); 173: 174: return value; 175: } 176: 177: /** @inheritDoc */ 178: public int getAttributeCount() 179: { 180: return a.getAttributeCount()+b.getAttributeCount(); 181: } 182: 183: /** @inheritDoc */ 184: public Enumeration getAttributeNames() 185: { 186: return new CombinedEnumeration(a.getAttributeNames(), b.getAttributeNames()); 187: } 188: 189: /** 190: * There is no one. 191: * 192: * @return null, always. 193: */ 194: public AttributeSet getResolveParent() 195: { 196: return null; 197: } 198: 199: /** @inheritDoc */ 200: public boolean isDefined(Object attrName) 201: { 202: return a.isDefined(attrName) || b.isDefined(attrName); 203: } 204: 205: /** @inheritDoc */ 206: public boolean isEqual(AttributeSet attr) 207: { 208: if (attr.getAttributeCount() == getAttributeCount()) 209: return containsAttributes(attr); 210: else 211: return false; 212: } 213: }