Hello all,
I've found the "strange behavior" :-)
My linux box is too fast...
I must sleep for a second between
"Reference< XEmbeddedObjectSupplier >"
and
"rEmbeddedObjectSupplier->getEmbeddedObject()"
That was it...
Best regards...
Andre
Am Dienstag, 12. Februar 2008 18:07 schrieb Andre Heine:
> Hello Ariel,
>
> I'm some steps higher:-)
>
> But something strange happens...
>
> I can compile your demo but I can see the string in the XCell ("This
> works!") only two times.
> All other runs of the demo bring OOo to hang;()
>
> Without any modifications on the source!
>
> The same in my code...
>
> The code, that cause the "hanging":
>
> ------ snip
> Reference< XComponent > rEmbeddedObjectComponent =
> rEmbeddedObjectSupplier->getEmbeddedObject();
> ------
>
> I'm using OOoSDK2.0 and OOo 2.0.4 on suse linux 10.2...
> May be, my SDK or linux is broken...
>
> I got following warning from "ld":
>
> /usr/bin/ld: warning: libstdc++.so.6, needed
> by /opt/openoffice.org2.0/program/libcppu.so, may conflict with
> libstdc++.so.5
>
> I ignore that, it's generally a problem in our project. We must use
> for some libs libstdc++.so.5;-\
>
> The comic is, that the code works in some cases without any modifications.
> When OOo hangs I must kill all "soffice.bin" manually.
>
> At this time I'm very confused, but I don't surrender:-)
>
>
> Best regards
>
> Andre
>
> Am Montag, 11. Februar 2008 21:01 schrieb Andre Heine:
> > Hi Andre, Peter, *,
> >
> > Peter Eberlein escribió:
> > > Hi Andre,
> > >
> > > Andre Heine schrieb:
> > >> Ok, the next problem...
> > >>
> > >> Am Montag, 11. Februar 2008 15:37 schrieb Andre Heine:
> > >>
> > >>
> > >> Ok, I can see the SpreadsheetDocument in my writer, but how can I
> > >> access them?
> > >>
> > >> XTextContent has not any methods like getObject() or setObject()?
> > >>
> > >> How can I get the Object from XTextContent?
> > >
> > > An untested Java snippet:
> > >
> > > XTextEmbeddedObjectsSupplier xes = (XTextEmbeddedObjectsSupplier)
> > > UnoRuntime.queryInterface(XTextEmbeddedObjectsSupplier.class,
> > > document);
> > >
> > > XNameAccess xna = xes.getEmbeddedObjects();
> > >
> > > if (xna.hasByName("Objekt1")) {
> > > XEmbeddedObjectSupplier xeo;
> > > try {
> > > embeddedObject
> > > =(XTextContent)UnoRuntime.queryInterface(XTextContent.class,
> > > xna.getByName("Objekt1"));
> > > xeo = (XEmbeddedObjectSupplier)
> > > UnoRuntime.queryInterface(XEmbeddedObjectSupplier.class,
> > > embeddedObject); XComponent xComponent = xeo.getEmbeddedObject();
> > >
> > >
> > > and so on...
> >
> > there is no need to browse all the embedded object collection of the
> > document, and get it by name: you have already inserted it, so use
> > XEmbeddedObjectSupplier, as follows:
> >
> >
> > //*******************************************************************
> > #include <iostream>
> >
> > #include <cppuhelper/bootstrap.hxx>
> > #include <rtl/ustring.hxx>
> >
> > #include <com/sun/star/beans/PropertyValue.hpp>
> > #include <com/sun/star/beans/XPropertySet.hpp>
> > #include <com/sun/star/container/XIndexAccess.hpp>
> > #include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
> > #include <com/sun/star/frame/XComponentLoader.hpp>
> > #include <com/sun/star/lang/XMultiComponentFactory.hpp>
> > #include <com/sun/star/lang/XMultiServiceFactory.hpp>
> > #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
> > #include <com/sun/star/sheet/XSpreadsheet.hpp>
> > #include <com/sun/star/sheet/XSpreadsheets.hpp>
> > #include <com/sun/star/table/XCell.hpp>
> > #include <com/sun/star/table/XCellRange.hpp>
> > #include <com/sun/star/text/ControlCharacter.hpp>
> > #include <com/sun/star/text/XText.hpp>
> > #include <com/sun/star/text/XTextContent.hpp>
> > #include <com/sun/star/text/XTextCursor.hpp>
> > #include <com/sun/star/text/XTextDocument.hpp>
> > #include <com/sun/star/uno/XComponentContext.hpp>
> >
> > using namespace std;
> > using namespace rtl;
> > using namespace com::sun::star::beans;
> > using namespace com::sun::star::container;
> > using namespace com::sun::star::document;
> > using namespace com::sun::star::frame;
> > using namespace com::sun::star::lang;
> > using namespace com::sun::star::sheet;
> > using namespace com::sun::star::table;
> > using namespace com::sun::star::text;
> > using namespace com::sun::star::uno;
> >
> >
> > int SAL_CALL main( int argc, char* argv[] ) {
> > try {
> > // bootstrap the office
> > Reference< XComponentContext > rContext (
> >
> > ::cppu::bootstrap() );
> >
> > Reference< XMultiComponentFactory > rMCF =
> > rContext->getServiceManager();
> >
> > // instantiate the Desktop and get a reference to
> > XComponentLoader Reference < XComponentLoader > rComponentLoader(
> > rMCF->createInstanceWithContext( OUString(
> > RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ) ), rContext
> > ), UNO_QUERY_THROW );
> >
> > // load a new empty OOo Writer document
> > Reference< XTextDocument > rTextDocument (
> > rComponentLoader->loadComponentFromURL(
> > OUString( RTL_CONSTASCII_USTRINGPARAM(
> > "private:factory/swriter" ) ), OUString( RTL_CONSTASCII_USTRINGPARAM(
> > "_blank" ) ), 0,
> > Sequence < ::com::sun::star::beans::PropertyValue
> >
> > >() ), UNO_QUERY );
> >
> > // get the XText interface
> > Reference< XText > rText = rTextDocument->getText();
> >
> > // create a text cursor
> > Reference< XTextCursor > rTextCursor =
> > rText->createTextCursor(); rTextCursor->gotoStart( sal_False );
> > // insert a paragraph brake
> > rText->insertControlCharacter(
> > rTextCursor->getEnd(),
> > ControlCharacter::PARAGRAPH_BREAK, sal_False);
> >
> > // get the document's factory
> > Reference< XMultiServiceFactory > rDocFactory (
> > rTextDocument, UNO_QUERY );
> >
> > // create an embedded object
> > // get its XTextContent interface
> > Reference< XTextContent > rTextContent (
> > rDocFactory->createInstance( OUString(
> > RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextEmbeddedObject" ) )
> > ), UNO_QUERY ); // and its XPropertySet
> > Reference< XPropertySet > rPropertySet ( rTextContent,
> > UNO_QUERY );
> >
> > // the type of embedded object is determined by the
> > property named "CLSID" rPropertySet->setPropertyValue(
> > OUString( RTL_CONSTASCII_USTRINGPARAM( "CLSID" )
> > ), makeAny( OUString( RTL_CONSTASCII_USTRINGPARAM(
> > "47BBB4CB-CE4C-4E80-a591-42d9ae7495 0f" ) ) ) );
> >
> > // insert the text content
> > rText->insertTextContent( rTextCursor->getEnd(),
> > rTextContent, sal_False );
> >
> > // access the component of hte embedded object
> > Reference< XEmbeddedObjectSupplier >
> > rEmbeddedObjectSupplier ( rTextContent, UNO_QUERY );
> > Reference< XComponent > rEmbeddedObjectComponent =
> > rEmbeddedObjectSupplier->getEmbeddedObject();
> >
> > // this component is an XSpreadsheetDocument
> > Reference< XSpreadsheetDocument > rSpreadsheetDocument (
> > rEmbeddedObjectComponent, UNO_QUERY);
> >
> > // nevertheless, let's be sure...
> > if ( !rSpreadsheetDocument.is() )
> > {
> > cout << "Impossible to get the spreadsheet
> > document!" << endl; return 1;
> > }
> >
> > // get the collection of sheets in the document
> > Reference< XSpreadsheets > rSheets =
> > rSpreadsheetDocument->getSheets();
> >
> > // XIndexAccess to get an spreadsheet by index
> > Reference< XIndexAccess > rIndexedSheets( rSheets,
> > UNO_QUERY );
> >
> > // get the first sheet (index == 0)
> > // as XIndexAccess::getByIndex() returns an any
> > // we can query for a reference, like we do in Java
> > // Reference< XSpreadsheet > rSpreadsheet(
> > rIndexedSheets->getByIndex( sal_Int32( 0 ) ), UNO_QUERY );
> > // but using the operator>>= is easier
> > Reference< XSpreadsheet > rSpreadsheet;
> > rIndexedSheets->getByIndex( sal_Int32( 0 ) ) >>=
> > rSpreadsheet;
> >
> > // get the cell named A1
> > Reference< XCell > rCellA1 =
> > rSpreadsheet->getCellByPosition( sal_Int32( 0 ), sal_Int32( 0 ) );
> >
> > // set a very long text
> > rCellA1->setFormula( OUString::createFromAscii("This
> > works!") );
> >
> > cout << "Press ENTER to finish the example";
> > cin.get();
> > } catch ( Exception& e ) {
> > cerr << "caught UNO exception: "
> > << OUStringToOString( e.Message,
> > RTL_TEXTENCODING_ASCII_US ).getStr() << '\n';
> > return 1;
> > }
> > return 0;
> > }
> > //*******************************************************************
> >
> >
> > As row C++ code is awful and hard to read in a mail, here
> >
> >
> > http://www.ArielConstenlaHaile.com.ar/ooo/temp/TextEmbeddedObject_CalcDem
> >o. zip
> >
> > is a ready to build and run version, just place the folder
> > TextEmbeddedObject_CalcDemo inside $OO_SDK_HOME/examples/cpp/ or simply
> > run make overriding the variable PRJ in the command line as follows:
> >
> > shell> make PRJ=$OO_SDK_HOME
> >
> > where $OO_SDK_HOME is the path to the SDK root directory, for example
> >
> > shell> make PRJ=/opt/openoffice.org2.3_sdk/
> >
> > In every case you MUST run FIRST the script setsdkenv_XXX on the SDK
> > home dir. to set your environment.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]