/* * 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.complexscripts.bidi; import org.apache.fop.fo.FONode; import org.apache.fop.fo.FOText; import org.apache.fop.fo.flow.AbstractGraphics; import org.apache.fop.fo.flow.AbstractPageNumberCitation; import org.apache.fop.fo.flow.BidiOverride; import org.apache.fop.fo.flow.Character; import org.apache.fop.fo.flow.Leader; import org.apache.fop.fo.flow.PageNumber; // CSOFF: LineLengthCheck /** * <p>The <code>TextInterval</code> class is a utility class, the instances of which are used * to record backpointers to associated nodes over sub-intervals of a delimited text range.</p> * * <p>This work was originally authored by Glenn Adams (gadams@apache.org).</p> */ class TextInterval { private FONode fn; // associated node private int textStart; // starting index within delimited text range of associated node's text private int start; // starting index within delimited text range private int end; // ending index within delimited text range private int level; // resolved level or default (-1) TextInterval(FONode fn, int start, int end) { this (fn, start, start, end, -1); } TextInterval(FONode fn, int textStart, int start, int end, int level) { this.fn = fn; this.textStart = textStart; this.start = start; this.end = end; this.level = level; } FONode getNode() { return fn; } int getTextStart() { return textStart; } int getStart() { return start; } int getEnd() { return end; } int getLevel() { return level; } void setLevel(int level) { this.level = level; } public int length() { return end - start; } public String getText() { if (fn instanceof FOText) { return ((FOText) fn) .getCharSequence() .toString(); } else if (fn instanceof Character) { return new String(new char[] {((Character) fn) .getCharacter()}); } else { return null; } } public void assignTextLevels() { if (fn instanceof FOText) { ((FOText) fn) .setBidiLevel(level, start - textStart, end - textStart); } else if (fn instanceof Character) { ((Character) fn) .setBidiLevel(level); } else if (fn instanceof AbstractPageNumberCitation) { ((AbstractPageNumberCitation) fn) .setBidiLevel(level); } else if (fn instanceof AbstractGraphics) { ((AbstractGraphics) fn) .setBidiLevel(level); } else if (fn instanceof Leader) { ((Leader) fn) .setBidiLevel(level); } else if (fn instanceof PageNumber) { ((PageNumber) fn) .setBidiLevel(level); } } public boolean equals(Object o) { if (o instanceof TextInterval) { TextInterval ti = (TextInterval) o; if (ti.getNode() != fn) { return false; } else if (ti.getStart() != start) { return false; } else { return ti.getEnd() == end; } } else { return false; } } public int hashCode() { int l = (fn != null) ? fn.hashCode() : 0; l = (l ^ start) + (l << 19); l = (l ^ end) + (l << 11); return l; } public String toString() { StringBuffer sb = new StringBuffer(); char c; if (fn instanceof FOText) { c = 'T'; } else if (fn instanceof Character) { c = 'C'; } else if (fn instanceof BidiOverride) { c = 'B'; } else if (fn instanceof AbstractPageNumberCitation) { c = '#'; } else if (fn instanceof AbstractGraphics) { c = 'G'; } else if (fn instanceof Leader) { c = 'L'; } else if (fn instanceof PageNumber) { c = '#'; } else { c = '?'; } sb.append(c); sb.append("[" + start + "," + end + "][" + textStart + "](" + level + ")"); return sb.toString(); } }