| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| // __________ Imports __________ |
| |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.lang.XComponent; |
| |
| import com.sun.star.awt.Point; |
| import com.sun.star.awt.Size; |
| |
| import com.sun.star.beans.PropertyValue; |
| import com.sun.star.beans.XPropertySet; |
| |
| import com.sun.star.container.XNamed; |
| |
| import com.sun.star.drawing.PolygonFlags; |
| import com.sun.star.drawing.PolyPolygonBezierCoords; |
| import com.sun.star.drawing.XShape; |
| import com.sun.star.drawing.XShapes; |
| import com.sun.star.drawing.XShapeGrouper; |
| import com.sun.star.drawing.XDrawPage; |
| |
| import java.util.Random; |
| |
| |
| // __________ Implementation __________ |
| |
| /** drawing demo |
| @author Sven Jacobi |
| */ |
| |
| // This drawing demo will create/load a document, and show how to |
| // handle pages and shapes using the Office API, |
| |
| // Calling this demo two parameter can be used. The first parameter |
| // describes if a document is to create or load: "draw" creates a |
| // draw document, "impress" creates an impress document, any other |
| // parameter is interpreted as URL and loads the corresponding |
| // document. ( example for a URL is: "file:///c:/test.odp" ) |
| // The second parameter is the connection that is to use. If no parameter |
| // is given a standard impress document is created by using following |
| // connection: "uno:socket,host=localhost,port=2083;urp;StarOffice.ServiceManager"; |
| |
| public class DrawingDemo |
| { |
| public static void main( String args[] ) |
| { |
| XComponent xDrawDoc = null; |
| try |
| { |
| // get the remote office context of a running office (a new office |
| // instance is started if necessary) |
| com.sun.star.uno.XComponentContext xOfficeContext = Helper.connect(); |
| |
| String sURL; |
| if ( args.length == 0 ) |
| sURL = "impress"; |
| else |
| sURL = args[ 0 ]; |
| |
| if ( sURL.equals( "draw" ) ) |
| sURL = "private:factory/sdraw"; |
| else if ( sURL.equals( "impress" ) ) |
| sURL = "private:factory/simpress"; |
| |
| // suppress Presentation Autopilot when opening the document |
| // properties are the same as described for |
| // com.sun.star.document.MediaDescriptor |
| PropertyValue[] pPropValues = new PropertyValue[ 1 ]; |
| pPropValues[ 0 ] = new PropertyValue(); |
| pPropValues[ 0 ].Name = "Silent"; |
| pPropValues[ 0 ].Value = new Boolean( true ); |
| |
| xDrawDoc = Helper.createDocument( xOfficeContext, |
| sURL, "_blank", 0, pPropValues ); |
| } |
| catch( Exception ex ) |
| { |
| System.out.println( ex ); |
| System.exit( 0 ); |
| } |
| |
| |
| Demo_PageCreation( xDrawDoc, 10 ); |
| Demo_PageNaming( xDrawDoc, "this page is called: LastPage" ); |
| Demo_ShapeCreation( xDrawDoc ); |
| Demo_PolyPolygonBezier( xDrawDoc ); |
| Demo_Group1( xDrawDoc ); |
| Demo_Group2( xDrawDoc ); |
| System.exit( 0 ); |
| } |
| |
| // This method appends draw pages to the document, so that a |
| // minimum of n draw pages will be available. |
| // For each second draw page also a new master page is created. |
| public static void Demo_PageCreation( XComponent xDrawDoc, int n ) |
| { |
| try |
| { |
| // If the document has less than n draw pages, append them, |
| // a minimum of n draw pages will be available |
| int i, nDrawPages; |
| for ( nDrawPages = PageHelper.getDrawPageCount( xDrawDoc ); |
| nDrawPages < n; nDrawPages++ ) |
| PageHelper.insertNewDrawPageByIndex( xDrawDoc, nDrawPages ); |
| // Create a master page for each second drawpage |
| int nMasterPages; |
| for ( nMasterPages = PageHelper.getMasterPageCount( xDrawDoc ); |
| nMasterPages < ( ( nDrawPages + 1 ) / 2 ); nMasterPages++ ) |
| PageHelper.insertNewMasterPageByIndex( xDrawDoc, nMasterPages ); |
| |
| // Now connect master page 1 to draw page 1 and 2, |
| // master page 2 to draw page 3 and 4 and so on. |
| for ( i = 0; i < nDrawPages; i++ ) |
| { |
| XDrawPage xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, i ); |
| XDrawPage xMasterPage = PageHelper.getMasterPageByIndex( |
| xDrawDoc, i / 2 ); |
| PageHelper.setMasterPage( xDrawPage, xMasterPage ); |
| } |
| } |
| catch( Exception ex ) |
| { |
| System.out.println("Demo_PageCreation: I have a page creation problem"); |
| } |
| } |
| |
| // this method shows how to name a page, this is exemplary |
| // be done for the last draw page |
| public static void Demo_PageNaming( |
| XComponent xDrawDoc, String sLastPageName ) |
| { |
| try |
| { |
| XDrawPage xLastPage = PageHelper.getDrawPageByIndex( xDrawDoc, |
| PageHelper.getDrawPageCount( xDrawDoc ) - 1 ); |
| |
| // each drawpage is supporting an XNamed interface |
| XNamed xNamed = (XNamed)UnoRuntime.queryInterface( |
| XNamed.class, xLastPage ); |
| |
| // beware, the page must have an unique name |
| xNamed.setName( sLastPageName ); |
| } |
| catch( Exception ex ) |
| { |
| System.out.println( "Demo_PageNaming: can't set page name" ); |
| } |
| } |
| |
| // This method will add one rectangle shape into the lower left quarter of |
| // every page that is available, |
| public static void Demo_ShapeCreation( XComponent xDrawDoc ) |
| { |
| try |
| { |
| boolean bIsImpressDocument = PageHelper.isImpressDocument( xDrawDoc ); |
| |
| int nDrawingPages = PageHelper.getDrawPageCount( xDrawDoc ); |
| int nMasterPages = PageHelper.getMasterPageCount( xDrawDoc ); |
| int nGlobalPageCount = nDrawingPages + nMasterPages; |
| |
| if ( bIsImpressDocument ) |
| { |
| // in impress each draw page also has a notes page |
| nGlobalPageCount += nDrawingPages; |
| // for each drawing master is also a notes master available |
| nGlobalPageCount += nMasterPages; |
| // one handout is existing |
| nGlobalPageCount += 1; |
| } |
| |
| // create and fill a container with all draw pages |
| XDrawPage[] pPages = new XDrawPage[ nGlobalPageCount ]; |
| int i, nCurrentPageIndex = 0; |
| |
| // insert handout page |
| if ( bIsImpressDocument ) |
| pPages[ nCurrentPageIndex++ ] = PageHelper.getHandoutMasterPage( |
| xDrawDoc ); |
| |
| // inserting all master pages |
| for( i = 0; i < nMasterPages; i++ ) |
| { |
| XDrawPage xMasterPage = PageHelper.getMasterPageByIndex( |
| xDrawDoc, i ); |
| pPages[ nCurrentPageIndex++ ] = xMasterPage; |
| |
| // if the document is an impress, get the corresponding notes |
| // master page |
| if ( bIsImpressDocument ) |
| pPages[ nCurrentPageIndex++ ] = PageHelper.getNotesPage( |
| xMasterPage ); |
| } |
| for ( i = 0; i < nDrawingPages; i++ ) |
| { |
| XDrawPage xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, i ); |
| pPages[ nCurrentPageIndex++ ] = xDrawPage; |
| |
| // if the document is an impress, get the corresponding notes page |
| if ( bIsImpressDocument ) |
| pPages[ nCurrentPageIndex++ ] = PageHelper.getNotesPage( |
| xDrawPage ); |
| } |
| |
| // Now a complete list of pages is available in pPages. |
| // The following code will insert a rectangle into each page. |
| for ( i = 0; i < nGlobalPageCount; i++ ) |
| { |
| Size aPageSize = PageHelper.getPageSize( pPages[ i ] ); |
| int nHalfWidth = aPageSize.Width / 2; |
| int nHalfHeight = aPageSize.Height / 2; |
| |
| Random aRndGen = new Random(); |
| int nRndObjWidth = aRndGen.nextInt( nHalfWidth ); |
| int nRndObjHeight = aRndGen.nextInt( nHalfHeight ); |
| |
| int nRndObjPosX = aRndGen.nextInt( nHalfWidth - nRndObjWidth ); |
| int nRndObjPosY = aRndGen.nextInt( nHalfHeight - nRndObjHeight ) |
| + nHalfHeight; |
| |
| XShapes xShapes = (XShapes) |
| UnoRuntime.queryInterface( XShapes.class, pPages[ i ] ); |
| ShapeHelper.createAndInsertShape( xDrawDoc, xShapes, |
| new Point( nRndObjPosX, nRndObjPosY ), |
| new Size( nRndObjWidth, nRndObjHeight ), |
| "com.sun.star.drawing.RectangleShape" ); |
| } |
| } |
| catch( Exception ex ) |
| { |
| System.out.println( "Demo_ShapeCreation:" + ex ); |
| } |
| } |
| |
| // This method will show how to create a PolyPolygonBezier that lies is in the |
| // topleft quarter of the page and positioned at the back |
| public static void Demo_PolyPolygonBezier( XComponent xDrawDoc ) |
| { |
| try |
| { |
| XShape xPolyPolygonBezier = ShapeHelper.createShape( xDrawDoc, |
| new Point( 0, 0 ), |
| new Size( 0, 0 ), |
| "com.sun.star.drawing.ClosedBezierShape" ); |
| |
| // the fact that the shape must have been added to the page before |
| // it is possible to apply changes to the PropertySet, it is a good |
| // proceeding to add the shape as soon as possible |
| XDrawPage xDrawPage; |
| // if possible insert our new shape in the master page |
| if ( PageHelper.isImpressDocument( xDrawDoc ) ) |
| xDrawPage = PageHelper.getMasterPageByIndex( xDrawDoc, 0 ); |
| else |
| xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, 0 ); |
| XShapes xShapes = (XShapes) |
| UnoRuntime.queryInterface( XShapes.class, xDrawPage ); |
| xShapes.add( xPolyPolygonBezier ); |
| |
| XPropertySet xShapeProperties = (XPropertySet) |
| UnoRuntime.queryInterface( XPropertySet.class, xPolyPolygonBezier ); |
| |
| // get pagesize |
| XPropertySet xPageProperties = (XPropertySet) |
| UnoRuntime.queryInterface( XPropertySet.class, xDrawPage ); |
| int nPageWidth = ((Integer)xPageProperties.getPropertyValue( "Width" )).intValue() / 2; |
| int nPageHeight = ((Integer)xPageProperties.getPropertyValue( "Height" )).intValue() / 2; |
| |
| PolyPolygonBezierCoords aCoords = new PolyPolygonBezierCoords(); |
| // allocating the outer sequence |
| int nPolygonCount = 50; |
| aCoords.Coordinates = new Point[ nPolygonCount ][ ]; |
| aCoords.Flags = new PolygonFlags[ nPolygonCount ][ ]; |
| int i, n, nY; |
| // fill the inner point sequence now |
| for ( nY = 0, i = 0; i < nPolygonCount; i++, nY += nPageHeight / nPolygonCount ) |
| { |
| // create a polygon using two normal and two control points |
| // allocating the inner sequence |
| int nPointCount = 8; |
| Point[] pPolyPoints = new Point[ nPointCount ]; |
| PolygonFlags[] pPolyFlags = new PolygonFlags[ nPointCount ]; |
| |
| for ( n = 0; n < nPointCount; n++ ) |
| pPolyPoints[ n ] = new Point(); |
| |
| pPolyPoints[ 0 ].X = 0; |
| pPolyPoints[ 0 ].Y = nY; |
| pPolyFlags[ 0 ] = PolygonFlags.NORMAL; |
| pPolyPoints[ 1 ].X = nPageWidth / 2; |
| pPolyPoints[ 1 ].Y = nPageHeight; |
| pPolyFlags[ 1 ] = PolygonFlags.CONTROL; |
| pPolyPoints[ 2 ].X = nPageWidth / 2;; |
| pPolyPoints[ 2 ].Y = nPageHeight; |
| pPolyFlags[ 2 ] = PolygonFlags.CONTROL; |
| pPolyPoints[ 3 ].X = nPageWidth; |
| pPolyPoints[ 3 ].Y = nY; |
| pPolyFlags[ 3 ] = PolygonFlags.NORMAL; |
| |
| pPolyPoints[ 4 ].X = nPageWidth - 1000; |
| pPolyPoints[ 4 ].Y = nY; |
| pPolyFlags[ 4 ] = PolygonFlags.NORMAL; |
| pPolyPoints[ 5 ].X = nPageWidth / 2; |
| pPolyPoints[ 5 ].Y = nPageHeight / 2; |
| pPolyFlags[ 5 ] = PolygonFlags.CONTROL; |
| pPolyPoints[ 6 ].X = nPageWidth / 2;; |
| pPolyPoints[ 6 ].Y = nPageHeight / 2; |
| pPolyFlags[ 6 ] = PolygonFlags.CONTROL; |
| pPolyPoints[ 7 ].X = 1000; |
| pPolyPoints[ 7 ].Y = nY; |
| pPolyFlags[ 7 ] = PolygonFlags.NORMAL; |
| |
| aCoords.Coordinates[ i ]= pPolyPoints; |
| aCoords.Flags[ i ] = pPolyFlags; |
| } |
| xShapeProperties.setPropertyValue( "PolyPolygonBezier", aCoords ); |
| |
| // move the shape to the back by changing the ZOrder |
| xShapeProperties.setPropertyValue( "ZOrder", new Integer( 1 ) ); |
| } |
| catch ( Exception ex ) |
| { |
| System.out.println( "Demo_PolyPolygonBezier:" + ex ); |
| } |
| } |
| |
| // This method will create a group containing two ellipses |
| // the shapes will be added into the top right corner of the first |
| // draw page |
| public static void Demo_Group1( XComponent xDrawDoc ) |
| { |
| try |
| { |
| XShape xGroup = ShapeHelper.createShape( xDrawDoc, |
| new Point( 0, 0 ), |
| new Size( 0, 0 ), |
| "com.sun.star.drawing.GroupShape" ); |
| |
| // before it is possible to insert shapes, |
| // the group must have been added to the page |
| XDrawPage xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, 0 ); |
| XShapes xShapes = (XShapes) |
| UnoRuntime.queryInterface( XShapes.class, xDrawPage ); |
| xShapes.add( xGroup ); |
| |
| XShapes xShapesGroup = (XShapes) |
| UnoRuntime.queryInterface( XShapes.class, xGroup ); |
| |
| Size aPageSize = PageHelper.getPageSize( xDrawPage ); |
| |
| int nWidth = 4000; |
| int nHeight = 2000; |
| int nPosX = ( aPageSize.Width * 3 ) / 4 - nWidth / 2; |
| int nPosY1 = 2000; |
| int nPosY2 = aPageSize.Height / 2 - ( nPosY1 + nHeight ); |
| XShape xRect1 = ShapeHelper.createShape( xDrawDoc, |
| new Point( nPosX, nPosY1 ), |
| new Size( nWidth, nHeight ), |
| "com.sun.star.drawing.EllipseShape" ); |
| XShape xRect2 = ShapeHelper.createShape( xDrawDoc, |
| new Point( nPosX, nPosY2 ), |
| new Size( nWidth, nHeight ), |
| "com.sun.star.drawing.EllipseShape" ); |
| |
| xShapesGroup.add( xRect1 ); |
| xShapesGroup.add( xRect2 ); |
| } |
| catch ( Exception ex ) |
| { |
| System.out.println( "Demo_Group1:" + ex ); |
| } |
| } |
| |
| // This method will group all available objects on the |
| // first page. |
| public static void Demo_Group2( XComponent xDrawDoc ) |
| { |
| try |
| { |
| XDrawPage xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, 0 ); |
| XShapeGrouper xShapeGrouper = (XShapeGrouper) |
| UnoRuntime.queryInterface( XShapeGrouper.class, xDrawPage ); |
| |
| XShapes xShapesPage = (XShapes) |
| UnoRuntime.queryInterface( XShapes.class, xDrawPage ); |
| |
| xShapeGrouper.group( xShapesPage ); |
| } |
| catch ( Exception ex ) |
| { |
| System.out.println( "Demo_Group2:" + ex ); |
| } |
| } |
| } |