/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



//***************************************************************************
// comment: Step 1: bootstrap UNO and get the remote component context
//          Step 2: open an empty text document
//          Step 3: create an enumeration of all paragraphs
//          Step 4: create an enumeration of all text portions
//***************************************************************************

import com.sun.star.uno.UnoRuntime;

public class TextDocumentStructure {
    
    public static void main(String args[]) {
        com.sun.star.uno.XComponentContext xContext = null;
            
        try {
            // get the remote office component context
            xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
            System.out.println("Connected to a running office ...");

            // get the rmeote service manger
            com.sun.star.lang.XMultiComponentFactory xMCF =
                xContext.getServiceManager();

            // create a new instance of the desktop
            Object oDesktop = xMCF.createInstanceWithContext(
                                        "com.sun.star.frame.Desktop", xContext);

            // get the component laoder from the desktop to create a new
            // text document
            com.sun.star.frame.XComponentLoader xCLoader =
                (com.sun.star.frame.XComponentLoader)
                UnoRuntime.queryInterface(
                    com.sun.star.frame.XComponentLoader.class,oDesktop);
            com.sun.star.beans.PropertyValue [] szEmptyArgs =
                new com.sun.star.beans.PropertyValue [0];
            String strDoc = "private:factory/swriter";

            System.out.println("create new text document");
            
            com.sun.star.lang.XComponent xComp = xCLoader.loadComponentFromURL(
                strDoc, "_blank", 0, szEmptyArgs);

            // query the new document for the XTextDocument interface
            com.sun.star.text.XTextDocument xTextDocument =
                (com.sun.star.text.XTextDocument)UnoRuntime.queryInterface(
                    com.sun.star.text.XTextDocument.class, xComp);

            // create some example data
            com.sun.star.text.XText xText = xTextDocument.getText();
            createExampleData( xText );           
            
            // Begin section 'The structure of text documents' of the Tutorial
            
            com.sun.star.container.XEnumeration xParagraphEnumeration = null;
            com.sun.star.container.XEnumerationAccess xParaEnumerationAccess = null;
            com.sun.star.container.XEnumeration xPortionEnumeration = null;
            com.sun.star.container.XEnumeration xTextPortionEnum;
            com.sun.star.text.XTextContent xTextElement = null;
            
            System.out.println("create an enumeration of all paragraphs");
            // create an enumeration access of all paragraphs of a document
            com.sun.star.container.XEnumerationAccess xEnumerationAccess =
                (com.sun.star.container.XEnumerationAccess)
                    UnoRuntime.queryInterface(
                        com.sun.star.container.XEnumerationAccess.class, xText);
            xParagraphEnumeration = xEnumerationAccess.createEnumeration();
            
            // Loop through all paragraphs of the document
            while ( xParagraphEnumeration.hasMoreElements() ) {
                xTextElement = (com.sun.star.text.XTextContent)
                    UnoRuntime.queryInterface(
                        com.sun.star.text.XTextContent.class,
                        xParagraphEnumeration.nextElement());
                com.sun.star.lang.XServiceInfo xServiceInfo =
                    (com.sun.star.lang.XServiceInfo)UnoRuntime.queryInterface(
                        com.sun.star.lang.XServiceInfo.class, xTextElement);
                
                // check ifs the current paragraph really a paragraph or an
                // anchor of a frame or picture
                if( xServiceInfo.supportsService("com.sun.star.text.Paragraph") ) {
                    com.sun.star.text.XTextRange xTextRange =
                        xTextElement.getAnchor();
                    System.out.println( "This is a Paragraph" );
                    
                    // create another enumeration to get all text portions of
                    // the paragraph
                    xParaEnumerationAccess =
                        (com.sun.star.container.XEnumerationAccess)
                            UnoRuntime.queryInterface(
                                com.sun.star.container.XEnumerationAccess.class,
                                xTextElement);
                    xTextPortionEnum = xParaEnumerationAccess.createEnumeration();
                    
                    while ( xTextPortionEnum.hasMoreElements() ) {
                        com.sun.star.text.XTextRange xTextPortion =
                            (com.sun.star.text.XTextRange)UnoRuntime.queryInterface(
                                com.sun.star.text.XTextRange.class,
                                xTextPortionEnum.nextElement());
                        System.out.println( "Text from the portion : "
                                            + xTextPortion.getString() );
                        
                        com.sun.star.beans.XPropertySet xPropertySet =
                            (com.sun.star.beans.XPropertySet)
                                 UnoRuntime.queryInterface(
                                     com.sun.star.beans.XPropertySet.class,
                                     xTextPortion);
                        System.out.println( "Name of the font : "
                            + xPropertySet.getPropertyValue( "CharFontName" ) );
                        
                        // PropertyState status of each text portion.
                        com.sun.star.beans.XPropertyState xPropertyState =
                            (com.sun.star.beans.XPropertyState)
                                UnoRuntime.queryInterface(
                                    com.sun.star.beans.XPropertyState.class,
                                    xTextPortion);
                        
                        if( xPropertyState.getPropertyState("CharWeight").equals(
                                com.sun.star.beans.PropertyState.AMBIGUOUS_VALUE) )
                            System.out.println( "-  The text range contains more than one different attributes" );
                        
                        if( xPropertyState.getPropertyState( "CharWeight" ).equals(
                                com.sun.star.beans.PropertyState.DIRECT_VALUE ) )
                            System.out.println( " - The text range contains hard formats" );
                        
                        if( xPropertyState.getPropertyState( "CharWeight" ).equals(
                                com.sun.star.beans.PropertyState.DEFAULT_VALUE ) )
                            System.out.println( " - The text range doesn't contains hard formats" );
                    }
                }
                else
                    System.out.println( "The text portion isn't a text paragraph" );
                // End section 'The structure of text documents' of the Tutorial
            }
        }
        catch( Exception e) {
            e.printStackTrace(System.err);
            System.exit(1);
        }
        
        System.out.println("done");
        System.exit(0);
    }
    
    public static void createExampleData( com.sun.star.text.XText xText ) {
        
        try {
            xText.setString( "This is an example sentence" );
            
            com.sun.star.text.XWordCursor xWordCursor =
                (com.sun.star.text.XWordCursor)UnoRuntime.queryInterface(
                    com.sun.star.text.XWordCursor.class, xText.getStart());
            
            xWordCursor.gotoNextWord(false);
            xWordCursor.gotoNextWord(false);
            xWordCursor.gotoEndOfWord(true);
            
            com.sun.star.beans.XPropertySet xPropertySet =
                (com.sun.star.beans.XPropertySet)UnoRuntime.queryInterface(
                    com.sun.star.beans.XPropertySet.class, xWordCursor );
            xPropertySet.setPropertyValue("CharWeight",
                             new Float( com.sun.star.awt.FontWeight.BOLD ));
            
            System.out.println("create example data");
        }
        catch( Exception e) {
            e.printStackTrace(System.err);
        }
        
        
    }
}
