/************************************************************** * * 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.breaks; import static org.openoffice.test.common.Testspace.*; import java.io.File; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.Assert; import org.openoffice.test.common.FileUtil; import org.openoffice.test.uno.UnoApp; import testlib.uno.SWUtil; import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextCursor; import com.sun.star.text.XText; import com.sun.star.text.ControlCharacter; import com.sun.star.text.XTextViewCursor; import com.sun.star.text.XPageCursor; import com.sun.star.text.XTextViewCursorSupplier; import com.sun.star.style.BreakType; import com.sun.star.beans.XPropertySet; import com.sun.star.frame.*; import com.sun.star.uno.UnoRuntime; import com.sun.star.lang.XComponent; public class CheckBreaks { UnoApp unoApp = new UnoApp(); XTextDocument textDocument = null; File temp = null; String tempFilePathODT = ""; String tempFilePathDOC = ""; /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { unoApp.start(); FileUtil.deleteFile(getPath("temp")); temp = new File(getPath("temp")); temp.mkdirs(); tempFilePathODT = temp + "/tempFilePathODT.odt"; tempFilePathDOC = temp + "/tempFilePathDOC.doc"; } @After public void tearDown() throws Exception { unoApp.close(); } /** * test line break can be inserted and deleted. * when save it as odt file, close and reopen, line break can be inserted and deleted. * when save it as doc file, close and reopen, line break can be inserted and deleted. * \n represent line break * @throws Exception */ @Test public void testInsertDeleteLineBreak() throws Exception { XComponent xComponent = unoApp.newDocument("swriter"); textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, xComponent); this.insertNewLine(textDocument, "Line1", true); this.insertNewLine(textDocument, "Line2", false); this.insertNewLine(textDocument, "Line3", false); this.insertNewLine(textDocument, "Line4", false); int lineCount = this.getLineCount(textDocument); Assert.assertEquals("Line break is inserted when new document.",4,lineCount); this.deleteLineBreak(textDocument); lineCount = this.getLineCount(textDocument); Assert.assertEquals("Line break is deleted when new document", 3,lineCount); //save to odt, test the line break SWUtil.saveAsODT(textDocument, FileUtil.getUrl(tempFilePathODT)); unoApp.closeDocument(xComponent); xComponent = unoApp.loadDocument(tempFilePathODT); textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class,xComponent); lineCount = this.getLineCount(textDocument); Assert.assertEquals("Line breaks when open saved odt file.",3,lineCount); this.insertNewLine(textDocument, "Line added when open saved odt file", false); lineCount = this.getLineCount(textDocument); Assert.assertEquals("Line break is inserted when open saved odt file.",4,lineCount); this.deleteLineBreak(textDocument); lineCount = this.getLineCount(textDocument); Assert.assertEquals("Line break is deleted when open saved odt file.",3,lineCount); //save to doc, test the line break SWUtil.saveAs(textDocument, "MS Word 97", FileUtil.getUrl(tempFilePathDOC)); unoApp.closeDocument(xComponent); xComponent = unoApp.loadDocument(tempFilePathDOC); textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class,xComponent); lineCount = this.getLineCount(textDocument); Assert.assertEquals("Line breaks when open saved doc file.",3,lineCount); this.insertNewLine(textDocument, "Line added when open saved doc file", false); lineCount = this.getLineCount(textDocument); Assert.assertEquals("Line break is inserted when open saved doc file.",4,lineCount); this.deleteLineBreak(textDocument); lineCount = this.getLineCount(textDocument); Assert.assertEquals("Line break is deleted when open saved doc file.",3,lineCount); unoApp.closeDocument(xComponent); } @Test public void testInsertDeletePageBreak() throws Exception { //new document, test page break XComponent xComponent = unoApp.newDocument("swriter"); textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, xComponent); this.insertNewPage(textDocument, "Page1", true); this.insertNewPage(textDocument, "Page2", false); this.insertNewPage(textDocument, "Page3", false); int pageCount = SWUtil.getPageCount(textDocument); Assert.assertEquals("page break is inserted when new document", 3,pageCount); this.deleteFirstPage(textDocument); pageCount = SWUtil.getPageCount(textDocument); Assert.assertEquals("page break is deleted when new document", 2,pageCount); //save as odt, test page break SWUtil.saveAsODT(textDocument, FileUtil.getUrl(tempFilePathODT)); unoApp.closeDocument(xComponent); xComponent = unoApp.loadDocument(tempFilePathODT); textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class,xComponent); pageCount = SWUtil.getPageCount(textDocument); Assert.assertEquals("Page breaks after open saved odt file", 2,pageCount); this.insertNewPage(textDocument, "Page4", false); pageCount = SWUtil.getPageCount(textDocument); Assert.assertEquals("page break is inserted after open saved odt file", 3,pageCount); this.deleteFirstPage(textDocument); pageCount = SWUtil.getPageCount(textDocument); Assert.assertEquals("page break is deleted after open saved odt file.", 2,pageCount); //save as doc, test page break SWUtil.saveAs(textDocument, "MS Word 97", FileUtil.getUrl(tempFilePathDOC)); unoApp.closeDocument(xComponent); xComponent = unoApp.loadDocument(tempFilePathDOC); textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class,xComponent); pageCount = SWUtil.getPageCount(textDocument); Assert.assertEquals("Page breaks after open saved doc file", 2,pageCount); this.deleteFirstPage(textDocument); pageCount = SWUtil.getPageCount(textDocument); Assert.assertEquals("page break is deleted after open saved doc file.", 1,pageCount); this.insertNewPage(textDocument, "Page5", false); pageCount = SWUtil.getPageCount(textDocument); Assert.assertEquals("page break is inserted after open saved doc file", 2,pageCount); unoApp.closeDocument(xComponent); } /** * insert a new page at the end of the document * @param xTextDocument * @param pageContent * @param isFirstPage * @throws Exception */ private void insertNewPage(XTextDocument document, String pageContent, Boolean isFirstPage) throws Exception { XText xText = document.getText(); XTextCursor textCursor = xText.createTextCursor(); textCursor.gotoEnd(false); System.out.println("The content before insert " + pageContent + ":" + xText.getString()); if(!isFirstPage) { XPropertySet xCursorProps = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, textCursor); xCursorProps.setPropertyValue("BreakType", BreakType.PAGE_AFTER); document.getText().insertControlCharacter(textCursor,ControlCharacter.PARAGRAPH_BREAK,false); } document.getText().insertString(textCursor, pageContent, false); } /** * delete the first page of the document * @param document * @throws Exception */ private void deleteFirstPage(XTextDocument document) throws Exception { XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, document); XController xController = xModel.getCurrentController(); XTextViewCursorSupplier xTextViewCursorSupplier = (XTextViewCursorSupplier) UnoRuntime.queryInterface(XTextViewCursorSupplier.class, xController); XTextViewCursor textViewCursor = xTextViewCursorSupplier.getViewCursor(); XPageCursor pageCursor = (XPageCursor) UnoRuntime.queryInterface(XPageCursor.class, textViewCursor); // Move the cursor to the start of the document textViewCursor.gotoStart(false); pageCursor.jumpToFirstPage(); XTextCursor textCursor = textViewCursor.getText().createTextCursorByRange(textViewCursor.getStart()); pageCursor.jumpToEndOfPage(); textCursor.gotoRange(textViewCursor.getEnd(), true); //System.out.println("deleted: " + textCursor.getString()); textCursor.setString(""); // Page contents cleared, now delete the page break at the start textCursor.collapseToStart(); if(textCursor.goRight((short) 1, true)){ //System.out.println("page break deleted: " + textCursor.getString()); textCursor.setString(""); } } /** * insert a new line at the end of the document. * @param xText * @param lineContent * @param isFirstLine * @throws Exception */ private void insertNewLine(XTextDocument xTextDocument, String lineContent, Boolean isFirstLine) throws Exception { XText xText = xTextDocument.getText(); XTextCursor xTextCursor = xText.createTextCursor(); xTextCursor.gotoEnd(false); if(!isFirstLine) { xText.insertControlCharacter(xTextCursor, ControlCharacter.LINE_BREAK, false); } xText.insertString(xTextCursor, lineContent, false); } /** * delete first line break * @param xText * @throws Exception */ private void deleteLineBreak(XTextDocument xTextDocument) throws Exception { XText xText = xTextDocument.getText(); String content = xText.getString(); content = content.replaceFirst("\n", ""); xText.setString(content); } /** * get line count of all text. * \n represent line break. * @param xText * @return count of line breaks * @throws Exception */ private int getLineCount(XTextDocument xTextDocument) throws Exception { int count = 1; XText xText = xTextDocument.getText(); String content = xText.getString(); int index = content.indexOf("\n"); while(index >=0) { count ++; content = content.substring(index+1); index = content.indexOf("\n"); } return count; } }