blob: 63724c585dc19d9fce747d18bd8a90bad04c4a53 [file] [log] [blame]
/**************************************************************
*
* 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 );
}
}
}