diff --git a/source/source/Addons.xcu b/source/source/Addons.xcu deleted file mode 100644 index b726cdf..0000000 --- a/source/source/Addons.xcu +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - My Extension - Mi Extensión - - - _self - - - - - Option 1 - Opción 1 - - - service:org.myextension.test?option1 - - - _self - - - com.sun.star.sheet.SpreadsheetDocument,com.sun.star.text.TextDocument - - - %origin%/images/icon - - - - - - - - - - Option 1 - Opción 1 - - - service:org.myextension.test?option1 - - - _self - - - com.sun.star.sheet.SpreadsheetDocument,com.sun.star.text.TextDocument - - - %origin%/images/icon - - - - - - diff --git a/source/source/META-INF/manifest.xml b/source/source/META-INF/manifest.xml deleted file mode 100644 index 6c00e70..0000000 --- a/source/source/META-INF/manifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/source/TestMacro.py b/source/source/TestMacro.py deleted file mode 100644 index 79cd31f..0000000 --- a/source/source/TestMacro.py +++ /dev/null @@ -1,33 +0,0 @@ -import gettext -import uno -import unohelper -from com.sun.star.task import XJobExecutor -import easymacro as app - - -ID_EXTENSION = 'org.myextension.test' -SERVICE = ('com.sun.star.task.Job',) - - -p, *_ = app.get_info_path(__file__) -path_locales = app.join(p, 'locales') -try: - lang = gettext.translation('base', path_locales, languages=[app.LANG]) - lang.install() - _ = lang.gettext -except Exception as e: - app.error(e) - - -class TestMacro(unohelper.Base, XJobExecutor): - - def __init__(self, ctx): - self.ctx = ctx - - def trigger(self, args='pyUNO'): - print('Hello World', args) - return - - -g_ImplementationHelper = unohelper.ImplementationHelper() -g_ImplementationHelper.addImplementation(TestMacro, ID_EXTENSION, SERVICE) diff --git a/source/source/description.xml b/source/source/description.xml deleted file mode 100644 index cf73104..0000000 --- a/source/source/description.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Test Macro - Macro de Prueba - - - - - - - - - - El Mau - El Mau - - - - - - - - diff --git a/source/source/description/desc_en.txt b/source/source/description/desc_en.txt deleted file mode 100644 index b667a4b..0000000 --- a/source/source/description/desc_en.txt +++ /dev/null @@ -1 +0,0 @@ -My great extension \ No newline at end of file diff --git a/source/source/description/desc_es.txt b/source/source/description/desc_es.txt deleted file mode 100644 index d8d8fdc..0000000 --- a/source/source/description/desc_es.txt +++ /dev/null @@ -1 +0,0 @@ -Mi gran extensión \ No newline at end of file diff --git a/source/source/images/icon_16.bmp b/source/source/images/icon_16.bmp deleted file mode 100644 index a954508..0000000 Binary files a/source/source/images/icon_16.bmp and /dev/null differ diff --git a/source/source/images/testmacro.png b/source/source/images/testmacro.png deleted file mode 100644 index 2f210ed..0000000 Binary files a/source/source/images/testmacro.png and /dev/null differ diff --git a/source/source/pythonpath/easymacro.py b/source/source/pythonpath/easymacro.py deleted file mode 100644 index 622248c..0000000 --- a/source/source/pythonpath/easymacro.py +++ /dev/null @@ -1,1494 +0,0 @@ -#!/usr/bin/env python3 - -# == Rapid Develop Macros in LibreOffice == - -# ~ This file is part of ZAZ. - -# ~ ZAZ is free software: you can redistribute it and/or modify -# ~ it under the terms of the GNU General Public License as published by -# ~ the Free Software Foundation, either version 3 of the License, or -# ~ (at your option) any later version. - -# ~ ZAZ is distributed in the hope that it will be useful, -# ~ but WITHOUT ANY WARRANTY; without even the implied warranty of -# ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# ~ GNU General Public License for more details. - -# ~ You should have received a copy of the GNU General Public License -# ~ along with ZAZ. If not, see . - - -import ctypes -import datetime -import errno -import getpass -import logging -import os -import platform -import shlex -import subprocess -import sys -import tempfile -import threading -import time -import zipfile - -from datetime import datetime -from functools import wraps -from pathlib import Path, PurePath -from pprint import pprint -from subprocess import PIPE - -import uno -import unohelper -from com.sun.star.beans import PropertyValue -from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS -from com.sun.star.awt.MessageBoxResults import YES -from com.sun.star.awt.PosSize import POSSIZE, SIZE -from com.sun.star.awt import Size, Point -from com.sun.star.datatransfer import XTransferable, DataFlavor -from com.sun.star.table.CellContentType import EMPTY, VALUE, TEXT, FORMULA - -from com.sun.star.text.TextContentAnchorType import AS_CHARACTER - -from com.sun.star.lang import XEventListener -from com.sun.star.awt import XActionListener -from com.sun.star.awt import XMouseListener - - -MSG_LANG = { - 'es': { - 'OK': 'Aceptar', - 'Cancel': 'Cancelar', - 'Select file': 'Seleccionar archivo', - } -} - - -FILE_NAME_DEBUG = 'zaz-debug.log' -LOG_FORMAT = '%(asctime)s - %(levelname)s - %(message)s' -LOG_DATE = '%d/%m/%Y %H:%M:%S' -LEVEL_ERROR = logging.getLevelName(logging.ERROR) -LEVEL_DEBUG = logging.getLevelName(logging.DEBUG) -LEVEL_INFO = logging.getLevelName(logging.INFO) -logging.addLevelName(logging.ERROR, f'\033[1;41m{LEVEL_ERROR}\033[1;0m') -logging.addLevelName(logging.DEBUG, f'\x1b[33m{LEVEL_DEBUG}\033[1;0m') -logging.addLevelName(logging.INFO, f'\x1b[32m{LEVEL_INFO}\033[1;0m') -logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=LOG_DATE) -log = logging.getLogger(__name__) - - -OS = platform.system() -USER = getpass.getuser() -PC = platform.node() -DESKTOP = os.environ.get('DESKTOP_SESSION', '') -INFO_DEBUG = '{}\n\n{}\n\n{}'.format(sys.version, platform.platform(), '\n'.join(sys.path)) - -IS_WIN = OS == 'Windows' -LOG_NAME = 'ZAZ' -CLIPBOARD_FORMAT_TEXT = 'text/plain;charset=utf-16' - -CALC = 'calc' -WRITER = 'writer' -OBJ_CELL = 'ScCellObj' -OBJ_RANGE = 'ScCellRangeObj' -OBJ_RANGES = 'ScCellRangesObj' -OBJ_TYPE_RANGES = (OBJ_CELL, OBJ_RANGE, OBJ_RANGES) - - -CTX = uno.getComponentContext() -SM = CTX.getServiceManager() - - -def create_instance(name, with_context=False): - if with_context: - instance = SM.createInstanceWithContext(name, CTX) - else: - instance = SM.createInstance(name) - return instance - - -def _get_config(key, node_name): - name = 'com.sun.star.configuration.ConfigurationProvider' - service = 'com.sun.star.configuration.ConfigurationAccess' - cp = create_instance(name, True) - node = PropertyValue(Name='nodepath', Value=node_name) - try: - ca = cp.createInstanceWithArguments(service, (node,)) - if ca and (ca.hasByName(key)): - data = ca.getPropertyValue(key) - return data - except Exception as e: - log.error(e) - return '' - - -LANGUAGE = _get_config('ooLocale', 'org.openoffice.Setup/L10N/') -LANG = LANGUAGE.split('-')[0] -NAME = TITLE = _get_config('ooName', 'org.openoffice.Setup/Product') -VERSION = _get_config('ooSetupVersion', 'org.openoffice.Setup/Product') - - -def mri(obj): - m = create_instance('mytools.Mri') - if m is None: - msg = 'Extension MRI not found' - error(msg) - return - - m.inspect(obj) - return - - -def catch_exception(f): - @wraps(f) - def func(*args, **kwargs): - try: - return f(*args, **kwargs) - except Exception as e: - log.error(f.__name__, exc_info=True) - return func - - -class LogWin(object): - - def __init__(self, doc): - self.doc = doc - - def write(self, info): - text = self.doc.Text - cursor = text.createTextCursor() - cursor.gotoEnd(False) - text.insertString(cursor, str(info), 0) - return - - -def info(data): - log.info(data) - return - - -def debug(info): - if IS_WIN: - # ~ app = LOApp(self.ctx, self.sm, self.desktop, self.toolkit) - # ~ doc = app.getDoc(FILE_NAME_DEBUG) - # ~ if not doc: - # ~ doc = app.newDoc(WRITER) - # ~ out = OutputDoc(doc) - # ~ sys.stdout = out - pprint(info) - return - - log.debug(info) - return - - -def error(info): - log.error(info) - return - - -def save_log(path, data): - with open(path, 'a') as out: - out.write('{} -{}- '.format(str(datetime.now())[:19], LOG_NAME)) - pprint(data, stream=out) - return - - -def run_in_thread(fn): - def run(*k, **kw): - t = threading.Thread(target=fn, args=k, kwargs=kw) - t.start() - return t - return run - - -def _(msg): - L = LANGUAGE.split('-')[0] - if L == 'en': - return msg - - if not L in MSG_LANG: - return msg - - return MSG_LANG[L][msg] - - -def msgbox(message, title=TITLE, buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox'): - """ Create message box - type_msg: infobox, warningbox, errorbox, querybox, messbox - http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1awt_1_1XMessageBoxFactory.html - """ - toolkit = create_instance('com.sun.star.awt.Toolkit') - parent = toolkit.getDesktopWindow() - mb = toolkit.createMessageBox(parent, type_msg, buttons, title, str(message)) - return mb.execute() - - -def question(message, title=TITLE): - res = msgbox(message, title, MSG_BUTTONS.BUTTONS_YES_NO, 'querybox') - return res == YES - - -def warning(message, title=TITLE): - return msgbox(message, title, type_msg='warningbox') - - -def errorbox(message, title=TITLE): - return msgbox(message, title, type_msg='errorbox') - - -def get_desktop(): - return create_instance('com.sun.star.frame.Desktop', True) - - -def get_dispatch(): - return create_instance('com.sun.star.frame.DispatchHelper') - - -def get_temp_file(): - return tempfile.NamedTemporaryFile() - - -def _path_url(path): - if path.startswith('file://'): - return path - return uno.systemPathToFileUrl(path) - - -def _path_system(path): - if path.startswith('file://'): - return os.path.abspath(uno.fileUrlToSystemPath(path)) - return path - - -def exists_app(name): - try: - dn = subprocess.DEVNULL - subprocess.Popen([name, ''], stdout=dn, stderr=dn).terminate() - except OSError as e: - if e.errno == errno.ENOENT: - return False - return True - - -def exists(path): - return Path(path).exists() - - -def get_type_doc(obj): - services = { - 'calc': 'com.sun.star.sheet.SpreadsheetDocument', - 'writer': 'com.sun.star.text.TextDocument', - 'impress': 'com.sun.star.presentation.PresentationDocument', - 'draw': 'com.sun.star.drawing.DrawingDocument', - 'base': 'com.sun.star.sdb.OfficeDatabaseDocument', - 'math': 'com.sun.star.formula.FormulaProperties', - 'basic': 'com.sun.star.script.BasicIDE', - } - for k, v in services.items(): - if obj.supportsService(v): - return k - return '' - - -def _properties(values): - p = [PropertyValue(Name=n, Value=v) for n, v in values.items()] - return tuple(p) - - -# ~ Custom classes - - -class LODocument(object): - - def __init__(self, obj): - self._obj = obj - self._init_values() - - def _init_values(self): - self._type_doc = get_type_doc(self.obj) - self._cc = self.obj.getCurrentController() - return - - @property - def obj(self): - return self._obj - - @property - def type(self): - return self._type_doc - - @property - def title(self): - return self.obj.getTitle() - - @property - def frame(self): - return self._cc.getFrame() - - @property - def is_saved(self): - return self.obj.hasLocation() - - @property - def is_modified(self): - return self.obj.isModified() - - @property - def is_read_only(self): - return self.obj.isReadOnly() - - @property - def path(self): - return _path_system(self.obj.getURL()) - - @property - def visible(self): - w = self._cc.getFrame().getContainerWindow() - return w.Visible - @visible.setter - def visible(self, value): - w = self._cc.getFrame().getContainerWindow() - w.setVisible(value) - - @property - def zoom(self): - return self._cc.ZoomValue - @zoom.setter - def zoom(self, value): - self._cc.ZoomValue = value - - def create_instance(self, name): - obj = self.obj.createInstance(name) - return obj - - def save(self, path='', **kwargs): - opt = _properties(kwargs) - if path: - self._obj.storeAsURL(_path_url(path), opt) - else: - self._obj.store() - return True - - def close(self): - self.obj.close(True) - return - - def focus(self): - w = self._cc.getFrame().getComponentWindow() - w.setFocus() - return - - def paste(self): - sc = create_instance('com.sun.star.datatransfer.clipboard.SystemClipboard') - transferable = sc.getContents() - self._cc.insertTransferable(transferable) - return self.obj.getCurrentSelection() - - -class LOCalc(LODocument): - - def __init__(self, obj): - super().__init__(obj) - - @property - def obj(self): - return self._obj - - @property - def active(self): - return LOCalcSheet(self._cc.getActiveSheet(), self) - - @property - def selection(self): - sel = self.obj.getCurrentSelection() - if sel.ImplementationName in OBJ_TYPE_RANGES: - sel = LOCellRange(sel, self) - return sel - - def get_cell(self, index=None): - """ - index is str 'A1' - index is tuple (row, col) - """ - if index is None: - cell = self.selection.first - else: - cell = LOCellRange(self.active[index].obj, self) - return cell - - def select(self, rango): - r = rango - if hasattr(rango, 'obj'): - r = rango.obj - elif isinstance(rango, str): - r = self.get_cell(rango).obj - self._cc.select(r) - return - - -class LOCalcSheet(object): - - def __init__(self, obj, doc): - self._obj = obj - self._doc = doc - self._init_values() - - def __getitem__(self, index): - return LOCellRange(self.obj[index], self.doc) - - def _init_values(self): - return - - @property - def obj(self): - return self._obj - - @property - def doc(self): - return self._doc - - -class LOWriter(LODocument): - - def __init__(self, obj): - super().__init__(obj) - - @property - def obj(self): - return self._obj - - @property - def string(self): - return self._obj.getText().String - - @property - def text(self): - return self._obj.getText() - - @property - def cursor(self): - return self.text.createTextCursor() - - @property - def selection(self): - sel = self._cc.getSelection() - return LOTextRange(sel[0]) - - def insert_content(self, cursor, data, replace=False): - self.text.insertTextContent(cursor, data, replace) - return - - # ~ tt = doc.createInstance('com.sun.star.text.TextTable') - # ~ tt.initialize(5, 2) - - # ~ f = doc.createInstance('com.sun.star.text.TextFrame') - # ~ f.setSize(Size(10000, 500)) - - def insert_image(self, path, **kwargs): - cursor = kwargs.get('cursor', self.selection.cursor.getEnd()) - w = kwargs.get('width', 1000) - h = kwargs.get('Height', 1000) - image = self.create_instance('com.sun.star.text.GraphicObject') - image.GraphicURL = _path_url(path) - image.AnchorType = AS_CHARACTER - image.Width = w - image.Height = h - self.insert_content(cursor, image) - return - - -class LOTextRange(object): - - def __init__(self, obj): - self._obj = obj - - @property - def obj(self): - return self._obj - - @property - def string(self): - return self.obj.String - - @property - def text(self): - return self.obj.getText() - - @property - def cursor(self): - return self.text.createTextCursorByRange(self.obj) - - -class LOBase(LODocument): - - def __init__(self, obj): - super().__init__(obj) - - -class LODrawImpress(LODocument): - - def __init__(self, obj): - super().__init__(obj) - - @property - def draw_page(self): - return self._cc.getCurrentPage() - - @catch_exception - def insert_image(self, path, **kwargs): - w = kwargs.get('width', 3000) - h = kwargs.get('Height', 1000) - x = kwargs.get('X', 1000) - y = kwargs.get('Y', 1000) - - image = self.create_instance('com.sun.star.drawing.GraphicObjectShape') - image.GraphicURL = _path_url(path) - image.Size = Size(w, h) - image.Position = Point(x, y) - self.draw_page.add(image) - return - - -class LOImpress(LODrawImpress): - - def __init__(self, obj): - super().__init__(obj) - - -class LODraw(LODrawImpress): - - def __init__(self, obj): - super().__init__(obj) - - -class LOMath(LODocument): - - def __init__(self, obj): - super().__init__(obj) - - -class LOBasicIde(LODocument): - - def __init__(self, obj): - super().__init__(obj) - - @property - def selection(self): - sel = self._cc.getSelection() - return sel - - -class LOCellRange(object): - - def __init__(self, obj, doc): - self._obj = obj - self._doc = doc - self._init_values() - - def __enter__(self): - return self - - def __exit__(self, *args): - pass - - def __getitem__(self, index): - return LOCellRange(self.obj[index], self.doc) - - def _init_values(self): - self._type_obj = self.obj.ImplementationName - self._type_content = EMPTY - - if self._type_obj == OBJ_CELL: - self._type_content = self.obj.getType() - return - - @property - def obj(self): - return self._obj - - @property - def doc(self): - return self._doc - - @property - def type(self): - return self._type_obj - - @property - def type_content(self): - return self._type_content - - @property - def first(self): - if self.type == OBJ_RANGES: - obj = LOCellRange(self.obj[0][0,0], self.doc) - else: - obj = LOCellRange(self.obj[0,0], self.doc) - return obj - - @property - def value(self): - v = None - if self._type_content == VALUE: - v = self.obj.getValue() - elif self._type_content == TEXT: - v = self.obj.getString() - elif self._type_content == FORMULA: - v = self.obj.getFormula() - return v - @value.setter - def value(self, data): - if isinstance(data, str): - if data.startswith('='): - self.obj.setFormula(data) - else: - self.obj.setString(data) - elif isinstance(data, (int, float)): - self.obj.setValue(data) - - @property - def data(self): - return self.obj.getDataArray() - @data.setter - def data(self, values): - if isinstance(values, list): - values = tuple(values) - self.obj.setDataArray(values) - - def offset(self, col=1, row=0): - a = self.address - col = a.Column + col - row = a.Row + row - return LOCellRange(self.sheet[row,col], self.doc) - - @property - def sheet(self): - return self.obj.Spreadsheet - - @property - def draw_page(self): - return self.sheet.getDrawPage() - - @property - def name(self): - return self.obj.AbsoluteName - - @property - def address(self): - if self._type_obj == OBJ_CELL: - a = self.obj.getCellAddress() - elif self._type_obj == OBJ_RANGE: - a = self.obj.getRangeAddress() - else: - a = self.obj.getRangeAddressesAsString() - return a - - @property - def current_region(self): - cursor = self.sheet.createCursorByRange(self.obj[0,0]) - cursor.collapseToCurrentRegion() - return LOCellRange(self.sheet[cursor.AbsoluteName], self.doc) - - def insert_image(self, path, **kwargs): - s = self.obj.Size - w = kwargs.get('width', s.Width) - h = kwargs.get('Height', s.Height) - img = self.doc.create_instance('com.sun.star.drawing.GraphicObjectShape') - img.GraphicURL = _path_url(path) - self.draw_page.add(img) - img.Anchor = self.obj - img.setSize(Size(w, h)) - return - - def select(self): - self.doc._cc.select(self.obj) - return - - -class EventsListenerBase(unohelper.Base, XEventListener): - - def __init__(self, controller, window=None): - self._controller = controller - self._window = window - - def disposing(self, event): - self._controller = None - if not self._window is None: - self._window.setMenuBar(None) - - -class EventsButton(EventsListenerBase, XActionListener): - - def __init__(self, controller): - super().__init__(controller) - - def actionPerformed(self, event): - name = event.Source.Model.Name - event_name = '{}_action'.format(name) - if hasattr(self._controller, event_name): - getattr(self._controller, event_name)(event) - return - - -class EventsMouse(EventsListenerBase, XMouseListener): - - def __init__(self, controller): - super().__init__(controller) - - def mousePressed(self, event): - name = event.Source.Model.Name - event_name = '{}_click'.format(name) - if event.ClickCount == 2: - event_name = '{}_double_click'.format(name) - if hasattr(self._controller, event_name): - getattr(self._controller, event_name)(event) - return - - def mouseReleased(self, event): - pass - - def mouseEntered(self, event): - pass - - def mouseExited(self, event): - pass - - -class UnoBaseObject(object): - - def __init__(self, obj): - self._obj = obj - self._model = self.obj.Model - self._rules = {} - - @property - def obj(self): - return self._obj - - @property - def model(self): - return self._model - - @property - def name(self): - return self.model.Name - - @property - def parent(self): - return self.obj.getContext() - - @property - def x(self): - return self.model.PositionX - @x.setter - def x(self, value): - self.model.PositionX = value - - @property - def y(self): - return self.model.PositionY - @y.setter - def y(self, value): - self.model.PositionY = value - - @property - def width(self): - return self._model.Width - @width.setter - def width(self, value): - self._model.Width = value - - @property - def height(self): - return self._model.Height - @height.setter - def height(self, value): - self._model.Height = value - - @property - def tag(self): - return self.model.Tag - @tag.setter - def tag(self, value): - self.model.Tag = value - - @property - def step(self): - return self.model.Step - @step.setter - def step(self, value): - self.model.Step = value - - @property - def rules(self): - return self._rules - @rules.setter - def rules(self, value): - self._rules = value - - def set_focus(self): - self.obj.setFocus() - return - - def center(self, horizontal=True, vertical=False): - p = self.parent.Model - w = p.Width - h = p.Height - if horizontal: - x = w / 2 - self.width / 2 - self.x = x - if vertical: - y = h / 2 - self.height / 2 - self.y = y - return - - def move(self, origin, x=0, y=5): - w = 0 - h = 0 - if x: - w = origin.width - if y: - h = origin.height - x = origin.x + x + w - y = origin.y + y + h - self.x = x - self.y = y - return - - -class UnoLabel(UnoBaseObject): - - def __init__(self, obj): - super().__init__(obj) - - @property - def value(self): - return self.model.Label - @value.setter - def value(self, value): - self.model.Label = value - - -class UnoButton(UnoBaseObject): - - def __init__(self, obj): - super().__init__(obj) - # ~ self._set_icon() - - def _set_icon(self): - icon_name = self.tag.strip() - if icon_name: - path_icon = _file_url('{}/img/{}'.format(CURRENT_PATH, icon_name)) - self._model.ImageURL = path_icon - if self.value: - self._model.ImageAlign = 0 - return - - @property - def value(self): - return self.model.Label - @value.setter - def value(self, value): - self.model.Label = value - - -class UnoText(UnoBaseObject): - - def __init__(self, obj): - super().__init__(obj) - - @property - def value(self): - return self.model.Text - @value.setter - def value(self, value): - self.model.Text = value - - def validate(self): - - return - - -class UnoListBox(UnoBaseObject): - - def __init__(self, obj): - super().__init__(obj) - self._data = [] - - @property - def value(self): - return self.obj.SelectedItem - - @property - def data(self): - return self._data - @data.setter - def data(self, values): - self._data = list(sorted(values)) - self.model.StringItemList = self.data - return - - -class LODialog(object): - - def __init__(self, properties): - self._obj = self._create(properties) - self._init_values() - - def _init_values(self): - self._model = self._obj.Model - self._init_controls() - self._events = None - # ~ self._response = None - return - - def _create(self, properties): - path = properties.pop('Path', '') - if path: - dp = create_instance('com.sun.star.awt.DialogProvider2', True) - return dp.createDialog(_path_url(path)) - - if 'Library' in properties: - location = properties['Location'] - if location == 'user': - location = 'application' - dp = create_instance('com.sun.star.awt.DialogProvider2', True) - path = 'vnd.sun.star.script:{}.{}?location={}'.format( - properties['Library'], properties['Name'], location) - return dp.createDialog(path) - - dlg = create_instance('com.sun.star.awt.UnoControlDialog', True) - model = create_instance('com.sun.star.awt.UnoControlDialogModel', True) - toolkit = create_instance('com.sun.star.awt.Toolkit', True) - set_properties(model, properties) - dlg.setModel(model) - dlg.setVisible(False) - dlg.createPeer(toolkit, None) - - return dlg - - def _init_controls(self): - - return - - @property - def obj(self): - return self._obj - - @property - def model(self): - return self._model - - @property - def events(self): - return self._events - @events.setter - def events(self, controllers): - self._events = controllers - self._connect_listeners() - - def _connect_listeners(self): - - return - - def _add_listeners(self, control): - if self.events is None: - return - - listeners = { - 'addActionListener': EventsButton, - 'addMouseListener': EventsMouse, - } - for key, value in listeners.items(): - if hasattr(control.obj, key): - getattr(control.obj, key)(listeners[key](self.events)) - return - - def open(self): - return self.obj.execute() - - def close(self, value=0): - return self.obj.endDialog(value) - - def _get_control_model(self, control): - services = { - 'label': 'com.sun.star.awt.UnoControlFixedTextModel', - 'button': 'com.sun.star.awt.UnoControlButtonModel', - 'text': 'com.sun.star.awt.UnoControlEditModel', - 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', - 'link': 'com.sun.star.awt.UnoControlFixedHyperlinkModel', - 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', - 'image': 'com.sun.star.awt.UnoControlImageControlModel', - 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', - 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', - 'tree': 'com.sun.star.awt.tree.TreeControlModel', - 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', - } - return services[control] - - def _get_custom_class(self, tipo, obj): - classes = { - 'label': UnoLabel, - 'button': UnoButton, - 'text': UnoText, - 'listbox': UnoListBox, - # ~ 'link': UnoLink, - # ~ 'tab': UnoTab, - # ~ 'roadmap': UnoRoadmap, - # ~ 'image': UnoImage, - # ~ 'radio': UnoRadio, - # ~ 'groupbox': UnoGroupBox, - # ~ 'tree': UnoTree, - # ~ 'grid': UnoGrid, - } - return classes[tipo](obj) - - @catch_exception - def add_control(self, properties): - tipo = properties.pop('Type').lower() - model = self.model.createInstance(self._get_control_model(tipo)) - set_properties(model, properties) - name = properties['Name'] - self.model.insertByName(name, model) - control = self._get_custom_class(tipo, self.obj.getControl(name)) - self._add_listeners(control) - setattr(self, name, control) - return - - -# ~ Python >= 3.7 -# ~ def __getattr__(name): - - -def _get_class_doc(obj): - classes = { - 'calc': LOCalc, - 'writer': LOWriter, - 'base': LOBase, - 'impress': LOImpress, - 'draw': LODraw, - 'math': LOMath, - 'basic': LOBasicIde, - } - type_doc = get_type_doc(obj) - return classes[type_doc](obj) - - -def get_document(): - doc = None - desktop = get_desktop() - try: - doc = _get_class_doc(desktop.getCurrentComponent()) - except Exception as e: - log.error(e) - return doc - - -def get_selection(): - return get_document().selection - - -def get_cell(*args): - if args: - index = args - if len(index) == 1: - index = args[0] - cell = get_document().get_cell(index) - else: - cell = get_selection().first - return cell - - -def active_cell(): - return get_cell() - - -def create_dialog(properties): - return LODialog(properties) - - -def set_properties(model, properties): - if 'X' in properties: - properties['PositionX'] = properties.pop('X') - if 'Y' in properties: - properties['PositionY'] = properties.pop('Y') - keys = tuple(properties.keys()) - values = tuple(properties.values()) - model.setPropertyValues(keys, values) - return - - -def get_file(filters=(), multiple=False): - file_picker = create_instance('com.sun.star.ui.dialogs.FilePicker') - file_picker.setTitle(_('Select file')) - file_picker.setMultiSelectionMode(multiple) - - if filters: - file_picker.setCurrentFilter(filters[0][0]) - for f in filters: - file_picker.appendFilter(f[0], f[1]) - - if file_picker.execute(): - if multiple: - return [_path_system(f) for f in file_picker.getSelectedFiles()] - return _path_system(file_picker.getSelectedFiles()[0]) - - return '' - - -def get_info_path(path): - path, filename = os.path.split(path) - name, extension = os.path.splitext(filename) - return (path, filename, name, extension) - - -def inputbox(message, default='', title=TITLE): - - class ControllersInput(object): - - def __init__(self, dlg): - self.d = dlg - - def cmd_ok_action(self, event): - self.d.close(1) - return - - args = { - 'Title': title, - 'Width': 200, - 'Height': 80, - } - dlg = LODialog(args) - dlg.events = ControllersInput(dlg) - - args = { - 'Type': 'Label', - 'Name': 'lbl_msg', - 'Label': message, - 'Width': 140, - 'Height': 50, - 'X': 5, - 'Y': 5, - 'MultiLine': True, - 'Border': 1, - } - dlg.add_control(args) - - args = { - 'Type': 'Text', - 'Name': 'txt_value', - 'Text': default, - 'Width': 190, - 'Height': 15, - } - dlg.add_control(args) - dlg.txt_value.move(dlg.lbl_msg) - - args = { - 'Type': 'button', - 'Name': 'cmd_ok', - 'Label': _('OK'), - 'Width': 40, - 'Height': 15, - 'DefaultButton': True, - 'PushButtonType': 1, - } - dlg.add_control(args) - dlg.cmd_ok.move(dlg.lbl_msg, 10, 0) - - args = { - 'Type': 'button', - 'Name': 'cmd_cancel', - 'Label': _('Cancel'), - 'Width': 40, - 'Height': 15, - 'PushButtonType': 2, - } - dlg.add_control(args) - dlg.cmd_cancel.move(dlg.cmd_ok) - - if dlg.open(): - return dlg.txt_value.value - - return '' - - -def new_doc(type_doc=CALC): - path = 'private:factory/s{}'.format(type_doc) - doc = get_desktop().loadComponentFromURL(path, '_default', 0, ()) - return _get_class_doc(doc) - - -def open_doc(path, **kwargs): - """ Open document in path - Usually options: - Hidden: True or False - AsTemplate: True or False - ReadOnly: True or False - Password: super_secret - MacroExecutionMode: 4 = Activate macros - Preview: True or False - - http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1frame_1_1XComponentLoader.html - http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1document_1_1MediaDescriptor.html - """ - path = _path_url(path) - opt = _properties(kwargs) - doc = get_desktop().loadComponentFromURL(path, '_blank', 0, opt) - if doc is None: - return - - return _get_class_doc(doc) - - -def open_file(path): - if IS_WIN: - os.startfile(path) - else: - subprocess.Popen(['xdg-open', path]) - return - - -def join(*paths): - return os.path.join(*paths) - - -def is_dir(path): - return Path(path).is_dir() - - -def is_file(path): - return Path(path).is_file() - - -def get_file_size(path): - return Path(path).stat().st_size - - -def is_created(path): - return is_file(path) and bool(get_file_size(path)) - - -def replace_ext(path, ext): - path, _, name, _ = get_info_path(path) - return '{}/{}.{}'.format(path, name, ext) - - -def zip_names(path): - with zipfile.ZipFile(path) as z: - names = z.namelist() - return names - - -def run(command, wait=False): - # ~ debug(command) - # ~ debug(shlex.split(command)) - try: - if wait: - # ~ p = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE) - # ~ p.wait() - result = subprocess.check_output(command, shell=True) - else: - p = subprocess.Popen(shlex.split(command), stdin=None, - stdout=None, stderr=None, close_fds=True) - result, er = p.communicate() - except subprocess.CalledProcessError as e: - msg = ("run [ERROR]: output = %s, error code = %s\n" - % (e.output, e.returncode)) - error(msg) - return False - - if result is None: - return True - - return result.decode() - - -def _zippwd(source, target, pwd): - if IS_WIN: - return False - if not exists_app('zip'): - return False - - cmd = 'zip' - opt = '-j ' - args = "{} --password {} ".format(cmd, pwd) - - if isinstance(source, (tuple, list)): - if not target: - return False - args += opt + target + ' ' + ' '.join(source) - else: - if is_file(source) and not target: - target = replace_ext(source, 'zip') - elif is_dir(source) and not target: - target = join(PurePath(source).parent, - '{}.zip'.format(PurePath(source).name)) - opt = '-r ' - args += opt + target + ' ' + source - - result = run(args, True) - if not result: - return False - - return is_created(target) - - -def zip(source, target='', mode='w', pwd=''): - if pwd: - return _zippwd(source, target, pwd) - - if isinstance(source, (tuple, list)): - if not target: - return False - - with zipfile.ZipFile(target, mode, compression=zipfile.ZIP_DEFLATED) as z: - for path in source: - _, name, _, _ = get_info_path(path) - z.write(path, name) - - return is_created(target) - - if is_file(source): - if not target: - target = replace_ext(source, 'zip') - z = zipfile.ZipFile(target, mode, compression=zipfile.ZIP_DEFLATED) - _, name, _, _ = get_info_path(source) - z.write(source, name) - z.close() - return is_created(target) - - if not target: - target = join( - PurePath(source).parent, - '{}.zip'.format(PurePath(source).name)) - z = zipfile.ZipFile(target, mode, compression=zipfile.ZIP_DEFLATED) - root_len = len(os.path.abspath(source)) - for root, dirs, files in os.walk(source): - relative = os.path.abspath(root)[root_len:] - for f in files: - fullpath = join(root, f) - file_name = join(relative, f) - z.write(fullpath, file_name) - z.close() - - return is_created(target) - - -def unzip(source, path='', members=None, pwd=None): - if not path: - path, _, _, _ = get_info_path(source) - with zipfile.ZipFile(source) as z: - if not pwd is None: - pwd = pwd.encode() - if isinstance(members, str): - members = (members,) - z.extractall(path, members=members, pwd=pwd) - return True - - -def merge_zip(target, zips): - try: - with zipfile.ZipFile(target, 'w', compression=zipfile.ZIP_DEFLATED) as t: - for path in zips: - with zipfile.ZipFile(path, compression=zipfile.ZIP_DEFLATED) as s: - for name in s.namelist(): - t.writestr(name, s.open(name).read()) - except Exception as e: - error(e) - return False - - return True - - -def kill(path): - p = Path(path) - if p.is_file(): - try: - p.unlink() - except: - pass - elif p.is_dir(): - p.rmdir() - return - - -def get_size_screen(): - if IS_WIN: - user32 = ctypes.windll.user32 - res = '{}x{}'.format(user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)) - else: - args = 'xrandr | grep "*" | cut -d " " -f4' - res = run(args, True) - return res.strip() - - -def get_clipboard(): - df = None - text = '' - sc = create_instance('com.sun.star.datatransfer.clipboard.SystemClipboard') - transferable = sc.getContents() - data = transferable.getTransferDataFlavors() - for df in data: - if df.MimeType == CLIPBOARD_FORMAT_TEXT: - break - if df: - text = transferable.getTransferData(df) - return text - - -class TextTransferable(unohelper.Base, XTransferable): - """Keep clipboard data and provide them.""" - - def __init__(self, text): - df = DataFlavor() - df.MimeType = CLIPBOARD_FORMAT_TEXT - df.HumanPresentableName = "encoded text utf-16" - self.flavors = [df] - self.data = [text] - - def getTransferData(self, flavor): - if not flavor: - return - for i, f in enumerate(self.flavors): - if flavor.MimeType == f.MimeType: - return self.data[i] - return - - def getTransferDataFlavors(self): - return tuple(self.flavors) - - def isDataFlavorSupported(self, flavor): - if not flavor: - return False - mtype = flavor.MimeType - for f in self.flavors: - if mtype == f.MimeType: - return True - return False - - -def set_clipboard(text): - ts = TextTransferable(text) - sc = create_instance('com.sun.star.datatransfer.clipboard.SystemClipboard') - sc.setContents(ts, None) - return - - -def copy(doc=None): - if doc is None: - doc = get_document() - if hasattr(doc, 'frame'): - frame = doc.frame - else: - frame = doc.getCurrentController().getFrame() - dispatch = get_dispatch() - dispatch.executeDispatch(frame, '.uno:Copy', '', 0, ()) - return - - -def get_epoch(): - now = datetime.datetime.now() - return int(time.mktime(now.timetuple())) diff --git a/source/source/registration/license_en.txt b/source/source/registration/license_en.txt deleted file mode 100644 index 3e7ef0e..0000000 --- a/source/source/registration/license_en.txt +++ /dev/null @@ -1,14 +0,0 @@ -This file is part of TestMacro. - - TestMacro is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - TestMacro is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with TestMacro. If not, see . diff --git a/source/source/registration/license_es.txt b/source/source/registration/license_es.txt deleted file mode 100644 index 3e7ef0e..0000000 --- a/source/source/registration/license_es.txt +++ /dev/null @@ -1,14 +0,0 @@ -This file is part of TestMacro. - - TestMacro is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - TestMacro is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with TestMacro. If not, see .