diff options
author | Chenxiong Qi <qcxhome@gmail.com> | 2023-02-11 12:06:45 +0800 |
---|---|---|
committer | Hossein <hossein@libreoffice.org> | 2023-04-18 14:33:09 +0200 |
commit | 10fac0f7f7cdc66d9d1ee5e5bffbeb82973b733a (patch) | |
tree | ffc2fa46d3dad0a20028d497bfe69b418c65ffcd /odk/examples | |
parent | e39d4921bcd06836d5b28dc23628da41bcf463f7 (diff) |
tdf#143123 Port DevelopersGuide/FirstSteps/HelloTextTableShape to Python
Signed-off-by: Chenxiong Qi <qcxhome@gmail.com>
Change-Id: Ifb5639369c4af1db27ccb5a93dfad093ce7403b1
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146819
Tested-by: Jenkins
Reviewed-by: Hossein <hossein@libreoffice.org>
Diffstat (limited to 'odk/examples')
-rw-r--r-- | odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape.py | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape.py b/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape.py new file mode 100644 index 000000000000..a0a101e618cc --- /dev/null +++ b/odk/examples/DevelopersGuide/FirstSteps/HelloTextTableShape.py @@ -0,0 +1,243 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# 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/. +# + +import sys +import traceback + +import uno +import officehelper + +from com.sun.star.lang import DisposedException +from com.sun.star.awt.FontSlant import ITALIC +from com.sun.star.awt.FontWeight import BOLD +from com.sun.star.table import BorderLine +from com.sun.star.table import TableBorder +from com.sun.star.awt import Size +from com.sun.star.awt import Point + + +class HelloTextTableShape: + + def __init__(self): + self.remote_context = None + self.remote_service_manager = None + + def use_documents(self) -> None: + self.use_writer() + self.use_calc() + self.use_draw() + + def get_remote_service_manager(self) -> None: + try: + self.remote_context = officehelper.bootstrap() + print("Connected to a running office ...") + return self.remote_context.ServiceManager + except Exception as e: + traceback.print_exc() + sys.exit(1) + + def new_doc_component(self, doc_type: str) -> None: + load_url = "private:factory/" + doc_type + self.remote_service_manager = self.get_remote_service_manager() + desktop = self.remote_service_manager.createInstanceWithContext( + "com.sun.star.frame.Desktop", self.remote_context + ) + return desktop.loadComponentFromURL(load_url, "_blank", 0, tuple([])) + + def use_writer(self) -> None: + try: + doc = self.new_doc_component("swriter") + xtext = doc.Text + self.manipulateText(xtext) + + # insert TextTable and get cell text, then manipulate text in cell + table = doc.createInstance("com.sun.star.text.TextTable") + xtext.insertTextContent(xtext.End, table, False) + + xcell = table[1, 0] + self.manipulateText(xcell) + self.manipulateTable(table) + + # insert RectangleShape and get shape text, then manipulate text + writer_shape = doc.createInstance("com.sun.star.drawing.RectangleShape") + writer_shape.setSize(Size(10000, 10000)) + xtext.insertTextContent(xtext.End, writer_shape, False) + # wrap text inside shape + writer_shape.TextContourFrame = True + + self.manipulateText(writer_shape) + self.manipulateShape(writer_shape) + + bookmark = doc.createInstance("com.sun.star.text.Bookmark") + bookmark.Name = "MyUniqueBookmarkName" + # insert the bookmark at the end of the document + xtext.insertTextContent(xtext.End, bookmark, False) + + # Query the added bookmark and set a string + found_bookmark = doc.Bookmarks.getByName("MyUniqueBookmarkName") + found_bookmark.Anchor.String = ( + "The throat mike, glued to her neck, " + "looked as much as possible like an analgesic dermadisk." + ) + + for text_table in doc.TextTables: + text_table.BackColor = 0xC8FFB9 + except DisposedException: + self.remote_context = None + raise + + def use_calc(self) -> None: + try: + doc = self.new_doc_component("scalc") + sheet = doc.Sheets[0] + + # get cell A2 in first sheet + cell = sheet[1, 0] + cell.IsTextWrapped = True + + self.manipulateText(cell) + self.manipulateTable(sheet) + + # create and insert RectangleShape and get shape text, + # then manipulate text + shape = doc.createInstance("com.sun.star.drawing.RectangleShape") + shape.Size = Size(10000, 10000) + shape.Position = Point(7000, 3000) + shape.TextContourFrame = True + sheet.DrawPage.add(shape) + + self.manipulateText(shape) + self.manipulateShape(shape) + except DisposedException: + self.remote_context = None + raise + + def use_draw(self) -> None: + try: + doc = self.new_doc_component("sdraw") + + draw_shape = doc.createInstance("com.sun.star.drawing.RectangleShape") + draw_shape.setSize(Size(10000, 20000)) + draw_shape.setPosition(Point(5000, 5000)) + doc.DrawPages[0].add(draw_shape) + + # wrap text inside shape + draw_shape.TextContourFrame = True + + self.manipulateText(draw_shape) + self.manipulateShape(draw_shape) + except DisposedException: + self.remote_context = None + raise + + def manipulateText(self, xtext) -> None: + """Insert text content + + :param xtext: object that implements com.sun.star.text.XText interface. + """ + # simply set whole text as one string + xtext.String = ( + "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 text cursor for selecting and formatting + text_cursor = xtext.createTextCursor() + # use cursor to select "He lay" and apply bold italic + text_cursor.gotoStart(False) + text_cursor.goRight(6, True) + # from CharacterProperties + text_cursor.CharPosture = ITALIC + text_cursor.CharWeight = BOLD + + # add more text at the end of the text using insertString + text_cursor.gotoEnd(False) + content = ( + " 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." + ) + xtext.insertString(text_cursor, content, False) + # after insertString the cursor is behind the inserted text, + # insert more text + content = "\n \"Is that the mill?\" he asked." + xtext.insertString(text_cursor, content, False) + + def manipulateTable(self, xcellrange) -> None: + """Format a table area + + :param xcellrange: object that implements com.sun.star.table.XCellRange interface. + """ + # enter column titles and a cell value + xcellrange[0, 0].String = "Quotation" + xcellrange[0, 1].String = "Year" + xcellrange[1, 1].Value = 1940 + + # format table headers and table borders + # we need to distinguish text and sheet tables: + # property name for cell colors is different in text and sheet cells + # we want to apply TableBorder to whole text table, but only to sheet + # cells with content + + background_color = 0x99CCFF + + # create description for blue line, width 10 + line = BorderLine() + line.Color = 0x000099 + line.OuterLineWidth = 10 + # apply line description to all border lines and make them valid + border = TableBorder() + border.VerticalLine = border.HorizontalLine = line + border.LeftLine = border.RightLine = line + border.TopLine = border.BottomLine = line + border.IsVerticalLineValid = border.IsHorizontalLineValid = True + border.IsLeftLineValid = border.IsRightLineValid = True + border.IsTopLineValid = border.IsBottomLineValid = True + + if xcellrange.supportsService("com.sun.star.sheet.Spreadsheet"): + selected_cells = xcellrange["A1:B2"] + selected_cells.CellBackColor = background_color + selected_cells.TableBorder = border + print(selected_cells.TableBorder.TopLine.Color) + elif xcellrange.supportsService("com.sun.star.text.TextTable"): + selected_cells = xcellrange["A1:B1"] + selected_cells.BackColor = background_color + xcellrange.TableBorder = border + print(xcellrange.TableBorder.TopLine.Color) + + def manipulateShape(self, xshape) -> None: + """Format a shape + + :param xshape: object that implements com.sun.star.drawing.XShape interface. + """ + xshape.FillColor = 0x99CCFF + xshape.LineColor = 0x000099 + xshape.RotateAngle = 3000 + + xshape.TextLeftDistance = 0 + xshape.TextRightDistance = 0 + xshape.TextUpperDistance = 0 + xshape.TextLowerDistance = 0 + + +def main() -> None: + try: + HelloTextTableShape().use_documents() + except Exception as e: + print(str(e)) + traceback.print_exc() + + +if __name__ == "__main__": + main() + +# vim: set shiftwidth=4 softtabstop=4 expandtab: |