Add render data

This commit is contained in:
Mauricio Baeza 2020-08-16 22:04:40 -05:00
parent a072c9bdc3
commit bcce720783
4 changed files with 1932 additions and 15 deletions

View File

@ -36,7 +36,7 @@ ID = 'org.myextension.test'
# ~ If you extension will be multilanguage set: True
# ~ This feature used gettext, set pythonpath and easymacro in True
# ~ Yu can used PoEdit for edit PO files and generate MO files.
# ~ You can used PoEdit for edit PO files and generate MO files.
# ~ https://poedit.net/
USE_LOCALES = True
DOMAIN = 'base'

View File

@ -446,8 +446,11 @@ def get_dispatch():
return create_instance('com.sun.star.frame.DispatchHelper')
def call_dispatch(url, args=()):
frame = get_document().frame
def call_dispatch(doc=None, url='', args=()):
if doc is None:
frame = get_document().frame
else:
frame = doc.frame
dispatch = get_dispatch()
dispatch.executeDispatch(frame, url, '', 0, args)
return
@ -987,7 +990,7 @@ class LOImage(object):
return self.obj.Visible
@visible.setter
def visible(self, value):
self_obj.Visible = value
self.obj.Visible = value
def save(self, path):
if is_dir(path):
@ -1191,6 +1194,42 @@ class LOCalc(LODocument):
c.rows_visible = False
return
def _set_cell(self, k='', v=None, cell=None, value=False):
if k:
self._sd.setSearchString(k)
ranges = self._search.findAll(self._sd)
if ranges:
ranges = ranges.getRangeAddressesAsString().split(';')
for r in ranges:
for c in r.split(','):
cell = self._sheet.getCellRangeByName(c)
if v is None:
return cell
if cell.getImplementationName() == 'ScCellObj':
pattern = re.compile(k, re.IGNORECASE)
nv = pattern.sub(v, cell.getString())
if value:
cell.setValue(nv)
else:
cell.setString(nv)
return cell
if cell:
if cell.getImplementationName() == 'ScCellObj':
ca = cell.getCellAddress()
new_cell = self._sheet.getCellByPosition(ca.Column, ca.Row + 1)
if value:
new_cell.setValue(v)
else:
new_cell.setString(v)
return new_cell
def render(self, data, sheet=0):
self.set_search_in(sheet)
for k, v in data.items():
self._render_cells(k, v)
return
class LOCalcSheets(object):
@ -1353,6 +1392,30 @@ class LOCalcSheet(object):
print('add_listener')
return
def get_range_by_address(self, address):
row_s = address.StartRow
row_e = address.EndRow + 1
col_s = address.StartColumn
col_e = address.EndColumn + 1
return LOCellRange(self.obj[row_s:row_e,col_s:col_e], self.doc)
def render(self, data, rango=None, clean=False):
if rango is None:
ra = self.obj.getPrintAreas()[0]
rango = self.get_range_by_address(ra)
rango.render(data, clean)
return rango
def find(self, search_string, rango=None):
if rango is None:
ra = self.obj.getPrintAreas()[0]
rango = self.get_range_by_address(ra)
cell = rango.find(search_string)
return cell
class LOWriter(LODocument):
@ -1686,6 +1749,11 @@ class LODraw(LODrawImpress):
def __init__(self, obj):
super().__init__(obj)
@property
def selection(self):
sel = self.obj.getCurrentSelection()
return sel
class LOMath(LODocument):
@ -1724,6 +1792,7 @@ class LOCellRange(object):
return item.in_range(self)
def _init_values(self):
self._sd = None
self._type_obj = self.obj.ImplementationName
self._type_content = EMPTY
@ -1880,7 +1949,7 @@ class LOCellRange(object):
copy()
self.clear(1023)
self[0,0].select()
call_dispatch('.uno:InsertContents', args)
call_dispatch(self._doc, '.uno:InsertContents', args)
set_clipboard('')
return
@ -1951,6 +2020,12 @@ class LOCellRange(object):
cursor.collapseToCurrentRegion()
return LOCellRange(self.sheet[cursor.AbsoluteName].obj, self.doc)
@property
def merged_area(self):
cursor = self.sheet.get_cursor(self.obj[0,0])
cursor.collapseToMergedArea()
return LOCellRange(self.sheet[cursor.AbsoluteName].obj, self.doc)
@property
def visible(self):
cursor = self.sheet.get_cursor(self.obj)
@ -1992,13 +2067,15 @@ class LOCellRange(object):
def insert_image(self, path, **kwargs):
s = self.obj.Size
w = kwargs.get('width', s.Width)
w = kwargs.get('Width', s.Width)
h = kwargs.get('Height', s.Height)
data = kwargs.get('Data', '')
img = self.doc.create_instance('com.sun.star.drawing.GraphicObjectShape')
img.GraphicURL = _path_url(path)
# ~ img.ResizeWithCell = True
self.draw_page.add(img)
img.Anchor = self.obj
img.setSize(Size(w, h))
img.Anchor = self.obj
return
def insert_shape(self, tipo, **kwargs):
@ -2127,6 +2204,132 @@ class LOCellRange(object):
setattr(current, k, v)
self.obj.Validation = current
def _set_new_value(self, cell, search, value):
if not cell.ImplementationName == 'ScCellObj':
return
if isinstance(value, str):
pattern = re.compile(search, re.IGNORECASE)
new_value = pattern.sub(value, cell.String)
cell.String = new_value
else:
cell.Value = value
return
def rows_insert(self, count=0):
if not count:
count = self.rows
self.obj.Rows.insertByIndex(0, count)
return
def rows_merge(self):
for r in range(self.rows):
self[r].obj.merge(True)
return
def copy_format_from(self, rango):
rango.select()
copy(self._doc)
self.select()
args = {
'Flags': 'T',
'MoveMode': 4,
}
args = dict_to_property(args)
url = '.uno:InsertContents'
call_dispatch(self._doc, url, args)
return
def _render_list(self, key, values):
rango = None
total_rows = len(values)
try:
rango = self.sheet[key]
if total_rows > 1:
cells = rango[0,0].offset(1).to_size(total_rows - 1, 1)
name = cells.name
cells.rows_insert()
cells = self.sheet[name]
cells.copy_format_from(rango)
except Exception as e:
print(key, e)
if rango is None:
pass
else:
headers = list(rango.data[0])
positions = {}
for i, v in enumerate(headers):
if not v:
continue
k = v[1:-1]
if k in values[0]:
positions[k] = i
data = []
for row in values:
new_row = headers[:]
for k, v in positions.items():
new_row[v] = row[k]
data.append(new_row)
cell = rango[0,0]
cell.copy_from(data)
return
def _render_value(self, key, value, parent=''):
if isinstance(value, dict):
for k, v in value.items():
self._render_value(k, v, key)
return
elif isinstance(value, (list, tuple)):
self._render_list(key, value)
return
search = f'{{{key}}}'
if parent:
search = f'{{{parent}.{key}}}'
ranges = self.find_all(search)
for cell in ranges or range(0):
self._set_new_value(cell, search, value)
return
def clean_render(self, template='\{(\w.+)\}'):
self._sd.SearchRegularExpression = True
self._sd.setSearchString(template)
self.obj.replaceAll(self._sd)
return
def find(self, search_string):
if self._sd is None:
self._sd = self.sheet.obj.createSearchDescriptor()
self._sd.SearchCaseSensitive = False
self._sd.setSearchString(search_string)
cell = self.obj.findFirst(self._sd)
return LOCellRange(self.sheet[cell.AbsoluteName].obj, self.doc)
def find_all(self, search_string):
if self._sd is None:
self._sd = self.sheet.obj.createSearchDescriptor()
self._sd.SearchCaseSensitive = False
self._sd.setSearchString(search_string)
ranges = self.obj.findAll(self._sd)
return ranges
def render(self, data, clean=False):
self._sd = self.sheet.obj.createSearchDescriptor()
self._sd.SearchCaseSensitive = False
for k, v in data.items():
self._render_value(k, v)
if clean:
self.clean_render()
return
class EventsListenerBase(unohelper.Base, XEventListener):
@ -4751,8 +4954,13 @@ def set_clipboard(value):
# ~ Export ok
def copy():
call_dispatch('.uno:Copy')
def copy(doc):
call_dispatch(doc, '.uno:Copy')
return
def paste(doc):
call_dispatch(doc, '.uno:Paste')
return

