from __future__ import annotations
from typing import cast, List, overload, TYPE_CHECKING, TypeVar, Generic
from com.sun.star.frame import XModel
from ooodev.mock import mock_g
from ooodev.adapter.container.name_container_comp import NameContainerComp
from ooodev.draw import draw_pages as mDrawPages
from ooodev.office import draw as mDraw
from ooodev.utils import gen_util as mGenUtil
from ooodev.gui import gui as mGui
from ooodev.loader import lo as mLo
from ooodev.utils.context.lo_context import LoContext
from ooodev.loader.inst.lo_inst import LoInst
from ooodev.utils.kind.drawing_layer_kind import DrawingLayerKind
from ooodev.utils.kind.shape_comb_kind import ShapeCombKind
from ooodev.utils.kind.zoom_kind import ZoomKind
from ooodev.events.partial.events_partial import EventsPartial
from ooodev.events.lo_events import observe_events
from ooodev.draw import draw_page as mDrawPage
from ooodev.draw import master_draw_page as mMasterDrawPage
from ooodev.draw.shapes import draw_shape as mDrawShape
if TYPE_CHECKING:
from com.sun.star.drawing import XDrawPage
from com.sun.star.drawing import XDrawPages
from com.sun.star.drawing import XDrawView
from com.sun.star.drawing import XLayer
from com.sun.star.drawing import XLayerManager
from com.sun.star.drawing import XShapes
from com.sun.star.frame import XController
from com.sun.star.lang import XComponent
from ooodev.draw.shapes.shape_base import ShapeBase
from ooodev.draw.shapes.shape_factory import ShapeFactory
from ooodev.proto.component_proto import ComponentT
from ooodev.utils.data_type.size import Size
from ooodev.draw.draw_doc import DrawDoc
_T = TypeVar("_T", bound="ComponentT")
[docs]class DrawDocPartial(Generic[_T]):
[docs] def __init__(self, owner: _T, component: XComponent, lo_inst: LoInst | None = None) -> None:
self.__owner = owner
self.__component = component
self.__lo_inst = mLo.Lo.current_lo if lo_inst is None else lo_inst
[docs] def add_slide(self) -> mDrawPage.DrawPage[_T]:
"""
Add a slide to the end of the document.
Raises:
DrawPageMissingError: If unable to get pages.
DrawPageError: If any other error occurs.
Returns:
DrawPage: The slide that was inserted at the end of the document.
"""
result = mDraw.Draw.add_slide(doc=self.__component)
return mDrawPage.DrawPage(self.__owner, result)
[docs] def add_layer(self, lm: XLayerManager, layer_name: str) -> XLayer:
"""
Adds a layer
Args:
lm (XLayerManager): Layer Manager
layer_name (str): Layer Name
Raises:
DrawError: If error occurs.
Returns:
XLayer: Newly added layer.
"""
return mDraw.Draw.add_layer(lm, layer_name)
[docs] def build_play_list(self, custom_name: str, *slide_idxs: int) -> NameContainerComp:
"""
Build a named play list container of slides from doc.
The name of the play list is ``custom_name``.
Args:
custom_name (str): Name for play list
slide_idxs (int): One or more index's of existing slides to add to play list.
Raises:
DrawError: If error occurs.
Returns:
NameContainerComp: Name Container.
"""
result = mDraw.Draw.build_play_list(self.__component, custom_name, *slide_idxs)
return NameContainerComp(result)
[docs] def close_doc(self, deliver_ownership: bool = False) -> bool:
"""
Closes text document.
Args:
deliver_ownership (bool): True delegates the ownership of this closing object to
anyone which throw the CloseVetoException. Default ``False``.
Returns:
bool: False if DOC_CLOSING event is canceled, Other
:events:
.. cssclass:: lo_event
- :py:attr:`~.events.write_named_event.WriteNamedEvent.DOC_CLOSING` :eventref:`src-docs-event-cancel`
- :py:attr:`~.events.write_named_event.WriteNamedEvent.DOC_CLOSED` :eventref:`src-docs-event`
Note:
Event args ``event_data`` is a dictionary containing ``text_doc``.
Attention:
:py:meth:`Lo.close <.utils.lo.Lo.close>` method is called along with any of its events.
"""
return self.__lo_inst.close(closeable=self.__component, deliver_ownership=deliver_ownership) # type: ignore
[docs] def combine_shape(self, shapes: XShapes, combine_op: ShapeCombKind) -> mDrawShape.DrawShape[_T]:
"""
Combines one or more shapes using a dispatch command.
If the owner of this instance is an instance of :py:class:`~.events.partial.EventsPartial` then the owner
will be added as an observer to the dispatch events, for the duration of this method.
Args:
doc (XComponent): Document
shapes (XShapes): Shapes to combine
combine_op (ShapeCompKind): Combine Operation.
Raises:
ShapeError: If error occurs.
Returns:
DrawShape: New combined shape.
"""
with LoContext(self.__lo_inst):
if isinstance(self.__owner, EventsPartial):
events = cast(EventsPartial, self.__owner)
with observe_events(events.event_observer):
# add the owner as an observer so it can be notified of the dispatch events.
result = mDraw.Draw.combine_shape(self.__component, shapes, combine_op)
else:
result = mDraw.Draw.combine_shape(self.__component, shapes, combine_op)
return mDrawShape.DrawShape(self.__owner, result)
[docs] def delete_slide(self, idx: int) -> bool:
"""
Deletes a slide
Args:
idx (int): Index
Returns:
bool: ``True`` on success; Otherwise, ``False``
"""
return mDraw.Draw.delete_slide(self.__component, idx)
[docs] def duplicate(self, idx: int) -> mDrawPage.DrawPage[_T]:
"""
Duplicates a slide
Args:
idx (int): Index of slide to duplicate.
Raises:
DrawError If unable to create duplicate.
Returns:
DrawPage: Duplicated slide.
"""
page = mDraw.Draw.duplicate(self.__component, idx)
return mDrawPage.DrawPage(self.__owner, page)
[docs] def find_master_page(self, style: str) -> mMasterDrawPage.MasterDrawPage[_T]:
"""
Finds master page
Args:
style (str): Style of master page
Raises:
DrawPageMissingError: If unable to match ``style``.
DrawPageError: if any other error occurs.
Returns:
DrawPage: Master page as Draw Page if found.
"""
page = mDraw.Draw.find_master_page(self.__component, style)
return mMasterDrawPage.MasterDrawPage(self.__owner, page)
[docs] def find_slide_idx_by_name(self, name: str) -> int:
"""
Gets a slides index by its name
Args:
name (str): Slide Name
Returns:
int: Zero based index if found; Otherwise ``-1``
"""
return mDraw.Draw.find_slide_idx_by_name(self.__component, name)
[docs] def get_controller(self) -> XController:
"""
Gets controller from document.
Returns:
XController: Controller.
"""
model = self.__lo_inst.qi(XModel, self.__component, True)
return model.getCurrentController()
[docs] def get_handout_master_page(self) -> mDrawPage.DrawPage[_T]:
"""
Gets handout master page
Raises:
DrawError: If unable to get hand-out master page.
DrawPageMissingError: If Draw Page is ``None``.
Returns:
DrawPage: Draw Page
"""
page = mDraw.Draw.get_handout_master_page(self.__component)
return mDrawPage.DrawPage(self.__owner, page)
[docs] def get_layer(self, layer_name: DrawingLayerKind | str) -> XLayer:
"""
Gets layer from layer name
Args:
layer_name (str): Layer Name
Raises:
NameError: If ``layer_name`` does not exist.
DrawError: If unable to get layer
Returns:
XLayer: Found Layer
"""
return mDraw.Draw.get_layer(self.__component, layer_name)
[docs] def get_layer_manager(self) -> XLayerManager:
"""
Gets Layer manager for document.
Args:
doc (XComponent): Document
Raises:
DrawError: If error occurs.
Returns:
XLayerManager: Layer Manager
"""
return mDraw.Draw.get_layer_manager(self.__component)
[docs] def get_master_page(self, idx: int) -> mMasterDrawPage.MasterDrawPage[_T]:
"""
Gets master page by index
Args:
idx (int): Index of master page
Raises:
DrawPageMissingError: If unable to get master page.
DrawPageError: If any other error occurs.
Returns:
MasterDrawPage: Master page as Draw Page.
"""
page = mDraw.Draw.get_master_page(doc=self.__component, idx=idx)
return mMasterDrawPage.MasterDrawPage(self.__owner, page)
[docs] def get_master_page_count(self) -> int:
"""
Gets master page count
Raises:
DrawError: If error occurs.
Returns:
int: Master Page Count.
"""
return mDraw.Draw.get_master_page_count(self.__component)
[docs] def get_notes_page_by_index(self, idx: int) -> mDrawPage.DrawPage[_T]:
"""
Gets notes page by index.
Each draw page has a notes page.
Args:
idx (int): Index
Raises:
DrawPageError: If error occurs.
Returns:
DrawPage: Notes Page.
See Also:
:py:meth:`~.draw.Draw.get_notes_page`
"""
page = mDraw.Draw.get_notes_page_by_index(self.__component, idx)
return mDrawPage.DrawPage(self.__owner, page)
[docs] def get_shape_factory(self) -> ShapeFactory:
"""
Gets a shape factory that can be used to convert ``XShape`` to ``ShapeBase`` objects.
Returns:
ShapeFactory: Shape Factory
"""
# pylint: disable=import-outside-toplevel
# pylint: disable=redefined-outer-name
from ooodev.draw.shapes.shape_factory import ShapeFactory
return ShapeFactory(self.__owner, lo_inst=self.__lo_inst)
[docs] def get_ordered_shapes(self) -> List[ShapeBase[_T]]:
"""
Gets ordered shapes
Returns:
List[ShapeBase[_T]]: List of Ordered Shapes.
See Also:
:py:meth:`~.draw.Draw.get_shapes`
Note:
The Shapes returned from this method will have various properties and
methods injected into them based on the UNO services they support.
"""
# pylint: disable=not-an-iterable
shapes = mDraw.Draw.get_ordered_shapes(doc=self.__component)
if not shapes:
return []
sf = self.get_shape_factory()
return [sf.shape_factory(shape) for shape in shapes]
[docs] def get_play_list(self) -> NameContainerComp:
"""
Gets Play list
Raises:
DrawError: If error occurs.
Returns:
NameContainerComp: Name Container
"""
result = mDraw.Draw.get_play_list(self.__component)
return NameContainerComp(result)
[docs] def get_shapes(self) -> List[ShapeBase[_T]]:
"""
Gets shapes
Args:
doc (XComponent): Document
Raises:
DrawError: If error occurs.
Returns:
List[ShapeBase[_T]]: List of Shapes.
Note:
The Shapes returned from this method will have various properties and
methods injected into them based on the UNO services they support.
"""
shapes = mDraw.Draw.get_shapes(doc=self.__component)
if not shapes:
return []
sf = self.get_shape_factory()
# pylint: disable=not-an-iterable
return [sf.shape_factory(shape) for shape in shapes]
[docs] def get_shapes_text(self) -> str:
"""
Gets the text from inside all the document shapes
Returns:
str: Shapes text.
See Also:
- :py:meth:`~.draw.Draw.get_shapes`
- :py:meth:`~.draw.Draw.get_ordered_shapes`
"""
return mDraw.Draw.get_shapes_text(doc=self.__component)
# region get_slide()
@overload
def get_slide(self) -> mDrawPage.DrawPage[_T]:
"""
Gets draw page by page at index ``0``.
Returns:
DrawPage: Draw Page.
"""
...
@overload
def get_slide(self, *, idx: int) -> mDrawPage.DrawPage[_T]:
"""
Gets draw page by page index
Args:
idx (int): Index of draw page. Default ``0``
Returns:
DrawPage: Draw Page.
"""
...
@overload
def get_slide(self, *, slides: XDrawPages) -> mDrawPage.DrawPage[_T]:
"""
Gets draw page at index ``0`` from ``slides``.
Args:
slides (XDrawPages): Draw Pages
Returns:
DrawPage: Draw Page.
"""
...
@overload
def get_slide(self, *, slides: XDrawPages, idx: int) -> mDrawPage.DrawPage[_T]:
"""
Gets draw page by page index from ``slides``.
Args:
slides (XDrawPages): Draw Pages
idx (int): Index of slide. Default ``0``
Returns:
DrawPage: Slide as Draw Page.
"""
...
[docs] def get_slide(self, **kwargs) -> mDrawPage.DrawPage[_T]:
"""
Gets slide
Args:
slides (XDrawPages): Draw Pages
idx (int): Index of slide. Default ``0``
Raises:
IndexError: If ``idx`` is out of bounds
DrawError: If any other error occurs.
Returns:
DrawPage: Slide as Draw Page.
"""
if not kwargs:
result = mDraw.Draw.get_slide(doc=self.__component)
return mDrawPage.DrawPage(self.__owner, result)
if "slides" not in kwargs:
kwargs["doc"] = self.__component
result = mDraw.Draw.get_slide(**kwargs)
return mDrawPage.DrawPage(self.__owner, result)
# endregion get_slide()
[docs] def get_slide_number(self, xdraw_view: XDrawView) -> int:
"""
Gets slide number.
Args:
xdraw_view (XDrawView): Draw View.
Raises:
DrawError: If error occurs.
Returns:
int: Slide Number.
"""
return mDraw.Draw.get_slide_number(xdraw_view=xdraw_view)
[docs] def get_slide_size(self) -> Size:
"""
Gets size of the given slide page (in mm units)
Raises:
SizeError: If unable to get size.
Returns:
~ooodev.utils.data_type.size.Size: Size struct.
"""
return mDraw.Draw.get_slide_size(self.__component) # type: ignore
[docs] def get_slides(self) -> mDrawPages.DrawPages:
"""
Gets the draw pages of a document.
Raises:
DrawPageMissingError: If there are no draw pages.
DrawPageError: If any other error occurs.
Returns:
DrawPages: Draw Pages.
"""
pages = mDraw.Draw.get_slides(self.__component)
return mDrawPages.DrawPages(owner=cast("DrawDoc", self.__component), slides=pages)
[docs] def get_slides_count(self) -> int:
"""
Gets the slides count.
Returns:
int: Number of slides.
"""
return mDraw.Draw.get_slides_count(self.__component)
[docs] def get_slides_list(self) -> List[mDrawPage.DrawPage[_T]]:
"""
Gets all the slides as a list of XDrawPage
Returns:
List[DrawPage[_T]]: List of pages
"""
slides = mDraw.Draw.get_slides_list(self.__component)
return [mDrawPage.DrawPage(self.__owner, slide) for slide in slides]
[docs] def get_viewed_page(self) -> mDrawPage.DrawPage[_T]:
"""
Gets viewed page
Raises:
DrawPageError: If error occurs.
Returns:
DrawPage: Draw Page
"""
page = mDraw.Draw.get_viewed_page(self.__component)
return mDrawPage.DrawPage(self.__owner, page)
[docs] def goto_page(self, page: XDrawPage) -> None:
"""
Go to page.
Args:
page (XDrawPage): Page.
Raises:
DrawError: If error occurs.
Returns:
None:
"""
mDraw.Draw.goto_page(doc=self.__component, page=page)
[docs] def insert_master_page(self, idx: int) -> mMasterDrawPage.MasterDrawPage[_T]:
"""
Inserts a master page
Args:
idx (int): Index used to insert page
Raises:
DrawPageError: If unable to insert master page.
Returns:
MasterDrawPage: The newly inserted draw page.
"""
page = mDraw.Draw.insert_master_page(doc=self.__component, idx=idx)
return mMasterDrawPage.MasterDrawPage(self.__owner, page)
[docs] def insert_slide(self, idx: int) -> mDrawPage.DrawPage[_T]:
"""
Inserts a slide at the given position in the document
Args:
idx (int): Index, can be a negative value to insert from the end of the document.
For example, -1 will insert at the end of the document.
Raises:
DrawPageMissingError: If unable to get pages.
DrawPageError: If any other error occurs.
Returns:
DrawPage: New slide that was inserted.
"""
slides = mDraw.Draw.get_slides(doc=self.__component)
count = slides.getCount()
index = mGenUtil.Util.get_index(idx, count, True)
slide = slides.insertNewByIndex(index)
return mDrawPage.DrawPage(self.__owner, slide)
[docs] def set_visible(self, visible: bool = True) -> None:
"""
Set window visibility.
Args:
visible (bool, optional): If ``True`` window is set visible; Otherwise, window is set invisible. Default ``True``
Returns:
None:
"""
mGui.GUI.set_visible(doc=self.__component, visible=visible)
[docs] def zoom(self, type: ZoomKind = ZoomKind.ENTIRE_PAGE) -> None:
"""
Zooms document to a specific view.
Args:
type (ZoomKind, optional): Type of Zoom to set. Defaults to ``ZoomKind.ZOOM_100_PERCENT``.
"""
def zoom_val(value: int) -> None:
with LoContext(self.__lo_inst):
mGui.GUI.zoom(view=ZoomKind.BY_VALUE, value=value)
if type in (
ZoomKind.ENTIRE_PAGE,
ZoomKind.OPTIMAL,
ZoomKind.PAGE_WIDTH,
ZoomKind.PAGE_WIDTH_EXACT,
):
with LoContext(self.__lo_inst):
mGui.GUI.zoom(view=type)
elif type == ZoomKind.ZOOM_200_PERCENT:
zoom_val(200)
elif type == ZoomKind.ZOOM_150_PERCENT:
zoom_val(150)
elif type == ZoomKind.ZOOM_100_PERCENT:
zoom_val(100)
elif type == ZoomKind.ZOOM_75_PERCENT:
zoom_val(75)
elif type == ZoomKind.ZOOM_50_PERCENT:
zoom_val(50)
[docs] def zoom_value(self, value: int = 100) -> None:
"""
Sets the zoom level of the Document
Args:
value (int, optional): Value to set zoom. e.g. 160 set zoom to 160%. Default ``100``.
"""
with LoContext(self.__lo_inst):
mGui.GUI.zoom_value(value=value)
if mock_g.FULL_IMPORT:
from ooodev.draw.shapes.shape_factory import ShapeFactory