/**************************************************************
 * 
 * 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 testlib.uno;


import org.openoffice.test.common.FileUtil;
import org.openoffice.test.uno.UnoApp;

import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XNameAccess;
import com.sun.star.container.XNameContainer;
import com.sun.star.container.XNamed;
import com.sun.star.document.XDocumentProperties;
import com.sun.star.document.XDocumentPropertiesSupplier;
import com.sun.star.frame.XStorable;
import com.sun.star.io.IOException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.style.BreakType;
import com.sun.star.style.XStyle;
import com.sun.star.style.XStyleFamiliesSupplier;
import com.sun.star.text.ControlCharacter;
import com.sun.star.text.XText;
import com.sun.star.text.XTextContent;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextDocument;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XModel;
import com.sun.star.frame.XController;
import com.sun.star.uno.UnoRuntime;

public class SWUtil {
	



	public static void saveAsDoc(XTextDocument document, String url) throws IOException {
 		saveAs(document, "MS Word 97", url);
 		
 	}
 
	public static void saveAsDoc(XComponent component, String url) throws IOException{
		XTextDocument document = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, component);
		saveAs(document, "MS Word 97", url);		
	}

	public static void saveAsODT(XTextDocument document, String url) throws IOException {
 		saveAs(document, "writer8", url);
 	}

	public static void saveAs(XTextDocument document, String filterValue, String url) throws IOException {
		XStorable store = (XStorable) UnoRuntime.queryInterface(XStorable.class, document);
 		PropertyValue[] propsValue = new PropertyValue[1];
 		propsValue[0] = new PropertyValue();
 		propsValue[0].Name = "FilterName";
 		propsValue[0].Value = filterValue;
		store.storeAsURL(url, propsValue);
		
 	}
	
	public static void save(XTextDocument document) throws IOException {
 		XStorable store = (XStorable) UnoRuntime.queryInterface(XStorable.class, document);
		store.store();
	}
	
	public static XTextDocument saveAndReload(XTextDocument document, UnoApp app) throws Exception {
 		XStorable store = (XStorable) UnoRuntime.queryInterface(XStorable.class, document);
		store.store();
		String url = document.getURL();
		app.closeDocument(document);
		return openDocumentFromURL(url, app);
		
	}
	
	public static XTextDocument newDocument(UnoApp app) throws Exception {
		return (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, app.newDocument("swriter"));
		
 	}
	
	public static XTextDocument openDocumentFromURL(String url, UnoApp app) throws Exception {
		return (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, app.loadDocumentFromURL(url));
		
	}
	public static XTextDocument openDocument(String filePath, UnoApp app) throws Exception {
		
		return (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, app.loadDocument(filePath));
		
	}

	public static void moveCuror2End(XTextDocument document) {
		XText xText = document.getText();
		XTextCursor xTextCursor = xText.createTextCursor();	
		xTextCursor.gotoEnd(false);	
	}
	
	public static void moveCuror2Start(XTextDocument document) {
		XText xText = document.getText();
		XTextCursor xTextCursor = xText.createTextCursor();	
		xTextCursor.gotoStart(false);	
	}
	
	/**
	 * Set document properties. Only supported: subject, title, author
	 * @param document - set document information on this document
	 * @param prop - document information, including "Subject" ,"Title", "Author"
	 * @param propValue - value you want to set for prop
	 * @throws Exception
	 */
	public static void setDocumentProperty(XTextDocument document, String prop, String propValue) throws Exception {
       XDocumentPropertiesSupplier docPropsSupplier = UnoRuntime.queryInterface(
            XDocumentPropertiesSupplier.class, document);
       XDocumentProperties docProps = docPropsSupplier.getDocumentProperties();
        if ( prop.equals("Title"))
            docProps.setTitle(propValue);
        else if ( prop.equals("Author"))
            docProps.setAuthor(propValue);
        else if ( prop.equals("Subject"))
            docProps.setSubject(propValue);
    }
	

	/**
	 * Insert a bookmark into text document
	 * @param document text document
	 * @param textCursor which part will be bookmarked
	 * @param bookmarkName bookmark name
	 * @throws Exception
	 */
	public static void insertBookmark(XTextDocument document, XTextCursor textCursor, String bookmarkName) throws Exception {
		XMultiServiceFactory xDocFactory = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, document);
		Object xBookmark = xDocFactory.createInstance("com.sun.star.text.Bookmark");
		XTextContent xBookmarkAsTextContent = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, xBookmark);
		XNamed xBookmarkAsNamed = (XNamed) UnoRuntime.queryInterface(XNamed.class, xBookmark);
		xBookmarkAsNamed.setName(bookmarkName);
		document.getText().insertTextContent(textCursor, xBookmarkAsTextContent, true);
	}
	
	/**
	 * insert column break in current cursor
	 * @param xText
	 * @param currentCursor
	 * @throws Exception
	 */
	public static void insertColumnBreak(XText xText, XTextCursor currentCursor) throws Exception
	{
		XPropertySet xCursorProps = (XPropertySet)UnoRuntime.queryInterface(
		        XPropertySet.class, currentCursor);
		xCursorProps.setPropertyValue("BreakType", BreakType.COLUMN_AFTER);		
	    xText.insertControlCharacter(currentCursor,ControlCharacter.PARAGRAPH_BREAK,false); 
	}
	
	/**
	 * insert page break in current cursor
	 * @param xText
	 * @param currentCursor
	 * @throws Exception
	 */
	public static void insertPageBreak(XText xText, XTextCursor currentCursor) throws Exception
	{
		XPropertySet xCursorProps = (XPropertySet)UnoRuntime.queryInterface(
		        XPropertySet.class, currentCursor);
		xCursorProps.setPropertyValue("BreakType", BreakType.PAGE_AFTER);		
	    xText.insertControlCharacter(currentCursor,ControlCharacter.PARAGRAPH_BREAK,false); 
	}	
	
	
	/**
	 * get page count
	 * @param document
	 * @return
	 * @throws Exception
	 */
	public static int getPageCount(XTextDocument document) throws Exception
	{
		XModel xmodel = (XModel)UnoRuntime.queryInterface(XModel.class, document);
		XController xcont = xmodel.getCurrentController();

		XPropertySet xps = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xcont);
		Integer pageCount = (Integer) xps.getPropertyValue("PageCount"); 
		return pageCount.intValue();
	}	
	
	
	/**
	 * get specific property value of the default page style
	 * @param xComponent
	 * @param propertyName
	 * @return
	 * @throws Exception
	 */
	public static Object getDefaultPageStyleProperty(XComponent xComponent, String propertyName) throws Exception
	{
		XTextDocument textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, xComponent);
		XStyleFamiliesSupplier xSupplier = (XStyleFamiliesSupplier)UnoRuntime.queryInterface(XStyleFamiliesSupplier.class, textDocument);	     
        XNameAccess xFamilies = (XNameAccess) UnoRuntime.queryInterface (XNameAccess.class, xSupplier.getStyleFamilies());        
        XNameContainer xFamily = (XNameContainer) UnoRuntime.queryInterface(XNameContainer.class, xFamilies.getByName("PageStyles"));        
        XStyle xStyle = (XStyle)UnoRuntime.queryInterface(XStyle.class, xFamily.getByName("Default"));     
        XPropertySet xStyleProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xStyle);  
        Object propertyValue = xStyleProps.getPropertyValue(propertyName.toString());
        return propertyValue;       
	}
	
	/**
	 * set value for specific property of default page style.
	 * @param xComponent
	 * @param propertyName
	 * @param propertyValue
	 * @throws Exception
	 */
	public static void setDefaultPageStyleProperty(XComponent xComponent, String propertyName, Object propertyValue) throws Exception
	{
		XTextDocument textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, xComponent);		
        XStyleFamiliesSupplier xSupplier = (XStyleFamiliesSupplier)UnoRuntime.queryInterface(XStyleFamiliesSupplier.class, textDocument);     
        XNameAccess xFamilies = (XNameAccess) UnoRuntime.queryInterface (XNameAccess.class, xSupplier.getStyleFamilies());        
        XNameContainer xFamily = (XNameContainer) UnoRuntime.queryInterface(XNameContainer.class, xFamilies.getByName("PageStyles"));        
        XStyle xStyle = (XStyle)UnoRuntime.queryInterface(XStyle.class, xFamily.getByName("Default"));     
        XPropertySet xStyleProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xStyle);        
        xStyleProps.setPropertyValue (propertyName.toString(), propertyValue);
	}
	
	public static XTextDocument saveTo_Override_reload(XTextDocument xTextDocument,String filtervalue, String url,UnoApp app) throws Exception {
		XStorable xStorable_odt = (XStorable) UnoRuntime.queryInterface(XStorable.class, xTextDocument);
		PropertyValue[] aStoreProperties = new PropertyValue[2];
		aStoreProperties[0] = new PropertyValue();
		aStoreProperties[1] = new PropertyValue();
		aStoreProperties[0].Name = "Override";
		aStoreProperties[0].Value = true;
		aStoreProperties[1].Name = "FilterName";
		aStoreProperties[1].Value = filtervalue;
		xStorable_odt.storeToURL(FileUtil.getUrl(url), aStoreProperties);
		//reopen the document
		return (XTextDocument)UnoRuntime.queryInterface(XTextDocument.class, app.loadDocument(url));	
 	}
	/**
	 * create document from template
	 */
	public static XComponent newDocumentFromTemplate(String templatePath,UnoApp unoApp) throws Exception
	{
		XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, unoApp.getDesktop());
		PropertyValue[] pros = new PropertyValue[1];
		pros[0] = new PropertyValue();
		pros[0].Name = "AsTemplate";
		pros[0].Value = new Boolean(true);				
		XComponent component = componentLoader.loadComponentFromURL(FileUtil.getUrl(templatePath), "_blank", 0,pros);
		return component;
	}
}
