#!/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 `_ `See API MediaDescriptor `_ """ 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