LeenO computo metrico con LibreOffice  3.22.0
Il software libero per la gestione di computi metrici e contabilità lavori.
LeenoUtils.py
Vai alla documentazione di questo file.
1 '''
2 Often used utility functions
3 
4 Copyright 2020 by Massimo Del Fedele
5 '''
6 import sys
7 import uno
8 from com.sun.star.beans import PropertyValue
9 from datetime import date
10 import calendar
11 
12 import PyPDF2
13 
14 '''
15 ALCUNE COSE UTILI
16 
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.
21 
22  desktop.ContainerWindow ritorna un None -- non so a che serva
23 
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
31 
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.
38 
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)
42 
43 L'unica soluzione che mi viene in mente è tentare con tk.ActiveTopWindow e, se None, prendere quella del desktop
44 
45 '''
46 
48  '''
49  Get current application's component context
50  '''
51  try:
52  if __global_context__ is not None:
53  return __global_context__
54  return uno.getComponentContext()
55  except Exception:
56  return uno.getComponentContext()
57 
58 
59 def getDesktop():
60  '''
61  Get current application's LibreOffice desktop
62  '''
63  ctx = getComponentContext()
64  return ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
65 
66 
68  '''
69  Get active document
70  '''
71  desktop = getDesktop()
72 
73  # try to activate current frame
74  # needed sometimes because UNO doesnt' find the correct window
75  # when debugging.
76  try:
77  desktop.getCurrentFrame().activate()
78  except Exception:
79  pass
80 
81  return desktop.getCurrentComponent()
82 
83 
85  '''
86  Gets the service manager
87  '''
88  return getComponentContext().ServiceManager
89 
90 
91 def createUnoService(serv):
92  '''
93  create an UNO service
94  '''
95  return getComponentContext().getServiceManager().createInstance(serv)
96 
97 
99  '''
100  check if current document is a LeenO document
101  '''
102  try:
103  return getDocument().getSheets().hasByName('S2')
104  except Exception:
105  return False
106 
107 
108 
110  oDoc = getDocument()
111  if boo == True:
112  oDoc.enableAutomaticCalculation(True)
113  oDoc.unlockControllers()
114  oDoc.calculateAll()
115  # ~oDoc.removeActionLock()
116 
117  elif boo == False:
118  oDoc.enableAutomaticCalculation(False)
119  oDoc.lockControllers()
120  # ~oDoc.addActionLock()
121 
122 
123 def getGlobalVar(name):
124  if type(__builtins__) == type(sys):
125  bDict = __builtins__.__dict__
126  else:
127  bDict = __builtins__
128  return bDict.get('LEENO_GLOBAL_' + name)
129 
130 
131 def setGlobalVar(name, value):
132  if type(__builtins__) == type(sys):
133  bDict = __builtins__.__dict__
134  else:
135  bDict = __builtins__
136  bDict['LEENO_GLOBAL_' + name] = value
137 
138 
139 def initGlobalVars(dict):
140  if type(__builtins__) == type(sys):
141  bDict = __builtins__.__dict__
142  else:
143  bDict = __builtins__
144  for key, value in dict.items():
145  bDict['LEENO_GLOBAL_' + key] = value
146 
147 
148 def dictToProperties(values, unoAny=False):
149  '''
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
153  '''
154  ps = tuple([PropertyValue(Name=n, Value=v) for n, v in values.items()])
155  if unoAny:
156  ps = uno.Any('[]com.sun.star.beans.PropertyValue', ps)
157  return ps
158 
159 
160 def daysInMonth(dat):
161  '''
162  returns days in month of date dat
163  '''
164  month = dat.month + 1
165  year = dat.year
166  if month > 12:
167  month = 1
168  year += 1
169  dat2 = date(year=year, month=month, day=dat.day)
170  t = dat2 - dat
171  return t.days
172 
173 
174 def firstWeekDay(dat):
175  '''
176  returns first week day in month from dat
177  monday is 0
178  '''
179  return calendar.weekday(dat.year, dat.month, 1)
180 
181 
182 DAYNAMES = ['Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom']
183 MONTHNAMES = [
184  'Gennaio', 'Febbraio', 'Marzo', 'Aprile',
185  'Maggio', 'Giugno', 'Luglio', 'Agosto',
186  'Settembre', 'Ottobre', 'Novembre', 'Dicembre'
187 ]
188 
189 def date2String(dat, fmt = 0):
190  '''
191  conversione data in stringa
192  fmt = 0 25 Febbraio 2020
193  fmt = 1 25/2/2020
194  fmt = 2 25-02-2020
195  fmt = 3 25.02.2020
196  '''
197  d = dat.day
198  m = dat.month
199  if m < 10:
200  ms = '0' + str(m)
201  else:
202  ms = str(m)
203  y = dat.year
204  if fmt == 1:
205  return str(d) + '/' + ms + '/' + str(y)
206  elif fmt == 2:
207  return str(d) + '-' + ms + '-' + str(y)
208  elif fmt == 3:
209  return str(d) + '.' + ms + '.' + str(y)
210  else:
211  return str(d) + ' ' + MONTHNAMES[m - 1] + ' ' + str(y)
212 
213 def string2Date(s):
214  if '.' in s:
215  sp = s.split('.')
216  elif '/' in s:
217  sp = s.split('/')
218  elif '-' in s:
219  sp = s.split('-')
220  else:
221  return date.today()
222  if len(sp) != 3:
223  raise Exception
224  day = int(sp[0])
225  month = int(sp[1])
226  year = int(sp[2])
227  return date(day=day, month=month, year=year)
228 
229 def countPdfPages(path):
230  '''
231  Returns the number of pages in a PDF document
232  using external PyPDF2 module
233  '''
234  with open(path, 'rb') as f:
235  pdf = PyPDF2.PdfFileReader(f)
236  return pdf.getNumPages()
237 
238 
239 def replacePatternWithField(oTxt, pattern, oField):
240  '''
241  Replaces a string pattern in a Text object
242  (for example '[PATTERN]') with the given field
243  '''
244  # pattern may be there many times...
245  repl = False
246  pos = oTxt.String.find(pattern)
247  while pos >= 0:
248  #create a cursor
249  cursor = oTxt.createTextCursor()
250 
251  # use it to select the pattern
252  cursor.collapseToStart()
253  cursor.goRight(pos, False)
254  cursor.goRight(len(pattern), True)
255 
256  # remove the pattern from text
257  cursor.String = ''
258 
259  # insert the field at cursor's position
260  cursor.collapseToStart()
261  oTxt.insertTextContent(cursor, oField, False)
262 
263  # next occurrence of pattern
264  pos = oTxt.String.find(pattern)
265 
266  repl = True
267  return repl
268 
LeenoUtils.string2Date
def string2Date(s)
Definition: LeenoUtils.py:213
LeenoUtils.countPdfPages
def countPdfPages(path)
Definition: LeenoUtils.py:229
LeenoUtils.dictToProperties
def dictToProperties(values, unoAny=False)
Definition: LeenoUtils.py:148
LeenoUtils.getGlobalVar
def getGlobalVar(name)
Definition: LeenoUtils.py:123
LeenoUtils.getDocument
def getDocument()
Definition: LeenoUtils.py:67
LeenoUtils.isLeenoDocument
def isLeenoDocument()
Definition: LeenoUtils.py:98
LeenoUtils.DocumentRefresh
def DocumentRefresh(boo)
Definition: LeenoUtils.py:109
LeenoUtils.replacePatternWithField
def replacePatternWithField(oTxt, pattern, oField)
Definition: LeenoUtils.py:239
LeenoUtils.getServiceManager
def getServiceManager()
Definition: LeenoUtils.py:84
LeenoUtils.getComponentContext
def getComponentContext()
Definition: LeenoUtils.py:47
LeenoUtils.firstWeekDay
def firstWeekDay(dat)
Definition: LeenoUtils.py:174
LeenoUtils.setGlobalVar
def setGlobalVar(name, value)
Definition: LeenoUtils.py:131
LeenoUtils.daysInMonth
def daysInMonth(dat)
Definition: LeenoUtils.py:160
LeenoUtils.initGlobalVars
def initGlobalVars(dict)
Definition: LeenoUtils.py:139
LeenoUtils.createUnoService
def createUnoService(serv)
Definition: LeenoUtils.py:91
LeenoUtils.getDesktop
def getDesktop()
Definition: LeenoUtils.py:59
LeenoUtils.date2String
def date2String(dat, fmt=0)
Definition: LeenoUtils.py:189