blob: 62edbca105627e9878aaf49966532f3da3b69123 [file] [log] [blame]
/**************************************************************
*
* 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));
}
}