Add listbox control

This commit is contained in:
Mauricio Baeza 2020-11-12 19:37:30 -06:00
parent dbf793c6db
commit d22873f53b
2 changed files with 116 additions and 183 deletions

View File

@ -1218,96 +1218,11 @@ class UnoBaseObject(object):
self._model = self.obj.Model
self._rules = {}
@property
def obj(self):
return self._obj
@property
def model(self):
return self._model
@property
def name(self):
return self.model.Name
@property
def parent(self):
ps = self.obj.getContext().PosSize
return self.obj.getContext()
def _get_possize(self, name):
ps = self.obj.getPosSize()
return getattr(ps, name)
def _set_possize(self, name, value):
ps = self.obj.getPosSize()
setattr(ps, name, value)
self.obj.setPosSize(ps.X, ps.Y, ps.Width, ps.Height, POSSIZE)
return
@property
def x(self):
if hasattr(self.model, 'PositionX'):
return self.model.PositionX
return self._get_possize('X')
@x.setter
def x(self, value):
if hasattr(self.model, 'PositionX'):
self.model.PositionX = value
else:
self._set_possize('X', value)
@property
def y(self):
if hasattr(self.model, 'PositionY'):
return self.model.PositionY
return self._get_possize('Y')
@y.setter
def y(self, value):
if hasattr(self.model, 'PositionY'):
self.model.PositionY = value
else:
self._set_possize('Y', value)
@property
def width(self):
return self._model.Width
@width.setter
def width(self, value):
self.model.Width = value
@property
def ps_width(self):
return self._get_possize('Width')
@ps_width.setter
def ps_width(self, value):
self._set_possize('Width', value)
@property
def height(self):
return self.model.Height
@height.setter
def height(self, value):
self.model.Height = value
@property
def ps_height(self):
return self._get_possize('Height')
@ps_height.setter
def ps_height(self, value):
self._set_possize('Height', value)
@property
def size(self):
ps = self.obj.getPosSize()
return (ps.Width, ps.Height)
@size.setter
def size(self, value):
ps = self.obj.getPosSize()
ps.Width = value[0]
ps.Height = value[1]
self.obj.setPosSize(ps.X, ps.Y, ps.Width, ps.Height, SIZE)
@property
def tag(self):
return self.model.Tag
@ -1350,10 +1265,6 @@ class UnoBaseObject(object):
def rules(self, value):
self._rules = value
def set_focus(self):
self.obj.setFocus()
return
def center(self, horizontal=True, vertical=False):
p = self.parent.Model
w = p.Width
@ -1450,69 +1361,6 @@ class UnoText(UnoBaseObject):
return
class UnoListBox(UnoBaseObject):
def __init__(self, obj):
super().__init__(obj)
@property
def type(self):
return 'listbox'
@property
def value(self):
return self.obj.getSelectedItem()
@property
def count(self):
return len(self.data)
@property
def data(self):
return self.model.StringItemList
@data.setter
def data(self, values):
self.model.StringItemList = list(sorted(values))
return
def unselect(self):
self.obj.selectItem(self.value, False)
return
def select(self, pos=0):
if isinstance(pos, str):
self.obj.selectItem(pos, True)
else:
self.obj.selectItemPos(pos, True)
return
def clear(self):
self.model.removeAllItems()
return
def _set_image_url(self, image):
if exists_path(image):
return _path_url(image)
if not ID_EXTENSION:
return ''
path = get_path_extension(ID_EXTENSION)
path = join(path, DIR['images'], image)
return _path_url(path)
def insert(self, value, path='', pos=-1, show=True):
if pos < 0:
pos = self.count
if path:
self.model.insertItem(pos, value, self._set_image_url(path))
else:
self.model.insertItemText(pos, value)
if show:
self.select(pos)
return
class UnoGrid(UnoBaseObject):
def __init__(self, obj):
@ -2392,13 +2240,6 @@ class LODialog(object):
COLOR_ON_FOCUS = get_color(value)
self._color_on_focus = COLOR_ON_FOCUS
@property
def step(self):
return self.model.Step
@step.setter
def step(self, value):
self.model.Step = value
@property
def events(self):
return self._events

View File

