in fop-core/src/main/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationHandler.java [77:191]
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
boolean handled = false;
if (EL_ID.equals(localName)) {
String idref = attributes.getValue(NAME);
if (unresolvedIds.containsKey(idref)) {
GoToXYAction action = new GoToXYAction(idref);
action.setPageIndex(navHandler.getPageIndex());
action.setTargetLocation(new Point(0, 0));
unresolvedIds.put(idref, action);
}
handled = true;
}
if (NAMESPACE.equals(uri)) {
if (BOOKMARK_TREE.getLocalName().equals(localName)) {
if (!objectStack.isEmpty()) {
throw new SAXException(localName + " must be the root element!");
}
BookmarkTree bookmarkTree = new BookmarkTree();
objectStack.push(bookmarkTree);
} else if (BOOKMARK.getLocalName().equals(localName)) {
String title = attributes.getValue("title");
String s = attributes.getValue("starting-state");
boolean show = !"hide".equals(s);
Bookmark b = new Bookmark(title, show, null);
Object o = objectStack.peek();
if (o instanceof AbstractAction) {
AbstractAction action = (AbstractAction)objectStack.pop();
o = objectStack.peek();
((Bookmark)o).setAction(action);
}
if (o instanceof BookmarkTree) {
((BookmarkTree)o).addBookmark(b);
} else {
((Bookmark)o).addChildBookmark(b);
}
objectStack.push(b);
} else if (NAMED_DESTINATION.getLocalName().equals(localName)) {
if (!objectStack.isEmpty()) {
throw new SAXException(localName + " must be the root element!");
}
String name = attributes.getValue("name");
NamedDestination dest = new NamedDestination(name, null);
objectStack.push(dest);
} else if (LINK.getLocalName().equals(localName)) {
if (!objectStack.isEmpty()) {
throw new SAXException(localName + " must be the root element!");
}
Rectangle targetRect = XMLUtil.getAttributeAsRectangle(attributes, "rect");
structureTreeElement = structureTreeElements.get(attributes.getValue(
InternalElementMapping.URI, InternalElementMapping.STRUCT_REF));
Link link = new Link(null, targetRect);
objectStack.push(link);
} else if (GOTO_XY.getLocalName().equals(localName)) {
String idref = attributes.getValue("idref");
GoToXYAction action;
if (idref != null) {
action = new GoToXYAction(idref);
} else {
String id = attributes.getValue("id");
int pageIndex = XMLUtil.getAttributeAsInt(attributes, "page-index");
int pageIndexRelative = XMLUtil.getAttributeAsInt(attributes, "page-index-relative", 0);
final Point location;
if (pageIndex < 0) {
location = null;
unresolvedIds.put(id, null);
} else {
if (hasNavigation() && !inBookmark() && pageIndexRelative >= 0) {
int currentPageIndex = navHandler.getPageIndex();
if (currentPageIndex >= 0) {
pageIndex = currentPageIndex;
}
}
final int x = XMLUtil
.getAttributeAsInt(attributes, "x");
final int y = XMLUtil
.getAttributeAsInt(attributes, "y");
location = new Point(x, y);
unresolvedIds.remove(id);
}
action = new GoToXYAction(id, pageIndex, location,
new PageIndexRelative(pageIndex, pageIndexRelative));
}
if (structureTreeElement != null) {
action.setStructureTreeElement(structureTreeElement);
}
objectStack.push(action);
} else if (GOTO_URI.getLocalName().equals(localName)) {
String id = attributes.getValue("id");
String gotoURI = attributes.getValue("uri");
String showDestination = attributes.getValue("show-destination");
boolean newWindow = "new".equals(showDestination);
URIAction action = new URIAction(gotoURI, newWindow);
if (id != null) {
action.setID(id);
}
if (structureTreeElement != null) {
action.setStructureTreeElement(structureTreeElement);
}
objectStack.push(action);
} else {
throw new SAXException(
"Invalid element '" + localName + "' in namespace: " + uri);
}
handled = true;
}
if (!handled) {
if (NAMESPACE.equals(uri)) {
throw new SAXException("Unhandled element '" + localName + "' in namespace: "
+ uri);
} else {
log.warn("Unhandled element '" + localName + "' in namespace: " + uri);
}
}
}