Package mcbase :: Package libs :: Package pagesources :: Module textreportpagesource
[hide private]
[frames] | no frames]

Source Code for Module mcbase.libs.pagesources.textreportpagesource

  1  # -*- coding: utf-8 -*- 
  2   
  3  ############################################################################ 
  4  # textreportpagesource.py 
  5  # 
  6  # Text raporları, sayfa üretimi aracı. 
  7  # 
  8  # (C) 2006 Likya Yazılım ve Bilişim Hizmetleri Ltd. Şti. 
  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 # Sinyallerin düzgün çalışması için 29 PageSource.__init__(self) 30 31 # İlk olarak rapor sonucunu set eder. 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 # Eğer tablo raporu ise rapor girdilerini de set ediyoruz. 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 # Fontu ayarlıyoruz. 48 self._font = QFont() 49 self._font.setFamily(LQRPR.DEFAULT_MONOSPACE_FONT) 50 self._font.setPointSize(LQRPR.DEFAULT_LASER_FONTSIZE) 51 52 # Renk modu 53 self._colorMode = LQRPR.COLOR_MODE_COLOR 54 55 self._highlightsEnabled = self._meta['cizgilisatirlar'] == LQRPR.CIZGILI_SATIRLAR_VAR 56 57 # Sayfa marjinlerini belirliyoruz. 58 self._leftMargin = 10 59 self._rightMargin = 10 60 self._topMargin = 10 61 self._bottomMargin = 10 62 63 # Zorunlu sayfa boyları 64 self._absolutePageWidth = None 65 self._absolutePageHeight = None 66 67 # Standart matrix'imizi oluşturuyoruz. 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
97 - def isHighlightsEnabled(self):
98 ''' 99 Satır şeritlerinin olup olmadığını belirtir. 100 ''' 101 return self._highlightsEnabled
102
103 - def supportsHighlights(self):
104 ''' 105 Satır şeritlerini destekleyip desteklemediğini belirtir. 106 ''' 107 return True
108
109 - def resetWorldMatrix(self):
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 # Yatay baskı ise ekseni kaydırıp, döndürüyoruz. 120 if self._pageOrientation == LQRPR.ORIENTATION_LANDSCAPE: 121 pageWidth = self.pageWidth() 122 self._worldMatrix.translate(pageWidth, 0) 123 self._worldMatrix.rotate(90) 124 125 # Gerekli zoom oranları yansıtıyoruz. 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 # Eğer zorunlu sayfa boyu varsa 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 # Sayfaya biraz marjin ekliyoruz. 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 # Eğer zorunlu sayfa boyu varsa 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 # Sayfaya biraz marjin ekliyoruz. 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 # Döndürülecek sayfayı oluşturuyoruz. 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 # Eğer çizgili satırların olması isteniyor ise. 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 # Sayfanın içindeki elemanları oluşturuyoruz. 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
313 - def zoom(self):
314 ''' 315 Zoom oranının döndürür. 316 ''' 317 return self._zoom
318
319 - def preferredPrinterType(self):
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
329 - def preferredPageOrientation(self):
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
349 - def supportsDotMatrixPrinter(self):
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
357 - def supportsLaserPrinter(self):
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
382 - def refreshScreenCaption(self):
383 ''' 384 Rapor çalıştırılırken gösterilecek ekran başlığı. 385 ''' 386 caption = None 387 388 # Eğer gelen bir tablo raporu ise 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
399 - def supportsRefreshResult(self):
400 ''' 401 Raporun yenileme özelliği var mı diye bakar. 402 ''' 403 return True
404
405 - def supportsChangeDesign(self):
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 # Eğer gelen bir tablo raporu ise 411 if self._reportMethod == LQRPR.RAPOR_YONTEMI_TABLO: 412 return False 413 414 else: 415 return True
416
417 - def isColoredPrinting(self):
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 # Eğer tablo raporu ise 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 # Eğer tasarım raporu ise 434 else: 435 reportCode = self._reportResult['raporkodu'] 436 reportPrms = self._reportPrms 437 438 # Toplu basım varsa, ona göre raporu çalıştırıyoruz. 439 bulkReportOptions = None 440 if 'toplubasimsecenekleri' in self._reportResult: 441 bulkReportOptions = self._reportResult['toplubasimsecenekleri'] 442 443 # Raporu yeniden çalıştırıyoruz. 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 # Eğer yeni bir tasarım eklendiyse, parametrelerdeki 468 # tasarım anahtarını siliyoruz. 469 if prm['yenitasarim'] == 't': 470 if '_key_rpr_tasarimlar' in self._reportPrms: 471 del self._reportPrms['_key_rpr_tasarimlar'] 472 473 # Tasarımın değiştiğini haber veriyoruz. 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