1
0
Fork 0
libreoffice/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape/csharp/HelloTextTableShape.cs
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

300 lines
No EOL
11 KiB
C#

/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using System;
using com.sun.star.awt;
using com.sun.star.beans;
using com.sun.star.container;
using com.sun.star.drawing;
using com.sun.star.frame;
using com.sun.star.lang;
using com.sun.star.sheet;
using com.sun.star.table;
using com.sun.star.text;
using com.sun.star.uno;
XComponentContext xRemoteContext = null;
XMultiComponentFactory xRemoteServiceManager = null;
try
{
UseWriter();
UseCalc();
UseDraw();
return 0;
}
catch (UnoException e)
{
Console.Error.WriteLine(e.Message);
return 1;
}
void UseWriter()
{
// Create a new Writer document, and manipulate the text content
XComponent xWriterComponent = NewDocComponent("swriter");
XTextDocument xTextDocument = xWriterComponent.query<XTextDocument>();
XText xText = xTextDocument.getText();
ManipulateText(xText);
// Get the internal service factory of the document
XMultiServiceFactory xWriterFactory = xTextDocument.query<XMultiServiceFactory>();
// Insert a TextTable, and manipulate the text content of the cell
XTextContent xTextContentTable = xWriterFactory.createInstance("com.sun.star.text.TextTable").query<XTextContent>();
xText.insertTextContent(xText.getEnd(), xTextContentTable, false);
XCellRange xCellRange = xTextContentTable.query<XCellRange>();
XCell xCell = xCellRange.getCellByPosition(0, 1);
XText xCellText = xCell.query<XText>();
ManipulateText(xCellText);
ManipulateTable(xCellRange);
XShape xWriterShape = xWriterFactory.createInstance("com.sun.star.drawing.RectangleShape").query<XShape>();
xWriterShape.setSize(new Size(10000, 10000));
XTextContent xTextContentShape = xWriterShape.query<XTextContent>();
xText.insertTextContent(xText.getEnd(), xTextContentShape, false);
// Wrap the text inside the shape
XPropertySet xShapeProps = xWriterShape.query<XPropertySet>();
xShapeProps.setPropertyValue("TextContourFrame", new Any(true));
XText xShapeText = xWriterShape.query<XText>();
ManipulateText(xShapeText);
ManipulateShape(xWriterShape);
// Create and name a bookmark
IQueryInterface bookmark = xWriterFactory.createInstance("com.sun.star.text.Bookmark");
XNamed xNamed = bookmark.query<XNamed>();
xNamed.setName("MyUniqueBookmarkName");
// Insert the bookmark at the end of the document
XTextContent xTextContent = bookmark.query<XTextContent>();
xText.insertTextContent(xText.getEnd(), xTextContent, false);
// Get all bookmarks from the XBookmarksSupplier
XBookmarksSupplier xBookmarksSupplier = xWriterComponent.query<XBookmarksSupplier>();
XNameAccess xNamedBookmarks = xBookmarksSupplier.getBookmarks();
XTextContent xFoundBookmark = xNamedBookmarks.getByName("MyUniqueBookmarkName").cast<XTextContent>();
XTextRange xFound = xFoundBookmark.getAnchor();
xFound.setString(" The throat mike, glued to her neck, "
+ "looked as much as possible like an analgesic dermadisk.");
// Get all tables from the XTextTablesSupplier
XTextTablesSupplier xTablesSupplier = xWriterComponent.query<XTextTablesSupplier>();
XNameAccess xNamedTables = xTablesSupplier.getTextTables();
XIndexAccess xIndexedTables = xNamedTables.query<XIndexAccess>();
// Get the tables
XPropertySet xTableProps = null;
for (int i = 0; i < xIndexedTables.getCount(); i++)
{
xTableProps = xIndexedTables.getByIndex(i).cast<XPropertySet>();
xTableProps.setPropertyValue("BackColor", new Any(0xC8FFB9));
}
}
void UseCalc()
{
// Create a new Calc document, and manipulate text in a cell
XComponent xCalcComponent = NewDocComponent("scalc");
XSpreadsheetDocument xCalcDocument = xCalcComponent.query<XSpreadsheetDocument>();
XSpreadsheetDocument xSpreadsheetDocument = xCalcDocument.query<XSpreadsheetDocument>();
XIndexAccess xIndexedSheets = xSpreadsheetDocument.getSheets().query<XIndexAccess>();
XCellRange xSpreadsheetCells = xIndexedSheets.getByIndex(0).cast<XCellRange>();
// Get cell A2 from the first sheet
XCell xCell = xSpreadsheetCells.getCellByPosition(0, 1);
XText xCellText = xCell.query<XText>();
XPropertySet xCellProps = xCell.query<XPropertySet>();
xCellProps.setPropertyValue("IsTextWrapped", new Any(true));
ManipulateText(xCellText);
ManipulateTable(xSpreadsheetCells);
// Get the internal service factory of the document
XMultiServiceFactory xCalcFactory = xCalcDocument.query<XMultiServiceFactory>();
XDrawPageSupplier xDrawPageSupplier = xIndexedSheets.getByIndex(0).cast<XDrawPageSupplier>();
XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage();
// Create and insert a RectangleShape, and manipulate its shape text
XShape xCalcShape = xCalcFactory.createInstance("com.sun.star.drawing.RectangleShape").query<XShape>();
xCalcShape.setSize(new Size(10000, 10000));
xCalcShape.setPosition(new Point(7000, 3000));
xDrawPage.add(xCalcShape);
// Wrap the text inside the shape
XPropertySet xShapeProps = xCalcShape.query<XPropertySet>();
xShapeProps.setPropertyValue("TextContourFrame", new Any(true));
XText xShapeText = xCalcShape.query<XText>();
ManipulateText(xShapeText);
ManipulateShape(xCalcShape);
}
void UseDraw()
{
// Create a new Draw document, and insert a rectangle
XComponent xDrawComponent = NewDocComponent("sdraw");
XDrawPagesSupplier xDrawPagesSupplier = xDrawComponent.query<XDrawPagesSupplier>();
XIndexAccess xIndexedDrawPages = xDrawPagesSupplier.getDrawPages();
XDrawPage xDrawPage = xIndexedDrawPages.getByIndex(0).cast<XDrawPage>();
// Get the internal service factory of the document
XMultiServiceFactory xDrawFactory = xDrawComponent.query<XMultiServiceFactory>();
XShape xDrawShape = xDrawFactory.createInstance("com.sun.star.drawing.RectangleShape").query<XShape>();
xDrawShape.setSize(new Size(10000, 20000));
xDrawShape.setPosition(new Point(5000, 5000));
xDrawPage.add(xDrawShape);
// Wrap the text inside the shape
XPropertySet xShapeProps = xDrawShape.query<XPropertySet>();
xShapeProps.setPropertyValue("TextContourFrame", new Any(true));
XText xShapeText = xDrawShape.query<XText>();
ManipulateText(xShapeText);
ManipulateShape(xDrawShape);
}
void ManipulateText(XText xText)
{
// Set the entire text at once
xText.setString("He lay flat on the brown, pine-needled floor of the forest, "
+ "his chin on his folded arms, and high overhead the wind blew in the tops "
+ "of the pine trees.");
// Create a text cursor for selecting and formatting
XTextCursor xTextCursor = xText.createTextCursor();
XPropertySet xCursorProps = xTextCursor.query<XPropertySet>();
// Use the cursor to select "He lay", and apply bold and italic formatting
xTextCursor.gotoStart(false);
xTextCursor.goRight(6, true);
xCursorProps.setPropertyValue("CharPosture", new Any(FontSlant.ITALIC));
xCursorProps.setPropertyValue("CharWeight", new Any(FontWeight.BOLD));
xTextCursor.gotoEnd(false);
xText.insertString(xTextCursor.getStart(),
" The mountainside sloped gently where he lay; "
+ "but below it was steep and he could see the dark of the oiled road "
+ "winding through the pass. There was a stream alongside the road "
+ "and far down the pass he saw a mill beside the stream and the falling water "
+ "of the dam, white in the summer sunlight.", false);
xText.insertString(xTextCursor.getStart(), "\n \"Is that the mill?\" he asked.", false);
}
void ManipulateTable(XCellRange xCellRange)
{
// Set column titles and a cell value
XCell xCell = xCellRange.getCellByPosition(0, 0);
XText xCellText = xCell.query<XText>();
xCellText.setString("Quotation");
xCell = xCellRange.getCellByPosition(1, 0);
xCellText = xCell.query<XText>();
xCellText.setString("Year");
xCell = xCellRange.getCellByPosition(1, 1);
xCell.setValue(1940);
XCellRange xSelectedCells = xCellRange.getCellRangeByName("A1:B1");
XPropertySet xCellProps = xSelectedCells.query<XPropertySet>();
string backColorPropertyName = null;
XPropertySet xTableProps = null;
// Format the table headers and borders
XServiceInfo xServiceInfo = xCellRange.query<XServiceInfo>();
if (xServiceInfo.supportsService("com.sun.star.sheet.Spreadsheet"))
{
backColorPropertyName = "CellBackColor";
xSelectedCells = xCellRange.getCellRangeByName("A1:B2");
xTableProps = xSelectedCells.query<XPropertySet>();
}
else if (xServiceInfo.supportsService("com.sun.star.text.TextTable"))
{
backColorPropertyName = "BackColor";
xTableProps = xCellRange.query<XPropertySet>();
}
// Set cell background color
xCellProps.setPropertyValue(backColorPropertyName, new Any(0x99CCFF));
// Set table borders (blue line, width 10)
BorderLine theLine = new BorderLine()
{
Color = 0x000099,
OuterLineWidth = 10,
};
// Use the above defined line for all borders and enable them
TableBorder bord = new TableBorder()
{
VerticalLine = theLine,
HorizontalLine = theLine,
LeftLine = theLine,
RightLine = theLine,
TopLine = theLine,
BottomLine = theLine,
IsVerticalLineValid = true,
IsHorizontalLineValid = true,
IsLeftLineValid = true,
IsRightLineValid = true,
IsTopLineValid = true,
IsBottomLineValid = true,
};
xTableProps.setPropertyValue("TableBorder", new Any(bord));
bord = xTableProps.getPropertyValue("TableBorder").cast<TableBorder>();
Console.WriteLine(bord.TopLine.Color);
}
void ManipulateShape(XShape xShape)
{
XPropertySet xShapeProps = xShape.query<XPropertySet>();
xShapeProps.setPropertyValue("FillColor", new Any(0x99CCFF));
xShapeProps.setPropertyValue("LineColor", new Any(0x000099));
xShapeProps.setPropertyValue("RotateAngle", new Any(3000));
xShapeProps.setPropertyValue("TextLeftDistance", new Any(0));
xShapeProps.setPropertyValue("TextRightDistance", new Any(0));
xShapeProps.setPropertyValue("TextUpperDistance", new Any(0));
xShapeProps.setPropertyValue("TextLowerDistance", new Any(0));
}
XComponent NewDocComponent(string docType)
{
XMultiComponentFactory xRemoteServiceManager = GetRemoteServiceManager();
XComponentLoader xComponentLoader = xRemoteServiceManager
.createInstanceWithContext("com.sun.star.frame.Desktop", xRemoteContext)
.query<XComponentLoader>();
string loadUrl = $"private:factory/{docType}";
return xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0, new PropertyValue[0]);
}
XMultiComponentFactory GetRemoteServiceManager()
{
if (xRemoteContext == null && xRemoteServiceManager == null)
{
xRemoteContext = NativeBootstrap.bootstrap();
Console.WriteLine("Connected to a running office ...");
xRemoteServiceManager = xRemoteContext.getServiceManager();
}
return xRemoteServiceManager;
}