1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 package fvt.uno.sw.field;
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertTrue;
24 
25 import org.junit.After;
26 import org.junit.AfterClass;
27 import org.junit.Before;
28 import org.junit.BeforeClass;
29 import org.junit.Test;
30 import org.openoffice.test.common.Testspace;
31 import org.openoffice.test.uno.UnoApp;
32 
33 import testlib.uno.SWUtil;
34 
35 import com.sun.star.beans.XPropertySet;
36 import com.sun.star.container.XEnumeration;
37 import com.sun.star.container.XEnumerationAccess;
38 import com.sun.star.lang.XMultiServiceFactory;
39 import com.sun.star.style.NumberingType;
40 import com.sun.star.text.XTextDocument;
41 import com.sun.star.text.XTextField;
42 import com.sun.star.text.XTextFieldsSupplier;
43 import com.sun.star.uno.UnoRuntime;
44 
45 
46 public class PageNumberField {
47 
48 	private static final UnoApp app = new UnoApp();
49 	private static XTextDocument odtDocument = null;
50 	private static XTextDocument docDocument = null;
51 	private  static String odtSample = "uno/sw/field/PageNumberFieldTest.odt";
52 	private static String docSample = "uno/sw/field/PageNumberFieldTest.doc";
53 
54 	private  static String odtSaveAsDocSample = "uno/sw/field/PageNumberFieldTest_1.doc";
55 	private static String docSaveAsODTSample = "uno/sw/field/PageNumberFieldTest_1.odt";
56 
57 	@Before
58 	public void setUpDocument() throws Exception {
59 
60 	}
61 
62 	@After
63 	public void tearDownDocument() {
64 
65 
66 	}
67 	@BeforeClass
68 	public static void setUpConnection() throws Exception {
69 		app.start();
70 	}
71 
72 
73 	@AfterClass
74 	public static void tearDownConnection() throws InterruptedException,
75 			Exception {
76 		app.close();
77 	}
78 	/**
79 	 * There is a bug : Bug 120625
80 	 * Test Page Number Field Can created and Saved in odt file
81 	 * 1.launch a odt document
82 	 * 2.Create a page number field at end of this page
83 	 * 3.Save and Reopen this document
84 	 * 4.Save it as doc format and reload
85 	 * @throws Throwable
86 	 */
87 	@Test
88 
89 	public void testPageNumberFieldODT() throws Throwable {
90 		odtDocument = SWUtil.openDocument(Testspace.prepareData(odtSample), app);
91 		createPageNumberFiled(odtDocument);
92 		int pageNumber = getPageNumber(odtDocument);
93 		assertEquals("Verify page number created in exist odt sample file.", 3, pageNumber);
94 		odtDocument = SWUtil.saveAndReload(odtDocument, app);
95 		assertTrue("Test page number field still exist after odt sample file saved", isContainPageNumberField(odtDocument));
96 		pageNumber = getPageNumber(odtDocument);
97 		assertEquals("Verify page number value still exist after saved.", 3, pageNumber);
98 		SWUtil.saveAsDoc(odtDocument, Testspace.getUrl(odtSaveAsDocSample));
99 		app.closeDocument(odtDocument);
100 		docDocument = SWUtil.openDocumentFromURL(Testspace.getUrl(odtSaveAsDocSample), app);
101 
102 		assertTrue("Test page number field still exist after odt sample file save as doc format", isContainPageNumberField(docDocument));
103 		pageNumber = getPageNumber(docDocument);
104 		assertEquals("Verify page number value still exist after saved as doc format.", 3, pageNumber);
105 		app.closeDocument(docDocument);
106 	}
107 
108 	/**
109 	 * Bug 120625
110 	 * Test Page Number Field Can created and Saved in Doc file
111 	 * 1.launch a doc document
112 	 * 2.Create a page number field at end of this page
113 	 * 3.Save and Reopen this document, check page number field
114 	 * 3.Save as odt format and reload
115 	 * @throws Throwable
116 	 */
117 	@Test
118 	public void testPageNumberFieldDOC() throws Throwable {
119 		docDocument = SWUtil.openDocument(Testspace.prepareData(docSample), app);
120 		createPageNumberFiled(docDocument);
121 		int pageNumber = getPageNumber(docDocument);
122 		assertEquals("Verify page number created in exist doc sample file.", 2, pageNumber);
123 		docDocument = SWUtil.saveAndReload(docDocument, app);
124 		assertTrue("Test page number field still exist after doc sample file saved", isContainPageNumberField(docDocument));
125 		pageNumber = getPageNumber(docDocument);
126 		assertEquals("Verify page number value still exist after saved.", 2, pageNumber);
127 		SWUtil.saveAsODT(docDocument, Testspace.getUrl(docSaveAsODTSample));
128 		app.closeDocument(docDocument);
129 		odtDocument = SWUtil.openDocumentFromURL(Testspace.getUrl(docSaveAsODTSample), app);
130 
131 		assertTrue("Test page number field still exist after doc sample file save as odt format", isContainPageNumberField(odtDocument));
132 		pageNumber = getPageNumber(odtDocument);
133 		assertEquals("Verify page number value still exist after saved as doc format.", 2, pageNumber);
134 		app.closeDocument(odtDocument);
135 	}
136 
137 
138 
139 	/**
140 	 * Create a page number field at end of this document
141 	 * @param document
142 	 * @throws Exception
143 	 */
144 	private void createPageNumberFiled(XTextDocument document) throws Exception {
145 		XMultiServiceFactory sevriceFactory = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, document);
146 		XTextField  pageNumberFiled = (XTextField)UnoRuntime.queryInterface(XTextField.class, sevriceFactory.createInstance("com.sun.star.text.textfield.PageNumber"));
147 
148 		XPropertySet props = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, pageNumberFiled);
149 		props.setPropertyValue("NumberingType", NumberingType.ARABIC);//Set page number display as Arabic
150 
151 		SWUtil.moveCuror2End(document);
152 		document.getText().insertTextContent(document.getText().getEnd(), pageNumberFiled, true);
153 
154 
155 	}
156 	/**
157 	 * Get the page number by getText
158 	 * This page number is at end of this document
159 	 * @param document
160 	 * @return
161 	 */
162 	private int getPageNumber(XTextDocument document) {
163 		try {
164 			Thread.sleep(1000); //sleep before get page number field, there is a bug:120625
165 		} catch (InterruptedException e) {
166 			e.printStackTrace();
167 		}
168 		String documentString = document.getText().getString().trim();
169 		int length = documentString.length();
170 		String strNum = String.valueOf(documentString.charAt(length -1));
171 		int number = Integer.valueOf(strNum);
172 		return number;
173 	}
174 
175 
176 	/**
177 	 * Check is contain page number field
178 	 * @param document
179 	 * @throws Exception
180 	 */
181 	private boolean isContainPageNumberField(XTextDocument document) throws Exception {
182 		XTextFieldsSupplier fieldsSupplier = (XTextFieldsSupplier) UnoRuntime.queryInterface(XTextFieldsSupplier.class, document);
183 		XEnumerationAccess xEnumeratedFields = fieldsSupplier.getTextFields();
184 		XEnumeration enumeration = xEnumeratedFields.createEnumeration();
185 		while (enumeration.hasMoreElements()) {
186 			  	Object field =  enumeration.nextElement();
187 				XPropertySet props = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, field);
188 				short numberType = (Short) props.getPropertyValue("NumberingType");
189 			    return numberType == 4;
190 
191 		}
192 		return false;
193 
194 	}
195 }
196