1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski package fvt.uno.sw.crossreference; 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski import static org.junit.Assert.assertEquals; 25*b1cdbd2cSJim Jagielski import static org.junit.Assert.assertNotNull; 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski import org.junit.After; 28*b1cdbd2cSJim Jagielski import org.junit.AfterClass; 29*b1cdbd2cSJim Jagielski import org.junit.Before; 30*b1cdbd2cSJim Jagielski import org.junit.Test; 31*b1cdbd2cSJim Jagielski import org.openoffice.test.common.Testspace; 32*b1cdbd2cSJim Jagielski import org.openoffice.test.uno.UnoApp; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet; 35*b1cdbd2cSJim Jagielski import com.sun.star.container.XEnumeration; 36*b1cdbd2cSJim Jagielski import com.sun.star.container.XEnumerationAccess; 37*b1cdbd2cSJim Jagielski import com.sun.star.container.XNamed; 38*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory; 39*b1cdbd2cSJim Jagielski import com.sun.star.text.ReferenceFieldPart; 40*b1cdbd2cSJim Jagielski import com.sun.star.text.ReferenceFieldSource; 41*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextContent; 42*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextDocument; 43*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextField; 44*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextFieldsSupplier; 45*b1cdbd2cSJim Jagielski import com.sun.star.text.XTextRange; 46*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 47*b1cdbd2cSJim Jagielski import com.sun.star.util.XRefreshable; 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski /** 50*b1cdbd2cSJim Jagielski * 51*b1cdbd2cSJim Jagielski */ 52*b1cdbd2cSJim Jagielski public class CheckCrossReferences { 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski private XEnumeration xParaEnum; 55*b1cdbd2cSJim Jagielski private XEnumeration xPortionEnum; 56*b1cdbd2cSJim Jagielski private com.sun.star.util.XRefreshable xFldsRefresh; 57*b1cdbd2cSJim Jagielski private final static UnoApp app = new UnoApp(); 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski private XTextDocument document = null; 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski @Before setUpDocument()62*b1cdbd2cSJim Jagielski public void setUpDocument() throws Exception { 63*b1cdbd2cSJim Jagielski app.start(); 64*b1cdbd2cSJim Jagielski document = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, app.loadDocument(Testspace.prepareData("uno/sw/CheckCrossReferences.odt"))); 65*b1cdbd2cSJim Jagielski } 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski @After tearDownDocument()68*b1cdbd2cSJim Jagielski public void tearDownDocument() { 69*b1cdbd2cSJim Jagielski app.closeDocument(document); 70*b1cdbd2cSJim Jagielski } 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski @AfterClass tearDownConnection()73*b1cdbd2cSJim Jagielski public static void tearDownConnection() throws InterruptedException, Exception { 74*b1cdbd2cSJim Jagielski app.close(); 75*b1cdbd2cSJim Jagielski } 76*b1cdbd2cSJim Jagielski getNextField()77*b1cdbd2cSJim Jagielski public XTextField getNextField() throws Exception { 78*b1cdbd2cSJim Jagielski if (xPortionEnum != null) { 79*b1cdbd2cSJim Jagielski while (xPortionEnum.hasMoreElements()) { 80*b1cdbd2cSJim Jagielski XPropertySet xPortionProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xPortionEnum.nextElement()); 81*b1cdbd2cSJim Jagielski final String sPortionType = xPortionProps.getPropertyValue("TextPortionType").toString(); 82*b1cdbd2cSJim Jagielski if (sPortionType.equals("TextField")) 83*b1cdbd2cSJim Jagielski return (XTextField) UnoRuntime.queryInterface(XTextField.class, xPortionProps.getPropertyValue("TextField")); 84*b1cdbd2cSJim Jagielski } 85*b1cdbd2cSJim Jagielski } 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski while (xParaEnum.hasMoreElements()) { 88*b1cdbd2cSJim Jagielski XEnumerationAccess aPara = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, xParaEnum.nextElement()); 89*b1cdbd2cSJim Jagielski xPortionEnum = aPara.createEnumeration(); 90*b1cdbd2cSJim Jagielski while (xPortionEnum.hasMoreElements()) { 91*b1cdbd2cSJim Jagielski XPropertySet xPortionProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xPortionEnum.nextElement()); 92*b1cdbd2cSJim Jagielski final String sPortionType = xPortionProps.getPropertyValue("TextPortionType").toString(); 93*b1cdbd2cSJim Jagielski if (sPortionType.equals("TextField")) 94*b1cdbd2cSJim Jagielski return (XTextField) UnoRuntime.queryInterface(XTextField.class, xPortionProps.getPropertyValue("TextField")); 95*b1cdbd2cSJim Jagielski } 96*b1cdbd2cSJim Jagielski } 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski return null; 99*b1cdbd2cSJim Jagielski } 100*b1cdbd2cSJim Jagielski getFieldProps(XTextField xField)101*b1cdbd2cSJim Jagielski public XPropertySet getFieldProps(XTextField xField) { 102*b1cdbd2cSJim Jagielski XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xField); 103*b1cdbd2cSJim Jagielski return xProps; 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski checkField(XTextField xField, XPropertySet xProps, short nFormat, String aExpectedFldResult)106*b1cdbd2cSJim Jagielski public void checkField(XTextField xField, XPropertySet xProps, short nFormat, String aExpectedFldResult) throws Exception { 107*b1cdbd2cSJim Jagielski // set requested format 108*b1cdbd2cSJim Jagielski xProps.setPropertyValue("ReferenceFieldPart", new Short(nFormat)); 109*b1cdbd2cSJim Jagielski // refresh fields in order to get new format applied 110*b1cdbd2cSJim Jagielski xFldsRefresh.refresh(); 111*b1cdbd2cSJim Jagielski String aFldResult = xField.getPresentation(false); 112*b1cdbd2cSJim Jagielski assertEquals("set reference field format doesn't result in correct field result", aExpectedFldResult, aFldResult); 113*b1cdbd2cSJim Jagielski } 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski @Test checkCrossReferences()116*b1cdbd2cSJim Jagielski public void checkCrossReferences() throws Exception { 117*b1cdbd2cSJim Jagielski // setup paragraph enumeration 118*b1cdbd2cSJim Jagielski xParaEnum = ((XEnumerationAccess)UnoRuntime.queryInterface(XEnumerationAccess.class, document.getText())).createEnumeration(); 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski // get field refresher 121*b1cdbd2cSJim Jagielski XTextFieldsSupplier xFieldSupp = (XTextFieldsSupplier) UnoRuntime.queryInterface(XTextFieldsSupplier.class, document); 122*b1cdbd2cSJim Jagielski xFldsRefresh = (XRefreshable) UnoRuntime.queryInterface(XRefreshable.class, xFieldSupp.getTextFields()); 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski // strings for checking 125*b1cdbd2cSJim Jagielski final String FldResult1 = "*i*"; 126*b1cdbd2cSJim Jagielski final String FldResult2 = "+b+*i*"; 127*b1cdbd2cSJim Jagielski final String FldResult3 = "-1-+b+*i*"; 128*b1cdbd2cSJim Jagielski final String FldResult4 = "1."; 129*b1cdbd2cSJim Jagielski final String FldResult5 = " 1."; 130*b1cdbd2cSJim Jagielski final String FldResult6 = "A. 1."; 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski // variables for current field 133*b1cdbd2cSJim Jagielski XTextField xField = null; 134*b1cdbd2cSJim Jagielski XPropertySet xProps = null; 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski xField = getNextField(); 137*b1cdbd2cSJim Jagielski xProps = getFieldProps(xField); 138*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult2); 139*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1); 140*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3); 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski xField = getNextField(); 143*b1cdbd2cSJim Jagielski xProps = getFieldProps(xField); 144*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult1); 145*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1); 146*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3); 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski xField = getNextField(); 149*b1cdbd2cSJim Jagielski xProps = getFieldProps(xField); 150*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult3); 151*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1); 152*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3); 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski xField = getNextField(); 155*b1cdbd2cSJim Jagielski xProps = getFieldProps(xField); 156*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult5); 157*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4); 158*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6); 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski xField = getNextField(); 161*b1cdbd2cSJim Jagielski xProps = getFieldProps(xField); 162*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult4); 163*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4); 164*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski xField = getNextField(); 167*b1cdbd2cSJim Jagielski xProps = getFieldProps(xField); 168*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult6); 169*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4); 170*b1cdbd2cSJim Jagielski checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6); 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski // insert a certain cross-reference bookmark and a reference field to this bookmark 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski // restart paragraph enumeration 175*b1cdbd2cSJim Jagielski xParaEnum = ((XEnumerationAccess)UnoRuntime.queryInterface(XEnumerationAccess.class, document.getText())).createEnumeration(); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski // iterate on the paragraphs to find certain paragraph to insert the bookmark 178*b1cdbd2cSJim Jagielski XTextRange xParaTextRange = null; 179*b1cdbd2cSJim Jagielski while (xParaEnum.hasMoreElements()) { 180*b1cdbd2cSJim Jagielski xParaTextRange = (XTextRange) UnoRuntime.queryInterface(XTextRange.class, xParaEnum.nextElement()); 181*b1cdbd2cSJim Jagielski if (xParaTextRange.getString().equals("J")) { 182*b1cdbd2cSJim Jagielski break; 183*b1cdbd2cSJim Jagielski } else { 184*b1cdbd2cSJim Jagielski xParaTextRange = null; 185*b1cdbd2cSJim Jagielski } 186*b1cdbd2cSJim Jagielski } 187*b1cdbd2cSJim Jagielski assertNotNull("Cannot find paragraph to insert cross-reference bookmark.", xParaTextRange); 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski // insert bookmark 190*b1cdbd2cSJim Jagielski XMultiServiceFactory xFac = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, document); 191*b1cdbd2cSJim Jagielski final String cBookmarkName = "__RefNumPara__47114711"; 192*b1cdbd2cSJim Jagielski XTextContent xBookmark = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, xFac.createInstance("com.sun.star.text.Bookmark")); 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski XNamed xName = (XNamed) UnoRuntime.queryInterface(XNamed.class, xBookmark); 195*b1cdbd2cSJim Jagielski xName.setName(cBookmarkName); 196*b1cdbd2cSJim Jagielski xBookmark.attach(xParaTextRange.getStart()); 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski // insert reference field, which references the inserted bookmark 199*b1cdbd2cSJim Jagielski XTextContent xNewField = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, xFac.createInstance("com.sun.star.text.textfield.GetReference")); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski XPropertySet xFieldProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xNewField); 202*b1cdbd2cSJim Jagielski xFieldProps.setPropertyValue("ReferenceFieldPart", new Short(ReferenceFieldPart.TEXT)); 203*b1cdbd2cSJim Jagielski xFieldProps.setPropertyValue("ReferenceFieldSource", new Short(ReferenceFieldSource.BOOKMARK)); 204*b1cdbd2cSJim Jagielski xFieldProps.setPropertyValue("SourceName", cBookmarkName); 205*b1cdbd2cSJim Jagielski XTextRange xFieldTextRange = (XTextRange) UnoRuntime.queryInterface(XTextRange.class, xParaEnum.nextElement()); 206*b1cdbd2cSJim Jagielski xNewField.attach(xFieldTextRange.getEnd()); 207*b1cdbd2cSJim Jagielski xFldsRefresh.refresh(); 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski // check inserted reference field 210*b1cdbd2cSJim Jagielski xField = (XTextField) UnoRuntime.queryInterface(XTextField.class, xNewField); 211*b1cdbd2cSJim Jagielski assertEquals("inserted reference field doesn't has correct field result", "J", xField.getPresentation(false)); 212*b1cdbd2cSJim Jagielski xParaTextRange.getStart().setString("Hallo new bookmark: "); 213*b1cdbd2cSJim Jagielski xFldsRefresh.refresh(); 214*b1cdbd2cSJim Jagielski assertEquals("inserted reference field doesn't has correct field result", "Hallo new bookmark: J", xField.getPresentation(false)); 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielski } 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski } 219