1
2
3
4
5
6
7
8
9
10
11 import math
12
13 from PyQt4.QtCore import *
14 from PyQt4.QtGui import *
15 from lqrpr import *
16
17 from pagesource import PageSource
18 from page import Page
19 from textitem import TextItem
20 from highlightline import HighlightLine
21
22 -class TextReportPageSource(PageSource):
23
24 - def __init__(self, reportResult):
25 '''
26 Rapor sonucunu alır.
27 '''
28
29 PageSource.__init__(self)
30
31
32 self._reportResult = reportResult
33 self._meta = dict(LQRPR.TEXT_REPORT_DEFAULT_META)
34 self._meta.update(reportResult['meta'])
35 self._reportMethod = reportResult['raporyontemi']
36 self._reportPrms = reportResult.get('raporparametreleri')
37
38
39 if self._reportMethod == LQRPR.RAPOR_YONTEMI_TABLO:
40 self._reportInput = reportResult.get('raporgirdisi', {})
41
42 self._pageOrientation = LQRPR.ORIENTATION_PORTRAIT
43 self._printerPageWidth = None
44 self._zoom = 1.0
45 self._worldMatrix = QMatrix()
46
47
48 self._font = QFont()
49 self._font.setFamily(LQRPR.DEFAULT_MONOSPACE_FONT)
50 self._font.setPointSize(LQRPR.DEFAULT_LASER_FONTSIZE)
51
52
53 self._colorMode = LQRPR.COLOR_MODE_COLOR
54
55 self._highlightsEnabled = self._meta['cizgilisatirlar'] == LQRPR.CIZGILI_SATIRLAR_VAR
56
57
58 self._leftMargin = 10
59 self._rightMargin = 10
60 self._topMargin = 10
61 self._bottomMargin = 10
62
63
64 self._absolutePageWidth = None
65 self._absolutePageHeight = None
66
67
68 self.resetWorldMatrix()
69
70 - def setReportResult(self, reportResult):
71 '''
72 Rapor sonucu değiştiği zaman dışarıdan set edilebilmesini sağlar.
73 '''
74 self._reportResult = reportResult
75 self._meta = dict(LQRPR.TEXT_REPORT_DEFAULT_META)
76 self._meta.update(reportResult['meta'])
77 self._highlightsEnabled = self._meta['cizgilisatirlar'] == LQRPR.CIZGILI_SATIRLAR_VAR
78
79 - def setPrinterSettings(self, printerSettings):
80 '''
81 Yazıcı ayarlarından alınacak bir ayar varsa alıyoruz.
82 '''
83 self._meta['kagitturu'] = printerSettings.get('kagitturu', LQRPR.DEFAULT_PAPER_TYPE)
84
85 - def setColorMode(self, mode):
86 '''
87 Raporun renkli mi yoksa, siyah beyaz mı basılacağını belirtir.
88 '''
89 self._colorMode = mode
90
91 - def setHighlightsEnabled(self, flag):
92 '''
93 Satır şeritlerinin olup olmayacağını belirtir.
94 '''
95 self._highlightsEnabled = flag
96
98 '''
99 Satır şeritlerinin olup olmadığını belirtir.
100 '''
101 return self._highlightsEnabled
102
104 '''
105 Satır şeritlerini destekleyip desteklemediğini belirtir.
106 '''
107 return True
108
110 '''
111 World matrix'i resetler.
112 '''
113 self._worldMatrix = QMatrix()
114 pageWidth = None
115
116 if self._printerPageWidth:
117 pageWidth = self._printerPageWidth
118
119
120 if self._pageOrientation == LQRPR.ORIENTATION_LANDSCAPE:
121 pageWidth = self.pageWidth()
122 self._worldMatrix.translate(pageWidth, 0)
123 self._worldMatrix.rotate(90)
124
125
126 self._worldMatrix.scale(self._zoom, self._zoom)
127
128 - def reportResult(self):
129 '''
130 İstenirse, rapor sonucunun son hali döndürülür.
131 '''
132 return self._reportResult
133
134 - def setAbsoluteLengths(self, width, height):
135 '''
136 Zorunlu sayfa boyu ve genişliklerini tanımlar.
137 '''
138 self._absolutePageWidth = width
139 self._absolutePageHeight = height
140
141 - def setMargins(self, left, top, right, bottom):
142 '''
143 Sayfa marjinlerini belirler.
144 '''
145 self._leftMargin = float(left)
146 self._topMargin = float(top)
147 self._rightMargin = float(right)
148 self._bottomMargin = float(bottom)
149
150 self.resetWorldMatrix()
151
152 - def setPrinterPageWidth(self, printerPageWidth):
153 '''
154 Yazıcının sayfa genişliği ayarlarını yapar. Bu kısım yazıcıdan yatay
155 çıktı alırken önemlidir.
156 '''
157 self._printerPageWidth = printerPageWidth
158
159 - def setPageOrientation(self, pageOrientation):
160 '''
161 Raporun sayfaya hangi doğrultuda çizileceğini gösterir.
162 '''
163 self._pageOrientation = pageOrientation
164 self.resetWorldMatrix()
165
166 - def pageOrientation(self):
167 '''
168 Sayfanın yön durum bilgisini verir.
169 '''
170 return self._pageOrientation
171
172 - def numberOfPages(self):
173 '''
174 Raporda kaç sayfa olduğunu söyler.
175 '''
176 return len(self._reportResult['sayfalar'])
177
178 - def pageWidth(self, applyZoom=True):
179 '''
180 Rapor tasarımındaki sayfa genişliği pixel cinsinden bulur.
181 '''
182 width = 0
183
184
185 if self._absolutePageWidth is not None:
186 width = self._absolutePageWidth
187
188 else:
189 leftEmptySpace = int(self._meta.get('solbosluk', 0))
190 columnCount = int(self._meta['pagewidth']) + leftEmptySpace + 1
191 columnWidth = self.fontMetrics().width('X')
192
193
194 width = (columnWidth * columnCount) + self._leftMargin + self._rightMargin
195
196 if applyZoom:
197 width = int(math.ceil(width * self._zoom))
198
199 return width
200
201 - def pageHeight(self, applyZoom=True):
202 '''
203 Rapor tasarımındaki sayfa yüksekliğini pixel cinsinden bulur.
204 '''
205 height = 0
206
207
208 if self._absolutePageHeight is not None:
209 height = self._absolutePageHeight
210
211 else:
212 rowCount = int(self._meta['pageheight'])
213 rowHeight = self.fontMetrics().height()
214
215
216 height = (rowHeight * rowCount) + self._topMargin + self._bottomMargin
217
218 if applyZoom:
219 height = int(math.ceil(height * self._zoom))
220
221 return height
222
223 - def fontMetrics(self):
224 '''
225 Raporun basılacağı font ile ilgili sayısal değerleri verir.
226 '''
227 return QFontMetrics(self._font)
228
229 - def clearPages(self):
230 '''
231 Sayfa kaynağındaki sayfaları siler.
232 '''
233 self._reportResult['sayfalar'] = []
234
235 - def getPage(self, pageNumber):
236 '''
237 İstenilen sayfayı oluşturup döndürür.
238 '''
239 if pageNumber >= self.numberOfPages():
240 return
241
242 pageText = self._reportResult['sayfalar'][pageNumber]
243
244
245 page = Page(self, pageNumber)
246 page.setPortraitSize(self.pageWidth(False), self.pageHeight(False))
247
248 if self._pageOrientation == LQRPR.ORIENTATION_PORTRAIT:
249 page.setSize(self.pageWidth(False), self.pageHeight(False))
250
251 else:
252 page.setSize(self.pageWidth(False), self.pageWidth(False))
253
254
255
256 if self._highlightsEnabled:
257
258 rowHeight = self.fontMetrics().height()
259 leftEmptySpace = int(self._meta.get('solbosluk', 0))
260 highlightLineColor = long(self._meta['seritrengi'])
261
262 for y, height in self._reportResult['cizgilisatirlar'][pageNumber]:
263
264 startX = int(self._meta['seritbaslangic'])
265 endX = int(self._meta['seritbitis'])
266
267 characterWidth = int(self._meta['pagewidth'])
268
269 if endX == 0:
270 endX = characterWidth
271
272 if endX - startX <= 0:
273 startX = 0
274 endX = characterWidth
275
276 newHeight = height * rowHeight
277 columnWidth = self.fontMetrics().width('X')
278 newWidth = (endX - startX) * columnWidth
279
280 pxX = self._leftMargin + leftEmptySpace * columnWidth + startX * columnWidth
281 pxY = y * rowHeight + self._topMargin + 1
282
283 highlightLine = HighlightLine(page)
284 highlightLine.setHeight(newHeight)
285 highlightLine.setWidth(newWidth)
286 highlightLine.setZValue(0)
287 highlightLine.setColor(highlightLineColor)
288 highlightLine.setColorMode(self._colorMode)
289
290 highlightLine.setPos(pxX, pxY)
291
292
293 horizontalMargins = self._leftMargin + self._rightMargin
294 textItem = TextItem(page)
295 textItem.setPlainText(unicode(pageText))
296 textItem.setFont(self._font)
297 textItem.setTextWidth(self.pageWidth(False) - horizontalMargins)
298 textItem.setPos(self._leftMargin, self._topMargin)
299 textItem.setZValue(10)
300 textItem.update()
301
302 page.setMatrix(self._worldMatrix)
303
304 return page
305
306 - def setZoom(self, zoom):
307 '''
308 Sayfanın hangi oranda büyültüleceğini söyler.
309 '''
310 self._zoom = float(zoom)
311 self.resetWorldMatrix()
312
314 '''
315 Zoom oranının döndürür.
316 '''
317 return self._zoom
318
320 '''
321 Rapor sonucunun hangi tür yazıcı kullanmak istediğini söyler.
322
323 Örneğin lazer ve nokta vuruşlu.
324 '''
325 preferredPrinterType = self._meta.get('yazicitercihi', LQRPR.TEXT_REPORT_PREFERRED_PRINTER)
326
327 return preferredPrinterType
328
330 '''
331 Rapor sonucunun hangi tür sayfa yönü kullanmak istediğini söyler.
332 '''
333 pageOrientation = self._meta.get('sayfayonu', LQRPR.ORIENTATION_PORTRAIT)
334
335 return pageOrientation
336
337 - def printEndOfPage(self):
338 '''
339 Nokta vuruşlu çıktılarda sayfa basılıp basılmayacağını söyler.
340
341 Bu standart olmayan kağıtlar için kullanılır.
342 '''
343 if 'sayfasonubas' in self._meta:
344 return self._meta['sayfasonubas']
345
346 else:
347 return LQRPR.PRINT_ENDOFPAGE
348
350 '''
351 Bu raporun nokta vuruşlu yazıcı desteği olup olmadığını söyler.
352
353 Yazdırma penceresindeki ayarları etkiler.
354 '''
355 return True
356
358 '''
359 Bu raporun lazer yazıcı desteği olup olmadığını söyler.
360
361 Yazdırma penceresindeki ayarları etkiler.
362 '''
363 return True
364
365 - def paperType(self):
366 return self._meta.get('kagitturu', LQRPR.DEFAULT_PAPER_TYPE)
367
368 - def copyNumber(self):
369 '''
370 Raporun kaç kopya olduğunu verir.
371 '''
372 return int(self._meta['kopyasayisi'])
373
374 - def screenCaption(self):
375 '''
376 Raporun görüntülenmesi sırasında ekranın olası başlığı
377 '''
378 caption = _('Sayfa Görünümü (%s)') % _(self._reportResult['raporadi'])
379
380 return caption
381
383 '''
384 Rapor çalıştırılırken gösterilecek ekran başlığı.
385 '''
386 caption = None
387
388
389 if self._reportMethod == LQRPR.RAPOR_YONTEMI_TABLO:
390 reportName = self._reportResult['raporadi']
391 caption = _('%s alınıyor') % reportName
392
393 else:
394 reportCode = self._reportResult['raporkodu'].upper()
395 caption = _('Rapor %s Çalıştırılıyor') % reportCode
396
397 return caption
398
400 '''
401 Raporun yenileme özelliği var mı diye bakar.
402 '''
403 return True
404
406 '''
407 Raporun tasarım değiştirme özelliği var mı diye sorar. Tablo raporu ise
408 tasarım opsiyonunu kaldırır. Normal rapor ise ekler.
409 '''
410
411 if self._reportMethod == LQRPR.RAPOR_YONTEMI_TABLO:
412 return False
413
414 else:
415 return True
416
418 return self._meta['renklibaski']
419
420 - def executeReport(self, callerObj):
421 '''
422 Raporu yeniden çalıştırır.
423 '''
424 from lq import lqReportUtils
425
426
427 if self._reportMethod == LQRPR.RAPOR_YONTEMI_TABLO:
428 reportName = self._reportResult['raporadi']
429 reportInput = self._reportInput
430
431 return lqReportUtils.runTableTextReport(callerObj, None, None, reportInput)
432
433
434 else:
435 reportCode = self._reportResult['raporkodu']
436 reportPrms = self._reportPrms
437
438
439 bulkReportOptions = None
440 if 'toplubasimsecenekleri' in self._reportResult:
441 bulkReportOptions = self._reportResult['toplubasimsecenekleri']
442
443
444 if bulkReportOptions is not None:
445 return lqReportUtils.runBulkReport(callerObj, reportCode, reportPrms, **bulkReportOptions)
446
447 else:
448 return lqReportUtils.runReport(callerObj, reportCode, reportPrms)
449
450 - def refreshReport(self, callerObj):
451 '''
452 Raporun tekrar çalıştırır ve rapor sonucunu değiştirir.
453 '''
454 d = self.executeReport(callerObj)
455 d.addCallback(self.setReportResult)
456
457 return d
458
459 - def designChanged(self, id, prm):
460 '''
461 Tasarım değişmiş ise tasarımın değiştiğini haber verir.
462
463 @param prm: Kapanan tasarım ekranının kapanırken attığı parametreler.
464 @type prm: dict
465 '''
466 if prm and prm.get('_action') == 'reload':
467
468
469 if prm['yenitasarim'] == 't':
470 if '_key_rpr_tasarimlar' in self._reportPrms:
471 del self._reportPrms['_key_rpr_tasarimlar']
472
473
474 self.emit(SIGNAL('designChanged()'), ())
475
476 - def changeDesign(self, callerObj):
477 '''
478 Raporun tasarımının değiştirilmesini sağlar.
479 '''
480 from lq import lqReportUtils
481
482 def _targetScreenOpened(targetScreen):
483 self.connect(targetScreen, SIGNAL('screenClosed(PyQt_PyObject,PyQt_PyObject)'), self.designChanged)
484
485 reportCode = self._reportResult['raporkodu']
486 designKey = self._reportPrms.get('_key_rpr_tasarimlar')
487 reportKey = self._reportPrms.get('_key_rpr_raporlar')
488
489 d = lqReportUtils.changeDesign(callerObj, reportCode, reportKey, designKey)
490 d.addCallback(_targetScreenOpened)
491
492 return d
493