| /************************************************************** |
| * |
| * 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 complex.writer; |
| |
| import com.sun.star.lang.XMultiServiceFactory; |
| import com.sun.star.text.XTextDocument; |
| import com.sun.star.uno.UnoRuntime; |
| import org.junit.After; |
| import org.junit.AfterClass; |
| import org.junit.Before; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| import org.openoffice.test.OfficeConnection; |
| import static org.junit.Assert.*; |
| |
| /** |
| * |
| * @author od138299 |
| */ |
| public class CheckCrossReferences { |
| |
| private com.sun.star.container.XEnumeration xParaEnum; |
| private com.sun.star.container.XEnumeration xPortionEnum; |
| private com.sun.star.util.XRefreshable xFldsRefresh; |
| |
| public com.sun.star.text.XTextField getNextField() |
| throws com.sun.star.uno.Exception |
| { |
| if ( xPortionEnum != null ) { |
| while ( xPortionEnum.hasMoreElements() ) { |
| com.sun.star.beans.XPropertySet xPortionProps = |
| (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface( |
| com.sun.star.beans.XPropertySet.class , xPortionEnum.nextElement()); |
| final String sPortionType = |
| xPortionProps.getPropertyValue( "TextPortionType" ).toString(); |
| if ( sPortionType.equals( "TextField") ) { |
| com.sun.star.text.XTextField xField = (com.sun.star.text.XTextField)UnoRuntime.queryInterface( |
| com.sun.star.text.XTextField.class, |
| xPortionProps.getPropertyValue( "TextField" ) ); |
| assertNotNull("Cannot retrieve next field.", xField); |
| return xField; |
| } |
| } |
| } |
| |
| while ( xParaEnum.hasMoreElements() ) { |
| com.sun.star.container.XEnumerationAccess aPara = |
| (com.sun.star.container.XEnumerationAccess)UnoRuntime.queryInterface( |
| com.sun.star.container.XEnumerationAccess.class, xParaEnum.nextElement()); |
| xPortionEnum = aPara.createEnumeration(); |
| while ( xPortionEnum.hasMoreElements() ) { |
| com.sun.star.beans.XPropertySet xPortionProps = |
| (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface( |
| com.sun.star.beans.XPropertySet.class , xPortionEnum.nextElement()); |
| final String sPortionType = |
| xPortionProps.getPropertyValue( "TextPortionType" ).toString(); |
| if ( sPortionType.equals( "TextField") ) { |
| com.sun.star.text.XTextField xField = (com.sun.star.text.XTextField)UnoRuntime.queryInterface( |
| com.sun.star.text.XTextField.class, |
| xPortionProps.getPropertyValue( "TextField" ) ); |
| assertNotNull("Cannot retrieve next field.", xField); |
| return xField; |
| } |
| } |
| } |
| |
| fail("Cannot retrieve next field."); |
| return null; // unreachable |
| } |
| |
| public com.sun.star.beans.XPropertySet getFieldProps( |
| com.sun.star.text.XTextField xField ) { |
| com.sun.star.beans.XPropertySet xProps = |
| (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface( |
| com.sun.star.beans.XPropertySet.class, xField ); |
| |
| assertNotNull("Cannot retrieve field properties.", xProps); |
| |
| return xProps; |
| } |
| |
| public void checkField( com.sun.star.text.XTextField xField, |
| com.sun.star.beans.XPropertySet xProps, |
| short nFormat, |
| String aExpectedFldResult ) |
| throws com.sun.star.uno.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 com.sun.star.uno.Exception { |
| // setup paragraph enumeration |
| { |
| com.sun.star.container.XEnumerationAccess xParaEnumAccess = |
| (com.sun.star.container.XEnumerationAccess)UnoRuntime.queryInterface( |
| com.sun.star.container.XEnumerationAccess.class, document.getText()); |
| xParaEnum = xParaEnumAccess.createEnumeration(); |
| } |
| |
| // get field refresher |
| { |
| com.sun.star.text.XTextFieldsSupplier xFieldSupp = |
| (com.sun.star.text.XTextFieldsSupplier)UnoRuntime.queryInterface( |
| com.sun.star.text.XTextFieldsSupplier.class, document); |
| xFldsRefresh = (com.sun.star.util.XRefreshable)UnoRuntime.queryInterface( |
| com.sun.star.util.XRefreshable.class, xFieldSupp.getTextFields()); |
| } |
| |
| // check first reference field |
| { |
| // 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 |
| com.sun.star.text.XTextField xField = null; |
| com.sun.star.beans.XPropertySet xProps = null; |
| |
| xField = getNextField(); |
| xProps = getFieldProps( xField ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult2 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3 ); |
| |
| xField = getNextField(); |
| xProps = getFieldProps( xField ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult1 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3 ); |
| |
| xField = getNextField(); |
| xProps = getFieldProps( xField ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult3 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3 ); |
| |
| xField = getNextField(); |
| xProps = getFieldProps( xField ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult5 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6 ); |
| |
| xField = getNextField(); |
| xProps = getFieldProps( xField ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult4 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6 ); |
| |
| xField = getNextField(); |
| xProps = getFieldProps( xField ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER, FldResult6 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4 ); |
| checkField( xField, xProps, com.sun.star.text.ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6 ); |
| } |
| |
| // insert a certain cross-reference bookmark and a reference field to this bookmark |
| { |
| // restart paragraph enumeration |
| com.sun.star.container.XEnumerationAccess xParaEnumAccess = |
| (com.sun.star.container.XEnumerationAccess)UnoRuntime.queryInterface( |
| com.sun.star.container.XEnumerationAccess.class, document.getText()); |
| xParaEnum = xParaEnumAccess.createEnumeration(); |
| |
| // iterate on the paragraphs to find certain paragraph to insert the bookmark |
| com.sun.star.text.XTextRange xParaTextRange = null; |
| while ( xParaEnum.hasMoreElements() ) { |
| xParaTextRange = (com.sun.star.text.XTextRange)UnoRuntime.queryInterface( |
| com.sun.star.text.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"; |
| com.sun.star.text.XTextContent xBookmark = |
| (com.sun.star.text.XTextContent)UnoRuntime.queryInterface( |
| com.sun.star.text.XTextContent.class, |
| xFac.createInstance( "com.sun.star.text.Bookmark" ) ); |
| if ( xBookmark != null ) { |
| com.sun.star.container.XNamed xName = |
| (com.sun.star.container.XNamed)UnoRuntime.queryInterface( |
| com.sun.star.container.XNamed.class, xBookmark ); |
| xName.setName( cBookmarkName ); |
| xBookmark.attach(xParaTextRange.getStart()); |
| } |
| |
| // insert reference field, which references the inserted bookmark |
| com.sun.star.text.XTextContent xNewField = |
| (com.sun.star.text.XTextContent)UnoRuntime.queryInterface( |
| com.sun.star.text.XTextContent.class, |
| xFac.createInstance( "com.sun.star.text.TextField.GetReference" ) ); |
| if ( xNewField != null ) { |
| com.sun.star.beans.XPropertySet xFieldProps = |
| (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface( |
| com.sun.star.beans.XPropertySet.class, xNewField ); |
| xFieldProps.setPropertyValue( "ReferenceFieldPart", new Short(com.sun.star.text.ReferenceFieldPart.TEXT) ); |
| xFieldProps.setPropertyValue( "ReferenceFieldSource", new Short(com.sun.star.text.ReferenceFieldSource.BOOKMARK) ); |
| xFieldProps.setPropertyValue( "SourceName", cBookmarkName ); |
| com.sun.star.text.XTextRange xFieldTextRange = |
| (com.sun.star.text.XTextRange)UnoRuntime.queryInterface( |
| com.sun.star.text.XTextRange.class, xParaEnum.nextElement()); |
| xNewField.attach(xFieldTextRange.getEnd()); |
| xFldsRefresh.refresh(); |
| } |
| |
| // check inserted reference field |
| com.sun.star.text.XTextField xField = |
| (com.sun.star.text.XTextField)UnoRuntime.queryInterface( |
| com.sun.star.text.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 ) ); |
| } |
| } |
| |
| @Before public void setUpDocument() throws com.sun.star.uno.Exception { |
| document = util.WriterTools.loadTextDoc( |
| UnoRuntime.queryInterface( |
| XMultiServiceFactory.class, |
| connection.getComponentContext().getServiceManager()), |
| TestDocument.getUrl("CheckCrossReferences.odt")); |
| } |
| |
| @After public void tearDownDocument() { |
| util.DesktopTools.closeDoc(document); |
| } |
| |
| private XTextDocument document = null; |
| |
| @BeforeClass public static void setUpConnection() throws Exception { |
| connection.setUp(); |
| } |
| |
| @AfterClass public static void tearDownConnection() |
| throws InterruptedException, com.sun.star.uno.Exception |
| { |
| connection.tearDown(); |
| } |
| |
| private static final OfficeConnection connection = new OfficeConnection(); |
| } |