1708
source/easymacro2.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -615,7 +615,8 @@ def _get_info_path(path):
def _zip_embed(source, files):
PATH = 'Scripts/python/'
EASYMACRO = 'easymacro.'
EASYMACRO = 'easymacro.py'
FILE_ZIP = 'easymacro.zip'
p, f, name, e = _get_info_path(source)
now = datetime.now().strftime('_%Y%m%d_%H%M%S')
@ -623,12 +624,12 @@ def _zip_embed(source, files):
copyfile(source, path_source)
target = source
with zipfile.PyZipFile(EASYMACRO + 'zip', mode='w') as zf:
zf.writepy(EASYMACRO + 'py')
with zipfile.ZipFile(FILE_ZIP, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
zf.write(EASYMACRO)
xml = LiboXML()
path_easymacro = PATH + EASYMACRO + 'zip'
path_easymacro = PATH + FILE_ZIP
names = [f[1] for f in files] + [path_easymacro]
nodes = []
with zipfile.ZipFile(target, 'w', compression=zipfile.ZIP_DEFLATED) as zt:
@ -647,14 +648,14 @@ def _zip_embed(source, files):
data.append(name)
zt.write(path, name)
zt.write(EASYMACRO + 'zip', path_easymacro)
zt.write(FILE_ZIP, path_easymacro)
data.append(path_easymacro)
xml.parse_manifest(xml_manifest)
xml_manifest = xml.add_data_manifest(data)
zt.writestr(path_manifest, xml_manifest)
os.unlink(EASYMACRO + 'zip')
os.unlink(FILE_ZIP)
return