easymacro/source/easymacro/easyevents.py

211 lines
5.5 KiB
Python
Raw Normal View History

2022-08-15 23:57:31 -05:00
#!/usr/bin/env python3
2022-08-19 22:21:14 -05:00
import uno
2022-08-15 23:57:31 -05:00
import unohelper
from com.sun.star.awt import XActionListener
from com.sun.star.lang import XEventListener
2023-04-25 23:28:45 -06:00
from com.sun.star.awt import XFocusListener
from com.sun.star.util import XModifyListener
from com.sun.star.awt import XMouseListener
from com.sun.star.awt import XMouseMotionListener
from com.sun.star.awt import XTextListener
2022-08-19 22:21:14 -05:00
from com.sun.star.sheet import XRangeSelectionListener
2023-04-25 23:28:45 -06:00
from .easymain import Macro, Color, dict_to_property
2022-08-15 23:57:31 -05:00
__all__ = [
'EventsButton',
2023-04-25 23:28:45 -06:00
'EventsFocus',
'EventsModify',
'EventsMouse',
'EventsMouseLink',
2022-08-19 22:21:14 -05:00
'EventsRangeSelectionListener',
2023-04-25 23:28:45 -06:00
'EventsText',
2022-08-15 23:57:31 -05:00
]
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)
2022-08-19 22:21:14 -05:00
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 EventsRangeSelectionListener(EventsListenerBase, XRangeSelectionListener):
def __init__(self, controller):
super().__init__(controller, '')
def done(self, event):
event_name = 'range_selection_done'
if hasattr(self._controller, event_name):
2023-04-24 00:15:16 -06:00
getattr(self._controller, event_name)(event.RangeDescriptor)
2022-08-19 22:21:14 -05:00
return
def aborted(self, event):
event_name = 'range_selection_aborted'
if hasattr(self._controller, event_name):
getattr(self._controller, event_name)()
return
2022-08-15 23:57:31 -05:00
class EventsButton(EventsListenerBase, XActionListener):
2023-04-25 23:28:45 -06:00
"""
See: https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1awt_1_1XActionListener.html
"""
2022-08-15 23:57:31 -05:00
def __init__(self, controller, name):
super().__init__(controller, name)
def actionPerformed(self, event):
event_name = f'{self.name}_action'
if hasattr(self._controller, event_name):
getattr(self._controller, event_name)(event)
return
2023-04-25 23:28:45 -06:00
class EventsMouse(EventsListenerBase, XMouseListener, XMouseMotionListener):
def __init__(self, controller, name):
super().__init__(controller, name)
def mousePressed(self, event):
event_name = f'{self._name}_click'
if event.ClickCount == 2:
event_name = f'{self._name}_double_click'
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
# ~ XMouseMotionListener
def mouseMoved(self, event):
pass
def mouseDragged(self, event):
pass
class EventsMouseLink(EventsMouse):
def mouseEntered(self, event):
obj = event.Source.Model
obj.TextColor = Color()('blue')
return
def mouseExited(self, event):
obj = event.Source.Model
obj.TextColor = 0
return
class EventsFocus(EventsListenerBase, XFocusListener):
def __init__(self, controller, name):
super().__init__(controller, name)
def focusGained(self, event):
service = event.Source.Model.ImplementationName
if service == 'stardiv.Toolkit.UnoControlListBoxModel':
return
event_name = f'{self._name}_focus_gained'
if hasattr(self._controller, event_name):
getattr(self._controller, event_name)(event)
# ~ obj = event.Source.ModelBackgroundColor = 16777184
return
def focusLost(self, event):
event_name = f'{self._name}_focus_lost'
if hasattr(self._controller, event_name):
getattr(self._controller, event_name)(event)
# ~ event.Source.Model.BackgroundColor = -1
return
class EventsModify(EventsListenerBase, XModifyListener):
def __init__(self, controller, name):
super().__init__(controller, name)
def modified(self, event):
event_name = f'{self._name}_modified'
if hasattr(self._controller, event_name):
getattr(self._controller, event_name)(event)
return
class EventsText(EventsListenerBase, XTextListener):
def __init__(self, controller, name):
super().__init__(controller, name)
def textChanged(self, event):
event_name = f'{self._name}_text_changed'
if hasattr(self._controller, event_name):
getattr(self._controller, event_name)(event)
return