from __future__ import annotations
from typing import Any, cast, TYPE_CHECKING
from ooodev.events.args.generic_args import GenericArgs
from ooodev.events.args.listener_event_args import ListenerEventArgs
from ooodev.utils import gen_util as gUtil
from ooodev.adapter.awt.item_list_listener import ItemListListener
if TYPE_CHECKING:
from com.sun.star.awt import XItemList
from ooodev.utils.type_var import EventArgsCallbackT, ListenerEventCallbackT
[docs]class ItemListEvents:
"""
Class for managing Change Events.
"""
[docs] def __init__(
self,
trigger_args: GenericArgs | None = None,
cb: ListenerEventCallbackT | None = None,
listener: ItemListListener | None = None,
subscriber: XItemList | None = None,
) -> None:
"""
Constructor
Args:
trigger_args (GenericArgs, optional): Args that are passed to events when they are triggered.
This only applies if the listener is not passed.
cb (ListenerEventCallbackT | None, optional): Callback that is invoked when an event is added or removed.
listener (ItemListListener | None, optional): Listener that is used to manage events.
subscriber (XItemList, optional): An UNO object that implements the ``com.sun.star.form.XItemList`` interface.
If passed in then this instance listener is automatically added to it.
"""
self.__callback = cb
if listener:
self.__listener = listener
if subscriber:
subscriber.addItemListListener(self.__listener)
else:
self.__listener = ItemListListener(trigger_args=trigger_args, subscriber=subscriber)
self.__name = gUtil.Util.generate_random_string(10)
# region Manage Events
[docs] def add_event_all_items_removed(self, cb: EventArgsCallbackT) -> None:
"""
Adds a listener for an event.
Event is invoked when the list has been completely cleared, i.e. after an invocation of ``XItemList.removeAllItems()``
The callback ``EventArgs.event_data`` will contain a UNO ``com.sun.star.lang.EventObject`` struct.
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="allItemsRemoved")
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.on("allItemsRemoved", cb)
[docs] def add_event_item_list_changed(self, cb: EventArgsCallbackT) -> None:
"""
Adds a listener for an event.
Event is invoked when the changes to the item list which occurred are too complex to be notified in single events.
Consumers of this event should discard their cached information about the current item list, and
completely refresh it from the XItemList's current state.
The callback ``EventArgs.event_data`` will contain a UNO ``com.sun.star.lang.EventObject`` struct.
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="itemListChanged")
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.on("itemListChanged", cb)
[docs] def add_event_list_item_inserted(self, cb: EventArgsCallbackT) -> None:
"""
Adds a listener for an event.
Event is invoked when an item is inserted into the list.
The callback ``EventArgs.event_data`` will contain a UNO ``com.sun.star.awt.ItemListEvent`` struct.
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="listItemInserted")
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.on("listItemInserted", cb)
[docs] def add_event_list_item_modified(self, cb: EventArgsCallbackT) -> None:
"""
Adds a listener for an event.
Event is invoked when an item in the list is modified, i.e. its text or image changed.
The callback ``EventArgs.event_data`` will contain a UNO ``com.sun.star.awt.ItemListEvent`` struct.
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="listItemModified")
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.on("listItemModified", cb)
[docs] def add_event_list_item_removed(self, cb: EventArgsCallbackT) -> None:
"""
Adds a listener for an event.
Event is invoked when an item is removed from the list.
The callback ``EventArgs.event_data`` will contain a UNO ``com.sun.star.awt.ItemListEvent`` struct.
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="listItemRemoved")
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.on("listItemRemoved", cb)
[docs] def add_event_item_list_events_disposing(self, cb: EventArgsCallbackT) -> None:
"""
Adds a listener for an event.
Event is invoked when the broadcaster is about to be disposed.
The callback ``EventArgs.event_data`` will contain a UNO ``com.sun.star.lang.EventObject`` struct.
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="disposing")
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.on("disposing", cb)
[docs] def remove_event_all_items_removed(self, cb: EventArgsCallbackT) -> None:
"""
Removes a listener for an event
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="allItemsRemoved", is_add=False)
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.off("allItemsRemoved", cb)
[docs] def remove_event_item_list_changed(self, cb: EventArgsCallbackT) -> None:
"""
Removes a listener for an event
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="itemListChanged", is_add=False)
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.off("itemListChanged", cb)
[docs] def remove_event_list_item_inserted(self, cb: EventArgsCallbackT) -> None:
"""
Removes a listener for an event
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="listItemInserted", is_add=False)
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.off("listItemInserted", cb)
[docs] def remove_event_list_item_modified(self, cb: EventArgsCallbackT) -> None:
"""
Removes a listener for an event
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="listItemModified", is_add=False)
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.off("listItemModified", cb)
[docs] def remove_event_list_item_removed(self, cb: EventArgsCallbackT) -> None:
"""
Removes a listener for an event
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="listItemRemoved", is_add=False)
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.off("listItemRemoved", cb)
[docs] def remove_event_item_list_events_disposing(self, cb: EventArgsCallbackT) -> None:
"""
Removes a listener for an event
"""
if self.__callback:
args = ListenerEventArgs(source=self.__name, trigger_name="disposing", is_add=False)
self.__callback(self, args)
if args.remove_callback:
self.__callback = None
self.__listener.off("disposing", cb)
@property
def events_listener_item_list(self) -> ItemListListener:
"""
Returns listener
"""
return self.__listener
# endregion Manage Events
[docs]def on_lazy_cb(source: Any, event: ListenerEventArgs) -> None:
"""
Callback that is invoked when an event is added or removed.
This method is generally used to add the listener to the component in a lazy manner.
This means this callback will only be called once in the lifetime of the component.
Args:
source (Any): Expected to be an instance of ItemListEvents that is a partial class of a component based class.
event (ListenerEventArgs): Event arguments.
Returns:
None:
Warning:
This method is intended for internal use only.
"""
# will only ever fire once
if not isinstance(source, ItemListEvents):
return
if not hasattr(source, "component"):
return
comp = cast("XItemList", source.component) # type: ignore
comp.addItemListListener(source.events_listener_item_list)
event.remove_callback = True