git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1856528 13f79535-47bb-0310-9956-ffa450edef68pull/56/head
@@ -53,6 +53,7 @@ import org.apache.fop.fo.properties.LengthRangeProperty; | |||
import org.apache.fop.fo.properties.LineHeightPropertyMaker; | |||
import org.apache.fop.fo.properties.ListProperty; | |||
import org.apache.fop.fo.properties.NumberProperty; | |||
import org.apache.fop.fo.properties.OptionalCharacterProperty; | |||
import org.apache.fop.fo.properties.PageBreakShorthandParser; | |||
import org.apache.fop.fo.properties.PageDimensionMaker; | |||
import org.apache.fop.fo.properties.PositionShorthandParser; | |||
@@ -1105,7 +1106,7 @@ public final class FOPropertyMapping implements Constants { | |||
addPropertyMaker("hyphenate", m); | |||
// hyphenation-character | |||
m = new CharacterProperty.Maker(PR_HYPHENATION_CHARACTER); | |||
m = new OptionalCharacterProperty.Maker(PR_HYPHENATION_CHARACTER); | |||
m.setInherited(true); | |||
m.setDefault("-"); | |||
addPropertyMaker("hyphenation-character", m); |
@@ -58,7 +58,7 @@ public final class CommonHyphenation { | |||
public final EnumProperty hyphenate; | |||
/** The "hyphenation-character" property */ | |||
public final CharacterProperty hyphenationCharacter; | |||
public final OptionalCharacterProperty hyphenationCharacter; | |||
/** The "hyphenation-push-character-count" property */ | |||
public final NumberProperty hyphenationPushCharacterCount; | |||
@@ -74,7 +74,7 @@ public final class CommonHyphenation { | |||
StringProperty country, | |||
StringProperty script, | |||
EnumProperty hyphenate, | |||
CharacterProperty hyphenationCharacter, | |||
OptionalCharacterProperty hyphenationCharacter, | |||
NumberProperty hyphenationPushCharacterCount, | |||
NumberProperty hyphenationRemainCharacterCount) { | |||
this.language = language; | |||
@@ -104,8 +104,8 @@ public final class CommonHyphenation { | |||
= (StringProperty) propertyList.get(Constants.PR_SCRIPT); | |||
EnumProperty hyphenate | |||
= (EnumProperty) propertyList.get(Constants.PR_HYPHENATE); | |||
CharacterProperty hyphenationCharacter | |||
= (CharacterProperty) propertyList.get(Constants.PR_HYPHENATION_CHARACTER); | |||
OptionalCharacterProperty hyphenationCharacter | |||
= (OptionalCharacterProperty) propertyList.get(Constants.PR_HYPHENATION_CHARACTER); | |||
NumberProperty hyphenationPushCharacterCount | |||
= (NumberProperty) propertyList.get(Constants.PR_HYPHENATION_PUSH_CHARACTER_COUNT); | |||
NumberProperty hyphenationRemainCharacterCount | |||
@@ -132,7 +132,10 @@ public final class CommonHyphenation { | |||
* @param font the font | |||
* @return the effective hyphenation character. | |||
*/ | |||
public char getHyphChar(org.apache.fop.fonts.Font font) { | |||
public Character getHyphChar(org.apache.fop.fonts.Font font) { | |||
if (hyphenationCharacter.getObject() == null) { | |||
return null; | |||
} | |||
char hyphChar = hyphenationCharacter.getCharacter(); | |||
if (font.hasChar(hyphChar)) { | |||
return hyphChar; //short-cut | |||
@@ -183,8 +186,8 @@ public final class CommonHyphenation { | |||
* @return the IPD in millipoints for the hyphenation character. | |||
*/ | |||
public int getHyphIPD(org.apache.fop.fonts.Font font) { | |||
char hyphChar = getHyphChar(font); | |||
return font.getCharWidth(hyphChar); | |||
Character hyphChar = getHyphChar(font); | |||
return (hyphChar == null) ? 0 : font.getCharWidth(hyphChar); | |||
} | |||
/** |
@@ -0,0 +1,116 @@ | |||
/* | |||
* 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.fo.properties; | |||
import org.apache.fop.fo.FObj; | |||
import org.apache.fop.fo.PropertyList; | |||
/** | |||
* Superclass for properties that wrap an optional character value | |||
* TODO convert character value to int in order to denote unicode scalar value | |||
* instead of a single UTF-16 code element | |||
*/ | |||
public final class OptionalCharacterProperty extends Property { | |||
/** | |||
* Inner class for creating instances of OptionalCharacterProperty | |||
*/ | |||
public static class Maker extends PropertyMaker { | |||
/** | |||
* @param propId the id of the property for which a Maker should be created | |||
*/ | |||
public Maker(int propId) { | |||
super(propId); | |||
} | |||
/** {@inheritDoc} */ | |||
public Property make(PropertyList propertyList, String value, | |||
FObj fo) { | |||
if (value.isEmpty()) { | |||
return OptionalCharacterProperty.getInstance(null); | |||
} else { | |||
char c = value.charAt(0); | |||
return OptionalCharacterProperty.getInstance(c); | |||
} | |||
} | |||
} | |||
/** cache containing all canonical OptionalCharacterProperty instances */ | |||
private static final PropertyCache<OptionalCharacterProperty> CACHE | |||
= new PropertyCache<OptionalCharacterProperty>(); | |||
private final Character character; | |||
/** | |||
* @param character character value to be wrapped in this property | |||
*/ | |||
private OptionalCharacterProperty(Character character) { | |||
this.character = character; | |||
} | |||
/** | |||
* Get character property instance for character. | |||
* @param character the character | |||
* @return the character property instance | |||
*/ | |||
public static OptionalCharacterProperty getInstance(Character character) { | |||
return CACHE.fetch(new OptionalCharacterProperty(character)); | |||
} | |||
/** | |||
* @return this.character cast as an Object | |||
*/ | |||
public Object getObject() { | |||
return character; | |||
} | |||
/** | |||
* @return this.character | |||
*/ | |||
public char getCharacter() { | |||
return character == null ? 0 : this.character; | |||
} | |||
/** | |||
* @return this.character cast as a String | |||
*/ | |||
public String getString() { | |||
return character == null ? "" : character.toString(); | |||
} | |||
@Override | |||
public boolean equals(Object obj) { | |||
if (obj instanceof OptionalCharacterProperty) { | |||
OptionalCharacterProperty ocp = (OptionalCharacterProperty) obj; | |||
return character == ocp.character | |||
|| character != null | |||
&& character.equals(ocp.character); | |||
} else { | |||
return false; | |||
} | |||
} | |||
@Override | |||
public int hashCode() { | |||
return character == null ? 0 : character.hashCode(); | |||
} | |||
} |
@@ -550,7 +550,10 @@ public class TextLayoutManager extends LeafNodeLayoutManager { | |||
} | |||
private void addHyphenationChar() { | |||
wordChars.append(foText.getCommonHyphenation().getHyphChar(font)); | |||
Character hyphChar = foText.getCommonHyphenation().getHyphChar(font); | |||
if (hyphChar != null) { | |||
wordChars.append(hyphChar); | |||
} | |||
// [TBD] expand bidi word levels, letter space adjusts, gpos adjusts | |||
// [TBD] [GA] problematic in bidi context... what is level of hyphen? | |||
textArea.setHyphenated(); |