Difference between revisions of "Programming OOoDraw and OOoImpress"
SergeMoutou (Talk | contribs) (→Property of a Slide) |
SergeMoutou (Talk | contribs) (→Giving a Name to the Shape) |
||
Line 334: | Line 334: | ||
==Giving a Name to the Shape== | ==Giving a Name to the Shape== | ||
+ | |||
+ | Every shape can receive a name. This feature is very interesting if you want transform OOoDraw as a graphical front-end. Here is a code example which give a name to a shape : | ||
+ | <code>[cpp] | ||
+ | //Listing 18 Naming a Shape | ||
+ | // C++ | ||
+ | // Don't forget to add : using namespace com::sun::star::beans; | ||
+ | // Don't forget to add : #include <com/sun/star/beans/XPropertySet.hpp> | ||
+ | // Don't forget to add "com.sun.star.beans.XPropertySet \" in the makefile | ||
+ | |||
+ | // Query the XPropertySet Interface | ||
+ | Reference< XPropertySet > shapeprops(rtxtShape, UNO_QUERY); | ||
+ | shapeprops->setPropertyValue(OUString::createFromAscii("Name"), | ||
+ | makeAny(OUString::createFromAscii("demo"))); | ||
+ | </code> | ||
+ | The XShapes interface allows adding, removing as shown in the IDL file : | ||
+ | <pre> | ||
+ | //Listing 19 Index access to Shapes (IDL file) | ||
+ | // IDL | ||
+ | interface XShapes: com::sun::star::container::XIndexAccess | ||
+ | { | ||
+ | void add( [in] com::sun::star::drawing::XShape xShape ); | ||
+ | void remove( [in] com::sun::star::drawing::XShape xShape ); | ||
+ | }; | ||
+ | </pre> | ||
+ | The XIndexAccess inheritance allows also getcount() and getByIndex. This allows the construction of a loop on all shapes. | ||
+ | |||
+ | =Graphics and OOoDraw= | ||
+ | In OOoDraw a graphic is a bitmap or vector picture. We are interesting in this chapter with bitmap graphics. | ||
+ | |||
+ | ==Inserting a bitmap== | ||
+ | Here is an example which insert a bitmap. We start as in previous chapter : with a drawing page. The only difference is again with the shape which is now a GraphicObjectShape. And we have to give a file link : | ||
+ | <code>[cpp] | ||
+ | //Listing 20 Inserting an Image in a Slide | ||
+ | // C++ | ||
+ | // Don't forget #include <osl/file.hxx> | ||
+ | |||
+ | // Don't forget to add :using namespace com::sun::star::awt; for Point and size | ||
+ | |||
+ | // Don't forget to add : #include <com/sun/star/drawing/XShape.hpp> | ||
+ | // Don't forget to add "com.sun.star.drawing.XShape \" in the makefile | ||
+ | |||
+ | // Don't forget to add : #include <com/sun/star/drawing/XShapes.hpp> | ||
+ | // Don't forget to add "com.sun.star.drawing.XShapes \" in the makefile | ||
+ | |||
+ | // Don't forget to add : using namespace com::sun::star::beans; | ||
+ | // Don't forget to add : #include <com/sun/star/beans/XPropertySet.hpp> | ||
+ | // Don't forget to add "com.sun.star.beans.XPropertySet \" in the makefile | ||
+ | |||
+ | Reference< XMultiServiceFactory > DocFactory(xcomponent, UNO_QUERY); | ||
+ | Reference< XInterface > GraphicShape = DocFactory->createInstance( | ||
+ | OUString::createFromAscii("com.sun.star.drawing.GraphicObjectShape")); | ||
+ | Reference< XShape > rGrafShape(GraphicShape, UNO_QUERY); | ||
+ | |||
+ | Point *Pos = new (Point); | ||
+ | Size *TheSize = new ( Size ); | ||
+ | Pos->X = 2000; | ||
+ | Pos->Y = 6000; | ||
+ | TheSize->Width = 7000; | ||
+ | TheSize->Height = 2000; | ||
+ | rGrafShape->setPosition(*Pos); | ||
+ | rGrafShape->setSize(*TheSize); | ||
+ | OUString sImageUrl; | ||
+ | osl::FileBase::getFileURLFromSystemPath( | ||
+ | OUString::createFromAscii("/home/smoutou/photoperso.jpg"),sImageUrl); | ||
+ | Reference< XPropertySet > rShapeProps(rGrafShape, UNO_QUERY); | ||
+ | rShapeprops->setPropertyValue(OUString::createFromAscii("GraphicURL"), | ||
+ | makeAny(sImageUrl)) | ||
+ | |||
+ | // Query XShapes Interface | ||
+ | Reference< XShapes > Shapes(rDrawPage, UNO_QUERY); | ||
+ | Shapes->add(rGrafShape); | ||
+ | </code> | ||
+ | This code doesn't insert the picture in the document but the link. Inserting effectively is not possible with the API but with menus : | ||
+ | 1. Edition -> link | ||
+ | select all the pictures link | ||
+ | click on deconnect button; confirm | ||
+ | 2.Save the document. |
Revision as of 12:26, 20 May 2006
OOoDraw is my favorite application of OpenOffice.org suite. I think then I will spend a lot of time with this chapter. I start writing this chapter with the Help of Christian post in OOoForum (Code snippets)
In this chapter, we use again the starting code described here . It consists of a subprogram “ooConnect()” and a main. Working with this code consists of adding new code in the main (see the red comment). We give again the main program slightly modified to fit OOoDraw requirements :
[cpp]
//Listing 1 Again the starting Code
// C++
// adapted for OOoDraw
int main( ) {
//retrieve an instance of the remote service manager
Reference< XMultiServiceFactory > rOfficeServiceManager; rOfficeServiceManager = ooConnect(); if( rOfficeServiceManager.is() ){ printf( "Connected sucessfully to the office\n" ); }
//get the desktop service using createInstance returns an XInterface type
Reference< XInterface > Desktop = rOfficeServiceManager->createInstance( OUString::createFromAscii( "com.sun.star.frame.Desktop" ));
//query for the XComponentLoader interface
Reference< XComponentLoader > rComponentLoader (Desktop, UNO_QUERY); if( rComponentLoader.is() ){ printf( "XComponentloader successfully instanciated\n" ); }
//get an instance of the OOoDraw document
Reference< XComponent > xcomponent = rComponentLoader->loadComponentFromURL(
OUString::createFromAscii("private:factory/sdraw"),
OUString::createFromAscii("_blank"), 0, Sequence < ::com::sun::star::beans::PropertyValue >());
// add code here
return 0;
}
Contents
Finding the drawing Slide
Bear in mind that if OOoSheet opens with three sheets by default, OOoDraw opens with only one page/slide (index 0). An existing Slide If you only know the index of the slide :
[cpp]
//Listing 2 Index access to a draw Slide
// C++
// Don't forget to add : using namespace com::sun::star::drawing;
// Don't forget to add : #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
// Don't forget to add "com.sun.star.drawing.XDrawPagesSupplier \" in the makefile
// Don't forget to add : using namespace com::sun::star::container;
// Don't forget to add : #include <com/sun/star/container/XIndexAccess.hpp>
// Don't forget to add "com.sun.star.container.XIndexAccess \" in the makefile
Reference< XDrawPagesSupplier > rDrawDoc(xcomponent, UNO_QUERY);
// query the XDrawPages Interface Reference< XDrawPages > rDrawPages = rDrawDoc->getDrawPages();
// query the XIndexAccess Interface Reference< XIndexAccess > rPageIndexAccess(rDrawPages, UNO_QUERY);
Any DrawPage = rPageIndexAccess->getByIndex(0);
If you want to know how many pages belong to your document, you can reach it from rPageIndexAccess object with :
[cpp]
//Listing 3 How many Slides ?
// C++
rPageIndexAccess->getCount();
If you only know the page name :
[cpp]
//Listing 4 Slide Name Access
//C++
// Don't forget to add : #include <com/sun/star/container/XNameAccess.hpp>
// Don't forget to add "com.sun.star.container.XNameAccess \" in the makefile
//query the XNameAccess Interface Reference< XNameAccess > rNameAccess(rDrawPages, UNO_QUERY);
if (rNameAccess->hasByName(OUString::createFromAscii("Slide 1"))) { Any DrawPage = rNameAccess-> getByName(OUString::createFromAscii("Slide 1")); }
Create, rename, copy and remove a Slide
Create a new slide with a known Index :
[cpp]
//Listing 5 Creating a new Slide
// C++
// Don't forget to add : using namespace com::sun::star::drawing;
// Don't forget to add : #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
// Don't forget to add "com.sun.star.drawing.XDrawPagesSupplier \" in the makefile
// Don't forget to add : using namespace com::sun::star::container;
// Don't forget to add : #include <com/sun/star/container/XIndexAccess.hpp>
// Don't forget to add "com.sun.star.container.XIndexAccess \" in the makefile
Reference< XDrawPagesSupplier > rDrawDoc(xcomponent, UNO_QUERY);
// query the XDrawPages Interface Reference< XDrawPages > rDrawPages = rDrawDoc->getDrawPages();
// query for the XDrawPage Inteface
Reference< XDrawPage > rDrawPage = rDrawPages->insertNewByIndex(2);
In this example, the new slide is indexed with value 2 and then its default name is “Slide 3”. You can see a difference between [chapter 6.1.1] previous code and this one : the former uses an Any type variable (DrawPage) although the latter code obtains directly a XDrawPage interface. One more step is needed to obtain a XDrawPage when working with Any : a UNO query. Add the above code to the former and you obtain like the latter code a XDrawPage interface.
[cpp]
//Listing 6 Accessing the XDrawPage Service
// C++
// Don't forget to add : #include <com/sun/star/drawing/XDrawPage.hpp>
// Don't forget to add "com.sun.star.drawing.XDrawPage \" in the makefile
// Query the XDrawPage Interface
Reference< XDrawPage > rDrawPage(DrawPage, UNO_QUERY);
How to rename your slide ? You have to change the Name property of the slide :
[cpp]
//Listing 7 Renaming a Slide
// C++
// Don't forget to add : #include <com/sun/star/container/XNamed.hpp>
// Don't forget to add "com.sun.star.container.XNamed \" in the makefile
// query for the XNamed Interface Reference< XNamed > rNamed(rDrawPage, UNO_QUERY); rNamed->setName(OUString::createFromAscii("My second page")); The XNamed interface is your friend as seen in this code. The corresponding IDL code is given now :
// IDL module com { module sun { module star { module container { interface XNamed: com::sun::star::uno::XInterface { string getName(); [oneway] void setName( [in] string aName ); }; }; }; }; };
As seen only two methods are available setName already used in the example and getName.
We have already focused our attention on the difference between PageDraw and rPageDraw variables : please note we can use both in the previous code.
And now you want to copy a page : you have to query the XDrawPageDuplicator interface.
We have to pass a draw page reference to the method duplicate(). A new draw page is appended at the end of the page list, using the default naming scheme for pages, Slide n .
[cpp]
//Listing 8 This Listing doesn't work at the Moment
// C++ to check (doesn't work !!!)
// Don't forget to add : #include <com/sun/star/drawing/XDrawPageDuplicator.hpp>
// Don't forget to add "com.sun.star.drawing.XDrawPageDuplicator \" in the makefile
// query for the XDrawPageDuplicator Interface Reference< XDrawPageDuplicator > rDrawPageDuplicator(rDrawPage(s)???, UNO_QUERY);
Reference< XDrawPage> rDrawPage2 = rDrawPageDuplicator->duplicate(rDrawPage);
// This last line doesn't work
If you want to remove a page known by its index
[cpp]
//Listing 9 Index access
// C++
// Don't forget to add : using namespace com::sun::star::drawing;
// Don't forget to add : #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
// Don't forget to add "com.sun.star.drawing.XDrawPagesSupplier \" in the makefile
// Don't forget to add : using namespace com::sun::star::container;
// Don't forget to add : #include <com/sun/star/container/XIndexAccess.hpp>
// Don't forget to add "com.sun.star.container.XIndexAccess \" in the makefile
Reference< XDrawPagesSupplier > rDrawDoc(xcomponent, UNO_QUERY);
// query the XDrawPages Interface Reference< XDrawPages > rDrawPages = rDrawDoc->getDrawPages();
// query for the XDrawPage Inteface Reference< XDrawPage > rDrawPage = rDrawPages->insertNewByIndex(0);
rDrawPages->remove(rDrawPage); Removing a page known by its name is let as an exercise.
Setting the Focus on a Slide
If you obtain a XDrawPage interface corresponding to a hidden page and you want to put it on the top :
[cpp]
//Listing 10 Setting a Slide as currently focused
// C++
// First Obtain a XDrawPage interface for this page, and after :
// Don't forget to add : using namespace com::sun::star::frame; // Don't forget to add : #include <com/sun/star/frame/XModel.hpp> // Don't forget to add "com.sun.star.frame.XModel \" in the makefile
// Don't forget to add : #include <com/sun/star/drawing/XDrawView.hpp> // Don't forget to add "com.sun.star.drawing.XDrawView \" in the makefile
// Query the XModel Interface Reference< XModel > rmodel(rDrawDoc, UNO_QUERY); Reference< XController > ctl = rmodel->getCurrentController();
// Query the XDrawView interface Reference< XDrawView > rDrawView(ctl, UNO_QUERY); rDrawView->setCurrentPage(rDrawPage);
Property of a Slide
Properties belong to the slide :
- slide's properties
Properties | Signification |
Name | Name of the slide |
BorderLeft | Left margin in 1/100 mm |
BorderRight | Right margin in 1/100 mm |
BorderTop | Top margin in 1/100 mm |
MBorderBottom | Bottom margin in 1/100 mm |
Height | Height of the page in 1/100 mm |
Width | Width of the page in 1/100 mm |
Number | Number of the page begins from 1 |
Orientation | Portrait : com.sun.star.view.PaperOrientation.PORTRAIT
or Landscape : com.sun.star.view.PaperOrientation.LANDSCAPE |
If you want for instance retrieve the page width (a property), use this code :
[cpp]
//Listing 11 Slide Properties
// C++
// Don't forget to add : using namespace com::sun::star::beans;
// Don't forget to add : #include <com/sun/star/beans/XPropertySet.hpp>
// Don't forget to add "com.sun.star.beans.XPropertySet \" in the makefile
// find out page width
Reference< XPropertySet > rPageProps(rDrawPage, UNO_QUERY);
Any ApageWidth = rPageProps->getPropertyValue(OUString::createFromAscii("Width"));
sal_Int32 pageWidth;
ApageWidth >>= pageWidth;
If you want to set the four page margins properties you can use this code :
[cpp]
//Listing 12 Margin Properties
// C++
// Obtain rPageProps like previous code
Any props[4];
props[0] <<= (short)1200;
props[1] <<= (short)1200;
props[2] <<= (short)1200;
props[3] <<= (short)1200;
rPageProps->setPropertyValue(OUString::createFromAscii("BorderLeft"),props[0]);
rPageProps->setPropertyValue(OUString::createFromAscii("BorderRight"),props[1]);
rPageProps->setPropertyValue(OUString::createFromAscii("BorderTop"),props[2]);
rPageProps->setPropertyValue(OUString::createFromAscii("BorderBottom"),props[3]);
An other simpler way is to use the build in makeAny function :
[cpp]
//Listing 13 Margin Properties and makeAny Function
// C++
// Obtain rPageProps like previous code
rPageProps->
setPropertyValue(OUString::createFromAscii("BorderLeft"),makeAny((short)1200));
rPageProps->
setPropertyValue(OUString::createFromAscii("BorderRight"),makeAny((short)1200));
rPageProps->
setPropertyValue(OUString::createFromAscii("BorderTop"),makeAny((short)1200));
rPageProps->
setPropertyValue(OUString::createFromAscii("BorderBottom"),makeAny((short)1200));
It's time now to draw shapes on pages.
Drawing with OOoDraw
Inserting a Shape
With OOoDraw text is considered as a shape like rectangle, ellipses... Let's then start with a TextShape :
[cpp]
//Listing 14 Inserting a text Shape
// C++
// Don't forget to add :using namespace com::sun::star::awt; for Point and Size
// Don't forget to add : #include <com/sun/star/drawing/XShape.hpp> // Don't forget to add "com.sun.star.drawing.XShape \" in the makefile
// Don't forget to add : #include <com/sun/star/drawing/XShapes.hpp> // Don't forget to add "com.sun.star.drawing.XShapes \" in the makefile // Don't forget to add : using namespace com::sun::star::text; // Don't forget to add : #include <com/sun/star/text/XText.hpp> // Don't forget to add "com.sun.star.text.XText \" in the makefile
Reference< XMultiServiceFactory > DocFactory(xcomponent, UNO_QUERY); Reference< XInterface > textshape = DocFactory->createInstance( OUString::createFromAscii("com.sun.star.drawing.TextShape") ); Reference< XShape > rTxtShape(textshape, UNO_QUERY);
Point *Pos = new ( Point ); Size *TheSize = new ( Size ); Pos->X = 2000; Pos->Y = 6000; TheSize->Width = 7000; TheSize->Height = 2000; rTxtShape->setPosition(Pos); rTxtShape->setSize(*TheSize);
// Query XShapes Interface Reference< XShapes > Shapes(rDrawPage, UNO_QUERY); Shapes->add(rTxtShape);
// Query the XText Interface Reference< XText > rText(rTxtShape, UNO_QUERY);
rText->setString(OUString::createFromAscii("Hello people around the world"));
This listing when executed writes out “Hello people around the world” on a page.
Changing a shape is simple : if you want to draw a rectangle, the only line to change is :
[cpp]
// Listing 15 Change this Line
// C++
Reference< XInterface > textshape = DocFactory->createInstance(
OUString::createFromAscii("com.sun.star.drawing.TextShape") );
with :
[cpp]
//Listing 16 Inserting a Rectangle Shape
// C++
Reference< XInterface > textshape = DocFactory->createInstance(
OUString::createFromAscii("com.sun.star.drawing.RectangleShape") );
We shall examine how to draw a shape again later. Note that you can write text too with this new shape as explained now.
Writing Text in a Shape
Writing text in a shape is obtained with the same way as writing text in a TextShape. For a RectangleShape (rRecShape) we have then :
[cpp]
//Listing 17 setString method to insert a Text
// C++
// Query the XText Interface
Reference< XText > rText(rRecShape, UNO_QUERY);
rText->setString(OUString::createFromAscii("Hello"));
which draws a rectangle and writes out “Hello” in this rectangle.
Giving a Name to the Shape
Every shape can receive a name. This feature is very interesting if you want transform OOoDraw as a graphical front-end. Here is a code example which give a name to a shape :
[cpp]
//Listing 18 Naming a Shape
// C++
// Don't forget to add : using namespace com::sun::star::beans;
// Don't forget to add : #include <com/sun/star/beans/XPropertySet.hpp>
// Don't forget to add "com.sun.star.beans.XPropertySet \" in the makefile
// Query the XPropertySet Interface Reference< XPropertySet > shapeprops(rtxtShape, UNO_QUERY); shapeprops->setPropertyValue(OUString::createFromAscii("Name"), makeAny(OUString::createFromAscii("demo"))); The XShapes interface allows adding, removing as shown in the IDL file :
//Listing 19 Index access to Shapes (IDL file) // IDL interface XShapes: com::sun::star::container::XIndexAccess { void add( [in] com::sun::star::drawing::XShape xShape ); void remove( [in] com::sun::star::drawing::XShape xShape ); };
The XIndexAccess inheritance allows also getcount() and getByIndex. This allows the construction of a loop on all shapes.
Graphics and OOoDraw
In OOoDraw a graphic is a bitmap or vector picture. We are interesting in this chapter with bitmap graphics.
Inserting a bitmap
Here is an example which insert a bitmap. We start as in previous chapter : with a drawing page. The only difference is again with the shape which is now a GraphicObjectShape. And we have to give a file link :
[cpp]
//Listing 20 Inserting an Image in a Slide
// C++
// Don't forget #include <osl/file.hxx>
// Don't forget to add :using namespace com::sun::star::awt; for Point and size
// Don't forget to add : #include <com/sun/star/drawing/XShape.hpp> // Don't forget to add "com.sun.star.drawing.XShape \" in the makefile
// Don't forget to add : #include <com/sun/star/drawing/XShapes.hpp> // Don't forget to add "com.sun.star.drawing.XShapes \" in the makefile
// Don't forget to add : using namespace com::sun::star::beans; // Don't forget to add : #include <com/sun/star/beans/XPropertySet.hpp> // Don't forget to add "com.sun.star.beans.XPropertySet \" in the makefile
Reference< XMultiServiceFactory > DocFactory(xcomponent, UNO_QUERY); Reference< XInterface > GraphicShape = DocFactory->createInstance( OUString::createFromAscii("com.sun.star.drawing.GraphicObjectShape")); Reference< XShape > rGrafShape(GraphicShape, UNO_QUERY);
Point *Pos = new (Point); Size *TheSize = new ( Size ); Pos->X = 2000; Pos->Y = 6000; TheSize->Width = 7000; TheSize->Height = 2000; rGrafShape->setPosition(*Pos); rGrafShape->setSize(*TheSize); OUString sImageUrl; osl::FileBase::getFileURLFromSystemPath(
OUString::createFromAscii("/home/smoutou/photoperso.jpg"),sImageUrl);
Reference< XPropertySet > rShapeProps(rGrafShape, UNO_QUERY); rShapeprops->setPropertyValue(OUString::createFromAscii("GraphicURL"), makeAny(sImageUrl))
// Query XShapes Interface Reference< XShapes > Shapes(rDrawPage, UNO_QUERY); Shapes->add(rGrafShape); This code doesn't insert the picture in the document but the link. Inserting effectively is not possible with the API but with menus : 1. Edition -> link select all the pictures link click on deconnect button; confirm 2.Save the document.