| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| package fvt.uno.sw.crossreference; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| |
| import org.junit.After; |
| import org.junit.AfterClass; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.openoffice.test.common.Testspace; |
| import org.openoffice.test.uno.UnoApp; |
| |
| import com.sun.star.beans.XPropertySet; |
| import com.sun.star.container.XEnumeration; |
| import com.sun.star.container.XEnumerationAccess; |
| import com.sun.star.container.XNamed; |
| import com.sun.star.lang.XMultiServiceFactory; |
| import com.sun.star.text.ReferenceFieldPart; |
| import com.sun.star.text.ReferenceFieldSource; |
| import com.sun.star.text.XTextContent; |
| import com.sun.star.text.XTextDocument; |
| import com.sun.star.text.XTextField; |
| import com.sun.star.text.XTextFieldsSupplier; |
| import com.sun.star.text.XTextRange; |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.util.XRefreshable; |
| |
| /** |
| * |
| */ |
| public class CheckCrossReferences { |
| |
| private XEnumeration xParaEnum; |
| private XEnumeration xPortionEnum; |
| private com.sun.star.util.XRefreshable xFldsRefresh; |
| private final static UnoApp app = new UnoApp(); |
| |
| private XTextDocument document = null; |
| |
| @Before |
| public void setUpDocument() throws Exception { |
| app.start(); |
| document = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, app.loadDocument(Testspace.prepareData("uno/sw/CheckCrossReferences.odt"))); |
| } |
| |
| @After |
| public void tearDownDocument() { |
| app.closeDocument(document); |
| } |
| |
| @AfterClass |
| public static void tearDownConnection() throws InterruptedException, Exception { |
| app.close(); |
| } |
| |
| public XTextField getNextField() throws Exception { |
| if (xPortionEnum != null) { |
| while (xPortionEnum.hasMoreElements()) { |
| XPropertySet xPortionProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xPortionEnum.nextElement()); |
| final String sPortionType = xPortionProps.getPropertyValue("TextPortionType").toString(); |
| if (sPortionType.equals("TextField")) |
| return (XTextField) UnoRuntime.queryInterface(XTextField.class, xPortionProps.getPropertyValue("TextField")); |
| } |
| } |
| |
| while (xParaEnum.hasMoreElements()) { |
| XEnumerationAccess aPara = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, xParaEnum.nextElement()); |
| xPortionEnum = aPara.createEnumeration(); |
| while (xPortionEnum.hasMoreElements()) { |
| XPropertySet xPortionProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xPortionEnum.nextElement()); |
| final String sPortionType = xPortionProps.getPropertyValue("TextPortionType").toString(); |
| if (sPortionType.equals("TextField")) |
| return (XTextField) UnoRuntime.queryInterface(XTextField.class, xPortionProps.getPropertyValue("TextField")); |
| } |
| } |
| |
| return null; |
| } |
| |
| public XPropertySet getFieldProps(XTextField xField) { |
| XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xField); |
| return xProps; |
| } |
| |
| public void checkField(XTextField xField, XPropertySet xProps, short nFormat, String aExpectedFldResult) throws Exception { |
| // set requested format |
| xProps.setPropertyValue("ReferenceFieldPart", new Short(nFormat)); |
| // refresh fields in order to get new format applied |
| xFldsRefresh.refresh(); |
| String aFldResult = xField.getPresentation(false); |
| assertEquals("set reference field format doesn't result in correct field result", aExpectedFldResult, aFldResult); |
| } |
| |
| @Test |
| public void checkCrossReferences() throws Exception { |
| // setup paragraph enumeration |
| xParaEnum = ((XEnumerationAccess)UnoRuntime.queryInterface(XEnumerationAccess.class, document.getText())).createEnumeration(); |
| |
| // get field refresher |
| XTextFieldsSupplier xFieldSupp = (XTextFieldsSupplier) UnoRuntime.queryInterface(XTextFieldsSupplier.class, document); |
| xFldsRefresh = (XRefreshable) UnoRuntime.queryInterface(XRefreshable.class, xFieldSupp.getTextFields()); |
| |
| // strings for checking |
| final String FldResult1 = "*i*"; |
| final String FldResult2 = "+b+*i*"; |
| final String FldResult3 = "-1-+b+*i*"; |
| final String FldResult4 = "1."; |
| final String FldResult5 = " 1."; |
| final String FldResult6 = "A. 1."; |
| |
| // variables for current field |
| XTextField xField = null; |
| XPropertySet xProps = null; |
| |
| xField = getNextField(); |
| xProps = getFieldProps(xField); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult2); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3); |
| |
| xField = getNextField(); |
| xProps = getFieldProps(xField); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult1); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3); |
| |
| xField = getNextField(); |
| xProps = getFieldProps(xField); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult3); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3); |
| |
| xField = getNextField(); |
| xProps = getFieldProps(xField); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult5); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6); |
| |
| xField = getNextField(); |
| xProps = getFieldProps(xField); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult4); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6); |
| |
| xField = getNextField(); |
| xProps = getFieldProps(xField); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult6); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4); |
| checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6); |
| |
| // insert a certain cross-reference bookmark and a reference field to this bookmark |
| |
| // restart paragraph enumeration |
| xParaEnum = ((XEnumerationAccess)UnoRuntime.queryInterface(XEnumerationAccess.class, document.getText())).createEnumeration(); |
| |
| // iterate on the paragraphs to find certain paragraph to insert the bookmark |
| XTextRange xParaTextRange = null; |
| while (xParaEnum.hasMoreElements()) { |
| xParaTextRange = (XTextRange) UnoRuntime.queryInterface(XTextRange.class, xParaEnum.nextElement()); |
| if (xParaTextRange.getString().equals("J")) { |
| break; |
| } else { |
| xParaTextRange = null; |
| } |
| } |
| assertNotNull("Cannot find paragraph to insert cross-reference bookmark.", xParaTextRange); |
| |
| // insert bookmark |
| XMultiServiceFactory xFac = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, document); |
| final String cBookmarkName = "__RefNumPara__47114711"; |
| XTextContent xBookmark = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, xFac.createInstance("com.sun.star.text.Bookmark")); |
| |
| XNamed xName = (XNamed) UnoRuntime.queryInterface(XNamed.class, xBookmark); |
| xName.setName(cBookmarkName); |
| xBookmark.attach(xParaTextRange.getStart()); |
| |
| // insert reference field, which references the inserted bookmark |
| XTextContent xNewField = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, xFac.createInstance("com.sun.star.text.textfield.GetReference")); |
| |
| XPropertySet xFieldProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xNewField); |
| xFieldProps.setPropertyValue("ReferenceFieldPart", new Short(ReferenceFieldPart.TEXT)); |
| xFieldProps.setPropertyValue("ReferenceFieldSource", new Short(ReferenceFieldSource.BOOKMARK)); |
| xFieldProps.setPropertyValue("SourceName", cBookmarkName); |
| XTextRange xFieldTextRange = (XTextRange) UnoRuntime.queryInterface(XTextRange.class, xParaEnum.nextElement()); |
| xNewField.attach(xFieldTextRange.getEnd()); |
| xFldsRefresh.refresh(); |
| |
| // check inserted reference field |
| xField = (XTextField) UnoRuntime.queryInterface(XTextField.class, xNewField); |
| assertEquals("inserted reference field doesn't has correct field result", "J", xField.getPresentation(false)); |
| xParaTextRange.getStart().setString("Hallo new bookmark: "); |
| xFldsRefresh.refresh(); |
| assertEquals("inserted reference field doesn't has correct field result", "Hallo new bookmark: J", xField.getPresentation(false)); |
| |
| } |
| |
| } |