easymacro/source/easymacro/easyforms.py

370 lines
8.9 KiB
Python

#!/usr/bin/env python
from typing import Any
from com.sun.star.awt import Size, Point
from com.sun.star.beans import NamedValue
from .easymain import log, BaseObject
# ~ https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1form_1_1component.html
MODELS = {
'hidden': 'com.sun.star.form.component.HiddenControl',
'label': 'com.sun.star.form.component.FixedText',
'text': 'com.sun.star.form.component.TextField',
'checkbox': 'com.sun.star.form.component.CheckBox',
}
TYPE_CONTROLS = {
'com.sun.star.form.OHiddenModel': 'hidden',
'stardiv.Toolkit.UnoFixedTextControl': 'label',
'com.sun.star.form.OEditControl': 'text',
'com.sun.star.form.OCheckBoxControl': 'checkbox',
}
def _set_properties(model, properties):
keys = tuple(properties.keys())
values = tuple(properties.values())
model.setPropertyValues(keys, values)
return
class FormBaseControl(BaseObject):
def __init__(self, obj: Any, shape: Any):
super().__init__(obj)
self._shape = shape
self._doc = obj.Parent.Parent.Parent
try:
self._view = self._doc.CurrentController.getControl(self.obj)
except Exception as e:
self._view = None
@property
def name(self):
return self.obj.Name
@property
def properties(self):
from .easytools import LOInspect
data = LOInspect(self.obj).properties
return data
@properties.setter
def properties(self, values: dict):
_set_properties(self.obj, values)
@property
def border(self):
return self.obj.Border
@border.setter
def border(self, value):
# ~ Not work
self.obj.Border = value
@property
def enabled(self):
return self.obj.Enabled
@enabled.setter
def enabled(self, value):
self.obj.Enabled = value
@property
def visible(self):
return self._view.Visible
@visible.setter
def visible(self, value):
self._view.Visible = value
@property
def cell(self):
return self.obj.ValueBinding.BoundCell
@cell.setter
def cell(self, value):
SERVICE = 'com.sun.star.table.CellValueBinding'
options = (NamedValue(Name='BoundCell', Value=value.address),)
value_binding = self._doc.createInstanceWithArguments(SERVICE, options)
self.obj.ValueBinding = value_binding
@property
def anchor(self):
return self._shape.Anchor
@anchor.setter
def anchor(self, value):
self._shape.Anchor = value.obj
self._shape.ResizeWithCell = True
@property
def width(self):
return self._shape.Size.Width
@width.setter
def width(self, value):
self._shape.Size = Size(value, self.height)
@property
def height(self):
return self._shape.Size.Height
@height.setter
def height(self, value):
self._shape.Size = Size(self.width, value)
@property
def position(self):
return self._shape.Position
@position.setter
def position(self, value):
self._shape.Position = value
def center(self):
cell = self.anchor
size = cell.Size
pos = cell.Position
pos.X += (size.Width / 2) - (self.width / 2)
self.position = pos
return
def set_focus(self):
self._view.setFocus()
return
class FormLabel(FormBaseControl):
def __init__(self, obj: Any, shape: Any):
super().__init__(obj, shape)
def __str__(self):
return f'{self.type}: {self.name}'
@property
def type(self):
return 'label'
@property
def value(self):
return self.obj.Label
@value.setter
def value(self, value):
self.obj.Label = value
class FormText(FormBaseControl):
def __init__(self, obj: Any, shape: Any):
super().__init__(obj, shape)
def __str__(self):
return f'{self.type}: {self.name}'
@property
def type(self):
return 'text'
@property
def value(self):
return self.obj.Text
@value.setter
def value(self, value):
self.obj.Text = value
class FormCheckBox(FormBaseControl):
def __init__(self, obj: Any, shape: Any):
super().__init__(obj, shape)
def __str__(self):
return f'{self.type}: {self.name}'
@property
def type(self):
return 'checkbox'
@property
def value(self):
return self.obj.State
@value.setter
def value(self, value):
self.obj.State = value
class FormHidden(FormBaseControl):
def __init__(self, obj: Any, shape: Any):
super().__init__(obj, shape)
def __str__(self):
return f'{self.type}: {self.name}'
@property
def type(self):
return 'hidden'
@property
def value(self):
return self.obj.HiddenValue
@value.setter
def value(self, value):
self.obj.HiddenValue = value
FORM_CLASSES = {
'hidden': FormHidden,
'label': FormLabel,
'text': FormText,
'checkbox': FormCheckBox,
}
class LOForm(BaseObject):
CONTROL_SHAPE = 'com.sun.star.drawing.ControlShape'
CONTROL_HIDDEN = 'com.sun.star.form.OHiddenModel'
def __init__(self, obj, draw_page):
self._dp = draw_page
self._doc = obj.Parent.Parent
super().__init__(obj)
self._init_controls()
def _init_controls(self):
for model in self.obj:
if model.ImplementationName == self.CONTROL_HIDDEN:
view = None
tipo = model.ImplementationName
else:
view = self._doc.CurrentController.getControl(model)
tipo = view.ImplementationName
if not tipo in TYPE_CONTROLS:
log.error(f'For add form control: {tipo}')
continue
control = FORM_CLASSES[TYPE_CONTROLS[tipo]](model, view)
setattr(self, model.Name, control)
return
def __str__(self):
return f'Form: {self.name}'
def __contains__(self, item):
"""Contains"""
return item in self.obj.ElementNames
def __iter__(self):
self._i = 0
return self
def __next__(self):
"""Interation form"""
try:
control = self.obj[self._i]
control = getattr(self, control.Name)
except Exception as e:
raise StopIteration
self._i += 1
return control
def _create_instance(self, name):
return self._doc.createInstance(name)
@property
def name(self):
return self.obj.Name
@name.setter
def name(self, value: str):
self.obj.setName(value)
def _default_properties(self, tipo: str, properties: dict, shape: Any):
WIDTH = 5000
HEIGHT = 500
width = properties.pop('Width', WIDTH)
height = properties.pop('Height', HEIGHT)
shape.Size = Size(width, height)
x = properties.pop('X', 0)
y = properties.pop('Y', 0)
shape.Position = Point(x, y)
return properties
def insert(self, properties: dict):
return self.add_control(properties)
def add_control(self, properties: dict):
tipo = properties.pop('Type').lower()
name = properties['Name']
shape = self._create_instance(self.CONTROL_SHAPE)
self._default_properties(tipo, properties, shape)
model = self._create_instance(MODELS[tipo])
_set_properties(model, properties)
if tipo == 'hidden':
shape = None
else:
shape.Control = model
self.obj.insertByIndex(self.obj.Count, model)
if not shape is None:
self._dp.add(shape)
control = FORM_CLASSES[tipo](model, shape)
setattr(self, name, control)
return control
class LOForms(BaseObject):
def __init__(self, obj):
self._dp = obj
super().__init__(obj.Forms)
def __getitem__(self, index):
"""Index access"""
return LOForm(self.obj[index], self._dp)
def __setitem__(self, key: str, value: Any):
"""Insert new form"""
self.obj[key] = value
def __len__(self):
"""Count forms"""
return len(self.obj)
def __iter__(self):
self._i = 0
return self
def __next__(self):
"""Interation forms"""
try:
form = LOForm(self.obj[self._i], self._dp)
except Exception as e:
raise StopIteration
self._i += 1
return form
def __contains__(self, item):
"""Contains"""
return item in self.obj
def new_form(self):
"""Create new instance form"""
form = self.obj.Parent.createInstance('com.sun.star.form.component.Form')
return form
def insert(self, name: str):
"""Insert new form
:param name: Name new form.
:type name: str
:return: New instance LOForm.
:rtype: LOForm
"""
form = self.new_form()
self.obj.insertByName(name, form)
return LOForm(form, self._dp)