/************************************************************** | |
* | |
* 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; | |
} | |
} |