blob: 173b28cf0adf230f958039445f2a88803be3e3b1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are 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:
* Tatsuya ISHIHARA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.model.dom.odf.draw.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.actf.model.dom.odf.ODFException;
import org.eclipse.actf.model.dom.odf.base.ContentBaseElement;
import org.eclipse.actf.model.dom.odf.base.ODFDocument;
import org.eclipse.actf.model.dom.odf.base.ODFElement;
import org.eclipse.actf.model.dom.odf.base.impl.ODFElementImpl;
import org.eclipse.actf.model.dom.odf.dr3d.Dr3dConstants;
import org.eclipse.actf.model.dom.odf.draw.DrawConstants;
import org.eclipse.actf.model.dom.odf.draw.PageElement;
import org.eclipse.actf.model.dom.odf.office.BodyElement;
import org.eclipse.actf.model.dom.odf.office.DocumentContentElement;
import org.eclipse.actf.model.dom.odf.presentation.NotesElement;
import org.eclipse.actf.model.dom.odf.presentation.PresentationConstants;
import org.eclipse.actf.util.xpath.XPathUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
class PageElementImpl extends ODFElementImpl implements PageElement {
private static final long serialVersionUID = 8198841362223795490L;
private ContentBaseElement contentElement = null;
protected PageElementImpl(ODFDocument odfDoc, Element element) {
super(odfDoc, element);
}
public ODFElement createObject(long x, long y, long width, long height) {
// TODO Auto-generated method stub
return null;
}
public int getPageIndex() {
if (odfDoc == null)
return -1;
Element root = odfDoc.getDocumentElement();
if (root instanceof DocumentContentElement) {
BodyElement body = ((DocumentContentElement) root).getBodyElement();
contentElement = body.getContent();
}
if (contentElement == null)
return -1;
NodeList list = XPathUtil.evalXPathNodeList(contentElement,
"./*[namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_PAGE
+ "']");
for (int i = 0; i < list.getLength(); i++) {
if (list.item(i).equals(this)) {
return i;
}
}
return -1;
}
public String getAttrDrawName() {
if (hasAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_NAME))
return getAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_NAME);
return null;
}
public String getAttrDrawStyleName() {
if (hasAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_STYLE_NAME))
return getAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_STYLE_NAME);
return null;
}
public String getAttrDrawMasterPageName() {
if (hasAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_MASTER_PAGE_NAME))
return getAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_MASTER_PAGE_NAME);
return null;
}
public String getAttrDrawNavOrder() {
if (hasAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_NAV_ORDER))
return getAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_NAV_ORDER);
return null;
}
private class NavOrderComparator implements Comparator<ODFElement> {
/*
* private boolean isTitleShape(ODFElement shape) { try { if(
* "title"==shape.getAttributeNS(PresentationConstants.PRESENTATION_NAMESPACE_URI,
* PresentationConstants.ATTR_CLASS) ) { return true; } }
* catch(Exception e) {} return false; }
*/
private int getNavOrder(ODFElement shape, String navOrders) {
String id = shape.getAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
DrawConstants.ATTR_ID);
if (id != null) {
int index = navOrders.indexOf(id);
if (index >= 0) {
return index;
}
}
return navOrders.length();
}
private int getZOrder(ODFElement shape) {
Node parent = shape.getParentNode();
if (!(parent instanceof PageElement))
return -1;
int index = 0;
Node preSib = shape.getPreviousSibling();
while (preSib != null) {
if (preSib instanceof ODFElement)
index++;
preSib = preSib.getPreviousSibling();
}
return index;
}
public int compare(ODFElement a, ODFElement b) {
/*
* if( isTitleShape(a) ) { return -1; }
*/
String navOrders = getAttrDrawNavOrder();
if (navOrders != null) {
int oDelta = getNavOrder(a, navOrders)
- getNavOrder(b, navOrders);
if (oDelta != 0) {
return oDelta;
}
}
int oDelta = getZOrder(a) - getZOrder(b);
if (oDelta != 0) {
return oDelta;
}
return 0;
}
}
public List<ODFElement> getChildNodesInNavOrder() {
List<ODFElement> children = new ArrayList<ODFElement>();
NodeList nl = getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
if (nl.item(i) instanceof ODFElement) {
children.add((ODFElement) nl.item(i));
}
}
String navOrder = getAttrDrawNavOrder();
if (navOrder == null)
return children;
Collections.sort(children, new NavOrderComparator());
return children;
}
/*
* get drawing elements listed below "draw:rect" "draw:line" "draw:polyline"
* "draw:polygon" "draw:regular-polygon" "draw:path" "draw:circle"
* "draw:ellipse" "draw:g" "draw:page-thumbnail" "draw:measure"
* "draw:caption" "draw:connector" "draw:custom-shape" "dr3d:scene"
*/
public NodeList getDrawingObjectElements() {
return XPathUtil.evalXPathNodeList(this, "./*[(namespace-uri()='"
+ DrawConstants.DRAW_NAMESPACE_URI + "' and local-name()='"
+ DrawConstants.ELEMENT_RECT + "') or" + "(namespace-uri()='"
+ DrawConstants.DRAW_NAMESPACE_URI + "' and local-name()='"
+ DrawConstants.ELEMENT_LINE + "') or" + "(namespace-uri()='"
+ DrawConstants.DRAW_NAMESPACE_URI + "' and local-name()='"
+ DrawConstants.ELEMENT_POLYLINE + "') or"
+ "(namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_POLYGON
+ "') or" + "(namespace-uri()='"
+ DrawConstants.DRAW_NAMESPACE_URI + "' and local-name()='"
+ DrawConstants.ELEMENT_REGULAR_POLYGON + "') or"
+ "(namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_PATH + "') or"
+ "(namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_CIRCLE
+ "') or" + "(namespace-uri()='"
+ DrawConstants.DRAW_NAMESPACE_URI + "' and local-name()='"
+ DrawConstants.ELEMENT_ELLIPSE + "') or"
+ "(namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_G + "') or"
+ "(namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_PAGE_THUMBNAIL
+ "') or" + "(namespace-uri()='"
+ DrawConstants.DRAW_NAMESPACE_URI + "' and local-name()='"
+ DrawConstants.ELEMENT_MEASURE + "') or"
+ "(namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_CAPTION
+ "') or" + "(namespace-uri()='"
+ DrawConstants.DRAW_NAMESPACE_URI + "' and local-name()='"
+ DrawConstants.ELEMENT_CONNECTOR + "') or"
+ "(namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_CUSTOM_SHAPE
+ "') or" + "(namespace-uri()='"
+ Dr3dConstants.DR3D_NAMESPACE_URI + "' and local-name()='"
+ Dr3dConstants.ELEMENT_SCENE + "')]");
}
public NotesElement getPresentationNotesElement() {
NodeList nl = XPathUtil.evalXPathNodeList(this, "./*[namespace-uri()='"
+ PresentationConstants.PRESENTATION_NAMESPACE_URI
+ "' and local-name()='" + PresentationConstants.ELEMENT_NOTES
+ "']");
if ((nl != null) && (nl.getLength() == 1))
return (NotesElement) nl.item(0);
else if ((nl != null) && (nl.getLength() > 1)) {
new ODFException(
"draw:page has more than one presentation:notes element")
.printStackTrace();
}
return null;
}
}