blob: 8a1cbe8bd9833c02d51b231b33177f54c85d0f57 [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.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();
}
}