/******************************************************************************* * Copyright (c) 2007-2009 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.vpe.template; /** * @author yzhishko */ import static org.jboss.tools.vpe.xulrunner.util.XPCOM.queryInterface; import java.util.StringTokenizer; import org.jboss.tools.vpe.editor.context.VpePageContext; import org.jboss.tools.vpe.editor.template.VpeCreationData; import org.jboss.tools.vpe.editor.util.HTML; import org.jboss.tools.vpe.editor.util.VisualDomUtil; import org.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.mozilla.interfaces.nsIDOMNode; import org.mozilla.interfaces.nsIDOMNodeList; import org.mozilla.interfaces.nsIDOMText; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class SeamPdfSectionTemplate extends SeamPdfAbstractChapterTemplate { private nsIDOMElement visualElement; private Element sourceElement; private String sectionNumberString; private String headNameString; public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { visualElement = VisualDomUtil.createBorderlessContainer(visualDocument); sourceElement = (Element) sourceNode; sectionNumberString = calculateSectionNumber(pageContext, sourceElement); headNameString = calculateHeadName(sectionNumberString); nsIDOMNode headNode = visualDocument.createElement(headNameString); nsIDOMText textNode = visualDocument .createTextNode(sectionNumberString); headNode.appendChild(textNode); visualElement.appendChild(headNode); return new VpeCreationData(visualElement); } private String calculateSectionNumber(VpePageContext pageContext, Element sourceElement) { StringBuffer chapterNumberBuffer = new StringBuffer(); calculateNumberFromTree(pageContext, sourceElement, chapterNumberBuffer); Node parentSection = SeamUtil.getParentByName(pageContext, sourceElement, "p:chapter"); //$NON-NLS-1$ if (parentSection != null) { int chapterNumber = getChapterNumber(parentSection); chapterNumberBuffer .insert(0, Integer.toString(chapterNumber) + "."); //$NON-NLS-1$ } return chapterNumberBuffer.toString(); } private String calculateHeadName(String sectionNumberString) { StringTokenizer tokenizer = new StringTokenizer(sectionNumberString, ".", false); //$NON-NLS-1$ int headNumber = 0; while (tokenizer.hasMoreElements()) { tokenizer.nextToken(); headNumber++; } if (headNumber > 6) { headNumber = 6; } return "H" + Integer.toString(headNumber); //$NON-NLS-1$ } private void calculateNumberFromTree(VpePageContext pageContext, Element sourceElement, StringBuffer sectionNumberString) { Node parentSection = SeamUtil.getParentByName(pageContext, sourceElement, "p:section"); //$NON-NLS-1$ if (parentSection != null) { int sectionNum = 0; NodeList children = parentSection.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { if (children.item(i).getNodeName().endsWith("section")) { //$NON-NLS-1$ sectionNum++; if (children.item(i) == sourceElement) { sectionNumberString.insert(0, Integer .toString(sectionNum) + "."); //$NON-NLS-1$ break; } } } calculateNumberFromTree(pageContext, (Element) parentSection, sectionNumberString); } else { Node parentChapter = SeamUtil.getParentByName(pageContext, sourceElement, "p:chapter"); //$NON-NLS-1$ int sectionNum = 0; NodeList children = parentChapter.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { if (children.item(i).getNodeName().endsWith("section")) { //$NON-NLS-1$ sectionNum++; if (children.item(i) == sourceElement) { sectionNumberString.insert(0, Integer .toString(sectionNum) + "."); //$NON-NLS-1$ break; } } } } } private int getChapterNumber(Node chapterNode) { int chapterNumber = 1; Element chapterElement = (Element) chapterNode; String numberAttrName = "number"; //$NON-NLS-1$ if (chapterElement.hasAttribute(numberAttrName)) { String chapterNumberString = chapterElement.getAttribute(numberAttrName); try { chapterNumber = Integer.parseInt(chapterNumberString); } catch (NumberFormatException e) { chapterNumber = 1; } } else { chapterNumber = 1; } return chapterNumber; } @Override protected nsIDOMElement getHeadElement(VpeCreationData data) { nsIDOMNode visualNode = data.getNode(); nsIDOMNodeList children = visualNode.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { if (children.item(i).getNodeType() == nsIDOMNode.ELEMENT_NODE) { String nodeName = children.item(i).getNodeName(); if (HTML.TAG_H1.equalsIgnoreCase(nodeName) || HTML.TAG_H2.equalsIgnoreCase(nodeName) || HTML.TAG_H3.equalsIgnoreCase(nodeName) || HTML.TAG_H4.equalsIgnoreCase(nodeName) || HTML.TAG_H5.equalsIgnoreCase(nodeName) || HTML.TAG_H6.equalsIgnoreCase(nodeName)) { return queryInterface(children.item(i), nsIDOMElement.class); } } } return null; } }