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