2 Often used utility functions
4 Copyright 2020 by Massimo Del Fedele
8 from com.sun.star.beans
import PropertyValue
9 from datetime
import date
17 La finestra che contiene il documento (o componente) corrente:
18 desktop.CurrentFrame.ContainerWindow
19 Non cambia nulla se è aperto un dialogo non modale,
20 ritorna SEMPRE il frame del documento.
22 desktop.ContainerWindow ritorna un None -- non so a che serva
24 Per ottenere le top windows, c'è il toolkit...
25 tk = ctx.ServiceManager.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx)
26 tk.getTopWindowCount() ritorna il numero delle topwindow
27 tk.getTopWIndow(i) ritorna una topwindow dell'elenco
28 tk.getActiveTopWindow () ritorna la topwindow attiva
29 La topwindow attiva, per essere attiva deve, appunto, essere attiva, indi avere il focus
30 Se si fa il debug, ad esempio, è probabile che la finestra attiva sia None
32 Resta quindi SEMPRE il problema di capire come fare a centrare un dialogo sul componente corrente.
33 Se non ci sono dialoghi in esecuzione, il dialogo creato prende come parent la ContainerWindow(si suppone...)
34 e quindi viene posizionato in base a quella
35 Se c'è un dialogo aperto e nell'event handler se ne apre un altro, l'ultimo prende come parent il precedente,
36 e viene quindi posizionato in base a quello e non alla schermata principale.
37 Serve quindi un metodo per trovare le dimensioni DELLA FINESTRA PARENT di un dialogo, per posizionarlo.
39 L'oggetto UnoControlDialog permette di risalire al XWindowPeer (che non serve ad una cippa), alla XView
40 (che mi fornisce la dimensione del dialogo ma NON la parent...), al UnoControlDialogModel, che fornisce
41 la proprietà 'DesktopAsParent' che mi dice SOLO se il dialogo è modale (False) o non modale (True)
43 L'unica soluzione che mi viene in mente è tentare con tk.ActiveTopWindow e, se None, prendere quella del desktop
49 Get current application's component context
52 if __global_context__
is not None:
53 return __global_context__
54 return uno.getComponentContext()
56 return uno.getComponentContext()
61 Get current application's LibreOffice desktop
64 return ctx.ServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", ctx)
77 desktop.getCurrentFrame().activate()
81 return desktop.getCurrentComponent()
86 Gets the service manager
100 check if current document is a LeenO document
112 oDoc.enableAutomaticCalculation(
True)
113 oDoc.unlockControllers()
118 oDoc.enableAutomaticCalculation(
False)
119 oDoc.lockControllers()
124 if type(__builtins__) == type(sys):
125 bDict = __builtins__.__dict__
128 return bDict.get(
'LEENO_GLOBAL_' + name)
132 if type(__builtins__) == type(sys):
133 bDict = __builtins__.__dict__
136 bDict[
'LEENO_GLOBAL_' + name] = value
140 if type(__builtins__) == type(sys):
141 bDict = __builtins__.__dict__
144 for key, value
in dict.items():
145 bDict[
'LEENO_GLOBAL_' + key] = value
150 convert a dictionary in a tuple of UNO properties
151 if unoAny is True, return the result in an UNO Any variable
152 otherwise use a python tuple
154 ps = tuple([PropertyValue(Name=n, Value=v)
for n, v
in values.items()])
156 ps = uno.Any(
'[]com.sun.star.beans.PropertyValue', ps)
162 returns days in month of date dat
164 month = dat.month + 1
169 dat2 = date(year=year, month=month, day=dat.day)
176 returns first week day in month from dat
179 return calendar.weekday(dat.year, dat.month, 1)
182 DAYNAMES = [
'Lun',
'Mar',
'Mer',
'Gio',
'Ven',
'Sab',
'Dom']
184 'Gennaio',
'Febbraio',
'Marzo',
'Aprile',
185 'Maggio',
'Giugno',
'Luglio',
'Agosto',
186 'Settembre',
'Ottobre',
'Novembre',
'Dicembre'
191 conversione data in stringa
192 fmt = 0 25 Febbraio 2020
205 return str(d) +
'/' + ms +
'/' + str(y)
207 return str(d) +
'-' + ms +
'-' + str(y)
209 return str(d) +
'.' + ms +
'.' + str(y)
211 return str(d) +
' ' + MONTHNAMES[m - 1] +
' ' + str(y)
227 return date(day=day, month=month, year=year)
231 Returns the number of pages in a PDF document
232 using external PyPDF2 module
234 with open(path,
'rb')
as f:
235 pdf = PyPDF2.PdfFileReader(f)
236 return pdf.getNumPages()
241 Replaces a string pattern in a Text object
242 (for example '[PATTERN]') with the given field
246 pos = oTxt.String.find(pattern)
249 cursor = oTxt.createTextCursor()
252 cursor.collapseToStart()
253 cursor.goRight(pos,
False)
254 cursor.goRight(len(pattern),
True)
260 cursor.collapseToStart()
261 oTxt.insertTextContent(cursor, oField,
False)
264 pos = oTxt.String.find(pattern)