xref: /AOO41X/main/odk/examples/DevelopersGuide/Drawing/DrawingDemo.java (revision 34dd1e2512dbacb6a9a7e4c7f17b9296daa8eff3)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // __________ Imports __________
25 
26 import com.sun.star.uno.UnoRuntime;
27 import com.sun.star.lang.XComponent;
28 
29 import com.sun.star.awt.Point;
30 import com.sun.star.awt.Size;
31 
32 import com.sun.star.beans.PropertyValue;
33 import com.sun.star.beans.XPropertySet;
34 
35 import com.sun.star.container.XNamed;
36 
37 import com.sun.star.drawing.PolygonFlags;
38 import com.sun.star.drawing.PolyPolygonBezierCoords;
39 import com.sun.star.drawing.XShape;
40 import com.sun.star.drawing.XShapes;
41 import com.sun.star.drawing.XShapeGrouper;
42 import com.sun.star.drawing.XDrawPage;
43 
44 import java.util.Random;
45 
46 
47 // __________ Implementation __________
48 
49 /** drawing demo
50     @author Sven Jacobi
51  */
52 
53 // This drawing demo will create/load a document, and show how to
54 // handle pages and shapes using the Office API,
55 
56 // Calling this demo two parameter can be used. The first parameter
57 // describes if a document is to create or load: "draw" creates a
58 // draw document, "impress" creates an impress document, any other
59 // parameter is interpreted as URL and loads the corresponding
60 // document. ( example for a URL is: "file:///c:/test.odp" )
61 // The second parameter is the connection that is to use. If no parameter
62 // is given a standard impress document is created by using following
63 // connection: "uno:socket,host=localhost,port=2083;urp;StarOffice.ServiceManager";
64 
65 public class DrawingDemo
66 {
main( String args[] )67     public static void main( String args[] )
68     {
69         XComponent xDrawDoc = null;
70         try
71         {
72             // get the remote office context of a running office (a new office
73             // instance is started if necessary)
74             com.sun.star.uno.XComponentContext xOfficeContext = Helper.connect();
75 
76             String sURL;
77             if ( args.length == 0 )
78                 sURL = "impress";
79             else
80                 sURL = args[ 0 ];
81 
82             if ( sURL.equals( "draw" ) )
83                 sURL = "private:factory/sdraw";
84             else if ( sURL.equals( "impress" ) )
85                 sURL = "private:factory/simpress";
86 
87             // suppress Presentation Autopilot when opening the document
88             // properties are the same as described for
89             // com.sun.star.document.MediaDescriptor
90             PropertyValue[] pPropValues = new PropertyValue[ 1 ];
91             pPropValues[ 0 ] = new PropertyValue();
92             pPropValues[ 0 ].Name = "Silent";
93             pPropValues[ 0 ].Value = new Boolean( true );
94 
95             xDrawDoc = Helper.createDocument( xOfficeContext,
96                 sURL, "_blank", 0, pPropValues );
97         }
98         catch( Exception ex )
99         {
100             System.out.println( ex );
101             System.exit( 0 );
102         }
103 
104 
105         Demo_PageCreation( xDrawDoc, 10 );
106         Demo_PageNaming( xDrawDoc, "this page is called: LastPage" );
107         Demo_ShapeCreation( xDrawDoc );
108         Demo_PolyPolygonBezier( xDrawDoc );
109         Demo_Group1( xDrawDoc );
110         Demo_Group2( xDrawDoc );
111         System.exit( 0 );
112     }
113 
114     // This method appends draw pages to the document, so that a
115     // minimum of n draw pages will be available.
116     // For each second draw page also a new master page is created.
Demo_PageCreation( XComponent xDrawDoc, int n )117     public static void Demo_PageCreation( XComponent xDrawDoc, int n )
118     {
119         try
120         {
121             // If the document has less than n draw pages, append them,
122             // a minimum of n draw pages will be available
123             int i, nDrawPages;
124             for ( nDrawPages = PageHelper.getDrawPageCount( xDrawDoc );
125                 nDrawPages < n; nDrawPages++ )
126                 PageHelper.insertNewDrawPageByIndex( xDrawDoc, nDrawPages );
127             // Create a master page for each second drawpage
128             int nMasterPages;
129             for ( nMasterPages = PageHelper.getMasterPageCount( xDrawDoc );
130                 nMasterPages < ( ( nDrawPages + 1 ) / 2 ); nMasterPages++ )
131                 PageHelper.insertNewMasterPageByIndex( xDrawDoc, nMasterPages );
132 
133             // Now connect master page 1 to draw page 1 and 2,
134             // master page 2 to draw page 3 and 4 and so on.
135             for ( i = 0; i < nDrawPages; i++ )
136             {
137                 XDrawPage xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, i );
138                 XDrawPage xMasterPage = PageHelper.getMasterPageByIndex(
139                     xDrawDoc, i / 2 );
140                 PageHelper.setMasterPage( xDrawPage, xMasterPage );
141             }
142         }
143         catch( Exception ex )
144         {
145             System.out.println("Demo_PageCreation: I have a page creation problem");
146         }
147     }
148 
149     // this method shows how to name a page, this is exemplary
150     // be done for the last draw page
Demo_PageNaming( XComponent xDrawDoc, String sLastPageName )151     public static void Demo_PageNaming(
152         XComponent xDrawDoc, String sLastPageName )
153     {
154         try
155         {
156             XDrawPage xLastPage = PageHelper.getDrawPageByIndex( xDrawDoc,
157                 PageHelper.getDrawPageCount( xDrawDoc ) - 1 );
158 
159             // each drawpage is supporting an XNamed interface
160             XNamed xNamed = (XNamed)UnoRuntime.queryInterface(
161                 XNamed.class, xLastPage );
162 
163             // beware, the page must have an unique name
164             xNamed.setName( sLastPageName );
165         }
166         catch( Exception ex )
167         {
168             System.out.println( "Demo_PageNaming: can't set page name" );
169         }
170     }
171 
172     // This method will add one rectangle shape into the lower left quarter of
173     // every page that is available,
Demo_ShapeCreation( XComponent xDrawDoc )174     public static void Demo_ShapeCreation( XComponent xDrawDoc )
175     {
176         try
177         {
178             boolean bIsImpressDocument = PageHelper.isImpressDocument( xDrawDoc );
179 
180             int nDrawingPages = PageHelper.getDrawPageCount( xDrawDoc );
181             int nMasterPages =  PageHelper.getMasterPageCount( xDrawDoc );
182             int nGlobalPageCount = nDrawingPages + nMasterPages;
183 
184             if ( bIsImpressDocument )
185             {
186                 // in impress each draw page also has a notes page
187                 nGlobalPageCount += nDrawingPages;
188                 // for each drawing master is also a notes master available
189                 nGlobalPageCount += nMasterPages;
190                 // one handout is existing
191                 nGlobalPageCount += 1;
192             }
193 
194             // create and fill a container with all draw pages
195             XDrawPage[] pPages = new XDrawPage[ nGlobalPageCount ];
196             int i, nCurrentPageIndex = 0;
197 
198             // insert handout page
199             if ( bIsImpressDocument )
200                 pPages[ nCurrentPageIndex++ ] = PageHelper.getHandoutMasterPage(
201                     xDrawDoc );
202 
203             // inserting all master pages
204             for( i = 0; i < nMasterPages; i++ )
205             {
206                 XDrawPage xMasterPage = PageHelper.getMasterPageByIndex(
207                     xDrawDoc, i );
208                 pPages[ nCurrentPageIndex++ ] = xMasterPage;
209 
210                 // if the document is an impress, get the corresponding notes
211                 // master page
212                 if ( bIsImpressDocument )
213                     pPages[ nCurrentPageIndex++ ] = PageHelper.getNotesPage(
214                         xMasterPage );
215             }
216             for ( i = 0; i < nDrawingPages; i++ )
217             {
218                 XDrawPage xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, i );
219                 pPages[ nCurrentPageIndex++ ] = xDrawPage;
220 
221                 // if the document is an impress, get the corresponding notes page
222                 if ( bIsImpressDocument )
223                     pPages[ nCurrentPageIndex++ ] = PageHelper.getNotesPage(
224                         xDrawPage );
225             }
226 
227             // Now a complete list of pages is available in pPages.
228             // The following code will insert a rectangle into each page.
229             for ( i = 0; i < nGlobalPageCount; i++ )
230             {
231                 Size aPageSize = PageHelper.getPageSize( pPages[ i ] );
232                 int nHalfWidth  = aPageSize.Width / 2;
233                 int nHalfHeight = aPageSize.Height / 2;
234 
235                 Random aRndGen = new Random();
236                 int nRndObjWidth  = aRndGen.nextInt( nHalfWidth );
237                 int nRndObjHeight = aRndGen.nextInt( nHalfHeight );
238 
239                 int nRndObjPosX = aRndGen.nextInt( nHalfWidth - nRndObjWidth );
240                 int nRndObjPosY = aRndGen.nextInt( nHalfHeight - nRndObjHeight )
241                     + nHalfHeight;
242 
243                 XShapes xShapes = (XShapes)
244                     UnoRuntime.queryInterface( XShapes.class, pPages[ i ] );
245                 ShapeHelper.createAndInsertShape( xDrawDoc, xShapes,
246                     new Point( nRndObjPosX, nRndObjPosY ),
247                         new Size( nRndObjWidth, nRndObjHeight ),
248                             "com.sun.star.drawing.RectangleShape" );
249             }
250         }
251         catch( Exception ex )
252         {
253             System.out.println( "Demo_ShapeCreation:" + ex );
254         }
255     }
256 
257     // This method will show how to create a PolyPolygonBezier that lies is in the
258     // topleft quarter of the page and positioned at the back
Demo_PolyPolygonBezier( XComponent xDrawDoc )259     public static void Demo_PolyPolygonBezier( XComponent xDrawDoc )
260     {
261         try
262         {
263             XShape xPolyPolygonBezier = ShapeHelper.createShape( xDrawDoc,
264                 new Point( 0, 0 ),
265                     new Size( 0, 0 ),
266                         "com.sun.star.drawing.ClosedBezierShape" );
267 
268             // the fact that the shape must have been added to the page before
269             // it is possible to apply changes to the PropertySet, it is a good
270             // proceeding to add the shape as soon as possible
271             XDrawPage xDrawPage;
272             // if possible insert our new shape in the master page
273             if ( PageHelper.isImpressDocument( xDrawDoc ) )
274                 xDrawPage = PageHelper.getMasterPageByIndex( xDrawDoc, 0 );
275             else
276                 xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, 0 );
277             XShapes xShapes = (XShapes)
278                 UnoRuntime.queryInterface( XShapes.class, xDrawPage );
279             xShapes.add( xPolyPolygonBezier );
280 
281             XPropertySet xShapeProperties = (XPropertySet)
282                 UnoRuntime.queryInterface( XPropertySet.class, xPolyPolygonBezier );
283 
284             // get pagesize
285             XPropertySet xPageProperties = (XPropertySet)
286                 UnoRuntime.queryInterface( XPropertySet.class, xDrawPage );
287             int nPageWidth = ((Integer)xPageProperties.getPropertyValue( "Width" )).intValue() / 2;
288             int nPageHeight = ((Integer)xPageProperties.getPropertyValue( "Height" )).intValue() / 2;
289 
290             PolyPolygonBezierCoords aCoords = new PolyPolygonBezierCoords();
291             // allocating the outer sequence
292             int nPolygonCount = 50;
293             aCoords.Coordinates = new Point[ nPolygonCount ][ ];
294             aCoords.Flags = new PolygonFlags[ nPolygonCount ][ ];
295             int i, n, nY;
296             // fill the inner point sequence now
297             for ( nY = 0, i = 0; i < nPolygonCount; i++, nY += nPageHeight / nPolygonCount )
298             {
299                 // create a polygon using two normal and two control points
300                 // allocating the inner sequence
301                 int nPointCount = 8;
302                 Point[]         pPolyPoints = new Point[ nPointCount ];
303                 PolygonFlags[]  pPolyFlags  = new PolygonFlags[ nPointCount ];
304 
305                 for ( n = 0; n < nPointCount; n++ )
306                     pPolyPoints[ n ] = new Point();
307 
308                 pPolyPoints[ 0 ].X = 0;
309                 pPolyPoints[ 0 ].Y = nY;
310                 pPolyFlags[ 0 ] = PolygonFlags.NORMAL;
311                 pPolyPoints[ 1 ].X = nPageWidth / 2;
312                 pPolyPoints[ 1 ].Y = nPageHeight;
313                 pPolyFlags[ 1 ] = PolygonFlags.CONTROL;
314                 pPolyPoints[ 2 ].X = nPageWidth / 2;;
315                 pPolyPoints[ 2 ].Y = nPageHeight;
316                 pPolyFlags[ 2 ] = PolygonFlags.CONTROL;
317                 pPolyPoints[ 3 ].X = nPageWidth;
318                 pPolyPoints[ 3 ].Y = nY;
319                 pPolyFlags[ 3 ] = PolygonFlags.NORMAL;
320 
321                 pPolyPoints[ 4 ].X = nPageWidth - 1000;
322                 pPolyPoints[ 4 ].Y = nY;
323                 pPolyFlags[ 4 ] = PolygonFlags.NORMAL;
324                 pPolyPoints[ 5 ].X = nPageWidth / 2;
325                 pPolyPoints[ 5 ].Y = nPageHeight / 2;
326                 pPolyFlags[ 5 ] = PolygonFlags.CONTROL;
327                 pPolyPoints[ 6 ].X = nPageWidth / 2;;
328                 pPolyPoints[ 6 ].Y = nPageHeight / 2;
329                 pPolyFlags[ 6 ] = PolygonFlags.CONTROL;
330                 pPolyPoints[ 7 ].X = 1000;
331                 pPolyPoints[ 7 ].Y = nY;
332                 pPolyFlags[ 7 ] = PolygonFlags.NORMAL;
333 
334                 aCoords.Coordinates[ i ]= pPolyPoints;
335                 aCoords.Flags[ i ]      = pPolyFlags;
336             }
337             xShapeProperties.setPropertyValue( "PolyPolygonBezier", aCoords );
338 
339             // move the shape to the back by changing the ZOrder
340             xShapeProperties.setPropertyValue( "ZOrder", new Integer( 1 ) );
341         }
342         catch ( Exception ex )
343         {
344             System.out.println( "Demo_PolyPolygonBezier:" + ex );
345         }
346     }
347 
348     // This method will create a group containing two ellipses
349     // the shapes will be added into the top right corner of the first
350     // draw page
Demo_Group1( XComponent xDrawDoc )351     public static void Demo_Group1( XComponent xDrawDoc )
352     {
353         try
354         {
355             XShape xGroup = ShapeHelper.createShape( xDrawDoc,
356                 new Point( 0, 0 ),
357                     new Size( 0, 0 ),
358                         "com.sun.star.drawing.GroupShape" );
359 
360             // before it is possible to insert shapes,
361             // the group must have been added to the page
362             XDrawPage xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, 0 );
363             XShapes xShapes = (XShapes)
364                 UnoRuntime.queryInterface( XShapes.class, xDrawPage );
365             xShapes.add( xGroup );
366 
367             XShapes xShapesGroup = (XShapes)
368                 UnoRuntime.queryInterface( XShapes.class, xGroup );
369 
370             Size aPageSize = PageHelper.getPageSize( xDrawPage );
371 
372             int nWidth  = 4000;
373             int nHeight = 2000;
374             int nPosX = ( aPageSize.Width * 3 ) / 4 - nWidth / 2;
375             int nPosY1 = 2000;
376             int nPosY2 = aPageSize.Height / 2 - ( nPosY1 + nHeight );
377             XShape xRect1 = ShapeHelper.createShape( xDrawDoc,
378                 new Point( nPosX, nPosY1 ),
379                     new Size( nWidth, nHeight ),
380                         "com.sun.star.drawing.EllipseShape" );
381             XShape xRect2 = ShapeHelper.createShape( xDrawDoc,
382                 new Point( nPosX, nPosY2 ),
383                     new Size( nWidth, nHeight ),
384                         "com.sun.star.drawing.EllipseShape" );
385 
386             xShapesGroup.add( xRect1 );
387             xShapesGroup.add( xRect2 );
388         }
389         catch ( Exception ex )
390         {
391             System.out.println( "Demo_Group1:" + ex );
392         }
393     }
394 
395     // This method will group all available objects on the
396     // first page.
Demo_Group2( XComponent xDrawDoc )397     public static void Demo_Group2( XComponent xDrawDoc )
398     {
399         try
400         {
401             XDrawPage xDrawPage = PageHelper.getDrawPageByIndex( xDrawDoc, 0 );
402             XShapeGrouper xShapeGrouper = (XShapeGrouper)
403                 UnoRuntime.queryInterface( XShapeGrouper.class, xDrawPage );
404 
405             XShapes xShapesPage = (XShapes)
406                 UnoRuntime.queryInterface( XShapes.class, xDrawPage );
407 
408             xShapeGrouper.group( xShapesPage );
409         }
410         catch ( Exception ex )
411         {
412             System.out.println( "Demo_Group2:" + ex );
413         }
414     }
415 }
416