git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1856528 13f79535-47bb-0310-9956-ffa450edef68tags/fop-2_4
import org.apache.fop.fo.properties.LineHeightPropertyMaker; | import org.apache.fop.fo.properties.LineHeightPropertyMaker; | ||||
import org.apache.fop.fo.properties.ListProperty; | import org.apache.fop.fo.properties.ListProperty; | ||||
import org.apache.fop.fo.properties.NumberProperty; | 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.PageBreakShorthandParser; | ||||
import org.apache.fop.fo.properties.PageDimensionMaker; | import org.apache.fop.fo.properties.PageDimensionMaker; | ||||
import org.apache.fop.fo.properties.PositionShorthandParser; | import org.apache.fop.fo.properties.PositionShorthandParser; | ||||
addPropertyMaker("hyphenate", m); | addPropertyMaker("hyphenate", m); | ||||
// hyphenation-character | // hyphenation-character | ||||
m = new CharacterProperty.Maker(PR_HYPHENATION_CHARACTER); | |||||
m = new OptionalCharacterProperty.Maker(PR_HYPHENATION_CHARACTER); | |||||
m.setInherited(true); | m.setInherited(true); | ||||
m.setDefault("-"); | m.setDefault("-"); | ||||
addPropertyMaker("hyphenation-character", m); | addPropertyMaker("hyphenation-character", m); |
public final EnumProperty hyphenate; | public final EnumProperty hyphenate; | ||||
/** The "hyphenation-character" property */ | /** The "hyphenation-character" property */ | ||||
public final CharacterProperty hyphenationCharacter; | |||||
public final OptionalCharacterProperty hyphenationCharacter; | |||||
/** The "hyphenation-push-character-count" property */ | /** The "hyphenation-push-character-count" property */ | ||||
public final NumberProperty hyphenationPushCharacterCount; | public final NumberProperty hyphenationPushCharacterCount; | ||||
StringProperty country, | StringProperty country, | ||||
StringProperty script, | StringProperty script, | ||||
EnumProperty hyphenate, | EnumProperty hyphenate, | ||||
CharacterProperty hyphenationCharacter, | |||||
OptionalCharacterProperty hyphenationCharacter, | |||||
NumberProperty hyphenationPushCharacterCount, | NumberProperty hyphenationPushCharacterCount, | ||||
NumberProperty hyphenationRemainCharacterCount) { | NumberProperty hyphenationRemainCharacterCount) { | ||||
this.language = language; | this.language = language; | ||||
= (StringProperty) propertyList.get(Constants.PR_SCRIPT); | = (StringProperty) propertyList.get(Constants.PR_SCRIPT); | ||||
EnumProperty hyphenate | EnumProperty hyphenate | ||||
= (EnumProperty) propertyList.get(Constants.PR_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 hyphenationPushCharacterCount | ||||
= (NumberProperty) propertyList.get(Constants.PR_HYPHENATION_PUSH_CHARACTER_COUNT); | = (NumberProperty) propertyList.get(Constants.PR_HYPHENATION_PUSH_CHARACTER_COUNT); | ||||
NumberProperty hyphenationRemainCharacterCount | NumberProperty hyphenationRemainCharacterCount | ||||
* @param font the font | * @param font the font | ||||
* @return the effective hyphenation character. | * @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(); | char hyphChar = hyphenationCharacter.getCharacter(); | ||||
if (font.hasChar(hyphChar)) { | if (font.hasChar(hyphChar)) { | ||||
return hyphChar; //short-cut | return hyphChar; //short-cut | ||||
* @return the IPD in millipoints for the hyphenation character. | * @return the IPD in millipoints for the hyphenation character. | ||||
*/ | */ | ||||
public int getHyphIPD(org.apache.fop.fonts.Font font) { | 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); | |||||
} | } | ||||
/** | /** |
/* | |||||
* 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(); | |||||
} | |||||
} |
} | } | ||||
private void addHyphenationChar() { | 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] expand bidi word levels, letter space adjusts, gpos adjusts | ||||
// [TBD] [GA] problematic in bidi context... what is level of hyphen? | // [TBD] [GA] problematic in bidi context... what is level of hyphen? | ||||
textArea.setHyphenated(); | textArea.setHyphenated(); |