@ -67,6 +67,7 @@ import unohelper
from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS
from com.sun.star.awt.MessageBoxResults import YES
from com.sun.star.awt import Rectangle, Size, Point
from com.sun.star.awt.PosSize import POSSIZE
from com.sun.star.awt import Key, KeyModifier, KeyEvent
from com.sun.star.container import NoSuchElementException
from com.sun.star.datatransfer import XTransferable, DataFlavor
@ -399,19 +400,6 @@ def _get_class_doc(obj: Any) -> Any:
return classes[type_doc](obj)
# ~ def _get_class_uno(obj: Any) -> Any:
# ~ classes = dict(
# ~ SwXTextGraphicObject = LOImage,
# ~ SvxShapeText = LOImage,
# ~ )
# ~ name = obj.ImplementationName
# ~ print(f'ImplementationName = {name}')
# ~ instance = obj
# ~ if name in classes:
# ~ instance = classes[name](obj)
# ~ return instance
def dict_to_property(values: dict, uno_any: bool=False):
ps = tuple([PropertyValue(Name=n, Value=v) for n, v in values.items()])
if uno_any:
@ -429,6 +417,14 @@ def _property_to_dict(values):
return d
def json_dumps(data):
return json.dumps(data, indent=4, sort_keys=True)
def json_loads(data):
return json.loads(data)
def data_to_dict(data):
if isinstance(data, tuple) and isinstance(data[0], tuple):
return _array_to_dict(data)
@ -438,12 +434,6 @@ def data_to_dict(data):
return {}
def _path_url(path: str) -> str:
if path.startswith('file://'):
return path
return uno.systemPathToFileUrl(path)
def _get_dispatch() -> Any:
return create_instance('com.sun.star.frame.DispatchHelper')
@ -1145,7 +1135,7 @@ class LODocument(object):
opt = dict_to_property(args)
if path:
try:
self.obj.storeAsURL(_path_url(path), opt)
self.obj.storeAsURL(_P.to_url(path), opt)
except Exception as e:
error(e)
result = False
@ -2828,7 +2818,7 @@ class LODocs(object):
http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1frame_1_1XComponentLoader.html
http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1document_1_1MediaDescriptor.html
"""
path = _path_url(path)
path = _P.to_url(path)
opt = dict_to_property(args)
doc = cls._desktop.loadComponentFromURL(path, '_default', 0, opt)
if doc is None:
@ -2994,9 +2984,10 @@ class EventsFocus(EventsListenerBase, XFocusListener):
# ~ HelpURL = ?
class UnoBaseObject(object):
def __init__(self, obj):
def __init__(self, obj, path=''):
self._obj = obj
self._model = obj.Model
# ~ self._path = path
def __setattr__(self, name, value):
exists = hasattr(self, name)
@ -3199,6 +3190,22 @@ class UnoBaseObject(object):
def tab_stop(self, value):
self.model.Tabstop = value
@property
def ps(self):
ps = self.obj.getPosSize()
return ps
@ps.setter
def ps(self, ps):
self.obj.setPosSize(ps.X, ps.Y, ps.Width, ps.Height, POSSIZE)
def set_focus(self):
self.obj.setFocus()
return
def ps_from(self, source):
self.ps = source.ps
return
def center(self, horizontal=True, vertical=False):
p = self.parent.Model
w = p.Width
@ -3361,6 +3368,78 @@ class UnoImage(UnoBaseObject):
self.m.ImageURL = _P.to_url(value)
class UnoListBox(UnoBaseObject):
def __init__(self, obj):
super().__init__(obj)
self._path = ''
def __setattr__(self, name, value):
if name in ('_path',):
self.__dict__[name] = value
else:
super().__setattr__(name, value)
@property
def type(self):
return 'listbox'
@property
def value(self):
return self.obj.getSelectedItem()
@property
def count(self):
return len(self.data)
@property
def data(self):
return self.model.StringItemList
@data.setter
def data(self, values):
self.model.StringItemList = list(sorted(values))
@property
def path(self):
return self._path
@path.setter
def path(self, value):
self._path = value
def unselect(self):
self.obj.selectItem(self.value, False)
return
def select(self, pos=0):
if isinstance(pos, str):
self.obj.selectItem(pos, True)
else:
self.obj.selectItemPos(pos, True)
return
def clear(self):
self.model.removeAllItems()
return
def _set_image_url(self, image):
if _P.exists(image):
return _P.to_url(image)
path = _P.join(self._path, DIR['images'], image)
return _P.to_url(path)
def insert(self, value, path='', pos=-1, show=True):
if pos < 0:
pos = self.count
if path:
self.model.insertItem(pos, value, self._set_image_url(path))
else:
self.model.insertItemText(pos, value)
if show:
self.select(pos)
return
UNO_CLASSES = {
'label': UnoLabel,
'link': UnoLabelLink,
@ -3369,6 +3448,7 @@ UNO_CLASSES = {
'check': UnoCheck,
'text': UnoText,
'image': UnoImage,
'listbox': UnoListBox,
}
@ -3382,9 +3462,9 @@ class LODialog(object):
'check': 'com.sun.star.awt.UnoControlCheckBoxModel',
'text': 'com.sun.star.awt.UnoControlEditModel',
'image': 'com.sun.star.awt.UnoControlImageControlModel',
'listbox': 'com.sun.star.awt.UnoControlListBoxModel',
# ~ 'grid': 'com.sun.star.awt.grid.UnoControlGridModel',
# ~ 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel',
# ~ 'listbox': 'com.sun.star.awt.UnoControlListBoxModel',
# ~ 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel',
# ~ 'tree': 'com.sun.star.awt.tree.TreeControlModel',
# ~ 'pages': 'com.sun.star.awt.UnoMultiPageModel',
@ -3405,7 +3485,7 @@ class LODialog(object):
path = args.pop('Path', '')
if path:
dp = create_instance(service, True)
dlg = dp.createDialog(_path_url(path))
dlg = dp.createDialog(_P.to_url(path))
return dlg
if 'Location' in args:
@ -3446,6 +3526,9 @@ class LODialog(object):
return self._controls
@property
def path(self):
return self._path
@property
def id(self):
return self._id
@id.setter
@ -3474,6 +3557,13 @@ class LODialog(object):
def visible(self, value):
self.obj.Visible = value
@property
def step(self):
return self.model.Step
@step.setter
def step(self, value):
self.model.Step = value
@property
def events(self):
return self._events
@ -3539,6 +3629,8 @@ class LODialog(object):
control = self.obj.getControl(name)
_add_listeners(self.events, control, name)
control = UNO_CLASSES[tipo](control)
if tipo in ('listbox',):
control.path = self.path
if tipo == 'tree' and root:
control.root = root