From 9e6ac4b28e7b80abb0905083c44a44e0f41ca926 Mon Sep 17 00:00:00 2001 From: El Mau Date: Wed, 9 Mar 2022 13:18:40 -0600 Subject: [PATCH] Add start range selecction by user --- docs/source/calc_doc.rst | 61 +++++++++++++++++++++ docs/source/paths.rst | 2 +- source/easymacro.py | 111 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 171 insertions(+), 3 deletions(-) diff --git a/docs/source/calc_doc.rst b/docs/source/calc_doc.rst index 856ab63..208178d 100644 --- a/docs/source/calc_doc.rst +++ b/docs/source/calc_doc.rst @@ -37,3 +37,64 @@ Hide or show tab sheets. doc.tabs = not doc.tabs | + +Events +------ + +See all the events that can be used. + +.. code-block:: python + + doc = app.active + event_names = doc.events.names + app.debug(event_names) + +Assing some macro to event. + +.. code-block:: python + + doc = app.active + events = doc.events + if 'OnViewClosed' in events: + macro = {'library': 'test', 'name': 'on_view_closed'} + events['OnViewClosed'] = macro + +Remove + +.. code-block:: python + + events['OnViewClosed'] = {} + +Or + +.. code-block:: python + + events.remove('OnViewClosed') + +| + +Select range by user +-------------------- + +.. code-block:: python + + class Controllers(): + + def __init__(self, doc): + self.doc = doc + + def range_selection_done(self, range_selection): + if range_selection: + app.debug(range_selection) + self.doc.remove_range_selection_listener() + return + + def range_selection_aborted(self): + self.doc.remove_range_selection_listener() + return + + + def main(): + doc = app.active + doc.start_range_selection(Controllers) + return diff --git a/docs/source/paths.rst b/docs/source/paths.rst index 7779b96..8d3cf8c 100644 --- a/docs/source/paths.rst +++ b/docs/source/paths.rst @@ -415,7 +415,7 @@ Get install path extension from id .. code-block:: python id_ext = 'net.elmau.zaz.EasyMacro' - path = app.path.ext(id_ext) + path = app.path.extension(id_ext) app.debug(path) .. code-block:: bash diff --git a/source/easymacro.py b/source/easymacro.py index 0d8ff87..d909a5b 100644 --- a/source/easymacro.py +++ b/source/easymacro.py @@ -70,6 +70,9 @@ from com.sun.star.datatransfer import XTransferable, DataFlavor from com.sun.star.io import IOException, XOutputStream from com.sun.star.ui.dialogs import TemplateDescription +from com.sun.star.sheet import XRangeSelectionListener +from com.sun.star.lang import XEventListener + from com.sun.star.container import NoSuchElementException # Global variables @@ -839,7 +842,6 @@ class Macro(object): url = 'vnd.sun.star.script' url = f'{url}:{library}{module}{name}?language={language}&location={location}' - debug(url) return url @classmethod @@ -1398,7 +1400,7 @@ class Paths(object): return folders @classmethod - def ext(cls, id_ext: str): + def extension(cls, id_ext: str): """Get path extension install from id :param id_ext: ID extension @@ -2165,6 +2167,43 @@ class IOStream(object): return cls.OutputStream() +class EventsListenerBase(unohelper.Base, XEventListener): + + def __init__(self, controller, name, window=None): + self._controller = controller + 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: + self._window.setMenuBar(None) + + +class EventsRangeSelectionListener(EventsListenerBase, XRangeSelectionListener): + + def __init__(self, controller): + super().__init__(controller, '') + + def done(self, event): + range_selection = event.RangeDescriptor + event_name = 'range_selection_done' + if hasattr(self._controller, event_name): + getattr(self._controller, event_name)(range_selection) + return + + def aborted(self, event): + range_selection = event.RangeDescriptor + event_name = 'range_selection_aborted' + if hasattr(self._controller, event_name): + getattr(self._controller, event_name)() + return + + class LOShortCuts(object): """Classe for manager shortcuts""" KEYS = {getattr(Key, k): k for k in dir(Key)} @@ -2690,6 +2729,47 @@ class LOMenus(object): return LOMenuApp(index) +class LOEvents(): + + def __init__(self, obj): + self._obj = obj + + def __contains__(self, item): + return self.obj.hasByName(item) + + def __getitem__(self, index): + """Index access""" + return self.obj.getByName(index) + + def __setitem__(self, name: str, macro: dict): + """Set macro to event + + :param name: Event name + :type name: str + :param macro: Macro execute in event + :type name: dict + """ + pv = '[]com.sun.star.beans.PropertyValue' + args = () + if macro: + url = Macro.get_url_script(macro) + args = dict_to_property(dict(EventType='Script', Script=url)) + uno.invoke(self.obj, 'replaceByName', (name, uno.Any(pv, args))) + + @property + def obj(self): + return self._obj + + @property + def names(self): + return self.obj.ElementNames + + def remove(self, name): + pv = '[]com.sun.star.beans.PropertyValue' + uno.invoke(self.obj, 'replaceByName', (name, uno.Any(pv, ()))) + return + + class LOMain(): """Classe for LibreOffice""" @@ -3113,6 +3193,7 @@ class LODocCalc(LODocument): def __init__(self, obj): super().__init__(obj) self._sheets = obj.Sheets + self._listener_range_selection = None def __getitem__(self, index): """Index access""" @@ -3162,6 +3243,10 @@ class LODocCalc(LODocument): sheet = self._create_instance('com.sun.star.sheet.Spreadsheet') return sheet + @property + def events(self): + return LOEvents(self.obj.Events) + def activate(self, sheet: Any): """Activate sheet @@ -3279,6 +3364,28 @@ class LODocCalc(LODocument): self.move(n, i) return + @run_in_thread + def start_range_selection(self, controllers: Any, args: dict={}): + """Start select range selection by user + + `See Api RangeSelectionArguments `_ + """ + if not args: + args = dict( + Title = 'Please select a range', + CloseOnMouseRelease = True) + properties = dict_to_property(args) + + self._listener_range_selection = EventsRangeSelectionListener(controllers(self)) + self._cc.addRangeSelectionListener(self._listener_range_selection) + self._cc.startRangeSelection(properties) + return + + def remove_range_selection_listener(self): + if not self._listener_range_selection is None: + self._cc.removeRangeSelectionListener(self._listener_range_selection) + return + class LOCalcSheet(object):