LibreOffice Developer's Guide: Chapter 9 - Drawing Documents and Presentation Documents
Draw and Impress are vector-oriented applications with the ability to create drawings and presentations. The drawing capabilities of Draw and Impress are identical. Both programs support a number of different shape types, such as rectangle, text, curve, or graphic shapes, that can be edited and arranged in various ways. Impress offers a presentation functionality where Draw does not. Impress is the ideal application to create and show presentations. It supports special presentation features, such as an enhanced page structure, presentation objects, and many slide transition and object effects. Draw is especially adapted for printed or standalone graphics, whereas Impress is optimized to fit screen dimensions and offers effects for business presentations.
The following diagrams show the document structure of Draw and Impress Documents.
In contrast to text documents and spreadsheet documents, the main content of drawing and presentation documents are their draw pages. Therefore the illustrations show the draw page container as integral part of the drawing and presentation document model. The drawing elements on the draw pages have to be created by the document service manager and are added to the draw pages afterwards.
Note the master pages and the layer manager, which are specific to drawings and presentations. Like for texts and spreadsheets, a controller is used to present the drawing in the GUI and services for styles and layout are available to handle overall document features such as styles.
In addition to drawing documents, a presentation document has special presentation aspects, which are shown on the lower left of the illustration below. There is a presentation supplier to obtain a presentation object, which is used to start and stop presentations, it is possible to edit and run custom presentations and the page layout for presentation handouts is accessible through a handout master supplier.
Example: Creating a Simple Organizational Chart
The following example creates a simple organizational chart with two levels. It consists of five rectangle shapes and four connectors that connect the boxes on the second level with the root box on the first level.
The method getRemoteServiceManager()
that is used in the example connects to the office. The First Steps discussed this method. First an empty drawing document is loaded and retrieves the draw page object of slide number 1 to find the page dimensions. Then the organigram data is prepared and the shape sizes are calculated. The shapes are added in a for loop that iterates over the organigram data, and connectors are added for all shapes on the second level of the organigram.
public void drawOrganigram() throws java.lang.Exception {
xRemoteServiceManager = this.getRemoteServiceManager(
"uno:socket,host=localhost,port=2083;urp;StarOffice.ServiceManager");
Object desktop = xRemoteServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", xRemoteContext);
XComponentLoader xComponentLoader = UnoRuntime.queryInterface(
XComponentLoader.class, desktop);
PropertyValue[] loadProps = new PropertyValue[0];
XComponent xDrawComponent = xComponentLoader.loadComponentFromURL(
"private:factory/sdraw", "_blank", 0, loadProps);
// get draw page by index
com.sun.star.drawing.XDrawPagesSupplier xDrawPagesSupplier =
(com.sun.star.drawing.XDrawPagesSupplier)
UnoRuntime.queryInterface(
com.sun.star.drawing.XDrawPagesSupplier.class, xDrawComponent );
com.sun.star.drawing.XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
Object drawPage = xDrawPages.getByIndex(0);
com.sun.star.drawing.XDrawPage xDrawPage = (com.sun.star.drawing.XDrawPage)
UnoRuntime.queryInterface(
com.sun.star.drawing.XDrawPage.class, drawPage);
// find out page dimensions
com.sun.star.beans.XPropertySet xPageProps = (com.sun.star.beans.XPropertySet)
UnoRuntime.queryInterface(
com.sun.star.beans.XPropertySet.class, xDrawPage);
int pageWidth = AnyConverter.toInt(xPageProps.getPropertyValue("Width"));
int pageHeight = AnyConverter.toInt(xPageProps.getPropertyValue("Height"));
int pageBorderTop = AnyConverter.toInt(xPageProps.getPropertyValue("BorderTop"));
int pageBorderLeft = AnyConverter.toInt(xPageProps.getPropertyValue("BorderLeft"));
int pageBorderRight = AnyConverter.toInt(xPageProps.getPropertyValue("BorderRight"));
int drawWidth = pageWidth - pageBorderLeft - pageBorderRight;
int horCenter = pageBorderLeft + drawWidth / 2;
// data for organigram
String[][] orgUnits = new String[2][4];
orgUnits[0][0] = "Management"; // level 0
orgUnits[1][0] = "Production"; // level 1
orgUnits[1][1] = "Purchasing"; // level 1
orgUnits[1][2] = "IT Services"; // level 1
orgUnits[1][3] = "Sales"; // level 1
int[] levelCount = {1, 4};
// calculate shape sizes and positions
int horSpace = 300;
int verSpace = 3000;
int shapeWidth = (drawWidth - (levelCount[1] - 1) * horSpace) / levelCount[1];
int shapeHeight = pageHeight / 20;
int shapeX = pageWidth / 2 - shapeWidth / 2;
int levelY = 0;
com.sun.star.drawing.XShape xStartShape = null;
// get document factory
com.sun.star.lang.XMultiServiceFactory xDocumentFactory = (com.sun.star.lang.XMultiServiceFactory)
UnoRuntime.queryInterface(
com.sun.star.lang.XMultiServiceFactory.class, xDrawComponent);
// creating and adding RectangleShapes and Connectors
for (int level = 0; level <= 1; level++) {
levelY = pageBorderTop + 2000 + level * (shapeHeight + verSpace);
for (int i = levelCount[level] - 1; i > -1; i--) {
shapeX = horCenter -
(levelCount[level] * shapeWidth + (levelCount[level] - 1) * horSpace) / 2 +
i * shapeWidth + i * horSpace;
Object shape = xDocumentFactory.createInstance("com.sun.star.drawing.RectangleShape");
com.sun.star.drawing.XShape xShape = (com.sun.star.drawing.XShape)
UnoRuntime.queryInterface(
com.sun.star.drawing.XShape.class, shape);
xShape.setPosition(new com.sun.star.awt.Point(shapeX, levelY));
xShape.setSize(new com.sun.star.awt.Size(shapeWidth, shapeHeight));
xDrawPage.add(xShape);
// set the text
com.sun.star.text.XText xText = (com.sun.star.text.XText)
UnoRuntime.queryInterface(
com.sun.star.text.XText.class, xShape);
xText.setString(orgUnits[level][i]);
// memorize the root shape, for connectors
if (level == 0 && i == 0)
xStartShape = xShape;
// add connectors for level 1
if (level == 1) {
Object connector = xDocumentFactory.createInstance(
"com.sun.star.drawing.ConnectorShape");
com.sun.star.drawing.XShape xConnector = (com.sun.star.drawing.XShape)
UnoRuntime.queryInterface(
com.sun.star.drawing.XShape.class, connector);
xDrawPage.add(xConnector);
com.sun.star.beans.XPropertySet xConnectorProps = (com.sun.star.beans.XPropertySet)
UnoRuntime.queryInterface(
com.sun.star.beans.XPropertySet.class, connector);
xConnectorProps.setPropertyValue("StartShape", xStartShape);
xConnectorProps.setPropertyValue("EndShape", xShape);
// gluepoint positions: 0=top 1=left 2=bottom 3=right
xConnectorProps.setPropertyValue("StartGluePointIndex", Integer.valueOf(2));
xConnectorProps.setPropertyValue("EndGluePointIndex", Integer.valueOf(0));
}
}
}
}
Handling Drawing Document Files
Creating and Loading Drawing Documents
If a document in LibreOffice is required, begin by getting the com.sun.star.frame.Desktop service from the service manager. The desktop handles all document components in LibreOffice among other things. It is discussed thoroughly in the chapter Office Development. Office documents are often called components because they support the com.sun.star.lang.XComponent interface. An XComponent
is a UNO object that can be disposed explicitly and broadcast an event to other UNO objects when this happens.
The Desktop loads new and existing components from a URL. The desktop has a com.sun.star.frame.XComponentLoader interface that has one single method to load and instantiate components from a URL into a frame:
com::sun::star::lang::XComponent loadComponentFromURL( [in] string aURL,
[in] string aTargetFrameName,
[in] long nSearchFlags,
[in] sequence< com::sun::star::beans::PropertyValue > aArgs )
The parameters in our context are the URL that describes the resource to be loaded, and the load arguments. For the target frame pass in "_blank
" and set the search flags to 0. In most cases, you will not want to reuse an existing frame.
The URL can be a file:
URL, an http:
URL, an ftp:
URL or a private:
URL. The correct URL format is located in the load URL box at the function bar of LibreOffice. For new Draw documents, a special URL scheme is used. The scheme is "private:", followed by "factory" as the hostname and the resource is "sdraw" for LibreOffice Draw documents. Thus, for a new Draw document, use "private:factory/sdraw
".
The load arguments are described in com.sun.star.document.MediaDescriptor. The properties AsTemplate
and Hidden
are boolean values and used for programming. If AsTemplate
is true, the loader creates a new untitled document from the given URL. If it is false, template files are loaded for editing. If Hidden
is true
, the document is loaded in the background. This is useful to generate a document in the background without letting the user observe what is happening. For instance, use it to generate a document and print it out without previewing. Refer to Office Development or other available options.
The introductory example shows how to load a drawing document. This snippet loads a new drawing document in hidden mode:
// the method getRemoteServiceManager is described in the chapter First Steps
mxRemoteServiceManager = this.getRemoteServiceManager();
// retrieve the Desktop object, we need its XComponentLoader
Object desktop = mxRemoteServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", mxRemoteContext);
// query the XComponentLoader interface from the Desktop service
XComponentLoader xComponentLoader = UnoRuntime.queryInterface(
XComponentLoader.class, desktop);
// define load properties according to com.sun.star.document.MediaDescriptor
// the boolean property Hidden tells the office to open a file in hidden mode
PropertyValue[] loadProps = new PropertyValue[1];
loadProps[0] = new PropertyValue();
loadProps[0].Name = "Hidden";
loadProps[0].Value = Boolean.TRUE;
/* or simply create an empty array of com.sun.star.beans.PropertyValue structs:
PropertyValue[] loadProps = new PropertyValue[0]
*/
// load
com.sun.star.lang.XComponent xComponentLoader.loadComponentFromURL(
"private:factory/sdraw", "_blank", 0, loadProps);
Saving Drawing Documents
The normal File – Save command for drawing documents can only store the current document in the native LibreOffice Draw format and its predecessors. There are other formats that can be stored through the File – Export option. This is mirrored in the API. Exporting in the current version of LibreOffice Draw and Impress is a different procedure than storing.
Storing
Documents are storable through their interface com.sun.star.frame.XStorable. The Office Development discusses this in detail. An XStorable
implements these operations:
boolean hasLocation()
string getLocation()
boolean isReadonly()
void store()
void storeAsURL( [in] string aURL,
[in] sequence < com::sun::star::beans::PropertyValue > aArgs)
void storeToURL( [in] string aURL,
[in] sequence < com::sun::star::beans::PropertyValue > aArgs)
The method names should be evident. The method storeAsUrl()
is the exact representation of File - Save As, that is, it changes the current document location. In contrast, storeToUrl()
stores a copy to a new location, but leaves the current document URL untouched. There are also store arguments. A filter name can be passed that tells LibreOffice to use older StarOffice Draw file formats. Exporting is a different matter as shown below. The property needed is FilterName which is a string argument that takes filter names defined in the configuration file:
<OfficePath>\share\config\registry\instance\org\openoffice\Office\TypeDetection.xml
In TypeDetection.xml, find <Filter/>
elements, their cfg:name
attribute contains the required strings for FilterName
. The correct filter name for StarDraw 5.x files is "StarDraw 5.0". The following is the element in TypeDetection.xml that describes the StarDraw 5.0 document filter:
<Filter cfg:name="StarDraw 5.0">
<Installed cfg:type="boolean">true</Installed>
<UIName cfg:type="string" cfg:localized="true">
<cfg:value xml:lang="en-US">StarDraw 5.0</cfg:value>
</UIName>
<Data cfg:type="string">
10,draw_StarDraw_50,com.sun.star.drawing.DrawingDocument,,268435559,,5050,,
</Data>
</Filter>
The following method stores a document using this filter:
/** Store a document, using the StarDraw 5.0 Filter */
protected void storeDocComponent(XComponent xDoc, String storeUrl) throws java.lang.Exception {
XStorable xStorable = UnoRuntime.queryInterface(XStorable.class, xDoc);
PropertyValue[] storeProps = new PropertyValue[1];
storeProps[0] = new PropertyValue();
storeProps[0].Name = "FilterName";
storeProps[0].Value = "StarDraw 5.0";
xStorable.storeAsURL(storeUrl, storeProps);
}
If an empty array of PropertyValue
structs is passed, the native .odg format of LibreOffice is used.
Exporting
Exporting is not a feature of drawing documents. There is a separate service available from the global service manager for exporting, com.sun.star.drawing.GraphicExportFilter. It supports three interfaces: com.sun.star.document.XFilter, com.sun.star.document.XExporter and com.sun.star.document.XMimeTypeInfo.
Exporting is a simple process. After getting a GraphicExportFilter
from the ServiceManager
, use its XExporter
interface to inform the filter which draw page, shape or shape collection to export.
Method of com.sun.star.document.XExporter
:
void setSourceDocument ( [in] com::sun::star::lang::XComponent xDoc)
The method name setSourceDocument()
may be confusing. Actually, the method would allow exporting entire documents, however, it is only possible to export draw pages, single shapes or shape collections from a drawing document. Since these objects support the XComponent interface, the method specification allows maximum flexibility.
Next, run the method filter()
at the XFilter
interface. To interrupt the exporting process, call cancel()
on the same interface.
Methods of com.sun.star.document.XFilter
:
boolean filter( [in] sequence< com::sun::star::beans::PropertyValue > aDescriptor)
void cancel()
Filter Options
The method filter()
takes a sequence of PropertyValue
structs describing the filter parameters. The following properties from the com.sun.star.document.MediaDescriptor are supported:
Properties of com.sun.star.document.MediaDescriptor supported by GraphicExportFilter | |
---|---|
MediaType | Depending on the export filters supported by this component, this is the mime type of the target graphic file. The mime types currently supported are:
image/x-MS-bmp application/dxf application/postscript image/gif image/jpeg image/png image/x-pict image/x-pcx image/x-portable-bitmap image/x-portable-graymap image/x-portable-pixmap image/x-cmu-raster image/targa image/tiff image/x-xbitmap image/x-xpixmap image/svg+xml |
FilterName | This property can been used if no MediaType exists with "Windows Metafile" or "Enhanced Metafile". FilterName has to be set to the extension of these graphic formats (WMF, EMF, BMP).
|
URL | The target URL of the file that is created during export. |
The following example exports a draw page xPage
from a given document xDrawDoc
:
//get draw pages
com.sun.star.drawing.XDrawPagesSupplier xPageSupplier = (com.sun.star.drawing.XDrawPagesSupplier)
UnoRuntime.queryInterface(com.sun.star.drawing.XDrawPagesSupplier.class, xDrawDoc);
com.sun.star.drawing.XDrawPages xDrawPages = xPageSupplier.getDrawPages();
// first page
Object page = xDrawPages.getByIndex(0);
com.sun.star.drawing.XDrawPage xPage = UnoRuntime.queryInterface(
com.sun.star.drawing.XDrawPage.class, page);
Object GraphicExportFilter = xServiceFactory.createInstance(
"com.sun.star.drawing.GraphicExportFilter");
// use the XExporter interface to set xPage as source component
// for the GraphicExportFilter
XExporter xExporter = UnoRuntime.queryInterface(
XExporter.class, GraphicExportFilter );
XComponent xComp = UnoRuntime.queryInterface(XComponent.class, xPage);
xExporter.setSourceDocument(xComp);
// prepare the media descriptor for the filter() method in XFilter
PropertyValue aProps[] = new PropertyValue[2];
aProps[0] = new PropertyValue();
aProps[0].Name = "MediaType";
aProps[0].Value = "image/gif";
// for some graphic formats, e.g. Windows Metafile, there is no Mime type,
// therefore it is also possible to use the property FilterName with
// Filter names as defined in the file TypeDetection.xml (see "Storing")
/* aProps[0].Name = "FilterName";
aProps[0].Value = "WMF - MS Windows Metafile";
*/
aProps[1] = new PropertyValue();
aProps[1].Name = "URL";
aProps[1].Value = "file:///home/images/page1.gif";
// get XFilter interface and launch the export
XFilter xFilter = UnoRuntime.queryInterface(
XFilter.class, GraphicExportFilter);
xFilter.filter(aProps);
Printing Drawing Documents
Printer and Print Job Settings
Printing is a common office functionality. Refer to Chapter Office Development for additional information. The Draw document implements the com.sun.star.view.XPrintable interface for printing. It consists of three methods:
sequence< com::sun::star::beans::PropertyValue > getPrinter()
void setPrinter(
[in] sequence< com::sun::star::beans::PropertyValue > aPrinter)
void print(
[in] sequence< com::sun::star::beans::PropertyValue > xOptions)
To print to the standard printer without settings, use the snippet below with a given document xDoc
:
// query the XPrintable interface from your document
XPrintable xPrintable = UnoRuntime.queryInterface(XPrintable.class, xDoc);
// create an empty printOptions array
PropertyValue[] printOpts = new PropertyValue[0];
// kick off printing
xPrintable.print(printOpts);
There are two groups of properties involved in general printing. The first one is used with setPrinter()
and getPrinter()
, and controls the printer, the second one is passed to print()
and controls the print job.
The method getPrinter()
returns a sequence of PropertyValue
structs describing the printer containing the properties specified in the service com.sun.star.view.PrinterDescriptor. It comprises the following properties:
Properties of com.sun.star.view.PrinterDescriptor | |
---|---|
Name | string - Specifies the name of the printer queue to be used.
|
PaperOrientation | com.sun.star.view.PaperOrientation. Specifies the orientation of the paper. |
PaperFormat | com.sun.star.view.PaperFormat. Specifies a predefined paper size or if the paper size is a user-defined size. |
PaperSize | com.sun.star.awt.Size. Specifies the size of the paper in 1/100 mm. |
IsBusy | boolean - Indicates if the printer is busy.
|
CanSetPaperOrientation | boolean - Indicates if the printer allows changes to PaperOrientation.
|
CanSetPaperFormat | boolean - Indicates if the printer allows changes to PaperFormat.
|
CanSetPaperSize | boolean - Indicates if the printer allows changes to PaperSize.
|
The PrintOptions
offer the following choices for a print job:
Properties of com.sun.star.view.PrintOptions | |
---|---|
CopyCount | short - Specifies the number of copies to print.
|
FileName | string - If set, specifies the name of a file to print to.
|
Collate | boolean - Advises the printer to collate the pages of the copies. If true, a whole document is printed prior to the next copy, otherwise copies for each page are completed together.
|
Pages | string - Specifies the pages to print. It has the same format as in the print dialog of the GUI, for example, 1, 3, 4-7, 9.
|
Wait | boolean - Advises that the print job should be performed synchronously, i.e. wait until printing is complete before returning from printing. Otherwise return is immediate and following actions (e.g. closing the corresponding model) may fail until printing is complete. Default is false.
|
The following method uses PrinterDescriptor
and PrintOptions
to print to a specific printer, and preselect the pages to print:
The following method uses both, PrinterDescriptor
and PrintOptions
, to print to a specific printer and preselect the pages to print:
protected void printDocComponent(XComponent xDoc) throws java.lang.Exception {
XPrintable xPrintable = UnoRuntime.queryInterface(XPrintable.class, xDoc);
PropertyValue[] printerDesc = new PropertyValue[1];
printerDesc[0] = new PropertyValue();
printerDesc[0].Name = "Name";
printerDesc[0].Value = "5D PDF Creator";
xPrintable.setPrinter(printerDesc);
PropertyValue[] printOpts = new PropertyValue[1];
printOpts[0] = new PropertyValue();
printOpts[0].Name = "Pages";
printOpts[0].Value = "1-4,7";
xPrintable.print(printOpts);
}
In Draw documents, one slide is printed as one page on the printer by default. In the example above, slide one through four and slide seven are printed.
Special Print Settings
The printed drawing view (drawings, notes, handout pages, outline), the print quality (color, grayscale), the page options (tile, fit to page, brochure, paper tray) and additional options (page name, date, time, hidden pages) can all be controlled. Settings describes how these settings are used.
Working with Drawing Documents
Document Structure
Draw documents maintain their drawing content on draw pages, master pages and layers. If a new draw document is opened, it contains one slide that corresponds to a com.sun.star.drawing.DrawPage service. Switching to Master View brings up the master page handled by the service com.sun.star.drawing.MasterPage. The Layer View allows access to layers to structure your drawings. These layers can be controlled through com.sun.star.drawing.Layer and com.sun.star.drawing.LayerManager.
Page Handling
Draw and Impress documents supply their pages (slides) through the interface com.sun.star.drawing.XDrawPagesSupplier. The method com.sun.star.drawing.XDrawPagesSupplier:getDrawPages() returns a container of draw pages with a com.sun.star.drawing.XDrawPages interface that is derived from com.sun.star.container.XIndexAccess. That is, XDrawPages
allows accessing, inserting and removing pages of a drawing document:
type getElementType()
boolean hasElements()
long getCount()
any getByIndex(long Index)
com::sun::star::drawing::XDrawPage insertNewByIndex(long nIndex)
void remove(com::sun::star::drawing::XDrawPage xPage)
The example below demonstrates how to access and create draw and master pages. Layers will be described later.
XDrawPagesSupplier xDrawPagesSupplier = UnoRuntime.queryInterface(
XDrawPagesSupplier.class, xComponent);
// XDrawPages inherits from com.sun.star.container.XIndexAccess
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
// get the page count for standard pagesint nPageCount = xDrawPages.getCount();
// get draw page by index
XDrawPage xDrawPage = UnoRuntime.queryInterface(XDrawPage .class,
xDrawPages.getByIndex(nIndex));
/* create and insert a draw page into the given position,
the method returns the newly created page
*/
XDrawPage xNewDrawPage = xDrawPages.insertNewByIndex(0);
// remove the given page
xDrawPages.remove( xDrawPage );
/* now repeat the same procedure as described above for the master pages,
the main difference is to get the XDrawPages from the XMasterPagesSupplier
interface
*/
XMasterPagesSupplier xMasterPagesSupplier = UnoRuntime.queryInterface(
XMasterPagesSupplier.class, xComponent);
XDrawPages xMasterPages = xMasterPagesSupplier.getMasterPages();
// xMasterPages can now be used in the same manner as xDrawPages is used above
Each draw page always has one master page. The interface com.sun.star.drawing.XMasterPageTarget offers methods to get and set the master page that is correlated to a draw page.
// query for MasterPageTarget
XMasterPageTarget xMasterPageTarget = UnoRuntime.queryInterface(
XMasterPageTarget.class, xDrawPage);
// now we can get the corresponding master page
XDrawPage xMasterPage = xMasterPageTarget.getMasterPage();
/* this method now sets a new master page,
it is important to mention that the applied page must be part of the MasterPages
*/
xMasterPageTarget.setMasterPage(xMasterPage);
It is possible to copy pages using the interface [IDL:com.sun.star.drawing.XDrawPageDuplicator] of drawing or presentation documents.
Methods of com.sun.star.drawing.XDrawPageDuplicator:
com::sun::star::drawing::XDrawPage duplicate( [in] com::sun::star::drawing::XDrawPage xPage)
Pass a draw page reference to the method duplicate()
. It appends a new draw page at the end of the page list, using the default naming scheme for pages, "slide n".
Page Partitioning
All units and dimensions are measured in 1/100th of a millimeter. The coordinates are increasing from left to right, and from top to bottom. The upper-left position of a page is (0, 0).
The page size, margins and orientation can be determined using the following properties of a draw page (generic draw page):
Properties of com.sun.star.drawing.GenericDrawPage | |
---|---|
Height | long - Height of the page.
|
Width | long - Width of the page.
|
BorderBottom | long - Bottom margin of the page.
|
BorderLeft | long - Left margin of the page.
|
BorderRight | long - Right margin of the page.
|
BorderTop | long - Top margin of the page.
|
Orientation | com.sun.star.view.PaperOrientation. Determines if the printer output should be turned by 90??. Possible values are: PORTRAIT and LANDSCAPE .
|
Shapes
Drawings consist of shapes on draw pages. Shapes are drawing elements, such as rectangles, circles, polygons, and lines. To create a drawing, get a shape by its service name at the ServiceFactory
of a drawing document and add it to the appropriate DrawPage
.
The code below demonstrates how to create shapes. It consists of a static helper method located in the class ShapeHelper
and will be used throughout this chapter to create shapes. The parameter xComponent
must be a reference to a loaded drawing document. The x
, y
, height
and width
are the desired position and size, and sShapeType
expects a service name for the shape, such as "com.sun.star.drawing.RectangleShape
". The method does not actually insert the shape into a page. It instantiates it and returns the instance to the caller.
The size and position of a shape can be set before adding a shape to a page. After adding the shape, change the shape properties through com.sun.star.beans.XPropertySet.
public static XShape createShape( XComponent xComponent,
int x, int y, int width, int height, String sShapeType) throws java.lang.Exception {
// query the document for the document-internal service factory
XMultiServiceFactory xFactory = UnoRuntime.queryInterface(
XMultiServiceFactory.class, xComponent);
// get the given Shape service from the factory
Object xObj = xFactory.createInstance(sShapeType);
Point aPos = new Point(x, y);
Size aSize = new Size(width, height);
// use its XShape interface to determine position and size before insertion
xShape = UnoRuntime.queryInterface(XShape.class, xObj);
xShape.setPosition(aPos);
xShape.setSize(aSize);
return xShape;
}
The previously declared method will be used to create a simple rectangle shape with a size of 10 cm x 5 cm that is positioned in the upper-left, and inserted into a drawing page.
// query DrawPage for XShapes interface
XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, xDrawPage);
// create the shape
XShape xShape = createShape(xComponent, 0, 0, 10000, 5000, "com.sun.star.drawing.RectangleShape");
// add shape to DrawPage
xShapes.add(xShape);
// set text
XText xText = UnoRuntime.queryInterface( XText.class, xShape );
xText.setString("My new RectangleShape");
// to be able to set Properties a XPropertySet interface is needed
XPropertySet xPropSet = UnoRuntime.queryInterface(XPropertySet.class, xShape);
xPropSet.setPropertyValue("CornerRadius", Integer.valueOf(1000));
xPropSet.setPropertyValue("Shadow", Boolean.TRUE);
xPopSet.setPropertyValue("ShadowXDistance", Integer.valueOf(250));
xPropSet.setPropertyValue("ShadowYDistance", Integer.valueOf(250));
// blue fill color
xPropSet.setPropertyValue("FillColor", Integer.valueOf(0xC0C0C0));
// black line color
xPropSet.setPropertyValue("LineColor", Integer.valueOf(0x000000));
xPropSet.setPropertyValue("Name", "Rounded Gray Rectangle");
The UML diagram in the illustration below describes all services that are included by the com.sun.star.drawing.RectangleShape service and provides an overview of properties that can be used with such a simple shape.
Shape Types
The following table lists all shapes supported in Draw and Impress documents. They come from the com.sun.star.drawing. Each shape is based on com.sun.star.drawing.Shape. Additionally, there are five services in the module com.sun.star.drawing that most of the shapes have in common:
com.sun.star.drawing.Text, com.sun.star.drawing.LineProperties, com.sun.star.drawing.FillProperties and com.sun.star.drawing.ShadowProperties handle shape formatting, whereas com.sun.star.drawing.RotationDescriptor controls rotation and shearing. The section General Drawing Properties below discusses shape formatting in more detail. Refer to the section Shape Operations for information on rotation and shearing.
An x denotes which of these services are supported by each shape. The rightmost column shows the services, interfaces and properties that are specific for the various shapes.
ShapeType | Text | Line Properties | Fill Properties | Shadow Properties | Rotation Descriptor | Supported services, Exported interfaces, Properties |
---|---|---|---|---|---|---|
ClosedBezierShape | included service: | |||||
ConnectorShape | included service: com.sun.star.drawing.ConnectorProperties properties: | |||||
ControlShape | exported interface: com.sun.star.drawing.XControlShape | |||||
EllipseShape | properties:com.sun.star.drawing.CircleKind CircleKind long CircleStartAngle | |||||
GraphicObjectShape | properties: string GraphicURL optional properties: | |||||
GroupShape | exported interfaces: com.sun.star.drawing.XShapeGroup | |||||
LineShape | included service: | |||||
MeasureShape | included service: com.sun.star.drawing.MeasureProperties properties: | |||||
OLE2Shape | properties: string CLSID readonly properties: | |||||
OpenBezierShape | included service: | |||||
PageShape | ||||||
PolyLineShape | included service: | |||||
PolyPolygonBezierShape | included service: | |||||
PolyPolygonShape | included service: | |||||
RectangleShape | properties: long CornerRadius | |||||
TextShape | properties: long CornerRadius | |||||
PluginShape | properties: string PluginMimeType |
Bezier Shapes
Draw supports three different kinds of Bezier curves: OpenBezierShape
, ClosedBezierShape
and PolyPolygonBezierShape
. They are all controlled by com.sun.star.drawing.PolyPolygonBezierDescriptor which is made up of the following properties:
Properties of com.sun.star.drawing.PolyPolygonBezierDescriptor | |
---|---|
PolygonKind | [readonly] com.sun.star.drawing.PolygonKind. Type of the polygon. Possible values are:
|
PolyPolygonBezier | struct com.sun.star.drawing.PolyPolygonBezierCoords. These are the bezier points of the polygon. The struct members are Coordinates and Flags , which are both sequences of sequences. The Coordinates sequence contains com.sun.star.awt.Point structs and the Flags sequence contains com.sun.star.drawing.PolygonFlags enums. Point members are X and Y. Possible PolygonFlags values are:
|
Geometry | com.sun.star.drawing.PolyPolygonBezierCoords. These are the untransformed bezier coordinates of the polygon. The property has the same type as PolyPolygonBezier .
|
The next Java example will demonstrate how to create a ClosedBezierShape
that looks like the following picture.
XShape xPolyPolygonBezier = createShape( xComponent, 0, 0, 0, 0,
"com.sun.star.drawing.ClosedBezierShape");
// take care of the fact that the shape must have been added
// to the page before it is possible to apply changes
XShapes xShapes = UnoRuntime.queryInterface( XShapes.class, xDrawPage);
xShapes.add(xPolyPolygonBezier);
// now it is possible to edit the PropertySet
XPropertySet xShapeProperties = UnoRuntime.queryInterface(
XPropertySet.class, xPolyPolygonBezier);
// The following values are exemplary and provokes that a PolyPolygon of
// sixteen single polygons containing four points each is created. The
// PolyPolygon total point count will be 64.
// If control points are used they are allowed to appear as pair only,
// before and after such pair has to be a normal point.
// A bezier point sequence may look like
// this (n=normal, c=control) : n c c n c c n n c c n
int nPolygonCount = 16;
int nPointCount = 4;
int nWidth = 10000;
int nHeight = 10000;
PolyPolygonBezierCoords aCoords = new PolyPolygonBezierCoords();
// allocating the outer sequence
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 += nHeight / nPolygonCount) {
// create a polygon using two normal and two control points
// allocating the inner sequence
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 = nWidth / 2;
pPolyPoints[1].Y = nHeight;
pPolyFlags[1] = PolygonFlags.CONTROL;
pPolyPoints[2].X = nWidth / 2;
pPolyPoints[2].Y = nHeight;
pPolyFlags [2] = PolygonFlags.CONTROL;
pPolyPoints[3].X = nWidth;
pPolyPoints[3].Y = nY;
pPolyFlags [3] = PolygonFlags.NORMAL;
aCoords.Coordinates[i] = pPolyPoints;
aCoords.Flags[i] = pPolyFlags;
}
try {
xShapeProperties.setPropertyValue("PolyPolygonBezier", aCoords);
} catch (Exception ex)
{
}
Shape Operations
You can modify shapes in many different ways:
- Moving and Scaling
- Rotating and Shearing
- Transforming
- Ordering
- Grouping, Combining and Binding
- General Drawing Properties
- Glue Points and Connectors
- Layer Handling
Moving and Scaling
Moving and scaling of a shape can be done by using the corresponding methods getPosition()
, setPosition()
, getSize()
and setSize()
of the com.sun.star.drawing.XShape interface:
string getShapeType()
com::sun::star::awt::Point getPosition()
void setPosition( [in] com::sun::star::awt::Point aPosition)
com::sun::star::awt::Size getSize()
void setSize( [in] com::sun::star::awt::Size aSize)
Point
and Size
are IDL structs. In Java, these structs are mapped to classes with constructors that take values for the struct members. Therefore, when new is used to instantiate these classes, the coordinates and dimensions are passed to initialize the class members X, Y, Width and Height.
Rotating and Shearing
Most shapes, except OLE and group objects, can be rotated and sheared. All of these objects include the com.sun.star.drawing.RotationDescriptor service that has the properties RotateAngle
and ShearAngle
.
Setting the com.sun.star.drawing.RotationDescriptor rotates or shears a shape:
Properties of com.sun.star.drawing.RotationDescriptor | |
---|---|
RotateAngle | long - This is the angle for rotation of this shape in 1/100th of a degree. The shape is rotated counter-clockwise around the center of the bounding box.
|
ShearAngle | long - This is the amount of shearing for this shape in 1/100th of a degree. The shape is sheared clockwise around the center of the bounding box.
|
The following example shows how a shape can be rotated by 25 degrees counterclockwise:
// xShape will be rotated by 25 degrees
XPropertySet xPropSet = UnoRuntime.queryInterface(
XPropertySet.class, xShape );
xPropSet.setPropertyValue( "RotateAngle", Integer.valueOf( 2500 ) );
Transforming
Changing the size, rotation and shearing of an object can be done by using the transformation mechanism provided by LibreOffice. The matrix of our API is a standard homogenous 3x3 matrix that may be used together with the java.awt.geom.AffineTransform class from Java. The transformation received describes the actual values of the transformations as a linear combination of the single matrices. The basic object without transformation has a size of (1, 1) and a position of (0, 0), and is not rotated or sheared. Thus, to transform an object get its matrix and multiply from the left side to influence the current appearance. To set the whole transformation directly, build a combined matrix of the single values mentioned above and apply it to the object.
XPropertySet xPropSet = UnoRuntime.queryInterface( XPropertySet.class, xShape );
// take the current tranformation matrix
HomogenMatrix3 aHomogenMatrix3 = (HomogenMatrix3)xPropSet.getPropertyValue("Transformation");
java.awt.geom.AffineTransform aOriginalMatrix =
new java.awt.geom.AffineTransform(aHomogenMatrix3.Line1.Column1,
aHomogenMatrix3.Line2.Column1,
aHomogenMatrix3.Line1.Column2,
aHomogenMatrix3.Line2.Column2,
aHomogenMatrix3.Line1.Column3,
aHomogenMatrix3.Line2.Column3 );
// rotate the object by 15 degrees
AffineTransform aNewMatrix1 = new AffineTransform();
aNewMatrix1.setToRotation(Math.toRadians(15));
aNewMatrix1.concatenate(aOriginalMatrix);
// and translate the object by 2cm on the x-axis
AffineTransform aNewMatrix2 = new AffineTransform();
aNewMatrix2.setToTranslation(2000, 0);
aNewMatrix2.concatenate(aNewMatrix1);
double aFlatMatrix[] = new double[6];aNewMatrix2.getMatrix(aFlatMatrix);
// convert the flatMatrix to our HomogenMatrix3 structure
aHomogenMatrix3.Line1.Column1 = aFlatMatrix[0];
aHomogenMatrix3.Line2.Column1 = aFlatMatrix[1];
aHomogenMatrix3.Line1.Column2 = aFlatMatrix[2];
aHomogenMatrix3.Line2.Column2 = aFlatMatrix[3];
aHomogenMatrix3.Line1.Column3 = aFlatMatrix[4];
aHomogenMatrix3.Line2.Column3 = aFlatMatrix[5];
xPropSet.setPropertyValue("Transformation", aHomogenMatrix3);
Ordering
The property ZOrder
of the com.sun.star.drawing.Shape service defines the order a shape is drawn. That is, if there are many shapes on a page, the shape that has the lowest ZOrder
value is drawn first, and the shape that has the highest ZOrder
is drawn last. By using this property it is possible to bring an object to the back or front of a page. It is also possible to switch the order of two shapes as demonstrated in the following example:
XPropertySet xPropSet1 = UnoRuntime.queryInterface(XPropertySet.class, xShape1);
XPropertySet xPropSet2 = UnoRuntime.queryInterface(XPropertySet.class, xShape2);
// get current positions
int nOrderOfShape1 = ((Integer)xPropSet1.getPropertyValue("ZOrder")).intValue();
int nOrderOfShape2 = ((Integer)xPropSet2.getPropertyValue("ZOrder")).intValue();
// set new positions
xPropSet1.setPropertyValue("ZOrder", Integer.valueOf(nOrderOfShape2));
xPropSet2.setPropertyValue("ZOrder", Integer.valueOf(nOrderOfShape1));
Grouping, Combining and Binding
The DrawPage
plays an important role for the handling of multiple shapes. It has three interfaces for this purpose. Its interface com.sun.star.drawing.XShapeGrouper is used to create a group shape from a ShapeCollection
and ungroup existing groups.
Methods of com.sun.star.drawing.XShapeGrouper | |
---|---|
group() | Parameter:
com.sun.star.drawing.XShapes xShapes Groups the shapes inside a collection. They must all be inserted into the same Returns a recently created |
ungroup() | Parameter:
com.sun.star.drawing.XShapeGroup Ungroups a given |
The example below creates a group using the com.sun.star.drawing.XShapeGrouper interface. For this purpose, the shapes that are to be grouped have to be added to a com.sun.star.drawing.ShapeCollection that is created by the com.sun.star.lang.XMultiServiceFactory of the global service manager. It is a container of shapes that is accessed using the interface com.sun.star.drawing.XShapes. The following example accesses the XShapes
interface of the DrawPage
to locate two shapes on the DrawPage
, and uses the XShapes
interface of the ShapeCollection
to add these shapes to the ShapeCollection
. Finally, it employs the XShapeGrouper
interface of the DrawPage
to move the shapes from the ShapeCollection
into a new GroupShape
.
/* try to group the first two objects of the drawpage */
// create a container that will receive the
// shapes that are to be grouped
Object xObj = xMultiServiceFactory.createInstance("com.sun.star.drawing.ShapeCollection");
XShapes xToGroup = UnoRuntime.queryInterface(XShapes.class, xObj);
// query for the shape collection of xDrawPage
XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, xDrawPage);
// test if the shape collection of the page has at least two shapes
if (xShapes.getCount() >= 2) {
// collect shapes we want to group
xToGroup.add(UnoRuntime.queryInterface(XShape.class, xShapes.getByIndex(0)));
xToGroup.add(UnoRuntime.queryInterface(XShape.class, xShapes.getByIndex(1)));
// now group the shapes we have collected by using the XShapeGrouper
XShapeGrouper xShapeGrouper = UnoRuntime.queryInterface(
XShapeGrouper.class, xDrawPage);
xShapeGrouper.group(xToGroup);
}
The service com.sun.star.drawing.GroupShape includes com.sun.star.drawing.Shape and supports two additional interfaces:
- com.sun.star.drawing.XShapes is used to access the shapes in the group.
- com.sun.star.drawing.XShapeGroup handles access to the group.
The interface XShapes
inherits from com.sun.star.container.XIndexAccess, and introduces add()
and remove()
. It contains the following methods:
type getElementType()
boolean hasElements()
long getCount()
any getByIndex( [in] long Index)
void add( [in] com::sun::star::drawing::XShape xShape)
void remove( [in] com::sun::star::drawing::XShape xShape)
Methods of com.sun.star.drawing.XShapeGroup:
string getShapeType()
com::sun::star::awt::Point getPosition()
void setPosition( [in] com::sun::star::awt::Point aPosition)
com::sun::star::awt::Size getSize()
void setSize( [in] com::sun::star::awt::Size aSize)
It is also possible to create GroupShapes directly without using the XShapeGrouper
interface. The following code demonstrates the creation of a com.sun.star.drawing.GroupShape that takes up three other shapes.
// create a group shape first. The size and position does not matter, because
// it depends to the position and size of objects that will be inserted later
XShape xGroup = createShape(xComponent, 0, 0, 0, 0, "com.sun.star.drawing.GroupShape");
// before it is possible to insert shapes,
// the group shape must have been added to the page
XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, xDrawPage);
xShapes.add(xGroup);
// query for the XShapes interface, which will take our new shapes
XShapes xShapesGroup = UnoRuntime.queryInterface(XShapes.class, xGroup);
// new shapes can be inserted into the shape collection directly
xShapesGroup.add( createShape(xComponent, 1000, 1000, 2000, 4000,
"com.sun.star.drawing.EllipseShape"));
xShapesGroup.add( createShape(xComponent, 8000, 8000, 2000, 2000,
"com.sun.star.drawing.EllipseShape"));
xShapesGroup.add( createShape(xComponent, 2000, 3000, 7000, 6000,
"com.sun.star.drawing.LineShape"));
The interface com.sun.star.drawing.XShapeCombiner combines shapes and is equivalent to Modify - Combine in the user interface.
Methods of com.sun.star.drawing.XShapeCombiner | |
---|---|
combine() | Parameter:
Combines shapes. The shapes inside this container are converted to Returns a recently created |
split() | Parameter:
Splits shapes. The |
The draw page interface com.sun.star.drawing.XShapeBinder draws a connection line between the ending point of a line shape (or curve) to the starting point of another line shape (or curve), merging the connected lines into a single shape object. This function corresponds to Modify - Connect in the user interface. It works for area shapes as well, but the connection line usually can not resolve them.
Methods of com.sun.star.drawing.XShapeBinder | |
---|---|
bind() | Parameter:
binds shapes together. A container with shapes that will be bound together. All shapes are converted to a Returns a recently created |
unbind() | Parameter:
breaks a shape into its line segments. The given shape will be converted to a |
General Drawing Properties
This chapter introduces the relevant drawing attributes provided by services, such as com.sun.star.drawing.LineProperties, com.sun.star.drawing.FillProperties and com.sun.star.drawing.TextProperties. The service is described by listing all its properties, followed by an example that uses and explains some of the properties. Each of the following Java examples assumes an already existing valid shape xShape
that has already been inserted into the page.
Colors are given in Hex ARGB format, a four-byte value containing the alpha, red, green and blue components of a color in the format 0xAARRGGBB. The leading component can be omitted if it is zero. The hex format 0xFF0000 is light red, 0xFF00 is green, and 0xFF is blue.
Angles must be given in steps of 1/100th of a degree.
Measures, such as line widths and lengths are given in 100th of a millimeter.
Properties provided by the service :
Properties of com.sun.star.drawing.LineProperties | |
---|---|
LineStyle | com.sun.star.drawing.LineStyle. This enumeration selects the style of the line. |
LineDash | com.sun.star.drawing.LineDash. This enumeration selects the dash of the line |
LineColor | long - Color of the line.
|
LineTransparence | short - Degree of transparency.
|
LineWidth | long - Width of the line in 1/100th of a millimeter.
|
LineJoint | com.sun.star.drawing.LineJoint. Rendering of joints between thick lines. |
LineStartName | [optional] string - Name of the line that starts poly polygon bezier.
|
LineStart | [optional] com.sun.star.drawing.PolyPolygonBezierCoords. Line starts in the form of a poly polygon bezier.
|
LineEnd | [optional] com.sun.star.drawing.PolyPolygonBezierCoords. Line ends in the form of a poly polygon bezier.
|
LineStartCenter | [optional] boolean - If true, the line starts from the center of the polygon.
|
LineStartWidth | [optional] long - Width of the line start polygon. |
LineEndCenter | [optional] boolean - If true, the line ends in the center of the polygon.
|
LineEndWidth | [optional] long - Width of the line end polygon.
|
/* create a blue line with dashes and dots */
XPropertySet xPropSet = UnoRuntime.queryInterface(
XPropertySet.class, xShape );
xPropSet.setPropertyValue( "LineStyle", LineStyle.DASH );
LineDash aLineDash = new LineDash();
aLineDash.Dots = 3;
aLineDash.DotLen = 150;
aLineDash.Dashes = 3;
aLineDash.DashLen = 300;
aLineDash.Distance = 150;
xPropSet.setPropertyValue( "LineDash", aLineDash );
xPropSet.setPropertyValue( "LineColor", Integer.valueOf( 0x0000ff ) );
xPropSet.setPropertyValue( "LineWidth", Integer.valueOf( 200 ) );
Properties of com.sun.star.drawing.FillProperties | |
---|---|
FillStyle | com.sun.star.drawing.FillStyle. This enumeration selects the style that the area is filled with. |
FillColor | long - If the FillStyle is set to SOLID , this is the color used.
|
FillTransparence | short - The transparency of the filled area in percent.
|
FillTransparenceGradientName | string - This is the name of the transparent gradient style used if a gradient is used for transparency, or it is empty. This style is used to set the name of a transparent gradient style contained in the document.
|
FillTransparenceGradient | [optional] com.sun.star.awt.Gradient. Transparency of the fill area as a gradient.
|
FillGradientName | string - If the FillStyle is set to GRADIENT , this is the name of the fill gradient style used.
|
FillGradient | [optional] com.sun.star.awt.Gradient. If the FillStyle is set to GRADIENT , this describes the gradient used.
|
FillHatchName | string - If the FillStyle is set to GRADIENT , this is the name of the fill hatch style used.
|
FillHatch | [optional] com.sun.star.drawing.Hatch. If the FillStyle is set to HATCH , this describes the hatch used.
|
FillBitmapName | string - If the FillStyle is set to BITMAP , this is the name of the fill bitmap style used.
|
FillBitmap | [optional] com.sun.star.awt.XBitmap. If the FillStyle is set to BITMAP , this is the bitmap used.
|
FillBitmapURL | [optional] string . If the FillStyle is set to BITMAP , this is a URL to the bitmap used.
|
FillBitmapOffsetX | short - Horizontal offset where the tile starts.
|
FillBitmapOffsetY | short - Vertical offset where the tile starts. It is given in percent in relation to the width of the bitmap.
|
FillBitmapPositionOffsetX | short - Every second line of tiles is moved the given percent of the width of the bitmap.
|
FillBitmapPositionOffsetY | short - Every second row of tiles is moved the given percent of the width of the bitmap.
|
FillBitmapRectanglePoint | com.sun.star.drawing.RectanglePoint. The RectanglePoint specifies the position inside of the bitmap to use as the top-left position for rendering.
|
FillBitmapLogicalSize | boolean - Specifies if the size is given in percentage or as an absolute value.
|
FillBitmapSizeX | long - Width of the tile for filling.
|
FillBitmapSizeY | long - Height of the tile for filling.
|
FillBitmapMode | com.sun.star.drawing.BitmapMode. Enumeration selects how an area is filled with a single bitmap. |
FillBackground | boolean - If true , the transparent background of a hatch filled area is drawn in the current background color.
|
/* apply a gradient fill style that goes from top left to bottom
right and is changing its color from green to yellow */
XPropertySet xPropSet = UnoRuntime.queryInterface(
XPropertySet.class, xShape );
xPropSet.setPropertyValue( "FillStyle", FillStyle.GRADIENT );
Gradient aGradient = new Gradient();
aGradient.Style = GradientStyle.LINEAR;
aGradient.StartColor = 0x00ff00;
aGradient.EndColor = 0xffff00;
aGradient.Angle = 450;
aGradient.Border = 0;
aGradient.XOffset = 0;
aGradient.YOffset = 0;
aGradient.StartIntensity = 100;
aGradient.EndIntensity = 100;
aGradient.StepCount = 10;
xPropSet.setPropertyValue( "FillGradient", aGradient );
Properties of com.sun.star.drawing.TextProperties | |
---|---|
IsNumbering | [optional] boolean - If true, numbering is on for the text of this shape.
|
NumberingRules | [optional] com.sun.star.container.XIndexReplace. Describes the numbering levels.
|
TextAutoGrowHeight | boolean - If true, the height of the shape is automatically expanded or shrunk when text is added or removed from the shape.
|
TextAutoGrowWidth | boolean - If true, the width of the shape is automatically expanded or shrunk when text is added or removed from the shape.
|
TextContourFrame | boolean - If true, the left edge of every line of text is aligned with the left edge of this shape.
|
TextFitToSize | com.sun.star.drawing.TextFitToSizeType. Determines how the text inside of the Shape is stretched to fit in the Shape . Possible values are NONE , PROPORTIONAL , ALLLINES , and RESIZEATTR .
|
TextHorizontalAdjust | com.sun.star.drawing.TextHorizontalAdjust. Adjusts the horizontal position of the text inside of the shape. |
TextVerticalAdjust | com.sun.star.drawing.TextVerticalAdjust. Adjusts the vertical position of the text inside of the shape. |
TextLeftDistance | long - Distance from the left edge of the shape to the left edge of the text.
|
TextRightDistance | long - Distance from the right edge of the shape to the right edge of the text.
|
TextUpperDistance | long - Distance from the upper edge of the shape to the upper edge of the text.
|
TextLowerDistance | long - Distance from the lower edge of the shape to the lower edge of the text.
|
TextMaximumFrameHeight | long - Maximum height of the surrounding frame.
|
TextMaximumFrameWidth | long - Maximum width of the surrounding frame.
|
TextMinimumFrameHeight | long - Minimum height of the surrounding frame.
|
TextMinimumFrameWidth | long - Minimum width of the surrounding frame.
|
TextAnimationAmount | short - Number of pixels that the text is moved in each animation step.
|
TextAnimationCount | short - Defines how many times the text animation is repeated.
|
TextAnimationDelay | short - Delay between the animation steps in thousandths of a second.
|
TextAnimationDirection | com.sun.star.drawing.TextAnimationDirection. This enumeration defines the direction that the text moves. |
TextAnimationKind | com.sun.star.drawing.TextAnimationKind. Defines the type of animation. |
TextAnimationStartInside | boolean . If true, the text is visible at the start of the animation.
|
TextAnimationStopInside | boolean . If true, the text is visible at the end of the animation.
|
TextWritingMode | com.sun.star.text.WritingMode. This value selects the writing mode for the text. |
The service com.sun.star.drawing.TextProperties includes com.sun.star.style.ParagraphProperties and com.sun.star.style.CharacterProperties. Since these services contain optional properties, the properties actually supported by drawing shapes are listed. Refer to the API reference or explanations or Formatting.
The service com.sun.star.drawing.TextProperties includes com.sun.star.style.ParagraphProperties and com.sun.star.style.CharacterProperties. Since these services contain many optional properties, we list the properties actually supported by drawing shapes. Please look up the explanations in the API reference or in Formatting.
com.sun.star.style.CharacterProperties of drawing text | |
---|---|
CharAutoKerning | boolean
|
CharColor | long
|
CharContoured | boolean
|
CharCrossedOut | boolean
|
CharEmphasis | short
|
CharEscapement | short
|
CharEscapementHeight | byte
|
CharFontCharSet | short
|
CharFontFamily | short
|
CharFontName | string
|
CharFontPitch | short
|
CharFontStyleName | string
|
CharHeight | float
|
CharKerning | short
|
CharLocale | com.sun.star.lang.Locale |
CharPosture | com.sun.star.awt.FontSlant |
CharRelief | short
|
CharScaleWidth | short
|
CharShadowed | boolean
|
CharStrikeout | short
|
CharUnderline | short
|
CharUnderlineColor | long
|
CharUnderlineHasColor | boolean
|
CharWeight | float
|
CharWordMode | boolean
|
There are Asian counterparts for a number of character properties.
com.sun.star.style.CharacterPropertiesAsian of drawing shapes | |
---|---|
CharFontPitchAsian | short
|
CharFontStyleNameAsian | string
|
CharHeightAsian | float
|
CharPostureAsian | com.sun.star.awt.FontSlant |
CharLocaleAsian | com.sun.star.lang.Locale |
CharWeightAsian | float
|
There is also a Complex
flavor of the same properties:
Paragraphs in drawing text support a selection of com.sun.star.style.ParagraphProperties:
Properties of com.sun.star.style.ParagraphProperties | |
---|---|
ParaAdjust | short
|
ParaBottomMargin | long
|
ParaFirstLineIndent | long
|
ParaIsHyphenation | boolean
|
ParaLastLineAdjust | short
|
ParaLeftMargin | long
|
ParaLineSpacing | com.sun.star.style.LineSpacing |
ParaRightMargin | long
|
ParaTabStops | sequence <com.sun.star.style.TabStop > |
ParaTopMargin | long
|
ParaUserDefinedAttributes | com.sun.star.uno.XInterface |
And of com.sun.star.style.ParagraphPropertiesAsian:
Properties of com.sun.star.style.ParagraphPropertiesAsian | |
---|---|
ParaIsCharacterDistance | boolean
|
ParaIsForbiddenRules | boolean
|
ParaIsHangingPunctuation | boolean
|
The next example introduces a method that appends single text portions to a shape. It returns the XPropertySet interface of the text range that has been added.
/** add text to a shape.
the return value is the PropertySet of the text range that has been added
*/
public static XPropertySet addPortion(XShape xShape, String sText, boolean bNewParagraph)
throws com.sun.star.lang.IllegalArgumentException {
XText xText = UnoRuntime.queryInterface(XText.class, xShape);
XTextCursor xTextCursor = xText.createTextCursor();
xTextCursor.gotoEnd(false);
if (bNewParagraph) {
xText.insertControlCharacter(xTextCursor, ControlCharacter.PARAGRAPH_BREAK, false);
xTextCursor.gotoEnd(false);
}
XTextRange xTextRange = UnoRuntime.queryInterface(XTextRange.class, xTextCursor);
xTextRange.setString(sText);
xTextCursor.gotoEnd(true);
XPropertySet xPropSet = UnoRuntime.queryInterface(XPropertySet.class, xTextRange);
return xPropSet;
}
Using the previous method, the next example creates a rectangle shape that has a border of 2.5 cm with the text of two paragraphs is stretched by using the com.sun.star.drawing.TextFitToSizeType property. The text of the first paragraph is then colored green, and the second red. The Editing Text provides further details of handling text.
createShape(xComponent, new Point(0,0),
new Size(21000, 12500), "com.sun.star.drawing.RectangleShape");
xShapes.add(xRectangle);
xShapePropSet = UnoRuntime.queryInterface(XPropertySet.class, xRectangle);
// TextFitToSize
xShapePropSet.setPropertyValue("TextFitToSize", TextFitToSizeType.PROPORTIONAL);
// border size
xShapePropSet.setPropertyValue("TextLeftDistance", Integer.valueOf(2500));
xShapePropSet.setPropertyValue("TextRightDistance", Integer.valueOf(2500));
xShapePropSet.setPropertyValue("TextUpperDistance", Integer.valueOf(2500));
xShapePropSet.setPropertyValue("TextLowerDistance", Integer.valueOf(2500));
xTextPropSet = ShapeHelper.addPortion(xRectangle, "using TextFitToSize", false);
xTextPropSet.setPropertyValue("ParaAdjust", ParagraphAdjust.CENTER);
xTextPropSet.setPropertyValue("CharColor", Integer.valueOf(0xff00 ));
xTextPropSet = ShapeHelper.addPortion(xRectangle, "and a Border distance of 2,5 cm", true);
xTextPropSet.setPropertyValue("CharColor", Integer.valueOf(0xff0000));
Many shapes cast shadows. The ShadowProperties
controls how this shadow looks:
Properties of com.sun.star.drawing.ShadowProperties | |
---|---|
Shadow | boolean - Enables or disables the shadow of a shape.
|
ShadowColor | long - Color of the shadow of the shape.
|
ShadowTransparence | short - Defines the degree of transparency of the shadow in percent.
|
ShadowXDistance | long - Horizontal distance between the left edge of the shape and the shadow.
|
ShadowYDistance | long - Vertical distance between the top edge of the shape and the shadow.
|
Glue Points and Connectors
By default, there are four gluepoints available that are used within the properties StartGluePointIndex
and EndGluePointIndex
. If a connector connects to the top, bottom, left or right of a shape, a new gluepoint is not created. The four directions are declared in the following example.
The first example demonstrates how to create a com.sun.star.drawing.ConnectorShape and connect it to two other shapes using the gluepoint index property.
XDrawPagesSupplier xDrawPagesSupplier = UnoRuntime.queryInterface(
XDrawPagesSupplier.class, xComponent);
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
XPage xPage = UnoRuntime.queryInterface(XDrawPage.class, xDrawPages.getByIndex(0));
XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, xPage);
// create two rectangles
XShape xShape1 = ShapeHelper.createShape(xDrawDoc, new Point(15000, 1000), new Size(5000, 5000),
"com.sun.star.drawing.RectangleShape");
XShape xShape2 = ShapeHelper.createShape(xDrawDoc, new Point(2000, 15000), new Size(5000, 5000),
"com.sun.star.drawing.EllipseShape");
// and a connector
XShape xConnector = ShapeHelper.createShape(xDrawDoc,
new Point(0, 0), new Size(0, 0), "com.sun.star.drawing.ConnectorShape");
xShapes.add(xShape1);
xShapes.add(xShape2);
xShapes.add(xConnector);
XPropertySet xConnectorPropSet = UnoRuntime.queryInterface(
XPropertySet.class, xConnector);
// Index value of 0 : the shape is connected at the top
// Index value of 1 : the shape is connected at the left
// Index value of 2 : the shape is connected at the bottom
// Index value of 3 : the shape is connected at the right
int nStartIndex = 3;
int nEndIndex = 1;
// the "StartPosition" or "EndPosition" property needs not to be set
// if there is a shape to connect
xConnectorPropSet.setPropertyValue("StartShape", xShape1);
xConnectorPropSet.setPropertyValue("StartGluePointIndex", Integer.valueOf(nStartIndex));
xConnectorPropSet.setPropertyValue("EndShape", xShape2);
xConnectorPropSet.setPropertyValue("EndGluePointIndex", Integer.valueOf(nEndIndex));
The next example demonstrates the usage of user defined gluepoints.
XGluePointsSupplier xGluePointsSupplier;
XIndexContainer xIndexContainer;
XIdentifierContainer xIdentifierContainer;
/* take care to use the structure GluePoint2 and not
GluePoint, because otherwise the XIdentifierContainer
won't accept it
*/
GluePoint2 aGluePoint = new GluePoint2();
aGluePoint.IsRelative = false;
aGluePoint.PositionAlignment = Alignment.CENTER;
aGluePoint.Escape = EscapeDirection.SMART;
aGluePoint.IsUserDefined = true;
aGluePoint.Position.X = 0;
aGluePoint.Position.Y = 0;
// create and insert a gluepoint at shape1
xGluePointsSupplier = UnoRuntime.queryInterface(
XGluePointsSupplier.class, xShape1);
xIndexContainer = xGluePointsSupplier.getGluePoints();
xIdentifierContainer = UnoRuntime.queryInterface(
XIdentifierContainer.class, xIndexContainer);
int nIndexOfGluePoint1 = xIdentifierContainer.insert(aGluePoint);
// create and insert a gluepoint at shape2
xGluePointsSupplier = (XGluePointsSupplier)
UnoRuntime.queryInterface(XGluePointsSupplier.class, xShape2);
xIndexContainer = xGluePointsSupplier.getGluePoints();
xIdentifierContainer = UnoRuntime.queryInterface(
XIdentifierContainer.class, xIndexContainer);
int nIndexOfGluePoint2 = xIdentifierContainer.insert(aGluePoint);
// create and add a connector
XShape xConnector2 = ShapeHelper.createShape(xDrawDoc,
new Point(0, 0), new Size(0, 0), "com.sun.star.drawing.ConnectorShape");
xShapes.add( xConnector2 );
XPropertySet xConnector2PropSet = UnoRuntime.queryInterface(
XPropertySet.class, xConnector2);
xConnector2PropSet.setPropertyValue("StartShape", xShape1);
xConnector2PropSet.setPropertyValue("StartGluePointIndex", Integer.valueOf(nIndexOfGluePoint1));
xConnector2PropSet.setPropertyValue( "EndShape", xShape2 );
xConnector2PropSet.setPropertyValue( "EndGluePointIndex", Integer.valueOf(nIndexOfGluePoint2));
Layer Handling
In Draw and Impress, each shape is associated to exactly one layer. The layer has properties that specify if connected shapes are visible, printable or editable.
The service com.sun.star.drawing.DrawingDocument implements the interface com.sun.star.drawing.XLayerSupplier that gives access to the com.sun.star.drawing.XLayerManager interface. The com.sun.star.drawing.XLayerManager interface is used to create and edit a layer, and is used to attach a layer to a shape.
XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, xPage);
XShape xRect1 = ShapeHelper.createShape(xComponent, new Point(1000, 1000), new Size(5000, 5000),
"com.sun.star.drawing.RectangleShape");
XShape xRect2 = ShapeHelper.createShape(xComponent, new Point(1000, 7000), new Size(5000, 5000),
"com.sun.star.drawing.RectangleShape" );
xShapes.add(xRect1);
xShapes.add(xRect2);
XPropertySet xTextProp = ShapeHelper.addPortion(xRect2, "this shape is locked", false);
xTextProp.setPropertyValue("ParaAdjust", ParagraphAdjust.CENTER);
ShapeHelper.addPortion(xRect2, "and the shape above is not visible", true);
ShapeHelper.addPortion(xRect2, "(switch to the layer view to gain access)", true);
// query for the XLayerManager
XLayerSupplier xLayerSupplier = UnoRuntime.queryInterface(
XLayerSupplier.class, xComponent);
XNameAccess xNameAccess = xLayerSupplier.getLayerManager();
XLayerManager xLayerManager = UnoRuntime.queryInterface(
XLayerManager.class, xNameAccess);
// create a layer and set its properties
XPropertySet xLayerPropSet;
XLayer xNotVisibleAndEditable = xLayerManager.insertNewByIndex(xLayerManager.getCount());
xLayerPropSet = UnoRuntime.queryInterface(
XPropertySet.class, xNotVisibleAndEditable);
xLayerPropSet.setPropertyValue("Name", "NotVisibleAndEditable");
xLayerPropSet.setPropertyValue("IsVisible", Boolean.FALSE);
xLayerPropSet.setPropertyValue("IsLocked", Boolean.TRUE);
// create a second layer
XLayer xNotEditable = xLayerManager.insertNewByIndex(xLayerManager.getCount());
xLayerPropSet = UnoRuntime.queryInterface(XPropertySet.class, xNotEditable);
xLayerPropSet.setPropertyValue("Name", "NotEditable" );
xLayerPropSet.setPropertyValue("IsVisible", Boolean.TRUE);
xLayerPropSet.setPropertyValue("IsLocked", Boolean.TRUE);
// attach the layer to the rectangles
xLayerManager.attachShapeToLayer(xRect1, xNotVisibleAndEditable);
xLayerManager.attachShapeToLayer(xRect2, xNotEditable);
Inserting Files
Currently it is not possible to insert slides from a drawing or presentation into a drawing document through API. To accomplish this, use the Insert – File command from the menu.
Initially, shapes in a document can only be accessed by their index. The only method to get more information about a shape on the page is to test for the shape type, so it is impossible to identify a particular shape. However, after a shape is inserted, you can name it in the user interface or through the shape interface com.sun.star.container.XNamed, and identify the shape by its name after retrieving it by index. Shapes cannot be accessed by their names.
Searching and replacing text in Drawing documents retrieves the shapes that contain the text that is searched for. For more information, refer to Search and Replace.
Handling Presentation Document Files
Creating and Loading Presentation Documents
The URL that must be used with loadComponentFromURL()
for new presentation documents is "private:factory/simpress
".
To avoid the initial dialog in new presentation documents, set the property Silent
defined in com.sun.star.document.MediaDescriptor to true. This property has to be used with the sequence of PropertyValue
structs that is passed to loadComponentFromURL()
.
The snippet below loads a new presentation document in silent mode:
// the method getRemoteServiceManager is described in the chapter First Steps
mxRemoteServiceManager = this.getRemoteServiceManager();
// retrieve the Desktop object, we need its XComponentLoader
Object desktop = mxRemoteServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", mxRemoteContext);
// query the XComponentLoader interface from the Desktop service
XComponentLoader xComponentLoader = UnoRuntime.queryInterface(
XComponentLoader.class, desktop);
// define load properties according to com.sun.star.document.MediaDescriptor
// the boolean property Silent tells the office to suppress the impress startup wizard
PropertyValue[] loadProps = new PropertyValue[1];
loadProps[0] = new PropertyValue();
loadProps[0].Name = "Silent";
loadProps[0].Value = Boolean.TRUE;
// load
com.sun.star.uno.XComponent xComponentLoader.loadComponentFromURL(
"private:factory/simpress", "_blank", 0, loadProps);
Printing Presentation Documents
Presentation documents have the following specific properties to define if the notes and outline view should be printed:
Properties of com.sun.star.presentation.DocumentSettings | |
---|---|
IsPrintNotes | boolean - Specifies if the notes are also printed.
|
IsPrintOutline | boolean - Specifies if the outline is also printed.
|
Settings describes how these settings are used.
Working with Presentation Documents
The structure of Impress documents is enhanced by a handout page per document, one notes page per draw page, and one notes master page for each master page. This means that the creation of normal draw and draw master pages automatically create corresponding notes and notes master pages. Due to this fact there are no interfaces for creation or deletion of notes or notes master pages.
The following UML diagram describes the whole page structure of Impress. The horizontal dotted line illustrates the general page structure lying beneath the dotted line, and the enhanced page structure of Impress lying above.
Calling getDrawPages()
at the com.sun.star.drawing.XDrawPagesSupplier interface of a presentation document retrieves a collection of com.sun.star.presentation.DrawPage instances with presentation specific properties.
The following two examples demonstrate how to access the notes pages and the handout page of an Impress document:
/** in Impress documents each draw page as also each draw master page has
a corresponding notes page
*/
static public XDrawPage getNotesPage(XDrawPage xDrawPage) {
XDrawPage xNotesPage;
XPresentationPage xPresentationPage = UnoRuntime.queryInterface(
XPresentationPage.class, xDrawPage);
/* only Impress pages support the XPresentationPage interface,
for all other pages the interface will be zero, so a test
won't hurt
*/
if (xPresentationPage != null)
xNotesPage = xPresentationPage.getNotesPage();
return xNotesPage;
}
The notes master page that corresponds to a notes page can be accessed by the com.sun.star.presentation.XPresentation interface of the master page.
/** in impress each document has one handout page */
static public XDrawPage getHandoutMasterPage(XComponent xComponent) {
XHandoutMasterSupplier aHandoutMasterSupplier =
UnoRuntime.queryInterface(
XHandoutMasterSupplier.class, xComponent);
return aHandoutMasterSupplier.getHandoutMasterPage();
}
Presentation Settings
Impress documents contain a Presentation service that controls a running presentation. This com.sun.star.presentation.Presentation service can be accessed through the com.sun.star.presentation.XPresentationSupplier interface through the method:
com::sun::star::presentation::XPresentation getPresentation()
The method getPresentation()
returns a com.sun.star.presentation.Presentation service. It contains properties for presentation settings and the interface com.sun.star.presentation.XPresentation.
The presentation settings define the slide range, which custom show is used, and how the presentation is executed. These settings are provided as properties of the service com.sun.star.presentation.Presentation. This service also exports the com.sun.star.presentation.XPresentation interface that starts and ends a presentation.
Methods of com.sun.star.presentation.XPresentation | |
---|---|
start() | Starts the presentation in full-screen mode. |
end() | Stops the presentation. |
rehearseTimings() | Starts the presentation from the beginning and shows the actual running time to the user. |
Properties of com.sun.star.presentation.Presentation | |
---|---|
AllowAnimations | boolean - Enables/disables the shape animations.
|
CustomShow | string - Contains the name of a customized show that is used for the presentation.
|
Presentation:FirstPage | string - Contains the name of the page where the presentation is started.
|
IsAlwaysOnTop | boolean - If true, the window of the presentation is always on top of all the other windows.
|
IsAutomatic | boolean - If true, all pages are changed automatically.
|
IsEndless | boolean - If true, the presentation is repeated endlessly.
|
IsFullScreen | boolean - If true, the presentation runs in full-screen mode.
|
IsLivePresentation | boolean - With this property, the presentation is set to live mode.
|
IsMouseVisible | boolean - If true, the mouse is visible during the presentation.
|
Pause | long - Duration of the black screen after the presentation has finished.
|
StartWithNavigator | boolean - If true, the Navigator is opened at the start of the presentation.
|
UsePen | boolean - If true, a pen is shown during presentation.
|
IsShowAll | boolean - Show all slides.
|
IsShowLogo | boolean - Show LibreOffice logo on pause page in automatic mode.
|
IsTransitionOnClick | boolean - Slide change on mouse click, in addition to pressing cursor right.
|
The properties IsShowAll
, IsShowLogo
and IsTransitionOnClick
are currently not documented in the API reference.
The next example demonstrates how to start a presentation that is automatically repeated and plays in full-screen mode by modifying the presentation settings.
XPresentationSupplier xPresSupplier = UnoRuntime.queryInterface(
XPresentationSupplier.class, xComponent);
XPresentation xPresentation = xPresSupplier.getPresentation();
XPropertySet xPresPropSet = UnoRuntime.queryInterface(
XPropertySet.class, xPresentation);
xPresPropSet.setPropertyValue("IsEndless", Boolean.TRUE);
xPresPropSet.setPropertyValue("IsFullScreen", Boolean.TRUE);
xPresPropSet.setPropertyValue("Pause", Integer.valueOf(0));
xPresentation.start();
Custom Slide Show
Custom presentations are available at the com.sun.star.presentation.XCustomPresentationSupplier interface of the presentation document. It contains the method:
com::sun::star::container::XNameContainer getCustomPresentations()
The method getCustomPresentations()
returns a com.sun.star.presentation.CustomPresentationAccess service that consists of the interfaces com.sun.star.container.XNameContainer and com.sun.star.lang.XSingleServiceFactory. The standard API interface com.sun.star.container.XNameContainer derived from XNameContainer obtains existing Custom Presentations and to add new custom presentations by name. It introduces the methods:
void replaceByName( [in] string aName, [in] any aElement)
void insertByName( [in] string aName, [in] any aElement)
void removeByName( [in] string Name)
To add a new CustomPresentation
, create it using createInstance()
at the XSingleServiceFactory
interface of the CustomPresentationAccess
.
Methods of com.sun.star.lang.XSingleServiceFactory:
com::sun::star::uno::XInterface createInstance()
com::sun::star::uno::XInterface createInstanceWithArguments( [in] sequence< any aArguments >)
The CustomPresentation
is now created. Its content consists of a com.sun.star.presentation.CustomPresentation. From the API, it is a named container of selected presentation draw pages. Draw pages can be added to a custom presentation or removed using its interface com.sun.star.container.XIndexContainer. In addition to the methods of an XIndexAccess
, this standard API interface supports the following operations:
Methods introduced by com.sun.star.container.XIndexContainer
:
void replaceByIndex( [in] long Index, [in] any Element)
void insertByIndex( [in] long Index, [in] any Element)
void removeByIndex( [in] long Index)
The name of a CustomPresentation
is read and written using the interface com.sun.star.container.XNamed:
Methods of XNamed
:
string getName()
void setName( [in] string aName)
A custom show is a collection of slides in a user-defined order that can be executed as a presentation. It is also possible to use a slide twice or skip slides. For instance, it is possible to create a short version of a presentation and a long version within the same document. The number of custom shows is unlimited.
The next example demonstrates how to create two custom shows and set one of them as an active presentation.
XDrawPagesSupplier xDrawPagesSupplier = UnoRuntime.queryInterface(
XDrawPagesSupplier.class, xComponent);
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
// take care that this document has ten pages
while (xDrawPages.getCount() < 10)
xDrawPages.insertNewByIndex(0);
// assign a name to each page
String aNameArray[] = {"Introduction", "page one", "page two", "page three", "page four",
"page five", "page six", "page seven", "page eight", "page nine"};
int i;
for (i = 0; i < 10; i++) {
XNamed xPageName = UnoRuntime.queryInterface(XNamed.class, xDrawPages.getByIndex(i));
xPageName.setName(aNameArray[i]);
}
/* create two custom shows, one will play slide 6 to 10 and is named "ShortVersion"
the other one will play slide 2 til 10 and is named "LongVersion"
*/
XCustomPresentationSupplier xCustPresSupplier = (XCustomPresentationSupplier)
UnoRuntime.queryInterface(XCustomPresentationSupplier.class, xComponent);
/* the following container is a container for further container
which concludes the list of pages that are to play within a custom show
*/
XNameContainer xNameContainer = xCustPresSupplier.getCustomPresentations();
XSingleServiceFactory xFactory = UnoRuntime.queryInterface(
XSingleServiceFactory.class, xNameContainer);
Object xObj;
XIndexContainer xContainer;
/* instanciate an IndexContainer that will take
a list of draw pages for the first custom show
*/
xObj = xFactory.createInstance();
xContainer = (XIndexContainer)
UnoRuntime.queryInterface(XIndexContainer.class, xObj);
for (i = 5; i < 10; i++)
xContainer.insertByIndex(xContainer.getCount(), xDrawPages.getByIndex(i));
xNameContainer.insertByName("ShortVersion", xContainer);
/* instanciate an IndexContainer that will take
a list of draw page for a second custom show
*/
xObj = xFactory.createInstance();
xContainer = UnoRuntime.queryInterface(XIndexContainer.class, xObj);
for (i = 1; i < 10; i++)
xContainer.insertByIndex(xContainer.getCount(), xDrawPages.getByIndex(i));
xNameContainer.insertByName("LongVersion", xContainer);
/* which custom show is to use
can been set in the presentation settings
*/
XPresentationSupplier xPresSupplier = UnoRuntime.queryInterface(
XPresentationSupplier.class, xComponent);
XPresentation xPresentation = xPresSupplier.getPresentation();
XPropertySet xPresPropSet = UnoRuntime.queryInterface(
XPropertySet.class, xPresentation);
xPresPropSet.setPropertyValue("CustomShow", "ShortVersion");
Presentation Effects
There are two kinds of presentation effects, the fading of one page to another, and the animation of objects and texts within a slideshow.
Slide Transition
In Impress, each page has its own slide transition that can be composed by the properties of the service com.sun.star.presentation.DrawPage.
Setting the following properties enables slide transition:
Properties of com.sun.star.presentation.DrawPage | |
---|---|
Change | long - Specifies how the page change is triggered. If this is 0, the user must click to start each object animation and to change the page. If set to 1, the page is automatically switched. If it is set to 2, all object effects run automatically, but the user has to click on the page to change it.
|
Duration | long - If the property Change is set to 1, this property is the time in seconds the page is shown, before switching to the next page.
|
Effect | com.sun.star.presentation.FadeEffect. This is the effect that is used to fade in the page. |
Speed | com.sun.star.presentation.AnimationSpeed. Defines the speed of the fade-in effect of the page. Possible values are:
|
Layout | short - This number specifies a presentation layout for this page, if this property is not ZERO.
|
The next table contains all available com.sun.star.presentation.FadeEffect enum values:
NONE | RANDOM | DISSOLVE |
FADE_FROM_LEFT FADE_FROM_RIGHT |
MOVE_FROM_LEFT MOVE_FROM_RIGHT |
UNCOVER_TO_LEFT UNCOVER_TO_RIGHT |
FADE_TO_CENTER FADE_FROM_CENTER |
VERTICAL_STRIPES HORIZONTAL_STRIPES |
CLOCKWISE COUNTERCLOCKWISE |
ROLL_FROM_LEFT ROLL_FROM_RIGHT |
CLOSE_VERTICAL CLOSE_HORIZONTAL |
SPIRALIN_LEFT SPIRALIN_RIGHT |
WAVYLINE_FROM_LEFT WAVYLINE_FROM_RIGHT |
STRETCH_FROM_LEFT STRETCH_FROM_RIGHT |
VERTICAL_LINES HORIZONTAL_LINES |
VERTICAL_CHECKERBOARD HORIZONTAL_CHECKERBOARD |
The following Java example shows how to set slide transition effects that are applied to the first page.
// set the slide transition effect of the first page
XDrawPagesSupplier xDrawPagesSupplier =UnoRuntime.queryInterface(
XDrawPagesSupplier.class, xComponent);
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
XDrawPage xDrawPage = UnoRuntime.queryInterface(XDrawPage.class,
xDrawPages.getByIndex(0));
xShapes = UnoRuntime.queryInterface(XShapes.class, xDrawPage);
XPropertySet xPropSet = UnoRuntime.queryInterface(XPropertySet.class, xDrawPage);
// set the slide transition effect properties
xPropSet.setPropertyValue("Effect", com.sun.star.presentation.FadeEffect.RANDOM);
xPropSet.setPropertyValue("Speed", com.sun.star.presentation.AnimationSpeed.MEDIUM);
/* Change specifies how the page change is triggered. If this
is 0, the user must click to start each object animation
and to change the page. If set to 1, the page is
automatically switched. If it is set to 2, all object
effects run automatically, but the user has to click on the
page to change it.
*/
xPropSet.setPropertyValue("Change", Integer.valueOf(1));
/* If the property DrawPage::Change is set to 1, Duration specifies the
time in seconds the page is shown before switching to the next page.
*/
xPropSet.setPropertyValue("Duration", Integer.valueOf(5));
Animations and Interactions
In a Presentation, each shape of the draw and master page provides the com.sun.star.presentation.Shape service with a number of properties that describe the manner the shape is displayed or acting in a presentation.
There are two kinds of shape effects. The first kind of effects are visual changes, such as animations and dimming effects. The second kind of effects are OnClick
actions. All of these effects are controlled by the properties of a presentation shape:
Properties of com.sun.star.presentation.Shape | |
---|---|
OnClick | com.sun.star.presentation.ClickAction. Selects an action performed after the user clicks on this shape. Possible values are:
|
Bookmark | string - A generic URL for the property OnClick .
|
Verb | long - Valid only for OLE shapes. Specifies an "OLE2" verb for the ClickAction VERB in the property OnClick . For possible verbs, select the OLE shape, and point the cursor to Edit - Object. The order of appearance corresponds to the value needed for Verb .
|
DimPrevious | boolean - Only valid when Effect contains an AnimationEffect . If true , this shape is painted using DimColor on the next click after finishing the AnimationEffect .
|
DimHide | boolean - Only valid when Effect contains an AnimationEffect . If this property and the property DimPrevious are both true, the shape is hidden on the next click after the AnimationEffect has finished.
|
DimColor | long - Only valid when Effect contains an AnimationEffect . This color is used to paint the shape on the next click after the animation effect has finished. The property DimPrevious must be true and DimHide must be false for this property to work.
|
Effect | com.sun.star.presentation.AnimationEffect. Selects the animation effect of this shape. For possible values see the table below. |
PresentationOrder | long - This is the position of this shape in the order of the shapes that can be animated on its page. The animations are executed in the order given in PresentationOrder , starting at the shape with the PresentationOrder 1 . You can change the order by changing this number. Setting it to 1 makes this shape the first shape in the execution order for the animation effects.
|
SoundOn | boolean - If true, the sound file specified in Sound is played while the animation effect is executed.
|
Sound | string - This is the URL to a sound file that is played while the animation effect of this shape is running.
|
PlayFull | boolean - If true, the sound specified in the Sound property of this shape is played completely. If false, the sound stops after completing the AnimationEffect specified in Effect.
|
Speed | com.sun.star.presentation.AnimationSpeed This is the speed of the animation effect. Possible values: SLOW , MEDIUM , and FAST .
|
TextEffect | com.sun.star.presentation.AnimationEffect. This is the animation effect for the text inside this shape. For possible values, see the table below. |
IsEmptyPresentationObject | [readonly] boolean - If this is a default presentation object and if it is empty, this property is true.
|
IsPresentationObject | [readonly] boolean - If true, a shape is part of the current AutoLayout and is considered a presentation object. AutoLayouts are predefined page layouts consisting of shapes, such as a title box and an outline box.
|
The next table contains all available com.sun.star.presentation.AnimationEffect enums.
NONE | RANDOM | DISSOLVE |
APPEAR | HIDE | PATH |
FADE_FROM_LEFT FADE_FROM_RIGHT |
MOVE_FROM_LEFT MOVE_FROM_RIGHT |
ZOOM_IN_FROM_LEFT ZOOM_IN_FROM_RIGHT |
CLOCKWISE COUNTERCLOCKWISE |
CLOSE_VERTICAL CLOSE_HORIZONTAL |
OPEN_VERTICAL OPEN_HORIZONTAL |
LASER_FROM_LEFT LASER_FROM_RIGHT |
MOVE_TO_LEFT MOVE_TO_RIGHT |
MOVE_SHORT_TO_LEFT MOVE_SHORT_TO_RIGHT |
ZOOM_OUT_FROM_LEFT ZOOM_OUT_FROM_RIGHT |
STRETCH_FROM_LEFT STRETCH_FROM_RIGHT |
MOVE_SHORT_FROM_LEFT MOVE_SHORT_FROM_RIGHT |
WAVYLINE_FROM_LEFT WAVYLINE_FROM_RIGHT |
SPIRALIN_LEFT SPIRALIN_RIGHT |
FADE_FROM_CENTER FADE_TO_CENTER |
ZOOM_IN ZOOM_IN_SMALL |
ZOOM_OUT ZOOM_OUT_SMALL |
VERTICAL_LINES HORIZONTAL_LINES |
ZOOM_IN_FROM_CENTER ZOOM_OUT_FROM_CENTER |
VERTICAL_CHECKERBOARD HORIZONTAL_CHECKERBOARD |
VERTICAL_ROTATE HORIZONTAL_ROTATE |
HORIZONTAL_STRETCH VERTICAL_STRETCH |
The next example demonstrates how to set object effects and object interaction.
The example use a method createAndInsertShape()
from the ShapeHelper
class. It takes the drawing document, the XShapes
interface of the DrawPage
the shape is to be inserted in, the position and size of the new shape, and the service name of the required shape. It delegates shape creation to the helper method createShape()
and inserts the new shape into the given XShapes
container. Finally, it retrieves the XPropertySet
interface of the inserted shape and returns it to the caller.
public static XPropertySet createAndInsertShape( XComponent xDrawDoc,
XShapes xShapes, Point aPos, Size aSize, String sShapeType) throws java.lang.Exception {
XShape xShape = createShape(xDrawDoc, aPos, aSize, sShapeType);
xShapes.add(xShape);
XPropertySet xPropSet = UnoRuntime.queryInterface(XPropertySet.class, xShape);
return xPropSet;
}
The following example shows animations and OnClick
actions for four shapes. On click, the first shape builds up in a wavy line from the bottom and is dimmed (painted) red afterwards. The second shape is hidden on click. Clicking the third shape makes the presentation jump to the first page, whereas clicking the fourth shape jumps to a bookmark. The bookmark contains the name of the second slide "page - two".
XShapes xShapes;
XPropertySet xShapePropSet;
XDrawPagesSupplier xDrawPagesSupplier = UnoRuntime.queryInterface(
XDrawPagesSupplier.class, xComponent);
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
// create pages, so that three are available
while (xDrawPages.getCount() < 3)
xDrawPages.insertNewByIndex(0);
// get the shape container for page one
xShapes = UnoRuntime.queryInterface(
XShapes.class, xDrawPages.getByIndex(0));
// create a rectangle that is placed on the top left of the page
xShapePropSet = ShapeHelper.createAndInsertShape( xComponent,
xShapes, new Point(1000, 1000), new Size(5000, 5000),
"com.sun.star.drawing.RectangleShape" );
// and now set an object animation
xShapePropSet.setPropertyValue("Effect",
com.sun.star.presentation.AnimationEffect.WAVYLINE_FROM_BOTTOM);
/* the following three properties provoke that the shape is dimmed to red
after the animation has been finished
*/
xShapePropSet.setPropertyValue("DimHide", Boolean.FALSE);
xShapePropSet.setPropertyValue("DimPrevious", Boolean.TRUE);
xShapePropSet.setPropertyValue("DimColor", Integer.valueOf(0xff0000));
// get the shape container for the second page
xShapes = UnoRuntime.queryInterface(XShapes.class, xDrawPages.getByIndex(1));
// create an ellipse that is placed on the bottom right of second page
xShapePropSet = ShapeHelper.createAndInsertShape( xComponent, xShapes,
new Point(21000, 15000), new Size(5000, 5000), "com.sun.star.drawing.EllipseShape");
xShapePropSet.setPropertyValue("Effect", com.sun.star.presentation.AnimationEffect.HIDE);
/* create two objects for the third page.
clicking the first object lets the presentation jump
to page one by using ClickAction.FIRSTPAGE,
the second object lets the presentation jump to page two
by using a ClickAction.BOOKMARK
*/
xShapes = UnoRuntime.queryInterface(XShapes.class, xDrawPages.getByIndex(2));
xShapePropSet = ShapeHelper.createAndInsertShape(xComponent, xShapes,
new Point(1000, 8000), new Size(5000, 5000),
"com.sun.star.drawing.EllipseShape" );
xShapePropSet.setPropertyValue("Effect", com.sun.star.presentation.AnimationEffect.FADE_FROM_BOTTOM );
xShapePropSet.setPropertyValue("OnClick", com.sun.star.presentation.ClickAction.FIRSTPAGE);
xShapePropSet = ShapeHelper.createAndInsertShape(xComponent, xShapes,
new Point(22000, 8000), new Size(5000, 5000),
"com.sun.star.drawing.RectangleShape");
xShapePropSet.setPropertyValue("Effect", com.sun.star.presentation.AnimationEffect.FADE_FROM_BOTTOM);
xShapePropSet.setPropertyValue( "OnClick", com.sun.star.presentation.ClickAction.BOOKMARK);
// set the name of page two, and use it with the bookmark action
XNamed xPageName = UnoRuntime.queryInterface(XNamed.class, xDrawPages.getByIndex(1));
xPageName.setName("page - two");
xShapePropSet.setPropertyValue("Bookmark", xPageName.getName());
Overall Document Features
Styles
Graphics Styles
Graphics Styles are available in drawing and presentation documents, and they control the formatting of the drawing shapes in drawing or presentation slides. In contrast to styles in text documents, the style property of a shape is not a string, but a com.sun.star.style.XStyle. To work with an existing graphics style, get the styles container from the com.sun.star.style.XStyleFamiliesSupplier and use its com.sun.star.container.XNameAccess to retrieve the style family named "graphics". The programmatic names of the style families in graphics are:
GUI name | Programmatic name | Remark |
---|---|---|
Default | standard | The style Default (standard) is used for newly inserted filled rectangles, filled ellipses, lines, connectors, text boxes, and 3D objects. |
Dimension Line | measure | Used for newly inserted dimension lines. |
First line indent | textbodyindent | Apply manually. |
Heading | headline | Apply manually. |
Heading1 | headline1 | Apply manually. |
Heading2 | headline2 | Apply manually. |
Object with Arrow | objectwitharrow | Apply manually. |
Object with shadow | objectwithshadow | Apply manually. |
Object without fill | objectwithoutfill | Used for newly inserted rectangles and ellipses without filling. |
Text | text | Newly inserted text boxes do not use this style. They use Default and remove the fill settings for Default. |
Text body | textbody | Apply manually. |
Text body justified | textbodyjustfied | Apply manually. |
Title | title | Apply manually. |
Title1 | title1 | Apply manually. |
Title2 | title2 | Apply manually. |
There are two methods to change an applied shape style:
- Retrieve the style from the style family "graphics" by its programmatic name, change the properties, and put back into the style family using
replaceByName()
at the style family's com.sun.star.container.XNameContainer interface. - Apply an existing style object that is not applied to a shape by setting the shape's style property.
New styles can be created, as well. For this purpose, use createInstance()
at the document factory of a drawing document and ask for a "com.sun.star.style.Style
" service. Set the properties of the new style, as required. Append the new style to the style family "graphics" using insertByName()
at its XNameContainer
interface. Now use the Style
property of existing shapes to put the new style to work.
You can either change a currently applied shape style by retrieving it from the style family "graphics" by its programmatic name, changing its properties and putting it back into the style family using replaceByName()
at the style family's com.sun.star.container.XNameContainer interface. Or you can apply an existing, but currently unapplied style object to a shape by setting the shape's Style property accordingly.
You can create new styles as well. For this purpose, use createInstance()
at the document factory of a drawing document and ask for a "com.sun.star.style.Style" service. Set the properties of the new style as needed. Afterwards append the new style to the style family "graphics" using insertByName()
at its XNameContainer
interface. Now you can use the Style
property of existing shapes in order to put your new style to work.
Styles created by the document factory support the properties of the following services:
- com.sun.star.drawing.FillProperties
- com.sun.star.drawing.LineProperties
- com.sun.star.drawing.ShadowProperties
- com.sun.star.drawing.ConnectorProperties
- com.sun.star.drawing.MeasureProperties
- com.sun.star.style.ParagraphProperties
- com.sun.star.style.CharacterProperties
- com.sun.star.drawing.TextProperties
Presentation Styles
Presentation styles are only available in presentation documents and control the formatting of the following parts of a presentation:
- title text
- subtitle text
- outline text
- background
- background shapes
- notes text
The corresponding style family has the programmatic name "Default" and is available at the XStyleFamiliesSupplier of a presentation document.
GUI Name | Programmatic Name | Remark |
---|---|---|
Title | title | Style for text of new title presentation objects. |
Subtitle | subtitle | Style that is used for the presentation object on pages with a "Title Slide" layout. |
Background | background | Style for the page background. |
Background objects | backgroundobjects | Style for shapes on the background. |
notes | Notes | Style for notes text. |
outline1 | Outline 1 | Style for outline level 1. |
outline2 | Outline 2 | Style for outline level 2. |
outline3 | Outline 3 | Style for outline level 3. |
outline4 | Outline 4 | Style for outline level 4. |
outline5 | Outline 5 | Style for outline level 5. |
outline6 | Outline 6 | Style for outline level 6. |
outline7 | Outline 7 | Style for outline level 7. |
outline8 | Outline 8 | Style for outline level 8. |
outline9 | Outline 9 | Style for outline level 9. |
Existing presentation styles can only be altered. New styles can not be created and a different presentation style cannot be applied other than the current one. The following example works with presentation styles.
You can only alter existing presentation styles. You cannot create new styles and you cannot apply a different presentation style other than the current one. The following example works with presentation styles:
// The first part of this demo will set each "CharColor" Property
// that is available within the styles of the document to red. It
// will also print each family and style name to the standard output
XModel xModel = UnoRuntime.queryInterface(XModel.class, xComponent);
com.sun.star.style.XStyleFamiliesSupplier xSFS = (com.sun.star.style.XStyleFamiliesSupplier)
UnoRuntime.queryInterface(com.sun.star.style.XStyleFamiliesSupplier.class, xModel);
com.sun.star.container.XNameAccess xFamilies = xSFS.getStyleFamilies();
// the element should now contain at least two Styles. The first is
// "graphics" and the other one is the name of the Master page
String[] Families = xFamilies.getElementNames();
for (int i = 0; i < Families.length; i++) {
// this is the family
System.out.println("\n" + Families[i]);
// and now all available styles
Object aFamilyObj = xFamilies.getByName(Families[i]);
com.sun.star.container.XNameAccess xStyles = (com.sun.star.container.XNameAccess)
UnoRuntime.queryInterface(com.sun.star.container.XNameAccess.class, aFamilyObj);
String[] Styles = xStyles.getElementNames();
for (int j = 0; j < Styles.length; j++) {
System.out.println( " " + Styles[j]);
Object aStyleObj = xStyles.getByName(Styles[j]);
com.sun.star.style.XStyle xStyle = (com.sun.star.style.XStyle)
UnoRuntime.queryInterface(com.sun.star.style.XStyle.class, aStyleObj);
// now we have the XStyle Interface and the CharColor for all styles
// is exemplary be set to red.
XPropertySet xStylePropSet = (XPropertySet)
UnoRuntime.queryInterface( XPropertySet.class, xStyle );
XPropertySetInfo xStylePropSetInfo = xStylePropSet.getPropertySetInfo();
if (xStylePropSetInfo.hasPropertyByName("CharColor")) {
xStylePropSet.setPropertyValue("CharColor", Integer.valueOf(0xff0000));
}
}
}
/* now create a rectangle and apply the "title1" style of
the "graphics" family
*/
Object obj = xFamilies.getByName("graphics");
com.sun.star.container.XNameAccess xStyles = (XNameAccess)
UnoRuntime.queryInterface(com.sun.star.container.XNameAccess.class, obj);
obj = xStyles.getByName("title1");
com.sun.star.style.XStyle xTitle1Style = UnoRuntime.queryInterface(
com.sun.star.style.XStyle.class, obj);
XDrawPagesSupplier xDrawPagesSupplier = UnoRuntime.queryInterface(
XDrawPagesSupplier.class, xComponent);
XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
XDrawPage xDrawPage = UnoRuntime.queryInterface(XDrawPage.class, xDrawPages.getByIndex(0));
XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, xDrawPage);
XShape xShape = ShapeHelper.createShape(xComponent, new Point(0, 0),
new Size(5000, 5000), "com.sun.star.drawing.RectangleShape");
xShapes.add(xShape);
XPropertySet xPropSet = UnoRuntime.queryInterface(XPropertySet.class, xShape);
xPropSet.setPropertyValue("Style", xTitle1Style);
Settings
To use the global document settings, the document service factory must be asked for a com.sun.star.document.Settings service using the method createInstance()
at its com.sun.star.lang.XMultiServiceFactory interface. This service supports com.sun.star.beans.PropertySet and acts upon the current document by setting its properties.
The services com.sun.star.drawing.DocumentSettings and com.sun.star.presentation.DocumentSettings provide the following properties additionally to the global document settings.
Properties of com.sun.star.drawing.DocumentSettings | |
---|---|
MeasureUnit | short - this is the default logical measure unit that is used for string formatings inside the document.
|
ScaleNumerator | long - is the numerator for the logical scale of the document.
|
ScaleDenominator | long - is the denominator for the logical scale of the document.
|
IsPrintFitPage | boolean - this property enables or disables the fitting of the page to the printable area during print, true enable and false disable.
|
IsPrintTilePage | boolean - If the property IsPrintTilePage is set to 1 and the paper size for printing is larger than the paper size of the printer than the content is tiled over multiple pages.
|
PageNumberFormat | long - is the number format used for page number fields.
|
ParagraphSummation | boolean - If the property ParagraphSummation is set to 1, the distance between two paragraphs is the sum of ParaTopMargin of the previous and ParaBottomMargin of the next paragraph. If 0, only the greater of the two is choosen.
|
Properties of com.sun.star.presentation.DocumentSettings | |
---|---|
IsPrintDrawing | boolean - this property enables or disables the printing of the drawing pages, true enable and false disable.
|
IsPrintNotes | boolean - this property enables or disables the printing of the notes pages, true enable and false disable.
|
IsPrintHandout | boolean - this property enables or disables the printing of the handout pages, true enable and false disable.
|
IsPrintOutline | boolean - this property enables or disables the printing of the outline pages, true enable and false disable.
|
IsPrintHiddenPages | boolean - this property enables or disables the printing of draw pages that are marked hidden, true enable and false disable.
|
IsPrintFitPage | boolean - this property enables or disables the fitting of the page to the printable area during print, true enable and false disable.
|
IsPrintTilePage | boolean - If this property IsPrintTilePage is set to 1 and the paper size for printing is larger than the paper size of the printer than the content is tiled over multiple pages.
|
PageNumberFormat | long - is the number format used for page number fields.
|
ParagraphSummation | boolean - If the property ParagraphSummation is set to 1, the distance between two paragraphs is the sum of ParaTopMargin of the previous and ParaBottomMargin of the next paragraph. If 0, only the greater of the two is choosen.
|
Page Formatting
As opposed to text and spreadsheet documents, page formatting in drawings and presentations is not done through styles. Rather, hard format the following properties:
Properties of com.sun.star.drawing.GenericDrawPage | |
---|---|
BorderBottom | long
|
BorderLeft | long
|
BorderRight | long
|
BorderTop | long
|
Height | long
|
Number | short
|
Orientation | com.sun.star.view.PaperOrientation |
Width | long
|
Drawing and Presentation Document Controller
The controller is available at the XModel
interface of the document model:
com::sun::star::frame::XController getCurrentController()
Setting the Current Page, Using the Selection
The controller is a com.sun.star.drawing.DrawingDocumentDrawView that supports the following interfaces:
- com.sun.star.drawing.XDrawView
- com.sun.star.beans.XPropertySet
- com.sun.star.frame.XController
- com.sun.star.view.XSelectionSupplier
The following methods of com.sun.star.view.XSelectionSupplier control the current selection in the GUI:
boolean select( [in] any anObject)
any getSelection()
void addSelectionChangeListener (
[in] com::sun::star::view::XSelectionChangeListener aListen
void removeSelectionChangeListener (
[in] com::sun::star::view::XSelectionChangeListener aListener)
With these methods of com.sun.star.drawing.XDrawView, the visible page is set in the GUI:
void setCurrentPage(com::sun::star::drawing::XDrawPage aPage)
com::sun::star::drawing::XDrawPage getCurrentPage()
In addition to DrawingDocumentDrawView
, it supports the following interfaces. For details about these interfaces, refer to Office Development.
- com.sun.star.task.XStatusIndicatorSupplier
- com.sun.star.ui.XContextMenuInterception
- com.sun.star.frame.XDispatchProvider
Zooming
Zooming can be set by certain drawing-specific controller properties of the com.sun.star.drawing.DrawingDocumentDrawViewservice:
Properties of com.sun.star.drawing.DrawingDocumentDrawView | |
---|---|
VisibleArea | [readonly] com.sun.star.awt.Rectangle - This is the area that is currently visible.
|
ZoomType | [optional] short - This property defines the zoom type for the document. The values of com.sun.star.view.DocumentZoomType are used.
|
ZoomValue | [optional] short - Defines the zoom value to use. Valid only if the ZoomType is set to BY_VALUE .
|
ViewOffset | [optional] com.sun.star.awt.Point - Defines the offset from the top left position of the displayed page to the top left position of the view area in 100th/mm.
|
Other Drawing-Specific View Settings
Drawings and presentations can be switched to certain view modes. This is done by the following drawing-specific controller properties of com.sun.star.drawing.DrawingDocumentDrawView:
Properties of com.sun.star.drawing.DrawingDocumentDrawView | |
---|---|
IsLayerMode | boolean - Switch to layer mode.
|
IsMasterPageMode | boolean - Switch to master page mode.
|
CurrentPage | com.sun.star.drawing.XDrawPage - This is the drawing page that is currently visible. |
Furthermore, there are many properties that can be changed through the XViewDataSupplier
interface of the document:
Methods of com.sun.star.document.XViewDataSupplier:
com::sun::star::container::XIndexAccess getViewData()
void setViewData( [in] com::sun::star::container::XIndexAccess aData)
To use ViewData
properties, call getViewData()
and receive a com.sun.star.container.XIndexContainer
:
Methods of XIndexContainer
:
type getElementType()
boolean hasElements()
long getCount()
any getByIndex( [in] long Index)
void replaceByIndex( [in] long Index, any Element)
void insertByIndex( [in] long Index, any Element)
void removeByIndex( [in] long Index)
Use getByIndex()
to iterate over the view data properties, find the required com.sun.star.beans.PropertyValue by checking the property names. If found, set the Value Member of the property value and put it back into the container using replaceByIndex()
. Finally, apply the whole ViewData
container to the document using setViewData()
.
The method setViewData()
is currently not working. It can only be used with loadComponentFromURL()
.