1
2
3
4
5
6
7
8
9
10
11 from PyQt4.QtCore import *
12 from PyQt4.QtGui import *
13
14 from tools import *
15 from constants import *
16 from units import *
17 from sizehandler import *
18 from reportitem import *
19 from field import *
20 from textarea import *
21 from line import *
22 from rectangle import *
23 from image import *
24 from barcode import *
25
27
29 '''
30 Temel tanımlamaları yapar.
31 '''
32 self._unit = None
33 self._unitName = ''
34 self._frameStartSuffix = ''
35 self._allFields = []
36 self._editor = None
37
40
42 return self._allFields
43
46
49
52
55
57 dx = self.gridDx()
58 dy = self.gridDy()
59
60 if pos.x() % dx > dx/2.0:
61 x = pos.x() + (dx - pos.x() % dx)
62
63 else:
64 x = pos.x() - (pos.x() % dx)
65
66 if pos.y() % dy > dy/2.0:
67 y = pos.y() + (dy - pos.y() % dy)
68
69 else:
70 y = pos.y() - (pos.y() % dy)
71
72 if addOne:
73 x += 1
74 y += 1
75
76 return QPointF(x, y)
77
79 '''
80 Geçerli birim dönüştürme sınıfını döndürür.
81 '''
82 return self._unit
83
85 '''
86 Çerçeve yüksekliğinin oranına karşı birim döndürür.
87 '''
88 return ratio * self.defaultFieldHeight()
89
92
94 return self._frameStartSuffix
95
98
101
102
103 -class TextReportPlugin(Plugin):
104
105 - def __init__(self, monospaceFont):
106 '''
107 Karakter boylarına göre çalışan editör eklentisi.
108 '''
109 self._font = monospaceFont
110 self._unit = CharacterUnit(monospaceFont)
111 self._unitName = tr('karakter')
112 self._frameStartSuffix = tr('satır')
113
116
119
121 actions = [
122 'addimage',
123 'addbarcode',
124 'drawcircle',
125 'drawrectangle',
126 'aligngrid',
127 'alignhcenter',
128 'alignvcenter',
129 'fitauto',
130 'fitgrid',
131 'fittallest',
132 'fitshortest',
133 ]
134
135 return actions
136
137 - def gridStep(self):
139
140 - def gridMethod(self):
142
145
148
149 - def frameBodyMargin(self):
151
152 - def sizeHandlers(self):
153 handlerTypes = [
154 SizeHandler.LEFT_MIDDLE,
155 SizeHandler.RIGHT_MIDDLE,
156 ]
157
158 return handlerTypes
159
160 - def paintingAlignmentFlags(self, properties):
161 '''
162 Alanın çizimi sırasındaki alignment flaglerini verir.
163 '''
164 flags = Qt.AlignVCenter | Qt.AlignLeft
165
166 return flags
167
169 '''
170 Tasarım ayarlarının ne olacağını söyler.
171 '''
172 propertyMeta = [
173 ('Sayfa Boyu', self._unitName, 'pageheight', 'PSpinBox', (1, 1000)),
174 ('Sayfa Genişliği', self._unitName, 'pagewidth', 'PSpinBox', (1, 1000)),
175 ('Yazıcı Tercihi', '', 'yazicitercihi', 'PComboBox', ([
176 (Constants.PRINTER_LASER, 'Lazer veya M. Püskürtmeli'),
177 (Constants.PRINTER_MATRIX, 'Nokta Vuruşlu'),
178 ],)),
179 ('Sayfa Sonu Bas', '', 'sayfasonubas', 'PComboBox', ([
180 (Constants.PRINT_ENDOFPAGE, 'Evet'),
181 (Constants.DONT_PRINT_ENDOFPAGE, 'Hayır'),
182 ],)),
183 ('Sayfa Yönü', '', 'sayfayonu', 'PComboBox', ([
184 (Constants.ORIENTATION_PORTRAIT, 'Dikey (Portrait)'),
185 (Constants.ORIENTATION_LANDSCAPE, 'Yatay (Landscape)'),
186 ],)),
187 ('Baskı Renkleri', '', 'renklibaski', 'PComboBox', ([
188 ('True', 'Renkli Baskı'),
189 ('False', 'Siyah/Beyaz Baskı'),
190 ],)),
191 ('Şeritli Satırlar', '', 'cizgilisatirlar', 'PComboBox', ([
192 (Constants.CIZGILI_SATIRLAR_VAR, 'Evet'),
193 (Constants.CIZGILI_SATIRLAR_YOK, 'Hayır'),
194 ],)),
195 ('Şerit Rengi', '', 'seritrengi', 'PColorPicker', ()),
196 ('Şerit Başlangıç', self._unitName, 'seritbaslangic', 'PSpinBox', (0, 1000)),
197 ('Şerit Bitiş', self._unitName, 'seritbitis', 'PSpinBox', (0, 1000)),
198 ('Kağıt Türü', '', 'kagitturu', 'PComboBox', (Constants.PAPER_TYPES,)),
199 ('Sol Boşluk', self._unitName, 'solbosluk', 'PSpinBox', (0, 1000)),
200 ('Kopya Sayısı', '', 'kopyasayisi', 'PSpinBox', (1, 100)),
201 ('Son Kalem Satırı', tr('%s (Maksimum için 0 (Sıfır))') % self._unitName, 'maxkalemsatiri', 'PSpinBox', (0, 10000)),
202 ]
203
204 return propertyMeta
205
207 '''
208 Yazı alanların özellik editör tanımını döndürür.
209 '''
210 meta = [
211 ('Alan Yazısı', '', 'text', 'PLineEdit', ()),
212 ]
213
214 return meta
215
217 '''
218 Yazı alanların default özellikleri
219 '''
220 return Constants.DEFAULT_TEXT_TEXTAREA_PROPERTIES
221
223 '''
224 İstenilen formata göre editör ayarlarını verir.
225 '''
226 text = [
227 ('Alan Adı', '', 'name', 'PLabel', ()),
228 ('Yaslama', '', 'justify', 'PComboBox', ([('ljust','Sola'), ('rjust','Sağa'), ('center','Orta')],)),
229 ('İlk Karakter', '', 'first', 'PSpinBox', (0, 1000)),
230 ('Son Karakter', '', 'last', 'PSpinBox', (0, 1000)),
231 ]
232
233 number = text + [
234 ('Küsürat', '', 'precision', 'PSpinBox', (0, 7)),
235 ('Yuvarlama', '', 'round', 'PComboBox', ([('T', 'Olsun'), ('F', 'Olmasın')],)),
236 ('Gösterim', '', 'display', 'PComboBox', ([('digit', 'Rakamla'), ('ytl', 'Yazıyla (YTL)'), ('euro', 'Yazıyla (AVRO)'), ('usd', 'Yazıyla (USD)')],)),
237 ('Sıfıra Eşitse', '', 'zero', 'PComboBox', ([('show', 'Göster'), ('hide', 'Gösterme')],)),
238 ('Gruplamada', '', 'groupsum', 'PComboBox', ([('nosum', 'Toplam Alma'), ('sum', 'Alt Toplam Al')],)),
239 ]
240
241 date = text + [
242 ('Biçimi', '', 'dateformat', 'PComboBox', ([
243 ('%d.%m.%Y', 'GG.AA.YYYY'),
244 ('%Y.%m.%d', 'YYYY.AA.GG'),
245 ('%d-%m-%Y', 'GG-AA-YYYY'),
246 ('%Y-%m-%d', 'YYYY-AA-GG'),
247 ('%d/%m/%Y', 'GG/AA/YYYY'),
248 ('%Y/%m/%d', 'YYYY/AA/GG'),
249 ('%d.%m', 'GG.AA'),
250 ('%d-%m', 'GG-AA'),
251 ('%d/%m', 'GG/AA'),
252 ],)),
253 ]
254
255 time = text + [
256 ('Biçimi', '', 'timeformat', 'PComboBox', ([
257 ('%H:%M:%S', 'SS:DD:NN'),
258 ('%H:%M', 'SS:DD'),
259 ],)),
260 ]
261
262 listtext = text + [
263 ('Liste İndeksi', '', 'index', 'PSpinBox', (1, 1000)),
264 ]
265
266 listnumber = number + [
267 ('Liste İndeksi', '', 'index', 'PSpinBox', (1, 1000)),
268 ]
269
270 listdate = date + [
271 ('Liste İndeksi', '', 'index', 'PSpinBox', (1, 1000)),
272 ]
273
274 listtime = time + [
275 ('Liste İndeksi', '', 'index', 'PSpinBox', (1, 1000)),
276 ]
277
278
279 numberRowFields = [field[:2] for field in self._allFields \
280 if field[Constants.FIELD_ATTRIBUTES_FORMAT] == 'number' \
281 and field[Constants.FIELD_ATTRIBUTES_STATUS] == 'row']
282
283 formulaFields = self._editor.formulaFields(Constants.FRAME_CODE_REPORT_ROWS)
284 formulaFields = map(lambda x: (x.code(), x.text()), formulaFields)
285
286 numberRowFields += formulaFields
287
288 total = number + [
289 ('Sütun', '', 'field', 'PComboBox', (numberRowFields,)),
290 ('Toplama Yöntemi', '', 'summethod', 'PComboBox', ([
291 ('real', 'Gerçek Değerler'),
292 ('seen', 'Görünen Değerler')
293 ],)),
294 ]
295
296 average = number + [
297 ('Sütun', '', 'field', 'PComboBox', (numberRowFields,)),
298 ]
299
300
301 rdate = date + [
302 ('Gün Farkı', '', 'days', 'PSpinBox', (-1000, 1000)),
303 ]
304
305
306 numberformula = number + [
307 ('Formül', '', 'formula', 'PFormula', ()),
308 ]
309
310 numberformula = [
311 ('Alan Adı', '', 'name', 'PLineEdit', ()),
312 ] + numberformula[1:]
313
314 formatTable = {
315 'text': text,
316 'number': number,
317 'date': date,
318 'time': time,
319 'total': total,
320 'average': average,
321 'rdate': rdate,
322 'numberformula': numberformula,
323 'listtext': listtext,
324 'listnumber': listnumber,
325 'listdate': listdate,
326 'listtime': listtime,
327 }
328
329 return formatTable[format]
330
331 - def fieldDefaultProperties(self, format):
333
335 '''
336 Öntanımlı alan yüksekliği
337 '''
338 return 1
339
341 '''
342 Öntanımlı alan genişliği
343 '''
344 return 12
345
346 - def rulerModulo(self):
347 '''
348 Cetvel üzerindeki rakamların nereden sonra sıfırlanacağını söyler.
349 '''
350 return 100
351
352 - def dumpFrameItems(self, frame):
353 '''
354 Çerçeve içindeki nesneleri dict'e dump eder.
355 '''
356
357 rowCount = self._unit.unitHeight(frame.bodyHeight())
358 columnCount = self._unit.unitWidth(frame.width())
359
360
361 emptySpace = Constants.FORM_ELEMENT_SPACE
362 newLine = Constants.FORM_ELEMENT_NEWLINE
363
364
365 items = [emptySpace] * columnCount + [newLine]
366 items *= rowCount
367
368
369
370 linePlace = lambda a: self._unit.unitHeight(a.pos().y()) * columnCount + self._unit.unitWidth(a.pos().x())
371 reportItems = frame.body().children()
372 reportItems = filter(lambda x: isinstance(x, ReportItem), reportItems)
373 reportItems.sort(lambda a, b: cmp(linePlace(a), linePlace(b)), reverse=True)
374
375
376 for reportItem in reportItems:
377 collidingRects = reportItem.collidingRects()
378
379 if collidingRects:
380 frameTitle = frame.title()
381 QMessageBox.information(self._editor,
382 tr('Kesişen Alanlar'),
383 tr('%s çerçevesi içinde kesişen alanlar veya yazılar var. Karakter tasarım içinde kesişen nesne olmamalıdır.') % frameTitle)
384
385 raise Exception('Kesişen nesneler var')
386
387
388 for reportItem in reportItems:
389 row = self._unit.unitHeight(reportItem.pos().y())
390 column = self._unit.unitWidth(reportItem.pos().x())
391 width = self._unit.unitWidth(reportItem.width())
392
393
394 index = row * (columnCount + 1) + column
395
396
397 for i in xrange(width - 1):
398 del items[index]
399
400 items[index] = reportItem.dumpToDict()
401
402 return items
403
404 - def dumpField(self, field):
405 '''
406 Alanın özelliklerini bir dict'e atar.
407 '''
408 dump = {}
409
410 dump['class'] = 'FormField'
411 dump['code'] = field.code()
412 dump['name'] = field.text()
413 dump['format'] = field.format()
414 dump['status'] = field.status()
415 dump['type'] = field.fieldType()
416 dump['width'] = self.unit().unitWidth(field.width())
417 dump['properties'] = field.properties()
418
419 return dump
420
421 - def dumpTextArea(self, textArea):
422 '''
423 Yazı alanının özelliklerini dict'e yazar.
424 '''
425 dump = {}
426
427 dump['class'] = 'FormText'
428 dump['text'] = textArea.text()
429
430 return dump
431
432 - def getItemClass(self, className):
433 '''
434 Sınıf ismi verilen sınıfı döndürür.
435 '''
436 if className == 'FormField':
437 return Field
438
439 elif className == 'FormText':
440 return TextArea
441
442 - def restoreFrameFromDict(self, frame, frameDict, editor):
443 '''
444 Bir çerçevenin alanlarını dict içerisinden alır ve çerçeveye ekler.
445 '''
446 frameItems = frameDict['items']
447
448
449 currentRow = 0
450 currentColumn = 0
451
452
453 for itemDump in frameItems:
454
455
456 if itemDump == Constants.FORM_ELEMENT_SPACE:
457 currentColumn += 1
458
459
460 elif itemDump == Constants.FORM_ELEMENT_NEWLINE:
461 currentColumn = 0
462 currentRow += 1
463
464
465 elif type(itemDump) == dict:
466
467
468 itemClass = self.getItemClass(itemDump['class'])
469 x = self.unit().pointWidth(currentColumn)
470 y = self.unit().pointHeight(currentRow)
471
472 itemObject = itemClass.createFromDict(itemDump, frame.body(), editor, x, y)
473
474
475 if itemObject is not None:
476 currentColumn += self.unit().unitWidth(itemObject.width())
477
478 - def restoreFieldFromDict(self, field, dump):
479 '''
480 Bir alan nesnesinin özelliklerini dump'tan alarak, nesneye atar.
481 '''
482 width = self.unit().pointWidth(float(dump['width']))
483 height = self.gridDy()
484
485 field.setWidth(width)
486 field.setHeight(height)
487
488 for property, value in dump['properties'].items():
489 field.setProperty(property, value)
490
491 field.setPos(self.alignToGrid(field.pos()))
492
493 - def restoreTextAreaFromDict(self, textArea, dump):
494 '''
495 Bir alan nesnesinin özelliklerini dump'tan alarak, nesneye atar.
496 '''
497 textArea.setText(dump['text'])
498 height = self.gridDy()
499 textArea.setHeight(height)
500 textArea.setPos(self.alignToGrid(textArea.pos()))
501
502
504
506 '''
507 Milimetre uzunluklarına göre çalışan
508 '''
509 self._font = QFont()
510 self._unit = MilimeterUnit()
511 self._unitName = 'mm'
512 self._frameStartSuffix = 'mm'
513 self._gridStep = 5
514
517
520
523
526
528 return self._gridStep
529
532
535
538
539 - def frameBodyMargin(self):
541
555
557 '''
558 Alanın çizimi sırasındaki alignment flaglerini verir.
559 '''
560 map = {
561 'ljust': Qt.AlignLeft,
562 'rjust': Qt.AlignRight,
563 'hcenter': Qt.AlignHCenter,
564 'tjust': Qt.AlignTop,
565 'bjust': Qt.AlignBottom,
566 'vcenter': Qt.AlignVCenter,
567 }
568
569 flags = 0
570 flags |= map[properties['hjustify']]
571 flags |= map[properties['vjustify']]
572
573 if properties['wordwrap'] == 'T':
574 flags |= Qt.TextWordWrap
575
576 return flags
577
610
612 '''
613 Yazı alanların özellik editör tanımını döndürür.
614 '''
615 fontPoints = [6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72]
616 fontPointsCombo = map(lambda x: (x, '%d pt' % x), fontPoints)
617
618 meta = [
619 ('Alan Yazısı', '', 'text', 'PLineEdit', ()),
620 ('Yatay Yaslama', '', 'hjustify', 'PComboBox', ([('ljust','Sola'), ('rjust','Sağa'), ('hcenter','Orta')],)),
621 ('Dikey Yaslama', '', 'vjustify', 'PComboBox', ([('tjust','Üste'), ('bjust','Aşağıya'), ('vcenter','Orta')],)),
622 ('Sözcük Kaydır', '', 'wordwrap', 'PComboBox', ([('T','Evet'), ('F','Hayır')],)),
623 ('Font', '', 'fontfamily', 'PFontComboBox', ()),
624 ('Font Boyu', '', 'fontsize', 'PComboBox', (fontPointsCombo,)),
625 ('Font Koyuluk', '', 'fontbold', 'PComboBox', ([('F', 'Normal'), ('T', 'Koyu')],)),
626 ('Font Eğiklik', '', 'fontitalic', 'PComboBox', ([('F', 'Normal'), ('T', 'Eğik')],)),
627 ('Zemin Rengi', '', 'background', 'PColorPicker', ()),
628 ('Kalem Rengi', '', 'foreground', 'PColorPicker', ()),
629 ('Çerçeve Çiz', '', 'drawframe', 'PComboBox', ([('T','Evet'), ('F','Hayır')],)),
630 ]
631
632 return meta
633
635 '''
636 Yazı alanların default özellikleri
637 '''
638 return Constants.DEFAULT_GRAPHICS_TEXTAREA_PROPERTIES
639
760
763
765 '''
766 Öntanımlı alan yüksekliği
767 '''
768 return 5
769
771 '''
772 Öntanımlı alan genişliği
773 '''
774 return 36
775
777 '''
778 Cetvel üzerindeki rakamların nereden sonra sıfırlanacağını söyler.
779 '''
780 return 1000
781
783 '''
784 Çerçeve içindeki nesneleri dict'e dump eder.
785 '''
786 reportItems = frame.body().children()
787 reportItems = filter(lambda x: isinstance(x, ReportItem), reportItems)
788 reportItems.sort(lambda a, b: cmp(a.zValue(), b.zValue()))
789
790 items = []
791
792
793 for reportItem in reportItems:
794 items.append(reportItem.dumpToDict())
795
796 return items
797
817
818 - def dumpTextArea(self, textArea):
819 '''
820 Yazı alanının özelliklerini dict'e yazar.
821 '''
822 dump = {}
823
824 dump['class'] = 'FormText'
825 dump['text'] = unicode(textArea.text())
826 dump['width'] = self.unit().unitWidth(textArea.width())
827 dump['height'] = self.unit().unitWidth(textArea.height())
828 dump['x'] = self.unit().unitWidth(textArea.pos().x())
829 dump['y'] = self.unit().unitHeight(textArea.pos().y())
830 dump['properties'] = textArea.properties()
831
832 return dump
833
835 '''
836 Sınıf ismi verilen sınıfı döndürür.
837 '''
838 if className == 'FormField':
839 return Field
840
841 elif className == 'FormText':
842 return TextArea
843
844 elif className == 'Line':
845 return Line
846
847 elif className == 'Rectangle':
848 return Rectangle
849
850 elif className == 'Image':
851 return Image
852
853 elif className == 'Barcode':
854 return Barcode
855
857 '''
858 Bir çerçevenin alanlarını dict içerisinden alır ve çerçeveye ekler.
859 '''
860 frameItems = frameDict['items']
861
862
863 for itemDump in frameItems:
864
865
866 itemClass = self.getItemClass(itemDump['class'])
867 x = self.unit().pointWidth(float(itemDump['x']))
868 y = self.unit().pointHeight(float(itemDump['y']))
869 itemObject = itemClass.createFromDict(itemDump, frame.body(), editor, x, y)
870
883
884 - def restoreTextAreaFromDict(self, textArea, dump):
885 '''
886 Bir alan nesnesinin özelliklerini dump'tan alarak, nesneye atar.
887 '''
888 textArea.setText(dump['text'])
889 width = self.unit().pointWidth(float(dump['width']))
890 height = self.unit().pointHeight(float(dump['height']))
891
892 textArea.setWidth(width)
893 textArea.setHeight(height)
894
895 for property, value in dump['properties'].items():
896 textArea.setProperty(property, value)
897
898
900
906
908 actions = [
909 'filenew',
910 'fileopen',
911 'filesave',
912 'settings',
913 'reportframes',
914 ]
915
916 return actions
917
920
923
925 '''
926 Öntanımlı alan genişliği
927 '''
928 return 15
929
930 - def frameBodyMargin(self):
932
941
944
947