Source code for ooodev.calc.calc_forms

from __future__ import annotations
from typing import overload, TYPE_CHECKING

try:
    # python 3.12+
    from typing import override  # noqa # type: ignore
except ImportError:
    from typing_extensions import override  # noqa # type: ignore

from com.sun.star.form import XForm

from ooodev.adapter.form.forms_comp import FormsComp
from ooodev.exceptions import ex as mEx
from ooodev.utils import gen_util as mGenUtil
from ooodev.loader import lo as mLo
from ooodev.loader.inst.lo_inst import LoInst
from ooodev.utils.partial.lo_inst_props_partial import LoInstPropsPartial
from ooodev.utils.partial.qi_partial import QiPartial
from ooodev.utils.partial.service_partial import ServicePartial
from ooodev.utils.partial.the_dictionary_partial import TheDictionaryPartial
from ooodev.calc.partial.calc_doc_prop_partial import CalcDocPropPartial
from ooodev.calc.calc_form import CalcForm

if TYPE_CHECKING:
    from com.sun.star.form import XForms
    from ooodev.calc.spreadsheet_draw_page import SpreadsheetDrawPage


[docs]class CalcForms(LoInstPropsPartial, FormsComp, ServicePartial, TheDictionaryPartial, QiPartial, CalcDocPropPartial): """ Class for managing Calc Forms. This class is Enumerable and returns ``CalcForm`` instance on iteration. .. code-block:: python for sheet in doc.sheets: sheet["A1"].set_val("test") assert sheet["A1"].get_val() == "test" This class also as index access and returns ``CalcSheet`` instance. .. code-block:: python sheet = doc.sheets["Sheet1"] # or set the value of cell A2 to TEST doc.sheets[0]["A2"].set_val("TEST") # get the last sheet of the document last_sheet = doc.sheets[-1] # get the second last sheet of the document second_last_sheet = doc.sheets[-2] # get the number of sheets num_sheets = len(doc.sheets) .. versionadded:: 0.18.2 """
[docs] def __init__(self, owner: SpreadsheetDrawPage, forms: XForms, lo_inst: LoInst | None = None) -> None: """ Constructor Args: owner (SpreadsheetDrawPage): Owner Component forms (XForms): Forms instance. """ if lo_inst is None: lo_inst = mLo.Lo.current_lo self._owner = owner LoInstPropsPartial.__init__(self, lo_inst=lo_inst) FormsComp.__init__(self, forms) # type: ignore ServicePartial.__init__(self, component=forms, lo_inst=self.lo_inst) QiPartial.__init__(self, component=forms, lo_inst=self.lo_inst) CalcDocPropPartial.__init__(self, obj=owner.calc_doc) TheDictionaryPartial.__init__(self)
[docs] def __next__(self) -> CalcForm: """ Gets the next form. Returns: CalcForm: The next form. """ return CalcForm(owner=self, component=super().__next__(), lo_inst=self.lo_inst) # type: ignore
[docs] def __getitem__(self, index: str | int) -> CalcForm: """ Gets the form at the specified index or name. This is short hand for ``get_by_index()`` or ``get_by_name()``. Args: key (key, str, int): The index or name of the form. When getting by index can be a negative value to get from the end. Returns: CalcForm: The form with the specified index or name. See Also: - :py:meth:`~ooodev.calc.CalcForms.get_by_index` - :py:meth:`~ooodev.calc.CalcForms.get_by_name` """ if isinstance(index, int): return self.get_by_index(index) return self.get_by_name(index)
[docs] def __len__(self) -> int: """ Gets the number of forms in the document. Returns: int: Number of forms in the document. """ return self.component.getCount()
[docs] def __delitem__(self, _item: int | str) -> None: """ Removes a form from the document. Args: _item (int | str): Index, or name, of the form. Raises: TypeError: If the item is not a supported type. """ # Delete slide by index, name, or object if isinstance(_item, int): self.remove_by_index(_item) elif isinstance(_item, str): self.remove_by_name(_item) raise TypeError(f"Unsupported type: {type(_item)}")
def _get_index(self, idx: int, allow_greater: bool = False) -> int: """ Gets the index. Args: idx (int): Index of sheet. Can be a negative value to index from the end of the list. allow_greater (bool, optional): If True and index is greater then the number of sheets then the index becomes the next index if sheet were appended. Defaults to False. Returns: int: Index value. """ count = len(self) return mGenUtil.Util.get_index(idx, count, allow_greater) def _create_name(self, name: str) -> str: used_name = True i = 1 nm = f"{name}{i}" while used_name: used_name = self.has_by_name(nm) if used_name: i += 1 nm = f"{name}{i}" return nm # region add_form @overload def add_form(self) -> CalcForm: """ Adds a new form at the end. Returns: CalcForm: Form """ ... @overload def add_form(self, idx: int) -> CalcForm: """ Adds a new form. Args: idx (int): Index of form. Returns: CalcForm: Form """ ... @overload def add_form(self, name: str) -> CalcForm: """ Adds a new form. Args: name (str): Name of form. Returns: CalcForm: Form """ ...
[docs] def add_form(self, *args, **kwargs) -> CalcForm: """ Adds a new form. Args: name (str): Name of form. idx (int): Index of form. Raises: NameClashError: If name already exists. Returns: CalcForm: Form """ all_args = list(args) all_args.extend(kwargs.values()) if not all_args: # add a new form at the end all_args.append(-1) if len(all_args) != 1: raise TypeError(f"add_form() takes 1 argument but {len(all_args)} were given") arg1 = all_args[0] if isinstance(arg1, int): idx = self._get_index(arg1, allow_greater=True) frm = self.lo_inst.create_instance_mcf(XForm, "stardiv.one.form.component.Form", raise_err=True) frm.Name = self._create_name("Form") # type: ignore self.insert_by_index(idx, frm) return self.get_by_index(idx) elif isinstance(arg1, str): if self.has_by_name(arg1): raise mEx.NameClashError(f"Name '{arg1}' already exists") frm = self.lo_inst.create_instance_mcf(XForm, "stardiv.one.form.component.Form", raise_err=True) self.insert_by_name(arg1, frm) return self.get_by_name(arg1) else: raise TypeError("add_form() argument must be int or str")
# endregion add_form # region XIndexAccess overrides
[docs] @override def get_by_index(self, idx: int) -> CalcForm: """ Gets the element at the specified index. Args: idx (int): The Zero-based index of the element. Idx can be a negative value to index from the end of the list. For example, -1 will return the last element. Returns: CalcForm: The element at the specified index. """ idx = self._get_index(idx, True) result = super().get_by_index(idx) return CalcForm(owner=self, component=result, lo_inst=self.lo_inst) # type: ignore
# endregion XIndexAccess overrides # region XNameAccess overrides
[docs] @override def get_by_name(self, name: str) -> CalcForm: """ Gets the element with the specified name. Args: name (str): The name of the element. Raises: MissingNameError: If sheet is not found. Returns: CalcForm: The element with the specified name. """ if not self.has_by_name(name): raise mEx.MissingNameError(f"Unable to find sheet with name '{name}'") result = super().get_by_name(name) return CalcForm(owner=self, component=result, lo_inst=self.lo_inst) # type: ignore
# endregion XNameAccess overrides # region Properties @property def owner(self) -> SpreadsheetDrawPage: """ Returns: SpreadsheetDrawPage: Calc doc """ return self._owner
# endregion Properties