From 939c6d54bd7f54f62eb2a25d01ec244279044fef Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sat, 19 Oct 2019 15:16:13 -0500 Subject: [PATCH 1/3] Add spanish --- VERSION | 2 +- conf.py | 4 +- easymacro.py | 17 ++++++++ files/ZAZPip_v0.2.0.oxt | Bin 0 -> 75410 bytes source/ZAZPip.py | 26 +++++------ source/description.xml | 2 +- source/locales/base.pot | 37 ++++++++++++++++ source/locales/en/LC_MESSAGES/base.mo | Bin 0 -> 580 bytes source/locales/en/LC_MESSAGES/base.po | 38 ++++++++++++++++ source/locales/es/LC_MESSAGES/base.mo | Bin 0 -> 592 bytes source/locales/es/LC_MESSAGES/base.po | 38 ++++++++++++++++ source/pythonpath/easymacro.py | 17 ++++++++ zaz.py | 60 ++++++++++++++++++++++++++ 13 files changed, 222 insertions(+), 19 deletions(-) create mode 100644 files/ZAZPip_v0.2.0.oxt create mode 100644 source/locales/base.pot create mode 100644 source/locales/en/LC_MESSAGES/base.mo create mode 100644 source/locales/en/LC_MESSAGES/base.po create mode 100644 source/locales/es/LC_MESSAGES/base.mo create mode 100644 source/locales/es/LC_MESSAGES/base.po diff --git a/VERSION b/VERSION index 49b49e4..5faa42c 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -0.1.0 +0.2.0 diff --git a/conf.py b/conf.py index 7fe37de..f1685e9 100644 --- a/conf.py +++ b/conf.py @@ -26,7 +26,7 @@ import logging TYPE_EXTENSION = 1 # ~ https://semver.org/ -VERSION = '0.1.0' +VERSION = '0.2.0' # ~ Your great extension name, not used spaces NAME = 'ZAZPip' @@ -207,6 +207,8 @@ PATHS = { 'soffice': ('soffice', PROGRAM, FILE_TEST), 'install': ('unopkg', 'add', '-v', '-f', '-s'), 'profile': '/home/mau/.config/libreoffice/4/user', + 'gettext': PATH_PYGETTEXT, + 'msgmerge': PATH_MSGMERGE, } diff --git a/easymacro.py b/easymacro.py index 20923a8..e3d7cc8 100644 --- a/easymacro.py +++ b/easymacro.py @@ -22,6 +22,7 @@ import csv import ctypes import datetime import errno +import gettext import getpass import hashlib import json @@ -100,6 +101,7 @@ ID_EXTENSION = '' DIR = { 'images': 'images', + 'locales': 'locales', } KEY = { @@ -4665,6 +4667,7 @@ def import_csv(path, **kwargs): rows = tuple(csv.reader(f, **kwargs)) return rows + def export_csv(path, data, **kwargs): with open(path, 'w') as f: writer = csv.writer(f, **kwargs) @@ -4672,6 +4675,20 @@ def export_csv(path, data, **kwargs): return +@catch_exception +def install_locales(path, domain='base', dir_locales=DIR['locales']): + p, *_ = get_info_path(path) + path_locales = join(p, dir_locales) + try: + lang = gettext.translation(domain, path_locales, languages=[LANG]) + lang.install() + _ = lang.gettext + except Exception as e: + from gettext import gettext as _ + error(e) + return _ + + class LIBOServer(object): HOST = 'localhost' PORT = '8100' diff --git a/files/ZAZPip_v0.2.0.oxt b/files/ZAZPip_v0.2.0.oxt new file mode 100644 index 0000000000000000000000000000000000000000..cf22e0763d07949503821167e3e73c5f1e2894f1 GIT binary patch literal 75410 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 - + ZAZ Pip ZAZ Pip diff --git a/source/locales/base.pot b/source/locales/base.pot new file mode 100644 index 0000000..7966382 --- /dev/null +++ b/source/locales/base.pot @@ -0,0 +1,37 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2019-10-19 14:42-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + +#: source/ZAZPip.py:327 +msgid "PIP not installed" +msgstr "" + +#: source/ZAZPip.py:346 +msgid "Admin PIP" +msgstr "" + +#: source/ZAZPip.py:359 +msgid "Install PIP" +msgstr "" + +#: source/ZAZPip.py:397 +msgid "Packages" +msgstr "" + +#: source/ZAZPip.py:429 +msgid "~Close" +msgstr "" + diff --git a/source/locales/en/LC_MESSAGES/base.mo b/source/locales/en/LC_MESSAGES/base.mo new file mode 100644 index 0000000000000000000000000000000000000000..9f5c02630c0a2482e6d63cd51788d100df26df19 GIT binary patch literal 580 zcmbV|zfQw25XQ}4L12M_iQ!-ZB!{F>sZEsuN{cEL5ut)uO>>k$YDczO(wGwb>2}Or2R}n(n?rM8Y}XA zw5A@UvXG5un6gB4??ev`d#dNkAWO8m#jfS8lwY7WnUWEB$tgd>`^HR#?5 zZP3Q&ohGmR`LvMc8Z~dou1Yi6i=c9qS??GnYPw0v4~G#H!yZ}}<`+W<{jzt-CkCY> zNED`-g_2+L_vwm;zV1?UVco8meq literal 0 HcmV?d00001 diff --git a/source/locales/en/LC_MESSAGES/base.po b/source/locales/en/LC_MESSAGES/base.po new file mode 100644 index 0000000..c79d6b8 --- /dev/null +++ b/source/locales/en/LC_MESSAGES/base.po @@ -0,0 +1,38 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2019-10-19 14:42-0500\n" +"PO-Revision-Date: 2019-10-19 15:13-0500\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.2.4\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: en\n" + +#: source/ZAZPip.py:327 +msgid "PIP not installed" +msgstr "PIP not installed" + +#: source/ZAZPip.py:346 +msgid "Admin PIP" +msgstr "Admin PIP" + +#: source/ZAZPip.py:359 +msgid "Install PIP" +msgstr "Install PIP" + +#: source/ZAZPip.py:397 +msgid "Packages" +msgstr "Packages" + +#: source/ZAZPip.py:429 +msgid "~Close" +msgstr "~Close" diff --git a/source/locales/es/LC_MESSAGES/base.mo b/source/locales/es/LC_MESSAGES/base.mo new file mode 100644 index 0000000000000000000000000000000000000000..1e5863d9a947f4a8db970e0277cf4d18ef7a034c GIT binary patch literal 592 zcmYk2&uSDw5XL(i|BZquc*~)@8KK9SB@3Hb7Sa6Cg@g=Y6|e11xwg)BkKMiEg7_A` zLpkY` zvGGCGb$dom#s<=>8dsuJ)30jAUi{jrt!Gg>`-P`Ljw|_|o!8bBl$1yEn7`|o$z2t= zpk9`5%RH0$Hs$>y-;!BB%aQ|SW(&B<39C8g4#$UkS2lT?B|FvxHbG974O{~M2rrsi zX)~nhXXQMH(YwjM99;D|W&9_0a?ea{rOm9M!ABjEH*DD9C6#==ET~z|I7G9wSyG<% zlMk|Mu&$uea-{?H(q6iSCwkl-U27HM*QBf$PStYXy16gNG;Qify&=V(hSo`3VySC^qS#279L3P_!mBqHdEjYB>W`{X(0Z_}6*8l(j literal 0 HcmV?d00001 diff --git a/source/locales/es/LC_MESSAGES/base.po b/source/locales/es/LC_MESSAGES/base.po new file mode 100644 index 0000000..86df997 --- /dev/null +++ b/source/locales/es/LC_MESSAGES/base.po @@ -0,0 +1,38 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2019-10-19 14:42-0500\n" +"PO-Revision-Date: 2019-10-19 15:14-0500\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.2.4\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: es\n" + +#: source/ZAZPip.py:327 +msgid "PIP not installed" +msgstr "PIP no esta instalado" + +#: source/ZAZPip.py:346 +msgid "Admin PIP" +msgstr "Administrar PIP" + +#: source/ZAZPip.py:359 +msgid "Install PIP" +msgstr "Instalar PIP" + +#: source/ZAZPip.py:397 +msgid "Packages" +msgstr "Paquetes" + +#: source/ZAZPip.py:429 +msgid "~Close" +msgstr "~Cerrar" diff --git a/source/pythonpath/easymacro.py b/source/pythonpath/easymacro.py index 20923a8..e3d7cc8 100644 --- a/source/pythonpath/easymacro.py +++ b/source/pythonpath/easymacro.py @@ -22,6 +22,7 @@ import csv import ctypes import datetime import errno +import gettext import getpass import hashlib import json @@ -100,6 +101,7 @@ ID_EXTENSION = '' DIR = { 'images': 'images', + 'locales': 'locales', } KEY = { @@ -4665,6 +4667,7 @@ def import_csv(path, **kwargs): rows = tuple(csv.reader(f, **kwargs)) return rows + def export_csv(path, data, **kwargs): with open(path, 'w') as f: writer = csv.writer(f, **kwargs) @@ -4672,6 +4675,20 @@ def export_csv(path, data, **kwargs): return +@catch_exception +def install_locales(path, domain='base', dir_locales=DIR['locales']): + p, *_ = get_info_path(path) + path_locales = join(p, dir_locales) + try: + lang = gettext.translation(domain, path_locales, languages=[LANG]) + lang.install() + _ = lang.gettext + except Exception as e: + from gettext import gettext as _ + error(e) + return _ + + class LIBOServer(object): HOST = 'localhost' PORT = '8100' diff --git a/zaz.py b/zaz.py index 2cac1bc..9cad0c8 100644 --- a/zaz.py +++ b/zaz.py @@ -33,6 +33,7 @@ from xml.dom.minidom import parseString from conf import ( DATA, DIRS, + DOMAIN, EXTENSION, FILES, INFO, @@ -138,6 +139,19 @@ def _save(path, data): return +def _get_files(path, filters=''): + paths = [] + if filters in ('*', '*.*'): + filters = '' + for folder, _, files in os.walk(path): + if filters: + pattern = re.compile(r'\.(?:{})$'.format(filters), re.IGNORECASE) + paths += [_join(folder, f) for f in files if pattern.search(f)] + else: + paths += files + return paths + + def _compress_oxt(): log.info('Compress OXT extension...') @@ -435,8 +449,50 @@ def _embed(args): return +def _locales(args): + EASYMACRO = 'easymacro.py' + + if args.files: + files = args.files.split(',') + else: + files = _get_files(DIRS['source'], 'py') + paths = ' '.join([f for f in files if not EASYMACRO in f]) + path_pot = _join(DIRS['source'], DIRS['locales'], '{}.pot'.format(DOMAIN)) + call([PATHS['gettext'], '-o', path_pot, paths]) + log.info('POT generate successfully...') + return + + +def _update(): + path_locales = _join(DIRS['source'], DIRS['locales']) + path_pot = _join(DIRS['source'], DIRS['locales'], '{}.pot'.format(DOMAIN)) + if not _exists(path_pot): + log.error('Not exists file POT...') + return + + files = _get_files(path_locales, 'po') + if not files: + log.error('First, generate files PO...') + return + + for f in files: + call([PATHS['msgmerge'], '-U', f, path_pot]) + log.info('\tUpdate: {}'.format(f)) + + log.info('Locales update successfully...') + return + + def main(args): + if args.update: + _update() + return + + if args.locales: + _locales(args) + return + if args.embed: _embed(args) return @@ -469,6 +525,10 @@ def _process_command_line_arguments(): default=False, required=False) parser.add_argument('-d', '--document', dest='document', default='') parser.add_argument('-f', '--files', dest='files', default='') + parser.add_argument('-l', '--locales', dest='locales', action='store_true', + default=False, required=False) + parser.add_argument('-u', '--update', dest='update', action='store_true', + default=False, required=False) return parser.parse_args() From f1ba247a23f70f2949b4326818d7ef25ab69983d Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sat, 19 Oct 2019 15:25:49 -0500 Subject: [PATCH 2/3] Add spanish messages --- .gitignore | 1 + files/ZAZPip_v0.2.0.oxt | Bin 75410 -> 77500 bytes source/ZAZPip.py | 22 ++++----- source/locales/base.pot | 52 ++++++++++++++++++++- source/locales/en/LC_MESSAGES/base.mo | Bin 580 -> 356 bytes source/locales/en/LC_MESSAGES/base.po | 64 +++++++++++++++++++++++--- source/locales/es/LC_MESSAGES/base.mo | Bin 592 -> 1390 bytes source/locales/es/LC_MESSAGES/base.po | 64 ++++++++++++++++++++++++-- 8 files changed, 180 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 03b69a9..399bdd7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ __pycache__/ *.py[cod] +*.po~ *.log images/ diff --git a/files/ZAZPip_v0.2.0.oxt b/files/ZAZPip_v0.2.0.oxt index cf22e0763d07949503821167e3e73c5f1e2894f1..a6ab8ca9248d44136c0e37ecb197d626b46d3f23 100644 GIT binary patch delta 6788 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 S@E{-vC=UH0>yIDO5Bh(Xhd;9b delta 4735 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 Q3n>0P!r#Sk;eP_;KTz*}P5=M^ diff --git a/source/ZAZPip.py b/source/ZAZPip.py index cf8724d..7f3a8a7 100644 --- a/source/ZAZPip.py +++ b/source/ZAZPip.py @@ -46,7 +46,7 @@ class Controllers(object): return def cmd_install_pip_action(self, event): - msg = 'Do you want install PIP?' + msg = _('Do you want install PIP?') if not app.question(msg, 'ZAZ-Pip'): return @@ -64,20 +64,20 @@ class Controllers(object): self.d.lst_log.insert('Download PIP...') data = app.url_open(URL_PIP) if not data: - msg = 'Do you have internet connection?' + msg = _('Do you have internet connection?') app.errorbox(msg) return app.save_file(path_pip, 'wb', data) if not app.is_created(path_pip): - msg = 'File PIP not save' + msg = _('File PIP not save') app.errorbox(msg) return - self.d.lst_log.insert('PIP save correctly...') + self.d.lst_log.insert(_('PIP save correctly...')) try: - self.d.lst_log.insert('Start installing PIP...') + self.d.lst_log.insert(_('Start installing PIP...')) cmd = '"{}" "{}" --user'.format(self.path_python, path_pip) for line in app.popen(cmd): if isinstance(line, tuple): @@ -91,10 +91,10 @@ class Controllers(object): self.d.lbl_pip.value = label self.d.cmd_install_pip.visible = False self.d.cmd_admin_pip.visible = True - msg = 'PIP installed sucesfully' + msg = _('PIP installed sucesfully') app.msgbox(msg) else: - msg = 'PIP not installed, see log.' + msg = _('PIP not installed, see log') app.warning(msg) except Exception as e: app.errorbox(e) @@ -170,7 +170,7 @@ class Controllers(object): if line: self.d.lst_package.select() else: - self.d.lst_package.insert('Not found...', 'error.png', show=False) + self.d.lst_package.insert(_('Not found...'), 'error.png', show=False) return def cmd_search_action(self, event): @@ -206,7 +206,7 @@ class Controllers(object): opt = 'upgrade' name = self.d.lst_package.value - msg = 'Do you want {}:\n\n{} ?'.format(opt, name) + msg = _('Do you want {}:\n\n{} ?').format(opt, name) if not app.question(msg, TITLE): return @@ -232,12 +232,12 @@ class Controllers(object): def cmd_uninstall_action(self, event): if not self._states['list']: - msg = 'Select installed package' + msg = _('Select installed package') app.warning(msg) return name = self.d.lst_package.value - msg = 'Do you want uninstall:\n\n{} ?'.format(name) + msg = _('Do you want uninstall:\n\n{} ?').format(name) if not app.question(msg): return diff --git a/source/locales/base.pot b/source/locales/base.pot index 7966382..efec610 100644 --- a/source/locales/base.pot +++ b/source/locales/base.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2019-10-19 14:42-0500\n" +"POT-Creation-Date: 2019-10-19 15:19-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -15,6 +15,56 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" +#: source/ZAZPip.py:49 +msgid "Do you want install PIP?" +msgstr "" + +#: source/ZAZPip.py:67 +msgid "Do you have internet connection?" +msgstr "" + +#: source/ZAZPip.py:73 +msgid "File PIP not save" +msgstr "" + +#: source/ZAZPip.py:76 +msgid "PIP save correctly..." +msgstr "" + +#: source/ZAZPip.py:80 +msgid "Start installing PIP..." +msgstr "" + +#: source/ZAZPip.py:94 +msgid "PIP installed sucesfully" +msgstr "" + +#: source/ZAZPip.py:97 +msgid "PIP not installed, see log" +msgstr "" + +#: source/ZAZPip.py:173 +msgid "Not found..." +msgstr "" + +#: source/ZAZPip.py:209 +msgid "" +"Do you want {}:\n" +"\n" +"{} ?" +msgstr "" + +#: source/ZAZPip.py:235 +msgid "Select installed package" +msgstr "" + +#: source/ZAZPip.py:240 +msgid "" +"Do you want uninstall:\n" +"\n" +"{} ?" +msgstr "" + #: source/ZAZPip.py:327 msgid "PIP not installed" msgstr "" diff --git a/source/locales/en/LC_MESSAGES/base.mo b/source/locales/en/LC_MESSAGES/base.mo index 9f5c02630c0a2482e6d63cd51788d100df26df19..ba5e52a45d5f93171958182cd5199a62ac55f960 100644 GIT binary patch delta 71 zcmX@Y@`TCao)F7a1|VPrVi_P-0b*t#)&XJ=umEB$prj>`2C0F8i4V+}j0`4AFn$35 DBpL`P delta 296 zcmaFDbcCh;o)F7a1|VPqVi_Rz0b*_-t^r~YSOLVGK)e!&LE@W%SP+Q!12G2>Uj$;1 z-djMd#mK<$5J-d6^DsfwivekndL;H(GxHPzJOda!^NLFnb8^6JAYUObzeFJuB9@xM5RjOhotU0l%uwf?lV6-V(ZY<$ O(0F3O7Yi~CU;qFNWi*ih diff --git a/source/locales/en/LC_MESSAGES/base.po b/source/locales/en/LC_MESSAGES/base.po index c79d6b8..c752f52 100644 --- a/source/locales/en/LC_MESSAGES/base.po +++ b/source/locales/en/LC_MESSAGES/base.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"POT-Creation-Date: 2019-10-19 14:42-0500\n" -"PO-Revision-Date: 2019-10-19 15:13-0500\n" +"POT-Creation-Date: 2019-10-19 15:19-0500\n" +"PO-Revision-Date: 2019-10-19 15:20-0500\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,22 +17,72 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: en\n" +#: source/ZAZPip.py:49 +msgid "Do you want install PIP?" +msgstr "" + +#: source/ZAZPip.py:67 +msgid "Do you have internet connection?" +msgstr "" + +#: source/ZAZPip.py:73 +msgid "File PIP not save" +msgstr "" + +#: source/ZAZPip.py:76 +msgid "PIP save correctly..." +msgstr "" + +#: source/ZAZPip.py:80 +msgid "Start installing PIP..." +msgstr "" + +#: source/ZAZPip.py:94 +msgid "PIP installed sucesfully" +msgstr "" + +#: source/ZAZPip.py:97 +msgid "PIP not installed, see log" +msgstr "" + +#: source/ZAZPip.py:173 +msgid "Not found..." +msgstr "" + +#: source/ZAZPip.py:209 +msgid "" +"Do you want {}:\n" +"\n" +"{} ?" +msgstr "" + +#: source/ZAZPip.py:235 +msgid "Select installed package" +msgstr "" + +#: source/ZAZPip.py:240 +msgid "" +"Do you want uninstall:\n" +"\n" +"{} ?" +msgstr "" + #: source/ZAZPip.py:327 msgid "PIP not installed" -msgstr "PIP not installed" +msgstr "" #: source/ZAZPip.py:346 msgid "Admin PIP" -msgstr "Admin PIP" +msgstr "" #: source/ZAZPip.py:359 msgid "Install PIP" -msgstr "Install PIP" +msgstr "" #: source/ZAZPip.py:397 msgid "Packages" -msgstr "Packages" +msgstr "" #: source/ZAZPip.py:429 msgid "~Close" -msgstr "~Close" +msgstr "" diff --git a/source/locales/es/LC_MESSAGES/base.mo b/source/locales/es/LC_MESSAGES/base.mo index 1e5863d9a947f4a8db970e0277cf4d18ef7a034c..4d88f2041e1ec6aa58d3c4a232e1b635f20155a6 100644 GIT binary patch literal 1390 zcmZXT&x;gC6vs=~_@j-+2tiR3p9jGo+mo5WMV)04b$4aJAA@ehYuWu~woPx3uJo|m!Jv%NI)O@Di?|Sw62>u3&{Yg;t^WXvSCMbTZ z;CApaD0a_5$^SRF6?_ezK0*|%IFqq~JW{IeB%-GYk}neW{UXmt zr9#}-mETLI$um=K2c=5#;6~2jM)|0Wt&>0XfW5lGIfRo?G^{l0M$m3uo|yrm9Pxa3 zF}I#o&)GY0jJs)klbuJOIu!M;#n*W)lT$pe19zz1Y@Ll;&A4@zS~H#Yskk}QY(|&0 z5Al-I#^*X%2hYpe32b6*h#KFyLiDQHpOi^bmn#zqDySpq0ltGFzV27G~gh?8p9E_8Z*(Y zxHga)dzRBIP`lA?oQisR;dCA^TDRgmWQOI@&$VZ%`a5^b(2+T69iNS=Ny~h2+DQ}D zoBx+Ge`JbYV0tXv8xuZPw1yhEpblT zCCk~GEt6N%R#yT;MneorOYO#ygJ3){dIhb1=NAwER(9kliV zw6Zp>h2RVL4E}p}f&(Al&M>q8Pw?U2e;xRbgxUc;5Q7$20#{F94?F`me*qov3UD`Pp& z%Qt$V3M;Z|CR0lIcE(d_)^CmT!;`Zx8bnbLvzjh24JVT4L$N;f9y&1_8%{JUld~-} srtjYI_21@DNE1*Qni;EE|BJ4hDjR#2>wHcN Date: Mon, 28 Oct 2019 22:14:24 -0600 Subject: [PATCH 3/3] Add support for spanish --- easymacro.py | 741 ++++++++++++++++++++++++++++++--- files/ZAZPip_v0.2.0.oxt | Bin 77500 -> 79926 bytes source/ZAZPip.py | 1 - source/pythonpath/easymacro.py | 547 ++++++++++++++++++++++-- 4 files changed, 1206 insertions(+), 83 deletions(-) diff --git a/easymacro.py b/easymacro.py index e3d7cc8..a990a24 100644 --- a/easymacro.py +++ b/easymacro.py @@ -41,12 +41,13 @@ import time import traceback import zipfile -from collections import OrderedDict -from collections.abc import MutableMapping +# ~ from collections import OrderedDict +# ~ from collections.abc import MutableMapping from functools import wraps from operator import itemgetter from pathlib import Path, PurePath from pprint import pprint +from enum import Enum, IntEnum from urllib.request import Request, urlopen from urllib.error import URLError, HTTPError from string import Template @@ -78,6 +79,7 @@ from com.sun.star.table.CellContentType import EMPTY, VALUE, TEXT, FORMULA from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK from com.sun.star.text.TextContentAnchorType import AS_CHARACTER +from com.sun.star.script import ScriptEventDescriptor from com.sun.star.lang import XEventListener from com.sun.star.awt import XActionListener from com.sun.star.awt import XMouseListener @@ -89,6 +91,18 @@ from com.sun.star.awt import XMenuListener from com.sun.star.awt import XKeyListener from com.sun.star.awt import XItemListener from com.sun.star.awt import XFocusListener +from com.sun.star.awt import XTabListener +from com.sun.star.awt.grid import XGridDataListener +from com.sun.star.awt.grid import XGridSelectionListener + + +class FontSlant(IntEnum): + NONE = 0 + OBLIQUE = 1 + ITALIC = 2 + DONTKNOW = 3 + REVERSE_OBLIQUE = 4 + REVERSE_ITALIC = 5 try: @@ -301,7 +315,6 @@ def info(data): return -@catch_exception def debug(*info): if IS_WIN: doc = get_document(FILE_NAME_DEBUG) @@ -336,18 +349,17 @@ def run_in_thread(fn): return run -def now(): - return datetime.datetime.now() +def now(only_time=False): + now = datetime.datetime.now() + if only_time: + return now.time() + return now def today(): return datetime.date.today() -def time(): - return datetime.datetime.now().time() - - def get_date(year, month, day, hour=-1, minute=-1, second=-1): if hour > -1 or minute > -1 or second > -1: h = hour @@ -600,9 +612,6 @@ class LODocument(object): def _init_values(self): self._type_doc = get_type_doc(self.obj) - # ~ if self._type_doc == 'base': - # ~ self._cc = self.obj.DatabaseDocument.getCurrentController() - # ~ else: self._cc = self.obj.getCurrentController() return @@ -723,10 +732,117 @@ class LODocument(object): return path_pdf +class FormControlBase(object): + EVENTS = { + 'action': 'actionPerformed', + 'click': 'mousePressed', + } + TYPES = { + 'actionPerformed': 'XActionListener', + 'mousePressed': 'XMouseListener', + } + + def __init__(self, obj): + self._obj = obj + self._index = -1 + self._rules = {} + + @property + def obj(self): + return self._obj + + @property + def name(self): + return self.obj.Name + + @property + def form(self): + return self.obj.getParent() + + @property + def index(self): + return self._index + @index.setter + def index(self, value): + self._index = value + + @property + def events(self): + return self.form.getScriptEvents(self.index) + + def remove_event(self, name=''): + for ev in self.events: + if name and \ + ev.EventMethod == self.EVENTS[name] and \ + ev.ListenerType == self.TYPES[ev.EventMethod]: + self.form.revokeScriptEvent(self.index, + ev.ListenerType, ev.EventMethod, ev.AddListenerParam) + break + else: + self.form.revokeScriptEvent(self.index, + ev.ListenerType, ev.EventMethod, ev.AddListenerParam) + return + + def add_event(self, name, macro): + if not 'name' in macro: + macro['name'] = '{}_{}'.format(self.name, name) + + event = ScriptEventDescriptor() + event.AddListenerParam = '' + event.EventMethod = self.EVENTS[name] + event.ListenerType = self.TYPES[event.EventMethod] + event.ScriptCode = _get_url_script(macro) + event.ScriptType = 'Script' + + for ev in self.events: + if ev.EventMethod == event.EventMethod and \ + ev.ListenerType == event.ListenerType: + self.form.revokeScriptEvent(self.index, + event.ListenerType, event.EventMethod, event.AddListenerParam) + break + + self.form.registerScriptEvent(self.index, event) + return + + +class FormButton(FormControlBase): + + def __init__(self, obj): + super().__init__(obj) + + + class LOForm(ObjectBase): def __init__(self, obj): super().__init__(obj) + self._init_controls() + + def __getitem__(self, index): + if isinstance(index, int): + return self._controls[index] + else: + return getattr(self, index) + + def _get_type_control(self, name): + types = { + # ~ 'stardiv.Toolkit.UnoFixedTextControl': 'label', + 'com.sun.star.form.OButtonModel': 'formbutton', + # ~ 'stardiv.Toolkit.UnoEditControl': 'text', + # ~ 'stardiv.Toolkit.UnoRoadmapControl': 'roadmap', + # ~ 'stardiv.Toolkit.UnoFixedHyperlinkControl': 'link', + # ~ 'stardiv.Toolkit.UnoListBoxControl': 'listbox', + } + return types[name] + + def _init_controls(self): + self._controls = [] + for i, c in enumerate(self.obj.ControlModels): + tipo = self._get_type_control(c.ImplementationName) + control = get_custom_class(tipo, c) + control.index = i + self._controls.append(control) + setattr(self, c.Name, control) @property def name(self): @@ -823,6 +939,67 @@ class LOCellStyles(object): return +class LOImage(object): + TYPES = { + 'image/png': 'png', + 'image/jpeg': 'jpg', + } + + def __init__(self, obj): + self._obj = obj + + @property + def obj(self): + return self._obj + + @property + def address(self): + return self.obj.Anchor.AbsoluteName + + @property + def name(self): + return self.obj.Name + + @property + def mimetype(self): + return self.obj.Bitmap.MimeType + + @property + def url(self): + return _path_system(self.obj.URL) + @url.setter + def url(self, value): + self.obj.URL = _path_url(value) + + @property + def path(self): + return _path_system(self.obj.GraphicURL) + @path.setter + def path(self, value): + self.obj.GraphicURL = _path_url(value) + + @property + def visible(self): + return self.obj.Visible + @visible.setter + def visible(self, value): + self_obj.Visible = value + + def save(self, path): + if is_dir(path): + p = path + n = self.name + else: + p, fn, n, e = get_info_path(path) + ext = self.TYPES[self.mimetype] + path = join(p, '{}.{}'.format(n, ext)) + size = len(self.obj.Bitmap.DIB) + data = self.obj.GraphicStream.readBytes((), size) + data = data[-1].value + save_file(path, 'wb', data) + return path + + class LOCalc(LODocument): def __init__(self, obj): @@ -1071,7 +1248,7 @@ class LOCalcSheet(object): def _init_values(self): self._events = None self._dp = self.obj.getDrawPage() - return + self._images = {i.Name: LOImage(i) for i in self._dp} @property def obj(self): @@ -1081,6 +1258,10 @@ class LOCalcSheet(object): def doc(self): return self._doc + @property + def images(self): + return self._images + @property def name(self): return self._obj.Name @@ -1257,6 +1438,42 @@ class LOWriter(LODocument): self._cc.select(text) return + def search(self, options): + descriptor = self.obj.createSearchDescriptor() + descriptor.setSearchString(options.get('Search', '')) + descriptor.SearchCaseSensitive = options.get('CaseSensitive', False) + descriptor.SearchWords = options.get('Words', False) + if 'Attributes' in options: + attr = dict_to_property(options['Attributes']) + descriptor.setSearchAttributes(attr) + if hasattr(descriptor, 'SearchRegularExpression'): + descriptor.SearchRegularExpression = options.get('RegularExpression', False) + if hasattr(descriptor, 'SearchType') and 'Type' in options: + descriptor.SearchType = options['Type'] + + if options.get('First', False): + found = self.obj.findFirst(descriptor) + else: + found = self.obj.findAll(descriptor) + + return found + + def replace(self, options): + descriptor = self.obj.createReplaceDescriptor() + descriptor.setSearchString(options['Search']) + descriptor.setReplaceString(options['Replace']) + descriptor.SearchCaseSensitive = options.get('CaseSensitive', False) + descriptor.SearchWords = options.get('Words', False) + if 'Attributes' in options: + attr = dict_to_property(options['Attributes']) + descriptor.setSearchAttributes(attr) + if hasattr(descriptor, 'SearchRegularExpression'): + descriptor.SearchRegularExpression = options.get('RegularExpression', False) + if hasattr(descriptor, 'SearchType') and 'Type' in options: + descriptor.SearchType = options['Type'] + found = self.obj.replaceAll(descriptor) + return found + class LOTextRange(object): @@ -1612,6 +1829,10 @@ class LOCellRange(object): rango.data = self.data return + def copy(self, source): + self.sheet.obj.copyRange(self.address, source.range_address) + return + def offset(self, row=1, col=0): ra = self.obj.getRangeAddress() col = ra.EndColumn + col @@ -1669,6 +1890,10 @@ class LOCellRange(object): a = self.obj.getRangeAddressesAsString() return a + @property + def range_address(self): + return self.obj.getRangeAddress() + @property def current_region(self): cursor = self.sheet.get_cursor(self.obj[0,0]) @@ -1801,6 +2026,36 @@ class LOCellRange(object): chart.cell = self return chart + def search(self, options): + descriptor = self.obj.Spreadsheet.createSearchDescriptor() + descriptor.setSearchString(options.get('Search', '')) + descriptor.SearchCaseSensitive = options.get('CaseSensitive', False) + descriptor.SearchWords = options.get('Words', False) + if hasattr(descriptor, 'SearchRegularExpression'): + descriptor.SearchRegularExpression = options.get('RegularExpression', False) + if hasattr(descriptor, 'SearchType') and 'Type' in options: + descriptor.SearchType = options['Type'] + + if options.get('First', False): + found = self.obj.findFirst(descriptor) + else: + found = self.obj.findAll(descriptor) + + return found + + def replace(self, options): + descriptor = self.obj.Spreadsheet.createReplaceDescriptor() + descriptor.setSearchString(options['Search']) + descriptor.setReplaceString(options['Replace']) + descriptor.SearchCaseSensitive = options.get('CaseSensitive', False) + descriptor.SearchWords = options.get('Words', False) + if hasattr(descriptor, 'SearchRegularExpression'): + descriptor.SearchRegularExpression = options.get('RegularExpression', False) + if hasattr(descriptor, 'SearchType') and 'Type' in options: + descriptor.SearchType = options['Type'] + found = self.obj.replaceAll(descriptor) + return found + class EventsListenerBase(unohelper.Base, XEventListener): @@ -1809,6 +2064,10 @@ class EventsListenerBase(unohelper.Base, XEventListener): self._name = name self._window = window + @property + def name(self): + return self._name + def disposing(self, event): self._controller = None if not self._window is None: @@ -1968,6 +2227,45 @@ class EventsKey(EventsListenerBase, XKeyListener): return +class EventsTab(EventsListenerBase, XTabListener): + + def __init__(self, controller, name): + super().__init__(controller, name) + + def activated(self, id): + event_name = '{}_activated'.format(self.name) + if hasattr(self._controller, event_name): + getattr(self._controller, event_name)(id) + return + + +class EventsGrid(EventsListenerBase, XGridDataListener, XGridSelectionListener): + + def __init__(self, controller, name): + super().__init__(controller, name) + + def dataChanged(self, event): + event_name = '{}_data_changed'.format(self.name) + if hasattr(self._controller, event_name): + getattr(self._controller, event_name)(event) + return + + def rowHeadingChanged(self, event): + pass + + def rowsInserted(self, event): + pass + + def rowsRemoved(self, evemt): + pass + + def selectionChanged(self, event): + event_name = '{}_selection_changed'.format(self.name) + if hasattr(self._controller, event_name): + getattr(self._controller, event_name)(event) + return + + class EventsKeyWindow(EventsListenerBase, XKeyListener): """ event.KeyChar @@ -2044,8 +2342,8 @@ class EventsWindow(EventsListenerBase, XTopWindowListener, XWindowListener): # ~ XWindowListener def windowResized(self, event): - # ~ sb = self._container.getControl('subcontainer') - # ~ sb.setPosSize(0, 0, event.Width, event.Height, SIZE) + sb = self._cls._subcont + sb.setPosSize(0, 0, event.Width, event.Height, SIZE) event_name = '{}_resized'.format(self._name) if hasattr(self._controller, event_name): getattr(self._controller, event_name)(event) @@ -2069,7 +2367,6 @@ class EventsMenu(EventsListenerBase, XMenuListener): def itemHighlighted(self, event): pass - @catch_exception def itemSelected(self, event): name = event.Source.getCommand(event.MenuId) if name.startswith('menu'): @@ -2108,6 +2405,7 @@ class UnoBaseObject(object): @property def parent(self): + ps = self.obj.getContext().PosSize return self.obj.getContext() def _get_possize(self, name): @@ -2149,7 +2447,10 @@ class UnoBaseObject(object): return self._model.Width @width.setter def width(self, value): - self._model.Width = value + if hasattr(self.obj, 'PosSize'): + self._set_possize('Width', value) + else: + self._model.Width = value @property def height(self): @@ -2159,7 +2460,10 @@ class UnoBaseObject(object): return ps.Height @height.setter def height(self, value): - self._model.Height = value + if hasattr(self.obj, 'PosSize'): + self._set_possize('Height', value) + else: + self._model.Height = value @property def tag(self): @@ -2310,7 +2614,7 @@ class UnoListBox(UnoBaseObject): @property def value(self): - return self.obj.SelectedItem + return self.obj.getSelectedItem() @property def count(self): @@ -2324,6 +2628,10 @@ class UnoListBox(UnoBaseObject): self.model.StringItemList = list(sorted(values)) return + def unselect(self): + self.obj.selectItem(self.value, False) + return + def select(self, pos=0): if isinstance(pos, str): self.obj.selectItem(pos, True) @@ -2332,7 +2640,7 @@ class UnoListBox(UnoBaseObject): return def clear(self): - self.obj.removeItems(0, self.count) + self.model.removeAllItems() return def _set_image_url(self, image): @@ -2388,16 +2696,19 @@ class UnoGrid(UnoBaseObject): # ~ def format_columns(self, value): # ~ self._format_columns = value + @property + def value(self): + return self[self.column, self.row] + @property def data(self): return self._data @data.setter def data(self, values): # ~ self._data = values - self._gdm.removeAllRows() + self.clear() headings = tuple(range(1, len(values) + 1)) self._gdm.addRows(headings, values) - # ~ rows = range(grid_dm.RowCount) # ~ colors = [COLORS['GRAY'] if r % 2 else COLORS['WHITE'] for r in rows] # ~ grid.Model.RowBackgroundColors = tuple(colors) @@ -2437,6 +2748,10 @@ class UnoGrid(UnoBaseObject): row.append(d) return tuple(row) + def clear(self): + self._gdm.removeAllRows() + return + def add_row(self, data): # ~ self._data.append(data) data = self._validate_column(data) @@ -2446,10 +2761,10 @@ class UnoGrid(UnoBaseObject): def remove_row(self, row): self._gdm.removeRow(row) # ~ del self._data[row] - self._update_row_heading() + self.update_row_heading() return - def _update_row_heading(self): + def update_row_heading(self): for i in range(self.rows): self._gdm.updateRowHeading(i, i + 1) return @@ -2457,7 +2772,7 @@ class UnoGrid(UnoBaseObject): def sort(self, column, asc=True): self._gdm.sortByColumn(column, asc) # ~ self._data.sort(key=itemgetter(column), reverse=not asc) - self._update_row_heading() + self.update_row_heading() return def set_column_image(self, column, path): @@ -2503,6 +2818,173 @@ class UnoRoadmap(UnoBaseObject): return +class UnoTree(UnoBaseObject): + + def __init__(self, obj, ): + super().__init__(obj) + self._tdm = None + self._data = [] + + @property + def selection(self): + return self.obj.Selection + + @property + def root(self): + if self._tdm is None: + return '' + return self._tdm.Root.DisplayValue + + @root.setter + def root(self, value): + self._add_data_model(value) + + def _add_data_model(self, name): + tdm = create_instance('com.sun.star.awt.tree.MutableTreeDataModel') + root = tdm.createNode(name, True) + root.DataValue = 0 + tdm.setRoot(root) + self.model.DataModel = tdm + self._tdm = self.model.DataModel + self._add_data() + return + + @property + def data(self): + return self._data + @data.setter + def data(self, values): + self._data = list(values) + self._add_data() + + def _add_data(self): + if not self.data: + return + + parents = {} + for node in self.data: + parent = parents.get(node[1], self._tdm.Root) + child = self._tdm.createNode(node[2], False) + child.DataValue = node[0] + parent.appendChild(child) + parents[node[0]] = child + self.obj.expandNode(self._tdm.Root) + return + + +class UnoTab(UnoBaseObject): + + def __init__(self, obj): + super().__init__(obj) + self._events = None + + def __getitem__(self, index): + return self.get_sheet(index) + + @property + def current(self): + return self.obj.getActiveTabID() + @property + def active(self): + return self.current + + def get_sheet(self, id): + if isinstance(id, int): + sheet = self.obj.Controls[id-1] + else: + sheet = self.obj.getControl(id.lower()) + return sheet + + @property + def sheets(self): + return self._sheets + @sheets.setter + def sheets(self, values): + i = len(self.obj.Controls) + for title in values: + i += 1 + sheet = self.model.createInstance('com.sun.star.awt.UnoPageModel') + sheet.Title = title + self.model.insertByName('sheet{}'.format(i), sheet) + return + + def insert(self, title): + id = len(self.obj.Controls) + 1 + sheet = self.model.createInstance('com.sun.star.awt.UnoPageModel') + sheet.Title = title + self.model.insertByName('sheet{}'.format(id), sheet) + return id + + def remove(self, id): + sheet = self.get_sheet(id) + for control in sheet.getControls(): + sheet.Model.removeByName(control.Model.Name) + sheet.removeControl(control) + # ~ self._model.removeByName('page_{}'.format(ID)) + + self.obj.removeTab(id) + return + + def activate(self, id): + self.obj.activateTab(id) + return + + @property + def events(self): + return self._events + @events.setter + def events(self, controllers): + self._events = controllers + + def _special_properties(self, tipo, properties): + columns = properties.pop('Columns', ()) + if tipo == 'grid': + properties['ColumnModel'] = _set_column_model(columns) + if not 'Width' in properties: + properties['Width'] = self.width + if not 'Height' in properties: + properties['Height'] = self.height + elif tipo == 'button' and 'ImageURL' in properties: + properties['ImageURL'] = self._set_image_url(properties['ImageURL']) + elif tipo == 'roadmap': + if not 'Height' in properties: + properties['Height'] = self.height + if 'Title' in properties: + properties['Text'] = properties.pop('Title') + elif tipo == 'pages': + if not 'Width' in properties: + properties['Width'] = self.width + if not 'Height' in properties: + properties['Height'] = self.height + + return properties + + def add_control(self, id, properties): + tipo = properties.pop('Type').lower() + root = properties.pop('Root', '') + sheets = properties.pop('Sheets', ()) + properties = self._special_properties(tipo, properties) + + sheet = self.get_sheet(id) + sheet_model = sheet.getModel() + model = sheet_model.createInstance(get_control_model(tipo)) + set_properties(model, properties) + name = properties['Name'] + sheet_model.insertByName(name, model) + + control = sheet.getControl(name) + add_listeners(self.events, control, name) + control = get_custom_class(tipo, control) + + if tipo == 'tree' and root: + control.root = root + elif tipo == 'pages' and sheets: + control.sheets = sheets + + setattr(self, name, control) + return + + def get_custom_class(tipo, obj): classes = { 'label': UnoLabel, @@ -2512,15 +2994,35 @@ def get_custom_class(tipo, obj): 'grid': UnoGrid, 'link': UnoLabelLink, 'roadmap': UnoRoadmap, - # ~ 'tab': UnoTab, + 'tree': UnoTree, + 'tab': UnoTab, # ~ 'image': UnoImage, # ~ 'radio': UnoRadio, # ~ 'groupbox': UnoGroupBox, - # ~ 'tree': UnoTree, + 'formbutton': FormButton, } return classes[tipo](obj) +def get_control_model(control): + services = { + 'label': 'com.sun.star.awt.UnoControlFixedTextModel', + 'link': 'com.sun.star.awt.UnoControlFixedHyperlinkModel', + 'text': 'com.sun.star.awt.UnoControlEditModel', + 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', + 'button': 'com.sun.star.awt.UnoControlButtonModel', + 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', + 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', + 'tree': 'com.sun.star.awt.tree.TreeControlModel', + 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', + 'image': 'com.sun.star.awt.UnoControlImageControlModel', + 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', + 'tab': 'com.sun.star.awt.UnoMultiPageModel', + } + return services[control] + + +@catch_exception def add_listeners(events, control, name=''): listeners = { 'addActionListener': EventsButton, @@ -2528,6 +3030,7 @@ def add_listeners(events, control, name=''): 'addItemListener': EventsItem, 'addFocusListener': EventsFocus, 'addKeyListener': EventsKey, + 'addTabListener': EventsTab, } if hasattr(control, 'obj'): control = contro.obj @@ -2549,6 +3052,11 @@ def add_listeners(events, control, name=''): continue getattr(control, key)(listeners[key](events, name)) + + if is_grid: + controllers = EventsGrid(events, name) + control.addSelectionListener(controllers) + control.Model.GridDataModel.addGridDataListener(controllers) return @@ -2989,6 +3497,29 @@ class LOChart(object): return self +def _set_column_model(columns): + #~ https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1awt_1_1grid_1_1XGridColumn.html + column_model = create_instance('com.sun.star.awt.grid.DefaultGridColumnModel', True) + for column in columns: + grid_column = create_instance('com.sun.star.awt.grid.GridColumn', True) + for k, v in column.items(): + setattr(grid_column, k, v) + column_model.addColumn(grid_column) + return column_model + + +def _set_image_url(image, id_extension=''): + if exists_path(image): + return _path_url(image) + + if not id_extension: + return '' + + path = get_path_extension(id_extension) + path = join(path, DIR['images'], image) + return _path_url(path) + + class LODialog(object): def __init__(self, **properties): @@ -3037,11 +3568,12 @@ class LODialog(object): def _get_type_control(self, name): types = { 'stardiv.Toolkit.UnoFixedTextControl': 'label', - 'stardiv.Toolkit.UnoButtonControl': 'button', - 'stardiv.Toolkit.UnoEditControl': 'text', - 'stardiv.Toolkit.UnoRoadmapControl': 'roadmap', 'stardiv.Toolkit.UnoFixedHyperlinkControl': 'link', + 'stardiv.Toolkit.UnoEditControl': 'text', + 'stardiv.Toolkit.UnoButtonControl': 'button', 'stardiv.Toolkit.UnoListBoxControl': 'listbox', + 'stardiv.Toolkit.UnoRoadmapControl': 'roadmap', + 'stardiv.Toolkit.UnoMultiPageControl': 'pages', } return types[name] @@ -3128,17 +3660,18 @@ class LODialog(object): def _get_control_model(self, control): services = { - 'button': 'com.sun.star.awt.UnoControlButtonModel', - 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', - 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', - 'image': 'com.sun.star.awt.UnoControlImageControlModel', 'label': 'com.sun.star.awt.UnoControlFixedTextModel', 'link': 'com.sun.star.awt.UnoControlFixedHyperlinkModel', - 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', - 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', - 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', 'text': 'com.sun.star.awt.UnoControlEditModel', + 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', + 'button': 'com.sun.star.awt.UnoControlButtonModel', + 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', + 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', 'tree': 'com.sun.star.awt.tree.TreeControlModel', + 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', + 'image': 'com.sun.star.awt.UnoControlImageControlModel', + 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', + 'pages': 'com.sun.star.awt.UnoMultiPageModel', } return services[control] @@ -3174,10 +3707,19 @@ class LODialog(object): properties['Height'] = self.height if 'Title' in properties: properties['Text'] = properties.pop('Title') + elif tipo == 'tab': + if not 'Width' in properties: + properties['Width'] = self.width + if not 'Height' in properties: + properties['Height'] = self.height + return properties def add_control(self, properties): tipo = properties.pop('Type').lower() + root = properties.pop('Root', '') + sheets = properties.pop('Sheets', ()) + properties = self._special_properties(tipo, properties) model = self.model.createInstance(self._get_control_model(tipo)) set_properties(model, properties) @@ -3186,6 +3728,13 @@ class LODialog(object): control = self.obj.getControl(name) add_listeners(self.events, control, name) control = get_custom_class(tipo, control) + + if tipo == 'tree' and root: + control.root = root + elif tipo == 'pages' and sheets: + control.sheets = sheets + control.events = self.events + setattr(self, name, control) return @@ -3217,13 +3766,26 @@ class LODialog(object): class LOWindow(object): + EMPTY = b""" + +""" def __init__(self, **kwargs): self._events = None self._menu = None self._container = None + self._id_extension = '' self._obj = self._create(kwargs) + @property + def id_extension(self): + return self._id_extension + @id_extension.setter + def id_extension(self, value): + global ID_EXTENSION + ID_EXTENSION = value + self._id_extension = value + def _create(self, properties): ps = ( properties.get('X', 0), @@ -3234,6 +3796,7 @@ class LOWindow(object): self._title = properties.get('Title', TITLE) self._create_frame(ps) self._create_container(ps) + self._create_subcontainer(ps) # ~ self._create_splitter(ps) return @@ -3265,6 +3828,31 @@ class LOWindow(object): self._frame.setComponent(self._container, None) return + def _create_subcontainer(self, ps): + service = 'com.sun.star.awt.ContainerWindowProvider' + cwp = create_instance(service, True) + with get_temp_file() as f: + f.write(self.EMPTY) + f.flush() + subcont = cwp.createContainerWindow( + _path_url(f.name), '', self._container.getPeer(), None) + + # ~ service = 'com.sun.star.awt.UnoControlDialog' + # ~ subcont2 = create_instance(service, True) + # ~ service = 'com.sun.star.awt.UnoControlDialogModel' + # ~ model = create_instance(service, True) + # ~ service = 'com.sun.star.awt.UnoControlContainer' + # ~ context = create_instance(service, True) + # ~ subcont2.setModel(model) + # ~ subcont2.setContext(context) + # ~ subcont2.createPeer(self._toolkit, self._container.getPeer()) + + subcont.setPosSize(0, 0, 500, 500, POSSIZE) + subcont.setVisible(True) + self._container.addControl('subcont', subcont) + self._subcont = subcont + return + def _get_base_control(self, tipo): services = { 'label': 'com.sun.star.awt.UnoControlFixedText', @@ -3278,25 +3866,51 @@ class LOWindow(object): 'radio': 'com.sun.star.awt.UnoControlRadioButton', 'tree': 'com.sun.star.awt.tree.TreeControl', 'grid': 'com.sun.star.awt.grid.UnoControlGrid', + 'tab': 'com.sun.star.awt.tab.UnoControlTabPage', } return services[tipo] + def _special_properties(self, tipo, properties): + columns = properties.pop('Columns', ()) + if tipo == 'grid': + properties['ColumnModel'] = self._set_column_model(columns) + elif tipo == 'button' and 'ImageURL' in properties: + properties['ImageURL'] = _set_image_url( + properties['ImageURL'], self.id_extension) + elif tipo == 'roadmap': + if not 'Height' in properties: + properties['Height'] = self.height + if 'Title' in properties: + properties['Text'] = properties.pop('Title') + elif tipo == 'tab': + if not 'Width' in properties: + properties['Width'] = self.width - 20 + if not 'Height' in properties: + properties['Height'] = self.height - 20 + + return properties + + @catch_exception def add_control(self, properties): tipo = properties.pop('Type').lower() - base = self._get_base_control(tipo) - obj = create_instance(base, True) - model = create_instance('{}Model'.format(base), True) + root = properties.pop('Root', '') + sheets = properties.pop('Sheets', ()) + + properties = self._special_properties(tipo, properties) + model = self._subcont.Model.createInstance(get_control_model(tipo)) set_properties(model, properties) - obj.setModel(model) - x = properties.get('X', 5) - y = properties.get('Y', 5) - w = properties.get('Width', 200) - h = properties.get('Height', 25) - obj.setPosSize(x, y, w, h, POSSIZE) name = properties['Name'] - self._container.addControl(name, obj) - add_listeners(self.events, obj, name) - control = get_custom_class(tipo, obj) + self._subcont.Model.insertByName(name, model) + control = self._subcont.getControl(name) + add_listeners(self.events, control, name) + control = get_custom_class(tipo, control) + + if tipo == 'tree' and root: + control.root = root + elif tipo == 'tab' and sheets: + control.sheets = sheets + control.events = self.events + setattr(self, name, control) return @@ -3404,7 +4018,7 @@ def get_document(title=''): return doc for d in desktop.getComponents(): - if d.Title == title: + if hasattr(d, 'Title') and d.Title == title: doc = d break @@ -3597,6 +4211,10 @@ def get_path_extension(id): return path +def get_home(): + return Path.home() + + # ~ Export ok def inputbox(message, default='', title=TITLE, echochar=''): @@ -3733,7 +4351,7 @@ def open_file(path): if IS_WIN: os.startfile(path) else: - subprocess.Popen(['xdg-open', path]) + pid = subprocess.Popen(['xdg-open', path]).pid return @@ -3791,6 +4409,7 @@ def url_open(url, options={}, json=False): req = Request(url) try: response = urlopen(req) + # ~ response.info() except HTTPError as e: error(e) except URLError as e: @@ -4421,6 +5040,24 @@ def format(template, data): return result +def _get_url_script(macro): + macro['language'] = macro.get('language', 'Python') + macro['location'] = macro.get('location', 'user') + data = macro.copy() + if data['language'] == 'Python': + data['module'] = '.py$' + elif data['language'] == 'Basic': + data['module'] = '.{}.'.format(macro['module']) + if macro['location'] == 'user': + data['location'] = 'application' + else: + data['module'] = '.' + + url = 'vnd.sun.star.script:{library}{module}{name}?language={language}&location={location}' + path = url.format(**data) + return path + + def _call_macro(macro): #~ https://wiki.openoffice.org/wiki/Documentation/DevGuide/Scripting/Scripting_Framework_URI_Specification name = 'com.sun.star.script.provider.MasterScriptProviderFactory' @@ -4441,6 +5078,7 @@ def _call_macro(macro): args = macro.get('args', ()) url = 'vnd.sun.star.script:{library}{module}{name}?language={language}&location={location}' path = url.format(**data) + script = factory.createScriptProvider('').getScript(path) return script.invoke(args, None, None)[0] @@ -4675,7 +5313,6 @@ def export_csv(path, data, **kwargs): return -@catch_exception def install_locales(path, domain='base', dir_locales=DIR['locales']): p, *_ = get_info_path(path) path_locales = join(p, dir_locales) diff --git a/files/ZAZPip_v0.2.0.oxt b/files/ZAZPip_v0.2.0.oxt index a6ab8ca9248d44136c0e37ecb197d626b46d3f23..e087f5dabf249d2f9e263b5ebd054a11654e57fe 100644 GIT binary patch delta 33400 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 delta 30888 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 -1 or minute > -1 or second > -1: h = hour @@ -600,9 +608,6 @@ class LODocument(object): def _init_values(self): self._type_doc = get_type_doc(self.obj) - # ~ if self._type_doc == 'base': - # ~ self._cc = self.obj.DatabaseDocument.getCurrentController() - # ~ else: self._cc = self.obj.getCurrentController() return @@ -723,10 +728,117 @@ class LODocument(object): return path_pdf +class FormControlBase(object): + EVENTS = { + 'action': 'actionPerformed', + 'click': 'mousePressed', + } + TYPES = { + 'actionPerformed': 'XActionListener', + 'mousePressed': 'XMouseListener', + } + + def __init__(self, obj): + self._obj = obj + self._index = -1 + self._rules = {} + + @property + def obj(self): + return self._obj + + @property + def name(self): + return self.obj.Name + + @property + def form(self): + return self.obj.getParent() + + @property + def index(self): + return self._index + @index.setter + def index(self, value): + self._index = value + + @property + def events(self): + return self.form.getScriptEvents(self.index) + + def remove_event(self, name=''): + for ev in self.events: + if name and \ + ev.EventMethod == self.EVENTS[name] and \ + ev.ListenerType == self.TYPES[ev.EventMethod]: + self.form.revokeScriptEvent(self.index, + ev.ListenerType, ev.EventMethod, ev.AddListenerParam) + break + else: + self.form.revokeScriptEvent(self.index, + ev.ListenerType, ev.EventMethod, ev.AddListenerParam) + return + + def add_event(self, name, macro): + if not 'name' in macro: + macro['name'] = '{}_{}'.format(self.name, name) + + event = ScriptEventDescriptor() + event.AddListenerParam = '' + event.EventMethod = self.EVENTS[name] + event.ListenerType = self.TYPES[event.EventMethod] + event.ScriptCode = _get_url_script(macro) + event.ScriptType = 'Script' + + for ev in self.events: + if ev.EventMethod == event.EventMethod and \ + ev.ListenerType == event.ListenerType: + self.form.revokeScriptEvent(self.index, + event.ListenerType, event.EventMethod, event.AddListenerParam) + break + + self.form.registerScriptEvent(self.index, event) + return + + +class FormButton(FormControlBase): + + def __init__(self, obj): + super().__init__(obj) + + + class LOForm(ObjectBase): def __init__(self, obj): super().__init__(obj) + self._init_controls() + + def __getitem__(self, index): + if isinstance(index, int): + return self._controls[index] + else: + return getattr(self, index) + + def _get_type_control(self, name): + types = { + # ~ 'stardiv.Toolkit.UnoFixedTextControl': 'label', + 'com.sun.star.form.OButtonModel': 'formbutton', + # ~ 'stardiv.Toolkit.UnoEditControl': 'text', + # ~ 'stardiv.Toolkit.UnoRoadmapControl': 'roadmap', + # ~ 'stardiv.Toolkit.UnoFixedHyperlinkControl': 'link', + # ~ 'stardiv.Toolkit.UnoListBoxControl': 'listbox', + } + return types[name] + + def _init_controls(self): + self._controls = [] + for i, c in enumerate(self.obj.ControlModels): + tipo = self._get_type_control(c.ImplementationName) + control = get_custom_class(tipo, c) + control.index = i + self._controls.append(control) + setattr(self, c.Name, control) @property def name(self): @@ -823,6 +935,67 @@ class LOCellStyles(object): return +class LOImage(object): + TYPES = { + 'image/png': 'png', + 'image/jpeg': 'jpg', + } + + def __init__(self, obj): + self._obj = obj + + @property + def obj(self): + return self._obj + + @property + def address(self): + return self.obj.Anchor.AbsoluteName + + @property + def name(self): + return self.obj.Name + + @property + def mimetype(self): + return self.obj.Bitmap.MimeType + + @property + def url(self): + return _path_system(self.obj.URL) + @url.setter + def url(self, value): + self.obj.URL = _path_url(value) + + @property + def path(self): + return _path_system(self.obj.GraphicURL) + @path.setter + def path(self, value): + self.obj.GraphicURL = _path_url(value) + + @property + def visible(self): + return self.obj.Visible + @visible.setter + def visible(self, value): + self_obj.Visible = value + + def save(self, path): + if is_dir(path): + p = path + n = self.name + else: + p, fn, n, e = get_info_path(path) + ext = self.TYPES[self.mimetype] + path = join(p, '{}.{}'.format(n, ext)) + size = len(self.obj.Bitmap.DIB) + data = self.obj.GraphicStream.readBytes((), size) + data = data[-1].value + save_file(path, 'wb', data) + return path + + class LOCalc(LODocument): def __init__(self, obj): @@ -1071,7 +1244,7 @@ class LOCalcSheet(object): def _init_values(self): self._events = None self._dp = self.obj.getDrawPage() - return + self._images = {i.Name: LOImage(i) for i in self._dp} @property def obj(self): @@ -1081,6 +1254,10 @@ class LOCalcSheet(object): def doc(self): return self._doc + @property + def images(self): + return self._images + @property def name(self): return self._obj.Name @@ -1257,6 +1434,42 @@ class LOWriter(LODocument): self._cc.select(text) return + def search(self, options): + descriptor = self.obj.createSearchDescriptor() + descriptor.setSearchString(options.get('Search', '')) + descriptor.SearchCaseSensitive = options.get('CaseSensitive', False) + descriptor.SearchWords = options.get('Words', False) + if 'Attributes' in options: + attr = dict_to_property(options['Attributes']) + descriptor.setSearchAttributes(attr) + if hasattr(descriptor, 'SearchRegularExpression'): + descriptor.SearchRegularExpression = options.get('RegularExpression', False) + if hasattr(descriptor, 'SearchType') and 'Type' in options: + descriptor.SearchType = options['Type'] + + if options.get('First', False): + found = self.obj.findFirst(descriptor) + else: + found = self.obj.findAll(descriptor) + + return found + + def replace(self, options): + descriptor = self.obj.createReplaceDescriptor() + descriptor.setSearchString(options['Search']) + descriptor.setReplaceString(options['Replace']) + descriptor.SearchCaseSensitive = options.get('CaseSensitive', False) + descriptor.SearchWords = options.get('Words', False) + if 'Attributes' in options: + attr = dict_to_property(options['Attributes']) + descriptor.setSearchAttributes(attr) + if hasattr(descriptor, 'SearchRegularExpression'): + descriptor.SearchRegularExpression = options.get('RegularExpression', False) + if hasattr(descriptor, 'SearchType') and 'Type' in options: + descriptor.SearchType = options['Type'] + found = self.obj.replaceAll(descriptor) + return found + class LOTextRange(object): @@ -1612,6 +1825,10 @@ class LOCellRange(object): rango.data = self.data return + def copy(self, source): + self.sheet.obj.copyRange(self.address, source.range_address) + return + def offset(self, row=1, col=0): ra = self.obj.getRangeAddress() col = ra.EndColumn + col @@ -1669,6 +1886,10 @@ class LOCellRange(object): a = self.obj.getRangeAddressesAsString() return a + @property + def range_address(self): + return self.obj.getRangeAddress() + @property def current_region(self): cursor = self.sheet.get_cursor(self.obj[0,0]) @@ -1801,6 +2022,36 @@ class LOCellRange(object): chart.cell = self return chart + def search(self, options): + descriptor = self.obj.Spreadsheet.createSearchDescriptor() + descriptor.setSearchString(options.get('Search', '')) + descriptor.SearchCaseSensitive = options.get('CaseSensitive', False) + descriptor.SearchWords = options.get('Words', False) + if hasattr(descriptor, 'SearchRegularExpression'): + descriptor.SearchRegularExpression = options.get('RegularExpression', False) + if hasattr(descriptor, 'SearchType') and 'Type' in options: + descriptor.SearchType = options['Type'] + + if options.get('First', False): + found = self.obj.findFirst(descriptor) + else: + found = self.obj.findAll(descriptor) + + return found + + def replace(self, options): + descriptor = self.obj.Spreadsheet.createReplaceDescriptor() + descriptor.setSearchString(options['Search']) + descriptor.setReplaceString(options['Replace']) + descriptor.SearchCaseSensitive = options.get('CaseSensitive', False) + descriptor.SearchWords = options.get('Words', False) + if hasattr(descriptor, 'SearchRegularExpression'): + descriptor.SearchRegularExpression = options.get('RegularExpression', False) + if hasattr(descriptor, 'SearchType') and 'Type' in options: + descriptor.SearchType = options['Type'] + found = self.obj.replaceAll(descriptor) + return found + class EventsListenerBase(unohelper.Base, XEventListener): @@ -1968,6 +2219,18 @@ class EventsKey(EventsListenerBase, XKeyListener): return +class EventsTab(EventsListenerBase, XTabListener): + + def __init__(self, controller, name): + super().__init__(controller, name) + + def activated(self, id): + event_name = '{}_activated'.format(self.name) + if hasattr(self._controller, event_name): + getattr(self._controller, event_name)(id) + return + + class EventsKeyWindow(EventsListenerBase, XKeyListener): """ event.KeyChar @@ -2069,7 +2332,6 @@ class EventsMenu(EventsListenerBase, XMenuListener): def itemHighlighted(self, event): pass - @catch_exception def itemSelected(self, event): name = event.Source.getCommand(event.MenuId) if name.startswith('menu'): @@ -2310,7 +2572,7 @@ class UnoListBox(UnoBaseObject): @property def value(self): - return self.obj.SelectedItem + return self.obj.getSelectedItem() @property def count(self): @@ -2324,6 +2586,10 @@ class UnoListBox(UnoBaseObject): self.model.StringItemList = list(sorted(values)) return + def unselect(self): + self.obj.selectItem(self.value, False) + return + def select(self, pos=0): if isinstance(pos, str): self.obj.selectItem(pos, True) @@ -2332,7 +2598,7 @@ class UnoListBox(UnoBaseObject): return def clear(self): - self.obj.removeItems(0, self.count) + self.model.removeAllItems() return def _set_image_url(self, image): @@ -2503,6 +2769,166 @@ class UnoRoadmap(UnoBaseObject): return +class UnoTree(UnoBaseObject): + + def __init__(self, obj, ): + super().__init__(obj) + self._tdm = None + self._data = [] + + @property + def selection(self): + return self.obj.Selection + + @property + def root(self): + if self._tdm is None: + return '' + return self._tdm.Root.DisplayValue + + @root.setter + def root(self, value): + self._add_data_model(value) + + def _add_data_model(self, name): + tdm = create_instance('com.sun.star.awt.tree.MutableTreeDataModel') + root = tdm.createNode(name, True) + root.DataValue = 0 + tdm.setRoot(root) + self.model.DataModel = tdm + self._tdm = self.model.DataModel + self._add_data() + return + + @property + def data(self): + return self._data + @data.setter + def data(self, values): + self._data = list(values) + self._add_data() + + def _add_data(self): + if not self.data: + return + + parents = {} + for node in self.data: + parent = parents.get(node[1], self._tdm.Root) + child = self._tdm.createNode(node[2], False) + child.DataValue = node[0] + parent.appendChild(child) + parents[node[0]] = child + self.obj.expandNode(self._tdm.Root) + return + + +class UnoPages(UnoBaseObject): + + def __init__(self, obj): + super().__init__(obj) + self._events = None + + def __getitem__(self, index): + return self.get_sheet(index) + + @property + def current(self): + return self.obj.getActiveTabID() + + def get_sheet(self, id): + if isinstance(id, int): + sheet = self.obj.Controls[id-1] + else: + sheet = self.obj.getControl(id.lower()) + return sheet + + @property + def sheets(self): + return self._sheets + @sheets.setter + def sheets(self, values): + i = len(self.obj.Controls) + for title in values: + i += 1 + sheet = self.model.createInstance('com.sun.star.awt.UnoPageModel') + sheet.Title = title + self.model.insertByName('sheet{}'.format(i), sheet) + return + + def insert(self, title): + id = len(self.obj.Controls) + 1 + sheet = self.model.createInstance('com.sun.star.awt.UnoPageModel') + sheet.Title = title + self.model.insertByName('sheet{}'.format(id), sheet) + return id + + def remove(self, id): + sheet = self.get_sheet(id) + for control in sheet.getControls(): + sheet.Model.removeByName(control.Model.Name) + sheet.removeControl(control) + # ~ self._model.removeByName('page_{}'.format(ID)) + + self.obj.removeTab(id) + return + + def activate(self, id): + self.obj.activateTab(id) + return + + @property + def events(self): + return self._events + @events.setter + def events(self, controllers): + self._events = controllers + + def _special_properties(self, tipo, properties): + columns = properties.pop('Columns', ()) + if tipo == 'grid': + properties['ColumnModel'] = self._set_column_model(columns) + elif tipo == 'button' and 'ImageURL' in properties: + properties['ImageURL'] = self._set_image_url(properties['ImageURL']) + elif tipo == 'roadmap': + if not 'Height' in properties: + properties['Height'] = self.height + if 'Title' in properties: + properties['Text'] = properties.pop('Title') + elif tipo == 'pages': + if not 'Width' in properties: + properties['Width'] = self.width + if not 'Height' in properties: + properties['Height'] = self.height + + return properties + + def add_control(self, id, properties): + tipo = properties.pop('Type').lower() + root = properties.pop('Root', '') + sheets = properties.pop('Sheets', ()) + properties = self._special_properties(tipo, properties) + + sheet = self.get_sheet(id) + sheet_model = sheet.getModel() + model = sheet_model.createInstance(get_control_model(tipo)) + set_properties(model, properties) + name = properties['Name'] + sheet_model.insertByName(name, model) + + control = sheet.getControl(name) + add_listeners(self.events, control, name) + control = get_custom_class(tipo, control) + + if tipo == 'tree' and root: + control.root = root + elif tipo == 'pages' and sheets: + control.sheets = sheets + + setattr(self, name, control) + return + + def get_custom_class(tipo, obj): classes = { 'label': UnoLabel, @@ -2512,15 +2938,34 @@ def get_custom_class(tipo, obj): 'grid': UnoGrid, 'link': UnoLabelLink, 'roadmap': UnoRoadmap, - # ~ 'tab': UnoTab, + 'tree': UnoTree, + 'pages': UnoPages, # ~ 'image': UnoImage, # ~ 'radio': UnoRadio, # ~ 'groupbox': UnoGroupBox, - # ~ 'tree': UnoTree, + 'formbutton': FormButton, } return classes[tipo](obj) +def get_control_model(control): + services = { + 'label': 'com.sun.star.awt.UnoControlFixedTextModel', + 'link': 'com.sun.star.awt.UnoControlFixedHyperlinkModel', + 'text': 'com.sun.star.awt.UnoControlEditModel', + 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', + 'button': 'com.sun.star.awt.UnoControlButtonModel', + 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', + 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', + 'tree': 'com.sun.star.awt.tree.TreeControlModel', + 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', + 'image': 'com.sun.star.awt.UnoControlImageControlModel', + 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', + 'pages': 'com.sun.star.awt.UnoMultiPageModel', + } + return services[control] + + def add_listeners(events, control, name=''): listeners = { 'addActionListener': EventsButton, @@ -2528,6 +2973,7 @@ def add_listeners(events, control, name=''): 'addItemListener': EventsItem, 'addFocusListener': EventsFocus, 'addKeyListener': EventsKey, + 'addTabListener': EventsTab, } if hasattr(control, 'obj'): control = contro.obj @@ -3037,11 +3483,12 @@ class LODialog(object): def _get_type_control(self, name): types = { 'stardiv.Toolkit.UnoFixedTextControl': 'label', - 'stardiv.Toolkit.UnoButtonControl': 'button', - 'stardiv.Toolkit.UnoEditControl': 'text', - 'stardiv.Toolkit.UnoRoadmapControl': 'roadmap', 'stardiv.Toolkit.UnoFixedHyperlinkControl': 'link', + 'stardiv.Toolkit.UnoEditControl': 'text', + 'stardiv.Toolkit.UnoButtonControl': 'button', 'stardiv.Toolkit.UnoListBoxControl': 'listbox', + 'stardiv.Toolkit.UnoRoadmapControl': 'roadmap', + 'stardiv.Toolkit.UnoMultiPageControl': 'pages', } return types[name] @@ -3128,17 +3575,18 @@ class LODialog(object): def _get_control_model(self, control): services = { - 'button': 'com.sun.star.awt.UnoControlButtonModel', - 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', - 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', - 'image': 'com.sun.star.awt.UnoControlImageControlModel', 'label': 'com.sun.star.awt.UnoControlFixedTextModel', 'link': 'com.sun.star.awt.UnoControlFixedHyperlinkModel', - 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', - 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', - 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', 'text': 'com.sun.star.awt.UnoControlEditModel', + 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', + 'button': 'com.sun.star.awt.UnoControlButtonModel', + 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', + 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', 'tree': 'com.sun.star.awt.tree.TreeControlModel', + 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', + 'image': 'com.sun.star.awt.UnoControlImageControlModel', + 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', + 'pages': 'com.sun.star.awt.UnoMultiPageModel', } return services[control] @@ -3174,10 +3622,19 @@ class LODialog(object): properties['Height'] = self.height if 'Title' in properties: properties['Text'] = properties.pop('Title') + elif tipo == 'pages': + if not 'Width' in properties: + properties['Width'] = self.width + if not 'Height' in properties: + properties['Height'] = self.height + return properties def add_control(self, properties): tipo = properties.pop('Type').lower() + root = properties.pop('Root', '') + sheets = properties.pop('Sheets', ()) + properties = self._special_properties(tipo, properties) model = self.model.createInstance(self._get_control_model(tipo)) set_properties(model, properties) @@ -3186,6 +3643,13 @@ class LODialog(object): control = self.obj.getControl(name) add_listeners(self.events, control, name) control = get_custom_class(tipo, control) + + if tipo == 'tree' and root: + control.root = root + elif tipo == 'pages' and sheets: + control.sheets = sheets + control.events = self.events + setattr(self, name, control) return @@ -3404,7 +3868,7 @@ def get_document(title=''): return doc for d in desktop.getComponents(): - if d.Title == title: + if hasattr(d, 'Title') and d.Title == title: doc = d break @@ -3597,6 +4061,10 @@ def get_path_extension(id): return path +def get_home(): + return Path.home() + + # ~ Export ok def inputbox(message, default='', title=TITLE, echochar=''): @@ -3791,6 +4259,7 @@ def url_open(url, options={}, json=False): req = Request(url) try: response = urlopen(req) + # ~ response.info() except HTTPError as e: error(e) except URLError as e: @@ -4421,6 +4890,24 @@ def format(template, data): return result +def _get_url_script(macro): + macro['language'] = macro.get('language', 'Python') + macro['location'] = macro.get('location', 'user') + data = macro.copy() + if data['language'] == 'Python': + data['module'] = '.py$' + elif data['language'] == 'Basic': + data['module'] = '.{}.'.format(macro['module']) + if macro['location'] == 'user': + data['location'] = 'application' + else: + data['module'] = '.' + + url = 'vnd.sun.star.script:{library}{module}{name}?language={language}&location={location}' + path = url.format(**data) + return path + + def _call_macro(macro): #~ https://wiki.openoffice.org/wiki/Documentation/DevGuide/Scripting/Scripting_Framework_URI_Specification name = 'com.sun.star.script.provider.MasterScriptProviderFactory' @@ -4441,6 +4928,7 @@ def _call_macro(macro): args = macro.get('args', ()) url = 'vnd.sun.star.script:{library}{module}{name}?language={language}&location={location}' path = url.format(**data) + script = factory.createScriptProvider('').getScript(path) return script.invoke(args, None, None)[0] @@ -4675,7 +5163,6 @@ def export_csv(path, data, **kwargs): return -@catch_exception def install_locales(path, domain='base', dir_locales=DIR['locales']): p, *_ = get_info_path(path) path_locales = join(p, dir_locales)