/**************************************************************
 *
 * 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 remote service manager
            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 loader 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);
        }


    }
}
