easymacro/source/easymacro/easydocs.py

130 lines
4.2 KiB
Python

#!/usr/bin/env python3
from .easymain import log, create_instance, dict_to_property
from .easycalc import LOCalc
class LODocuments():
"""Classe for documents
"""
TYPES = {
'calc': 'com.sun.star.sheet.SpreadsheetDocument',
'writerr': 'com.sun.star.text.TextDocument',
'draw': 'com.sun.star.drawing.DrawingDocument',
'impress': 'com.sun.star.presentation.PresentationDocument',
'math': 'com.sun.star.formula.FormulaProperties',
'ide': 'com.sun.star.script.BasicIDE',
'base': 'com.sun.star.sdb.OfficeDatabaseDocument',
'main': 'com.sun.star.frame.StartModule',
}
_classes = {
'com.sun.star.sheet.SpreadsheetDocument': LOCalc,
# ~ 'com.sun.star.text.TextDocument': LODocWriter,
# ~ 'com.sun.star.drawing.DrawingDocument': LODocDraw,
# ~ 'com.sun.star.presentation.PresentationDocument': LODocImpress,
# ~ 'com.sun.star.formula.FormulaProperties': LODocMath,
# ~ 'com.sun.star.script.BasicIDE': LODocIDE,
# ~ 'com.sun.star.sdb.OfficeDatabaseDocument': LODocBase,
# ~ 'com.sun.star.frame.StartModule': LODocMain
}
# ~ BASE: 'com.sun.star.sdb.DocumentDataSource',
def __init__(self):
self._desktop = create_instance('com.sun.star.frame.Desktop', True)
def __len__(self):
# ~ len(self._desktop.Components)
for i, _ in enumerate(self._desktop.Components):
pass
return i + 1
def __getitem__(self, index):
# ~ self._desktop.Components[index]
obj = None
for i, doc in enumerate(self._desktop.Components):
if isinstance(index, int) and i == index:
obj = self._get_class_doc(doc)
break
elif isinstance(index, str) and doc.Title == index:
obj = self._get_class_doc(doc)
break
return obj
def __contains__(self, item):
doc = self[item]
return not doc is None
def __iter__(self):
self._i = -1
return self
def __next__(self):
self._i += 1
doc = self[self._i]
if doc is None:
raise StopIteration
else:
return doc
def _get_class_doc(self, doc):
"""Identify type doc"""
main = 'com.sun.star.frame.StartModule'
if doc.supportsService(main):
return self._classes[main](doc)
mm = create_instance('com.sun.star.frame.ModuleManager')
type_module = mm.identify(doc)
return self._classes[type_module](doc)
@property
def active(self):
"""Get active doc"""
doc = self._desktop.getCurrentComponent()
obj = self._get_class_doc(doc)
return obj
def new(self, type_doc: str='calc', args: dict={}):
"""Create new document
:param type_doc: The type doc to create, default is Calc
:type type_doc: str
:param args: Extra argument
:type args: dict
:return: New document
:rtype: Custom classe
"""
url = f'private:factory/s{type_doc}'
opt = dict_to_property(args)
doc = self._desktop.loadComponentFromURL(url, '_default', 0, opt)
obj = self._get_class_doc(doc)
return obj
def open(self, path: str, args: dict={}):
""" Open document from path
:param path: Path to document
:type path: str
:param args: Extra argument
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
:type args: dict
`See API XComponentLoader <http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1frame_1_1XComponentLoader.html>`_
`See API MediaDescriptor <http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1document_1_1MediaDescriptor.html>`_
"""
url = Paths.to_url(path)
opt = dict_to_property(args)
doc = self._desktop.loadComponentFromURL(url, '_default', 0, opt)
if doc is None:
return
obj = self._get_class_doc(doc)
return obj