Hello Benjamin,
On Sunday 21 June 2009, 08:20, [email protected] wrote:
> Hi everybody,
> my teammate is trying to insert an OLE object in a writer document
> like in the OOo menu structure "create from file" with a given ODS
> file. That's what he got for now. But the inserted object shows always
> only an extract of the table which is just ca. nine cm in width and
> ca. three cm in height. But he wants to see the entire table, if the
> table is bigger than the size of 9x3.
...
> How can he manipulate the size of the embedded object?
see the Java source code attached.
@Mikhail Voytenko:
I took the freedom to CCed you (IIRC you master the subject).
Here are some doubts I had when looking at the code that used to work fine in
OOo 2.x:
* if you see the C++ code attached, in previous versions I had to change first
the size of the BaseFrame object's shape (that is, change the size of the
visual representation), and then change the embedded object's visual area
size.
Now changing the embedded object's visual area updates automatically the
shape's size, am I right?
Changing first the shape's size makes the spreadsheet document rows higher.
* May be an issue (or my code is bad...):
I'm changing the embedded object's visual area size, so that it's width is no
wider than the width of (the text document page - left/right margins).
But the resulting width is indeed wider. See the example output:
Embedded object Info:
getAspect() = 1
getMapUnit() = 0
getVisualAreaSize().Width = 9,03 cm
getVisualAreaSize().Height = 2,13 cm
BaseFrame object Info:
Width = 9,03 cm
Height = 2,13 cm
Spreadsheet Used Area size:
Width = 22,67 cm
Height = 6,41 cm
TextDocument page text area size:
Width = 17,00 cm
Height = 25,70 cm
New size for the embedded object:
Width = 17,00 cm
Height = 6,41 cm
Press ENTER to change the size of embedded object's visual area
BaseFrame object new size:
Width = 18,07 cm
Height = 6,38 cm
Regards
--
Ariel Constenla-Haile
La Plata, Argentina
/*
* EmbeddedCalcResizer.java
*
*/
package org.openoffice.sdk;
import com.sun.star.awt.Size;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XNameAccess;
import com.sun.star.document.XEmbeddedObjectSupplier2;
import com.sun.star.embed.XEmbeddedObject;
import com.sun.star.frame.FrameSearchFlag;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.sheet.XCellRangeAddressable;
import com.sun.star.sheet.XSheetCellCursor;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.sheet.XUsedAreaCursor;
import com.sun.star.style.XStyleFamiliesSupplier;
import com.sun.star.table.CellRangeAddress;
import com.sun.star.table.XCell;
import com.sun.star.table.XColumnRowRange;
import com.sun.star.table.XTableColumns;
import com.sun.star.table.XTableRows;
import com.sun.star.text.ControlCharacter;
import com.sun.star.text.XText;
import com.sun.star.text.XTextContent;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextRange;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.UnoRuntime;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
*
* @author ariel
*/
public class EmbeddedCalcResizer {
private XComponentContext m_xContext;
/** Creates a new instance of EmbeddedCalcResizer */
public EmbeddedCalcResizer(XComponentContext xContext) {
this.m_xContext = xContext;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int nRet = 0;
try {
// get the remote office component context
XComponentContext xContext = Bootstrap.bootstrap();
if (xContext == null) {
System.err.println("ERROR: Could not bootstrap default Office.");
nRet = -1;
}
EmbeddedCalcResizer demo = new EmbeddedCalcResizer(xContext);
demo.runDemo();
waitForInput("\nPress ENTER to finish the example\n");
} catch (java.lang.Exception e) {
e.printStackTrace();
} finally {
System.exit(nRet);
}
}
protected void runDemo() {
try {
// load a new empty OOo Writer document
XTextDocument xTextDocument = createWriterDoc(m_xContext);
// get the document's factory
XMultiServiceFactory xDocFactory =
(XMultiServiceFactory) UnoRuntime.queryInterface(
XMultiServiceFactory.class, xTextDocument);
// get the XText interface
XText xText = xTextDocument.getText();
// create a text cursor
XTextCursor xTextCursor = xText.createTextCursor();
xTextCursor.gotoStart(false);
// insert a paragraph brake
insertParaBreak(xTextCursor.getEnd());
// create the Calc text embedded oject
XPropertySet xBaseFrameProps = createTextEmbeddedObject_Calc(xDocFactory);
// insert the object
insertTextContent( xTextCursor.getEnd(),
(XTextContent) UnoRuntime.queryInterface(
XTextContent.class, xBaseFrameProps));
insertParaBreak(xTextCursor.getEnd());
XEmbeddedObjectSupplier2 xEmbeddedObjectSupplier =
(XEmbeddedObjectSupplier2) UnoRuntime.queryInterface(
XEmbeddedObjectSupplier2.class, xBaseFrameProps);
// XEmbeddedObjectSupplier2::getExtendedControlOverEmbeddedObject()
// does not return the model that is "controlled" by the embedded object,
// but the embedded object itself.
XEmbeddedObject xEmbeddedObject =
xEmbeddedObjectSupplier.getExtendedControlOverEmbeddedObject();
// get the actual aspect of the embedded object
// ::com::sun::star::embed::Aspects
// this is needed for ::com::sun::star::embed::XVisualObject::setVisualAreaSize()
// and ::com::sun::star::embed::XVisualObject::getMapUnit()
long nAspect = xEmbeddedObjectSupplier.getAspect();
// ::com::sun::star::embed::XVisualObject::getMapUnit()
// retrieves map mode the object communicates in
// the Size we pass in setVisualAreaSize() must follow this map mode
// Returns one of ::com::sun::star::embed::EmbedMapUnits
long aMapUnit = xEmbeddedObject.getMapUnit(nAspect);
// getVisualAreaSize() will show us that the visual area size is equal
// to the Size of the BaseFrame object shape
Size aVisualAreaSize = xEmbeddedObject.getVisualAreaSize(nAspect);
System.out.printf("\n\nEmbedded object Info:\n" +
"\tgetAspect() = %d\n" +
"\tgetMapUnit() = %d\n" +
"\tgetVisualAreaSize().Width = %.2f cm\n" +
"\tgetVisualAreaSize().Height = %.2f cm\n",
nAspect, aMapUnit,
((double) aVisualAreaSize.Width/ 1000),
((double) aVisualAreaSize.Height/ 1000));
// let's see the default size asigned to the BaseFrame object shape
Size aBaseFrameSize = new Size();
aBaseFrameSize.Width = AnyConverter.toInt(
xBaseFrameProps.getPropertyValue("Width"));
aBaseFrameSize.Height = AnyConverter.toInt(
xBaseFrameProps.getPropertyValue("Height"));
System.out.printf("\n\nBaseFrame object Info:\n" +
"\tWidth = %.2f cm\n" +
"\tHeight = %.2f cm\n",
((double) aBaseFrameSize.Width/ 1000),
((double) aBaseFrameSize.Height/ 1000));
// access the model that is controlled by the embedded object
// some embedded ojects have NO model, but here we are sure
// because it is an office document
XComponent xComponent = xEmbeddedObjectSupplier.getEmbeddedObject();
// the model is an XSpreadsheetDocument
XSpreadsheetDocument xSheetDoc = (XSpreadsheetDocument) UnoRuntime.queryInterface(
XSpreadsheetDocument.class, xComponent);
// get the sheet at index 0
XSpreadsheets xSpreadsheets = xSheetDoc.getSheets();
XIndexAccess xIndexAccess = (XIndexAccess) UnoRuntime.queryInterface(
XIndexAccess.class, xSpreadsheets);
XSpreadsheet xSpreadsheet = (XSpreadsheet) UnoRuntime.queryInterface(
XSpreadsheet.class, xIndexAccess.getByIndex(0));
// insert some values
for (int i = 0; i < 10; i++) {
for (int n = 0; n < 15; n++) {
XCell xCell = xSpreadsheet.getCellByPosition(i, n);
xCell.setFormula(String.valueOf(2.35 * (i + n)));
}
}
// get the used area in the embedded sheet
CellRangeAddress aUsedArea = getUsedArea(xSpreadsheet);
// calulate the size of the used area
Size aUsedAreaSize = calcCellRangeSize(xSpreadsheets, aUsedArea);
// here we suppose that both the map mode in which the object communicates,
// and the width and height of columns and rows
// are mesured in 1/100 mm ::com::sun::star::embed::EmbedMapUnits::ONE_100TH_MM
// May this not be the case, we must convert the size of the sheet used area
System.out.printf("\n\nSpreadsheet Used Area size:\n" +
"\tWidth = %.2f cm\n" +
"\tHeight = %.2f cm\n",
((double) aUsedAreaSize.Width / 1000),
((double) aUsedAreaSize.Height / 1000));
// do we need to resize the object?
if (
( aUsedAreaSize.Width != aVisualAreaSize.Width ) ||
( aUsedAreaSize.Height != aVisualAreaSize.Height )
) {
// calculate the size of the TextDocument page text area
Size aPageTextAreaSize = getPageTextAreaSize(xTextDocument, xTextCursor);
System.out.printf("\n\nTextDocument page text area size:\n" +
"\tWidth = %.2f cm\n" +
"\tHeight = %.2f cm\n",
((double) aPageTextAreaSize.Width / 1000),
((double) aPageTextAreaSize.Height / 1000));
// if the size of the BaseFrame shape is bigger than the page text area
// it will look awful, so...
Size aNewSize = new Size();
aNewSize.Height = (aUsedAreaSize.Height > aPageTextAreaSize.Height)
? aPageTextAreaSize.Height : aUsedAreaSize.Height;
aNewSize.Width = (aUsedAreaSize.Width > aPageTextAreaSize.Width)
? aPageTextAreaSize.Width : aUsedAreaSize.Width;
System.out.printf("\n\nNew size for the embedded object:\n" +
"\tWidth = %.2f cm\n" +
"\tHeight = %.2f cm\n",
((double) aNewSize.Width / 1000),
((double) aNewSize.Height / 1000));
// NOW there is no need to change first the size of the BaseFrame object's shape
// waitForInput("Press ENTER to change the size of the BaseFrame object");
// first change the size of the visual representation
//xEmbeddedProps.setPropertyValue("Width", new Integer(aNewSize.Width));
//xEmbeddedProps.setPropertyValue("Height", new Integer(aNewSize.Height));
// NOW changing the embedded object's visual area update automatically the shape's size
waitForInput("\nPress ENTER to change the size of embedded object's visual area");
// make the embedded object visual area fit in the new size
xEmbeddedObject.setVisualAreaSize(nAspect, aNewSize);
// let's see if the BaseFrame object shape's size has also changed
aBaseFrameSize.Width = AnyConverter.toInt(
xBaseFrameProps.getPropertyValue("Width"));
aBaseFrameSize.Height = AnyConverter.toInt(
xBaseFrameProps.getPropertyValue("Height"));
System.out.printf("\n\nBaseFrame object new size:\n" +
"\tWidth = %.2f cm\n" +
"\tHeight = %.2f cm\n",
((double) aBaseFrameSize.Width / 1000),
((double) aBaseFrameSize.Height / 1000));
}
} catch (Exception e) {
e.printStackTrace();
}
}
//=========================================================================
//
// Text document helpers
/**
*
* @param xTextRange
* @param sStr
*/
public static void insertText(XTextRange xTextRange, String sStr) {
xTextRange.getText().insertString(xTextRange, sStr, false);
}
/**
*
* @param xTextRange
*/
public static void insertParaBreak(XTextRange xTextRange) {
try {
xTextRange.getText().insertControlCharacter(
xTextRange, ControlCharacter.PARAGRAPH_BREAK, false);
} catch (com.sun.star.lang.IllegalArgumentException e) {
e.printStackTrace();
}
}
/**
*
* @param xTextRange
* @param xContent
*/
public static void insertTextContent(XTextRange xTextRange, XTextContent xContent) {
try {
xTextRange.getText().insertTextContent(xTextRange, xContent, false);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @param xDocFactory
* @param sCLSID
* @return
*/
public static XPropertySet createTextEmbeddedObject(
XMultiServiceFactory xDocFactory, String sCLSID) {
XPropertySet xPropertySet = null;
try {
xPropertySet = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class,
xDocFactory.createInstance("com.sun.star.text.TextEmbeddedObject"));
xPropertySet.setPropertyValue("CLSID", sCLSID);
} catch (Exception e) {
e.printStackTrace();
} finally {
return xPropertySet;
}
}
/**
*
* @param xDocFactory
* @return
*/
public static XPropertySet createTextEmbeddedObject_Calc(
XMultiServiceFactory xDocFactory) {
return createTextEmbeddedObject(xDocFactory,
"47BBB4CB-CE4C-4E80-a591-42d9ae74950f");
}
/**
*
* @param xTextDocument
* @param xTextCursor
* @return
*/
public static Size getPageTextAreaSize(XTextDocument xTextDocument, XTextCursor xTextCursor) {
Size aSize = new Size();
try {
XPropertySet xPropertySet = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, xTextCursor);
String sPageStyleName = AnyConverter.toString(
xPropertySet.getPropertyValue("PageStyleName"));
XStyleFamiliesSupplier xStyleFamiliesSupplier =
(XStyleFamiliesSupplier) UnoRuntime.queryInterface(
XStyleFamiliesSupplier.class, xTextDocument);
XNameAccess xStyleFamilies = xStyleFamiliesSupplier.getStyleFamilies();
XNameAccess xPageStyles = (XNameAccess) UnoRuntime.queryInterface(
XNameAccess.class,
xStyleFamilies.getByName("PageStyles"));
xPropertySet = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class,
xPageStyles.getByName(sPageStyleName));
int iPageWidth, iPageHeight;
iPageWidth = AnyConverter.toInt(xPropertySet.getPropertyValue("Width"));
iPageHeight = AnyConverter.toInt(xPropertySet.getPropertyValue("Height"));
int iBottomMargin, iTopMargin;
iBottomMargin = AnyConverter.toInt(xPropertySet.getPropertyValue("BottomMargin"));
iTopMargin = AnyConverter.toInt(xPropertySet.getPropertyValue("TopMargin"));
int iLeftMargin, iRightMargin;
iLeftMargin = AnyConverter.toInt(xPropertySet.getPropertyValue("LeftMargin"));
iRightMargin = AnyConverter.toInt(xPropertySet.getPropertyValue("RightMargin"));
aSize.Height = iPageHeight - iBottomMargin - iTopMargin;
aSize.Width = iPageWidth - iLeftMargin - iRightMargin;
} catch (Exception e) {
e.printStackTrace();
} finally {
return aSize;
}
}
/**
*
* @param rContext
* @return
*/
public static XTextDocument createWriterDoc(XComponentContext xContext) {
return (XTextDocument) UnoRuntime.queryInterface(
XTextDocument.class,
createNewDoc(xContext, "swriter"));
}
//=========================================================================
//
// Spreadsheet document helpers
/**
*
* @param xSpreadsheet
* @return
*/
public static CellRangeAddress getUsedArea(XSpreadsheet xSpreadsheet) {
CellRangeAddress aCellRangeAddress = null;
try {
XSheetCellCursor xSheetCellCursor = xSpreadsheet.createCursor();
XUsedAreaCursor xUsedAreaCursor = (XUsedAreaCursor) UnoRuntime.queryInterface(
XUsedAreaCursor.class, xSheetCellCursor);
xUsedAreaCursor.gotoStartOfUsedArea(false);
xUsedAreaCursor.gotoEndOfUsedArea(true);
XCellRangeAddressable xCellRangeAddressable =
(XCellRangeAddressable) UnoRuntime.queryInterface(
XCellRangeAddressable.class, xUsedAreaCursor);
aCellRangeAddress = xCellRangeAddressable.getRangeAddress();
} catch (Exception e) {
e.printStackTrace();
} finally {
return aCellRangeAddress;
}
}
/**
*
* @param xSpreadsheets
* @param aCellRangeAddress
* @return
*/
public static Size calcCellRangeSize(XSpreadsheets xSpreadsheets, CellRangeAddress aCellRangeAddress) {
Size aSize = new Size();
try {
XIndexAccess xIndexAccess = (XIndexAccess) UnoRuntime.queryInterface(
XIndexAccess.class, xSpreadsheets);
XSpreadsheet xSpreadsheet = (XSpreadsheet) UnoRuntime.queryInterface(
XSpreadsheet.class, xIndexAccess.getByIndex(aCellRangeAddress.Sheet));
XColumnRowRange xColumnRowRange = (XColumnRowRange) UnoRuntime.queryInterface(
XColumnRowRange.class, xSpreadsheet);
XTableColumns xTableColumns = xColumnRowRange.getColumns();
XTableRows xTableRows = xColumnRowRange.getRows();
int aTotalColWidth = 0;
for (int i = aCellRangeAddress.StartColumn; i <= aCellRangeAddress.EndColumn; i++) {
XPropertySet xPropertySet = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, xTableColumns.getByIndex(i));
int iWidth = AnyConverter.toInt(
xPropertySet.getPropertyValue("Width"));
aTotalColWidth += iWidth;
}
int aTotalRowHeight = 0;
for (int i = aCellRangeAddress.StartRow; i <= aCellRangeAddress.EndRow; i++) {
XPropertySet xPropertySet = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, xTableRows.getByIndex(i));
int iHeight = AnyConverter.toInt(
xPropertySet.getPropertyValue("Height"));
aTotalRowHeight += iHeight;
}
aSize = new Size(aTotalColWidth, aTotalRowHeight);
} catch (Exception e) {
e.printStackTrace();
} finally {
return aSize;
}
}
//=========================================================================
//
// General helpers
/**
*
* @param rContext
* @param docType
* @return
*/
public static XComponent createNewDoc(XComponentContext xContext, String docType) {
XComponent xComponent = null;
try {
XComponentLoader xComponentLoader = (XComponentLoader) UnoRuntime.queryInterface(
XComponentLoader.class,
xContext.getServiceManager().createInstanceWithContext(
"com.sun.star.frame.Desktop", xContext));
xComponent = xComponentLoader.loadComponentFromURL(
"private:factory/" + docType,
"_blank",
FrameSearchFlag.ALL,
new PropertyValue[0]);
} catch (Exception e) {
e.printStackTrace();
} finally {
return xComponent;
}
}
public static String waitForInput(String sMessage) {
String sInput = null;
try {
System.out.print(sMessage);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
sInput = br.readLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
return sInput;
}
}
}
#include <iostream>
#include <cstdio>
#include <cppuhelper/bootstrap.hxx>
#include <rtl/ustring.hxx>
/** === begin UNO includes === **/
#include <com/sun/star/awt/Size.hpp>
#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/container/XNameAccess.hpp>
#include <com/sun/star/document/XEmbeddedObjectSupplier2.hpp>
#include <com/sun/star/embed/XEmbeddedObject.hpp>
#include <com/sun/star/frame/XComponentLoader.hpp>
#include <com/sun/star/io/IOException.hpp>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/lang/XMultiComponentFactory.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/sheet/XCellRangeAddressable.hpp>
#include <com/sun/star/sheet/XCellRangeData.hpp>
#include <com/sun/star/sheet/XSheetCellCursor.hpp>
#include <com/sun/star/sheet/XSpreadsheet.hpp>
#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
#include <com/sun/star/sheet/XSpreadsheets.hpp>
#include <com/sun/star/sheet/XUsedAreaCursor.hpp>
#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#include <com/sun/star/table/CellRangeAddress.hpp>
#include <com/sun/star/table/XCell.hpp>
#include <com/sun/star/table/XColumnRowRange.hpp>
#include <com/sun/star/table/XTableColumns.hpp>
#include <com/sun/star/table/XTableRows.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/text/XTextRange.hpp>
#include <com/sun/star/text/XTextTable.hpp>
#include <com/sun/star/text/XTextTableCursor.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
/** === end UNO includes === **/
/** === begin UNO using === **/
using ::com::sun::star::awt::Size;
using ::com::sun::star::beans::PropertyValue;
using ::com::sun::star::beans::XPropertySet;
using ::com::sun::star::container::XIndexAccess;
using ::com::sun::star::container::XNameAccess;
using ::com::sun::star::document::XEmbeddedObjectSupplier2;
using ::com::sun::star::embed::XEmbeddedObject;
using ::com::sun::star::frame::XComponentLoader;
using ::com::sun::star::lang::XComponent;
using ::com::sun::star::lang::XMultiComponentFactory;
using ::com::sun::star::lang::XMultiServiceFactory;
using ::com::sun::star::sheet::XCellRangeAddressable;
using ::com::sun::star::sheet::XCellRangeData;
using ::com::sun::star::sheet::XSheetCellCursor;
using ::com::sun::star::sheet::XSpreadsheet;
using ::com::sun::star::sheet::XSpreadsheetDocument;
using ::com::sun::star::sheet::XSpreadsheets;
using ::com::sun::star::sheet::XUsedAreaCursor;
using ::com::sun::star::style::XStyleFamiliesSupplier;
using ::com::sun::star::table::CellRangeAddress;
using ::com::sun::star::table::XCell;
using ::com::sun::star::table::XColumnRowRange;
using ::com::sun::star::table::XTableColumns;
using ::com::sun::star::table::XTableRows;
using ::com::sun::star::text::XText;
using ::com::sun::star::text::XTextContent;
using ::com::sun::star::text::XTextCursor;
using ::com::sun::star::text::XTextDocument;
using ::com::sun::star::text::XTextRange;
using ::com::sun::star::text::XTextTable;
using ::com::sun::star::text::XTextTableCursor;
using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::makeAny;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::RuntimeException;
using ::com::sun::star::uno::RuntimeException;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::uno::XComponentContext;
using ::com::sun::star::uno::XInterface;
/** === end UNO using === **/
using namespace rtl;
using namespace std;
namespace ControlCharacter = ::com::sun::star::text::ControlCharacter;
//==================================================================================
Reference< XComponent > createNewDoc(const Reference< XComponentContext >& rContext, const OUString & docType );
//==================================================================================
void insertText( const Reference< XTextRange > & xTextRange, const OUString & uString);
void insertParaBreak( const Reference< XTextRange > & xTextRange);
void insertTextContent( const Reference< XTextRange > & xTextRange, const Reference< XTextContent > & xContent);
Reference< XPropertySet > createTextEmbeddedObject( const Reference< XMultiServiceFactory >& xDocFactory, const OUString & CLSID);
Reference< XPropertySet > createTextEmbeddedObject_Calc( const Reference< XMultiServiceFactory >& xDocFactory);
const Size getPageTextAreaSize( const Reference< XTextDocument > & xTextDocument, const Reference< XTextCursor >& xTextCursor);
Reference< XTextDocument > createWriterDoc( const Reference< XComponentContext >& rContext);
//==================================================================================
const CellRangeAddress getUsedArea( const Reference< XSpreadsheet >& xSpreadsheet);
const Size calcCellRangeSize( const Reference< XSpreadsheets >& xSpreadsheets, const CellRangeAddress & aCellRangeAddress);
//==================================================================================
int SAL_CALL main( int argc, char* argv[] )
{
try
{
// bootstrap the office
Reference< XComponentContext > rContext ( ::cppu::bootstrap() );
Reference< XMultiComponentFactory > rMCF = rContext->getServiceManager();
// load a new empty OOo Writer document
Reference< XTextDocument > rTextDocument = createWriterDoc( rContext );
// get the document's factory
Reference< XMultiServiceFactory > rDocFactory ( rTextDocument, 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
insertParaBreak( rTextCursor->getEnd() );
// create the Calc text embedded oject
Reference< XPropertySet > xEmbeddedProps = createTextEmbeddedObject_Calc( rDocFactory );
// insert the object
insertTextContent( rTextCursor->getEnd(), Reference< XTextContent >(xEmbeddedProps, UNO_QUERY) );
insertParaBreak( rTextCursor->getEnd() );
Reference< XEmbeddedObjectSupplier2 > xEmbeddedObjectSupplier ( xEmbeddedProps, UNO_QUERY );
// XEmbeddedObjectSupplier2::getExtendedControlOverEmbeddedObject()
// does not return the model that is controlled by the embedded object,
// but the embedded object itself.
Reference< XEmbeddedObject > xEmbeddedObject = xEmbeddedObjectSupplier->getExtendedControlOverEmbeddedObject();
// get the actual aspect of the embedded object
// ::com::sun::star::embed::Aspects
// this is needed for ::com::sun::star::embed::XVisualObject::setVisualAreaSize()
// and ::com::sun::star::embed::XVisualObject::getMapUnit()
sal_Int64 nAspect = xEmbeddedObjectSupplier->getAspect();
// ::com::sun::star::embed::XVisualObject::getMapUnit() retrieves map mode the object communicates in
// the Size we pass in setVisualAreaSize() must follow this map mode
// Returns one of ::com::sun::star::embed::EmbedMapUnits
sal_Int32 aMapUnit = xEmbeddedObject->getMapUnit( nAspect );
// getVisualAreaSize() will show us that the visual area size is equal to the Size of the BaseFrame object shape
Size aSize = xEmbeddedObject->getVisualAreaSize( nAspect );
// access the model that is controlled by the embedded object
// some embedded ojects have NO model, but here we are sure
// because it is an office document
Reference< XComponent > xComponent = xEmbeddedObjectSupplier->getEmbeddedObject();
// is the same as
/*Reference< com::sun::star::embed::XComponentSupplier > xComponentSupplier
( xEmbeddedObject, UNO_QUERY );
Reference< com::sun::star::util::XCloseable > xEmbeddedComp =
xComponentSupplier->getComponent(); */
// the model is an XSpreadsheetDocument
Reference< XSpreadsheetDocument > xSheetDoc ( xComponent, UNO_QUERY );
// get the sheet at index 0
Reference< XSpreadsheets > xSpreadsheets = xSheetDoc->getSheets();
Reference< XIndexAccess > xIndexAccess ( xSpreadsheets, UNO_QUERY );
Reference< XSpreadsheet > xSpreadsheet ( xIndexAccess->getByIndex( sal_Int32(0) ), UNO_QUERY );
// insert some values
for (sal_Int32 i = 0; i < 10; i++)
{
for (sal_Int32 n = 0; n < 15; n++)
{
Reference< XCell > xCell = xSpreadsheet->getCellByPosition(i, n);
xCell->setFormula( OUString::valueOf( 2.35 * (i + n) ) );
}
}
// get the used area in the embedded sheet
CellRangeAddress aUsedArea = getUsedArea( xSpreadsheet );
// calulate the size of the used area
Size aUsedAreaSize = calcCellRangeSize(xSpreadsheets, aUsedArea);
// here we suppose that both the map mode in which the object communicates,
// and the width and height of columns and rows
// are mesured in 1/100 mm ::com::sun::star::embed::EmbedMapUnits::ONE_100TH_MM
// May this not be the case, we must convert the size of thesheet used area
printf( "Used area size : %.2f cm x %.2f cm\n\n",
( (double) aUsedAreaSize.Width/1000), ( (double) aUsedAreaSize.Height/1000) );
// calculate the size of the page text area
Size aPageTextAreaSize = getPageTextAreaSize(rTextDocument, rTextCursor);
// if the size of the BaseFrame shape is bigger than the page text area
// it will look awful, so...
Size aNewSize;
aNewSize.Height = (aUsedAreaSize.Height > aPageTextAreaSize.Height)
? aPageTextAreaSize.Height : aUsedAreaSize.Height ;
aNewSize.Width = (aUsedAreaSize.Width > aPageTextAreaSize.Width)
? aPageTextAreaSize.Width : aUsedAreaSize.Width ;
cout << "Press ENTER to change the size of the BaseFrame object";
cin.get();
// first change the size of the visual representation
xEmbeddedProps->setPropertyValue(
OUString( RTL_CONSTASCII_USTRINGPARAM( "Width" ) ), makeAny(aNewSize.Width) );
xEmbeddedProps->setPropertyValue(
OUString( RTL_CONSTASCII_USTRINGPARAM( "Height" ) ), makeAny(aNewSize.Height) );
cout << "Press ENTER to change the size of embedded object's visual area";
cin.get();
// make the embedded object visual area fit in the new size
xEmbeddedObject->setVisualAreaSize(nAspect, aNewSize);
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;
}
/////////////////////////////////////////////////////////////////////////////////
void insertText( const Reference< XTextRange > & xTextRange, const OUString & uString)
{
xTextRange->getText()->insertString( xTextRange, uString, sal_False );
}
void insertParaBreak( const Reference< XTextRange > & xTextRange)
{
try
{
xTextRange->getText()->insertControlCharacter(
xTextRange, ControlCharacter::PARAGRAPH_BREAK, sal_False);
}
catch (com::sun::star::lang::IllegalArgumentException& e)
{
cerr << "caught ::com::sun::star::lang::IllegalArgumentException: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
}
void insertTextContent( const Reference< XTextRange > & xTextRange, const Reference< XTextContent > & xContent)
{
try
{
xTextRange->getText()->insertTextContent( xTextRange, xContent, sal_False );
}
catch (Exception& e)
{
cerr << "caught UNO Exception: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
}
Reference< XPropertySet > createTextEmbeddedObject(
const Reference< XMultiServiceFactory >& xDocFactory, const OUString & CLSID)
{
Reference< XPropertySet > xPropertySet;
try
{
xPropertySet = Reference< XPropertySet >( xDocFactory->createInstance(
OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.text.TextEmbeddedObject") ) ) , UNO_QUERY );
xPropertySet->setPropertyValue(
OUString( RTL_CONSTASCII_USTRINGPARAM("CLSID") ), makeAny(CLSID) );
}
catch (Exception& e)
{
cerr << "caught UNO Exception: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
return xPropertySet;
}
Reference< XPropertySet > createTextEmbeddedObject_Calc(
const Reference< XMultiServiceFactory >& xDocFactory)
{
return createTextEmbeddedObject(xDocFactory,
OUString( RTL_CONSTASCII_USTRINGPARAM( "47BBB4CB-CE4C-4E80-a591-42d9ae74950f" ) ));
}
const Size getPageTextAreaSize( const Reference< XTextDocument > & xTextDocument, const Reference< XTextCursor >& xTextCursor)
{
Size aSize;
try
{
Reference< XPropertySet > xPropertySet ( xTextCursor, UNO_QUERY );
OUString sPageStyleName;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("PageStyleName")) ) >>= sPageStyleName;
Reference< XStyleFamiliesSupplier > xStyleFamiliesSupplier ( xTextDocument, UNO_QUERY );
Reference< XNameAccess > xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
Reference< XNameAccess > xPageStyles;
xStyleFamilies->getByName(
OUString(RTL_CONSTASCII_USTRINGPARAM("PageStyles")) ) >>= xPageStyles;
xPageStyles->getByName(sPageStyleName) >>= xPropertySet;
sal_Int32 iPageWidth, iPageHeight;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("Width")) ) >>= iPageWidth;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("Height")) ) >>= iPageHeight;
sal_Int32 iBottomMargin, iTopMargin;
sal_Int32 iLeftMargin, iRightMargin;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("BottomMargin")) ) >>= iBottomMargin;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("TopMargin")) ) >>= iTopMargin;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("LeftMargin")) ) >>= iLeftMargin;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("RightMargin")) ) >>= iRightMargin;
aSize.Height = iPageHeight - iBottomMargin - iTopMargin;
aSize.Width = iPageWidth - iLeftMargin - iRightMargin;
}
catch (RuntimeException& e)
{
cerr << "caught UNO Exception: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
catch (Exception& e)
{
cerr << "caught UNO Exception: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
return aSize;
}
Reference< XTextDocument > createWriterDoc( const Reference< XComponentContext >& rContext)
{
return Reference< XTextDocument >(
createNewDoc( rContext, OUString( RTL_CONSTASCII_USTRINGPARAM( "swriter" ) ) ), UNO_QUERY );
}
///////////////////////////////////////////////////////////////////////////////////////
const CellRangeAddress getUsedArea( const Reference< XSpreadsheet >& xSpreadsheet)
{
CellRangeAddress aCellRangeAddress;
try
{
Reference< XSheetCellCursor > xSheetCellCursor = xSpreadsheet->createCursor();
Reference< XUsedAreaCursor > xUsedAreaCursor ( xSheetCellCursor, UNO_QUERY );
xUsedAreaCursor->gotoStartOfUsedArea( sal_False );
xUsedAreaCursor->gotoEndOfUsedArea( sal_True );
Reference< XCellRangeAddressable > xCellRangeAddressable( xUsedAreaCursor, UNO_QUERY );
aCellRangeAddress = xCellRangeAddressable->getRangeAddress();
}
catch (RuntimeException& e)
{
cerr << "caught UNO Exception: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
return aCellRangeAddress;
}
const Size calcCellRangeSize( const Reference< XSpreadsheets >& xSpreadsheets, const CellRangeAddress & aCellRangeAddress)
{
Size aSize;
try
{
Reference< XIndexAccess > xIndexAccess ( xSpreadsheets, UNO_QUERY );
Reference< XSpreadsheet > xSpreadsheet;
xIndexAccess->getByIndex( aCellRangeAddress.Sheet ) >>= xSpreadsheet;
Reference< XColumnRowRange > xColumnRowRange ( xSpreadsheet, UNO_QUERY );
Reference< XTableColumns > xTableColumns = xColumnRowRange->getColumns();
Reference< XTableRows > xTableRows = xColumnRowRange->getRows();
sal_Int32 aTotalColWidth = 0;
for ( sal_Int32 i = aCellRangeAddress.StartColumn; i <= aCellRangeAddress.EndColumn; i++ )
{
Reference< XPropertySet > xPropertySet ( xTableColumns->getByIndex(i), UNO_QUERY );
sal_Int32 iWidth;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("Width") ) ) >>= iWidth;
aTotalColWidth += iWidth;
}
sal_Int32 aTotalRowHeight = 0;
for ( sal_Int32 i = aCellRangeAddress.StartRow; i <= aCellRangeAddress.EndRow; i++ )
{
Reference< XPropertySet > xPropertySet ( xTableRows->getByIndex(i), UNO_QUERY );
sal_Int32 iHeight;
xPropertySet->getPropertyValue(
OUString(RTL_CONSTASCII_USTRINGPARAM("Height") ) ) >>= iHeight;
aTotalRowHeight += iHeight;
}
aSize = Size( aTotalColWidth, aTotalRowHeight );
}
catch (RuntimeException& e)
{
cerr << "caught UNO Exception: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
catch (Exception& e)
{
cerr << "caught UNO Exception: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
return aSize;
}
/////////////////////////////////////////////////////////////////////////////////////////
Reference< XComponent > createNewDoc(const Reference< XComponentContext >& rContext, const OUString& docType)
{
Reference< XComponent > xComponent;
try
{
Reference < XComponentLoader > xComponentLoader(
rContext->getServiceManager()->createInstanceWithContext(
OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.frame.Desktop" ) ), rContext ), UNO_QUERY_THROW );
xComponent = Reference< XComponent >( xComponentLoader->loadComponentFromURL(
OUString( RTL_CONSTASCII_USTRINGPARAM( "private:factory/" ) ).concat( docType ),
OUString( RTL_CONSTASCII_USTRINGPARAM( "_blank" ) ), 0,
Sequence < ::com::sun::star::beans::PropertyValue >() ) );
}
catch (Exception& e)
{
cerr << "caught UNO Exception: "
<< OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ).getStr()
<< '\n';
}
return xComponent;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]