blob: 9877ec6ec50c927258bca0f433e6a9a30a85a5aa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id$ */
package org.apache.fop.fonts;
import org.apache.xmlgraphics.fonts.Glyphs;
import org.apache.fop.util.CharUtilities;
/**
* Represents an named character with character name (from the Adobe glyph list) and a Unicode
* sequence that this character represents.
*/
public class NamedCharacter {
private String charName;
private String unicodeSequence;
/**
* Main constructor.
* @param charName the character name
* @param unicodeSequence the Unicode sequence associated with this character
*/
public NamedCharacter(String charName, String unicodeSequence) {
if (charName == null) {
throw new NullPointerException("charName must not be null");
}
this.charName = charName;
if (unicodeSequence != null) {
this.unicodeSequence = unicodeSequence;
} else {
this.unicodeSequence = Glyphs.getUnicodeSequenceForGlyphName(charName);
}
}
/**
* Simple constructor.
* @param charName the character name
*/
public NamedCharacter(String charName) {
this(charName, null);
}
/** {@inheritDoc} */
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((charName == null) ? 0 : charName.hashCode());
return result;
}
/** {@inheritDoc} */
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final NamedCharacter other = (NamedCharacter)obj;
return charName.equals(other.charName);
}
/**
* Returns the character name (as defined by the Adobe glyph list).
* @return the character name
*/
public String getName() {
return this.charName;
}
/**
* Returns the Unicode sequence associated with this character.
* @return the Unicode sequence (or null if no Unicode sequence is associated)
*/
public String getUnicodeSequence() {
return this.unicodeSequence;
}
/**
* Indicates whether a single Unicode value is associated with this character.
* @return true if exactly one Unicode value is associated with this character, false otherwise
*/
public boolean hasSingleUnicodeValue() {
return (this.unicodeSequence != null && this.unicodeSequence.length() == 1);
}
/**
* Returns the single Unicode value associated with this named character. Check
* {@link #hasSingleUnicodeValue()} before you call this method because an
* IllegalStateException is thrown is a Unicode sequence with more than one character is
* associated with this character.
* @return the single Unicode value (or FFFF ("NOT A CHARACTER") if no Unicode value is
* available)
* @throws IllegalStateException if a Unicode sequence with more than one value is associated
* with the named character
*/
public char getSingleUnicodeValue() throws IllegalStateException {
if (this.unicodeSequence == null) {
return CharUtilities.NOT_A_CHARACTER;
}
if (this.unicodeSequence.length() > 1) {
throw new IllegalStateException("getSingleUnicodeValue() may not be called for a"
+ " named character that has more than one Unicode value (a sequence)"
+ " associated with the named character!");
}
return this.unicodeSequence.charAt(0);
}
/** {@inheritDoc} */
public String toString() {
StringBuffer sb = new StringBuffer(this.unicodeSequence);
sb.append(" (");
if (this.unicodeSequence != null) {
for (int i = 0, c = this.unicodeSequence.length(); i < c; i++) {
sb.append("0x").append(Integer.toHexString(this.unicodeSequence.charAt(0)));
}
sb.append(", ");
}
sb.append(getName()).append(')');
return sb.toString();
}
}