From e64854c78cc44b1e3fdec1183212ed6d9a9a8153 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sat, 5 Jun 2021 22:06:13 -0500 Subject: [PATCH] Update easymacro.py --- CHANGELOG | 14 +- VERSION | 2 +- conf.py | 2 +- easymacro.py | 383 ++++++++++++++++-- .../{ZAZPip_v0.7.0.oxt => ZAZPip_v0.8.0.oxt} | Bin 86539 -> 87758 bytes source/description.xml | 2 +- source/pythonpath/easymacro.py | 383 ++++++++++++++++-- 7 files changed, 711 insertions(+), 75 deletions(-) rename files/{ZAZPip_v0.7.0.oxt => ZAZPip_v0.8.0.oxt} (50%) diff --git a/CHANGELOG b/CHANGELOG index e5090d9..2f61d6e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,13 @@ +v 0.8.0 [06-jun-2021] + - Update easymacro.py + - Add proxy config + +v 0.7.0 [05-jan-2020] + - Disable search + +v 0.6.0 [18-nov-2020] + - Add install with requirements.txt + v 0.5.0 [09-jul-2020] - Test install pandas @@ -5,16 +15,12 @@ v 0.4.0 [10-mar-2020] - Update easymacro.py - Fix: in OSx Catalina - v 0.3.0 [12-nov-2019] - Update easymacro.py - Test install numpy - v 0.2.0 [18-oct-2019] - Add spanish - v 0.1.0 [18-oct-2019] - Initial version - diff --git a/VERSION b/VERSION index bcaffe1..8adc70f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.7.0 \ No newline at end of file +0.8.0 \ No newline at end of file diff --git a/conf.py b/conf.py index 42e616c..5c8c889 100644 --- a/conf.py +++ b/conf.py @@ -26,7 +26,7 @@ import logging TYPE_EXTENSION = 1 # ~ https://semver.org/ -VERSION = '0.7.0' +VERSION = '0.8.0' # ~ Your great extension name, not used spaces NAME = 'ZAZPip' diff --git a/easymacro.py b/easymacro.py index 0745d96..2c7d5f3 100644 --- a/easymacro.py +++ b/easymacro.py @@ -21,6 +21,7 @@ import base64 import csv +import ctypes import datetime import getpass import gettext @@ -82,8 +83,9 @@ from com.sun.star.util import Time, Date, DateTime from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK from com.sun.star.text.TextContentAnchorType import AS_CHARACTER -from com.sun.star.awt import XActionListener +from com.sun.star.lang import Locale from com.sun.star.lang import XEventListener +from com.sun.star.awt import XActionListener from com.sun.star.awt import XMenuListener from com.sun.star.awt import XMouseListener from com.sun.star.awt import XMouseMotionListener @@ -203,6 +205,12 @@ class ConditionOperator(): CO = ConditionOperator +class DataPilotFieldOrientation(): + from com.sun.star.sheet.DataPilotFieldOrientation \ + import HIDDEN, COLUMN, ROW, PAGE, DATA +DPFO = DataPilotFieldOrientation + + OS = platform.system() IS_WIN = OS == 'Windows' IS_MAC = OS == 'Darwin' @@ -308,6 +316,11 @@ def get_app_config(node_name: str, key: str=''): LANGUAGE = get_app_config('org.openoffice.Setup/L10N/', 'ooLocale') LANG = LANGUAGE.split('-')[0] +try: + COUNTRY = LANGUAGE.split('-')[1] +except: + COUNTRY = '' +LOCALE = Locale(LANG, COUNTRY, '') NAME = TITLE = get_app_config('org.openoffice.Setup/Product', 'ooName') VERSION = get_app_config('org.openoffice.Setup/Product','ooSetupVersion') @@ -372,6 +385,8 @@ def mri(obj: Any) -> None: error(msg) return + if hasattr(obj, 'obj'): + obj = obj.obj m.inspect(obj) return @@ -1166,6 +1181,9 @@ class LODocument(object): return def to_pdf(self, path: str='', args: dict={}): + """ + https://wiki.documentfoundation.org/Macros/Python_Guide/PDF_export_filter_data + """ path_pdf = path filter_name = '{}_pdf_Export'.format(self.type) filter_data = dict_to_property(args, True) @@ -1520,6 +1538,142 @@ class LOSheetCharts(object): return LOChart(name, self.obj[name], self._sheet.draw_page) +class LOSheetTableField(object): + + def __init__(self, obj): + self._obj = obj + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def obj(self): + return self._obj + + @property + def name(self): + return self.obj.Name + + @property + def orientation(self): + return self.obj.Orientation + @orientation.setter + def orientation(self, value): + self.obj.Orientation = value + + +# ~ com.sun.star.sheet.DataPilotFieldOrientation.ROW +class LOSheetTable(object): + + def __init__(self, obj): + self._obj = obj + self._source = None + + def __getitem__(self, index): + field = self.obj.DataPilotFields[index] + return LOSheetTableField(field) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def obj(self): + return self._obj + + @property + def filter(self): + return self.obj.ShowFilterButton + @filter.setter + def filter(self, value): + self.obj.ShowFilterButton = value + + @property + def source(self): + return self._source + @source.setter + def source(self, value): + self._source = value + self.obj.SourceRange = value.range_address + + @property + def rows(self): + return self.obj.RowFields + @rows.setter + def rows(self, values): + if not isinstance(values, tuple): + values = (values,) + for v in values: + with self[v] as f: + f.orientation = DPFO.ROW + @property + def columns(self): + return self.obj.ColumnFields + @columns.setter + def columns(self, values): + if not isinstance(values, tuple): + values = (values,) + for v in values: + with self[v] as f: + f.orientation = DPFO.COLUMN + + @property + def data(self): + return self.obj.DataFields + @data.setter + def data(self, values): + if not isinstance(values, tuple): + values = (values,) + for v in values: + with self[v] as f: + f.orientation = DPFO.DATA + + +class LOSheetTables(object): + + def __init__(self, obj, sheet): + self._obj = obj + self._sheet = sheet + + def __getitem__(self, index): + return LOSheetTable(self.obj[index]) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + def __contains__(self, item): + return item in self.obj + + @property + def obj(self): + return self._obj + + @property + def count(self): + return self.obj.Count + + @property + def names(self): + return self.obj.ElementNames + + def new(self, name, target): + table = self.obj.createDataPilotDescriptor() + self.obj.insertNewByName(name, target.address, table) + return LOSheetTable(self.obj[name]) + + def remove(self, name): + self.obj.removeByName(name) + return + + class LOFormControl(LOBaseObject): EVENTS = { 'action': 'actionPerformed', @@ -2045,6 +2199,10 @@ class LOCalcSheet(object): def charts(self): return LOSheetCharts(self.obj.Charts, self) + @property + def tables(self): + return LOSheetTables(self.obj.DataPilotTables, self) + @property def rows(self): return LOSheetRows(self, self.obj.Rows) @@ -2558,6 +2716,7 @@ class LOCalcRange(object): cell = None if isinstance(value, dict): for k, v in value.items(): + # ~ print(1, 'RENDER', k, v) cell = self._render_value(k, v, key) return cell elif isinstance(value, (list, tuple)): @@ -2569,7 +2728,11 @@ class LOCalcRange(object): search = f'{{{parent}.{key}}}' ranges = self.find_all(search) - for cell in ranges or range(0): + if ranges is None: + return + + # ~ for cell in ranges or range(0): + for cell in ranges: self._set_new_value(cell, search, value) return LOCalcRange(cell) @@ -2719,6 +2882,55 @@ class LOCalcRange(object): return +class LOWriterStyles(object): + + def __init__(self, styles): + self._styles = styles + + @property + def names(self): + return {s.DisplayName: s.Name for s in self._styles} + + def __str__(self): + return '\n'.join(tuple(self.names.values())) + + +class LOWriterStylesFamilies(object): + + def __init__(self, styles): + self._styles = styles + + def __getitem__(self, index): + styles = { + 'Character': 'CharacterStyles', + 'Paragraph': 'ParagraphStyles', + 'Page': 'PageStyles', + 'Frame': 'FrameStyles', + 'Numbering': 'NumberingStyles', + 'Table': 'TableStyles', + 'Cell': 'CellStyles', + } + name = styles.get(index, index) + return LOWriterStyles(self._styles[name]) + + def __iter__(self): + self._index = 0 + return self + + def __next__(self): + obj = LOWriterStyles(self._styles[self._index]) + self._index += 1 + return obj + # ~ raise StopIteration + + @property + def names(self): + return self._styles.ElementNames + + def __str__(self): + return '\n'.join(self.names) + + class LOWriterPageStyle(LOBaseObject): def __init__(self, obj): @@ -2755,18 +2967,23 @@ class LOWriterTextRange(object): self._doc = doc self._is_paragraph = self.obj.ImplementationName == 'SwXParagraph' self._is_table = self.obj.ImplementationName == 'SwXTextTable' + self._is_text = self.obj.ImplementationName == 'SwXTextPortion' + self._parts = [] + if self._is_paragraph: + self._parts = [LOWriterTextRange(p, doc) for p in obj] def __iter__(self): self._index = 0 return self def __next__(self): - for i, p in enumerate(self.obj): - if i == self._index: - obj = LOWriterTextRange(p, self._doc) - self._index += 1 - return obj - raise StopIteration + try: + obj = self._parts[self._index] + except IndexError: + raise StopIteration + + self._index += 1 + return obj @property def obj(self): @@ -2785,11 +3002,37 @@ class LOWriterTextRange(object): @property def value(self): return self.string + @value.setter + def value(self, value): + self.string = value + + @property + def style(self): + s = '' + if self.is_paragraph: + s = self.obj.ParaStyleName + elif self.is_text: + s = self.obj.CharStyleName + return s + @style.setter + def style(self, value): + if self.is_paragraph: + self.obj.ParaStyleName = value + elif self.is_text: + self.obj.CharStyleName = value + + @property + def is_paragraph(self): + return self._is_paragraph @property def is_table(self): return self._is_table + @property + def is_text(self): + return self._is_text + @property def text(self): return self.obj.Text @@ -2802,6 +3045,13 @@ class LOWriterTextRange(object): def dp(self): return self._doc.dp + def delete(self): + cursor = self.cursor + cursor.gotoStartOfParagraph(False) + cursor.gotoNextParagraph(True) + cursor.String = '' + return + def offset(self): cursor = self.cursor.getEnd() return LOWriterTextRange(cursor, self._doc) @@ -2846,25 +3096,26 @@ class LOWriterTextRanges(object): def __init__(self, obj, doc): self._obj = obj self._doc = doc + self._paragraphs = [LOWriterTextRange(p, doc) for p in obj] + + def __len__(self): + return len(self._paragraphs) def __getitem__(self, index): - for i, p in enumerate(self.obj): - if i == index: - obj = LOWriterTextRange(p, self._doc) - break - return obj + return self._paragraphs[index] def __iter__(self): self._index = 0 return self def __next__(self): - for i, p in enumerate(self.obj): - if i == self._index: - obj = LOWriterTextRange(p, self._doc) - self._index += 1 - return obj - raise StopIteration + try: + obj = self._paragraphs[self._index] + except IndexError: + raise StopIteration + + self._index += 1 + return obj @property def obj(self): @@ -2887,10 +3138,17 @@ class LOWriterTextTable(object): @property def data(self): - return self._obj.DataArray + return self.obj.DataArray @data.setter def data(self, values): - self._obj.DataArray = values + self.obj.DataArray = values + + @property + def style(self): + return self.obj.TableTemplateName + @style.setter + def style(self, value): + self.obj.autoFormat(value) class LOWriterTextTables(object): @@ -2920,7 +3178,7 @@ class LOWriter(LODocument): @property def text(self): - return LOWriterTextRange(self.obj.Text, self) + return self.paragraphs @property def paragraphs(self): @@ -2973,6 +3231,10 @@ class LOWriter(LODocument): ps = self.obj.StyleFamilies['PageStyles'] return LOWriterPageStyles(ps) + @property + def styles(self): + return LOWriterStylesFamilies(self.obj.StyleFamilies) + @property def search_descriptor(self): return self.obj.createSearchDescriptor() @@ -3403,15 +3665,19 @@ class BaseRow: class BaseQuery(object): PY_TYPES = { - 'SQL_LONG': 'getLong', - 'SQL_VARYING': 'getString', - 'SQL_FLOAT': 'getFloat', - 'SQL_BOOLEAN': 'getBoolean', - 'SQL_TYPE_DATE': 'getDate', - 'SQL_TYPE_TIME': 'getTime', - 'SQL_TIMESTAMP': 'getTimestamp', + 'VARCHAR': 'getString', + 'INTEGER': 'getLong', + 'DATE': 'getDate', + # ~ 'SQL_LONG': 'getLong', + # ~ 'SQL_VARYING': 'getString', + # ~ 'SQL_FLOAT': 'getFloat', + # ~ 'SQL_BOOLEAN': 'getBoolean', + # ~ 'SQL_TYPE_DATE': 'getDate', + # ~ 'SQL_TYPE_TIME': 'getTime', + # ~ 'SQL_TIMESTAMP': 'getTimestamp', } - TYPES_DATE = ('SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP') + # ~ TYPES_DATE = ('SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP') + TYPES_DATE = ('DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP') def __init__(self, query): self._query = query @@ -3437,6 +3703,7 @@ class BaseQuery(object): def _to_python(self, index): type_field = self._meta.getColumnTypeName(index) + # ~ print('TF', type_field) value = getattr(self._query, self.PY_TYPES[type_field])(index) if type_field in self.TYPES_DATE: value = _struct_to_date(value) @@ -3562,10 +3829,11 @@ class LOBase(object): self._con.getTables().refresh() return - def initialize(self, database_proxy, tables): + def initialize(self, database_proxy, tables=[]): db = FirebirdDatabase(self) database_proxy.initialize(db) - db.create_tables(tables) + if tables: + db.create_tables(tables) return def _validate_sql(self, sql, params): @@ -5832,6 +6100,7 @@ _CB = ClipBoard class Paths(object): FILE_PICKER = 'com.sun.star.ui.dialogs.FilePicker' + FOLDER_PICKER = 'com.sun.star.ui.dialogs.FolderPicker' def __init__(self, path=''): if path.startswith('file://'): @@ -5941,7 +6210,7 @@ class Paths(object): @classmethod def get_dir(cls, init_dir=''): - folder_picker = create_instance(cls.FILE_PICKER) + folder_picker = create_instance(cls.FOLDER_PICKER) if not init_dir: init_dir = cls.documents init_dir = cls.to_url(init_dir) @@ -5950,7 +6219,7 @@ class Paths(object): path = '' if folder_picker.execute(): - path = cls.to_system(folder_picker.getDisplayDirectory()) + path = cls.to_system(folder_picker.getDirectory()) return path @classmethod @@ -6219,6 +6488,50 @@ class Paths(object): _P = Paths +class Dates(object): + + @classmethod + def date(cls, year, month, day): + d = datetime.date(year, month, day) + return d + + +class SpellChecker(object): + + def __init__(self): + service = 'com.sun.star.linguistic2.SpellChecker' + self._spellchecker = create_instance(service, True) + self._locale = LOCALE + + @property + def locale(self): + slocal = f'{self._locale.Language}-{self._locale.Country}' + return slocale + @locale.setter + def locale(self, value): + lang = value.split('-') + self._locale = Locale(lang[0], lang[1], '') + + def is_valid(self, word): + result = self._spellchecker.isValid(word, self._locale, ()) + return result + + def spell(self, word): + result = self._spellchecker.spell(word, self._locale, ()) + if result: + result = result.getAlternatives() + if not isinstance(result, tuple): + result = () + return result + + +def spell(word, locale=''): + sc = SpellChecker() + if locale: + sc.locale = locale + return sc.spell(word) + + def __getattr__(name): if name == 'active': return LODocs().active @@ -6244,6 +6557,8 @@ def __getattr__(name): return LOShortCuts() if name == 'clipboard': return ClipBoard + if name == 'dates': + return Dates raise AttributeError(f"module '{__name__}' has no attribute '{name}'") diff --git a/files/ZAZPip_v0.7.0.oxt b/files/ZAZPip_v0.8.0.oxt similarity index 50% rename from files/ZAZPip_v0.7.0.oxt rename to files/ZAZPip_v0.8.0.oxt index 1b86d6a90630f2187cc4b3f64d57f7459facff57..ae2c1a71bfd3434a7f0b10de0db646b86d24a103 100644 GIT binary patch delta 40382 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 }!I!{ii^2(}vedlTJ=$rtKY zP~UP1oI*ptx?g|YtFniDGylO%ah}M(uIfZ))*>ef)<)aeTHJZ&nAtD1ID#L12GZ~j zX|)PP6k12XbC=^T^COb1qG0Q*jCh%E0;|%U<6CC8nh;%b3&NDz&4Z^5A9r$jD7C>9 zB;1Viwc%Bw{M0@vNf@v4?^N%7Tj>feKf?;-1+Z)Biu!m=uqa%Im)@ZyZBxYkvojHM zr(eOaL>2uk+GYF37hQ)*gG+=MWf(oTL`^_3GOSDwduAy$&U_hGvd$bNNp+&>uj%Qs)2HsT(M>tsj4ni;0 zIfEOwp#*7dK&LSaI%)`7SyuZL@R6)pX~JbEr#M3zmJ$=N@K}_!UK@&Rcp~~>??`Ps zX?1}c8UT+^FAf=9;O)0-U%72rR^YF-V?TS3iCV(RcPz`R*O|`p)2)Ge1_u*>d2b1KF1Te`y;P7O=jHh38`D^66y}ktx(OGxlc9Rw7RHku<=i4eRYTn%Y z1FVAm)4C;ed__;cgCHyW3JEI0IZ<9LCY1oySjr6c!;~4~3(QQYnH+TCGU>13YVe9? z1X2R34PlYoRTIoH$n$&<5f~zt_) zUei`TIN^5kcCsZ@ubDYWp#n$NbdJsy5v4K2v#5uy`Q%5MLwDzd=q<#1(?(5oTrZCV zh2lsC!eX-MN#hJpAS5p%S|TEoLwSTiTn}=Vf1WL3t!aP^8|;*~NKbvD%iUDqzjERD z7U|@OdB^6=6m;Zr_-WzkE}%)tBp*Aek-~qn4$oagT*Swib40&9^@JX6`fHS-t;sMM z{ph`Sb?Wvt?dT^P=WPReIyf}hnmydQ7tfSvXw3oi5F}wOpfBa?eSpYFc2U$a$PASQ zRar_4EknC~$R>}q`KzKT@7%$^S#Tv81WG*bNofS;Xo9O};0zPi0-0Zn9UrXjv_R4l zllmUS=t`U|N-n!2khW>;ylEGWjmm)Tmx;Z|xwk5A{);J46h7+}_HE@D_gG5Fx&p@e zUeby3H`Ey)7-rTiCaA4nScEPdG8{>4$CG;&R$0&C?viCup1JaUHJ8DO0y;xzhhCw} zE_`HcFfQpvqH1qCVNPANF8W@(!%0A7FiubmBsAEIMTUO-hM@ewYQt~<< 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 Woli7)Nj+mp3&f7bs__&I>3;y>vlKl5 delta 39181 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 diff --git a/source/description.xml b/source/description.xml index 655fa38..60aaaf1 100644 --- a/source/description.xml +++ b/source/description.xml @@ -1,7 +1,7 @@ - + ZAZ Pip ZAZ Pip diff --git a/source/pythonpath/easymacro.py b/source/pythonpath/easymacro.py index 0745d96..2c7d5f3 100644 --- a/source/pythonpath/easymacro.py +++ b/source/pythonpath/easymacro.py @@ -21,6 +21,7 @@ import base64 import csv +import ctypes import datetime import getpass import gettext @@ -82,8 +83,9 @@ from com.sun.star.util import Time, Date, DateTime from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK from com.sun.star.text.TextContentAnchorType import AS_CHARACTER -from com.sun.star.awt import XActionListener +from com.sun.star.lang import Locale from com.sun.star.lang import XEventListener +from com.sun.star.awt import XActionListener from com.sun.star.awt import XMenuListener from com.sun.star.awt import XMouseListener from com.sun.star.awt import XMouseMotionListener @@ -203,6 +205,12 @@ class ConditionOperator(): CO = ConditionOperator +class DataPilotFieldOrientation(): + from com.sun.star.sheet.DataPilotFieldOrientation \ + import HIDDEN, COLUMN, ROW, PAGE, DATA +DPFO = DataPilotFieldOrientation + + OS = platform.system() IS_WIN = OS == 'Windows' IS_MAC = OS == 'Darwin' @@ -308,6 +316,11 @@ def get_app_config(node_name: str, key: str=''): LANGUAGE = get_app_config('org.openoffice.Setup/L10N/', 'ooLocale') LANG = LANGUAGE.split('-')[0] +try: + COUNTRY = LANGUAGE.split('-')[1] +except: + COUNTRY = '' +LOCALE = Locale(LANG, COUNTRY, '') NAME = TITLE = get_app_config('org.openoffice.Setup/Product', 'ooName') VERSION = get_app_config('org.openoffice.Setup/Product','ooSetupVersion') @@ -372,6 +385,8 @@ def mri(obj: Any) -> None: error(msg) return + if hasattr(obj, 'obj'): + obj = obj.obj m.inspect(obj) return @@ -1166,6 +1181,9 @@ class LODocument(object): return def to_pdf(self, path: str='', args: dict={}): + """ + https://wiki.documentfoundation.org/Macros/Python_Guide/PDF_export_filter_data + """ path_pdf = path filter_name = '{}_pdf_Export'.format(self.type) filter_data = dict_to_property(args, True) @@ -1520,6 +1538,142 @@ class LOSheetCharts(object): return LOChart(name, self.obj[name], self._sheet.draw_page) +class LOSheetTableField(object): + + def __init__(self, obj): + self._obj = obj + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def obj(self): + return self._obj + + @property + def name(self): + return self.obj.Name + + @property + def orientation(self): + return self.obj.Orientation + @orientation.setter + def orientation(self, value): + self.obj.Orientation = value + + +# ~ com.sun.star.sheet.DataPilotFieldOrientation.ROW +class LOSheetTable(object): + + def __init__(self, obj): + self._obj = obj + self._source = None + + def __getitem__(self, index): + field = self.obj.DataPilotFields[index] + return LOSheetTableField(field) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def obj(self): + return self._obj + + @property + def filter(self): + return self.obj.ShowFilterButton + @filter.setter + def filter(self, value): + self.obj.ShowFilterButton = value + + @property + def source(self): + return self._source + @source.setter + def source(self, value): + self._source = value + self.obj.SourceRange = value.range_address + + @property + def rows(self): + return self.obj.RowFields + @rows.setter + def rows(self, values): + if not isinstance(values, tuple): + values = (values,) + for v in values: + with self[v] as f: + f.orientation = DPFO.ROW + @property + def columns(self): + return self.obj.ColumnFields + @columns.setter + def columns(self, values): + if not isinstance(values, tuple): + values = (values,) + for v in values: + with self[v] as f: + f.orientation = DPFO.COLUMN + + @property + def data(self): + return self.obj.DataFields + @data.setter + def data(self, values): + if not isinstance(values, tuple): + values = (values,) + for v in values: + with self[v] as f: + f.orientation = DPFO.DATA + + +class LOSheetTables(object): + + def __init__(self, obj, sheet): + self._obj = obj + self._sheet = sheet + + def __getitem__(self, index): + return LOSheetTable(self.obj[index]) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + def __contains__(self, item): + return item in self.obj + + @property + def obj(self): + return self._obj + + @property + def count(self): + return self.obj.Count + + @property + def names(self): + return self.obj.ElementNames + + def new(self, name, target): + table = self.obj.createDataPilotDescriptor() + self.obj.insertNewByName(name, target.address, table) + return LOSheetTable(self.obj[name]) + + def remove(self, name): + self.obj.removeByName(name) + return + + class LOFormControl(LOBaseObject): EVENTS = { 'action': 'actionPerformed', @@ -2045,6 +2199,10 @@ class LOCalcSheet(object): def charts(self): return LOSheetCharts(self.obj.Charts, self) + @property + def tables(self): + return LOSheetTables(self.obj.DataPilotTables, self) + @property def rows(self): return LOSheetRows(self, self.obj.Rows) @@ -2558,6 +2716,7 @@ class LOCalcRange(object): cell = None if isinstance(value, dict): for k, v in value.items(): + # ~ print(1, 'RENDER', k, v) cell = self._render_value(k, v, key) return cell elif isinstance(value, (list, tuple)): @@ -2569,7 +2728,11 @@ class LOCalcRange(object): search = f'{{{parent}.{key}}}' ranges = self.find_all(search) - for cell in ranges or range(0): + if ranges is None: + return + + # ~ for cell in ranges or range(0): + for cell in ranges: self._set_new_value(cell, search, value) return LOCalcRange(cell) @@ -2719,6 +2882,55 @@ class LOCalcRange(object): return +class LOWriterStyles(object): + + def __init__(self, styles): + self._styles = styles + + @property + def names(self): + return {s.DisplayName: s.Name for s in self._styles} + + def __str__(self): + return '\n'.join(tuple(self.names.values())) + + +class LOWriterStylesFamilies(object): + + def __init__(self, styles): + self._styles = styles + + def __getitem__(self, index): + styles = { + 'Character': 'CharacterStyles', + 'Paragraph': 'ParagraphStyles', + 'Page': 'PageStyles', + 'Frame': 'FrameStyles', + 'Numbering': 'NumberingStyles', + 'Table': 'TableStyles', + 'Cell': 'CellStyles', + } + name = styles.get(index, index) + return LOWriterStyles(self._styles[name]) + + def __iter__(self): + self._index = 0 + return self + + def __next__(self): + obj = LOWriterStyles(self._styles[self._index]) + self._index += 1 + return obj + # ~ raise StopIteration + + @property + def names(self): + return self._styles.ElementNames + + def __str__(self): + return '\n'.join(self.names) + + class LOWriterPageStyle(LOBaseObject): def __init__(self, obj): @@ -2755,18 +2967,23 @@ class LOWriterTextRange(object): self._doc = doc self._is_paragraph = self.obj.ImplementationName == 'SwXParagraph' self._is_table = self.obj.ImplementationName == 'SwXTextTable' + self._is_text = self.obj.ImplementationName == 'SwXTextPortion' + self._parts = [] + if self._is_paragraph: + self._parts = [LOWriterTextRange(p, doc) for p in obj] def __iter__(self): self._index = 0 return self def __next__(self): - for i, p in enumerate(self.obj): - if i == self._index: - obj = LOWriterTextRange(p, self._doc) - self._index += 1 - return obj - raise StopIteration + try: + obj = self._parts[self._index] + except IndexError: + raise StopIteration + + self._index += 1 + return obj @property def obj(self): @@ -2785,11 +3002,37 @@ class LOWriterTextRange(object): @property def value(self): return self.string + @value.setter + def value(self, value): + self.string = value + + @property + def style(self): + s = '' + if self.is_paragraph: + s = self.obj.ParaStyleName + elif self.is_text: + s = self.obj.CharStyleName + return s + @style.setter + def style(self, value): + if self.is_paragraph: + self.obj.ParaStyleName = value + elif self.is_text: + self.obj.CharStyleName = value + + @property + def is_paragraph(self): + return self._is_paragraph @property def is_table(self): return self._is_table + @property + def is_text(self): + return self._is_text + @property def text(self): return self.obj.Text @@ -2802,6 +3045,13 @@ class LOWriterTextRange(object): def dp(self): return self._doc.dp + def delete(self): + cursor = self.cursor + cursor.gotoStartOfParagraph(False) + cursor.gotoNextParagraph(True) + cursor.String = '' + return + def offset(self): cursor = self.cursor.getEnd() return LOWriterTextRange(cursor, self._doc) @@ -2846,25 +3096,26 @@ class LOWriterTextRanges(object): def __init__(self, obj, doc): self._obj = obj self._doc = doc + self._paragraphs = [LOWriterTextRange(p, doc) for p in obj] + + def __len__(self): + return len(self._paragraphs) def __getitem__(self, index): - for i, p in enumerate(self.obj): - if i == index: - obj = LOWriterTextRange(p, self._doc) - break - return obj + return self._paragraphs[index] def __iter__(self): self._index = 0 return self def __next__(self): - for i, p in enumerate(self.obj): - if i == self._index: - obj = LOWriterTextRange(p, self._doc) - self._index += 1 - return obj - raise StopIteration + try: + obj = self._paragraphs[self._index] + except IndexError: + raise StopIteration + + self._index += 1 + return obj @property def obj(self): @@ -2887,10 +3138,17 @@ class LOWriterTextTable(object): @property def data(self): - return self._obj.DataArray + return self.obj.DataArray @data.setter def data(self, values): - self._obj.DataArray = values + self.obj.DataArray = values + + @property + def style(self): + return self.obj.TableTemplateName + @style.setter + def style(self, value): + self.obj.autoFormat(value) class LOWriterTextTables(object): @@ -2920,7 +3178,7 @@ class LOWriter(LODocument): @property def text(self): - return LOWriterTextRange(self.obj.Text, self) + return self.paragraphs @property def paragraphs(self): @@ -2973,6 +3231,10 @@ class LOWriter(LODocument): ps = self.obj.StyleFamilies['PageStyles'] return LOWriterPageStyles(ps) + @property + def styles(self): + return LOWriterStylesFamilies(self.obj.StyleFamilies) + @property def search_descriptor(self): return self.obj.createSearchDescriptor() @@ -3403,15 +3665,19 @@ class BaseRow: class BaseQuery(object): PY_TYPES = { - 'SQL_LONG': 'getLong', - 'SQL_VARYING': 'getString', - 'SQL_FLOAT': 'getFloat', - 'SQL_BOOLEAN': 'getBoolean', - 'SQL_TYPE_DATE': 'getDate', - 'SQL_TYPE_TIME': 'getTime', - 'SQL_TIMESTAMP': 'getTimestamp', + 'VARCHAR': 'getString', + 'INTEGER': 'getLong', + 'DATE': 'getDate', + # ~ 'SQL_LONG': 'getLong', + # ~ 'SQL_VARYING': 'getString', + # ~ 'SQL_FLOAT': 'getFloat', + # ~ 'SQL_BOOLEAN': 'getBoolean', + # ~ 'SQL_TYPE_DATE': 'getDate', + # ~ 'SQL_TYPE_TIME': 'getTime', + # ~ 'SQL_TIMESTAMP': 'getTimestamp', } - TYPES_DATE = ('SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP') + # ~ TYPES_DATE = ('SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP') + TYPES_DATE = ('DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP') def __init__(self, query): self._query = query @@ -3437,6 +3703,7 @@ class BaseQuery(object): def _to_python(self, index): type_field = self._meta.getColumnTypeName(index) + # ~ print('TF', type_field) value = getattr(self._query, self.PY_TYPES[type_field])(index) if type_field in self.TYPES_DATE: value = _struct_to_date(value) @@ -3562,10 +3829,11 @@ class LOBase(object): self._con.getTables().refresh() return - def initialize(self, database_proxy, tables): + def initialize(self, database_proxy, tables=[]): db = FirebirdDatabase(self) database_proxy.initialize(db) - db.create_tables(tables) + if tables: + db.create_tables(tables) return def _validate_sql(self, sql, params): @@ -5832,6 +6100,7 @@ _CB = ClipBoard class Paths(object): FILE_PICKER = 'com.sun.star.ui.dialogs.FilePicker' + FOLDER_PICKER = 'com.sun.star.ui.dialogs.FolderPicker' def __init__(self, path=''): if path.startswith('file://'): @@ -5941,7 +6210,7 @@ class Paths(object): @classmethod def get_dir(cls, init_dir=''): - folder_picker = create_instance(cls.FILE_PICKER) + folder_picker = create_instance(cls.FOLDER_PICKER) if not init_dir: init_dir = cls.documents init_dir = cls.to_url(init_dir) @@ -5950,7 +6219,7 @@ class Paths(object): path = '' if folder_picker.execute(): - path = cls.to_system(folder_picker.getDisplayDirectory()) + path = cls.to_system(folder_picker.getDirectory()) return path @classmethod @@ -6219,6 +6488,50 @@ class Paths(object): _P = Paths +class Dates(object): + + @classmethod + def date(cls, year, month, day): + d = datetime.date(year, month, day) + return d + + +class SpellChecker(object): + + def __init__(self): + service = 'com.sun.star.linguistic2.SpellChecker' + self._spellchecker = create_instance(service, True) + self._locale = LOCALE + + @property + def locale(self): + slocal = f'{self._locale.Language}-{self._locale.Country}' + return slocale + @locale.setter + def locale(self, value): + lang = value.split('-') + self._locale = Locale(lang[0], lang[1], '') + + def is_valid(self, word): + result = self._spellchecker.isValid(word, self._locale, ()) + return result + + def spell(self, word): + result = self._spellchecker.spell(word, self._locale, ()) + if result: + result = result.getAlternatives() + if not isinstance(result, tuple): + result = () + return result + + +def spell(word, locale=''): + sc = SpellChecker() + if locale: + sc.locale = locale + return sc.spell(word) + + def __getattr__(name): if name == 'active': return LODocs().active @@ -6244,6 +6557,8 @@ def __getattr__(name): return LOShortCuts() if name == 'clipboard': return ClipBoard + if name == 'dates': + return Dates raise AttributeError(f"module '{__name__}' has no attribute '{name}'")