blob: 681f5ebaf725403a143910a41bbf397cb3313401 [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:
* Norimasa HAYASHIDA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.model.ui.editors.ooo.internal.util;
import org.eclipse.actf.model.dom.odf.ODFConstants.ContentType;
import org.eclipse.actf.model.dom.odf.base.DrawingObjectElement;
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.dr3d.Dr3dConstants;
import org.eclipse.actf.model.dom.odf.draw.ControlElement;
import org.eclipse.actf.model.dom.odf.draw.DrawConstants;
import org.eclipse.actf.model.dom.odf.draw.FrameElement;
import org.eclipse.actf.model.dom.odf.draw.PageElement;
import org.eclipse.actf.model.dom.odf.table.TableConstants;
import org.eclipse.actf.model.dom.odf.table.TableElement;
import org.eclipse.actf.model.dom.odf.util.converter.ODFConverter;
import org.eclipse.actf.util.xpath.XPathUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.sun.star.container.NoSuchElementException;
import com.sun.star.container.XNameAccess;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPageSupplier;
import com.sun.star.drawing.XDrawPages;
import com.sun.star.drawing.XDrawPagesSupplier;
import com.sun.star.frame.XController;
import com.sun.star.frame.XFrame;
import com.sun.star.frame.XModel;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.table.XCell;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextEmbeddedObjectsSupplier;
import com.sun.star.text.XTextGraphicObjectsSupplier;
import com.sun.star.text.XTextTable;
import com.sun.star.text.XTextTablesSupplier;
import com.sun.star.text.XTextViewCursor;
import com.sun.star.text.XTextViewCursorSupplier;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.view.XSelectionSupplier;
public class OOoNavigation {
private String _targetContentID = null;
private ODFDocument _contentXML = null;
private ContentType _fileType = null;
private XMultiServiceFactory _xMSF = null;
private XComponent _xComp = null;
public OOoNavigation(XMultiServiceFactory xMSF, XComponent xComponent) {
this._xMSF = xMSF;
this._xComp = xComponent;
}
public void setContentXML(ODFDocument contentXML){
this._contentXML = contentXML;
}
public ODFDocument getContentXML(){
return this._contentXML;
}
//TODO find Node from Browser
public void jumpToProblemPosition(Node targetNode) throws ODFException {
this._targetContentID = ((Element) targetNode).getAttribute(ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID);
if (null == this._targetContentID) {
return;
}
if (null == this._fileType) {
this._fileType = ODFUtils.getODFFileType(this._contentXML);
}
if (this._fileType==ContentType.NONE) {
return;
}
XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, this._xComp);
XController xController = xModel.getCurrentController();
// before select error content set Drawing mode
if (this._fileType == ContentType.PRESENTATION) {
OOoUIControls.setDrawingMode(_xMSF, xController);
}
String drawPrefix = this._contentXML.lookupPrefix(DrawConstants.DRAW_NAMESPACE_URI);
String dr3dPrefix = this._contentXML.lookupPrefix(Dr3dConstants.DR3D_NAMESPACE_URI);
String targetNodeName = targetNode.getNodeName();
String targetOdfNodeName = ((Element) targetNode).getAttribute(ODFConverter.OUTPUT_ATTR_ODF_TAGNAME);
if (targetNodeName.equalsIgnoreCase("img")) {
jumpToProblemImage(targetNode);
} else if (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_OBJECT)) {
jumpToProblemObject(targetNode);
} else if (targetNodeName.equalsIgnoreCase("table")) {
jumpToProblemTable(targetNode);
} else if ( (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_CAPTION))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_CIRCLE))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_CUSTOM_SHAPE))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_ELLIPSE))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_G))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_LINE))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_CONNECTOR))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_POLYGON))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_POLYLINE))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_RECT))
|| (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_REGULAR_POLYGON))
|| (targetOdfNodeName.equals(dr3dPrefix + ":" + Dr3dConstants.ELEMENT_SCENE)) ) {
jumpToProblemDrawingShape(targetNode);
} else if (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_PAGE)) {
jumpToProblemDrawingPage(targetNode);
} else if (targetOdfNodeName.equals(drawPrefix + ":" + DrawConstants.ELEMENT_CONTROL)) {
jumpToProblemFormControl(targetNode);
}
// after select error content hide UI elements
try {
XFrame xFrame = xController.getFrame();
OOoUIControls.hideUIElements(xFrame, this._xMSF);
} catch (ODFException e) {
e.printStackTrace();
}
}
private void jumpToProblemTable(Node targetNode) throws ODFException {
XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, this._xComp);
XSelectionSupplier selectionSupplier = (XSelectionSupplier) UnoRuntime.queryInterface(XSelectionSupplier.class,
xModel.getCurrentController());
if (ContentType.WRITE.equals(this._fileType)) {
XTextDocument xTextDoc = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, this._xComp);
XTextTablesSupplier xTableSupplier = (XTextTablesSupplier) UnoRuntime.queryInterface(
XTextTablesSupplier.class, xTextDoc);
XNameAccess xNameAccess = xTableSupplier.getTextTables();
try {
if (!(targetNode instanceof Element)) return;
String odfContentId = ((Element)targetNode).getAttribute(ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID);
NodeList nl = XPathUtil.evalXPathNodeList(_contentXML.getDocumentElement(),
"//*[namespace-uri()='" + TableConstants.TABLE_NAMESPACE_URI
+ "' and local-name()='" + TableConstants.ELEMENT_TABLE
+ "'][@" + ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID + "='" + odfContentId + "']");
if ((nl==null)||(nl.getLength()!=1)) return;
TableElement tableElem = (TableElement) nl.item(0);
String tableName = tableElem.getAttributeNS(TableConstants.TABLE_NAMESPACE_URI, TableConstants.ATTR_NAME);
Object oTable = xNameAccess.getByName(tableName);
XTextTable xTable = (XTextTable) UnoRuntime.queryInterface (XTextTable.class, oTable);
selectionSupplier.select(xTable);
// select whole table
XController xController = xModel.getCurrentController();
XTextViewCursorSupplier xTextViewCursorSupplier = (XTextViewCursorSupplier) UnoRuntime.queryInterface(XTextViewCursorSupplier.class, xController);
XTextViewCursor xTextViewCursor = xTextViewCursorSupplier.getViewCursor();
xTextViewCursor.collapseToStart();
XCell lastCell = xTable.getCellByName(xTable.getCellNames()[xTable.getCellNames().length - 1]);
selectionSupplier.select(lastCell);
xTextViewCursor.gotoStart(true);
} catch (NoSuchElementException e) {
e.printStackTrace();
throw new ODFException(e.getMessage());
} catch (WrappedTargetException e) {
e.printStackTrace();
throw new ODFException(e.getMessage());
} catch (IllegalArgumentException e) {
e.printStackTrace();
throw new ODFException(e.getMessage());
}
}
}
private void jumpToProblemImage(Node targetNode) throws ODFException {
XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, this._xComp);
XSelectionSupplier selectionSupplier = (XSelectionSupplier) UnoRuntime.queryInterface(XSelectionSupplier.class, xModel.getCurrentController());
if (!(targetNode instanceof Element)) return;
String odfContentId = ((Element)targetNode).getAttribute(ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID);
NodeList nl = XPathUtil.evalXPathNodeList(_contentXML.getDocumentElement(),
"//*[@" + ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID + "='" + odfContentId + "']");
if ((nl==null)||(nl.getLength()!=1)) return;
if (!(nl.item(0) instanceof ODFElement)) return;
Node parent = nl.item(0).getParentNode();
if (!(parent instanceof FrameElement)) return;
FrameElement frameElem = (FrameElement) parent;
String drawName = frameElem.getAttributeNS(DrawConstants.DRAW_NAMESPACE_URI, DrawConstants.ATTR_NAME);
if (drawName==null) return;
Object xDoc = UnoRuntime.queryInterface(XTextDocument.class, this._xComp);
if ((xDoc!=null)&&(xDoc instanceof XTextDocument)) {
XTextDocument xTextDoc = (XTextDocument) xDoc;
XTextGraphicObjectsSupplier xGraphicSupplier = (XTextGraphicObjectsSupplier) UnoRuntime.queryInterface(XTextGraphicObjectsSupplier.class, xTextDoc);
XNameAccess xNameAccess = xGraphicSupplier.getGraphicObjects();
try {
Object obj = xNameAccess.getByName(drawName);
selectionSupplier.select(obj);
return;
} catch (NoSuchElementException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
Object xPageSupplier = UnoRuntime.queryInterface(XDrawPagesSupplier.class, this._xComp);
if ((xPageSupplier!=null)&&(xPageSupplier instanceof XDrawPagesSupplier)) {
XDrawPagesSupplier xDrawPagesSupplier = (XDrawPagesSupplier) xPageSupplier;
int zIndex = (int) frameElem.getZIndex();
int pageIndex = (int) frameElem.getPageIndex();
if ((zIndex!=-1)&&(pageIndex!=-1)) {
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
try {
Object xPage = UnoRuntime.queryInterface(XDrawPage.class, xDrawPages.getByIndex(pageIndex));
if ((xPage!=null)&&(xPage instanceof XDrawPage)) {
XDrawPage xDrawPage = (XDrawPage) xPage;
Object obj = xDrawPage.getByIndex(zIndex);
selectionSupplier.select(obj);
return;
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
return;
}
private void jumpToProblemObject(Node targetNode) throws ODFException {
XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, this._xComp);
XSelectionSupplier selectionSupplier = (XSelectionSupplier) UnoRuntime.queryInterface(XSelectionSupplier.class, xModel.getCurrentController());
if (!(targetNode instanceof Element)) return;
String odfContentId = ((Element)targetNode).getAttribute(ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID);
NodeList nl = XPathUtil.evalXPathNodeList(_contentXML.getDocumentElement(),
"//*[@" + ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID + "='" + odfContentId + "']");
if ((nl==null)||(nl.getLength()!=1)) return;
if (!(nl.item(0) instanceof ODFElement)) return;
Node parent = nl.item(0).getParentNode();
if (!(parent instanceof FrameElement)) return;
FrameElement frameElem = (FrameElement) parent;
String drawName = frameElem.getAttributeNS(DrawConstants.DRAW_NAMESPACE_URI, DrawConstants.ATTR_NAME);
if (drawName==null) return;
Object xDoc = UnoRuntime.queryInterface(XTextDocument.class, this._xComp);
if ((xDoc!=null)&&(xDoc instanceof XTextDocument)) {
XTextDocument xTextDoc = (XTextDocument) xDoc;
XTextEmbeddedObjectsSupplier xGraphicSupplier = (XTextEmbeddedObjectsSupplier) UnoRuntime.queryInterface(XTextEmbeddedObjectsSupplier.class, xTextDoc);
XNameAccess xNameAccess = xGraphicSupplier.getEmbeddedObjects();
try {
Object obj = xNameAccess.getByName(drawName);
selectionSupplier.select(obj);
return;
} catch (NoSuchElementException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
Object xPageSupplier = UnoRuntime.queryInterface(XDrawPagesSupplier.class, this._xComp);
if ((xPageSupplier!=null)&&(xPageSupplier instanceof XDrawPagesSupplier)) {
XDrawPagesSupplier xDrawPagesSupplier = (XDrawPagesSupplier) xPageSupplier;
int zIndex = (int) frameElem.getZIndex();
int pageIndex = (int) frameElem.getPageIndex();
if ((zIndex!=-1)&&(pageIndex!=-1)) {
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
try {
Object xPage = UnoRuntime.queryInterface(XDrawPage.class, xDrawPages.getByIndex(pageIndex));
if ((xPage!=null)&&(xPage instanceof XDrawPage)) {
XDrawPage xDrawPage = (XDrawPage) xPage;
Object obj = xDrawPage.getByIndex(zIndex);
selectionSupplier.select(obj);
return;
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
return;
}
private void jumpToProblemDrawingShape(Node targetNode) throws ODFException {
try {
XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, this._xComp);
XSelectionSupplier selectionSupplier = (XSelectionSupplier) UnoRuntime.queryInterface(XSelectionSupplier.class, xModel.getCurrentController());
if (!(targetNode instanceof Element)) return;
String odfContentId = ((Element)targetNode).getAttribute(ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID);
NodeList nl = XPathUtil.evalXPathNodeList(_contentXML.getDocumentElement(),
"//*[@" + ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID + "='" + odfContentId + "']");
if ((nl==null)||(nl.getLength()!=1)) return;
if (!(nl.item(0) instanceof DrawingObjectElement)) return;
DrawingObjectElement shapeElem = (DrawingObjectElement) nl.item(0);
int zIndex = (int) shapeElem.getZIndex();
if( zIndex >= 0 ) {
Object xPageSupplier = UnoRuntime.queryInterface(XDrawPageSupplier.class, this._xComp);
if (xPageSupplier instanceof XDrawPageSupplier) {
XDrawPageSupplier xDrawPageSupplier = (XDrawPageSupplier)xPageSupplier;
XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage();
if( null != xDrawPage ) {
try {
Object obj = xDrawPage.getByIndex(zIndex);
selectionSupplier.select(obj);
return;
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
}
}
}
Object xPagesSupplier = UnoRuntime.queryInterface(XDrawPagesSupplier.class, this._xComp);
if ((xPagesSupplier!=null)&&(xPagesSupplier instanceof XDrawPagesSupplier)) {
XDrawPagesSupplier xDrawPagesSupplier = (XDrawPagesSupplier) xPagesSupplier;
int pageIndex = (int) shapeElem.getPageIndex();
if ((zIndex!=-1)&&(pageIndex!=-1)) {
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
try {
Object xPage = UnoRuntime.queryInterface(XDrawPage.class, xDrawPages.getByIndex(pageIndex));
if ((xPage!=null)&&(xPage instanceof XDrawPage)) {
XDrawPage xDrawPage = (XDrawPage) xPage;
Object obj = xDrawPage.getByIndex(zIndex);
selectionSupplier.select(obj);
return;
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
}
}
}
}
} catch (IllegalArgumentException iae) {
iae.printStackTrace();
throw new ODFException(iae.getMessage());
}
}
private void jumpToProblemDrawingPage(Node targetNode) throws ODFException {
try {
XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, this._xComp);
XSelectionSupplier selectionSupplier = (XSelectionSupplier) UnoRuntime.queryInterface(XSelectionSupplier.class, xModel.getCurrentController());
if (ContentType.PRESENTATION.equals(this._fileType)) {
if (!(targetNode instanceof Element)) return;
String odfContentId = ((Element)targetNode).getAttribute(ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID);
NodeList nl = XPathUtil.evalXPathNodeList(_contentXML.getDocumentElement(),
"//*[namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_PAGE
+ "'][@" + ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID + "='" + odfContentId + "']");
if ((nl==null)||(nl.getLength()!=1)) return;
if (nl.item(0) instanceof PageElement) {
PageElement pageElem = (PageElement) nl.item(0);
int pageIndex = (int) pageElem.getPageIndex();
XDrawPage xDrawPage = ODFUtils.getDrawPageByIndex(this._xComp, pageIndex);
selectionSupplier.select(xDrawPage);
return;
}
}
} catch (IllegalArgumentException iae) {
iae.printStackTrace();
throw new ODFException(iae.getMessage());
}
}
private void jumpToProblemFormControl(Node targetNode) throws ODFException {
try {
XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, this._xComp);
XSelectionSupplier selectionSupplier = (XSelectionSupplier) UnoRuntime.queryInterface(XSelectionSupplier.class, xModel.getCurrentController());
if (!(targetNode instanceof Element)) return;
String odfContentId = ((Element)targetNode).getAttribute(ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID);
NodeList nl = XPathUtil.evalXPathNodeList(_contentXML.getDocumentElement(),
"//*[namespace-uri()='" + DrawConstants.DRAW_NAMESPACE_URI
+ "' and local-name()='" + DrawConstants.ELEMENT_CONTROL
+ "'][@" + ODFConverter.OUTPUT_ATTR_ODF_CONTENT_ID + "='" + odfContentId + "']");
if ((nl==null)||(nl.getLength()!=1)) return;
if (!(nl.item(0) instanceof ControlElement)) return;
ControlElement elem = (ControlElement) nl.item(0);
int zIndex = (int)elem.getZIndex();
if( zIndex >= 0 ) {
Object xPageSupplier = UnoRuntime.queryInterface(XDrawPageSupplier.class, this._xComp);
if (xPageSupplier instanceof XDrawPageSupplier) {
XDrawPageSupplier xDrawPageSupplier = (XDrawPageSupplier)xPageSupplier;
XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage();
if( null != xDrawPage ) {
try {
Object obj = xDrawPage.getByIndex(zIndex);
selectionSupplier.select(obj);
return;
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
}
}
}
Object xPagesSupplier = UnoRuntime.queryInterface(XDrawPagesSupplier.class, this._xComp);
if ((xPagesSupplier!=null)&&(xPagesSupplier instanceof XDrawPagesSupplier)) {
XDrawPagesSupplier xDrawPagesSupplier = (XDrawPagesSupplier) xPagesSupplier;
int pageIndex = (int) elem.getPageIndex();
if ((zIndex!=-1)&&(pageIndex!=-1)) {
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
try {
Object xPage = UnoRuntime.queryInterface(XDrawPage.class, xDrawPages.getByIndex(pageIndex));
if ((xPage!=null)&&(xPage instanceof XDrawPage)) {
XDrawPage xDrawPage = (XDrawPage) xPage;
Object obj = xDrawPage.getByIndex(zIndex);
selectionSupplier.select(obj);
return;
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
}
}
}
}
} catch (IllegalArgumentException iae) {
iae.printStackTrace();
throw new ODFException(iae.getMessage());
}
}
}